Index: uspace/lib/c/Makefile
===================================================================
--- uspace/lib/c/Makefile	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/Makefile	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -93,5 +93,4 @@
 	generic/futex.c \
 	generic/inet/addr.c \
-	generic/inet/addr2.c \
 	generic/inet.c \
 	generic/inetcfg.c \
Index: uspace/lib/c/generic/dnsr.c
===================================================================
--- uspace/lib/c/generic/dnsr.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/dnsr.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -108,5 +108,5 @@
 
 	info->cname = str_dup(cname_buf);
-	inet2_addr_unpack(IPC_GET_ARG1(answer), &info->addr);
+	inet_addr_unpack(IPC_GET_ARG1(answer), &info->addr);
 
 	*rinfo = info;
@@ -123,5 +123,5 @@
 }
 
-int dnsr_get_srvaddr(inet2_addr_t *srvaddr)
+int dnsr_get_srvaddr(inet_addr_t *srvaddr)
 {
 	async_exch_t *exch = dnsr_exchange_begin();
@@ -129,5 +129,5 @@
 	ipc_call_t answer;
 	aid_t req = async_send_0(exch, DNSR_GET_SRVADDR, &answer);
-	int rc = async_data_read_start(exch, srvaddr, sizeof(inet2_addr_t));
+	int rc = async_data_read_start(exch, srvaddr, sizeof(inet_addr_t));
 	
 	loc_exchange_end(exch);
@@ -144,5 +144,5 @@
 }
 
