Index: uspace/lib/c/generic/iplink.c
===================================================================
--- uspace/lib/c/generic/iplink.c	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/lib/c/generic/iplink.c	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -121,4 +121,24 @@
 }
 
+int iplink_addr_add(iplink_t *iplink, iplink_addr_t *addr)
+{
+	async_exch_t *exch = async_exchange_begin(iplink->sess);
+
+	int rc = async_req_1_0(exch, IPLINK_ADDR_ADD, (sysarg_t)addr->ipv4);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
+int iplink_addr_remove(iplink_t *iplink, iplink_addr_t *addr)
+{
+	async_exch_t *exch = async_exchange_begin(iplink->sess);
+
+	int rc = async_req_1_0(exch, IPLINK_ADDR_REMOVE, (sysarg_t)addr->ipv4);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
 static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t callid,
     ipc_call_t *call)
Index: uspace/lib/c/generic/iplink_srv.c
===================================================================
--- uspace/lib/c/generic/iplink_srv.c	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/lib/c/generic/iplink_srv.c	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -49,4 +49,28 @@
 	rc = srv->ops->get_mtu(srv, &mtu);
 	async_answer_1(callid, rc, mtu);
+}
+
+static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t callid,
+    ipc_call_t *call)
+{
+	int rc;
+	iplink_srv_addr_t addr;
+
+	addr.ipv4 = IPC_GET_ARG1(*call);
+
+	rc = srv->ops->addr_add(srv, &addr);
+	async_answer_0(callid, rc);
+}
+
+static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t callid,
+    ipc_call_t *call)
+{
+	int rc;
+	iplink_srv_addr_t addr;
+
+	addr.ipv4 = IPC_GET_ARG1(*call);
+
+	rc = srv->ops->addr_remove(srv, &addr);
+	async_answer_0(callid, rc);
 }
 
@@ -126,4 +150,10 @@
 			iplink_send_srv(srv, callid, &call);
 			break;
+		case IPLINK_ADDR_ADD:
+			iplink_addr_add_srv(srv, callid, &call);
+			break;
+		case IPLINK_ADDR_REMOVE:
+			iplink_addr_remove_srv(srv, callid, &call);
+			break;
 		default:
 			async_answer_0(callid, EINVAL);
Index: uspace/lib/c/include/inet/iplink.h
===================================================================
--- uspace/lib/c/include/inet/iplink.h	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/lib/c/include/inet/iplink.h	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -69,4 +69,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_get_mtu(iplink_t *, size_t *);
 
Index: uspace/lib/c/include/inet/iplink_srv.h
===================================================================
--- uspace/lib/c/include/inet/iplink_srv.h	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/lib/c/include/inet/iplink_srv.h	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -72,4 +72,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 *);
 } iplink_ops_t;
 
Index: uspace/lib/c/include/ipc/iplink.h
===================================================================
--- uspace/lib/c/include/ipc/iplink.h	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/lib/c/include/ipc/iplink.h	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -40,5 +40,7 @@
 typedef enum {
 	IPLINK_GET_MTU = IPC_FIRST_USER_METHOD,
-	IPLINK_SEND
+	IPLINK_SEND,
+	IPLINK_ADDR_ADD,
+	IPLINK_ADDR_REMOVE
 } iplink_request_t;
 
Index: uspace/srv/ethip/arp.c
===================================================================
--- uspace/srv/ethip/arp.c	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/srv/ethip/arp.c	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -46,5 +46,4 @@
 #include "std.h"
 
-#define MY_IPV4_ADDR ( (192 << 24) | (168 << 16) | (0 << 8) | 4U )
 #define MY_ETH_ADDR 0xaafeedfaceee
 
@@ -56,4 +55,5 @@
 	arp_eth_packet_t packet;
 	arp_eth_packet_t reply;
+	ethip_link_addr_t *laddr;
 
 	log_msg(LVL_DEBUG, "arp_received()");
@@ -65,15 +65,19 @@
 	log_msg(LVL_DEBUG, "ARP PDU decoded, opcode=%d, tpa=%x",
 	    packet.opcode, packet.target_proto_addr.ipv4);
-	if (packet.opcode == aop_request &&
-	    packet.target_proto_addr.ipv4 == MY_IPV4_ADDR) {
-		log_msg(LVL_DEBUG, "Request on my address");
+	if (packet.opcode == aop_request) {
+		log_msg(LVL_DEBUG, "ARP request");
 
-		reply.opcode = aop_reply;
-		reply.sender_hw_addr.addr = MY_ETH_ADDR;
-		reply.sender_proto_addr.ipv4 = MY_IPV4_ADDR;
-		reply.target_hw_addr = packet.sender_hw_addr;
-		reply.target_proto_addr = packet.sender_proto_addr;
+		laddr = ethip_nic_addr_find(nic, &packet.target_proto_addr);
+		if (laddr != NULL) {
+			log_msg(LVL_DEBUG, "Request on my address");
 
-		arp_send_packet(nic, &reply);
+			reply.opcode = aop_reply;
+			reply.sender_hw_addr.addr = MY_ETH_ADDR;
+			reply.sender_proto_addr = laddr->addr;
+			reply.target_hw_addr = packet.sender_hw_addr;
+			reply.target_proto_addr = packet.sender_proto_addr;
+
+			arp_send_packet(nic, &reply);
+		}
 	}
 }
Index: uspace/srv/ethip/ethip.c
===================================================================
--- uspace/srv/ethip/ethip.c	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/srv/ethip/ethip.c	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -57,4 +57,6 @@
 static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
 static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu);
+static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr);
+static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr);
 
 static void ethip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
@@ -64,5 +66,7 @@
 	.close = ethip_close,
 	.send = ethip_send,
