diff --git a/sys/include/net/csma_sender.h b/sys/include/net/csma_sender.h
index 0928215f780f860368ffec79a80693a2b4402546..b7183c0325890c494b684b54bb1fc74999d87e32 100644
--- a/sys/include/net/csma_sender.h
+++ b/sys/include/net/csma_sender.h
@@ -87,8 +87,7 @@ extern const csma_sender_conf_t CSMA_SENDER_CONF_DEFAULT;
  * CSMA/CA, this feature is used. Otherwise, a software procedure is used.
  *
  * @param[in] dev       netdev device, needs to be already initialized
- * @param[in] vector    pointer to the data
- * @param[in] count     number of elements in @p vector
+ * @param[in] iolist    pointer to the data
  * @param[in] conf      configuration for the backoff;
  *                      will be set to @ref CSMA_SENDER_CONF_DEFAULT if NULL.
  *
@@ -101,8 +100,8 @@ extern const csma_sender_conf_t CSMA_SENDER_CONF_DEFAULT;
  * @return              -EBUSY if radio medium never was available
  *                      to send the given data
  */
-int csma_sender_csma_ca_send(netdev_t *dev, struct iovec *vector,
-                             unsigned count, const csma_sender_conf_t *conf);
+int csma_sender_csma_ca_send(netdev_t *dev, iolist_t *iolist,
+                             const csma_sender_conf_t *conf);
 
 /**
  * @brief   Sends a 802.15.4 frame when medium is avaiable.
@@ -121,8 +120,7 @@ int csma_sender_csma_ca_send(netdev_t *dev, struct iovec *vector,
  *          @ref csma_sender_csma_ca_send().
  *
  * @param[in] dev       netdev device, needs to be already initialized
- * @param[in] vector    pointer to the data
- * @param[in] count     number of elements in @p vector
+ * @param[in] iolist    pointer to the data
  *
  * @return              number of bytes that were actually send out
  * @return              -ENODEV if @p dev is invalid
@@ -133,7 +131,7 @@ int csma_sender_csma_ca_send(netdev_t *dev, struct iovec *vector,
  * @return              -EBUSY if radio medium was not available
  *                      to send the given data
  */
-int csma_sender_cca_send(netdev_t *dev, struct iovec *vector, unsigned count);
+int csma_sender_cca_send(netdev_t *dev, iolist_t *iolist);
 
 
 #ifdef __cplusplus
diff --git a/sys/include/net/netdev_test.h b/sys/include/net/netdev_test.h
index 016db2d55bb107a2b2b494e59b56d383f54f7c19..6260b610eeb752096e3acb68a9ab5b60f27783df 100644
--- a/sys/include/net/netdev_test.h
+++ b/sys/include/net/netdev_test.h
@@ -33,11 +33,10 @@
  * static uint32_t sum = 0;
  * static mutex_t wait = MUTEX_INIT;
  *
