diff --git a/apps/er-coap-07/er-coap-07-engine.c b/apps/er-coap-07/er-coap-07-engine.c
index a6a1dc573..8b2e4ca71 100644
--- a/apps/er-coap-07/er-coap-07-engine.c
+++ b/apps/er-coap-07/er-coap-07-engine.c
@@ -67,13 +67,13 @@
 
 PROCESS(coap_receiver, "CoAP Receiver");
 
-/*-----------------------------------------------------------------------------------*/
-/*- Variables -----------------------------------------------------------------------*/
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
+/*- Variables ----------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 static service_callback_t service_cbk = NULL;
-/*-----------------------------------------------------------------------------------*/
-/*-----------------------------------------------------------------------------------*/
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 static
 int
 handle_incoming_data(void)
@@ -279,27 +279,27 @@ handle_incoming_data(void)
 
   return coap_error_code;
 }
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 void
 coap_receiver_init()
 {
   process_start(&coap_receiver, NULL);
 }
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 void
 coap_set_service_callback(service_callback_t callback)
 {
   service_cbk = callback;
 }
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 rest_resource_flags_t
 coap_get_rest_method(void *packet)
 {
   return (rest_resource_flags_t)(1 << (((coap_packet_t *)packet)->code - 1));
 }
-/*-----------------------------------------------------------------------------------*/
-/*- Server part ---------------------------------------------------------------------*/
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
+/*- Server part --------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 
 /* The discover resource is automatically included for CoAP. */
 RESOURCE(well_known_core, METHOD_GET, ".well-known/core", "ct=40");
