diff --git a/sys/include/net/ng_pktbuf.h b/sys/include/net/ng_pktbuf.h
index f408c02151c21f83c2ad18760aa3d345c8e5e207..020bcf6ea07fe017c5fd2689cfcd2e9d32a2aff2 100644
--- a/sys/include/net/ng_pktbuf.h
+++ b/sys/include/net/ng_pktbuf.h
@@ -56,34 +56,37 @@ extern "C" {
 #define NG_PKTBUF_SIZE  (6144)
 #endif  /* NG_PKTBUF_SIZE */
 
+/**
+ * @brief   Initializes packet buffer module.
+ */
+void ng_pktbuf_init(void);
+
 /**
  * @brief   Adds a new ng_pktsnip_t and its packet to the packet buffer.
  *
- * @details This function is very powerful and reflects the unique characterics
- *          of ng_pktsnip_t of being reversed for either the sending or
- *          receiving context. Because of this the assumtion of the transmission
- *          direction, the state of the packet buffer and the values for the
- *          members of the resulting ng_pktsnip_t can be very different after
- *          execution of this function depending on what parameters you use:
- *
- * * The return value of this function is a @ref ng_pktsnip_t struct referred
- *   to as `result`
- * * for most cases the build-up of `result` will be pretty straight forward: Its
- *   members will be exactly as the given parameters (ng_pktsnip_t::next of
- *   result will be set to @p pkt). If @p pkt is not NULL it and in turn `result`
- *   are assumed to be in sending direction. For packet creation (@p pkt == NULL)
- *   no assumtions about direction of `result` will be made (since its
- *   ng_pktsnip::next will be set to NULL).
- * * if @p pkt != NULL, @p data = `pkt->data`, @p size < `pkt->size` receiving
- *   direction is assumed and the following values will be set:
- *   * ng_pktsnip_t::next of `result` = `pkt->next`
- *   * ng_pktsnip_t::data of `result` = @p data
- *   * ng_pktsnip_t::size of `result` = @p size
- *   * ng_pktsnip_t::next of @p pkt = `result`
- *   * ng_pktsnip_t::data of @p pkt = @p data + @p size
- *   * ng_pktsnip_t::size of @p pkt = old size value - @p size
- *
- *  graphically this can be represented as follows:
+ * @warning **Do not** change the fields of the ng_pktsnip_t created by this
+ *          function externally. This will most likely create memory leaks or
+ *          not allowed memory access.
+ *
+ * @param[in] next      Next ng_pktsnip_t in the packet. Leave NULL if you
+ *                      want to create a new packet.
+ * @param[in] data      Data of the new ng_pktsnip_t. If @p data is NULL no data
+ *                      will be inserted into `result`.
+ * @param[in] size      Length of @p data. May not be 0.
+ * @param[in] type      Protocol type of the ng_pktsnip_t.
+ *
+ * @return  Pointer to the packet part that represents the new ng_pktsnip_t.
+ * @return  NULL, if no space is left in the packet buffer.
+ * @return  NULL, if @p size == 0.
+ */
+ng_pktsnip_t *ng_pktbuf_add(ng_pktsnip_t *next, void *data, size_t size,
+                            ng_nettype_t type);
+
+/**
+ * @brief   Marks the first @p size bytes in a received packet with a new
+ *          packet snip that is appended to the packet.
+ *
+ *  Graphically this can be represented as follows:
  *  @code
  * Before                                    After
  * ======                                    =====
@@ -95,36 +98,23 @@ extern "C" {
  *  \__________pkt->size___________/          \_result->size_/ \__pkt->size__/
  *  @endcode
  *
- * @note    **Do not** change the ng_pktsnip_t::data and ng_pktsnip_t::size
- *          of a ng_pktsnip_t created by this function externally, except if
- *          they both are null or data is not from inside the packet buffer.
- *          This will most likely create memory leaks.
+ * @pre @p pkt != NULL && @p size != 0
  *
- * @param[in,out] pkt   The packet you want to add a ng_pktsnip_t to. Leave
- *                      NULL if you want to create a new packet. Members may
- *                      change values; see above.
- * @param[in] data      Data of the new ng_pktsnip_t. If @p data is NULL no data
- *                      will be inserted into `result`. If @p data is already
- *                      in the packet buffer (e.g. a payload of an already
- *                      allocated packet) it will not be duplicated.
- * @param[in] size      Length of @p data. If @p size is 0 no data will be inserted
- *                      into the the packet buffer and ng_pktsnip_t::data will be
- *                      set to @p data.
- * @param[in] type      Protocol type of the ng_pktsnip_t.
+ * @param[in] pkt   A received packet.
+ * @param[in] size  The size of the new packet snip.
+ * @param[in] type  The type of the new packet snip.
  *
- * @return  Pointer to the packet part that represents the new ng_pktsnip_t.
+ * @return  The new packet snip in @p pkt on success.
+ * @return  NULL, if pkt == NULL or size == 0 or size > pkt->size or pkt->data == NULL.
  * @return  NULL, if no space is left in the packet buffer.
- * @return  NULL, if @p pkt != NULL, @p data = `pkt->data`,
- *                and @p size > `pkt->data`.
  */
-ng_pktsnip_t *ng_pktbuf_add(ng_pktsnip_t *pkt, void *data, size_t size,
-                            ng_nettype_t type);
+ng_pktsnip_t *ng_pktbuf_mark(ng_pktsnip_t *pkt, size_t size, ng_nettype_t type);
 
 /**
  * @brief   Reallocates ng_pktsnip_t::data of @p pkt in the packet buffer, without
  *          changing the content.
  *
- * @pre `pkt->users == 1 && pkt->next == NULL` and @p pkt must be in packet buffer
+ * @pre ng_pktsnip_t::data of @p pkt is in the packet buffer.
  *
  * @details If enough memory is available behind it or @p size is smaller than
  *          the original size the packet then ng_pktsnip_t::data of @p pkt will
@@ -135,8 +125,6 @@ ng_pktsnip_t *ng_pktbuf_add(ng_pktsnip_t *pkt, void *data, size_t size,
  * @param[in] size  The size for @p pkt.
  *
  * @return  0, on success
- * @return  EINVAL, if precondition is not met
- * @return  ENOENT, if ng_pktsnip_t::data of @p pkt was not from the packet buffer.
  * @return  ENOMEM, if no space is left in the packet buffer or size was 0.
  */
 int ng_pktbuf_realloc_data(ng_pktsnip_t *pkt, size_t size);
@@ -182,7 +170,7 @@ ng_pktsnip_t *ng_pktbuf_start_write(ng_pktsnip_t *pkt);
  * @return  The new reference to @p pkt.
  */
 static inline ng_pktsnip_t *ng_pktbuf_remove_snip(ng_pktsnip_t *pkt,
-                                                  ng_pktsnip_t *snip)
+        ng_pktsnip_t *snip)
 {
     LL_DELETE(pkt, snip);
     snip->next = NULL;
@@ -213,9 +201,12 @@ void ng_pktbuf_stats(void);
 bool ng_pktbuf_is_empty(void);
 
 /**
- * @brief   Resets the whole packet buffer
+ * @brief   Checks if the implenation's internal invariants still uphold
+ *
+ * @return  true, the packet buffer is sane.
+ * @return  false, the packet buffer is insane.
  */
-void ng_pktbuf_reset(void);
+bool ng_pktbuf_is_sane(void);
 #endif
 
 #ifdef __cplusplus