diff --git a/sys/include/net/ng_ipv6/addr.h b/sys/include/net/ng_ipv6/addr.h
index 76588fc69cce1b33454ce5b4c4abc0d6d66834cb..aef571ed63410a85ed2fda4e2ab9c3af9b17439b 100644
--- a/sys/include/net/ng_ipv6/addr.h
+++ b/sys/include/net/ng_ipv6/addr.h
@@ -330,7 +330,7 @@ uint8_t ng_ipv6_addr_match_prefix(const ng_ipv6_addr_t *a, const ng_ipv6_addr_t
 
 /**
  * @brief   Sets IPv6 address @p out with the first @p bits bit taken
- *          from @p prefix and the remaining bits to 0.
+ *          from @p prefix and leaves the remaining bits untouched.
  *
  * @param[out]  out     Prefix to be set.
  * @param[in]   prefix  Address to take prefix from.
diff --git a/sys/net/network_layer/ng_ipv6/addr/ng_ipv6_addr.c b/sys/net/network_layer/ng_ipv6/addr/ng_ipv6_addr.c
index a329810ee4aff597515e3009071333bf5b2f4700..6030979d956db5173c10ca21e6e1afbb783da40f 100644
--- a/sys/net/network_layer/ng_ipv6/addr/ng_ipv6_addr.c
+++ b/sys/net/network_layer/ng_ipv6/addr/ng_ipv6_addr.c
@@ -62,8 +62,6 @@ void ng_ipv6_addr_init_prefix(ng_ipv6_addr_t *out, const ng_ipv6_addr_t *prefix,
 {
     uint8_t bytes;
 
-    ng_ipv6_addr_set_unspecified(out);
-
     if (bits > 128) {
         bits = 128;
     }
@@ -75,7 +73,8 @@ void ng_ipv6_addr_init_prefix(ng_ipv6_addr_t *out, const ng_ipv6_addr_t *prefix,
     if (bits % 8) {
         uint8_t mask = 0xff << (8 - (bits - (bytes * 8)));
 
-        out->u8[bytes] = prefix->u8[bytes] & mask;
+        out->u8[bytes] &= ~mask;
+        out->u8[bytes] |= prefix->u8[bytes];
     }
 }