-int dnsr_set_srvaddr(inet2_addr_t *srvaddr)
+int dnsr_set_srvaddr(inet_addr_t *srvaddr)
 {
 	async_exch_t *exch = dnsr_exchange_begin();
@@ -150,5 +150,5 @@
 	ipc_call_t answer;
 	aid_t req = async_send_0(exch, DNSR_SET_SRVADDR, &answer);
-	int rc = async_data_write_start(exch, srvaddr, sizeof(inet2_addr_t));
+	int rc = async_data_write_start(exch, srvaddr, sizeof(inet_addr_t));
 	
 	loc_exchange_end(exch);
Index: uspace/lib/c/generic/inet.c
===================================================================
--- uspace/lib/c/generic/inet.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/inet.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -107,22 +107,33 @@
 int inet_send(inet_dgram_t *dgram, uint8_t ttl, inet_df_t df)
 {
-	async_exch_t *exch = async_exchange_begin(inet_sess);
-
+	uint32_t src;
+	int rc = inet_addr_pack(&dgram->src, &src);
+	if (rc != EOK)
+		return rc;
+	
+	uint32_t dest;
+	rc = inet_addr_pack(&dgram->dest, &dest);
+	if (rc != EOK)
+		return EOK;
+	
+	async_exch_t *exch = async_exchange_begin(inet_sess);
+	
 	ipc_call_t answer;
-	aid_t req = async_send_5(exch, INET_SEND, dgram->src.ipv4,
-	    dgram->dest.ipv4, dgram->tos, ttl, df, &answer);
-	int rc = async_data_write_start(exch, dgram->data, dgram->size);
-	async_exchange_end(exch);
-
+	aid_t req = async_send_5(exch, INET_SEND, (sysarg_t) src,
+	    (sysarg_t) dest, dgram->tos, ttl, df, &answer);
+	rc = async_data_write_start(exch, dgram->data, dgram->size);
+	
+	async_exchange_end(exch);
+	
 	if (rc != EOK) {
 		async_forget(req);
 		return rc;
 	}
-
+	
 	sysarg_t retval;
 	async_wait_for(req, &retval);
 	if (retval != EOK)
 		return retval;
-
+	
 	return EOK;
 }
@@ -130,22 +141,6 @@
 int inet_get_srcaddr(inet_addr_t *remote, uint8_t tos, inet_addr_t *local)
 {
-	sysarg_t local_addr;
-	async_exch_t *exch = async_exchange_begin(inet_sess);
-
-	int rc = async_req_2_1(exch, INET_GET_SRCADDR, remote->ipv4,
-	    tos, &local_addr);
-	async_exchange_end(exch);
-
-	if (rc != EOK)
-		return rc;
-
-	local->ipv4 = local_addr;
-	return EOK;
-}
-
-int inet2_get_srcaddr(inet2_addr_t *remote, uint8_t tos, inet2_addr_t *local)
-{
 	uint32_t remote_addr;
-	int rc = inet2_addr_pack(remote, &remote_addr);
+	int rc = inet_addr_pack(remote, &remote_addr);
 	if (rc != EOK)
 		return rc;
@@ -162,5 +157,5 @@
 		return rc;
 	
-	inet2_addr_unpack(local_addr, local);
+	inet_addr_unpack(local_addr, local);
 	return EOK;
 }
@@ -170,7 +165,7 @@
 	int rc;
 	inet_dgram_t dgram;
-
-	dgram.src.ipv4 = IPC_GET_ARG1(*call);
-	dgram.dest.ipv4 = IPC_GET_ARG2(*call);
+	
+	inet_addr_unpack(IPC_GET_ARG1(*call), &dgram.src);
+	inet_addr_unpack(IPC_GET_ARG2(*call), &dgram.dest);
 	dgram.tos = IPC_GET_ARG3(*call);
 
Index: uspace/lib/c/generic/inet/addr.c
===================================================================
--- uspace/lib/c/generic/inet/addr.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/inet/addr.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -34,124 +34,321 @@
 
 #include <errno.h>
+#include <unistd.h>
+#include <net/socket_codes.h>
 #include <inet/addr.h>
+#include <net/inet.h>
 #include <stdio.h>
 
+static inet_addr_t inet_addr_any_addr = {
+	.family = AF_INET,
+	.addr = {0, 0, 0, 0}
+};
+
+static inet_addr_t inet_addr_any_addr6 = {
+	.family = AF_INET6,
+	.addr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+};
+
+/** Parse network address family.
+ *
+ * @param text Network address in common notation.
+ * @param af   Place to store network address family.
+ *
+ * @return EOK on success, EINVAL if input is not in valid format.
+ *
+ */
+int inet_addr_family(const char *text, uint16_t *af)
+{
+	char *dot = str_chr(text, '.');
+	if (dot != NULL) {
+		*af = AF_INET;
+		return EOK;
+	}
+	
+	char *collon = str_chr(text, ':');
+	if (collon != NULL) {
+		*af = AF_INET6;
+		return EOK;
+	}
+	
+	*af = AF_NONE;
+	return EINVAL;
+}
+
+/** Parse node address.
+ *
+ * @param text Network address in common notation.
+ * @param addr Place to store node address.
+ *
+ * @return EOK on success, EINVAL if input is not in valid format.
+ *
+ */
+int inet_addr_parse(const char *text, inet_addr_t *addr)
+{
+	int rc = inet_addr_family(text, &addr->family);
+	if (rc != EOK)
+		return rc;
+	
+	rc = inet_pton(addr->family, text, addr->addr);
+	if (rc != EOK)
+		return rc;
+	
+	return EOK;
+}
+
 /** Parse network address.
  *
- * @param text	Network address in CIDR notation (a.b.c.d/w)
- * @param naddr	Place to store network address
- *
- * @return 	EOK on success, EINVAL if input is not in valid format
+ * @param text  Network address in common notation.
+ * @param naddr Place to store network address.
+ *
+ * @return EOK on success, EINVAL if input is not in valid format.
+ *
  */
 int inet_naddr_parse(const char *text, inet_naddr_t *naddr)
 {
-	unsigned long a[4], bits;
-	char *cp = (char *)text;
-	int i;
-
-	for (i = 0; i < 3; i++) {
-		a[i] = strtoul(cp, &cp, 10);
-		if (*cp != '.')
+	char *slash = str_chr(text, '/');
+	if (slash == NULL)
+		return EINVAL;
+	
+	*slash = 0;
+	
+	int rc = inet_addr_family(text, &naddr->family);
+	if (rc != EOK)
+		return rc;
+	
+	rc = inet_pton(naddr->family, text, naddr->addr);
+	*slash = '/';
+	
+	if (rc != EOK)
+		return rc;
+	
+	slash++;
+	
+	switch (naddr->family) {
+	case AF_INET:
+		naddr->prefix = strtoul(slash, &slash, 10);
+		if (naddr->prefix > 32)
 			return EINVAL;
-		++cp;
-	}
-
-	a[3] = strtoul(cp, &cp, 10);
-	if (*cp != '/')
-		return EINVAL;
-	++cp;
-
-	bits = strtoul(cp, &cp, 10);
-	if (*cp != '\0')
-		return EINVAL;
-
-	naddr->ipv4 = 0;
-	for (i = 0; i < 4; i++) {
-		if (a[i] > 255)
+		break;
+	case AF_INET6:
+		naddr->prefix = strtoul(slash, &slash, 10);
+		if (naddr->prefix > 128)
 			return EINVAL;
-		naddr->ipv4 = (naddr->ipv4 << 8) | a[i];
-	}
-
-	if (bits > 31)
-		return EINVAL;
-
-	naddr->bits = bits;
-	return EOK;
-}
-
-/** Parse node address.
- *
- * @param text	Network address in dot notation (a.b.c.d)
- * @param addr	Place to store node address
- *
- * @return 	EOK on success, EINVAL if input is not in valid format
- */
-int inet_addr_parse(const char *text, inet_addr_t *addr)
-{
-	unsigned long a[4];
-	char *cp = (char *)text;
-	int i;
-
-	for (i = 0; i < 3; i++) {
-		a[i] = strtoul(cp, &cp, 10);
-		if (*cp != '.')
-			return EINVAL;
-		++cp;
-	}
-
-	a[3] = strtoul(cp, &cp, 10);
-	if (*cp != '\0')
-		return EINVAL;
-
-	addr->ipv4 = 0;
-	for (i = 0; i < 4; i++) {
-		if (a[i] > 255)
-			return EINVAL;
-		addr->ipv4 = (addr->ipv4 << 8) | a[i];
-	}
-
-	return EOK;
-}
-
-/** Format network address.
- *
- * @param naddr	Network address
- * @param bufp	Place to store pointer to formatted string (CIDR notation)
- *
- * @return 	EOK on success, ENOMEM if out of memory.
- */
-int inet_naddr_format(inet_naddr_t *naddr, char **bufp)
+		break;
+	default:
+		return ENOTSUP;
+	}
+	
+	return EOK;
+}
+
+/** Format node address.
+ *
+ * @param addr Node address.
+ * @param bufp Place to store pointer to formatted string.
+ *
+ * @return EOK on success.
+ * @return ENOMEM if out of memory.
+ * @return ENOTSUP on unsupported address family.
+ *
+ */
+int inet_addr_format(inet_addr_t *addr, char **bufp)
 {
 	int rc;
-
-	rc = asprintf(bufp, "%d.%d.%d.%d/%d", naddr->ipv4 >> 24,
-	    (naddr->ipv4 >> 16) & 0xff, (naddr->ipv4 >> 8) & 0xff,
-	    naddr->ipv4 & 0xff, naddr->bits);
-
+	
+	switch (addr->family) {
+	case AF_NONE:
+		rc = asprintf(bufp, "none");
+		break;
+	case AF_INET:
+		rc = asprintf(bufp, "%u.%u.%u.%u", addr->addr[0],
+		    addr->addr[1], addr->addr[2], addr->addr[3]);
+		break;
+	case AF_INET6:
+		// FIXME TODO
+		break;
+	default:
+		return ENOTSUP;
+	}
+	
 	if (rc < 0)
 		return ENOMEM;
-
-	return EOK;
-}
-
-/** Format node address.
- *
- * @param addr	Node address
- * @param bufp	Place to store pointer to formatted string (dot notation)
- *
- * @return 	EOK on success, ENOMEM if out of memory.
- */
-int inet_addr_format(inet_addr_t *addr, char **bufp)
+	
+	return EOK;
+}
+
+/** Format network address.
+ *
+ * @param naddr Network address.
+ * @param bufp  Place to store pointer to formatted string.
+ *
+ * @return EOK on success.
+ * @return ENOMEM if out of memory.
+ * @return ENOTSUP on unsupported address family.
+ *
+ */
+int inet_naddr_format(inet_naddr_t *naddr, char **bufp)
 {
 	int rc;
-
-	rc = asprintf(bufp, "%d.%d.%d.%d", addr->ipv4 >> 24,
-	    (addr->ipv4 >> 16) & 0xff, (addr->ipv4 >> 8) & 0xff,
-	    addr->ipv4 & 0xff);
-
+	
+	switch (naddr->family) {
+	case AF_NONE:
+		rc = asprintf(bufp, "none");
+		break;
+	case AF_INET:
+		rc = asprintf(bufp, "%u.%u.%u.%u/%u", naddr->addr[0],
+		    naddr->addr[1], naddr->addr[2], naddr->addr[3],
+		    naddr->prefix);
+		break;
+	case AF_INET6:
+		// FIXME TODO
+		break;
+	default:
+		return ENOTSUP;
+	}
+	
 	if (rc < 0)
 		return ENOMEM;
-
-	return EOK;
+	
+	return EOK;
+}
+
+/** Create packed IPv4 address
+ *
+ * Convert an IPv4 address to a packed 32 bit representation.
+ *
+ * @param addr   Source address.
+ * @param packed Place to store the packed 32 bit representation.
+ *
+ * @return EOK on success.
+ * @return EINVAL if addr is not an IPv4 address.
+ *
+ */
+int inet_addr_pack(inet_addr_t *addr, uint32_t *packed)
+{
+	if (addr->family != AF_INET)
+		return EINVAL;
+	
+	*packed = (addr->addr[0] << 24) | (addr->addr[1] << 16) |
+	    (addr->addr[2] << 8) | addr->addr[3];
+	return EOK;
+}
+
+/** Create packed IPv4 address
+ *
+ * Convert an IPv4 address to a packed 32 bit representation.
+ *
+ * @param naddr  Source address.
+ * @param packed Place to store the packed 32 bit representation.
+ * @param prefix Place to store the number of valid bits.
+ *
+ * @return EOK on success.
+ * @return EINVAL if addr is not an IPv4 address.
+ *
+ */
+int inet_naddr_pack(inet_naddr_t *naddr, uint32_t *packed, uint8_t *prefix)
+{
+	if (naddr->family != AF_INET)
+		return EINVAL;
+	
+	*packed = (naddr->addr[0] << 24) | (naddr->addr[1] << 16) |
+	    (naddr->addr[2] << 8) | naddr->addr[3];
+	*prefix = naddr->prefix;
+	
+	return EOK;
+}
+
+void inet_addr_unpack(uint32_t packed, inet_addr_t *addr)
+{
+	addr->family = AF_INET;
+	addr->addr[0] = (packed >> 24) & 0xff;
+	addr->addr[1] = (packed >> 16) & 0xff;
+	addr->addr[2] = (packed >> 8) & 0xff;
+	addr->addr[3] = packed & 0xff;
+}
+
+void inet_naddr_unpack(uint32_t packed, uint8_t prefix, inet_naddr_t *naddr)
+{
+	naddr->family = AF_INET;
+	naddr->addr[0] = (packed >> 24) & 0xff;
+	naddr->addr[1] = (packed >> 16) & 0xff;
+	naddr->addr[2] = (packed >> 8) & 0xff;
+	naddr->addr[3] = packed & 0xff;
+	naddr->prefix = prefix;
+}
+
+int inet_addr_sockaddr_in(inet_addr_t *addr, sockaddr_in_t *sockaddr_in)
+{
+	uint32_t packed;
+	int rc = inet_addr_pack(addr, &packed);
+	if (rc != EOK)
+		return rc;
+	
+	sockaddr_in->sin_family = AF_INET;
+	sockaddr_in->sin_addr.s_addr = host2uint32_t_be(packed);
+	return EOK;
+}
+
+void inet_naddr_addr(inet_naddr_t *naddr, inet_addr_t *addr)
+{
+	addr->family = naddr->family;
+	memcpy(addr->addr, naddr->addr, INET_ADDR_SIZE);
+}
+
+void inet_addr(inet_addr_t *addr, uint8_t a, uint8_t b, uint8_t c, uint8_t d)
+{
+	addr->family = AF_INET;
+	addr->addr[0] = a;
+	addr->addr[1] = b;
+	addr->addr[2] = c;
+	addr->addr[3] = d;
+}
+
+void inet_naddr(inet_naddr_t *naddr, uint8_t a, uint8_t b, uint8_t c, uint8_t d,
+    uint8_t prefix)
+{
+	naddr->family = AF_INET;
+	naddr->addr[0] = a;
+	naddr->addr[1] = b;
+	naddr->addr[2] = c;
+	naddr->addr[3] = d;
+	naddr->prefix = prefix;
+}
+
+void inet_addr_any(inet_addr_t *addr)
+{
+	addr->family = 0;
+	memset(addr->addr, 0, INET_ADDR_SIZE);
+}
+
+void inet_naddr_any(inet_naddr_t *naddr)
+{
+	naddr->family = 0;
+	memset(naddr->addr, 0, INET_ADDR_SIZE);
+	naddr->prefix = 0;
+}
+
+int inet_addr_compare(inet_addr_t *a, inet_addr_t *b)
+{
+	if (a->family != b->family)
+		return 0;
+	
+	switch (a->family) {
+	case AF_INET:
+		return ((a->addr[0] == b->addr[0]) && (a->addr[1] == b->addr[1]) &&
+		    (a->addr[2] == b->addr[2]) && (a->addr[3] == b->addr[3]));
+	case AF_INET6:
+		// FIXME TODO
+		return 0;
+	default:
+		return 0;
+	}
+}
+
+int inet_addr_is_any(inet_addr_t *addr)
+{
+	return ((addr->family == 0) ||
+	    (inet_addr_compare(addr, &inet_addr_any_addr)) ||
+	    (inet_addr_compare(addr, &inet_addr_any_addr6)));
 }
 