@@ -311,8 +311,19 @@ well_known_core_handler(void* request, void* response, uint8_t *buffer, uint16_t
     size_t tmplen = 0;
     resource_t* resource = NULL;
 
+    /* For filtering. */
+    const char *filter = NULL;
+    int len = coap_get_query_variable(request, "rt", &filter);
+    char *rt = NULL;
+
     for (resource = (resource_t*)list_head(rest_get_resources()); resource; resource = resource->next)
     {
+      /* Filtering */
+      if (len && ((rt=strstr(resource->attributes, "rt=\""))==NULL || memcmp(rt+4, filter, len-1)!=0 || (filter[len-1]!='*' && (filter[len-1]!=rt[3+len] || rt[4+len]!='"'))))
+      {
+        continue;
+      }
+
       PRINTF("res: /%s (%p)\npos: s%d, o%d, b%d\n", resource->url, resource, strpos, *offset, bufpos);
 
       if (strpos >= *offset && bufpos < preferred_size)
@@ -390,7 +401,7 @@ well_known_core_handler(void* request, void* response, uint8_t *buffer, uint16_t
       coap_set_payload(response, buffer, bufpos );
       coap_set_header_content_type(response, APPLICATION_LINK_FORMAT);
     }
-    else
+    else if (strpos>0)
     {
       PRINTF("well_known_core_handler(): bufpos<=0\n");
 
@@ -408,7 +419,7 @@ well_known_core_handler(void* request, void* response, uint8_t *buffer, uint16_t
       *offset += preferred_size;
     }
 }
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 PROCESS_THREAD(coap_receiver, ev, data)
 {
   PROCESS_BEGIN();
@@ -433,15 +444,15 @@ PROCESS_THREAD(coap_receiver, ev, data)
 
   PROCESS_END();
 }
-/*-----------------------------------------------------------------------------------*/
-/*- Client part ---------------------------------------------------------------------*/
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
+/*- Client part --------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 void blocking_request_callback(void *callback_data, void *response) {
   struct request_state_t *state = (struct request_state_t *) callback_data;
   state->response = (coap_packet_t*) response;
   process_poll(state->process);
 }
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 PT_THREAD(coap_blocking_request(struct request_state_t *state, process_event_t ev,
                                 uip_ipaddr_t *remote_ipaddr, uint16_t remote_port,
                                 coap_packet_t *request,
@@ -509,9 +520,9 @@ PT_THREAD(coap_blocking_request(struct request_state_t *state, process_event_t e
 
   PT_END(&state->pt);
 }
-/*-----------------------------------------------------------------------------------*/
-/*- Engine Interface ----------------------------------------------------------------*/
-/*-----------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
+/*- Engine Interface ---------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
 const struct rest_implementation coap_rest_implementation = {
   "CoAP-07",
 
diff --git a/apps/er-coap-07/er-coap-07-observing.c b/apps/er-coap-07/er-coap-07-observing.c
index 11eef1935..23fae45c4 100644
--- a/apps/er-coap-07/er-coap-07-observing.c
+++ b/apps/er-coap-07/er-coap-07-observing.c
@@ -60,6 +60,9 @@ LIST(observers_list);
 coap_observer_t *
 coap_add_observer(uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len, const char *url)
 {
+  /* Remove existing observe relationship, if any. */
+  coap_remove_observer_by_url(addr, port, url);
+
   coap_observer_t *o = memb_alloc(&observers_memb);
 
   if (o)
@@ -164,43 +167,51 @@ coap_remove_observer_by_mid(uip_ipaddr_t *addr, uint16_t port, uint16_t mid)
 }
 /*-----------------------------------------------------------------------------------*/
 void
-coap_notify_observers(const char *url, int type, uint32_t observe, uint8_t *payload, size_t payload_len)
+coap_notify_observers(resource_t *resource, uint16_t obs_counter, void *notification)
 {
+  coap_packet_t *const coap_res = (coap_packet_t *) notification;
   coap_observer_t* obs = NULL;
+  uint8_t preferred_type = coap_res->type;
+
+  PRINTF("Observing: Notification from %s\n", resource->url);
+
+  /* Iterate over observers. */
   for (obs = (coap_observer_t*)list_head(observers_list); obs; obs = obs->next)
   {
-    if (obs->url==url) /* using RESOURCE url pointer as handle */
+    if (obs->url==resource->url) /* using RESOURCE url pointer as handle */
     {
       coap_transaction_t *transaction = NULL;
 
-      /*TODO implement special transaction for CON, sharing the same buffer to allow for more observers */
+      /*TODO implement special transaction for CON, sharing the same buffer to allow for more observers. */
 
       if ( (transaction = coap_new_transaction(coap_get_mid(), &obs->addr, obs->port)) )
       {
-        /* Use CON to check whether client is still there/interested after COAP_OBSERVING_REFRESH_INTERVAL. */
-        if (stimer_expired(&obs->refresh_timer))
-        {
-          PRINTF("Observing: Refresh client with CON\n");
-          type = COAP_TYPE_CON;
-          stimer_restart(&obs->refresh_timer);
-        }
-
-        /* prepare response */
-        coap_packet_t push[1]; /* This way the packet can be treated as pointer as usual. */
-        coap_init_message(push, (coap_message_type_t)type, CONTENT_2_05, transaction->mid );
-        coap_set_header_observe(push, observe);
-        coap_set_header_token(push, obs->token, obs->token_len);
-        coap_set_payload(push, payload, payload_len);
-        transaction->packet_len = coap_serialize_message(push, transaction->packet);
-
-        PRINTF("Observing: Notify from /%s for ", url);
+        PRINTF("           Observer ");
         PRINT6ADDR(&obs->addr);
         PRINTF(":%u\n", obs->port);
-        PRINTF("  %.*s\n", payload_len, payload);
 
         /* Update last MID for RST matching. */
         obs->last_mid = transaction->mid;
 
+        /* Prepare response */
+        coap_res->mid = transaction->mid;
+        coap_set_header_observe(coap_res, obs_counter);
+        coap_set_header_token(coap_res, obs->token, obs->token_len);
+
+        /* Use CON to check whether client is still there/interested after COAP_OBSERVING_REFRESH_INTERVAL. */
+        if (stimer_expired(&obs->refresh_timer))
+        {
+          PRINTF("           Refreshing with CON\n");
+          coap_res->type = COAP_TYPE_CON;
+          stimer_restart(&obs->refresh_timer);
+        }
+        else
+        {
+          coap_res->type = preferred_type;
+        }
+
+        transaction->packet_len = coap_serialize_message(coap_res, transaction->packet);
+
         coap_send_transaction(transaction);
       }
     }
diff --git a/apps/er-coap-07/er-coap-07-observing.h b/apps/er-coap-07/er-coap-07-observing.h
index 7b09ba83e..a17ad86bd 100644
--- a/apps/er-coap-07/er-coap-07-observing.h
+++ b/apps/er-coap-07/er-coap-07-observing.h
@@ -75,7 +75,7 @@ int coap_remove_observer_by_token(uip_ipaddr_t *addr, uint16_t port, uint8_t *to
 int coap_remove_observer_by_url(uip_ipaddr_t *addr, uint16_t port, const char *url);
 int coap_remove_observer_by_mid(uip_ipaddr_t *addr, uint16_t port, uint16_t mid);
 
-void coap_notify_observers(const char *url, int type, uint32_t observe, uint8_t *payload, size_t payload_len);
+void coap_notify_observers(resource_t *resource, uint16_t obs_counter, void *notification);
 
 void coap_observe_handler(resource_t *resource, void *request, void *response);
 
diff --git a/apps/er-coap-07/er-coap-07-separate.c b/apps/er-coap-07/er-coap-07-separate.c
index 528b0c112..7a2a7b859 100644
--- a/apps/er-coap-07/er-coap-07-separate.c
+++ b/apps/er-coap-07/er-coap-07-separate.c
@@ -53,41 +53,40 @@
 #define PRINTLLADDR(addr)
 #endif
 
-/*-----------------------------------------------------------------------------------*/
-int coap_separate_handler(resource_t *resource, void *request, void *response)
+/*----------------------------------------------------------------------------*/
+void
+coap_separate_reject()
 {
-  coap_packet_t *const coap_req = (coap_packet_t *) request;
-
-  PRINTF("Separate response for /%s MID %u\n", resource->url, coap_res->mid);
-
-  /* Only ack CON requests. */
-  if (coap_req->type==COAP_TYPE_CON)
-  {
-    /* send separate ACK. */
-    coap_packet_t ack[1];
-    /* ACK with empty code (0) */
-    coap_init_message(ack, COAP_TYPE_ACK, 0, coap_req->mid);
-    /* Serializing into IPBUF: Only overwrites header parts that are already parsed into the request struct. */
-    coap_send_message(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, (uip_appdata), coap_serialize_message(ack, uip_appdata));
-  }
-
-  /* Pre-handlers could skip the handling by returning 0. */
-  return 1;
+  coap_error_code = SERVICE_UNAVAILABLE_5_03;
+  coap_error_message = "AlreadyInUse";
 }
-
+/*----------------------------------------------------------------------------*/
 int
-coap_separate_yield(void *request, coap_separate_t *separate_store)
+coap_separate_accept(void *request, coap_separate_t *separate_store)
 {
   coap_packet_t *const coap_req = (coap_packet_t *) request;
   coap_transaction_t *const t = coap_get_transaction_by_mid(coap_req->mid);
 
+  PRINTF("Separate ACCEPT: /%.*s MID %u\n", coap_req->uri_path_len, coap_req->uri_path, coap_req->mid);
   if (t)
   {
+    /* Send separate ACK for CON. */
+    if (coap_req->type==COAP_TYPE_CON)
+    {
+      coap_packet_t ack[1];
+      /* ACK with empty code (0) */
+      coap_init_message(ack, COAP_TYPE_ACK, 0, coap_req->mid);
+      /* Serializing into IPBUF: Only overwrites header parts that are already parsed into the request struct. */
+      coap_send_message(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, (uip_appdata), coap_serialize_message(ack, uip_appdata));
+    }
+
+    /* Store remote address. */
     uip_ipaddr_copy(&separate_store->addr, &t->addr);
     separate_store->port = t->port;
 
+    /* Store correct response type. */
     separate_store->type = coap_req->type==COAP_TYPE_CON ? COAP_TYPE_CON : COAP_TYPE_NON;
-    separate_store->mid = coap_get_mid(); // if it was NON, we burned one MID in the engine...
+    separate_store->mid = coap_get_mid(); /* if it was a NON, we burned one MID in the engine... */
 
     memcpy(separate_store->token, coap_req->token, coap_req->token_len);
     separate_store->token_len = coap_req->token_len;
@@ -102,13 +101,17 @@ coap_separate_yield(void *request, coap_separate_t *separate_store)
   }
   else
   {
+    PRINTF("ERROR: Response transaction for separate request not found!\n");
     return 0;
   }
 }
-
+/*----------------------------------------------------------------------------*/
 void
 coap_separate_resume(void *response, coap_separate_t *separate_store, uint8_t code)
 {
   coap_init_message(response, separate_store->type, code, separate_store->mid);
-  coap_set_header_token(response, separate_store->token, separate_store->token_len);
+  if (separate_store->token_len)
+  {
+    coap_set_header_token(response, separate_store->token, separate_store->token_len);
+  }
 }
diff --git a/apps/er-coap-07/er-coap-07-separate.h b/apps/er-coap-07/er-coap-07-separate.h
index 7eade7e56..896485d42 100644
--- a/apps/er-coap-07/er-coap-07-separate.h
+++ b/apps/er-coap-07/er-coap-07-separate.h
@@ -59,7 +59,8 @@ typedef struct coap_separate {
 } coap_separate_t;
 
 int coap_separate_handler(resource_t *resource, void *request, void *response);
-int coap_separate_yield(void *request, coap_separate_t *separate_store);
+void coap_separate_reject();
+int coap_separate_accept(void *request, coap_separate_t *separate_store);
 void coap_separate_resume(void *response, coap_separate_t *separate_store, uint8_t code);
 
 #endif /* COAP_SEPARATE_H_ */
diff --git a/apps/er-coap-07/er-coap-07-transactions.c b/apps/er-coap-07/er-coap-07-transactions.c
index 10070a29e..2a11002d4 100644
--- a/apps/er-coap-07/er-coap-07-transactions.c
+++ b/apps/er-coap-07/er-coap-07-transactions.c
@@ -105,6 +105,7 @@ coap_send_transaction(coap_transaction_t *t)
   {
     if (t->retrans_counter<COAP_MAX_RETRANSMIT)
     {
+      /* Not timed out yet. */
       PRINTF("Keeping transaction %u\n", t->mid);
 
       if (t->retrans_counter==0)
@@ -118,7 +119,10 @@ coap_send_transaction(coap_transaction_t *t)
         PRINTF("Doubled (%u) interval %f\n", t->retrans_counter, (float)t->retrans_timer.timer.interval/CLOCK_SECOND);
       }
 
-      /*FIXME hack, maybe there is a better way, but avoid posting everything to the process */
+      /*FIXME
+       * Hack: Setting timer for responsible process.
+       * Maybe there is a better way, but avoid posting everything to the process.
+       */
       struct process *process_actual = PROCESS_CURRENT();
       process_current = transaction_handler_process;
       etimer_restart(&t->retrans_timer); /* interval updated above */
@@ -128,7 +132,7 @@ coap_send_transaction(coap_transaction_t *t)
     }
     else
     {
-      /* timeout */
+      /* Timed out. */
       PRINTF("Timeout\n");
       restful_response_handler callback = t->callback;
       void *callback_data = t->callback_data;
diff --git a/apps/erbium/erbium.h b/apps/erbium/erbium.h
index 7e491c3f8..bf0cb8eee 100644
--- a/apps/erbium/erbium.h
+++ b/apps/erbium/erbium.h
@@ -75,7 +75,7 @@ struct periodic_resource_s;
 typedef void (*restful_handler) (void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
 typedef int (*restful_pre_handler) (struct resource_s *resource, void* request, void* response);
 typedef void (*restful_post_handler) (struct resource_s *resource, void* request, void* response);
-typedef int (*restful_periodic_handler) (struct resource_s* resource);
+typedef void (*restful_periodic_handler) (struct resource_s* resource);
 typedef void (*restful_response_handler) (void *data, void* response);
 
 /* Signature of the rest-engine service function. */
@@ -134,6 +134,31 @@ struct rest_implementation_type
   unsigned int APPLICATION_X_OBIX_BINARY;
 };
 
+/*
+ * Data structure representing a resource in REST.
+ */
+struct resource_s {
+  struct resource_s *next; /* for LIST, points to next resource defined */
+  rest_resource_flags_t flags; /* handled RESTful methods */
+  const char* url; /*handled URL*/
+  const char* attributes; /* link-format attributes */
+  restful_handler handler; /* handler function */
+  restful_pre_handler pre_handler; /* to be called before handler, may perform initializations */
+  restful_post_handler post_handler; /* to be called after handler, may perform finalizations (cleanup, etc) */
+  void* user_data; /* pointer to user specific data */
+  unsigned int benchmark; /* to benchmark resource handler, used for separate response */
+};
+typedef struct resource_s resource_t;
+
+struct periodic_resource_s {
+  struct periodic_resource_s *next; /* for LIST, points to next resource defined */
+  resource_t *resource;
+  uint32_t period;
+  struct etimer periodic_timer;
+  restful_periodic_handler periodic_handler;
+};
+typedef struct periodic_resource_s periodic_resource_t;
+
 struct rest_implementation {
   char *name;
 
@@ -199,7 +224,7 @@ struct rest_implementation {
   int (* get_post_variable)(void *request, const char *name, const char **value);
 
   /** Send the payload to all subscribers of the resource at url. */
-  void (* notify_subscribers)(const char *url, int implementation_secific_mode, uint32_t counter, uint8_t *payload, size_t payload_len);
+  void (* notify_subscribers)(resource_t *resource, uint16_t counter, void *notification);
 
   /** The handler for resource subscriptions. */
   restful_post_handler subscription_handler;
@@ -222,32 +247,6 @@ struct rest_implementation {
  */
 extern const struct rest_implementation REST;
 
-/*
- * Data structure representing a resource in REST.
- */
-struct resource_s {
-  struct resource_s *next; /* for LIST, points to next resource defined */
-  rest_resource_flags_t flags; /* handled RESTful methods */
-  const char* url; /*handled URL*/
-  const char* attributes; /* link-format attributes */
-  restful_handler handler; /* handler function */
-  restful_pre_handler pre_handler; /* to be called before handler, may perform initializations */
-  restful_post_handler post_handler; /* to be called after handler, may perform finalizations (cleanup, etc) */
-  void* user_data; /* pointer to user specific data */
-  unsigned int benchmark; /* to benchmark resource handler, used for separate response */
-};
-typedef struct resource_s resource_t;
-
-struct periodic_resource_s {
-  struct periodic_resource_s *next; /* for LIST, points to next resource defined */
-  resource_t *resource;
-  uint32_t period;
-  struct etimer periodic_timer;
-  restful_periodic_handler periodic_handler;
-};
-typedef struct periodic_resource_s periodic_resource_t;
-
-
 /*
  * Macro to define a Resource
  * Resources are statically defined for the sake of efficiency and better memory management.
@@ -260,7 +259,7 @@ resource_t resource_##name = {NULL, flags, url, attributes, name##_handler, NULL
  * Macro to define a sub-resource
  * Make sure to define its parent resource beforehand and set 'parent' to that name.
  */
-#define SUB_RESOURCE(name, flags, url, attributes, parent)		\
+#define SUB_RESOURCE(name, flags, url, attributes, parent) \
 resource_t resource_##name = {NULL, flags, url, attributes, parent##_handler, NULL, NULL, NULL}
 
 /*
@@ -270,8 +269,8 @@ resource_t resource_##name = {NULL, flags, url, attributes, parent##_handler, NU
  */
 #define EVENT_RESOURCE(name, flags, url, attributes) \
 void name##_handler(void *, void *, uint8_t *, uint16_t, int32_t *); \
-resource_t resource_##name = {NULL, flags, url, attributes, name##_handler, NULL, NULL, NULL}; \
-int name##_event_handler(resource_t*)
+void name##_event_handler(resource_t*); \
+resource_t resource_##name = {NULL, flags, url, attributes, name##_handler, NULL, NULL, NULL}
 
 /*
  * Macro to define a periodic resource
@@ -282,7 +281,7 @@ int name##_event_handler(resource_t*)
 #define PERIODIC_RESOURCE(name, flags, url, attributes, period) \
 void name##_handler(void *, void *, uint8_t *, uint16_t, int32_t *); \
 resource_t resource_##name = {NULL, flags, url, attributes, name##_handler, NULL, NULL, NULL}; \
-int name##_periodic_handler(resource_t*); \
+void name##_periodic_handler(resource_t*); \
 periodic_resource_t periodic_resource_##name = {NULL, &resource_##name, period, {{0}}, name##_periodic_handler}
 
 
diff --git a/core/net/rime/broadcast-announcement.c b/core/net/rime/broadcast-announcement.c
index fab26ce36..d7540a5a2 100644
--- a/core/net/rime/broadcast-announcement.c
+++ b/core/net/rime/broadcast-announcement.c
@@ -56,7 +56,6 @@
 #endif
 
 #include <string.h>
-#include <stdio.h>
 #include <stddef.h>
 
 struct announcement_data {
@@ -131,32 +130,31 @@ static void
 adv_packet_received(struct broadcast_conn *ibc, const rimeaddr_t *from)
 {
   struct announcement_msg adata;
+  struct announcement_data data;
+  uint8_t *ptr;
   int i;
 
+  ptr = packetbuf_dataptr();
+
   /* Copy number of announcements */
-  memcpy(&adata, packetbuf_dataptr(), sizeof(struct announcement_msg));
+  memcpy(&adata, ptr, sizeof(struct announcement_msg));
   PRINTF("%d.%d: adv_packet_received from %d.%d with %d announcements\n",
 	 rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1],
 	 from->u8[0], from->u8[1], adata.num);
 
-  if(adata.num / sizeof(struct announcement_data) > sizeof(struct announcement_msg)) {
+  if(ANNOUNCEMENT_MSG_HEADERLEN + adata.num * sizeof(struct announcement_data) > packetbuf_datalen()) {
     /* The number of announcements is too large - corrupt packet has
        been received. */
-    printf("adata.num way out there: %d\n", adata.num);
+    PRINTF("adata.num way out there: %d\n", adata.num);
     return;
   }
-  
-  for(i = 0; i < adata.num; ++i) {
-    struct announcement_data data;
 
+  ptr += ANNOUNCEMENT_MSG_HEADERLEN;
+  for(i = 0; i < adata.num; ++i) {
     /* Copy announcements */
-    memcpy(&data.id, &((struct announcement_msg *)packetbuf_dataptr())->data[i].id,
-          sizeof(uint16_t));
-    memcpy(&data.value, &((struct announcement_msg *)packetbuf_dataptr())->data[i].value,
-          sizeof(uint16_t));
-    announcement_heard(from,
-		       data.id,
-		       data.value);
+    memcpy(&data, ptr, sizeof(struct announcement_data));
+    announcement_heard(from, data.id, data.value);
+    ptr += sizeof(struct announcement_data);
   }
 }
 /*---------------------------------------------------------------------------*/
diff --git a/core/net/rime/collect.c b/core/net/rime/collect.c
index a73059cac..7047d8df2 100644
--- a/core/net/rime/collect.c
+++ b/core/net/rime/collect.c
@@ -758,8 +758,7 @@ send_next_packet(struct collect_conn *tc)
 static void
 handle_ack(struct collect_conn *tc)
 {
-  struct ack_msg *msg;
-  uint16_t rtmetric;
+  struct ack_msg msg;
   struct collect_neighbor *n;
 
   PRINTF("handle_ack: sender %d.%d current_parent %d.%d, id %d seqno %d\n",
@@ -778,8 +777,7 @@ handle_ack(struct collect_conn *tc)
            (int)(((100 * (clock_time() - tc->send_time)) / CLOCK_SECOND) % 100));*/
     
     stats.ackrecv++;
-    msg = packetbuf_dataptr();
-    memcpy(&rtmetric, &msg->rtmetric, sizeof(uint16_t));
+    memcpy(&msg, packetbuf_dataptr(), sizeof(struct ack_msg));
 
     /* It is possible that we receive an ACK for a packet that we
        think we have not yet sent: if our transmission was received by
@@ -797,7 +795,7 @@ handle_ack(struct collect_conn *tc)
 
     if(n != NULL) {
       collect_neighbor_tx(n, tc->transmissions);
-      collect_neighbor_update_rtmetric(n, rtmetric);
+      collect_neighbor_update_rtmetric(n, msg.rtmetric);
       update_rtmetric(tc);
     }
 
@@ -805,8 +803,8 @@ handle_ack(struct collect_conn *tc)
            rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1],
            tc->current_parent.u8[0], tc->current_parent.u8[1],
            tc->transmissions,
-           msg->flags,
-           rtmetric);
+           msg.flags,
+           msg.rtmetric);
 
     /* The ack contains information about the state of the packet and
        of the node that received it. We do different things depending
@@ -814,20 +812,20 @@ handle_ack(struct collect_conn *tc)
        the receiving node was congested. If so, we add a maximum
        transmission number to its routing metric, which increases the
        chance that another parent will be chosen. */
-    if(msg->flags & ACK_FLAGS_CONGESTED) {
+    if(msg.flags & ACK_FLAGS_CONGESTED) {
       PRINTF("ACK flag indicated parent was congested.\n");
       collect_neighbor_set_congested(n);
       collect_neighbor_tx(n, tc->max_rexmits * 2);
       update_rtmetric(tc);
     }
-    if((msg->flags & ACK_FLAGS_DROPPED) == 0) {
+    if((msg.flags & ACK_FLAGS_DROPPED) == 0) {
       /* If the packet was successfully received, we send the next packet. */
       send_next_packet(tc);
     } else {
       /* If the packet was lost due to its lifetime being exceeded,
          there is not much more we can do with the packet, so we send
          the next one instead. */
-      if((msg->flags & ACK_FLAGS_LIFETIME_EXCEEDED)) {
+      if((msg.flags & ACK_FLAGS_LIFETIME_EXCEEDED)) {
         send_next_packet(tc);
       } else {
         /* If the packet was dropped, but without the node being
@@ -845,7 +843,7 @@ handle_ack(struct collect_conn *tc)
 
     /* Our neighbor's rtmetric needs to be updated, so we bump our
        advertisements. */
-    if(msg->flags & ACK_FLAGS_RTMETRIC_NEEDS_UPDATE) {
+    if(msg.flags & ACK_FLAGS_RTMETRIC_NEEDS_UPDATE) {
       bump_advertisement(tc);
     }
     set_keepalive_timer(tc);
diff --git a/core/net/rime/neighbor-discovery.c b/core/net/rime/neighbor-discovery.c
index f9691b1d8..4b60e51ef 100644
--- a/core/net/rime/neighbor-discovery.c
+++ b/core/net/rime/neighbor-discovery.c
@@ -96,23 +96,22 @@ static void
 adv_packet_received(struct broadcast_conn *ibc, const rimeaddr_t *from)
 {
   struct neighbor_discovery_conn *c = (struct neighbor_discovery_conn *)ibc;
-  struct adv_msg *msg = packetbuf_dataptr();
-  uint16_t val;
+  struct adv_msg msg;
 
-  memcpy(&val, &msg->val, sizeof(val));
+  memcpy(&msg, packetbuf_dataptr(), sizeof(struct adv_msg));
 
   PRINTF("%d.%d: adv_packet_received from %d.%d with val %d\n",
 	 rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1],
-	 from->u8[0], from->u8[1], val);
+	 from->u8[0], from->u8[1], msg.val);
   
   /* If we receive an announcement with a lower value than ours, we
      cancel our own announcement. */
-  if(val < c->val) {
+  if(msg.val < c->val) {
     /*    ctimer_stop(&c->send_timer);*/
   }
 
   if(c->u->recv) {
-    c->u->recv(c, from, val);
+    c->u->recv(c, from, msg.val);
   }
 }
 /*---------------------------------------------------------------------------*/
diff --git a/core/net/rime/polite-announcement.c b/core/net/rime/polite-announcement.c
index 2a6e7ae7e..f7a7b5241 100644
--- a/core/net/rime/polite-announcement.c
+++ b/core/net/rime/polite-announcement.c
@@ -125,25 +125,31 @@ static void
 adv_packet_received(struct ipolite_conn *ipolite, const rimeaddr_t *from)
 {
   struct announcement_msg adata;
+  struct announcement_data data;
+  uint8_t *ptr;
   int i;
 
+  ptr = packetbuf_dataptr();
+
   /* Copy number of announcements */
-  memcpy(&adata, packetbuf_dataptr(), sizeof(struct announcement_msg));
+  memcpy(&adata, ptr, sizeof(struct announcement_msg));
   PRINTF("%d.%d: adv_packet_received from %d.%d with %d announcements\n",
 	 rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1],
 	 from->u8[0], from->u8[1], adata.num);
 
-  for(i = 0; i < adata.num; ++i) {
-    struct announcement_data data;
+  if(ANNOUNCEMENT_MSG_HEADERLEN + adata.num * sizeof(struct announcement_data) > packetbuf_datalen()) {
+    /* The number of announcements is too large - corrupt packet has
+       been received. */
+    PRINTF("adata.num way out there: %d\n", adata.num);
+    return;
+  }
 
+  ptr += ANNOUNCEMENT_MSG_HEADERLEN;
+  for(i = 0; i < adata.num; ++i) {
     /* Copy announcements */
-    memcpy(&data.id, &((struct announcement_msg *)packetbuf_dataptr())->data[i].id,
-          sizeof(uint16_t));
-    memcpy(&data.value, &((struct announcement_msg *)packetbuf_dataptr())->data[i].value,
-          sizeof(uint16_t));
-    announcement_heard(from,
-		       data.id,
-		       data.value);
+    memcpy(&data, ptr, sizeof(struct announcement_data));
+    announcement_heard(from, data.id, data.value);
+    ptr += sizeof(struct announcement_data);
   }
 }
 /*---------------------------------------------------------------------------*/
diff --git a/cpu/cc2430/8051def.h b/cpu/cc2430/8051def.h
index 069a42c79..3201cba6e 100644
--- a/cpu/cc2430/8051def.h
+++ b/cpu/cc2430/8051def.h
@@ -40,16 +40,13 @@
 #define CC_CONF_FUNCTION_POINTER_KEYWORD __reentrant
 
 /* Generic types. */
-typedef unsigned char   u8_t;      /* 8 bit type */
-typedef unsigned short u16_t;      /* 16 bit type */
-typedef unsigned long  u32_t;      /* 32 bit type */
-typedef   signed long  s32_t;      /* 32 bit type */
 typedef unsigned short uip_stats_t;
 
-
 /* Time type. */
 typedef unsigned short clock_time_t;
 #define MAX_TICKS (~((clock_time_t)0) / 2)
+/* Defines tick counts for a second. */
+#define CLOCK_CONF_SECOND   128
 
 /* Compiler configurations */
 #define CCIF
@@ -80,8 +77,8 @@ typedef unsigned short clock_time_t;
 	__endasm; 		\
 }
 
-/* Macro for a soft reset. In many respects better than H/W reboot via W/D */
-#define SOFT_RESET() {((void (__code *) (void)) 0x0000) ();}
+/* Macro for a soft reset. */
+#define SOFT_RESET() do {((void (__code *) (void)) 0x0000) ();} while(0)
 
 /* We don't provide architecture-specific checksum calculations */
 #define UIP_ARCH_ADD32		0
diff --git a/cpu/cc2430/converter/Makefile b/cpu/cc2430/converter/Makefile
deleted file mode 100644
index 7d58f8eeb..000000000
--- a/cpu/cc2430/converter/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-EXE_MAKE=$(notdir $(shell which "make.exe" 2>/dev/null))
-ifeq "$(EXE_MAKE)" "make.exe"
-PLATFORM=windows
-else
-PLATFORM=linux
-endif
-
-OBJECTS = ihex.o converter.o
-SUBDIRS = 
-
-CFLAGS	= -Wall -D_REENTRANT -I.
-LDFLAGS = -L. -D_REENTRANT -lpthread
-ifeq "$(PLATFORM)" "linux"
-SUFFIX=
-else
-SUFFIX=.exe
-endif
-
-TARGET  = converter$(SUFFIX)
-
-all: binary
-
-binary: $(TARGET)
-	strip $(TARGET)
-
-$(TARGET): $(OBJECTS)
-	gcc -o $(TARGET) $(OBJECTS) $(LDFLAGS)
-	
-.c.o:
-	gcc -c -o $(<:.c=.o) -O2 -Wall $(CFLAGS) $<
-
-platform-test:
-	@echo $(PLATFORM)
-	
-old-strip:
-	if [ -x $(TARGET).exe ]; then $(PLATFORM)strip $(TARGET).exe; else $(PLATFORM)strip $(TARGET); fi
-	
-clean:
-	rm -f $(TARGET) $(OBJECTS)
diff --git a/cpu/cc2430/converter/converter.c b/cpu/cc2430/converter/converter.c
deleted file mode 100644
index 56d12ecc9..000000000
--- a/cpu/cc2430/converter/converter.c
+++ /dev/null
@@ -1,227 +0,0 @@
-#include <unistd.h>
-#include <getopt.h>
-#include <string.h>
-#include <inttypes.h>
-
-#include "converter.h"
-
-#include <stdio.h>
-
-extern int cdi_programmer(conf_opts_t *conf, char *filename);
-
-void usage(char *prg_name)
-{
-	printf("\nUsage: %s -f ihex file\n", prg_name);
-	printf("General options:\n");
-	printf("	-v/--version	Get converter version\n");
-}
-
-conf_opts_t conf_opts;
-
-static int option_index = 0;
-
-int do_exit = 0;
-
-#define OPTIONS_STRING "vhf:"
-/* long option list */
-static struct option long_options[] =
-{
-  {"version", 0, NULL, 'v'},
-  {"file", 1, NULL, 'f'},
-  {"help", 0, NULL, 'h'},
-  {0, 0, 0, 0}
-};
-
-int parse_opts(int count, char* param[])
-{
-	int opt;
-	int error=0;
-	
-	conf_opts.target_type = UNDEFINED;
-  while ((opt = getopt_long(count, param, OPTIONS_STRING,
-                            long_options, &option_index)) != -1)
-  {
-    switch(opt)
-		{
-			case 'v':
-				conf_opts.target_type = VERSION;
-				break;
-
-			case 'h':
-				conf_opts.target_type = UNDEFINED;
-				break;
-
-   		case 'f':
-				strcpy(conf_opts.ihex_file, optarg);
-				conf_opts.target_type = CONVERT;
-				break;
-		}
-	}
-
-	if (!error && (conf_opts.target_type == CONVERT) )
-	{
- 		printf("File: %s.\n", conf_opts.ihex_file);
-	}
-	
-	return error;
-}
-
-int main(int argc, char *argv[])
-{
-	int error = 0;
-	
-	conf_opts.target_type = 0;
-		
-
-  printf("Sensinode hex file converter "CONVERTER_VERSION "\n");
-	if ( (argc < 1) || (error = parse_opts(argc, argv)) )
-	{
-		usage(argv[0]);
-		if (error < 0) return error;
-		else return 0;
-	}
-	
-	if(conf_opts.target_type == CONVERT)
-	{	/*Convert*/
-		int pages;
-		int sdcc_file = 0;
-		
-		FILE *ihex = 0;	
-		unsigned char check = 0;
-		unsigned long ext_addr=0;
-		unsigned short int addr=0;
-		unsigned char page_buffer[128*1024];
-		unsigned char page_table[64];
-		unsigned char buffer[256];
-		int i;
-		int retval = 0;
-		
-		bzero(buffer, sizeof(buffer));
-
-		/*initialize page data*/
-		memset(page_table, 0, 64);
-		memset(page_buffer, 0xFF, sizeof(page_buffer));
-		pages = 0;
-		
-		ihex = fopen(conf_opts.ihex_file, "rb");
-		if (ihex == 0)
-		{
-			printf("Can't open file.\n");
-			return -1;
-		}
-		error = 0;
-		while((!error) && ((retval = fscanf(ihex, "%s", buffer)) == 1) )
-		{	
-			unsigned char data_len = 0;
-			
-			if (memcmp(&buffer[7], "00", 2) == 0)
-			{	/*Data record*/
-				i=0;
-				sscanf((char *)&buffer[1], "%2hhx", &data_len);
-				sscanf((char *)&(buffer[3]),"%4hx", &addr);
-				while(i<data_len)
-				{
-					uint32_t absolute_address = ext_addr+addr+i;
-
-					if (page_table[absolute_address/2048] == 0) 
-					{
-						page_table[absolute_address/2048] = 1;
-						pages++;
-					}
-					sscanf((char *)&buffer[2*i+9], "%2hhx", &page_buffer[absolute_address]);
-					i++;
-				}
-			}
-			else if (memcmp(&buffer[7], "01", 2) == 0)
-			{	/*end file*/
-				printf("File read complete.\n");
-				break;
-			}
-			else if (memcmp(&buffer[7], "04", 2) == 0)
-			{
-				sscanf((char *)&(buffer[3]),"%4hx", &addr);
-				sscanf((char *)&(buffer[9]),"%4lx", &ext_addr);
-				/*printf("Extended page address: 0x%8.8lX\n", ext_addr*0x8000 );*/
-				
-				if (ext_addr >= 0x0002) sdcc_file = 1;
-				
-				if (ext_addr) ext_addr--;
-				ext_addr *= 0x8000;
-			}
-		}
-		fclose(ihex);
-		if (retval == -1)
-		{
-			printf("Read error\n");
-		}
-		if (sdcc_file == 0)
-		{
-			printf("Not a SDCC banked file.\n");
-			return 0;
-		}
-		printf("Writing %d pages.\n", pages);
-		{	/*cut off extension*/
-			char *ptr = strrchr(conf_opts.ihex_file, '.');
-			if (ptr != NULL)
-			{
-				*ptr = 0;
-			}
-		}
-		strcat(conf_opts.ihex_file, ".hex");
- 		printf("Output file: %s.\n", conf_opts.ihex_file);
-		ihex = fopen(conf_opts.ihex_file, "wb");
-		ext_addr=0;
-		addr = 0;
-		if (pages)
-		{
-			int j;
-			error = 0;
-			for (i=0; i<64; i++)
-			{
-				addr = (i & 0x1F) * 2048;
-				if ( ((i / 32) * 0x10000) != ext_addr)
-				{	/*write out ext addr*/
-					/*printf("Ext: %4.4X\n", ((i / 32) * 0x10000));*/
-					ext_addr = (i / 32) * 0x10000;
-					fprintf(ihex, ":02000004%4.4X%2.2X\r\n", 
-									         (int)(ext_addr>>16), (int)(0xFA-(ext_addr>>16)));
-				}
-								
-				if (page_table[i] != 0)
-				{
-					/*printf("%4.4X", addr & 0xF800);*/
-					for (j=0; j<2048; j++)
-					{
-						addr =(i & 0x1F) * 2048 + j;
-						if ((j & 0x1F) == 0)
-						{
-							check = 0;
-							check -= 0x20;
-							check -= (uint8_t) (addr >> 8);
-							check -= (uint8_t) (addr);
-							fprintf(ihex, ":20%4.4X00", (int) addr);
-						}
-						fprintf(ihex, "%2.2X", page_buffer[ext_addr+addr]);
-						check -= page_buffer[ext_addr+addr];
-						if ((j & 0x1F) == 0x1F)
-						{
-								fprintf(ihex, "%2.2X\r\n", check);								
-						}
-					}
-				}
-				/*
-				if ((i & 0x07) == 0x07) printf("\n");
-				else printf(" ");
-				*/
-			}
-			fprintf(ihex, ":00000001FF\r\n");
-			printf("Write complete.\n");
-		}
-		fclose(ihex);
-	}
-	else if(conf_opts.target_type == UNDEFINED)
-	{
-		usage(argv[0]);
-	}
-	return error;
-}
diff --git a/cpu/cc2430/converter/converter.h b/cpu/cc2430/converter/converter.h
deleted file mode 100644
index cde769b72..000000000
--- a/cpu/cc2430/converter/converter.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef CONVERTER_H
-#define CONVERTER_H
-
-#define CONVERTER_VERSION "v1.4"
-
-typedef struct {
-	int target_type;
-	char ihex_file[128];
-}conf_opts_t;
-
-enum target { UNDEFINED, VERSION, CONVERT };
-
-#endif
diff --git a/cpu/cc2430/converter/ihex.c b/cpu/cc2430/converter/ihex.c
deleted file mode 100644
index fbed240b2..000000000
--- a/cpu/cc2430/converter/ihex.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <unistd.h>
-#include <strings.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <inttypes.h>
-
-int hexfile_parse(char *line, unsigned int *type, unsigned int *addr, unsigned char *buffer)
-{
-	unsigned int row_len = 0;
-	unsigned int row_index = 7;
-	unsigned int i;
-	int tmp;
-	
-	uint8_t cksum = 0;
-	int retval = 0;
-	
-	retval = sscanf(line, ":%2x%4x%2x", &row_len, addr, type);
-	
-	cksum += row_len;
-	cksum += *addr >> 8;
-	cksum += *addr & 0xFF;
-	cksum += *type;
-	
-	i = 0;
-	if (retval == 3)
-	{
-		while(i < row_len)
-		{
-			
-			if (sscanf(&line[row_index], "%2x", &tmp) == 1)
-			{
-				cksum += tmp;
-				buffer[i++] = (unsigned char) tmp;
-				row_index += 2;
-			}
-			else return -1;
-		}
-		if (sscanf(&line[row_index], "%2x", &tmp) == 1)
-		{
-			if ((cksum + (uint8_t) tmp) == 0) return row_len;
-		}
-	}
-	return -1;
-}
-
-int hexfile_out(char *line, unsigned int type, unsigned int address, unsigned char *data, unsigned int bytes)
-{
-	uint8_t cksum = 0;
-	uint8_t i = 0;
-	char tmp[8];
-	
-	sprintf(line, ":%2.2X%4.4X%2.2X", bytes, address, type);	
-	cksum -= bytes;
-	cksum -= address >> 8;
-	cksum -= address & 0xFF;
-	cksum -= type;
-
-	for (i=0; i<bytes; i++)
-	{
-		sprintf(tmp, "%2.2X", data[i]);
-		strcat(line, tmp);
-		cksum -= data[i];
-	}
-	sprintf(tmp, "%2.2X\r\n", cksum);
-	strcat(line, tmp);
-	
-	return strlen(line);
-}
-
diff --git a/cpu/cc2430/converter/ihex.h b/cpu/cc2430/converter/ihex.h
deleted file mode 100644
index 1d1a3a184..000000000
--- a/cpu/cc2430/converter/ihex.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _IHEX_H
-#define _IHEX_H
-
-extern int hexfile_parse(char *line, unsigned char *type, unsigned int *addr, char *buffer);
-extern int hexfile_out(char *line, unsigned int type, unsigned int address, unsigned char *data, unsigned int bytes);
-
-#endif /*_IHEX_H*/
diff --git a/cpu/cc2430/dev/bus.c b/cpu/cc2430/dev/bus.c
index 0274ce3d6..299cc677c 100644
--- a/cpu/cc2430/dev/bus.c
+++ b/cpu/cc2430/dev/bus.c
@@ -57,79 +57,3 @@ bus_init (void)
   clock_init();
 }
 /*---------------------------------------------------------------------------*/
-/**
- * Read a block of code memory.
- * The code must be placed in the lowest bank of flash.
- *
- * \param address address to read from flash
- * \param buffer  buffer to store data
- * \param size    number of bytes to read
- */
-#if !SHORTCUTS_CONF_FLASH_READ
-void
-flash_read(uint8_t *buf, uint32_t address, uint8_t size)
-{
-  buf;	 	/*dptr0*/
-  address; 	/*stack-6*/
-  size;		/*stack-7*/
-	
-  buf;
-  
-  DISABLE_INTERRUPTS();
-  __asm
-			mov dpl, r2
-			mov dph, r3
-			mov a, r0
-			push acc
-			mov a, r2
-			push acc
-			mov a, _MEMCTR
-			push acc
-
-			mov a, _bp
-			add a, #0xf9 		;stack - 7 = size
-			mov r0,a
-			mov a, @r0  		;r2 = size
-			mov r2, a   		;r2 = size
-
-			inc r0
-			mov a, @r0
-			mov _DPL1, a		;DPTR1 = address & 0x7FFF | 0x8000
-			inc r0
-			mov a, @r0
-			orl a, #0x80
-			mov _DPH1, a
-			inc r0					;MEMCTR = ((address >> 15 & 3) << 4) | 0x01 (bank select)
-			mov a, @r0
-			dec r0
-			rrc a
-			mov a, @r0
-			rrc a
-			rr a
-			rr a
-			anl a, #0x30
-			orl a, #1
-			mov _MEMCTR,a
-lp1:
-			mov _DPS, #1		;active DPTR = 1
-			clr a
-			movc a, @a+dptr			;read flash (DPTR1)
-			inc dptr
-			mov _DPS, #0 				;active DPTR = 0
-			movx @dptr,a				;write to DPTR0
-			inc dptr
-			djnz r2,lp1					;while (--size)
-
-			pop acc
-			mov _MEMCTR, a	;restore bank
-
-			pop acc
-			mov r2,a
-			pop acc
-			mov r0,a
-  __endasm;
-  ENABLE_INTERRUPTS();
-  DPL1 = *buf++;
-}
-#endif
-/*---------------------------------------------------------------------------*/
diff --git a/cpu/cc2430/dev/bus.h b/cpu/cc2430/dev/bus.h
index 6c20dac54..b6aec1671 100644
--- a/cpu/cc2430/dev/bus.h
+++ b/cpu/cc2430/dev/bus.h
@@ -49,9 +49,6 @@
 #define inline
 
 void bus_init(void);
-#if !SHORTCUTS_CONF_FLASH_READ
-void flash_read(uint8_t *buf, uint32_t address, uint8_t size);
-#endif
 void clock_ISR( void ) __interrupt (ST_VECTOR);
 
 #endif /* __BUS_H__ */
diff --git a/cpu/cc2430/dev/cc2430_rf.c b/cpu/cc2430/dev/cc2430_rf.c
index 934bb7a23..835365afe 100644
--- a/cpu/cc2430/dev/cc2430_rf.c
+++ b/cpu/cc2430/dev/cc2430_rf.c
@@ -98,7 +98,7 @@ uint8_t rf_error = 0;
 #endif
 
 /*---------------------------------------------------------------------------*/
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
 PROCESS(cc2430_rf_process, "CC2430 RF driver");
 #endif
 /*---------------------------------------------------------------------------*/
@@ -152,7 +152,7 @@ flush_rx()
   cc2430_rf_command(ISFLUSHRX);
   cc2430_rf_command(ISFLUSHRX);
 
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
   IEN2 |= RFIE;
 #endif
 #if CC2430_RFERR_INTERRUPT
@@ -338,7 +338,7 @@ init(void)
   RFIF &= ~(IRQ_FIFOP);
 
   S1CON &= ~(RFIF_0 | RFIF_1);
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
   IEN2 |= RFIE;
 #endif
 
@@ -351,7 +351,7 @@ init(void)
   RF_RX_LED_OFF();
   rf_initialized = 1;
 
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
   process_start(&cc2430_rf_process, NULL);
 #endif
 
@@ -476,7 +476,7 @@ read(void *buf, unsigned short bufsize)
 #endif /* CC2420_CONF_CHECKSUM */
 
   /* Don't interrupt us while emptying the FIFO */
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
   IEN2 &= ~RFIE;
 #endif
 #if CC2430_RFERR_INTERRUPT
@@ -576,7 +576,7 @@ read(void *buf, unsigned short bufsize)
 
   RF_RX_LED_OFF();
 
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
   IEN2 |= RFIE;
 #endif
 #if CC2430_RFERR_INTERRUPT
@@ -688,7 +688,7 @@ const struct radio_driver cc2430_rf_driver =
     off,
 };
 /*---------------------------------------------------------------------------*/
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
 /*---------------------------------------------------------------------------*/
 PROCESS_THREAD(cc2430_rf_process, ev, data)
 {
diff --git a/cpu/cc2430/dev/cc2430_rf.h b/cpu/cc2430/dev/cc2430_rf.h
index f64129e09..eecb26ead 100644
--- a/cpu/cc2430/dev/cc2430_rf.h
+++ b/cpu/cc2430/dev/cc2430_rf.h
@@ -77,7 +77,7 @@ int8_t cc2430_rf_channel_set(uint8_t channel);
 uint8_t cc2430_rf_power_set(uint8_t new_power);
 void cc2430_rf_set_addr(unsigned pan, unsigned addr, const uint8_t *ieee_addr);
 
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
 extern void cc2430_rf_ISR( void ) __interrupt (RF_VECTOR);
 #endif
 #if CC2430_RFERR_INTERRUPT
diff --git a/cpu/cc2430/dev/cc2430_rf_intr.c b/cpu/cc2430/dev/cc2430_rf_intr.c
index 296024115..510c93f1a 100644
--- a/cpu/cc2430/dev/cc2430_rf_intr.c
+++ b/cpu/cc2430/dev/cc2430_rf_intr.c
@@ -50,7 +50,7 @@ uint8_t rf_error = 0;
 
 PROCESS_NAME(cc2430_rf_process);
 
-#if !SHORTCUTS_CONF_NETSTACK
+#if !NETSTACK_CONF_SHORTCUTS
 /*---------------------------------------------------------------------------*/
 /**
  * RF interrupt service routine.
diff --git a/cpu/cc253x/8051def.h b/cpu/cc253x/8051def.h
index 7314edcd7..e19fd8d31 100644
--- a/cpu/cc253x/8051def.h
+++ b/cpu/cc253x/8051def.h
@@ -1,7 +1,7 @@
 /*
  * \file
  *	This file contains a set of configuration for using SDCC as a compiler.
- *	Modified from z80 port for cc2430 port.
+ *	This is based on the cc2430 file (which in turn is based on the z80 one)
  *
  * \author
  *	 Takahide Matsutsuka <markn@markn.org> (Original)
@@ -40,18 +40,20 @@
 #define CC_CONF_FUNCTION_POINTER_KEYWORD __reentrant
 
 /* Generic types. */
-typedef unsigned char   u8_t;      /* 8 bit type */
-typedef unsigned short u16_t;      /* 16 bit type */
-typedef unsigned long  u32_t;      /* 32 bit type */
-typedef   signed long  s32_t;      /* 32 bit type */
 typedef unsigned short uip_stats_t;
 
+/* Time type. */
+typedef unsigned short clock_time_t;
+#define MAX_TICKS (~((clock_time_t)0) / 2)
+/* Defines tick counts for a second. */
+#define CLOCK_CONF_SECOND   128
+
 /* Compiler configurations */
 #define CCIF
 #define CLIF
 
 /* Single asm instruction without messing up syntax highlighting */
-#if defined SDCC_mcs51
+#if defined(__SDCC_mcs51) || defined(SDCC_mcs51)
 #define ASM(x) __asm \
   x \
   __endasm
@@ -63,8 +65,8 @@ typedef unsigned short uip_stats_t;
 #define DISABLE_INTERRUPTS()  do {EA = 0;} while(0)
 #define ENABLE_INTERRUPTS()   do {EA = 1;} while(0)
 
-/* Macro for a soft reset. In many respects better than H/W reboot via W/D */
-#define SOFT_RESET() {((void (__code *) (void)) 0x0000) ();}
+/* Macro for a soft reset. */
+#define SOFT_RESET() do {((void (__code *) (void)) 0x0000) ();} while(0)
 
 /* We don't provide architecture-specific checksum calculations */
 #define UIP_ARCH_ADD32    0
diff --git a/examples/cc2530dk/udp-ipv6/ping6.c b/examples/cc2530dk/udp-ipv6/ping6.c
index f4cc073ab..bab5db911 100644
--- a/examples/cc2530dk/udp-ipv6/ping6.c
+++ b/examples/cc2530dk/udp-ipv6/ping6.c
@@ -36,16 +36,8 @@
 #include "dev/button-sensor.h"
 #include "debug.h"
 
-#define DEBUG 1
-#if DEBUG
-#include <stdio.h>
-#define PRINTF(...) printf(__VA_ARGS__)
-#define PRINT6ADDR(addr) PRINTF(" %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x ", ((u8_t *)addr)[0], ((u8_t *)addr)[1], ((u8_t *)addr)[2], ((u8_t *)addr)[3], ((u8_t *)addr)[4], ((u8_t *)addr)[5], ((u8_t *)addr)[6], ((u8_t *)addr)[7], ((u8_t *)addr)[8], ((u8_t *)addr)[9], ((u8_t *)addr)[10], ((u8_t *)addr)[11], ((u8_t *)addr)[12], ((u8_t *)addr)[13], ((u8_t *)addr)[14], ((u8_t *)addr)[15])
-#define PRINTLLADDR(lladdr) PRINTF(" %02x:%02x:%02x:%02x:%02x:%02x ",lladdr->addr[0], lladdr->addr[1], lladdr->addr[2], lladdr->addr[3],lladdr->addr[4], lladdr->addr[5])
-#else
-#define PRINTF(...)
-#define PRINT6ADDR(addr)
-#endif
+#define DEBUG DEBUG_PRINT
+#include "net/uip-debug.h"
 
 #define PING6_NB 5
 #define PING6_DATALEN 16
@@ -54,8 +46,7 @@
 #define UIP_ICMP_BUF            ((struct uip_icmp_hdr *)&uip_buf[uip_l2_l3_hdr_len])
 
 static struct etimer ping6_periodic_timer;
-static u8_t count = 0;
-static u16_t addr[8];
+static uint8_t count = 0;
 static uip_ipaddr_t dest_addr;
 
 PROCESS(ping6_process, "PING6 process");
@@ -82,16 +73,16 @@ ping6handler()
 
 
     uip_len = UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN + UIP_IPH_LEN + PING6_DATALEN;
-    UIP_IP_BUF->len[0] = (u8_t)((uip_len - 40) >> 8);
-    UIP_IP_BUF->len[1] = (u8_t)((uip_len - 40) & 0x00FF);
+    UIP_IP_BUF->len[0] = (uint8_t)((uip_len - 40) >> 8);
+    UIP_IP_BUF->len[1] = (uint8_t)((uip_len - 40) & 0x00FF);
 
     UIP_ICMP_BUF->icmpchksum = 0;
     UIP_ICMP_BUF->icmpchksum = ~uip_icmp6chksum();
 
 
-    PRINTF("Echo Request to");
+    PRINTF("Echo Request to ");
     PRINT6ADDR(&UIP_IP_BUF->destipaddr);
-    PRINTF("from");
+    PRINTF(" from ");
     PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
     PRINTF("\n");
     UIP_STAT(++uip_stat.icmp.sent);
diff --git a/examples/cc2530dk/udp-ipv6/server.c b/examples/cc2530dk/udp-ipv6/server.c
index 2d9ff70b7..524fc9cf6 100644
--- a/examples/cc2530dk/udp-ipv6/server.c
+++ b/examples/cc2530dk/udp-ipv6/server.c
@@ -70,7 +70,7 @@ tcpip_handler(void)
     leds_on(LEDS_RED);
     len = uip_datalen();
     memcpy(buf, uip_appdata, len);
-    PRINTF("%u bytes from [", len, *(uint16_t *)buf);
+    PRINTF("%u bytes from [", len);
     PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
     PRINTF("]:%u\n", UIP_HTONS(UIP_UDP_BUF->srcport));
 #if SERVER_REPLY
diff --git a/examples/er-rest-example/Makefile b/examples/er-rest-example/Makefile
index 1cdae1b5e..979e9f477 100644
--- a/examples/er-rest-example/Makefile
+++ b/examples/er-rest-example/Makefile
@@ -5,8 +5,10 @@ CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
 
 # for static routing, if enabled
 ifneq ($(TARGET), minimal-net)
+ifneq ($(TARGET), native)
 PROJECT_SOURCEFILES += static-routing.c
 endif
+endif
 
 # variable for root Makefile.include
 WITH_UIP6=1
@@ -37,13 +39,11 @@ ifeq ($(WITH_COAP), 7)
 ${info INFO: compiling with CoAP-07}
 CFLAGS += -DWITH_COAP=7
 CFLAGS += -DREST=coap_rest_implementation
-CFLAGS += -DUIP_CONF_TCP=0
 APPS += er-coap-07
 else ifeq ($(WITH_COAP), 3)
 ${info INFO: compiling with CoAP-03}
 CFLAGS += -DWITH_COAP=3
 CFLAGS += -DREST=coap_rest_implementation
-CFLAGS += -DUIP_CONF_TCP=0
 APPS += er-coap-03
 else
 ${info INFO: compiling with HTTP}
diff --git a/examples/er-rest-example/plugtest-server.c b/examples/er-rest-example/plugtest-server.c
index 2994cb6f7..051b44be0 100644
--- a/examples/er-rest-example/plugtest-server.c
+++ b/examples/er-rest-example/plugtest-server.c
@@ -207,10 +207,8 @@ separate_handler(void* request, void* response, uint8_t *buffer, uint16_t prefer
   PRINTF("/separate       ");
   if (separate_active)
   {
-    PRINTF("BUSY ");
-    REST.set_response_status(response, REST.status.SERVICE_UNAVAILABLE);
-    const char *msg = "AlreadyInUse";
-    REST.set_response_payload(response, msg, strlen(msg));
+    PRINTF("REJECTED ");
+    coap_separate_reject();
   }
   else
   {
@@ -218,7 +216,7 @@ separate_handler(void* request, void* response, uint8_t *buffer, uint16_t prefer
     separate_active = 1;
 
     /* Take over and skip response by engine. */
-    coap_separate_yield(request, &separate_store->request_metadata);
+    coap_separate_accept(request, &separate_store->request_metadata);
     /* Be aware to respect the Block2 option, which is also stored in the coap_separate_t. */
 
     snprintf(separate_store->buffer, MAX_PLUGFEST_PAYLOAD, "Type: %u\nCode: %u\nMID: %u", coap_req->type, coap_req->code, coap_req->mid);
@@ -227,7 +225,7 @@ separate_handler(void* request, void* response, uint8_t *buffer, uint16_t prefer
   PRINTF("(%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid);
 }
 
-int
+void
 separate_periodic_handler(resource_t *resource)
 {
   if (separate_active)
@@ -258,14 +256,10 @@ separate_periodic_handler(resource_t *resource)
       /* The engine will clear the transaction (right after send for NON, after acked for CON). */
 
       separate_active = 0;
-
-      return 1;
     } else {
       PRINTF("ERROR (transaction)\n");
     }
   } /* if (separate_active) */
-
-  return 0;
 }
 #endif
 
@@ -366,7 +360,7 @@ large_update_handler(void* request, void* response, uint8_t *buffer, uint16_t pr
       *offset = -1;
     }
   } else {
-    const uint8_t *incoming = NULL;
+    uint8_t *incoming = NULL;
     size_t len = 0;
 
     unsigned int ct = REST.get_header_content_type(request);
@@ -417,9 +411,8 @@ void
 large_create_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
 {
   coap_packet_t *const coap_req = (coap_packet_t *) request;
-  uint8_t method = REST.get_method_type(request);
 
-  const uint8_t *incoming = NULL;
+  uint8_t *incoming = NULL;
   size_t len = 0;
 
   unsigned int ct = REST.get_header_content_type(request);
@@ -463,7 +456,7 @@ large_create_handler(void* request, void* response, uint8_t *buffer, uint16_t pr
  */
 PERIODIC_RESOURCE(obs, METHOD_GET, "obs", "title=\"Observable resource which changes every 5 seconds\";obs;rt=\"observe\"", 5*CLOCK_SECOND);
 
-static uint32_t obs_counter = 0;
+static uint16_t obs_counter = 0;
 static char obs_content[16];
 
 void
@@ -472,7 +465,7 @@ obs_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s
   REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
   REST.set_header_max_age(response, 5);
 
-  REST.set_response_payload(response, buffer, snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "TICK %lu", obs_counter));
+  REST.set_response_payload(response, obs_content, snprintf(obs_content, MAX_PLUGFEST_PAYLOAD, "TICK %lu", obs_counter));
 
   /* A post_handler that handles subscriptions will be called for periodic resources by the REST framework. */
 }
@@ -481,18 +474,23 @@ obs_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s
  * Additionally, a handler function named [resource name]_handler must be implemented for each PERIODIC_RESOURCE.
  * It will be called by the REST manager process with the defined period.
  */
-int
+void
 obs_periodic_handler(resource_t *r)
 {
+  ++obs_counter;
 
-  PRINTF("TICK /%s\n", r->url);
-  obs_counter = obs_counter + 1;
+  PRINTF("TICK %u for /%s\n", obs_counter, r->url);
+
+  /* Build notification. */
+  /*TODO: REST.new_response() */
+  coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
+  coap_init_message(notification, COAP_TYPE_NON, CONTENT_2_05, 0 );
+
+  /* Better use a generator function for both handlers that only takes *resonse. */
+  obs_handler(NULL, notification, NULL, 0, NULL);
 
   /* Notify the registered observers with the given message type, observe option, and payload. */
-  REST.notify_subscribers(r->url, 1, obs_counter, (uint8_t *)obs_content, snprintf(obs_content, sizeof(obs_content), "TICK %lu", obs_counter));
-  /*                              |-> implementation-specific, e.g. CoAP: 0=CON and 1=NON notification */
-
-  return 1;
+  REST.notify_subscribers(r, obs_counter, notification);
 }
 #endif
 
@@ -537,7 +535,6 @@ PROCESS_THREAD(plugtest_server, ev, data)
   rest_activate_resource(&resource_query);
 #endif
 #if REST_RES_SEPARATE
-  rest_set_pre_handler(&resource_separate, coap_separate_handler);
   rest_activate_periodic_resource(&periodic_resource_separate);
 #endif
 #if REST_RES_LARGE
diff --git a/examples/er-rest-example/rest-server-example.c b/examples/er-rest-example/rest-server-example.c
index f7f2e3b55..911069d88 100644
--- a/examples/er-rest-example/rest-server-example.c
+++ b/examples/er-rest-example/rest-server-example.c
@@ -381,16 +381,14 @@ separate_handler(void* request, void* response, uint8_t *buffer, uint16_t prefer
    */
   if (separate_active)
   {
-    REST.set_response_status(response, REST.status.SERVICE_UNAVAILABLE);
-    const char *msg = "AlreadyInUse";
-    REST.set_response_payload(response, msg, strlen(msg));
+    coap_separate_reject();
   }
   else
   {
     separate_active = 1;
 
     /* Take over and skip response by engine. */
-    coap_separate_yield(request, &separate_store->request_metadata);
+    coap_separate_accept(request, &separate_store->request_metadata);
     /* Be aware to respect the Block2 option, which is also stored in the coap_separate_t. */
 
     /*
@@ -465,20 +463,23 @@ pushing_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr
  * Additionally, a handler function named [resource name]_handler must be implemented for each PERIODIC_RESOURCE.
  * It will be called by the REST manager process with the defined period.
  */
-int
+void
 pushing_periodic_handler(resource_t *r)
 {
-  static uint32_t periodic_i = 0;
-  static char content[16];
+  static uint16_t obs_counter = 0;
+  static char content[11];
 
-  PRINTF("TICK /%s\n", r->url);
-  periodic_i = periodic_i + 1;
+  ++obs_counter;
+
+  PRINTF("TICK %u for /%s\n", periodic_i, r->url);
+
+  /* Build notification. */
+  coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
+  coap_init_message(notification, COAP_TYPE_NON, CONTENT_2_05, 0 );
+  coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter));
 
   /* Notify the registered observers with the given message type, observe option, and payload. */
-  REST.notify_subscribers(r->url, 1, periodic_i, (uint8_t *)content, snprintf(content, sizeof(content), "TICK %lu", periodic_i));
-  /*                              |-> implementation-specific, e.g. CoAP: 0=CON and 1=NON notification */
-
-  return 1;
+  REST.notify_subscribers(r, obs_counter, notification);
 }
 #endif
 
@@ -503,21 +504,23 @@ event_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred
 
 /* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined.
  * It will be called by the REST manager process with the defined period. */
-int
+void
 event_event_handler(resource_t *r)
 {
-  static uint32_t event_i = 0;
-  static char content[10];
+  static uint16_t event_counter = 0;
+  static char content[12];
 
-  PRINTF("EVENT /%s\n", r->url);
-  ++event_i;
+  ++event_counter;
 
-  /* Notify registered observers with the given message type, observe option, and payload.
-   * The token will be set automatically. */
+  PRINTF("TICK %u for /%s\n", event_counter, r->url);
 
-  // FIXME provide a rest_notify_subscribers call; how to manage specific options such as COAP_TYPE?
-  REST.notify_subscribers(r->url, 0, event_i, content, snprintf(content, sizeof(content), "EVENT %lu", event_i));
-  return 1;
+  /* Build notification. */
+  coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
+  coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 );
+  coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter));
+
+  /* Notify the registered observers with the given message type, observe option, and payload. */
+  REST.notify_subscribers(r, event_counter, notification);
 }
 #endif /* PLATFORM_HAS_BUTTON */
 
@@ -705,8 +708,7 @@ PROCESS_THREAD(rest_server_example, ev, data)
   rest_activate_event_resource(&resource_event);
 #endif
 #if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3
-  /* Use this pre-handler for separate response resources. */
-  rest_set_pre_handler(&resource_separate, coap_separate_handler);
+  /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */
   rest_activate_resource(&resource_separate);
 #endif
 #if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3))
diff --git a/examples/sensinode/clock_test.c b/examples/sensinode/clock_test.c
index 758b4d040..24d3c6417 100644
--- a/examples/sensinode/clock_test.c
+++ b/examples/sensinode/clock_test.c
@@ -19,7 +19,7 @@ PROCESS_THREAD(clock_test_process, ev, data)
   static struct etimer et;
   static clock_time_t count, start_count, end_count, diff;
   static unsigned long sec;
-  static u8_t i;
+  static uint8_t i;
 
   PROCESS_BEGIN();
 
@@ -41,8 +41,8 @@ PROCESS_THREAD(clock_test_process, ev, data)
     PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
     etimer_reset(&et);
 
-	count = clock_time();
-	printf("%u ticks\n", count);
+    count = clock_time();
+    printf("%u ticks\n", count);
 
     leds_toggle(LEDS_RED);
     i++;
@@ -55,8 +55,8 @@ PROCESS_THREAD(clock_test_process, ev, data)
     PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
     etimer_reset(&et);
 
-	sec = clock_seconds();
-	printf("%u seconds\n", (u16_t) sec);
+    sec = clock_seconds();
+    printf("%u seconds\n", (uint16_t) sec);
 
     leds_toggle(LEDS_GREEN);
     i++;
diff --git a/examples/sensinode/energy-scan/energy-scan.c b/examples/sensinode/energy-scan/energy-scan.c
index 07393d507..bb73f18a1 100644
--- a/examples/sensinode/energy-scan/energy-scan.c
+++ b/examples/sensinode/energy-scan/energy-scan.c
@@ -40,7 +40,7 @@
 #include "contiki.h"
 #include "cc2430_sfr.h"
 
-#include "sensinode-debug.h"
+#include "debug.h"
 #include "dev/cc2430_rf.h"
 #include <stdio.h>
 
diff --git a/examples/sensinode/event-post/event-post.h b/examples/sensinode/event-post/event-post.h
index 2d640441a..f43934438 100644
--- a/examples/sensinode/event-post/event-post.h
+++ b/examples/sensinode/event-post/event-post.h
@@ -10,13 +10,13 @@
 #define EVENT_POST_H_
 
 struct event_struct {
-	short		s_val;
-	int			i_val;
-	long		l_val;
-	long long	ll_val;
-	u8_t		u8_val;
-	u16_t		u16_val;
-	u32_t		u32_val;
+  short      s_val;
+  int        i_val;
+  long       l_val;
+  long long ll_val;
+  uint8_t   u8_val;
+  uint16_t u16_val;
+  uint32_t u32_val;
 };
 
 #endif /* EVENT_POST_H_ */
diff --git a/examples/sensinode/sensors-ipv6/sensors-driver.c b/examples/sensinode/sensors-ipv6/sensors-driver.c
index 01e118eb2..148d2b3a4 100644
--- a/examples/sensinode/sensors-ipv6/sensors-driver.c
+++ b/examples/sensinode/sensors-ipv6/sensors-driver.c
@@ -46,7 +46,7 @@
 #include "dev/leds.h"
 #if CONTIKI_TARGET_SENSINODE
 #include "dev/sensinode-sensors.h"
-#include "sensinode-debug.h"
+#include "debug.h"
 #endif
 
 #define DEBUG 0
diff --git a/examples/sensinode/sensors-ipv6/sensors-ipv6.c b/examples/sensinode/sensors-ipv6/sensors-ipv6.c
index ca9589fb4..bf07a595c 100644
--- a/examples/sensinode/sensors-ipv6/sensors-ipv6.c
+++ b/examples/sensinode/sensors-ipv6/sensors-ipv6.c
@@ -58,7 +58,7 @@
 #include <stdio.h>
 
 #if CONTIKI_TARGET_SENSINODE
-#include "sensinode-debug.h"
+#include "debug.h"
 #include "dev/sensinode-sensors.h"
 #else
 #define putstring(s)
diff --git a/examples/sensinode/sensors/sensors-example.c b/examples/sensinode/sensors/sensors-example.c
index ecbaddb17..33277b77d 100644
--- a/examples/sensinode/sensors/sensors-example.c
+++ b/examples/sensinode/sensors/sensors-example.c
@@ -96,7 +96,7 @@
 #if DEBUG
 #include <stdio.h>
 #if CONTIKI_TARGET_SENSINODE
-#include "sensinode-debug.h"
+#include "debug.h"
 #endif /* CONTIKI_TARGET_SENSINODE */
 #define PRINTF(...) printf(__VA_ARGS__)
 #else /* DEBUG */
diff --git a/examples/sensinode/serial-flash/flash.c b/examples/sensinode/serial-flash/flash.c
index 6593de3ee..a796b7513 100644
--- a/examples/sensinode/serial-flash/flash.c
+++ b/examples/sensinode/serial-flash/flash.c
@@ -49,7 +49,7 @@
 #define DEBUG 1
 #if DEBUG
 #include <stdio.h>
-#include "sensinode-debug.h"
+#include "debug.h"
 #define PRINTF(...) printf(__VA_ARGS__)
 #define PUTBIN(b) putbin(b)
 #else
diff --git a/examples/sensinode/timer-test.c b/examples/sensinode/timer-test.c
index 163574326..3afc53320 100644
--- a/examples/sensinode/timer-test.c
+++ b/examples/sensinode/timer-test.c
@@ -111,7 +111,7 @@ PROCESS_THREAD(clock_test_process, ev, data)
     etimer_reset(&et);
 
     sec = clock_seconds();
-    printf("%u seconds\n", (u16_t) sec);
+    printf("%u seconds\n", (uint16_t) sec);
 
     leds_toggle(LEDS_GREEN);
     i++;
diff --git a/examples/sensinode/udp-ipv6/client.c b/examples/sensinode/udp-ipv6/client.c
index c20643c54..0cb13e3f6 100644
--- a/examples/sensinode/udp-ipv6/client.c
+++ b/examples/sensinode/udp-ipv6/client.c
@@ -36,7 +36,7 @@
 
 #if CONTIKI_TARGET_SENSINODE
 #include "dev/sensinode-sensors.h"
-#include "sensinode-debug.h"
+#include "debug.h"
 #else
 #define putstring(s)
 #define puthex(s)
diff --git a/examples/sensinode/udp-ipv6/ping6.c b/examples/sensinode/udp-ipv6/ping6.c
index a88ebc7dc..396edbc94 100644
--- a/examples/sensinode/udp-ipv6/ping6.c
+++ b/examples/sensinode/udp-ipv6/ping6.c
@@ -35,19 +35,11 @@
 
 #if CONTIKI_TARGET_SENSINODE
 #include "dev/sensinode-sensors.h"
-#include "sensinode-debug.h"
+#include "debug.h"
 #endif
 
-#define DEBUG 0
-#if DEBUG
-#include <stdio.h>
-#define PRINTF(...) printf(__VA_ARGS__)
-#define PRINT6ADDR(addr) PRINTF(" %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x ", ((u8_t *)addr)[0], ((u8_t *)addr)[1], ((u8_t *)addr)[2], ((u8_t *)addr)[3], ((u8_t *)addr)[4], ((u8_t *)addr)[5], ((u8_t *)addr)[6], ((u8_t *)addr)[7], ((u8_t *)addr)[8], ((u8_t *)addr)[9], ((u8_t *)addr)[10], ((u8_t *)addr)[11], ((u8_t *)addr)[12], ((u8_t *)addr)[13], ((u8_t *)addr)[14], ((u8_t *)addr)[15])
-#define PRINTLLADDR(lladdr) PRINTF(" %02x:%02x:%02x:%02x:%02x:%02x ",lladdr->addr[0], lladdr->addr[1], lladdr->addr[2], lladdr->addr[3],lladdr->addr[4], lladdr->addr[5])
-#else
-#define PRINTF(...)
-#define PRINT6ADDR(addr)
-#endif
+#define DEBUG DEBUG_NONE
+#include "net/uip-debug.h"
 
 #define PING6_NB 5
 #define PING6_DATALEN 16
@@ -56,8 +48,7 @@
 #define UIP_ICMP_BUF            ((struct uip_icmp_hdr *)&uip_buf[uip_l2_l3_hdr_len])
 
 static struct etimer ping6_periodic_timer;
-static u8_t count = 0;
-static u16_t addr[8];
+static uint8_t count = 0;
 static uip_ipaddr_t dest_addr;
 
 PROCESS(ping6_process, "PING6 process");
@@ -84,16 +75,16 @@ ping6handler()
 
 
     uip_len = UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN + UIP_IPH_LEN + PING6_DATALEN;
-    UIP_IP_BUF->len[0] = (u8_t)((uip_len - 40) >> 8);
-    UIP_IP_BUF->len[1] = (u8_t)((uip_len - 40) & 0x00FF);
+    UIP_IP_BUF->len[0] = (uint8_t)((uip_len - 40) >> 8);
+    UIP_IP_BUF->len[1] = (uint8_t)((uip_len - 40) & 0x00FF);
 
     UIP_ICMP_BUF->icmpchksum = 0;
     UIP_ICMP_BUF->icmpchksum = ~uip_icmp6chksum();
 
 
-    PRINTF("Echo Request to");
+    PRINTF("Echo Request to ");
     PRINT6ADDR(&UIP_IP_BUF->destipaddr);
-    PRINTF("from");
+    PRINTF(" from ");
     PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
     PRINTF("\n");
     UIP_STAT(++uip_stat.icmp.sent);
diff --git a/examples/sensinode/udp-ipv6/server.c b/examples/sensinode/udp-ipv6/server.c
index f3ab93202..ebe0f590f 100644
--- a/examples/sensinode/udp-ipv6/server.c
+++ b/examples/sensinode/udp-ipv6/server.c
@@ -41,7 +41,7 @@
 
 #if CONTIKI_TARGET_SENSINODE
 #include "dev/sensinode-sensors.h"
-#include "sensinode-debug.h"
+#include "debug.h"
 #else
 #define putstring(s)
 #endif
@@ -77,7 +77,7 @@ tcpip_handler(void)
     leds_on(LEDS_RED);
     len = uip_datalen();
     memcpy(buf, uip_appdata, len);
-    PRINTF("%u bytes from [", len, *(uint16_t *)buf);
+    PRINTF("%u bytes from [", len);
     PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
     PRINTF("]:%u", UIP_HTONS(UIP_UDP_BUF->srcport));
     PRINTF(" V=%u", *buf);
diff --git a/platform/cc2530dk/contiki-conf.h b/platform/cc2530dk/contiki-conf.h
index 4eae96016..647cb39b3 100644
--- a/platform/cc2530dk/contiki-conf.h
+++ b/platform/cc2530dk/contiki-conf.h
@@ -10,12 +10,6 @@
 #include "project-conf.h"
 #endif /* PROJECT_CONF_H */
 
-/* Time type. */
-typedef unsigned short clock_time_t;
-
-/* Defines tick counts for a second. */
-#define CLOCK_CONF_SECOND		128
-
 /* Energest Module */
 #ifndef ENERGEST_CONF_ON
 #define ENERGEST_CONF_ON      0
@@ -70,18 +64,14 @@ typedef unsigned short clock_time_t;
 
 /* Code Shortcuts */
 /*
- * When set, the RF driver is no longer a contiki process and the RX ISR is
- * disabled. Instead of polling the radio process when data arrives, we
- * periodically check for data by directly invoking the driver from main()
-
  * When set, this directive also configures the following bypasses:
  *   - process_post_synch() in tcpip_input() (we call packet_input())
  *   - process_post_synch() in tcpip_uipcall (we call the relevant pthread)
  *   - mac_call_sent_callback() is replaced with sent() in various places
  *
- * These are good things to do, we reduce stack usage, RAM size and code size
+ * These are good things to do, they reduce stack usage and prevent crashes
  */
-#define SHORTCUTS_CONF_NETSTACK   1
+#define NETSTACK_CONF_SHORTCUTS   1
 
 /*
  * Sensors
diff --git a/platform/cc2530dk/contiki-main.c b/platform/cc2530dk/contiki-main.c
index e5b89a682..bbf469dff 100644
--- a/platform/cc2530dk/contiki-main.c
+++ b/platform/cc2530dk/contiki-main.c
@@ -254,7 +254,6 @@ main(void)
       watchdog_periodic();
       r = process_run();
     } while(r > 0);
-#if SHORTCUTS_CONF_NETSTACK
     len = NETSTACK_RADIO.pending_packet();
     if(len) {
       packetbuf_clear();
@@ -264,7 +263,6 @@ main(void)
         NETSTACK_RDC.input();
       }
     }
-#endif
 
 #if LPM_MODE
 #if (LPM_MODE==LPM_MODE_PM2)
diff --git a/platform/cc2530dk/viztool.c b/platform/cc2530dk/viztool.c
index 777ffc855..bfa354982 100644
--- a/platform/cc2530dk/viztool.c
+++ b/platform/cc2530dk/viztool.c
@@ -71,7 +71,6 @@ extern uip_ds6_netif_t uip_ds6_if;
 extern uip_ds6_route_t uip_ds6_routing_table[UIP_DS6_ROUTE_NB];
 extern uip_ds6_nbr_t uip_ds6_nbr_cache[UIP_DS6_NBR_NB];
 extern uip_ds6_defrt_t uip_ds6_defrt_list[UIP_DS6_DEFRT_NB];
-extern u16_t uip_len;
 /*---------------------------------------------------------------------------*/
 static uint8_t
 process_request()
diff --git a/platform/sensinode/Makefile.sensinode b/platform/sensinode/Makefile.sensinode
index a1daf96e6..133e6fdde 100644
--- a/platform/sensinode/Makefile.sensinode
+++ b/platform/sensinode/Makefile.sensinode
@@ -40,7 +40,7 @@ CONTIKI_TARGET_SOURCEFILES = contiki-sensinode-main.c
 CONTIKI_TARGET_SOURCEFILES += leds.c leds-arch.c serial-line.c sensors.c
 CONTIKI_TARGET_SOURCEFILES += sensinode-sensors.c button-sensor.c adc-sensor.c
 CONTIKI_TARGET_SOURCEFILES += n740.c models.c m25p16.c slip-arch.c slip.c
-CONTIKI_TARGET_SOURCEFILES += putchar.c sensinode-debug.c
+CONTIKI_TARGET_SOURCEFILES += putchar.c debug.c
 
 CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
 
diff --git a/platform/sensinode/contiki-conf.h b/platform/sensinode/contiki-conf.h
index 894c2174a..278ba74de 100644
--- a/platform/sensinode/contiki-conf.h
+++ b/platform/sensinode/contiki-conf.h
@@ -10,9 +10,6 @@
 #include "project-conf.h"
 #endif /* PROJECT_CONF_H */
 
-/* Defines tick counts for a second. */
-#define CLOCK_CONF_SECOND		128
-
 /* The clock ISR is stack-hungry and may cause crashes.
  * Define this as 0 if you are suffering from frequent stack overflows */
 #ifndef CLOCK_CONF_ACCURATE
@@ -85,21 +82,15 @@
  * When set, the RF driver is no longer a contiki process and the RX ISR is
  * disabled. Instead of polling the radio process when data arrives, we
  * periodically check for data by directly invoking the driver from main()
-
+ *
  * When set, this directive also configures the following bypasses:
  *   - process_post_synch() in tcpip_input() (we call packet_input())
  *   - process_post_synch() in tcpip_uipcall (we call the relevant pthread)
  *   - mac_call_sent_callback() is replaced with sent() in various places
  *
- * These are good things to do, we reduce stack usage, RAM size and code size
+ * These are good things to do, they reduce stack usage and prevent crashes
  */
-#define SHORTCUTS_CONF_NETSTACK   1
-
-/*
- * Directly read mac from flash with a __code pointer, instead of using the
- * generic flash_read() routine. This reduces HOME code size
- */
-#define SHORTCUTS_CONF_FLASH_READ 1
+#define NETSTACK_CONF_SHORTCUTS   1
 
 /*
  * Sensors
diff --git a/platform/sensinode/contiki-sensinode-main.c b/platform/sensinode/contiki-sensinode-main.c
index a1f9abb9d..66d2d0e75 100644
--- a/platform/sensinode/contiki-sensinode-main.c
+++ b/platform/sensinode/contiki-sensinode-main.c
@@ -15,7 +15,7 @@
 #include "net/rime.h"
 #include "net/netstack.h"
 #include "net/mac/frame802154.h"
-#include "sensinode-debug.h"
+#include "debug.h"
 #include "dev/watchdog-cc2430.h"
 #include "dev/sensinode-sensors.h"
 #include "disco.h"
@@ -32,7 +32,7 @@ PROCESS_NAME(viztool_process);
 PROCESS_NAME(batmon_process);
 #endif
 
-#if SHORTCUTS_CONF_NETSTACK
+#if NETSTACK_CONF_SHORTCUTS
 static __data int len;
 #endif
 
@@ -99,12 +99,7 @@ set_rime_addr(void)
   uint8_t *addr_long = NULL;
   uint16_t addr_short = 0;
   char i;
-
-#if SHORTCUTS_CONF_FLASH_READ
   __code unsigned char * macp;
-#else
-  static uint8_t ft_buffer[8];
-#endif
 
   PUTSTRING("Rime is 0x");
   PUTHEX(sizeof(rimeaddr_t));
@@ -112,7 +107,6 @@ set_rime_addr(void)
 
   if(node_id == 0) {
     PUTSTRING("Reading MAC from flash\n");
-#if SHORTCUTS_CONF_FLASH_READ
     /*
      * The MAC is always stored in 0x1FFF8 of our flash. This maps to address
      * 0xFFF8 of our CODE segment, when BANK3 is selected.
@@ -124,7 +118,7 @@ set_rime_addr(void)
     /* Don't interrupt us to make sure no BANK switching happens while working */
     DISABLE_INTERRUPTS();
 
-    /* Switch to BANK3, map CODE: 0x8000 – 0xFFFF to FLASH: 0x18000 – 0x1FFFF */
+    /* Switch to BANK3, map CODE: 0x8000 - 0xFFFF to FLASH: 0x18000 - 0x1FFFF */
     FMAP = 3;
 
     /* Set our pointer to the correct address and fetch 8 bytes of MAC */
@@ -135,21 +129,9 @@ set_rime_addr(void)
       macp++;
     }
 
-    /* Remap 0x8000 – 0xFFFF to BANK1 */
+    /* Remap 0x8000 - 0xFFFF to BANK1 */
     FMAP = 1;
     ENABLE_INTERRUPTS();
-#else
-    /*
-     * Or use the more generic flash_read() routine which can read from any
-     * address of our flash
-     */
-    flash_read(ft_buffer, 0x1FFF8, 8);
-
-    /* Flip the byte order and store MSB first */
-    for(i = (RIMEADDR_SIZE - 1); i >= 0; --i) {
-      rimeaddr_node_addr.u8[RIMEADDR_SIZE - 1 - i] = ft_buffer[i];
-    }
-#endif
 
   } else {
     PUTSTRING("Setting manual address from node_id\n");
@@ -324,7 +306,7 @@ main(void)
 #endif
       r = process_run();
     } while(r > 0);
-#if SHORTCUTS_CONF_NETSTACK
+#if NETSTACK_CONF_SHORTCUTS
     len = NETSTACK_RADIO.pending_packet();
     if(len) {
       packetbuf_clear();
diff --git a/platform/sensinode/sensinode-debug.c b/platform/sensinode/debug.c
similarity index 97%
rename from platform/sensinode/sensinode-debug.c
rename to platform/sensinode/debug.c
index 031e0ccb5..b1e3a2710 100644
--- a/platform/sensinode/sensinode-debug.c
+++ b/platform/sensinode/debug.c
@@ -13,7 +13,7 @@
 
 #include "cc2430_sfr.h"
 #include "8051def.h"
-#include "sensinode-debug.h"
+#include "debug.h"
 
 static const char hexconv[] = "0123456789abcdef";
 static const char binconv[] = "01";
diff --git a/platform/sensinode/sensinode-debug.h b/platform/sensinode/debug.h
similarity index 95%
rename from platform/sensinode/sensinode-debug.h
rename to platform/sensinode/debug.h
index 683f1ba44..4c5dc135b 100644
--- a/platform/sensinode/sensinode-debug.h
+++ b/platform/sensinode/debug.h
@@ -40,8 +40,8 @@
  *         George Oikonomou - <oikonomou@users.sourceforge.net>
  */
 
-#ifndef SENSINODE_DEBUG_H_
-#define SENSINODE_DEBUG_H_
+#ifndef DEBUG_H_
+#define DEBUG_H_
 
 #include "8051def.h"
 #include "dev/uart1.h"
@@ -51,4 +51,4 @@ void putstring(char *s);
 void puthex(uint8_t c);
 void putbin(uint8_t c);
 
-#endif /* SENSINODE_DEBUG_H_ */
+#endif /* DEBUG_H_ */
diff --git a/platform/sensinode/viztool.c b/platform/sensinode/viztool.c
index 777ffc855..bfa354982 100644
--- a/platform/sensinode/viztool.c
+++ b/platform/sensinode/viztool.c
@@ -71,7 +71,6 @@ extern uip_ds6_netif_t uip_ds6_if;
 extern uip_ds6_route_t uip_ds6_routing_table[UIP_DS6_ROUTE_NB];
 extern uip_ds6_nbr_t uip_ds6_nbr_cache[UIP_DS6_NBR_NB];
 extern uip_ds6_defrt_t uip_ds6_defrt_list[UIP_DS6_DEFRT_NB];
-extern u16_t uip_len;
 /*---------------------------------------------------------------------------*/
 static uint8_t
 process_request()