diff --git a/software/Makefile b/software/Makefile
index 9c8ec0b160fe4e299d03f78e0671802b4ce84ff2..481614240e6ad93e76ca6b6bfdc8356f0d8c358a 100644
--- a/software/Makefile
+++ b/software/Makefile
@@ -18,7 +18,12 @@ CFLAGS += -DDEBUG_ASSERT_VERBOSE
 CFLAGS += -DGNRC_PKTBUF_SIZE=512
 CFLAGS += -DSHELL_NO_ECHO -DSHELL_NO_PROMPT
 
-#DEVELHELP ?= 1
-CFLAGS += -DNDEBUG
+BAUD := 9600
+
+CFLAGS += -DUART_STDIO_BAUDRATE=9600
+
+DEVELHELP ?= 1
+# No debug information
+#CFLAGS += -DNDEBUG
 
 include $(RIOTBASE)/Makefile.include
diff --git a/software/main.c b/software/main.c
index 48cac77898f9460e6b0bd157da480b08c6edea6f..61ea03dece28f46d60160fe8ead0528d6a10d9f7 100644
--- a/software/main.c
+++ b/software/main.c
@@ -35,19 +35,28 @@
 #include "net/gnrc/netif/ieee802154.h"
 
 #define SEND_INTERVAL (1)
-#define RCV_QUEUE_SIZE (16)
-#define MAX_PAYLOAD_LENGTH (64)
+#define RCV_QUEUE_SIZE (8)
+#define MAX_PAYLOAD_LENGTH (32)
 #define MAGIC_STRING "IBREVAL\0"
 
+#define SHELL_BUFFER_SIZE (256)
+
 #ifndef NODE_ID
 #error NODE_ID undefined
 #endif
 
 /// 512 required for samr21-xpro, 256 sufficient for INGA and telosb
