Index: uspace/app/inetcfg/inetcfg.c
===================================================================
--- uspace/app/inetcfg/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/app/inetcfg/inetcfg.c	(revision 45aa22c5eb68cb7be5b286872aa4144e455740e9)
@@ -38,4 +38,5 @@
 #include <errno.h>
 #include <inet/inetcfg.h>
+#include <loc.h>
 #include <stdio.h>
 #include <str_error.h>
@@ -46,5 +47,90 @@
 static void print_syntax(void)
 {
-	printf("syntax: " NAME " xxx\n");
+	printf("syntax: " NAME " create <addr>/<width> <link-name> <addr-name>\n");
+}
+
+static int 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 != '.')
+			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)
+			return EINVAL;
+		naddr->ipv4 = (naddr->ipv4 << 8) | a[i];
+	}
+
+	if (bits < 1 || bits > 31)
+		return EINVAL;
+
+	naddr->bits = bits;
+	return EOK;
+}
+
+static int addr_create_static(int argc, char *argv[])
+{
+	char *aobj_name;
+	char *addr_spec;
+	char *link_name;
+
+	inet_naddr_t naddr;
+	sysarg_t link_id;
+	sysarg_t addr_id;
+	int rc;
+
+	if (argc < 3) {
+		printf(NAME ": Missing arguments.\n");
+		print_syntax();
+		return EINVAL;
+	}
+
+	if (argc > 3) {
+		printf(NAME ": Too many arguments.\n");
+		print_syntax();
+		return EINVAL;
+	}
+
+	addr_spec = argv[0];
+	link_name = argv[1];
+	aobj_name = argv[2];
+
+	rc = loc_service_get_id(link_name, &link_id, 0);
+	if (rc != EOK) {
+		printf(NAME ": Service '%s' not found (%d).\n", link_name, rc);
+		return ENOENT;
+	}
+
+	rc = naddr_parse(addr_spec, &naddr);
+	if (rc != EOK) {
+		printf(NAME ": Invalid address format '%s'.\n", addr_spec);
+		return EINVAL;
+	}
+
+	rc = inetcfg_addr_create_static(aobj_name, &naddr, link_id, &addr_id);
+	if (rc != EOK) {
+		printf(NAME ": Failed creating static address '%s' (%d)\n",
+		    "v4s", rc);
+		return 1;
+	}
+
+	return EOK;
 }
 
@@ -52,14 +138,10 @@
 {
 	int rc;
-	inet_naddr_t naddr;
-	sysarg_t addr_id;
 
-	if (argc > 1) {
-		printf(NAME ": Invalid argument '%s'.\n", argv[1]);
+	if (argc < 2) {
+		printf(NAME ": Missing argument.\n");
 		print_syntax();
 		return 1;
 	}
-
-	printf("initialize\n");
 
 	rc = inetcfg_init();
@@ -70,16 +152,14 @@
 	}
 
-	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);
+	if (str_cmp(argv[1], "create") == 0) {
+		rc = addr_create_static(argc - 2, argv + 2);
+		if (rc != EOK)
+			return 1;
+	} else {
+		printf(NAME ": Unknown command '%s'.\n", argv[1]);
+		print_syntax();
 		return 1;
 	}
 
-	printf("Success!\n");
 	return 0;
 }
Index: uspace/lib/c/generic/inetcfg.c
===================================================================
--- uspace/lib/c/generic/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/lib/c/generic/inetcfg.c	(revision 45aa22c5eb68cb7be5b286872aa4144e455740e9)
@@ -133,10 +133,10 @@
 
 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);
+    sysarg_t link_id, sysarg_t *addr_id)
+{
+	async_exch_t *exch = async_exchange_begin(inetcfg_sess);
+
+	int rc = async_req_3_1(exch, INETCFG_ADDR_CREATE_STATIC, naddr->ipv4,
+	    naddr->bits, link_id, addr_id);
 	async_exchange_end(exch);
 
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 45aa22c5eb68cb7be5b286872aa4144e455740e9)
@@ -59,5 +59,5 @@
 
 extern int inetcfg_init(void);
-extern int inetcfg_addr_create_static(const char *, inet_naddr_t *, sysarg_t *);
+extern int inetcfg_addr_create_static(const char *, inet_naddr_t *, sysarg_t, sysarg_t *);
 extern int inetcfg_addr_delete(sysarg_t);
 extern int inetcfg_addr_get(sysarg_t, inet_addr_info_t *);
