Index: uspace/srv/ethip/arp.c
===================================================================
--- uspace/srv/ethip/arp.c	(revision f9d3dd42a7fa78eec449a5bdb934e3fbe205b4f8)
+++ uspace/srv/ethip/arp.c	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
@@ -47,4 +47,7 @@
 #include "std.h"
 
+/** Time to wait for ARP reply in microseconds */
+#define ARP_REQUEST_TIMEOUT (3 * 1000 * 1000)
+
 static int arp_send_packet(ethip_nic_t *nic, arp_eth_packet_t *packet);
 
@@ -64,16 +67,15 @@
 	log_msg(LVL_DEBUG, "ARP PDU decoded, opcode=%d, tpa=%x",
 	    packet.opcode, packet.target_proto_addr.ipv4);
-	if (packet.opcode == aop_request) {
-		log_msg(LVL_DEBUG, "ARP request");
 
-		laddr = ethip_nic_addr_find(nic, &packet.target_proto_addr);
-		if (laddr != NULL) {
-			log_msg(LVL_DEBUG, "Request on my address");
+	laddr = ethip_nic_addr_find(nic, &packet.target_proto_addr);
+	if (laddr != NULL) {
+		log_msg(LVL_DEBUG, "Request/reply to my address");
 
-			(void) atrans_add(&packet.sender_proto_addr,
-			    &packet.sender_hw_addr);
+		(void) atrans_add(&packet.sender_proto_addr,
+		    &packet.sender_hw_addr);
 
-			reply.opcode = aop_reply;
-			reply.sender_hw_addr = nic->mac_addr;
+		if (packet.opcode == aop_request) {
+        		reply.opcode = aop_reply;
+        		reply.sender_hw_addr = nic->mac_addr;
 			reply.sender_proto_addr = laddr->addr;
 			reply.target_hw_addr = packet.sender_hw_addr;
@@ -83,4 +85,29 @@
 		}
 	}
+}
+
+int arp_translate(ethip_nic_t *nic, iplink_srv_addr_t *src_addr,
+    iplink_srv_addr_t *ip_addr, mac48_addr_t *mac_addr)
+{
+	int rc;
+	arp_eth_packet_t packet;
+
+	rc = atrans_lookup(ip_addr, mac_addr);
+	if (rc == EOK)
+		return EOK;
+
+	packet.opcode = aop_request;
+	packet.sender_hw_addr = nic->mac_addr;
+	packet.sender_proto_addr = *src_addr;
+	packet.target_hw_addr.addr = MAC48_BROADCAST;
+	packet.target_proto_addr = *ip_addr;
+
+	rc = arp_send_packet(nic, &packet);
+	if (rc != EOK)
+		return rc;
+
+	(void) atrans_wait_timeout(ARP_REQUEST_TIMEOUT);
+
+	return atrans_lookup(ip_addr, mac_addr);
 }
 
Index: uspace/srv/ethip/arp.h
===================================================================
--- uspace/srv/ethip/arp.h	(revision f9d3dd42a7fa78eec449a5bdb934e3fbe205b4f8)
+++ uspace/srv/ethip/arp.h	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
@@ -42,4 +42,6 @@
 
 extern void arp_received(ethip_nic_t *, eth_frame_t *);
+extern int arp_translate(ethip_nic_t *, iplink_srv_addr_t *,
+    iplink_srv_addr_t *, mac48_addr_t *);
 
 #endif
Index: uspace/srv/ethip/atrans.c
===================================================================
--- uspace/srv/ethip/atrans.c	(revision f9d3dd42a7fa78eec449a5bdb934e3fbe205b4f8)
+++ uspace/srv/ethip/atrans.c	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
@@ -47,4 +47,5 @@
 static FIBRIL_MUTEX_INITIALIZE(atrans_list_lock);
 static LIST_INITIALIZE(atrans_list);
+static FIBRIL_CONDVAR_INITIALIZE(atrans_cv);
 
 static ethip_atrans_t *atrans_find(iplink_srv_addr_t *ip_addr)
@@ -82,4 +83,5 @@
 	list_append(&atrans->atrans_list, &atrans_list);
 	fibril_mutex_unlock(&atrans_list_lock);
+	fibril_condvar_broadcast(&atrans_cv);
 
 	return EOK;
@@ -120,4 +122,16 @@
 }
 
+int atrans_wait_timeout(suseconds_t timeout)
+{
+	int rc;
+
+	fibril_mutex_lock(&atrans_list_lock);
+	rc = fibril_condvar_wait_timeout(&atrans_cv, &atrans_list_lock,
+	    timeout);
+	fibril_mutex_unlock(&atrans_list_lock);
+
+	return rc;
+}
+
 /** @}
  */
Index: uspace/srv/ethip/atrans.h
===================================================================
--- uspace/srv/ethip/atrans.h	(revision f9d3dd42a7fa78eec449a5bdb934e3fbe205b4f8)
+++ uspace/srv/ethip/atrans.h	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
@@ -44,4 +44,5 @@
 extern int atrans_remove(iplink_srv_addr_t *);
 extern int atrans_lookup(iplink_srv_addr_t *, mac48_addr_t *);
+extern int atrans_wait_timeout(suseconds_t);
 
 #endif
Index: uspace/srv/ethip/ethip.c
===================================================================
--- uspace/srv/ethip/ethip.c	(revision f9d3dd42a7fa78eec449a5bdb934e3fbe205b4f8)
+++ uspace/srv/ethip/ethip.c	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
@@ -46,5 +46,4 @@
 
 #include "arp.h"
-#include "atrans.h"
 #include "ethip.h"
 #include "ethip_nic.h"
@@ -178,5 +177,5 @@
 	log_msg(LVL_DEBUG, "ethip_send()");
 
-	rc = atrans_lookup(&sdu->ldest, &dest_mac_addr);
+	rc = arp_translate(nic, &sdu->lsrc, &sdu->ldest, &dest_mac_addr);
 	if (rc != EOK) {
 		log_msg(LVL_WARN, "Failed to look up IP address 0x%" PRIx32,
Index: uspace/srv/ethip/ethip.h
===================================================================
--- uspace/srv/ethip/ethip.h	(revision f9d3dd42a7fa78eec449a5bdb934e3fbe205b4f8)
+++ uspace/srv/ethip/ethip.h	(revision 3d016acc9f437e0cb6f0a7020e6a5bb6171661cf)
@@ -43,4 +43,6 @@
 #include <loc.h>
 #include <sys/types.h>
+
+#define MAC48_BROADCAST 0xffffffffffff
 
 typedef struct {
