diff --git a/sys/net/routing/aodvv2/aodv.c b/sys/net/routing/aodvv2/aodv.c
index 2e630a3d5b349d4974235d3776320e5c04da500d..d5e8c4c349242b3bccb2cbcaf1256cdd5fbb9a76 100644
--- a/sys/net/routing/aodvv2/aodv.c
+++ b/sys/net/routing/aodvv2/aodv.c
@@ -38,11 +38,15 @@ static void _deep_free_msg_container(struct msg_container *msg_container);
 static void _write_packet(struct rfc5444_writer *wr __attribute__ ((unused)),
                           struct rfc5444_writer_target *iface __attribute__((unused)),
                           void *buffer, size_t length);
+static void print_json_pkt_sent(struct writer_target *wt);
 
-#if ENABLE_DEBUG
+#if AODV_DEBUG
 char addr_str[IPV6_MAX_ADDR_STR_LEN];
 static struct netaddr_str nbuf;
 #endif
+#if TEST_SETUP
+static struct netaddr_str nbuf_origaddr, nbuf_targaddr, nbuf_nexthop;
+#endif
 
 static char aodv_rcv_stack_buf[THREAD_STACKSIZE_MAIN];
 static char aodv_snd_stack_buf[THREAD_STACKSIZE_MAIN];
@@ -132,7 +136,6 @@ void *fib_signal_handler_thread(void *arg)
     fib_register_rp((uint8_t*) &aodvv2_prefix, aodvv2_prefix_len);
 
     while (true) {
-        AODV_DEBUG("%s()\n", __func__);
         msg_t msg;
         msg_receive(&msg);
 
@@ -166,7 +169,7 @@ void *fib_signal_handler_thread(void *arg)
                                                   * merely to make the compiler shut up */
                 };
 
-                DEBUG("\tstarting route discovery towards %s... \n",
+                AODV_DEBUG("\tstarting route discovery towards %s... \n",
                       ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, &dest));
                 aodv_send_rreq(&rreq_data);
             }
@@ -184,8 +187,6 @@ void aodv_send_rreq(struct aodvv2_packet_data *packet_data)
     /* Make sure only one thread is dispatching a RREQ at a time */
     mutex_lock(&rreq_mutex);
 
-    AODV_DEBUG("%s()\n", __func__);
-
     struct aodvv2_packet_data *pd = malloc(sizeof(struct aodvv2_packet_data));
     memcpy(pd, packet_data, sizeof(struct aodvv2_packet_data));
 
@@ -213,8 +214,6 @@ void aodv_send_rrep(struct aodvv2_packet_data *packet_data, struct netaddr *next
     /* Make sure only one thread is dispatching a RREP at a time */
     mutex_lock(&rrep_mutex);
 
-    AODV_DEBUG("%s()\n", __func__);
-
     struct aodvv2_packet_data *pd = malloc(sizeof(struct aodvv2_packet_data));
     memcpy(pd, packet_data, sizeof(struct aodvv2_packet_data));
 
@@ -245,8 +244,6 @@ void aodv_send_rerr(struct unreachable_node unreachable_nodes[], size_t len, str
     /* Make sure only one thread is dispatching a RERR at a time */
     mutex_lock(&rerr_mutex);
 
-    AODV_DEBUG("%s()\n", __func__);
-
     struct rerr_data *rerrd = malloc(sizeof(struct rerr_data));
     *rerrd = (struct rerr_data) {
         .unreachable_nodes = unreachable_nodes,
@@ -313,10 +310,8 @@ static void *_aodv_sender_thread(void *arg)
 
     msg_t msgq[RCV_MSG_Q_SIZE];
     msg_init_queue(msgq, RCV_MSG_Q_SIZE);
-    AODV_DEBUG("_aodv_sender_thread initialized.\n");
 
     while (true) {
-        AODV_DEBUG("%s()\n", __func__);
         msg_t msg;
         msg_receive(&msg);
         struct msg_container *mc = (struct msg_container *) msg.content.ptr;
@@ -335,7 +330,7 @@ static void *_aodv_sender_thread(void *arg)
                              rerr_data->hoplimit, rerr_data->next_hop);
         }
         else {
-            DEBUG("ERROR: Couldn't identify Message\n");
+            AODV_DEBUG("ERROR: Couldn't identify Message\n");
         }
         _deep_free_msg_container(mc);
     }
@@ -348,7 +343,6 @@ static void *_aodv_receiver_thread(void *arg)
 {
     (void) arg;
 
-    AODV_DEBUG("%s()\n", __func__);
     uint32_t fromlen;
     char buf_rcv[UDP_BUFFER_SIZE];
     msg_t msg_q[RCV_MSG_Q_SIZE];
@@ -362,12 +356,11 @@ static void *_aodv_receiver_thread(void *arg)
     int sock_rcv = socket_base_socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
 
     if (-1 == socket_base_bind(sock_rcv, &sa_rcv, sizeof(sa_rcv))) {
-        DEBUG("Error: bind to receive socket failed!\n");
+        AODV_DEBUG("Error: bind to receive socket failed!\n");
         socket_base_close(sock_rcv);
         return NULL;
     }
 
-    AODV_DEBUG("ready to receive data\n");
     while (true) {
         int32_t rcv_size = socket_base_recvfrom(sock_rcv, (void *)buf_rcv, UDP_BUFFER_SIZE, 0,
                                         &sa_rcv, &fromlen);
@@ -376,11 +369,6 @@ static void *_aodv_receiver_thread(void *arg)
             AODV_DEBUG("ERROR receiving data!\n");
         }
 
-        AODV_DEBUG("_aodv_receiver_thread() %s:",
-              ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, &_v6_addr_local));
-        DEBUG(" UDP packet received from %s\n",
-              ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, &sa_rcv.sin6_addr));
-
         struct netaddr _sender;
         ipv6_addr_t_to_netaddr(&sa_rcv.sin6_addr, &_sender);
 