Index: uspace/lib/c/generic/inet/addr2.c
===================================================================
--- uspace/lib/c/generic/inet/addr2.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ 	(revision )
@@ -1,372 +1,0 @@
-/*
- * Copyright (c) 2013 Jiri Svoboda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup libc
- * @{
- */
-/** @file Internet address parsing and formatting.
- */
-
-#include <errno.h>
-#include <unistd.h>
-#include <inet/addr2.h>
-#include <net/socket_codes.h>
-#include <net/inet.h>
-#include <stdio.h>
-
-// TODO temporarily
-#include <assert.h>
-
-static inet2_addr_t inet2_addr_any = {
-	.family = AF_INET,
-	.addr = {0, 0, 0, 0}
-};
-
-static inet2_addr_t inet2_addr6_any = {
-	.family = AF_INET6,
-	.addr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-};
-
-/** Parse network address family.
- *
- * @param text Network address in common notation.
- * @param af   Place to store network address family.
- *
- * @return EOK on success, EINVAL if input is not in valid format.
- *
- */
-int inet2_addr_family(const char *text, uint16_t *af)
-{
-	char *dot = str_chr(text, '.');
-	if (dot != NULL) {
-		*af = AF_INET;
-		return EOK;
-	}
-	
-	char *collon = str_chr(text, ':');
-	if (collon != NULL) {
-		*af = AF_INET6;
-		return EOK;
-	}
-	
-	*af = AF_NONE;
-	return EINVAL;
-}
-
-/** Parse node address.
- *
- * @param text Network address in common notation.
- * @param addr Place to store node address.
- *
- * @return EOK on success, EINVAL if input is not in valid format.
- *
- */
-int inet2_addr_parse(const char *text, inet2_addr_t *addr)
-{
-	int rc = inet2_addr_family(text, &addr->family);
-	if (rc != EOK)
-		return rc;
-	
-	rc = inet_pton(addr->family, text, addr->addr);
-	if (rc != EOK)
-		return rc;
-	
-	return EOK;
-}
-
-/** Parse network address.
- *
- * @param text  Network address in common notation.
- * @param naddr Place to store network address.
- *
- * @return EOK on success, EINVAL if input is not in valid format.
- *
- */
-int inet2_naddr_parse(const char *text, inet2_naddr_t *naddr)
-{
-	char *slash = str_chr(text, '/');
-	if (slash == NULL)
-		return EINVAL;
-	
-	*slash = 0;
-	
-	int rc = inet2_addr_family(text, &naddr->family);
-	if (rc != EOK)
-		return rc;
-	
-	rc = inet_pton(naddr->family, text, naddr->addr);
-	*slash = '/';
-	
-	if (rc != EOK)
-		return rc;
-	
-	slash++;
-	
-	switch (naddr->family) {
-	case AF_INET:
-		naddr->prefix = strtoul(slash, &slash, 10);
-		if (naddr->prefix > 32)
-			return EINVAL;
-		break;
-	case AF_INET6:
-		naddr->prefix = strtoul(slash, &slash, 10);
-		if (naddr->prefix > 128)
-			return EINVAL;
-		break;
-	default:
-		return ENOTSUP;
-	}
-	
-	return EOK;
-}
-
-/** Format node address.
- *
- * @param addr Node address.
- * @param bufp Place to store pointer to formatted string.
- *
- * @return EOK on success.
- * @return ENOMEM if out of memory.
- * @return ENOTSUP on unsupported address family.
- *
- */
-int inet2_addr_format(inet2_addr_t *addr, char **bufp)
-{
-	int rc;
-	
-	switch (addr->family) {
-	case AF_NONE:
-		rc = asprintf(bufp, "none");
-		break;
-	case AF_INET:
-		rc = asprintf(bufp, "%u.%u.%u.%u", addr->addr[0],
-		    addr->addr[1], addr->addr[2], addr->addr[3]);
-		break;
-	case AF_INET6:
-		// FIXME TODO
-		break;
-	default:
-		return ENOTSUP;
-	}
-	
-	if (rc < 0)
-		return ENOMEM;
-	
-	return EOK;
-}
-
-/** Format network address.
- *
- * @param naddr Network address.
- * @param bufp  Place to store pointer to formatted string.
- *
- * @return EOK on success.
- * @return ENOMEM if out of memory.
- * @return ENOTSUP on unsupported address family.
- *
- */
-int inet2_naddr_format(inet2_naddr_t *naddr, char **bufp)
-{
-	int rc;
-	
-	switch (naddr->family) {
-	case AF_NONE:
-		rc = asprintf(bufp, "none");
-		break;
-	case AF_INET:
-		rc = asprintf(bufp, "%u.%u.%u.%u/%u", naddr->addr[0],
-		    naddr->addr[1], naddr->addr[2], naddr->addr[3],
-		    naddr->prefix);
-		break;
-	case AF_INET6:
-		// FIXME TODO
-		break;
-	default:
-		return ENOTSUP;
-	}
-	
-	if (rc < 0)
-		return ENOMEM;
-	
-	return EOK;
-}
-
-/** Create packed IPv4 address
- *
- * Convert an IPv4 address to a packed 32 bit representation.
- *
- * @param addr   Source address.
- * @param packed Place to store the packed 32 bit representation.
- *
- * @return EOK on success.
- * @return EINVAL if addr is not an IPv4 address.
- *
- */
-int inet2_addr_pack(inet2_addr_t *addr, uint32_t *packed)
-{
-	if (addr->family != AF_INET)
-		return EINVAL;
-	
-	*packed = (addr->addr[0] << 24) | (addr->addr[1] << 16) |
-	    (addr->addr[2] << 8) | addr->addr[3];
-	return EOK;
-}
-
-/** Create packed IPv4 address
- *
- * Convert an IPv4 address to a packed 32 bit representation.
- *
- * @param naddr  Source address.
- * @param packed Place to store the packed 32 bit representation.
- * @param prefix Place to store the number of valid bits.
- *
- * @return EOK on success.
- * @return EINVAL if addr is not an IPv4 address.
- *
- */
-int inet2_naddr_pack(inet2_naddr_t *naddr, uint32_t *packed, uint8_t *prefix)
-{
-	if (naddr->family != AF_INET)
-		return EINVAL;
-	
-	*packed = (naddr->addr[0] << 24) | (naddr->addr[1] << 16) |
-	    (naddr->addr[2] << 8) | naddr->addr[3];
-	*prefix = naddr->prefix;
-	
-	return EOK;
-}
-
-void inet2_addr_unpack(uint32_t packed, inet2_addr_t *addr)
-{
-	addr->family = AF_INET;
-	addr->addr[0] = (packed >> 24) & 0xff;
-	addr->addr[1] = (packed >> 16) & 0xff;
-	addr->addr[2] = (packed >> 8) & 0xff;
-	addr->addr[3] = packed & 0xff;
-}
-
-void inet2_naddr_unpack(uint32_t packed, uint8_t prefix, inet2_naddr_t *naddr)
-{
-	naddr->family = AF_INET;
-	naddr->addr[0] = (packed >> 24) & 0xff;
-	naddr->addr[1] = (packed >> 16) & 0xff;
-	naddr->addr[2] = (packed >> 8) & 0xff;
-	naddr->addr[3] = packed & 0xff;
-	naddr->prefix = prefix;
-}
-
-int inet2_addr_sockaddr_in(inet2_addr_t *addr, sockaddr_in_t *sockaddr_in)
-{
-	uint32_t packed;
-	int rc = inet2_addr_pack(addr, &packed);
-	if (rc != EOK)
-		return rc;
-	
-	sockaddr_in->sin_family = AF_INET;
-	sockaddr_in->sin_addr.s_addr = host2uint32_t_be(packed);
-	return EOK;
-}
-
-void inet2_naddr_addr(inet2_naddr_t *naddr, inet2_addr_t *addr)
-{
-	addr->family = naddr->family;
-	memcpy(addr->addr, naddr->addr, INET2_ADDR_SIZE);
-}
-
-void inet2_addr(inet2_addr_t *addr, uint8_t a, uint8_t b, uint8_t c, uint8_t d)
-{
-	addr->family = AF_INET;
-	addr->addr[0] = a;
-	addr->addr[1] = b;
-	addr->addr[2] = c;
-	addr->addr[3] = d;
-}
-
-void inet2_naddr(inet2_naddr_t *naddr, uint8_t a, uint8_t b, uint8_t c, uint8_t d,
-    uint8_t prefix)
-{
-	naddr->family = AF_INET;
-	naddr->addr[0] = a;
-	naddr->addr[1] = b;
-	naddr->addr[2] = c;
-	naddr->addr[3] = d;
-	naddr->prefix = prefix;
-}
-
-void inet2_addr_empty(inet2_addr_t *addr)
-{
-	addr->family = 0;
-	memset(addr->addr, 0, INET2_ADDR_SIZE);
-}
-
-void inet2_naddr_empty(inet2_naddr_t *naddr)
-{
-	naddr->family = 0;
-	memset(naddr->addr, 0, INET2_ADDR_SIZE);
-	naddr->prefix = 0;
-}
-
-int inet2_addr_compare(inet2_addr_t *a, inet2_addr_t *b)
-{
-	if (a->family != b->family)
-		return 0;
-	
-	switch (a->family) {
-	case AF_INET:
-		return ((a->addr[0] == b->addr[0]) && (a->addr[1] == b->addr[1]) &&
-		    (a->addr[2] == b->addr[2]) && (a->addr[3] == b->addr[3]));
-	case AF_INET6:
-		// FIXME TODO
-		return 0;
-	default:
-		return 0;
-	}
-}
-
-int inet2_addr_is_any(inet2_addr_t *addr)
-{
-	return ((addr->family == 0) ||
-	    (inet2_addr_compare(addr, &inet2_addr_any)) ||
-	    (inet2_addr_compare(addr, &inet2_addr6_any)));
-}
-
-void inet_inet2(inet_addr_t *addr, inet2_addr_t *addr2)
-{
-	// TODO temporarily
-	inet2_addr_unpack(addr->ipv4, addr2);
-}
-
-void inet2_inet(inet2_addr_t *addr2, inet_addr_t *addr)
-{
-	// TODO temporarily
-	assert(addr2->family == AF_INET);
-	inet2_addr_pack(addr2, &addr->ipv4);
-}
-
-/** @}
- */
Index: uspace/lib/c/generic/inetcfg.c
===================================================================
--- uspace/lib/c/generic/inetcfg.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/inetcfg.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -136,21 +136,27 @@
     sysarg_t link_id, sysarg_t *addr_id)
 {
-	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
-
-	ipc_call_t answer;
-	aid_t req = async_send_3(exch, INETCFG_ADDR_CREATE_STATIC, naddr->ipv4,
-	    naddr->bits, link_id, &answer);
+	uint32_t naddr_addr;
+	uint8_t naddr_bits;
+	int rc = inet_naddr_pack(naddr, &naddr_addr, &naddr_bits);
+	if (rc != EOK)
+		return rc;
+	
+	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
+	
+	ipc_call_t answer;
+	aid_t req = async_send_3(exch, INETCFG_ADDR_CREATE_STATIC,
+	    (sysarg_t) naddr_addr, (sysarg_t) naddr_bits, link_id, &answer);
 	sysarg_t retval = async_data_write_start(exch, name, str_size(name));
-
-	async_exchange_end(exch);
-
-	if (retval != EOK) {
-		async_forget(req);
-		return retval;
-	}
-
+	
+	async_exchange_end(exch);
+	
+	if (retval != EOK) {
+		async_forget(req);
+		return retval;
+	}
+	
 	async_wait_for(req, &retval);
 	*addr_id = IPC_GET_ARG1(answer);
-
+	
 	return retval;
 }
