Index: boot/Makefile.common
===================================================================
--- boot/Makefile.common	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
+++ boot/Makefile.common	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -156,4 +156,5 @@
 	$(USPACE_PATH)/app/edit/edit \
 	$(USPACE_PATH)/app/ext2info/ext2info \
+	$(USPACE_PATH)/app/inetcfg/inetcfg \
 	$(USPACE_PATH)/app/kill/kill \
 	$(USPACE_PATH)/app/killall/killall \
Index: uspace/Makefile
===================================================================
--- uspace/Makefile	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
+++ uspace/Makefile	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -42,4 +42,5 @@
 	app/getterm \
 	app/init \
+	app/inetcfg \
 	app/kill \
 	app/killall \
Index: uspace/app/inetcfg/Makefile
===================================================================
--- uspace/app/inetcfg/Makefile	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/app/inetcfg/Makefile	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2012 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.
+#
+
+USPACE_PREFIX = ../..
+BINARY = inetcfg
+
+SOURCES = \
+	inetcfg.c
+
+include $(USPACE_PREFIX)/Makefile.common
Index: uspace/app/inetcfg/inetcfg.c
===================================================================
--- uspace/app/inetcfg/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/app/inetcfg/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2012 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 inetcfg
+ * @{
+ */
+/** @file Internet configuration utility.
+ *
+ * Controls the internet service (@c inet).
+ */
+
+#include <async.h>
+#include <errno.h>
+#include <inet/inetcfg.h>
+#include <stdio.h>
+#include <str_error.h>
+#include <sys/types.h>
+
+#define NAME "inetcfg"
+
+static void print_syntax(void)
+{
+	printf("syntax: " NAME " xxx\n");
+}
+
+int main(int argc, char *argv[])
+{
+	int rc;
+	inet_naddr_t naddr;
+	sysarg_t addr_id;
+
+	if (argc > 1) {
+		printf(NAME ": Invalid argument '%s'.\n", argv[1]);
+		print_syntax();
+		return 1;
+	}
+
+	printf("initialize\n");
+
+	rc = inetcfg_init();
+	if (rc != EOK) {
+		printf(NAME ": Failed connecting to internet service (%d).\n",
+		    rc);
+		return 1;
+	}
+
+	printf("sleep\n");
+	async_usleep(10*1000*1000);
+	printf("create static addr\n");
+
+	rc = inetcfg_addr_create_static("v4s", &naddr, &addr_id);
+	if (rc != EOK) {
+		printf(NAME ": Failed creating static address '%s' (%d)\n",
+		    "v4s", rc);
+		return 1;
+	}
+
+	printf("Success!\n");
+	return 0;
+}
+
+/** @}
+ */
Index: uspace/lib/c/Makefile
===================================================================
--- uspace/lib/c/Makefile	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
+++ uspace/lib/c/Makefile	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -88,4 +88,5 @@
 	generic/futex.c \
 	generic/inet.c \
+	generic/inetcfg.c \
 	generic/io/asprintf.c \
 	generic/io/io.c \
Index: uspace/lib/c/generic/inetcfg.c
===================================================================
--- uspace/lib/c/generic/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/lib/c/generic/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2012 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.
+ */
+
+#include <async.h>
+#include <assert.h>
+#include <errno.h>
+#include <inet/inetcfg.h>
+#include <ipc/inet.h>
+#include <ipc/services.h>
+#include <loc.h>
+#include <stdlib.h>
+
+static async_sess_t *inetcfg_sess = NULL;
+
+static int inetcfg_get_ids_once(sysarg_t method, sysarg_t arg1,
+    sysarg_t *id_buf, size_t buf_size, size_t *act_size)
+{
+	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
+
+	ipc_call_t answer;
+	aid_t req = async_send_1(exch, method, arg1, &answer);
+	int rc = async_data_read_start(exch, id_buf, buf_size);
+
+	async_exchange_end(exch);
+
+	if (rc != EOK) {
+		async_wait_for(req, NULL);
+		return rc;
+	}
+
+	sysarg_t retval;
+	async_wait_for(req, &retval);
+
+	if (retval != EOK) {
+		return retval;
+	}
+
+	*act_size = IPC_GET_ARG1(answer);
+	return EOK;
+}
+
+/** Get list of IDs.
+ *
+ * Returns an allocated array of service IDs.
+ *
+ * @param method	IPC method
+ * @param arg1		IPC argument 1
+ * @param data		Place to store pointer to array of IDs
+ * @param count		Place to store number of IDs
+ * @return 		EOK on success or negative error code
+ */
+static int inetcfg_get_ids_internal(sysarg_t method, sysarg_t arg1,
+    sysarg_t **data, size_t *count)
+{
+	*data = NULL;
+	*count = 0;
+
+	size_t act_size = 0;
+	int rc = inetcfg_get_ids_once(method, arg1, NULL, 0,
+	    &act_size);
+	if (rc != EOK)
+		return rc;
+
+	size_t alloc_size = act_size;
+	service_id_t *ids = malloc(alloc_size);
+	if (ids == NULL)
+		return ENOMEM;
+
+	while (true) {
+		rc = inetcfg_get_ids_once(method, arg1, ids, alloc_size,
+		    &act_size);
+		if (rc != EOK)
+			return rc;
+
+		if (act_size <= alloc_size)
+			break;
+
+		alloc_size = act_size;
+		ids = realloc(ids, alloc_size);
+		if (ids == NULL)
+			return ENOMEM;
+	}
+
+	*count = act_size / sizeof(sysarg_t);
+	*data = ids;
+	return EOK;
+}
+
+int inetcfg_init(void)
+{
+	service_id_t inet_svc;
+	int rc;
+
+	assert(inetcfg_sess == NULL);
+
+	rc = loc_service_get_id(SERVICE_NAME_INETCFG, &inet_svc,
+	    IPC_FLAG_BLOCKING);
+	if (rc != EOK)
+		return ENOENT;
+
+	inetcfg_sess = loc_service_connect(EXCHANGE_SERIALIZE, inet_svc,
+	    IPC_FLAG_BLOCKING);
+	if (inetcfg_sess == NULL)
+		return ENOENT;
+
+	return EOK;
+}
+
+int inetcfg_addr_create_static(const char *name, inet_naddr_t *naddr,
+    sysarg_t *addr_id)
+{
+	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
+
+	int rc = async_req_2_1(exch, INETCFG_ADDR_CREATE_STATIC, naddr->ipv4,
+	    naddr->bits, addr_id);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
+int inetcfg_addr_delete(sysarg_t addr_id)
+{
+	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
+
+	int rc = async_req_1_0(exch, INETCFG_ADDR_DELETE, addr_id);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
+int inetcfg_addr_get(sysarg_t addr_id, inet_addr_info_t *ainfo)
+{
+	sysarg_t ipv4, bits;
+	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
+
+	int rc = async_req_1_2(exch, INETCFG_ADDR_GET, addr_id,
+	    &ipv4, &bits);
+	async_exchange_end(exch);
+
+	if (rc != EOK)
+		return rc;
+
+	ainfo->naddr.ipv4 = ipv4;
+	ainfo->naddr.bits = bits;
+	return EOK;
+}
+
+int inetcfg_get_addr_list(sysarg_t **addrs, size_t *count)
+{
+	return inetcfg_get_ids_internal(INETCFG_GET_ADDR_LIST,
+	    0, addrs, count);
+}
+
+int inetcfg_get_link_list(sysarg_t **links, size_t *count)
+{
+	return inetcfg_get_ids_internal(INETCFG_GET_LINK_LIST,
+	    0, links, count);
+}
+
+int inetcfg_link_get(sysarg_t link_id, inet_link_info_t *linfo)
+{
+	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
+
+	int rc = async_req_1_0(exch, INETCFG_LINK_GET, link_id);
+	async_exchange_end(exch);
+
+	if (rc != EOK)
+		return rc;
+
+	linfo->dummy = 0;
+	return EOK;
+}
+
+/** @}
+ */
Index: uspace/lib/c/include/inet/inetcfg.h
===================================================================
--- uspace/lib/c/include/inet/inetcfg.h	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/lib/c/include/inet/inetcfg.h	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2012 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_INET_INETCFG_H_
+#define LIBC_INET_INETCFG_H_
+
+#include <inet/inet.h>
+#include <sys/types.h>
+
+/** Network address */
+typedef struct {
+	/** Address */
+	uint32_t ipv4;
+	/** Number of valid bits in @c ipv4 */
+	int bits;
+} inet_naddr_t;
+
+/** Address object info */
+typedef struct {
+	/** Network address */
+	inet_naddr_t naddr;
+} inet_addr_info_t;
+
+/** IP link info */
+typedef struct {
+	int dummy;
+} inet_link_info_t;
+
+extern int inetcfg_init(void);
+extern int inetcfg_addr_create_static(const char *, inet_naddr_t *, sysarg_t *);
+extern int inetcfg_addr_delete(sysarg_t);
+extern int inetcfg_addr_get(sysarg_t, inet_addr_info_t *);
+extern int inetcfg_get_addr_list(sysarg_t **, size_t *);
+extern int inetcfg_get_link_list(sysarg_t **, size_t *);
+extern int inetcfg_link_get(sysarg_t, inet_link_info_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/c/include/ipc/inet.h
===================================================================
--- uspace/lib/c/include/ipc/inet.h	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
+++ uspace/lib/c/include/ipc/inet.h	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -38,4 +38,13 @@
 #include <ipc/common.h>
 
+/** Inet ports */
+typedef enum {
+	/** Default port */
+	INET_PORT_DEFAULT = 1,
+	/** Configuration port */
+	INET_PORT_CFG
+} inet_port_t;
+
+/** Requests on Inet default port */
 typedef enum {
 	INET_CALLBACK_CREATE = IPC_FIRST_USER_METHOD,
@@ -45,7 +54,18 @@
 } inet_request_t;
 
+/** Events on Inet default port */
 typedef enum {
 	INET_EV_RECV = IPC_FIRST_USER_METHOD
 } inet_event_t;
+
+/** Requests on Inet configuration port */
+typedef enum {
+	INETCFG_ADDR_CREATE_STATIC = IPC_FIRST_USER_METHOD,
+	INETCFG_ADDR_DELETE,
+	INETCFG_ADDR_GET,
+	INETCFG_GET_ADDR_LIST,
+	INETCFG_GET_LINK_LIST,
+	INETCFG_LINK_GET,
+} inetcfg_request_t;
 
 #endif
Index: uspace/lib/c/include/ipc/services.h
===================================================================
--- uspace/lib/c/include/ipc/services.h	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
+++ uspace/lib/c/include/ipc/services.h	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -52,5 +52,6 @@
 } services_t;
 
-#define SERVICE_NAME_INET "net/inet"
+#define SERVICE_NAME_INET    "net/inet"
+#define SERVICE_NAME_INETCFG "net/inetcfg"
 
 #endif
Index: uspace/srv/inet/Makefile
===================================================================
--- uspace/srv/inet/Makefile	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
+++ uspace/srv/inet/Makefile	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -34,4 +34,5 @@
 	inet.c \
 	inet_link.c \
+	inetcfg.c \
 	pdu.c
 
Index: uspace/srv/inet/inet.c
===================================================================
--- uspace/srv/inet/inet.c	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
+++ uspace/srv/inet/inet.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -49,4 +49,5 @@
 #include "addrobj.h"
 #include "inet.h"
+#include "inetcfg.h"
 #include "inet_link.h"
 
@@ -73,5 +74,13 @@
 	}
 
-	rc = loc_service_register(SERVICE_NAME_INET, &sid);
+	rc = loc_service_register_with_iface(SERVICE_NAME_INET, &sid,
+	    INET_PORT_DEFAULT);
+	if (rc != EOK) {
+		log_msg(LVL_ERROR, "Failed registering service (%d).", rc);
+		return EEXIST;
+	}
+
+	rc = loc_service_register_with_iface(SERVICE_NAME_INETCFG, &sid,
+	    INET_PORT_CFG);
 	if (rc != EOK) {
 		log_msg(LVL_ERROR, "Failed registering service (%d).", rc);
@@ -220,9 +229,9 @@
 }
 
-static void inet_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
+static void inet_default_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
 {
 	inet_client_t client;
 
-	log_msg(LVL_DEBUG, "inet_client_conn()");
+	log_msg(LVL_DEBUG, "inet_default_conn()");
 
 	/* Accept the connection */
@@ -263,4 +272,28 @@
 }
 
+static void inet_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
+{
+	sysarg_t port;
+
+	log_msg(LVL_DEBUG, "inet_client_conn(%d, %d, %d)",
+	(int)IPC_GET_ARG1(*icall), (int)IPC_GET_ARG2(*icall),
+	(int)IPC_GET_ARG3(*icall));
+
+	port = IPC_GET_ARG1(*icall);
+
+	switch (port) {
+	case INET_PORT_DEFAULT:
+		inet_default_conn(iid, icall, arg);
+		break;
+	case INET_PORT_CFG:
+		inet_cfg_conn(iid, icall, arg);
+		break;
+	default:
+		printf("uknown port number %d\n", port);
+		async_answer_0(iid, ENOTSUP);
+		break;
+	}
+}
+
 static inet_client_t *inet_client_find(uint8_t proto)
 {
Index: uspace/srv/inet/inet.h
===================================================================
--- uspace/srv/inet/inet.h	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
+++ uspace/srv/inet/inet.h	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -64,4 +64,15 @@
 } inet_naddr_t;
 
+/** Address object info */
+typedef struct {
+	/** Network address */
+	inet_naddr_t naddr;
+} inet_addr_info_t;
+
+/** IP link info */
+typedef struct {
+	int dummy;
+} inet_link_info_t;
+
 typedef struct {
 	inet_addr_t src;
Index: uspace/srv/inet/inetcfg.c
===================================================================
--- uspace/srv/inet/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/srv/inet/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2012 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 inet
+ * @{
+ */
+/**
+ * @file
+ * @brief
+ */
+
+#include <adt/list.h>
+#include <async.h>
+#include <errno.h>
+#include <macros.h>
+#include <fibril_synch.h>
+#include <io/log.h>
+#include <ipc/inet.h>
+#include <ipc/services.h>
+#include <loc.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include "inet.h"
+#include "inetcfg.h"
+
+static int inetcfg_addr_create_static(inet_naddr_t *naddr, sysarg_t *addr_id)
+{
+	return ENOTSUP;
+}
+
+static int inetcfg_addr_delete(sysarg_t addr_id)
+{
+	return ENOTSUP;
+}
+
+static int inetcfg_addr_get(sysarg_t addr_id, inet_addr_info_t *ainfo)
+{
+	return ENOTSUP;
+}
+
+static int inetcfg_get_addr_list(sysarg_t **addrs, size_t *count)
+{
+	return ENOTSUP;
+}
+
+static int inetcfg_get_link_list(sysarg_t **addrs, size_t *count)
+{
+	return ENOTSUP;
+}
+
+static int inetcfg_link_get(sysarg_t addr_id, inet_link_info_t *ainfo)
+{
+	return ENOTSUP;
+}
+
+static void inetcfg_addr_create_static_srv(ipc_callid_t callid,
+    ipc_call_t *call)
+{
+	inet_naddr_t naddr;
+	sysarg_t addr_id;
+	int rc;
+
+	log_msg(LVL_DEBUG, "inetcfg_addr_create_static_srv()");
+
+	naddr.ipv4 = IPC_GET_ARG1(*call);
+	naddr.bits = IPC_GET_ARG2(*call);
+
+	addr_id = 0;
+	rc = inetcfg_addr_create_static(&naddr, &addr_id);
+	async_answer_1(callid, rc, addr_id);
+}
+
+static void inetcfg_addr_delete_srv(ipc_callid_t callid, ipc_call_t *call)
+{
+	sysarg_t addr_id;
+	int rc;
+
+	log_msg(LVL_DEBUG, "inetcfg_addr_delete_srv()");
+
+	addr_id = IPC_GET_ARG1(*call);
+
+	rc = inetcfg_addr_delete(addr_id);
+	async_answer_0(callid, rc);
+}
+
+static void inetcfg_addr_get_srv(ipc_callid_t callid, ipc_call_t *call)
+{
+	sysarg_t addr_id;
+	inet_addr_info_t ainfo;
+	int rc;
+
+	addr_id = IPC_GET_ARG1(*call);
+	log_msg(LVL_DEBUG, "inetcfg_addr_get_srv()");
+
+	rc = inetcfg_addr_get(addr_id, &ainfo);
+	async_answer_2(callid, rc, ainfo.naddr.ipv4, ainfo.naddr.bits);
+}
+
+
+static void inetcfg_get_addr_list_srv(ipc_callid_t callid, ipc_call_t *call)
+{
+	ipc_callid_t rcallid;
+	size_t max_size;
+	size_t act_size;
+	size_t size;
+	sysarg_t *id_buf;
+	int rc;
+
+	log_msg(LVL_DEBUG, "inetcfg_get_addr_list_srv()");
+
+	if (!async_data_read_receive(&rcallid, &max_size)) {
+		async_answer_0(rcallid, EREFUSED);
+		async_answer_0(callid, EREFUSED);
+		return;
+	}
+
+	rc = inetcfg_get_addr_list(&id_buf, &act_size);
+	if (rc != EOK) {
+		async_answer_0(rcallid, rc);
+		async_answer_0(callid, rc);
+		return;
+	}
+
+	size = min(act_size, max_size);
+
+	sysarg_t retval = async_data_read_finalize(rcallid, id_buf, size);
+	free(id_buf);
+
+	async_answer_1(callid, retval, act_size);
+}
+
+static void inetcfg_link_get_srv(ipc_callid_t callid, ipc_call_t *call)
+{
+	sysarg_t link_id;
+	inet_link_info_t linfo;
+	int rc;
+
+	link_id = IPC_GET_ARG1(*call);
+	log_msg(LVL_DEBUG, "inetcfg_link_get_srv()");
+
+	rc = inetcfg_link_get(link_id, &linfo);
+	async_answer_0(callid, rc);
+}
+
+static void inetcfg_get_link_list_srv(ipc_callid_t callid, ipc_call_t *call)
+{
+	ipc_callid_t rcallid;
+	size_t max_size;
+	size_t act_size;
+	size_t size;
+	sysarg_t *id_buf;
+	int rc;
+
+	log_msg(LVL_DEBUG, "inetcfg_get_link_list_srv()");
+
+	if (!async_data_read_receive(&rcallid, &max_size)) {
+		async_answer_0(rcallid, EREFUSED);
+		async_answer_0(callid, EREFUSED);
+		return;
+	}
+
+	rc = inetcfg_get_link_list(&id_buf, &act_size);
+	if (rc != EOK) {
+		async_answer_0(rcallid, rc);
+		async_answer_0(callid, rc);
+		return;
+	}
+
+	size = min(act_size, max_size);
+
+	sysarg_t retval = async_data_read_finalize(rcallid, id_buf, size);
+	free(id_buf);
+
+	async_answer_1(callid, retval, act_size);
+}
+
+void inet_cfg_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
+{
+	log_msg(LVL_DEBUG, "inet_cfg_conn()");
+
+	/* Accept the connection */
+	async_answer_0(iid, EOK);
+
+	while (true) {
+		ipc_call_t call;
+		ipc_callid_t callid = async_get_call(&call);
+		sysarg_t method = IPC_GET_IMETHOD(call);
+
+		if (!method) {
+			/* The other side has hung up */
+			async_answer_0(callid, EOK);
+			return;
+		}
+
+		switch (method) {
+		case INETCFG_ADDR_CREATE_STATIC:
+			inetcfg_addr_create_static_srv(callid, &call);
+			break;
+		case INETCFG_ADDR_DELETE:
+			inetcfg_addr_delete_srv(callid, &call);
+			break;
+		case INETCFG_ADDR_GET:
+			inetcfg_addr_get_srv(callid, &call);
+			break;
+		case INETCFG_GET_ADDR_LIST:
+			inetcfg_get_addr_list_srv(callid, &call);
+			break;
+		case INETCFG_GET_LINK_LIST:
+			inetcfg_get_link_list_srv(callid, &call);
+			break;
+		case INETCFG_LINK_GET:
+			inetcfg_link_get_srv(callid, &call);
+			break;
+		default:
+			async_answer_0(callid, EINVAL);
+		}
+	}
+}
+
+/** @}
+ */
Index: uspace/srv/inet/inetcfg.h
===================================================================
--- uspace/srv/inet/inetcfg.h	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/srv/inet/inetcfg.h	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2012 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 inet
+ * @{
+ */
+/**
+ * @file
+ * @brief
+ */
+
+#ifndef INETCFG_H_
+#define INETCFG_H_
+
+extern void inet_cfg_conn(ipc_callid_t, ipc_call_t *, void *);
+
+#endif
+
+/** @}
+ */
