Index: uspace/app/inetcfg/inetcfg.c
===================================================================
--- uspace/app/inetcfg/inetcfg.c	(revision 291c79201b01e9fc4b6b6d67dd411a2556b9655a)
+++ uspace/app/inetcfg/inetcfg.c	(revision fa101c4ef128bcbc266ee366dd9b3fcfe2bcf4ab)
@@ -48,5 +48,7 @@
 static void print_syntax(void)
 {
-	printf("syntax: " NAME " create <addr>/<width> <link-name> <addr-name>\n");
+	printf("syntax:\n");
+	printf("\t" NAME " create <addr>/<width> <link-name> <addr-name>\n");
+	printf("\t" NAME " delete <link-name> <addr-name>\n");
 }
 
@@ -143,5 +145,50 @@
 	if (rc != EOK) {
 		printf(NAME ": Failed creating static address '%s' (%d)\n",
-		    "v4s", rc);
+		    aobj_name, rc);
+		return EIO;
+	}
+
+	return EOK;
+}
+
+static int addr_delete(int argc, char *argv[])
+{
+	char *aobj_name;
+	char *link_name;
+	sysarg_t link_id;
+	sysarg_t addr_id;
+	int rc;
+
+	if (argc < 2) {
+		printf(NAME ": Missing arguments.\n");
+		print_syntax();
+		return EINVAL;
+	}
+
+	if (argc > 2) {
+		printf(NAME ": Too many arguments.\n");
+		print_syntax();
+		return EINVAL;
+	}
+
+	link_name = argv[0];
+	aobj_name = argv[1];
+
+	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 = inetcfg_addr_get_id(aobj_name, link_id, &addr_id);
+	if (rc != EOK) {
+		printf(NAME ": Address '%s' not found (%d).\n", aobj_name, rc);
+		return ENOENT;
+	}
+
+	rc = inetcfg_addr_delete(addr_id);
+	if (rc != EOK) {
+		printf(NAME ": Failed deleting address '%s' (%d)\n", aobj_name,
+		    rc);
 		return EIO;
 	}
@@ -223,4 +270,8 @@
 		if (rc != EOK)
 			return 1;
+	} else if (str_cmp(argv[1], "delete") == 0) {
+		rc = addr_delete(argc - 2, argv + 2);
+		if (rc != EOK)
+			return 1;
 	} else {
 		printf(NAME ": Unknown command '%s'.\n", argv[1]);
Index: uspace/lib/c/generic/inetcfg.c
===================================================================
--- uspace/lib/c/generic/inetcfg.c	(revision 291c79201b01e9fc4b6b6d67dd411a2556b9655a)
+++ uspace/lib/c/generic/inetcfg.c	(revision fa101c4ef128bcbc266ee366dd9b3fcfe2bcf4ab)
@@ -205,4 +205,25 @@
 }
 
+int inetcfg_addr_get_id(const char *name, 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_1(exch, INETCFG_ADDR_GET_ID, link_id, &answer);
+	sysarg_t retval = async_data_write_start(exch, name, str_size(name));
+
+	async_exchange_end(exch);
+
+	if (retval != EOK) {
+		async_wait_for(req, NULL);
+		return retval;
+	}
+
+	async_wait_for(req, &retval);
+	*addr_id = IPC_GET_ARG1(answer);
+
+	return retval;
+}
+
 int inetcfg_get_addr_list(sysarg_t **addrs, size_t *count)
 {
Index: uspace/lib/c/include/inet/inetcfg.h
===================================================================
--- uspace/lib/c/include/inet/inetcfg.h	(revision 291c79201b01e9fc4b6b6d67dd411a2556b9655a)
+++ uspace/lib/c/include/inet/inetcfg.h	(revision fa101c4ef128bcbc266ee366dd9b3fcfe2bcf4ab)
@@ -67,4 +67,5 @@
 extern int inetcfg_addr_delete(sysarg_t);
 extern int inetcfg_addr_get(sysarg_t, inet_addr_info_t *);
+extern int inetcfg_addr_get_id(const char *, sysarg_t, sysarg_t *);
 extern int inetcfg_get_addr_list(sysarg_t **, size_t *);
 extern int inetcfg_get_link_list(sysarg_t **, size_t *);
Index: uspace/lib/c/include/ipc/inet.h
===================================================================
--- uspace/lib/c/include/ipc/inet.h	(revision 291c79201b01e9fc4b6b6d67dd411a2556b9655a)
+++ uspace/lib/c/include/ipc/inet.h	(revision fa101c4ef128bcbc266ee366dd9b3fcfe2bcf4ab)
@@ -64,4 +64,5 @@
 	INETCFG_ADDR_DELETE,
 	INETCFG_ADDR_GET,
+	INETCFG_ADDR_GET_ID,
 	INETCFG_GET_ADDR_LIST,
 	INETCFG_GET_LINK_LIST,
Index: uspace/srv/inet/addrobj.c
===================================================================
--- uspace/srv/inet/addrobj.c	(revision 291c79201b01e9fc4b6b6d67dd411a2556b9655a)
+++ uspace/srv/inet/addrobj.c	(revision fa101c4ef128bcbc266ee366dd9b3fcfe2bcf4ab)
@@ -41,4 +41,5 @@
 #include <ipc/loc.h>
 #include <stdlib.h>
+#include <str.h>
 
 #include "addrobj.h"
@@ -119,5 +120,5 @@
 			fibril_mutex_unlock(&addr_list_lock);
 			log_msg(LVL_DEBUG, "inet_addrobj_find: found %p",
-			    addr);
+			    naddr);
 			return naddr;
 		}