@@ -196,7 +202,7 @@
 	assert(act_size <= LOC_NAME_MAXLEN);
 	name_buf[act_size] = '\0';
-
-	ainfo->naddr.ipv4 = IPC_GET_ARG1(answer);
-	ainfo->naddr.bits = IPC_GET_ARG2(answer);
+	
+	inet_naddr_unpack(IPC_GET_ARG1(answer), IPC_GET_ARG2(answer),
+	    &ainfo->naddr);
 	ainfo->ilink = IPC_GET_ARG3(answer);
 	ainfo->name = str_dup(name_buf);
@@ -284,21 +290,33 @@
     inet_addr_t *router, sysarg_t *sroute_id)
 {
-	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
-
+	uint32_t dest_addr;
+	uint8_t dest_bits;
+	int rc = inet_naddr_pack(dest, &dest_addr, &dest_bits);
+	if (rc != EOK)
+		return rc;
+	
+	uint32_t router_addr;
+	rc = inet_addr_pack(router, &router_addr);
+	if (rc != EOK)
+		return rc;
+	
+	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
+	
 	ipc_call_t answer;
 	aid_t req = async_send_3(exch, INETCFG_SROUTE_CREATE,
-	    dest->ipv4, dest->bits, router->ipv4, &answer);
+	    (sysarg_t) dest_addr, (sysarg_t) dest_bits, (sysarg_t) router_addr,
+	    &answer);
 	sysarg_t retval = async_data_write_start(exch, name, str_size(name));