-char dump_thread_stack[1024+255];
-char send_thread_stack[1024+255];
-static msg_t dump_thread_msg_queue[RCV_QUEUE_SIZE];
-static msg_t send_thread_msg_queue[RCV_QUEUE_SIZE];
+#ifdef BOARD_SAMR21_XPRO
+char dump_thread_stack[1024+256];
+char send_thread_stack[1024+256];
+#else
+char dump_thread_stack[512+256];
+char send_thread_stack[512+256];
+#endif
+//static msg_t dump_thread_msg_queue[RCV_QUEUE_SIZE];
+//static msg_t send_thread_msg_queue[RCV_QUEUE_SIZE];
+
+char line_buf[SHELL_BUFFER_SIZE];
 
 typedef struct /*__attribute__((packed))*/ {
     char magic_string[8];
@@ -102,12 +111,40 @@ int shell_payload(int argc, char** argv) {
     return 0;
 }
 
+int shell_memdump(int argc, char** argv) {
+    (void) argc;
+    (void) argv;
+    //irq_disable();
+    /// TODO(rh): dump memory
+    const uint8_t *addr = (const uint8_t*)0x1800;
+    while(addr < (const uint8_t*)0x2600) {
+        uint8_t i = 0;
+        printf("%04X: ",addr);
+        while(i<0xF) {
+            printf("%02X ", *(addr+i));
+            i++;
+        }
+        i = 0;
+        while(i<0xF) {
+            char c = *(addr+i);
+            printf("%c", (c >= ' ' && c <= '~') ? c : '.');
+            i++;
+        }
+        addr += 0xF;
+        puts("");
+    }
+    //irq_enable();
+    return 0;
+}
+
 shell_command_t eval_shell_commands[] = {
     {"tx", "Sends packets", shell_tx},
     {"payload", "Sets or prints the payload", shell_payload},
+    {"memdump", "Prints the memory", shell_memdump},
     {NULL, NULL, NULL}
 };
 
+/*
 static void _dump(gnrc_pktsnip_t *pkt) {
     gnrc_pktsnip_t *snip = pkt;
     gnrc_pktsnip_t *payload = NULL;
@@ -115,7 +152,10 @@ static void _dump(gnrc_pktsnip_t *pkt) {
     eval_message_t *packet;
     gnrc_netif_hdr_t *hdr;
     uint8_t len;
-    char serialbuffer[255];
+    char serialbuffer[256];
+
+    printf("serialbuffer: from %p to %p\n", serialbuffer, serialbuffer+256);
+    
     // printf("_dump: %d %d\n", gnrc_netreg_num(GNRC_NETTYPE_UNDEF, 0), gnrc_netreg_num(GNRC_NETTYPE_NETIF, 0));
     while(snip != NULL) {
         switch(snip->type)  {
@@ -131,58 +171,57 @@ static void _dump(gnrc_pktsnip_t *pkt) {
                 
                 if(hdr->crc_valid) {
                     if(strcmp(packet->magic_string, MAGIC_STRING) == 0) {
+                        puts("<magic:found");
                         int length = sprintf(serialbuffer, "%u|%u|%d|%u", packet->node_id, packet->seq_nr, hdr->rssi, hdr->lqi);
-                        uint8_t sum = 0;
-                        for(uint8_t i=0; i<length; i++) {
-                            sum += serialbuffer[i];
+                        if(length > 0) {
+                            printf("<magic:ok=%u/%u\n", length, strlen( serialbuffer ));
+                            uint8_t sum = 0;
+                            for(uint8_t i=0; i<length; i++) {
+                                sum += serialbuffer[i];
+                            }
+                            printf("<%s=%02X\n", serialbuffer, sum);
+                        }
+                        else {
+                            printf("<magic:length_error:%d\n", length);
                         }
-                        printf("<%s=%02X\n", serialbuffer, sum);
                     } else {
+                        printf("<valid\n");
                         /// This is another packet, ignore it!
                     }
                 } else {
-                    /* Make sure a corrupt packet does not exceed payload size */
+                    /// Make sure a corrupt packet does not exceed payload size
                     len = payload->size;
                     if(len > sizeof(eval_message_t)) {
                         len = sizeof(eval_message_t);
                     }
-                    /* Pointer to data */
+                    /// Pointer to data
                     data = (uint8_t*)payload->data;
                     uint8_t i,
                             sum = 0,
                             length = 0;
-                    length += snprintf(&serialbuffer[0], sizeof(serialbuffer) - length, "%d|%u|%d|", hdr->rssi, hdr->lqi, len);
-                    /* Print each single byte */
-                    for(i=0; i<len; i++) {
-                        /// Even though " %02X" is only three characters long, we need to pass 4 because of the null terminator for the string!
-                        length += snprintf(&serialbuffer[length], sizeof(serialbuffer) - length, " %02X", data[i]);
-                    }
+                    int tmp;
+                    tmp = snprintf(&serialbuffer[length], sizeof(serialbuffer) - length, "%d|%u|%u|", hdr->rssi, hdr->lqi, len);
+                    if(tmp > 0) {
+                        length += tmp;
+                        /// Print each single byte
+                        for(i=0; i<len; i++) {
+                            /// Even though " %02X" is only three characters long, we need to pass 4 because of the null terminator for the string!
+                            tmp = snprintf(&serialbuffer[length], sizeof(serialbuffer) - length, " %02X", data[i]);
+                            if(tmp > 0) {
+                                length += tmp;
+                            } else {
+                                puts("!length error 2");
+                                break;
+                            }
+                        }
 
-                    for(i=0; i<length; i++) {
-                        sum += serialbuffer[i];
-                    }
-                    /*
-                    [SAMR21] line received: '> <40| 09 12 FC FF 00 00 0A C6 B9 3A 97 03 00 6F 0D 00 28 43 74 50 04 B9 3A 97 03 00 6F 0D 00 00 C3 D7 EE 15 FE 3E 07 D5 2B E3=64'
-                    [SAMR21] line received: '<40| 09 12 FC FF 00 00 09 C6 B9 3A 97 03 00 6F 0D 00 28 EF D8 9A 02 58 C6 97 03 00 6F 0D 00 00 D4 14 0C C8 49 65 34 7D DE 8F=77'
-                    [SAMR21] line received: '<40| 09 12 FC '
-                    [SAMR21] line received: 'Context before hardfault:'
-                    */
-                    printf("<%s=%02X\n", serialbuffer, sum);
-                    /*
-                    printf("Contents(%02d):", len);
-                    for(uint8_t i=0; i<len; i++) {
-                        printf(" %02X", data[i]);
-                    }
-                    printf(" | ");
-                    for(uint8_t i=0; i<len; i++) {
-                        if(data[i] >= ' ' && data[i] <= '~') {
-                            printf("%c", data[i]);
-                        } else {
-                            printf(".");
+                        for(i=0; i<length; i++) {
+                            sum += serialbuffer[i];
                         }
+                        printf("<%s=%02X\n", serialbuffer, sum);
+                    } else {
+                        puts("!length error 1");
                     }
-                    puts("");
-                    */
                 }
             break;
             default :
@@ -193,16 +232,28 @@ static void _dump(gnrc_pktsnip_t *pkt) {
     }
     gnrc_pktbuf_release(pkt);
 }