Index: uspace/srv/inet/inet.c
===================================================================
--- uspace/srv/inet/inet.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/srv/inet/inet.c	(revision 45aa22c5eb68cb7be5b286872aa4144e455740e9)
@@ -276,8 +276,4 @@
 	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);
 
Index: uspace/srv/inet/inet_link.c
===================================================================
--- uspace/srv/inet/inet_link.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/srv/inet/inet_link.c	(revision 45aa22c5eb68cb7be5b286872aa4144e455740e9)
@@ -159,4 +159,6 @@
 		return ENOMEM;
 
+	ilink->svc_id = sid;
+
 	rc = loc_service_get_name(sid, &ilink->svc_name);
 	if (rc != EOK) {
@@ -260,4 +262,21 @@
 }
 
+inet_link_t *inet_link_get_by_id(sysarg_t link_id)
+{
+	fibril_mutex_lock(&inet_discovery_lock);
+
+	list_foreach(inet_link_list, elem) {
+		inet_link_t *ilink = list_get_instance(elem, inet_link_t,
+		    link_list);
+
+		if (ilink->svc_id == link_id) {
+			fibril_mutex_unlock(&inet_discovery_lock);
+			return ilink;
+		}
+	}
+
+	fibril_mutex_unlock(&inet_discovery_lock);
+	return NULL;
+}
 
 /** @}
Index: uspace/srv/inet/inet_link.h
===================================================================
--- uspace/srv/inet/inet_link.h	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/srv/inet/inet_link.h	(revision 45aa22c5eb68cb7be5b286872aa4144e455740e9)
@@ -38,4 +38,5 @@
 #define INET_LINK_H_
 
+#include <sys/types.h>
 #include "inet.h"
 
@@ -43,4 +44,5 @@
 extern int inet_link_send_dgram(inet_link_t *, inet_addr_t *,
     inet_addr_t *, inet_dgram_t *, uint8_t, uint8_t, int);
+extern inet_link_t *inet_link_get_by_id(sysarg_t);
 
 #endif
Index: uspace/srv/inet/inetcfg.c
===================================================================
--- uspace/srv/inet/inetcfg.c	(revision 0e257807ac8e7107a9b9c4635b6c33527b8e21e9)
+++ uspace/srv/inet/inetcfg.c	(revision 45aa22c5eb68cb7be5b286872aa4144e455740e9)
@@ -35,23 +35,48 @@
  */
 
-#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 "addrobj.h"
 #include "inet.h"
+#include "inet_link.h"
 #include "inetcfg.h"
 
-static int inetcfg_addr_create_static(inet_naddr_t *naddr, sysarg_t *addr_id)
-{
-	return ENOTSUP;
+static int inetcfg_addr_create_static(inet_naddr_t *naddr, sysarg_t link_id,
+    sysarg_t *addr_id)
+{
+	inet_link_t *ilink;
+	inet_addrobj_t *addr;
+	iplink_addr_t iaddr;
+	int rc;
+
+	ilink = inet_link_get_by_id(link_id);
+	if (ilink == NULL) {
+		log_msg(LVL_DEBUG, "Link %lu not found.",
+		    (unsigned long) link_id);
+		return ENOENT;
+	}
+
+	addr = inet_addrobj_new();
+	addr->naddr = *naddr;
+	addr->ilink = ilink;
+	inet_addrobj_add(addr);
+
+	iaddr.ipv4 = addr->naddr.ipv4;
+	rc = iplink_addr_add(ilink->iplink, &iaddr);
+	if (rc != EOK) {
+		log_msg(LVL_ERROR, "Failed setting IP address on internet link.");
+		inet_addrobj_remove(addr);
+		inet_addrobj_delete(addr);
+		return rc;
+	}
+
+	return EOK;
 }
 
@@ -85,4 +110,5 @@
 {
 	inet_naddr_t naddr;
+	sysarg_t link_id;
 	sysarg_t addr_id;
 	int rc;
@@ -92,7 +118,8 @@
 	naddr.ipv4 = IPC_GET_ARG1(*call);
 	naddr.bits = IPC_GET_ARG2(*call);
+	link_id    = IPC_GET_ARG3(*call);
 
 	addr_id = 0;
-	rc = inetcfg_addr_create_static(&naddr, &addr_id);
+	rc = inetcfg_addr_create_static(&naddr, link_id, &addr_id);
 	async_answer_1(callid, rc, addr_id);
 }