-
-	async_exchange_end(exch);
-
-	if (retval != EOK) {
-		async_forget(req);
-		return retval;
-	}
-
+	
+	async_exchange_end(exch);
+	
+	if (retval != EOK) {
+		async_forget(req);
+		return retval;
+	}
+	
 	async_wait_for(req, &retval);
 	*sroute_id = IPC_GET_ARG1(answer);
-
+	
 	return retval;
 }
@@ -345,7 +363,7 @@
 	name_buf[act_size] = '\0';
 
-	srinfo->dest.ipv4 = IPC_GET_ARG1(answer);
-	srinfo->dest.bits = IPC_GET_ARG2(answer);
-	srinfo->router.ipv4 = IPC_GET_ARG3(answer);
+	inet_naddr_unpack(IPC_GET_ARG1(answer), IPC_GET_ARG2(answer),
+	    &srinfo->dest);
+	inet_addr_unpack(IPC_GET_ARG3(answer), &srinfo->router);
 	srinfo->name = str_dup(name_buf);
 
Index: uspace/lib/c/generic/iplink.c
===================================================================
--- uspace/lib/c/generic/iplink.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/iplink.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -39,4 +39,5 @@
 #include <errno.h>
 #include <inet/iplink.h>
+#include <inet/addr.h>
 #include <ipc/iplink.h>
 #include <ipc/services.h>