@@ -125,4 +126,35 @@
 
 	log_msg(LVL_DEBUG, "inet_addrobj_find: Not found");
+	fibril_mutex_unlock(&addr_list_lock);
+
+	return NULL;
+}
+
+/** Find address object on a link, with a specific name.
+ *
+ * @param name	Address object name
+ * @param ilink	Inet link
+ * @return	Address object
+ */
+inet_addrobj_t *inet_addrobj_find_by_name(const char *name, inet_link_t *ilink)
+{
+	log_msg(LVL_DEBUG, "inet_addrobj_find_by_name('%s', '%s')",
+	    name, ilink->svc_name);
+
+	fibril_mutex_lock(&addr_list_lock);
+
+	list_foreach(addr_list, link) {
+		inet_addrobj_t *naddr = list_get_instance(link,
+		    inet_addrobj_t, addr_list);
+
+		if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) {
+			fibril_mutex_unlock(&addr_list_lock);
+			log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: found %p",
+			    naddr);
+			return naddr;
+		}
+	}
+
+	log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: Not found");
 	fibril_mutex_unlock(&addr_list_lock);
 
Index: uspace/srv/inet/addrobj.h
===================================================================
--- uspace/srv/inet/addrobj.h	(revision 291c79201b01e9fc4b6b6d67dd411a2556b9655a)
+++ uspace/srv/inet/addrobj.h	(revision fa101c4ef128bcbc266ee366dd9b3fcfe2bcf4ab)
@@ -53,4 +53,5 @@
 extern void inet_addrobj_remove(inet_addrobj_t *);
 extern inet_addrobj_t *inet_addrobj_find(inet_addr_t *, inet_addrobj_find_t);
+extern inet_addrobj_t *inet_addrobj_find_by_name(const char *, inet_link_t *);
 extern inet_addrobj_t *inet_addrobj_get_by_id(sysarg_t);
 extern int inet_addrobj_send_dgram(inet_addrobj_t *, inet_dgram_t *,
Index: uspace/srv/inet/inetcfg.c
===================================================================
--- uspace/srv/inet/inetcfg.c	(revision 291c79201b01e9fc4b6b6d67dd411a2556b9655a)
+++ uspace/srv/inet/inetcfg.c	(revision fa101c4ef128bcbc266ee366dd9b3fcfe2bcf4ab)
@@ -85,5 +85,14 @@
 static int inetcfg_addr_delete(sysarg_t addr_id)
 {
-	return ENOTSUP;
+	inet_addrobj_t *addr;
+
+	addr = inet_addrobj_get_by_id(addr_id);
+	if (addr == NULL)
+		return ENOENT;
+
+	inet_addrobj_remove(addr);
+	inet_addrobj_delete(addr);
+
+	return EOK;
 }
 
@@ -100,4 +109,25 @@
 	ainfo->name = str_dup(addr->name);
 
+	return EOK;
+}
+
+static int inetcfg_addr_get_id(char *name, sysarg_t link_id, sysarg_t *addr_id)
+{
+	inet_link_t *ilink;
+	inet_addrobj_t *addr;
+
+	ilink = inet_link_get_by_id(link_id);
+	if (ilink == NULL) {
+		log_msg(LVL_DEBUG, "Link %zu not found.", (size_t) link_id);
+		return ENOENT;
+	}
+
+	addr = inet_addrobj_find_by_name(name, ilink);
+	if (addr == NULL) {
+		log_msg(LVL_DEBUG, "Address '%s' not found.", name);
+		return ENOENT;
+	}
+
+	*addr_id = addr->id;
 	return EOK;
 }
@@ -202,4 +232,28 @@
 	async_answer_3(callid, retval, ainfo.naddr.ipv4, ainfo.naddr.bits,
 	    ainfo.ilink);
+}
+
+static void inetcfg_addr_get_id_srv(ipc_callid_t callid, ipc_call_t *call)
+{
+	char *name;
+	sysarg_t link_id;
+	sysarg_t addr_id;
+	int rc;
+
+	log_msg(LVL_DEBUG, "inetcfg_addr_get_id_srv()");
+
+	link_id = IPC_GET_ARG1(*call);
+
+	rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN,
+	    0, NULL);
+	if (rc != EOK) {
+		async_answer_0(callid, rc);
+		return;
+	}
+
+	addr_id = 0;
+	rc = inetcfg_addr_get_id(name, link_id, &addr_id);
+	free(name);
+	async_answer_1(callid, rc, addr_id);
 }
 
@@ -333,4 +387,7 @@
 			inetcfg_addr_get_srv(callid, &call);
 			break;
+		case INETCFG_ADDR_GET_ID:
+			inetcfg_addr_get_id_srv(callid, &call);
+			break;
 		case INETCFG_GET_ADDR_LIST:
 			inetcfg_get_addr_list_srv(callid, &call);
