diff --git a/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c b/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c
index a873267e34949f8f833161a305416d48a82b1ca9..eb781ef613542e20dd89b86e18dae40d4690a17b 100644
--- a/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c
+++ b/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c
@@ -263,46 +263,40 @@ void gnrc_sixlowpan_frag_send(gnrc_pktsnip_t *pkt, void *ctx, unsigned page)
     if (fragment_msg->offset == 0) {
         /* increment tag for successive, fragmented datagrams */
         _tag++;
-        if ((res = _send_1st_fragment(iface, fragment_msg->pkt, payload_len, fragment_msg->datagram_size)) == 0) {
+        if ((res = _send_1st_fragment(iface, fragment_msg->pkt, payload_len,
+                                      fragment_msg->datagram_size)) == 0) {
             /* error sending first fragment */
             DEBUG("6lo frag: error sending 1st fragment\n");
-            gnrc_pktbuf_release(fragment_msg->pkt);
-            fragment_msg->pkt = NULL;
-            return;
+            goto error;
         }
-        fragment_msg->offset += res;
-
-        /* send message to self*/
-        msg.type = GNRC_SIXLOWPAN_MSG_FRAG_SND;
-        msg.content.ptr = (void *)fragment_msg;
-        msg_send_to_self(&msg);
-        thread_yield();
     }
-    else {
-        /* (offset + (datagram_size - payload_len) < datagram_size) simplified */
-        if (fragment_msg->offset < payload_len) {
-            if ((res = _send_nth_fragment(iface, fragment_msg->pkt, payload_len, fragment_msg->datagram_size,
-                                          fragment_msg->offset)) == 0) {
-                /* error sending subsequent fragment */
-                DEBUG("6lo frag: error sending subsequent fragment (offset = %" PRIu16
-                      ")\n", fragment_msg->offset);
-                gnrc_pktbuf_release(fragment_msg->pkt);
-                fragment_msg->pkt = NULL;
-                return;
-                }
-            fragment_msg->offset += res;
-
-            /* send message to self*/
-            msg.type = GNRC_SIXLOWPAN_MSG_FRAG_SND;
-            msg.content.ptr = (void *)fragment_msg;
-            msg_send_to_self(&msg);
-            thread_yield();
-        }
-        else {
-            gnrc_pktbuf_release(fragment_msg->pkt);
-            fragment_msg->pkt = NULL;
+    /* (offset + (datagram_size - payload_len) < datagram_size) simplified */
+    else if (fragment_msg->offset < payload_len) {
+        if ((res = _send_nth_fragment(iface, fragment_msg->pkt, payload_len,
+                                      fragment_msg->datagram_size,
+                                      fragment_msg->offset)) == 0) {
+            /* error sending subsequent fragment */
+            DEBUG("6lo frag: error sending subsequent fragment"
+                  "(offset = %u)\n", fragment_msg->offset);
+            goto error;
         }
     }
+    else {
+        goto error;
+    }
+    fragment_msg->offset += res;
+    msg.type = GNRC_SIXLOWPAN_MSG_FRAG_SND,
+    msg.content.ptr = fragment_msg;
+    if (msg_send_to_self(&msg) == 0) {
+        printf("6lo frag: message queue full, can't issue next fragment "
+              "sending\n");
+        goto error;
+    }
+    thread_yield();
+    return;
+error:
+    gnrc_pktbuf_release(fragment_msg->pkt);
+    fragment_msg->pkt = NULL;
 }
 
 void gnrc_sixlowpan_frag_recv(gnrc_pktsnip_t *pkt, void *ctx, unsigned page)