@@ -83,21 +84,22 @@
 {
 	async_exch_t *exch = async_exchange_begin(iplink->sess);
-
+	
 	ipc_call_t answer;
-	aid_t req = async_send_2(exch, IPLINK_SEND, sdu->lsrc.ipv4,
-	    sdu->ldest.ipv4, &answer);
+	aid_t req = async_send_2(exch, IPLINK_SEND, (sysarg_t) sdu->lsrc,
+	    (sysarg_t) sdu->ldest, &answer);
 	int rc = async_data_write_start(exch, sdu->data, sdu->size);
+	
 	async_exchange_end(exch);
-
+	
 	if (rc != EOK) {
 		async_forget(req);
 		return rc;
 	}
-
+	
 	sysarg_t retval;
 	async_wait_for(req, &retval);
 	if (retval != EOK)
 		return retval;
-
+	
 	return EOK;
 }
@@ -118,21 +120,29 @@
 }
 
-int iplink_addr_add(iplink_t *iplink, iplink_addr_t *addr)
+int iplink_addr_add(iplink_t *iplink, inet_addr_t *addr)
 {
+	uint32_t addr_addr;
+	int rc = inet_addr_pack(addr, &addr_addr);
+	if (rc != EOK)
+		return rc;
+	
 	async_exch_t *exch = async_exchange_begin(iplink->sess);
-
-	int rc = async_req_1_0(exch, IPLINK_ADDR_ADD, (sysarg_t)addr->ipv4);
+	rc = async_req_1_0(exch, IPLINK_ADDR_ADD, (sysarg_t) addr_addr);
 	async_exchange_end(exch);
-
+	
 	return rc;
 }
 
-int iplink_addr_remove(iplink_t *iplink, iplink_addr_t *addr)
+int iplink_addr_remove(iplink_t *iplink, inet_addr_t *addr)
 {
+	uint32_t addr_addr;
+	int rc = inet_addr_pack(addr, &addr_addr);
+	if (rc != EOK)
+		return rc;
+	
 	async_exch_t *exch = async_exchange_begin(iplink->sess);
-
-	int rc = async_req_1_0(exch, IPLINK_ADDR_REMOVE, (sysarg_t)addr->ipv4);
+	rc = async_req_1_0(exch, IPLINK_ADDR_REMOVE, (sysarg_t) addr_addr);
 	async_exchange_end(exch);
-
+	
 	return rc;
 }
@@ -141,16 +151,15 @@
     ipc_call_t *call)
 {
-	int rc;
 	iplink_sdu_t sdu;
-
-	sdu.lsrc.ipv4 = IPC_GET_ARG1(*call);
-	sdu.ldest.ipv4 = IPC_GET_ARG2(*call);
-
-	rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
+	
+	sdu.lsrc = IPC_GET_ARG1(*call);
+	sdu.ldest = IPC_GET_ARG2(*call);
+	
+	int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
 	if (rc != EOK) {
 		async_answer_0(callid, rc);
 		return;
 	}
-
+	
 	rc = iplink->ev_ops->recv(iplink, &sdu);
 	free(sdu.data);
Index: uspace/lib/c/generic/iplink_srv.c
===================================================================
--- uspace/lib/c/generic/iplink_srv.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/iplink_srv.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -54,10 +54,5 @@
     ipc_call_t *call)
 {
-	int rc;
-	iplink_srv_addr_t addr;
-
-	addr.ipv4 = IPC_GET_ARG1(*call);
-
-	rc = srv->ops->addr_add(srv, &addr);
+	int rc = srv->ops->addr_add(srv, IPC_GET_ARG1(*call));
 	async_answer_0(callid, rc);
 }
@@ -66,10 +61,5 @@
     ipc_call_t *call)
 {
-	int rc;
-	iplink_srv_addr_t addr;
-
-	addr.ipv4 = IPC_GET_ARG1(*call);
-
-	rc = srv->ops->addr_remove(srv, &addr);
+	int rc = srv->ops->addr_remove(srv, IPC_GET_ARG1(*call));
 	async_answer_0(callid, rc);
 }
@@ -81,6 +71,6 @@
 	int rc;
 
-	sdu.lsrc.ipv4 = IPC_GET_ARG1(*call);
-	sdu.ldest.ipv4 = IPC_GET_ARG2(*call);
+	sdu.lsrc = IPC_GET_ARG1(*call);
+	sdu.ldest = IPC_GET_ARG2(*call);
 
 	rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);
