diff --git a/sys/net/gnrc/network_layer/sixlowpan/iphc/gnrc_sixlowpan_iphc.c b/sys/net/gnrc/network_layer/sixlowpan/iphc/gnrc_sixlowpan_iphc.c
index c06ceaef19329730c5fab803c36250d588240e54..85dada40c887738aa2d78f12c4f7bd36ca730262 100644
--- a/sys/net/gnrc/network_layer/sixlowpan/iphc/gnrc_sixlowpan_iphc.c
+++ b/sys/net/gnrc/network_layer/sixlowpan/iphc/gnrc_sixlowpan_iphc.c
@@ -19,9 +19,9 @@
 #include <stdbool.h>
 
 #include "byteorder.h"
-#include "net/ieee802154.h"
 #include "net/ipv6/hdr.h"
 #include "net/gnrc.h"
+#include "net/gnrc/netif/internal.h"
 #include "net/gnrc/sixlowpan.h"
 #include "net/gnrc/sixlowpan/ctx.h"
 #include "net/gnrc/sixlowpan/frag.h"
@@ -232,6 +232,7 @@ void gnrc_sixlowpan_iphc_recv(gnrc_pktsnip_t *sixlo, void *rbuf_ptr,
     assert(sixlo != NULL);
     gnrc_pktsnip_t *ipv6, *netif;
     gnrc_netif_hdr_t *netif_hdr;
+    gnrc_netif_t *iface;
     ipv6_hdr_t *ipv6_hdr;
     uint8_t *iphc_hdr = sixlo->data;
     size_t payload_offset = SIXLOWPAN_IPHC_HDR_LEN;
@@ -331,6 +332,7 @@ void gnrc_sixlowpan_iphc_recv(gnrc_pktsnip_t *sixlo, void *rbuf_ptr,
     netif = gnrc_pktsnip_search_type(sixlo, GNRC_NETTYPE_NETIF);
     assert(netif != NULL);
     netif_hdr = netif->data;
+    iface = gnrc_netif_hdr_get_netif(netif_hdr);
     switch (iphc_hdr[IPHC2_IDX] & (SIXLOWPAN_IPHC2_SAC | SIXLOWPAN_IPHC2_SAM)) {
 
         case IPHC_SAC_SAM_FULL:
@@ -354,9 +356,13 @@ void gnrc_sixlowpan_iphc_recv(gnrc_pktsnip_t *sixlo, void *rbuf_ptr,
             break;
 
         case IPHC_SAC_SAM_L2:
-            ieee802154_get_iid((eui64_t *)(&ipv6_hdr->src.u64[1]),
-                               gnrc_netif_hdr_get_src_addr(netif_hdr),
-                               netif_hdr->src_l2addr_len);
+            if (gnrc_netif_hdr_ipv6_iid_from_src(
+                        iface, netif_hdr, (eui64_t *)(&ipv6_hdr->src.u64[1])
+                    ) < 0) {
+                DEBUG("6lo iphc: could not get source's IID\n");
+                _recv_error_release(sixlo, ipv6, rbuf);
+                return;
+            }
             ipv6_addr_set_link_local_prefix(&ipv6_hdr->src);
             break;
 
@@ -384,9 +390,13 @@ void gnrc_sixlowpan_iphc_recv(gnrc_pktsnip_t *sixlo, void *rbuf_ptr,
 
         case IPHC_SAC_SAM_CTX_L2:
             assert(ctx != NULL);
-            ieee802154_get_iid((eui64_t *)(&ipv6_hdr->src.u64[1]),
-                               gnrc_netif_hdr_get_src_addr(netif_hdr),
-                               netif_hdr->src_l2addr_len);
+            if (gnrc_netif_hdr_ipv6_iid_from_src(
+                        iface, netif_hdr, (eui64_t *)(&ipv6_hdr->src.u64[1])
+                    ) < 0) {
+                DEBUG("6lo iphc: could not get source's IID\n");
+                _recv_error_release(sixlo, ipv6, rbuf);
+                return;
+            }
             ipv6_addr_init_prefix(&ipv6_hdr->src, &ctx->prefix,
                                   ctx->prefix_len);
             break;
@@ -433,9 +443,13 @@ void gnrc_sixlowpan_iphc_recv(gnrc_pktsnip_t *sixlo, void *rbuf_ptr,
             break;
 
         case IPHC_M_DAC_DAM_U_L2:
-            ieee802154_get_iid((eui64_t *)(&ipv6_hdr->dst.u64[1]),
-                               gnrc_netif_hdr_get_dst_addr(netif_hdr),
-                               netif_hdr->dst_l2addr_len);
+            if (gnrc_netif_hdr_ipv6_iid_from_dst(
+                        iface, netif_hdr, (eui64_t *)(&ipv6_hdr->dst.u64[1])
+                    ) < 0) {
+                DEBUG("6lo iphc: could not get destination's IID\n");
+                _recv_error_release(sixlo, ipv6, rbuf);
+                return;
+            }
             ipv6_addr_set_link_local_prefix(&ipv6_hdr->dst);
             break;
 
@@ -456,9 +470,13 @@ void gnrc_sixlowpan_iphc_recv(gnrc_pktsnip_t *sixlo, void *rbuf_ptr,
             break;
 
         case IPHC_M_DAC_DAM_U_CTX_L2:
-            ieee802154_get_iid((eui64_t *)(&ipv6_hdr->dst.u64[1]),
-                               gnrc_netif_hdr_get_dst_addr(netif_hdr),
-                               netif_hdr->dst_l2addr_len);
+            if (gnrc_netif_hdr_ipv6_iid_from_dst(
+                        iface, netif_hdr, (eui64_t *)(&ipv6_hdr->dst.u64[1])
+                    ) < 0) {
+                DEBUG("6lo iphc: could not get destination's IID\n");
+                _recv_error_release(sixlo, ipv6, rbuf);
+                return;
+            }
             ipv6_addr_init_prefix(&ipv6_hdr->dst, &ctx->prefix,
                                   ctx->prefix_len);
             break;
@@ -641,6 +659,7 @@ void gnrc_sixlowpan_iphc_send(gnrc_pktsnip_t *pkt, void *ctx, unsigned page)
     assert(pkt != NULL);
     gnrc_netif_hdr_t *netif_hdr = pkt->data;
     ipv6_hdr_t *ipv6_hdr;
+    gnrc_netif_t *iface = gnrc_netif_hdr_get_netif(netif_hdr);
     uint8_t *iphc_hdr;
     gnrc_sixlowpan_ctx_t *src_ctx = NULL, *dst_ctx = NULL;
     gnrc_pktsnip_t *dispatch, *ptr = pkt->next;
@@ -816,18 +835,14 @@ void gnrc_sixlowpan_iphc_send(gnrc_pktsnip_t *pkt, void *ctx, unsigned page)
             eui64_t iid;
             iid.uint64.u64 = 0;
 
-            if ((netif_hdr->src_l2addr_len == 2) ||
-                (netif_hdr->src_l2addr_len == 4) ||
-                (netif_hdr->src_l2addr_len == 8)) {
-                /* prefer to create IID from netif header if available */
-                ieee802154_get_iid(&iid, gnrc_netif_hdr_get_src_addr(netif_hdr),
-                                   netif_hdr->src_l2addr_len);
-            }
-            else {
-                /* but take from driver otherwise */
-                gnrc_netapi_get(netif_hdr->if_pid, NETOPT_IPV6_IID, 0, &iid,
-                                sizeof(eui64_t));
+            gnrc_netif_acquire(iface);
+            if (gnrc_netif_ipv6_get_iid(iface, &iid) < 0) {
+                DEBUG("6lo iphc: could not get interface's IID\n");
+                gnrc_netif_release(iface);
+                gnrc_pktbuf_release(pkt);
+                return;
             }
+            gnrc_netif_release(iface);
 
             if ((ipv6_hdr->src.u64[1].u64 == iid.uint64.u64) ||
                 _context_overlaps_iid(src_ctx, &ipv6_hdr->src, &iid)) {
@@ -941,8 +956,11 @@ void gnrc_sixlowpan_iphc_send(gnrc_pktsnip_t *pkt, void *ctx, unsigned page)
             }
         }
 
-        ieee802154_get_iid(&iid, gnrc_netif_hdr_get_dst_addr(netif_hdr),
-                           netif_hdr->dst_l2addr_len);
+        if (gnrc_netif_hdr_ipv6_iid_from_dst(iface, netif_hdr, &iid) < 0) {
+            DEBUG("6lo iphc: could not get destination's IID\n");
+            gnrc_pktbuf_release(pkt);
+            return;
+        }
 
         if ((ipv6_hdr->dst.u64[1].u64 == iid.uint64.u64) ||
             _context_overlaps_iid(dst_ctx, &(ipv6_hdr->dst), &iid)) {