+*/
+
+static char serialbuffer[256];
 
 void *dump_thread(void *arg)
 {
     (void) arg;
+    msg_t dump_thread_msg_queue[RCV_QUEUE_SIZE];
     msg_init_queue(dump_thread_msg_queue, RCV_QUEUE_SIZE);
 
     gnrc_netreg_entry_t me_reg = GNRC_NETREG_ENTRY_INIT_PID(GNRC_NETREG_DEMUX_CTX_ALL, sched_active_pid);
     gnrc_netreg_register(GNRC_NETTYPE_UNDEF, &me_reg);
 
     msg_t msg;
+    gnrc_pktsnip_t *snip = NULL;
+    gnrc_pktsnip_t *payload = NULL;
+    uint8_t *data;
+    eval_message_t *packet;
+    gnrc_netif_hdr_t *hdr;
+    uint8_t len;
+    memset(serialbuffer, sizeof(serialbuffer), 0x00);
+
     while(1) {
         if(msg_receive(&msg) != 1) {
             puts("Unable to receive message");
@@ -211,11 +262,95 @@ void *dump_thread(void *arg)
         //printf("[dump_thread] message received: %d\n", msg.type);
         switch(msg.type) {
             case GNRC_NETAPI_MSG_TYPE_RCV :
-                _dump( msg.content.ptr );
+                //irq_disable();
+                //_dump( msg.content.ptr );
+
+                snip = msg.content.ptr;
+                payload = NULL;
+                
+                // printf("_dump: %d %d\n", gnrc_netreg_num(GNRC_NETTYPE_UNDEF, 0), gnrc_netreg_num(GNRC_NETTYPE_NETIF, 0));
+                while(snip != NULL) {
+                    switch(snip->type)  {
+                        case GNRC_NETTYPE_UNDEF :
+                            payload = snip;
+                        break;
+                        case GNRC_NETTYPE_NETIF :
+                            hdr = snip->data;
+                            //printf("HDR: %d %d %d\n", hdr->rssi, hdr->lqi, hdr->crc_valid);
+                            //puts("OK");
+                            if(payload == NULL) {
+                                puts("!whoops? NULL pointer");
+                            }
+                            packet = (eval_message_t*)payload->data;
+                            
+                            if(hdr->crc_valid) {
+                                if(strcmp(packet->magic_string, MAGIC_STRING) == 0) {
+                                    puts("<magic:found");
+                                    int length = sprintf(serialbuffer, "%u|%u|%d|%u", packet->node_id, packet->seq_nr, hdr->rssi, hdr->lqi);
+                                    if(length > 0) {
+                                        printf("<magic:ok=%u/%u\n", length, strlen( serialbuffer ));
+                                        uint8_t sum = 0;
+                                        for(uint8_t i=0; i<length; i++) {
+                                            sum += serialbuffer[i];
+                                        }
+                                        printf("<%s=%02X\n", serialbuffer, sum);
+                                    }
+                                    else {
+                                        printf("<magic:length_error:%d\n", length);
+                                    }
+                                } else {
+                                    printf("<valid\n");
+                                    /// This is another packet, ignore it!
+                                }
+                            } else {
+                                /* Make sure a corrupt packet does not exceed payload size */
+                                len = payload->size;
+                                if(len > sizeof(eval_message_t)) {
+                                    len = sizeof(eval_message_t);
+                                }
+                                /* Pointer to data */
+                                data = (uint8_t*)payload->data;
+                                uint8_t i,
+                                        sum = 0,
+                                        length = 0;
+                                int tmp;
+                                tmp = snprintf(&serialbuffer[length], sizeof(serialbuffer) - length, "%d|%u|%u|", hdr->rssi, hdr->lqi, len);
+                                if(tmp > 0) {
+                                    length += tmp;
+                                    /* Print each single byte */
+                                    for(i=0; i<len; i++) {
+                                        /// Even though " %02X" is only three characters long, we need to pass 4 because of the null terminator for the string!
+                                        tmp = snprintf(&serialbuffer[length], sizeof(serialbuffer) - length, " %02X", data[i]);
+                                        if(tmp > 0) {
+                                            length += tmp;
+                                        } else {
+                                            puts("!length error 2");
+                                            break;
+                                        }
+                                    }
+
+                                    for(i=0; i<length; i++) {
+                                        sum += serialbuffer[i];
+                                    }
+                                    printf("<%s=%02X\n", serialbuffer, sum);
+                                } else {
+                                    puts("!length error 1");
+                                }
+                            }
+                        break;
+                        default :
+                            printf("snip of type %d\n", snip->type);
+                        break;
+                    }
+                    snip = snip->next;
+                }
+                gnrc_pktbuf_release(msg.content.ptr);
+
+                //irq_enable();
             break;
             default :
                 puts("ERROR: Unknown message type???");
-                /// gnrc_pktbuf_release( msg.content.ptr );
+                //gnrc_pktbuf_release( msg.content.ptr );
             break;
         }
     }
@@ -223,6 +358,8 @@ void *dump_thread(void *arg)
     return NULL;
 }
 
+static char serialbuffer2[32];
+
 void *send_thread(void *arg)
 {
     gnrc_netif_t *ieee802154_netif = arg;
@@ -281,9 +418,11 @@ void *send_thread(void *arg)
     uint8_t flags = 0 | GNRC_NETIF_HDR_FLAGS_BROADCAST;
     eval_message.payload_length = snprintf((char*)eval_message.payload, MAX_PAYLOAD_LENGTH, "Hello from %2d", NODE_ID);
 
+    msg_t send_thread_msg_queue[RCV_QUEUE_SIZE];
     msg_init_queue(send_thread_msg_queue, RCV_QUEUE_SIZE);
     msg_t msg;
-    char serialbuffer[255];
+    
+    memset(serialbuffer, sizeof(serialbuffer2), 0x00);
     
     while(1) {
         msg_receive(&msg);
@@ -329,12 +468,14 @@ void *send_thread(void *arg)
             printf("ERROR: unable to send: %d\n", ret);
             gnrc_pktbuf_release(pkt);
         } else {
+            //irq_disable();
             uint8_t sum = 0;
-            uint8_t length = snprintf(serialbuffer, 255, "%u", eval_message.seq_nr);
+            uint8_t length = snprintf(serialbuffer2, sizeof(serialbuffer2), "%u", eval_message.seq_nr);
             for(uint8_t i=0; i<length; i++) {
-                sum += serialbuffer[i];
+                sum += serialbuffer2[i];
             }
-            printf(">%s=%02X\n", serialbuffer, sum);
+            printf(">%s=%02X\n", serialbuffer2, sum);
+            //irq_enable();
         }
     }
     return NULL;
@@ -343,23 +484,27 @@ void *send_thread(void *arg)
 int main(void)
 {
     /// +1 -> INGA working, but TelosB/Sky not
-    thread_create(dump_thread_stack, sizeof(dump_thread_stack), THREAD_PRIORITY_MAIN + 1, 0, dump_thread, NULL, "dump_thread");
+    thread_create(dump_thread_stack, sizeof(dump_thread_stack), THREAD_PRIORITY_MAIN + 1, THREAD_CREATE_STACKTEST, dump_thread, NULL, "dump_thread");
     
     gnrc_netif_t *netif = NULL;
     if((netif = gnrc_netif_iter(netif))) {
         gnrc_netif_t *ieee802154_netif = netif;
-        printf("Found gnrc netif: %d %d", netif->pid, ieee802154_netif->pid);
+        printf("Found gnrc netif: %d %d\n", netif->pid, ieee802154_netif->pid);
         /// +2 -> INGA working, but TelosB/Sky not
-        send_thread_pid = thread_create(send_thread_stack, sizeof(send_thread_stack), THREAD_PRIORITY_MAIN + 2, 0, send_thread, ieee802154_netif, "send_thread");
+        send_thread_pid = thread_create(send_thread_stack, sizeof(send_thread_stack), THREAD_PRIORITY_MAIN + 2, THREAD_CREATE_STACKTEST, send_thread, ieee802154_netif, "send_thread");
     }
     else {
         puts("Unable to find netif");
     }
     
     (void) puts("Welcome to RIOT!");
-    printf("This is node %d\n", NODE_ID);
-    char line_buf[SHELL_DEFAULT_BUFSIZE];
-    shell_run(eval_shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE);
+    printf("This is node %d.\n", NODE_ID);
+
+    printf("line_buf from %p to %p\n", line_buf, line_buf + sizeof(line_buf));
+    printf("serialbuffer: from %p to %p\n", serialbuffer, serialbuffer+sizeof(serialbuffer));
+    printf("serialbuffer2: from %p to %p\n", serialbuffer2, serialbuffer2+sizeof(serialbuffer2));
+
+    shell_run(eval_shell_commands, line_buf, SHELL_BUFFER_SIZE);
 
     return 0;
 }
\ No newline at end of file