@@ -139,7 +129,7 @@
 		if (!method) {
 			/* The other side has hung up */
-		    	fibril_mutex_lock(&srv->lock);
+			fibril_mutex_lock(&srv->lock);
 			srv->connected = false;
-		    	fibril_mutex_unlock(&srv->lock);
+			fibril_mutex_unlock(&srv->lock);
 			async_answer_0(callid, EOK);
 			break;
@@ -175,6 +165,6 @@
 
 	ipc_call_t answer;
-	aid_t req = async_send_2(exch, IPLINK_EV_RECV, sdu->lsrc.ipv4,
-	    sdu->ldest.ipv4, &answer);
+	aid_t req = async_send_2(exch, IPLINK_EV_RECV, (sysarg_t) sdu->lsrc,
+	    (sysarg_t) sdu->ldest, &answer);
 	int rc = async_data_write_start(exch, sdu->data, sdu->size);
 	async_exchange_end(exch);
Index: uspace/lib/c/generic/net/inet.c
===================================================================
--- uspace/lib/c/generic/net/inet.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/net/inet.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -39,5 +39,5 @@
 #include <net/in6.h>
 #include <net/inet.h>
-
+#include <inet/addr.h>
 #include <errno.h>
 #include <mem.h>
Index: uspace/lib/c/generic/net/socket_client.c
===================================================================
--- uspace/lib/c/generic/net/socket_client.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/net/socket_client.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -87,4 +87,6 @@
 	/** Parent module service. */
 	services_t service;
+	/** Socket family */
+	int family;
 
 	/**
@@ -395,4 +397,5 @@
 	switch (domain) {
 	case PF_INET:
+	case PF_INET6:
 		switch (type) {
 		case SOCK_STREAM:
@@ -433,5 +436,4 @@
 		break;
 
-	case PF_INET6:
 	default:
 		return EPFNOSUPPORT;
@@ -447,4 +449,5 @@
 
 	memset(socket, 0, sizeof(*socket));
+	socket->family = domain;
 	fibril_rwlock_write_lock(&socket_globals.lock);
 
Index: uspace/lib/c/generic/net/socket_parse.c
===================================================================
--- uspace/lib/c/generic/net/socket_parse.c	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/generic/net/socket_parse.c	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -79,11 +79,11 @@
 int socket_parse_protocol_family(const char *name, int *pf)
 {
+	if (str_lcmp(name, "PF_INET6", 8) == 0) {
+		*pf = PF_INET6;
+		return EOK;
+	}
+
 	if (str_lcmp(name, "PF_INET", 7) == 0) {
 		*pf = PF_INET;
-		return EOK;
-	}
-	
-	if (str_lcmp(name, "PF_INET6", 8) == 0) {
-		*pf = PF_INET6;
 		return EOK;
 	}
Index: uspace/lib/c/include/inet/addr.h
===================================================================
--- uspace/lib/c/include/inet/addr.h	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/include/inet/addr.h	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -37,22 +37,52 @@
 
 #include <stdint.h>
+#include <net/in.h>
+
+#define INET_ADDR_SIZE  16
 
 /** Node address */
 typedef struct {
-	uint32_t ipv4;
+	uint16_t family;
+	uint8_t addr[INET_ADDR_SIZE];
 } inet_addr_t;
 
 /** Network address */
 typedef struct {
+	/** Address family */
+	uint16_t family;
+	
 	/** Address */
-	uint32_t ipv4;
-	/** Number of valid bits in @c ipv4 */
-	int bits;
+	uint8_t addr[INET_ADDR_SIZE];
+	
+	/** Number of valid bits */
+	uint8_t prefix;
 } inet_naddr_t;
 
+extern int inet_addr_family(const char *, uint16_t *);
+
+extern int inet_addr_parse(const char *, inet_addr_t *);
 extern int inet_naddr_parse(const char *, inet_naddr_t *);
-extern int inet_addr_parse(const char *, inet_addr_t *);
+
+extern int inet_addr_format(inet_addr_t *, char **);
 extern int inet_naddr_format(inet_naddr_t *, char **);
-extern int inet_addr_format(inet_addr_t *, char **);
+
+extern int inet_addr_pack(inet_addr_t *, uint32_t *);
+extern int inet_naddr_pack(inet_naddr_t *, uint32_t *, uint8_t *);
+
+extern void inet_addr_unpack(uint32_t, inet_addr_t *);
+extern void inet_naddr_unpack(uint32_t, uint8_t, inet_naddr_t *);
+
+extern int inet_addr_sockaddr_in(inet_addr_t *, sockaddr_in_t *);
+extern void inet_naddr_addr(inet_naddr_t *, inet_addr_t *);
+
+extern void inet_addr(inet_addr_t *, uint8_t, uint8_t, uint8_t, uint8_t);
+extern void inet_naddr(inet_naddr_t *, uint8_t, uint8_t, uint8_t, uint8_t,
+    uint8_t);
+
+extern void inet_addr_any(inet_addr_t *);
+extern void inet_naddr_any(inet_naddr_t *);
+
+extern int inet_addr_compare(inet_addr_t *, inet_addr_t *);
+extern int inet_addr_is_any(inet_addr_t *);
 
 #endif
Index: uspace/lib/c/include/inet/addr2.h
===================================================================
--- uspace/lib/c/include/inet/addr2.h	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ 	(revision )
@@ -1,95 +1,0 @@
-/*
- * Copyright (c) 2013 Jiri Svoboda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup libc
- * @{
- */
-/** @file
- */
-
-#ifndef LIBC_INET2_ADDR_H_
-#define LIBC_INET2_ADDR_H_
-
-#include <stdint.h>
-#include <net/in.h>
-#include <inet/addr.h>
-
-#define INET2_ADDR_SIZE  16
-
-/** Node address */
-typedef struct {
-	uint16_t family;
-	uint8_t addr[INET2_ADDR_SIZE];
-} inet2_addr_t;
-
-/** Network address */
-typedef struct {
-	/** Address family */
-	uint16_t family;
-	
-	/** Address */
-	uint8_t addr[INET2_ADDR_SIZE];
-	
-	/** Number of valid bits */
-	uint8_t prefix;
-} inet2_naddr_t;
-
-extern int inet2_addr_family(const char *, uint16_t *);
-
-extern int inet2_addr_parse(const char *, inet2_addr_t *);
-extern int inet2_naddr_parse(const char *, inet2_naddr_t *);
-
-extern int inet2_addr_format(inet2_addr_t *, char **);
-extern int inet2_naddr_format(inet2_naddr_t *, char **);
-
-extern int inet2_addr_pack(inet2_addr_t *, uint32_t *);
-extern int inet2_naddr_pack(inet2_naddr_t *, uint32_t *, uint8_t *);
-
-extern void inet2_addr_unpack(uint32_t, inet2_addr_t *);
-extern void inet2_naddr_unpack(uint32_t, uint8_t, inet2_naddr_t *);
-
-extern int inet2_addr_sockaddr_in(inet2_addr_t *, sockaddr_in_t *);
-extern void inet2_naddr_addr(inet2_naddr_t *, inet2_addr_t *);
-
-extern void inet2_addr(inet2_addr_t *, uint8_t, uint8_t, uint8_t, uint8_t);
-extern void inet2_naddr(inet2_naddr_t *, uint8_t, uint8_t, uint8_t, uint8_t,
-    uint8_t);
-
-extern void inet2_addr_empty(inet2_addr_t *);
-extern void inet2_naddr_empty(inet2_naddr_t *);
-
-extern int inet2_addr_compare(inet2_addr_t *, inet2_addr_t *);
-extern int inet2_addr_is_any(inet2_addr_t *);
-
-extern void inet_inet2(inet_addr_t *, inet2_addr_t *);
-extern void inet2_inet(inet2_addr_t *, inet_addr_t *);
-
-#endif
-
-/** @}
- */
Index: uspace/lib/c/include/inet/dnsr.h
===================================================================
--- uspace/lib/c/include/inet/dnsr.h	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/include/inet/dnsr.h	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -37,5 +37,5 @@
 
 #include <inet/inet.h>
-#include <inet/addr2.h>
+#include <inet/addr.h>
 
 enum {
@@ -47,5 +47,5 @@
 	char *cname;
 	/** Host address */
-	inet2_addr_t addr;
+	inet_addr_t addr;
 } dnsr_hostinfo_t;
 
@@ -53,6 +53,6 @@
 extern int dnsr_name2host(const char *, dnsr_hostinfo_t **);
 extern void dnsr_hostinfo_destroy(dnsr_hostinfo_t *);
-extern int dnsr_get_srvaddr(inet2_addr_t *);
-extern int dnsr_set_srvaddr(inet2_addr_t *);
+extern int dnsr_get_srvaddr(inet_addr_t *);
+extern int dnsr_set_srvaddr(inet_addr_t *);
 
 #endif
Index: uspace/lib/c/include/inet/inet.h
===================================================================
--- uspace/lib/c/include/inet/inet.h	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/include/inet/inet.h	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -37,5 +37,4 @@
 
 #include <inet/addr.h>
-#include <inet/addr2.h>
 #include <sys/types.h>
 
@@ -61,5 +60,4 @@
 extern int inet_send(inet_dgram_t *, uint8_t, inet_df_t);
 extern int inet_get_srcaddr(inet_addr_t *, uint8_t, inet_addr_t *);
-extern int inet2_get_srcaddr(inet2_addr_t *, uint8_t, inet2_addr_t *);
 
 #endif
Index: uspace/lib/c/include/inet/iplink.h
===================================================================
--- uspace/lib/c/include/inet/iplink.h	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/include/inet/iplink.h	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -38,4 +38,5 @@
 #include <async.h>
 #include <sys/types.h>
+#include <inet/addr.h>
 
 struct iplink_ev_ops;
@@ -46,14 +47,10 @@
 } iplink_t;
 