- * int _send_timer(netdev_t *dev, const struct iovec *vector, int count)
+ * int _send_timer(netdev_t *dev, const iolist_t *iolist)
  * {
  *     (void)dev;
- *     (void)vector;
- *     (void)count;
+ *     (void)iolist;
  *
  *     sum += (xtimer_now_usec() - last_start);
  *     mutex_unlock(&wait);
@@ -95,15 +94,12 @@ extern "C" {
  * @brief   Callback type to handle send command
  *
  * @param[in] dev       network device descriptor
- * @param[in] vector    io vector array to send
- * @param[in] count     number of entries in vector
+ * @param[in] iolist    io vector list to send
  *
  * @return  number of bytes sent
  * @return  <= 0 on error
  */
-typedef int (*netdev_test_send_cb_t)(netdev_t *dev,
-                                     const struct iovec *vector,
-                                     int count);
+typedef int (*netdev_test_send_cb_t)(netdev_t *dev, const iolist_t *iolist);
 
 /**
  * @brief   Callback type to handle receive command
diff --git a/sys/net/gnrc/link_layer/gomach/gomach_internal.c b/sys/net/gnrc/link_layer/gomach/gomach_internal.c
index 3b30d4fb67292ef3e03fe2c82c516047485c9143..3b6618324509a85ea2f1338a81a8744494fce8bb 100644
--- a/sys/net/gnrc/link_layer/gomach/gomach_internal.c
+++ b/sys/net/gnrc/link_layer/gomach/gomach_internal.c
@@ -50,10 +50,9 @@ int _gnrc_gomach_transmit(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
     netdev_t *dev = netif->dev;
     netdev_ieee802154_t *state = (netdev_ieee802154_t *)netif->dev;
     gnrc_netif_hdr_t *netif_hdr;
-    gnrc_pktsnip_t *vec_snip;
     const uint8_t *src, *dst = NULL;
     int res = 0;
-    size_t n, src_len, dst_len;
+    size_t src_len, dst_len;
     uint8_t mhr[IEEE802154_MAX_HDR_LEN];
     uint8_t flags = (uint8_t)(state->flags & NETDEV_IEEE802154_SEND_MASK);
     le_uint16_t dev_pan = byteorder_btols(byteorder_htons(state->pan));
@@ -93,38 +92,34 @@ int _gnrc_gomach_transmit(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
         DEBUG("_send_ieee802154: Error preperaring frame\n");
         return -EINVAL;
     }
+
     /* prepare packet for sending */
-    vec_snip = gnrc_pktbuf_get_iovec(pkt, &n);
-    if (vec_snip != NULL) {
-        struct iovec *vector;
-
-        pkt = vec_snip;     /* reassign for later release; vec_snip is prepended to pkt */
-        vector = (struct iovec *)pkt->data;
-        vector[0].iov_base = mhr;
-        vector[0].iov_len = (size_t)res;
+    iolist_t iolist = {
+        .iol_next = (iolist_t *)pkt->next,
+        .iol_base = mhr,
+        .iol_len = (size_t)res
+    };
+
 #ifdef MODULE_NETSTATS_L2
-        if (netif_hdr->flags &
+    if (netif_hdr->flags &
             (GNRC_NETIF_HDR_FLAGS_BROADCAST | GNRC_NETIF_HDR_FLAGS_MULTICAST)) {
-            netif->dev->stats.tx_mcast_count++;
-        }
-        else {
-            netif->dev->stats.tx_unicast_count++;
-        }
+        netif->dev->stats.tx_mcast_count++;
+    }
+    else {
+        netif->dev->stats.tx_unicast_count++;
+    }
 #endif
 #ifdef MODULE_GNRC_MAC
-        if (netif->mac.mac_info & GNRC_NETIF_MAC_INFO_CSMA_ENABLED) {
-            res = csma_sender_csma_ca_send(dev, vector, n, &netif->mac.csma_conf);
-        }
-        else {
-            res = dev->driver->send(dev, vector, n);
-        }
-#else
-        res = dev->driver->send(dev, vector, n);
-#endif
+    if (netif->mac.mac_info & GNRC_NETIF_MAC_INFO_CSMA_ENABLED) {
+        res = csma_sender_csma_ca_send(dev, &iolist, &netif->mac.csma_conf);
     }
     else {
-        return -ENOBUFS;
+        res = dev->driver->send(dev, &iolist);
     }
+#else
+    res = dev->driver->send(dev, &iolist);
+#endif
+
     /* release old data */
     gnrc_pktbuf_release(pkt);
     return res;
diff --git a/sys/net/gnrc/link_layer/lwmac/lwmac_internal.c b/sys/net/gnrc/link_layer/lwmac/lwmac_internal.c
index a4668e746ca136d292eaac339b69c139ced8a9d1..181b1c029719b94028a79acf7d60a5eb8768f716 100644
--- a/sys/net/gnrc/link_layer/lwmac/lwmac_internal.c
+++ b/sys/net/gnrc/link_layer/lwmac/lwmac_internal.c
@@ -37,10 +37,9 @@ int _gnrc_lwmac_transmit(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
     netdev_t *dev = netif->dev;
     netdev_ieee802154_t *state = (netdev_ieee802154_t *)netif->dev;
     gnrc_netif_hdr_t *netif_hdr;
-    gnrc_pktsnip_t *vec_snip;
     const uint8_t *src, *dst = NULL;
     int res = 0;
-    size_t n, src_len, dst_len;
+    size_t src_len, dst_len;
     uint8_t mhr[IEEE802154_MAX_HDR_LEN];
     uint8_t flags = (uint8_t)(state->flags & NETDEV_IEEE802154_SEND_MASK);
     le_uint16_t dev_pan = byteorder_btols(byteorder_htons(state->pan));
@@ -80,38 +79,34 @@ int _gnrc_lwmac_transmit(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt)
         DEBUG("_send_ieee802154: Error preperaring frame\n");
         return -EINVAL;
     }
+
     /* prepare packet for sending */
-    vec_snip = gnrc_pktbuf_get_iovec(pkt, &n);
-    if (vec_snip != NULL) {
-        struct iovec *vector;
+    iolist_t iolist = {
+        .iol_next = (iolist_t *)pkt->next,
+        .iol_base = mhr,
+        .iol_len = (size_t)res
+    };
 
-        pkt = vec_snip;     /* reassign for later release; vec_snip is prepended to pkt */
-        vector = (struct iovec *)pkt->data;
-        vector[0].iov_base = mhr;
-        vector[0].iov_len = (size_t)res;
 #ifdef MODULE_NETSTATS_L2
-        if (netif_hdr->flags &
+    if (netif_hdr->flags &
             (GNRC_NETIF_HDR_FLAGS_BROADCAST | GNRC_NETIF_HDR_FLAGS_MULTICAST)) {
-            netif->dev->stats.tx_mcast_count++;
-        }
-        else {
-            netif->dev->stats.tx_unicast_count++;
-        }
+        netif->dev->stats.tx_mcast_count++;
+    }
+    else {
+        netif->dev->stats.tx_unicast_count++;
+    }
 #endif
 #ifdef MODULE_GNRC_MAC
-        if (netif->mac.mac_info & GNRC_NETIF_MAC_INFO_CSMA_ENABLED) {
-            res = csma_sender_csma_ca_send(dev, vector, n, &netif->mac.csma_conf);
-        }
-        else {
-            res = dev->driver->send(dev, vector, n);
-        }
-#else
-        res = dev->driver->send(dev, vector, n);
-#endif
+    if (netif->mac.mac_info & GNRC_NETIF_MAC_INFO_CSMA_ENABLED) {
+        res = csma_sender_csma_ca_send(dev, &iolist, &netif->mac.csma_conf);
     }
     else {
-        return -ENOBUFS;
+        res = dev->driver->send(dev, &iolist);
     }
+#else
+    res = dev->driver->send(dev, &iolist);
+#endif
+
     /* release old data */
     gnrc_pktbuf_release(pkt);
     return res;
diff --git a/sys/net/link_layer/csma_sender/csma_sender.c b/sys/net/link_layer/csma_sender/csma_sender.c
index 1530f7832e3f5afe8bce6f95fb731cd7c9e99806..49c470ab5eeee8f5cc6ce032e3e428f1919eba8b 100644
--- a/sys/net/link_layer/csma_sender/csma_sender.c
+++ b/sys/net/link_layer/csma_sender/csma_sender.c
@@ -78,8 +78,7 @@ static inline uint32_t choose_backoff_period(int be,
  * @brief Perform a CCA and send the given packet if medium is available
  *
  * @param[in] device    netdev device, needs to be already initialized
- * @param[in] vector    pointer to the data
- * @param[in] count     number of elements in @p vector
+ * @param[in] iolist    pointer to the data
  *
  * @return              the return value of device driver's
  *                      netdev_driver_t::send() function if medium was
@@ -88,7 +87,7 @@ static inline uint32_t choose_backoff_period(int be,
  * @return              -EBUSY if radio medium was not available
  *                      to send the given data
  */
-static int send_if_cca(netdev_t *device, struct iovec *vector, unsigned count)
+static int send_if_cca(netdev_t *device, iolist_t *iolist)
 {
     netopt_enable_t hwfeat;
 
@@ -107,7 +106,7 @@ static int send_if_cca(netdev_t *device, struct iovec *vector, unsigned count)
     /* if medium is clear, send the packet and return */
     if (hwfeat == NETOPT_ENABLE) {
         DEBUG("csma: Radio medium available: sending packet.\n");
-        return device->driver->send(device, vector, count);
+        return device->driver->send(device, iolist);
     }
 
     /* if we arrive here, medium was not available for transmission */
@@ -117,8 +116,8 @@ static int send_if_cca(netdev_t *device, struct iovec *vector, unsigned count)
 
 /*------------------------- "EXPORTED" FUNCTIONS -------------------------*/
 
-int csma_sender_csma_ca_send(netdev_t *dev, struct iovec *vector,
-                             unsigned count, const csma_sender_conf_t *conf)
+int csma_sender_csma_ca_send(netdev_t *dev, iolist_t *iolist,
+                             const csma_sender_conf_t *conf)
 {
     netopt_enable_t hwfeat;
 
@@ -153,7 +152,7 @@ int csma_sender_csma_ca_send(netdev_t *dev, struct iovec *vector,
     if (ok) {
         /* device does CSMA/CA all by itself: let it do its job */
         DEBUG("csma: Network device does hardware CSMA/CA\n");
-        return dev->driver->send(dev, vector, count);
+        return dev->driver->send(dev, iolist);
     }
 
     /* if we arrive here, then we must perform the CSMA/CA procedure
@@ -169,7 +168,7 @@ int csma_sender_csma_ca_send(netdev_t *dev, struct iovec *vector,
         xtimer_usleep(bp);
 
         /* try to send after a CCA */
-        res = send_if_cca(dev, vector, count);
+        res = send_if_cca(dev, iolist);
         if (res >= 0) {
             /* TX done */
             return res;
@@ -195,7 +194,7 @@ int csma_sender_csma_ca_send(netdev_t *dev, struct iovec *vector,
 }
 
 
-int csma_sender_cca_send(netdev_t *dev, struct iovec *vector, unsigned count)
+int csma_sender_cca_send(netdev_t *dev, iolist_t *iolist)
 {
     netopt_enable_t hwfeat;
 
@@ -226,12 +225,12 @@ int csma_sender_cca_send(netdev_t *dev, struct iovec *vector, unsigned count)
     if (ok) {
         /* device does auto-CCA: let him do its job */
         DEBUG("csma: Network device does auto-CCA checking.\n");
-        return dev->driver->send(dev, vector, count);
+        return dev->driver->send(dev, iolist);
     }
 
     /* if we arrive here, we must do CCA ourselves to see if radio medium
        is clear before sending */
-    res = send_if_cca(dev, vector, count);
+    res = send_if_cca(dev, iolist);
     if (res == -EBUSY) {
         DEBUG("csma: Transmission cancelled!\n");
     }
diff --git a/sys/net/netdev_test/netdev_test.c b/sys/net/netdev_test/netdev_test.c
index 0dba17a6b704f5805fa65eef046e769f864ce36b..69883c1be2b62e3e221d43fb8e5e1b821c7bc3d2 100644
--- a/sys/net/netdev_test/netdev_test.c
+++ b/sys/net/netdev_test/netdev_test.c
@@ -19,32 +19,6 @@
 
 #include "net/netdev_test.h"
 
-static int _send(netdev_t *netdev, const struct iovec *vector, unsigned count);
-static int _recv(netdev_t *netdev, void *buf, size_t len, void *info);
-static int _init(netdev_t *dev);
-static void _isr(netdev_t *dev);
-static int _get(netdev_t *dev, netopt_t opt, void *value, size_t max_len);
-static int _set(netdev_t *dev, netopt_t opt, const void *value, size_t value_len);
-
-static const netdev_driver_t _driver = {
-    .send   = _send,
-    .recv   = _recv,
-    .init   = _init,
-    .isr    = _isr,
-    .get    = _get,
-    .set    = _set,
-};
-
-void netdev_test_setup(netdev_test_t *dev, void *state)
-{
-    netdev_t *netdev = (netdev_t *)dev;
-
-    netdev->driver = &_driver;
-    dev->state = state;
-    mutex_init(&dev->mutex);
-    netdev_test_reset(dev);
-}
-
 void netdev_test_reset(netdev_test_t *dev)
 {
     mutex_lock(&dev->mutex);
@@ -57,14 +31,14 @@ void netdev_test_reset(netdev_test_t *dev)
     mutex_unlock(&dev->mutex);
 }
 
-static int _send(netdev_t *netdev, const struct iovec *vector, unsigned count)
+static int _send(netdev_t *netdev, const iolist_t *iolist)
 {
     netdev_test_t *dev = (netdev_test_t *)netdev;
-    int res = (int)count;   /* assume everything would be fine */
+    int res = -EINVAL;
 
     mutex_lock(&dev->mutex);
     if (dev->send_cb != NULL) {
-        res = dev->send_cb(netdev, vector, count);
+        res = dev->send_cb(netdev, iolist);
     }
     mutex_unlock(&dev->mutex);
     return res;
@@ -140,5 +114,23 @@ static int _set(netdev_t *netdev, netopt_t opt, const void *value, size_t value_
     return res;
 }
 
+static const netdev_driver_t _driver = {
+    .send   = _send,
+    .recv   = _recv,
+    .init   = _init,
+    .isr    = _isr,
+    .get    = _get,
+    .set    = _set,
+};
+
+void netdev_test_setup(netdev_test_t *dev, void *state)
+{
+    netdev_t *netdev = (netdev_t *)dev;
+
+    netdev->driver = &_driver;
+    dev->state = state;
+    mutex_init(&dev->mutex);
+    netdev_test_reset(dev);
+}
 
 /** @} */
diff --git a/tests/netdev_test/main.c b/tests/netdev_test/main.c
index ae1bb37e3be659622cc6b094c657b50079403e96..2ba913765fd5b2b88dc647f754bfbf7b6125cbe8 100644
--- a/tests/netdev_test/main.c
+++ b/tests/netdev_test/main.c
@@ -61,7 +61,7 @@ static uint8_t _tmp_len = 0;
 
 static void _dev_isr(netdev_t *dev);
 static int _dev_recv(netdev_t *dev, char *buf, int len, void *info);
-static int _dev_send(netdev_t *dev, const struct iovec *vector, int count);
+static int _dev_send(netdev_t *dev, const iolist_t *iolist);
 static int _dev_get_addr(netdev_t *dev, void *value, size_t max_len);
 static int _dev_set_addr(netdev_t *dev, const void *value, size_t max_len);
 
@@ -296,26 +296,26 @@ static int _dev_recv(netdev_t *dev, char *buf, int len, void *info)
     }
 }
 
-static int _dev_send(netdev_t *dev, const struct iovec *vector, int count)
+static int _dev_send(netdev_t *dev, const iolist_t *iolist)
 {
     int idx = 0;
 
     (void)dev;
     /* check packet content with expected data */
-    for (int i = 0; i < count; i++) {
-        if (memcmp(&(_tmp[idx]), vector[i].iov_base, vector[i].iov_len) != 0) {
-            printf("Unexpected send data (vector index = %d)\n", i);
+    for (; iolist; iolist = iolist->iol_next) {
+        if (memcmp(&(_tmp[idx]), iolist->iol_base, iolist->iol_len) != 0) {
+            puts("Unexpected send data:");
             puts("===========================================================");
             puts("expected");
             puts("===========================================================");
-            od_hex_dump(&_tmp[idx], vector[i].iov_len, OD_WIDTH_DEFAULT);
+            od_hex_dump(&_tmp[idx], iolist->iol_len, OD_WIDTH_DEFAULT);
             puts("===========================================================");
             puts("send data");
             puts("===========================================================");
-            od_hex_dump(vector[i].iov_base, vector[i].iov_len, OD_WIDTH_DEFAULT);
+            od_hex_dump(iolist->iol_base, iolist->iol_len, OD_WIDTH_DEFAULT);
             return -EINVAL;
         }
-        idx += vector[i].iov_len;
+        idx += iolist->iol_len;
     }
     if (idx != _tmp_len) {
         printf("Unexpected send length: %d (expected: %d)\n", idx, _tmp_len);