-	.get_mtu = ethip_get_mtu
+	.get_mtu = ethip_get_mtu,
+	.addr_add = ethip_addr_add,
+	.addr_remove = ethip_addr_remove
 };
 
@@ -234,4 +238,20 @@
 }
 
+static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr)
+{
+	ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
+
+	log_msg(LVL_DEBUG, "ethip_addr_add(0x%" PRIx32 ")", addr->ipv4);
+	return ethip_nic_addr_add(nic, addr);
+}
+
+static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr)
+{
+	ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
+
+	log_msg(LVL_DEBUG, "ethip_addr_remove(0x%" PRIx32 ")", addr->ipv4);
+	return ethip_nic_addr_add(nic, addr);
+}
+
 int main(int argc, char *argv[])
 {
Index: uspace/srv/ethip/ethip.h
===================================================================
--- uspace/srv/ethip/ethip.h	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/srv/ethip/ethip.h	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -52,5 +52,13 @@
 	iplink_srv_t iplink;
 	service_id_t iplink_sid;
+
+	/** List of IP addresses configured on this link */
+	list_t addr_list; /* of ethip_link_addr_t */
 } ethip_nic_t;
+
+typedef struct {
+	link_t addr_list;
+	iplink_srv_addr_t addr;
+} ethip_link_addr_t;
 
 /** IEEE MAC-48 identifier */
Index: uspace/srv/ethip/ethip_nic.c
===================================================================
--- uspace/srv/ethip/ethip_nic.c	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/srv/ethip/ethip_nic.c	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -115,6 +115,22 @@
 
 	link_initialize(&nic->nic_list);
+	list_initialize(&nic->addr_list);
 
 	return nic;
+}
+
+static ethip_link_addr_t *ethip_nic_addr_new(iplink_srv_addr_t *addr)
+{
+	ethip_link_addr_t *laddr = calloc(1, sizeof(ethip_link_addr_t));
+
+	if (laddr == NULL) {
+		log_msg(LVL_ERROR, "Failed allocating NIC address structure. "
+		    "Out of memory.");
+		return NULL;
+	}
+
+	link_initialize(&laddr->addr_list);
+	laddr->addr.ipv4 = addr->ipv4;
+	return laddr;
 }
 
@@ -124,4 +140,9 @@
 		free(nic->svc_name);
 	free(nic);
+}
+
+static void ethip_link_addr_delete(ethip_link_addr_t *laddr)
+{
+	free(laddr);
 }
 
@@ -308,12 +329,49 @@
 	rc = nic_send_frame(nic->sess, data, size);
 	log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
-	log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
-	log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
-	log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
-	log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
-	log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
-	log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
-	log_msg(LVL_DEBUG, "nic_send_frame -> %d", rc);
 	return rc;
+}
+
+int ethip_nic_addr_add(ethip_nic_t *nic, iplink_srv_addr_t *addr)
+{
+	ethip_link_addr_t *laddr;
+
+	log_msg(LVL_DEBUG, "ethip_nic_addr_add()");
+	laddr = ethip_nic_addr_new(addr);
+	if (laddr == NULL)
+		return ENOMEM;
+
+	list_append(&laddr->addr_list, &nic->addr_list);
+	return EOK;
+}
+
+int ethip_nic_addr_remove(ethip_nic_t *nic, iplink_srv_addr_t *addr)
+{
+	ethip_link_addr_t *laddr;
+
+	log_msg(LVL_DEBUG, "ethip_nic_addr_remove()");
+
+	laddr = ethip_nic_addr_find(nic, addr);
+	if (laddr == NULL)
+		return ENOENT;
+
+	list_remove(&laddr->addr_list);
+	ethip_link_addr_delete(laddr);
+	return EOK;
+}
+
+ethip_link_addr_t *ethip_nic_addr_find(ethip_nic_t *nic,
+    iplink_srv_addr_t *addr)
+{
+	log_msg(LVL_DEBUG, "ethip_nic_addr_find()");
+
+	list_foreach(nic->addr_list, link) {
+		ethip_link_addr_t *laddr = list_get_instance(link,
+		    ethip_link_addr_t, addr_list);
+
+		if (addr->ipv4 == laddr->addr.ipv4)
+			return laddr;
+	}
+
+	return NULL;
 }
 
Index: uspace/srv/ethip/ethip_nic.h
===================================================================
--- uspace/srv/ethip/ethip_nic.h	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/srv/ethip/ethip_nic.h	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -39,9 +39,13 @@
 
 #include <ipc/loc.h>
+#include "ethip.h"
 
 extern int ethip_nic_discovery_start(void);
 extern ethip_nic_t *ethip_nic_find_by_iplink_sid(service_id_t);
 extern int ethip_nic_send(ethip_nic_t *, void *, size_t);
-
+extern int ethip_nic_addr_add(ethip_nic_t *, iplink_srv_addr_t *);
+extern int ethip_nic_addr_remove(ethip_nic_t *, iplink_srv_addr_t *);
+extern ethip_link_addr_t *ethip_nic_addr_find(ethip_nic_t *,
+    iplink_srv_addr_t *);
 
 #endif
Index: uspace/srv/inet/inet_link.c
===================================================================
--- uspace/srv/inet/inet_link.c	(revision 87e5658cd0c068690174e8476d75fbb9ba81f2ee)
+++ uspace/srv/inet/inet_link.c	(revision 962f03b3ffd2bcbe03f787d606beaf53444161a3)
@@ -151,4 +151,5 @@
 {
 	inet_link_t *ilink;
+	iplink_addr_t iaddr;
 	int rc;
 
@@ -194,4 +195,12 @@
 	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.");
+		/* XXX Roll back */
+		return rc;
+	}
 
 	return EOK;