-typedef struct {
-	uint32_t ipv4;
-} iplink_addr_t;
-
-/** IP link Service Data Unit */
+/** IPv4 link Service Data Unit */
 typedef struct {
 	/** Local source address */
-	iplink_addr_t lsrc;
+	uint32_t lsrc;
 	/** Local destination address */
-	iplink_addr_t ldest;
+	uint32_t ldest;
 	/** Serialized IP packet */
 	void *data;
@@ -61,4 +58,14 @@
 	size_t size;
 } iplink_sdu_t;
+
+/** IPv6 link Service Data Unit */
+typedef struct {
+	/** Target MAC address */
+	uint64_t hwaddr;
+	/** Serialized IP packet */
+	void *data;
+	/** Size of @c data in bytes */
+	size_t size;
+} iplink_sdu6_t;
 
 typedef struct iplink_ev_ops {
@@ -69,6 +76,6 @@
 extern void iplink_close(iplink_t *);
 extern int iplink_send(iplink_t *, iplink_sdu_t *);
-extern int iplink_addr_add(iplink_t *, iplink_addr_t *);
-extern int iplink_addr_remove(iplink_t *, iplink_addr_t *);
+extern int iplink_addr_add(iplink_t *, inet_addr_t *);
+extern int iplink_addr_remove(iplink_t *, inet_addr_t *);
 extern int iplink_get_mtu(iplink_t *, size_t *);
 
Index: uspace/lib/c/include/inet/iplink_srv.h
===================================================================
--- uspace/lib/c/include/inet/iplink_srv.h	(revision 19a4f73d732eaf01d22b3fdcb5c730406666b0d6)
+++ uspace/lib/c/include/inet/iplink_srv.h	(revision ddb19223d2e83c063941607b0ecd5b92d3038f64)
@@ -51,14 +51,10 @@
 } iplink_srv_t;
 
-typedef struct {
-	uint32_t ipv4;
-} iplink_srv_addr_t;
-
 /** IP link Service Data Unit */
 typedef struct {
 	/** Local source address */
-	iplink_srv_addr_t lsrc;
+	uint32_t lsrc;
 	/** Local destination address */
-	iplink_srv_addr_t ldest;
+	uint32_t ldest;
 	/** Serialized IP packet */
 	void *data;
@@ -72,6 +68,6 @@
 	int (*send)(iplink_srv_t *, iplink_srv_sdu_t *);
 	int (*get_mtu)(iplink_srv_t *, size_t *);
-	int (*addr_add)(iplink_srv_t *, iplink_srv_addr_t *);
-	int (*addr_remove)(iplink_srv_t *, iplink_srv_addr_t *);
+	int (*addr_add)(iplink_srv_t *, uint32_t);
+	int (*addr_remove)(iplink_srv_t *, uint32_t);
 } iplink_ops_t;
 