@@ -411,13 +399,14 @@ static void _write_packet(struct rfc5444_writer *wr __attribute__ ((unused)),
      * and print to console */
     abuf_hexdump(&_hexbuf, "\t", buffer, length);
     rfc5444_print_direct(&_hexbuf, buffer, length);
-    DEBUG("%s", abuf_getptr(&_hexbuf));
+    /* DEBUG("%s", abuf_getptr(&_hexbuf)); */
     abuf_clear(&_hexbuf);
 
     /* fetch the address the packet is supposed to be sent to (i.e. to a
      * specific node or the multicast address) from the writer_target struct
      * iface* is stored in. This is a bit hacky, but it does the trick. */
     wt = container_of(iface, struct writer_target, interface);
+    print_json_pkt_sent(wt);
     netaddr_to_ipv6_addr_t(&wt->target_addr, &sa_wp.sin6_addr);
 
     /* When originating a RREQ, add it to our RREQ table/update its predecessor */
@@ -437,6 +426,36 @@ static void _write_packet(struct rfc5444_writer *wr __attribute__ ((unused)),
     AODV_DEBUG("%d bytes sent.\n", bytes_sent);
 }
 
+/* Print the json representation of a sent packet to stdout for debugging */
+static void print_json_pkt_sent(struct writer_target *wt)
+{
+#if TEST_SETUP
+    // note: what if the content at wt has changed until this is printed? memcpy the entire thing?
+    int msg_type = wt->type;
+    if (msg_type == RFC5444_MSGTYPE_RREQ) {
+    printf("{\"log_type\": \"sent_rreq\", \"log_data\": {"
+        "\"orig_addr\": \"%s\", \"targ_addr\": \"%s\", \"orig_seqnum\": %d, \"metric\": %d}}\n",
+        netaddr_to_string(&nbuf_origaddr, &wt->packet_data.origNode.addr),
+        netaddr_to_string(&nbuf_targaddr, &wt->packet_data.targNode.addr),
+        wt->packet_data.origNode.seqnum, wt->packet_data.origNode.metric);
+    }
+    if (msg_type == RFC5444_MSGTYPE_RREP) {
+    printf("{\"log_type\": \"sent_rrep\", \"log_data\": {"
+        "\"next_hop\": \"%s\",\"orig_addr\": \"%s\", \"orig_seqnum\": %d,"
+        " \"targ_addr\": \"%s\"}}\n",
+                netaddr_to_string(&nbuf_nexthop, &wt->target_addr),
+                netaddr_to_string(&nbuf_origaddr, &wt->packet_data.origNode.addr),
+                wt->packet_data.origNode.seqnum,
+                netaddr_to_string(&nbuf_targaddr, &wt->packet_data.targNode.addr));
+    }
+    if (msg_type == RFC5444_MSGTYPE_RERR) {
+        /* TODO */
+    }
+#else
+    (void) wt; /* silence compiler */
+#endif
+}
+
 /* free the matryoshka doll of cobbled-together structs that the sender_thread receives */
 static void _deep_free_msg_container(struct msg_container *mc)
 {
diff --git a/sys/net/routing/aodvv2/reader.c b/sys/net/routing/aodvv2/reader.c
index 9f62598d350ff96b4a277c8a46ff507973958b26..c8ba0e386179a07bdb9cf58d5e871bb36f9a2f0d 100644
--- a/sys/net/routing/aodvv2/reader.c
+++ b/sys/net/routing/aodvv2/reader.c
@@ -33,13 +33,6 @@
 #include <inttypes.h>
 #endif
 
-#define VERBOSE_DEBUG (0)
-#if VERBOSE_DEBUG
-#define VDEBUG(...) AODV_DEBUG(__VA_ARGS__)
-#else
-#define VDEBUG(...)
-#endif
-
 static enum rfc5444_result _cb_rreq_blocktlv_addresstlvs_okay(
     struct rfc5444_reader_tlvblock_context *cont);
 static enum rfc5444_result _cb_rreq_blocktlv_messagetlvs_okay(
@@ -62,6 +55,8 @@ static enum rfc5444_result _cb_rerr_end_callback(
     struct rfc5444_reader_tlvblock_context *cont, bool dropped);
 
 /* helper functions */
+static void print_json_received_rreq(void);
+static void print_json_received_rrep(void);
 static uint8_t _get_link_cost(aodvv2_metric_t metricType);
 static uint8_t _get_max_metric(aodvv2_metric_t metricType);
 static uint8_t _get_route_cost(aodvv2_metric_t metricType, uint8_t metric);
@@ -73,7 +68,7 @@ static int num_unreachable_nodes;
 static int aodvv2_validity_t = (AODVV2_ACTIVE_INTERVAL + AODVV2_MAX_IDLETIME) * 1000; /* milliseconds */
 
 static struct rfc5444_reader reader;
-#if ENABLE_DEBUG
+#if AODV_DEBUG
 static struct netaddr_str nbuf;
 #endif
 
@@ -174,19 +169,18 @@ static struct rfc5444_reader_tlvblock_consumer_entry _rerr_address_consumer_entr
  */
 static enum rfc5444_result _cb_rreq_blocktlv_messagetlvs_okay(struct rfc5444_reader_tlvblock_context *cont)
 {
-    VDEBUG("%s()\n", __func__);
-
     if (!cont->has_hoplimit) {
-        DEBUG("\tERROR: missing hop limit\n");
+        AODV_DEBUG("\tERROR: missing hop limit\n");
         return RFC5444_DROP_PACKET;
     }
 
     packet_data.hoplimit = cont->hoplimit;
     if (packet_data.hoplimit == 0) {
-        DEBUG("\tERROR: Hoplimit is 0.\n");
+        AODV_DEBUG("\tERROR: Hoplimit is 0.\n");
         return RFC5444_DROP_PACKET;
     }
     packet_data.hoplimit--;
+
     return RFC5444_OKAY;
 }
 
@@ -198,20 +192,16 @@ static enum rfc5444_result _cb_rreq_blocktlv_messagetlvs_okay(struct rfc5444_rea
  */
 static enum rfc5444_result _cb_rreq_blocktlv_addresstlvs_okay(struct rfc5444_reader_tlvblock_context *cont)
 {
-#if ENABLE_DEBUG
+#if AODV_DEBUG
     struct netaddr_str nbuf;
 #endif
     struct rfc5444_reader_tlvblock_entry *tlv;
     bool is_origNode_addr = false;
     bool is_targNode_addr = false;
 
-    VDEBUG("%s()\n", __func__);
-    DEBUG("\taddr: %s\n", netaddr_to_string(&nbuf, &cont->addr));
-
     /* handle OrigNode SeqNum TLV */
     tlv = _rreq_rrep_address_consumer_entries[RFC5444_MSGTLV_ORIGSEQNUM].tlv;
     if (tlv) {
-        DEBUG("\ttlv RFC5444_MSGTLV_ORIGSEQNUM: %d\n", *tlv->single_value);
         is_origNode_addr = true;
         packet_data.origNode.addr = cont->addr;
         packet_data.origNode.seqnum = *tlv->single_value;
@@ -220,7 +210,6 @@ static enum rfc5444_result _cb_rreq_blocktlv_addresstlvs_okay(struct rfc5444_rea
     /* handle TargNode SeqNum TLV */
     tlv = _rreq_rrep_address_consumer_entries[RFC5444_MSGTLV_TARGSEQNUM].tlv;
     if (tlv) {
-        DEBUG("\ttlv RFC5444_MSGTLV_TARGSEQNUM: %d\n", *tlv->single_value);
         is_targNode_addr = true;
         packet_data.targNode.addr = cont->addr;
         packet_data.targNode.seqnum = *tlv->single_value;
@@ -231,7 +220,7 @@ static enum rfc5444_result _cb_rreq_blocktlv_addresstlvs_okay(struct rfc5444_rea
         packet_data.targNode.addr = cont->addr;
     }
     if (!is_origNode_addr && !is_targNode_addr) {
-        DEBUG("\tERROR: mandatory RFC5444_MSGTLV_ORIGSEQNUM TLV missing.\n");
+        AODV_DEBUG("\tERROR: mandatory RFC5444_MSGTLV_ORIGSEQNUM TLV missing.\n");
         return RFC5444_DROP_PACKET;
     }
 
@@ -241,19 +230,18 @@ static enum rfc5444_result _cb_rreq_blocktlv_addresstlvs_okay(struct rfc5444_rea
     /* cppcheck-suppress arrayIndexOutOfBounds */
     tlv = _rreq_rrep_address_consumer_entries[RFC5444_MSGTLV_METRIC].tlv;
     if (!tlv && is_origNode_addr) {
-        DEBUG("\tERROR: Missing or unknown metric TLV.\n");
+        AODV_DEBUG("\tERROR: Missing or unknown metric TLV.\n");
         return RFC5444_DROP_PACKET;
     }
     if (tlv) {
         if (!is_origNode_addr) {
-            DEBUG("\tERROR: Metric TLV belongs to wrong address.\n");
+            AODV_DEBUG("\tERROR: Metric TLV belongs to wrong address.\n");
             return RFC5444_DROP_PACKET;
         }
-        VDEBUG("\ttlv RFC5444_MSGTLV_METRIC val: %d, exttype: %d\n",
-               *tlv->single_value, tlv->type_ext);
         packet_data.metricType = tlv->type_ext;
         packet_data.origNode.metric = *tlv->single_value;
     }
+
     return RFC5444_OKAY;
 }
 
@@ -272,26 +260,29 @@ static enum rfc5444_result _cb_rreq_end_callback(
     struct aodvv2_routing_entry_t *rt_entry;
     timex_t now;
 
+    /* We've received a valid RREQ, log this. */
+    print_json_received_rreq();
+
     /* Check if packet contains the required information */
     if (dropped) {
-        DEBUG("\t Dropping packet.\n");
+        AODV_DEBUG("\t Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
     if ((packet_data.origNode.addr._type == AF_UNSPEC) || !packet_data.origNode.seqnum) {
-        DEBUG("\tERROR: missing OrigNode Address or SeqNum. Dropping packet.\n");
+        AODV_DEBUG("\tERROR: missing OrigNode Address or SeqNum. Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
     if (packet_data.targNode.addr._type == AF_UNSPEC) {
-        DEBUG("\tERROR: missing TargNode Address. Dropping packet.\n");
+        AODV_DEBUG("\tERROR: missing TargNode Address. Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
     if (packet_data.hoplimit == 0) {
-        DEBUG("\tERROR: Hoplimit is 0. Dropping packet.\n");
+        AODV_DEBUG("\tERROR: Hoplimit is 0. Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
     if ((_get_max_metric(packet_data.metricType) - _get_link_cost(packet_data.metricType))
         <= packet_data.origNode.metric) {
-        DEBUG("\tMetric Limit reached. Dropping packet.\n");
+        AODV_DEBUG("\tMetric Limit reached. Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
 
@@ -302,7 +293,7 @@ static enum rfc5444_result _cb_rreq_end_callback(
       is taken.
     */
     if (rreqtable_is_redundant(&packet_data)) {
-        DEBUG("\tPacket is redundant. Dropping Packet. %i\n", RFC5444_DROP_PACKET);
+        AODV_DEBUG("\tPacket is redundant. Dropping Packet. %i\n", RFC5444_DROP_PACKET);
         return RFC5444_DROP_PACKET;
     }
 
@@ -339,13 +330,11 @@ static enum rfc5444_result _cb_rreq_end_callback(
         ndp_neighbor_cache_t *ndp_nc_entry = ndp_neighbor_cache_search(&sender_tmp);
 
         if (ndp_nc_entry == NULL) {
-            DEBUG("OH NOES! No bidirectional link to sender. Dropping packet.\n");
+            AODV_DEBUG("No bidirectional link to sender. Dropping packet.\n");
             return RFC5444_DROP_PACKET;
         }
         /* HACKY FIX ENDS HERE */
 
-        VDEBUG("\tCreating new Routing Table entry...\n");
-
         struct aodvv2_routing_entry_t *tmp_rt_entry = (struct aodvv2_routing_entry_t *)
                                                        malloc(sizeof(struct aodvv2_routing_entry_t));
         memset(tmp_rt_entry, 0, sizeof(*tmp_rt_entry));
@@ -361,12 +350,12 @@ static enum rfc5444_result _cb_rreq_end_callback(
     }
     else {
         if (!routingtable_offers_improvement(rt_entry, &packet_data.origNode)) {
-            DEBUG("\tPacket offers no improvement over known route. Dropping Packet.\n");
+            AODV_DEBUG("\tPacket offers no improvement over known route. Dropping Packet.\n");
             return RFC5444_DROP_PACKET;
         }
         /* The incoming routing information is better than existing routing
          * table information and SHOULD be used to improve the route table. */
-        VDEBUG("\tUpdating Routing Table entry...\n");
+        AODV_DEBUG("\tUpdating Routing Table entry...\n");
         routingtable_fill_routing_entry_t_rreq(&packet_data, rt_entry);
 
         /* update the FIB */
@@ -402,20 +391,19 @@ static enum rfc5444_result _cb_rreq_end_callback(
  */
 static enum rfc5444_result _cb_rrep_blocktlv_messagetlvs_okay(struct rfc5444_reader_tlvblock_context *cont)
 {
-    VDEBUG("%s()\n", __func__);
-
     if (!cont->has_hoplimit) {
-        VDEBUG("\tERROR: missing hop limit\n");
+        AODV_DEBUG("\tERROR: missing hop limit\n");
         return RFC5444_DROP_PACKET;
     }
 
     packet_data.hoplimit = cont->hoplimit;
     if (packet_data.hoplimit == 0) {
-        VDEBUG("\tERROR: Hoplimit is 0.\n");
+        AODV_DEBUG("\tERROR: Hoplimit is 0.\n");
         return RFC5444_DROP_PACKET;
     }
 
     packet_data.hoplimit--;
+
     return RFC5444_OKAY;
 }
 
@@ -427,20 +415,16 @@ static enum rfc5444_result _cb_rrep_blocktlv_messagetlvs_okay(struct rfc5444_rea
  */
 static enum rfc5444_result _cb_rrep_blocktlv_addresstlvs_okay(struct rfc5444_reader_tlvblock_context *cont)
 {
-#if ENABLE_DEBUG
-    /* cppcheck-suppress unusedVariable as nbuf is needed by VDEBUG. */
+#if AODV_DEBUG
+    /* cppcheck-suppress unusedVariable as nbuf is needed by AODV_DEBUG. */
     struct netaddr_str nbuf;
 #endif
     struct rfc5444_reader_tlvblock_entry *tlv;
     bool is_targNode_addr = false;
 
-    VDEBUG("%s()\n", __func__);
-    VDEBUG("\taddr: %s\n", netaddr_to_string(&nbuf, &cont->addr));
-
     /* handle TargNode SeqNum TLV */
     tlv = _rreq_rrep_address_consumer_entries[RFC5444_MSGTLV_TARGSEQNUM].tlv;
     if (tlv) {
-        VDEBUG("\ttlv RFC5444_MSGTLV_TARGSEQNUM: %d\n", *tlv->single_value);
         is_targNode_addr = true;
         packet_data.targNode.addr = cont->addr;
         packet_data.targNode.seqnum = *tlv->single_value;
@@ -449,13 +433,12 @@ static enum rfc5444_result _cb_rrep_blocktlv_addresstlvs_okay(struct rfc5444_rea
     /* handle OrigNode SeqNum TLV */
     tlv = _rreq_rrep_address_consumer_entries[RFC5444_MSGTLV_ORIGSEQNUM].tlv;
     if (tlv) {
-        VDEBUG("\ttlv RFC5444_MSGTLV_ORIGSEQNUM: %d\n", *tlv->single_value);
         is_targNode_addr = false;
         packet_data.origNode.addr = cont->addr;
         packet_data.origNode.seqnum = *tlv->single_value;
     }
     if (!tlv && !is_targNode_addr) {
-        DEBUG("\tERROR: mandatory SeqNum TLV missing.\n");
+        AODV_DEBUG("\tERROR: mandatory SeqNum TLV missing.\n");
         return RFC5444_DROP_PACKET;
     }
 
@@ -465,16 +448,14 @@ static enum rfc5444_result _cb_rrep_blocktlv_addresstlvs_okay(struct rfc5444_rea
     /* cppcheck-suppress arrayIndexOutOfBounds */
     tlv = _rreq_rrep_address_consumer_entries[RFC5444_MSGTLV_METRIC].tlv;
     if (!tlv && is_targNode_addr) {
-        DEBUG("\tERROR: Missing or unknown metric TLV.\n");
+        AODV_DEBUG("\tERROR: Missing or unknown metric TLV.\n");
         return RFC5444_DROP_PACKET;
     }
     if (tlv) {
         if (!is_targNode_addr) {
-            DEBUG("\tERROR: metric TLV belongs to wrong address.\n");
+            AODV_DEBUG("\tERROR: metric TLV belongs to wrong address.\n");
             return RFC5444_DROP_PACKET;
         }
-        VDEBUG("\ttlv RFC5444_MSGTLV_METRIC val: %d, exttype: %d\n",
-               *tlv->single_value, tlv->type_ext);
         packet_data.metricType = tlv->type_ext;
         packet_data.targNode.metric = *tlv->single_value;
     }
@@ -493,32 +474,33 @@ static enum rfc5444_result _cb_rrep_end_callback(
 {
     (void) cont;
 
-    VDEBUG("%s()\n", __func__);
-
     struct aodvv2_routing_entry_t *rt_entry;
-#if ENABLE_DEBUG
+#if AODV_DEBUG
     struct netaddr_str nbuf;
 #endif
     timex_t now;
 
+    /* We've received a valid RREP, log this. */
+    print_json_received_rrep();
+
     /* Check if packet contains the required information */
     if (dropped) {
-        DEBUG("\t Dropping packet.\n");
+        AODV_DEBUG("\t Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
     if ((packet_data.origNode.addr._type == AF_UNSPEC)
         || !packet_data.origNode.seqnum) {
-        DEBUG("\tERROR: missing OrigNode Address or SeqNum. Dropping packet.\n");
+        AODV_DEBUG("\tERROR: missing OrigNode Address or SeqNum. Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
     if ((packet_data.targNode.addr._type == AF_UNSPEC)
         || !packet_data.targNode.seqnum) {
-        DEBUG("\tERROR: missing TargNode Address or SeqNum. Dropping packet.\n");
+        AODV_DEBUG("\tERROR: missing TargNode Address or SeqNum. Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
     if ((_get_max_metric(packet_data.metricType) - _get_link_cost(packet_data.metricType))
         <= packet_data.targNode.metric) {
-        DEBUG("\tMetric Limit reached. Dropping packet.\n");
+        AODV_DEBUG("\tMetric Limit reached. Dropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
 
@@ -552,11 +534,10 @@ static enum rfc5444_result _cb_rrep_end_callback(
         ndp_neighbor_cache_t *ndp_nc_entry = ndp_neighbor_cache_search(&sender_tmp);
 
         if (ndp_nc_entry == NULL) {
-            DEBUG("OH NOES! No bidirectional link to sender. Dropping packet.\n");
+            AODV_DEBUG("No bidirectional link to sender. Dropping packet.\n");
             return RFC5444_DROP_PACKET;
         }
         /* HACKY FIX ENDS HERE */
-        VDEBUG("\tCreating new Routing Table entry...\n");
 
         struct aodvv2_routing_entry_t *tmp_rt_entry = (struct aodvv2_routing_entry_t *)
                                                        malloc(sizeof(struct aodvv2_routing_entry_t));
@@ -573,12 +554,12 @@ static enum rfc5444_result _cb_rrep_end_callback(
     }
     else {
         if (!routingtable_offers_improvement(rt_entry, &packet_data.targNode)) {
-            DEBUG("\tPacket offers no improvement over known route. Dropping Packet.\n");
+            AODV_DEBUG("\tPacket offers no improvement over known route. Dropping Packet.\n");
             return RFC5444_DROP_PACKET;
         }
         /* The incoming routing information is better than existing routing
          * table information and SHOULD be used to improve the route table. */
-        VDEBUG("\tUpdating Routing Table entry...\n");
+        AODV_DEBUG("\tUpdating Routing Table entry...\n");
         routingtable_fill_routing_entry_t_rrep(&packet_data, rt_entry);
 
         /* update the FIB */
@@ -590,13 +571,8 @@ static enum rfc5444_result _cb_rrep_end_callback(
     earlier RREQ, and RREP processing is completed.  Any packets
     buffered for OrigNode should be transmitted. */
     if (clienttable_is_client(&packet_data.origNode.addr)) {
-#if ENABLE_DEBUG
-        static struct netaddr_str nbuf2;
-#endif
-
-        DEBUG("\t{%" PRIu32 ":%" PRIu32 "} %s:  This is my RREP (SeqNum: %d). We are done here, thanks %s!\n",
-              now.seconds, now.microseconds, netaddr_to_string(&nbuf, &packet_data.origNode.addr),
-              packet_data.origNode.seqnum, netaddr_to_string(&nbuf2, &packet_data.targNode.addr));
+        AODV_DEBUG("\t%s:  This is my RREP. We are done here!\n",
+              netaddr_to_string(&nbuf, &packet_data.origNode.addr));
     }
 
     else {
@@ -611,16 +587,14 @@ static enum rfc5444_result _cb_rrep_end_callback(
 
 static enum rfc5444_result _cb_rerr_blocktlv_messagetlvs_okay(struct rfc5444_reader_tlvblock_context *cont)
 {
-    VDEBUG("%s()\n", __func__);
-
     if (!cont->has_hoplimit) {
-        VDEBUG("\tERROR: missing hop limit\n");
+        AODV_DEBUG("\tERROR: missing hop limit\n");
         return RFC5444_DROP_PACKET;
     }
 
     packet_data.hoplimit = cont->hoplimit;
     if (packet_data.hoplimit == 0) {
-        VDEBUG("\tERROR: Hoplimit is 0.\n");
+        AODV_DEBUG("\tERROR: Hoplimit is 0.\n");
         return RFC5444_DROP_PACKET;
     }
 
@@ -636,16 +610,16 @@ static enum rfc5444_result _cb_rerr_blocktlv_messagetlvs_okay(struct rfc5444_rea
 
 static enum rfc5444_result _cb_rerr_blocktlv_addresstlvs_okay(struct rfc5444_reader_tlvblock_context *cont)
 {
-#if ENABLE_DEBUG
-    /* cppcheck-suppress unusedVariable as nbuf is needed by VDEBUG. */
+#if AODV_DEBUG
+    /* cppcheck-suppress unusedVariable as nbuf is needed by AODV_DEBUG. */
     struct netaddr_str nbuf;
 #endif
     struct aodvv2_routing_entry_t *unreachable_entry;
     struct rfc5444_reader_tlvblock_entry *tlv;
 
-    VDEBUG("%s()\n", __func__);
-    VDEBUG("\tmessage type: %d\n", cont->type);
-    VDEBUG("\taddr: %s\n", netaddr_to_string(&nbuf, &cont->addr));
+    AODV_DEBUG("%s()\n", __func__);
+    AODV_DEBUG("\tmessage type: %d\n", cont->type);
+    AODV_DEBUG("\taddr: %s\n", netaddr_to_string(&nbuf, &cont->addr));
 
     /* Out of buffer size for more unreachable nodes. We're screwed, basically. */
     if (num_unreachable_nodes == AODVV2_MAX_UNREACHABLE_NODES) {
@@ -661,14 +635,14 @@ static enum rfc5444_result _cb_rerr_blocktlv_addresstlvs_okay(struct rfc5444_rea
     /* cppcheck-suppress arrayIndexOutOfBounds */
     tlv = _rerr_address_consumer_entries[RFC5444_MSGTLV_UNREACHABLE_NODE_SEQNUM].tlv;
     if (tlv) {
-        VDEBUG("\ttlv RFC5444_MSGTLV_UNREACHABLE_NODE_SEQNUM: %d\n", *tlv->single_value);
+        AODV_DEBUG("\ttlv RFC5444_MSGTLV_UNREACHABLE_NODE_SEQNUM: %d\n", *tlv->single_value);
         packet_data.origNode.seqnum = *tlv->single_value;
     }
 
     /* Check if there is an entry for unreachable node in our routing table */
     unreachable_entry = routingtable_get_entry(&packet_data.origNode.addr, packet_data.metricType);
     if (unreachable_entry) {
-        VDEBUG("\t found possibly unreachable entry.\n");
+        AODV_DEBUG("\t found possibly unreachable entry.\n");
 
         /* check if route to unreachable node has to be marked as broken and RERR has to be forwarded */
         if (netaddr_cmp(&unreachable_entry->nextHopAddr, &packet_data.sender) == 0
@@ -691,12 +665,12 @@ static enum rfc5444_result _cb_rerr_end_callback(struct rfc5444_reader_tlvblock_
     (void) cont;
 
     if (dropped) {
-        VDEBUG("\tDropping packet.\n");
+        AODV_DEBUG("\tDropping packet.\n");
         return RFC5444_DROP_PACKET;
     }
 
     if (num_unreachable_nodes == 0) {
-        VDEBUG("\tNo unreachable nodes from my routing table. Dropping Packet.\n");
+        AODV_DEBUG("\tNo unreachable nodes from my routing table. Dropping Packet.\n");
         return RFC5444_DROP_PACKET;
     }
     /* gather all unreachable nodes and put them into a RERR */
@@ -706,7 +680,7 @@ static enum rfc5444_result _cb_rerr_end_callback(struct rfc5444_reader_tlvblock_
 
 void aodv_packet_reader_init(void)
 {
-    VDEBUG("%s()\n", __func__);
+    AODV_DEBUG("%s()\n", __func__);
 
     /* initialize reader */
     rfc5444_reader_init(&reader);
@@ -734,21 +708,50 @@ void aodv_packet_reader_init(void)
 
 void aodv_packet_reader_cleanup(void)
 {
-    VDEBUG("%s()\n", __func__);
     rfc5444_reader_cleanup(&reader);
 }
 
 int aodv_packet_reader_handle_packet(void *buffer, size_t length, struct netaddr *sender)
 {
-    AODV_DEBUG("%s()\n", __func__);
     memcpy(&packet_data.sender, sender, sizeof(*sender));
-    DEBUG("\t sender: %s\n", netaddr_to_string(&nbuf, &packet_data.sender));
 
     return rfc5444_reader_handle_packet(&reader, buffer, length);
 }
 
 /*============= HELPER FUNCTIONS =============================================*/
 
+static void print_json_received_rreq(void)
+{
+#if TEST_SETUP
+    static struct netaddr_str nbuf_origaddr, nbuf_targaddr, nbuf_send;
+
+    printf("{\"log_type\": \"received_rreq\", "
+        "\"log_data\":{ \"last_hop\": \"%s\", \"orig_addr\": \"%s\", "
+        "\"orig_seqnum\": %d, \"targ_addr\": \"%s\", \"metric\": %d}}\n",
+        netaddr_to_string(&nbuf_send, &packet_data.sender),
+        netaddr_to_string(&nbuf_origaddr, &packet_data.origNode.addr),
+        packet_data.origNode.seqnum,
+        netaddr_to_string(&nbuf_targaddr, &packet_data.targNode.addr),
+        packet_data.origNode.metric);
+#endif
+}
+
+static void print_json_received_rrep(void)
+{
+#if TEST_SETUP
+    static struct netaddr_str nbuf_origaddr, nbuf_targaddr, nbuf_send;
+
+    printf("{\"log_type\": \"received_rrep\", "
+        "\"log_data\":{ \"last_hop\": \"%s\", \"orig_addr\": \"%s\", "
+        "\"orig_seqnum\": %d, \"targ_addr\": \"%s\", \"targ_seqnum\":%d}}\n",
+        netaddr_to_string(&nbuf_send, &packet_data.sender),
+        netaddr_to_string(&nbuf_origaddr, &packet_data.origNode.addr),
+        packet_data.origNode.seqnum,
+        netaddr_to_string(&nbuf_targaddr, &packet_data.targNode.addr),
+        packet_data.targNode.seqnum);
+#endif
+}
+
 /*
  * Cost(L): Get Cost of a Link regarding the specified metric.
  * (currently only AODVV2_DEFAULT_METRIC_TYPE (HopCount) implemented)
diff --git a/sys/net/routing/aodvv2/routingtable.c b/sys/net/routing/aodvv2/routingtable.c
index 87c0a954a6f7b3684b4ab24101dbfdd76904fe83..bf574d2e62d8987e1d562221b1f5e778102f92f6 100644
--- a/sys/net/routing/aodvv2/routingtable.c
+++ b/sys/net/routing/aodvv2/routingtable.c
@@ -28,6 +28,7 @@
 
 /* helper functions */
 static void _reset_entry_if_stale(uint8_t i);
+static void print_json_added_rt_entry(struct aodvv2_routing_entry_t *entry);
 
 static struct aodvv2_routing_entry_t routing_table[AODVV2_MAX_ROUTING_ENTRIES];
 static timex_t null_time, max_seqnum_lifetime, active_interval, max_idletime, validity_t;
@@ -59,6 +60,8 @@ struct netaddr *routingtable_get_next_hop(struct netaddr *dest, aodvv2_metric_t
 
 void routingtable_add_entry(struct aodvv2_routing_entry_t *entry)
 {
+    print_json_added_rt_entry(entry);
+
     /* only add if we don't already know the address */
     if (routingtable_get_entry(&(entry->addr), entry->metricType)) {
         return;
@@ -238,6 +241,32 @@ void routingtable_fill_routing_entry_t_rrep(struct aodvv2_packet_data *packet_da
     rt_entry->state = ROUTE_STATE_ACTIVE;
 }
 
+#if TEST_SETUP
+/* Write JSON representation of rt_entry to json_str */
+static void routingtable_entry_to_json(struct aodvv2_routing_entry_t *rt_entry, char* json_str)
+{
+
+    struct netaddr_str nbuf_addr, nbuf_nexthop;
+
+    sprintf(json_str,"{\"addr\": \"%s\", \"next_hop\": \"%s\", \"seqnum\": %d,"
+                     "\"metric\": %d, \"state\": %d}",
+                     netaddr_to_string(&nbuf_addr, &rt_entry->addr),
+                     netaddr_to_string(&nbuf_nexthop, &rt_entry->nextHopAddr),
+                     rt_entry->seqnum, rt_entry->metric, rt_entry->state);
+}
+#endif
+
+static void print_json_added_rt_entry(struct aodvv2_routing_entry_t *entry)
+{
+#if TEST_SETUP
+    char rt_entry_json [500];
+    routingtable_entry_to_json(entry, rt_entry_json);
+    printf("{\"log_type\": \"added_rt_entry\", \"log_data\": %s}\n", rt_entry_json);
+#else
+    (void) entry; /* silence compiler */
+#endif
+}
+
 void print_routingtable(void)
 {
     printf("===== BEGIN ROUTING TABLE ===================\n");