Index: uspace/lib/net/generic/generic.c
===================================================================
--- uspace/lib/net/generic/generic.c	(revision 609243f4f1d6e7562d9c9b79e38925b36e844ac0)
+++ uspace/lib/net/generic/generic.c	(revision 00d7e1bfe06501df61aed156666d5597397d910a)
@@ -79,5 +79,5 @@
 {
 	async_exch_t *exch = async_exchange_begin(sess);
-	int rc = async_req_2_0(exch, message, (sysarg_t) device_id,
+	int rc = async_req_3_0(exch, message, (sysarg_t) device_id, 0,
 	    (sysarg_t) service);
 	async_exchange_end(exch);
Index: uspace/lib/net/generic/net_checksum.c
===================================================================
--- uspace/lib/net/generic/net_checksum.c	(revision 609243f4f1d6e7562d9c9b79e38925b36e844ac0)
+++ uspace/lib/net/generic/net_checksum.c	(revision 00d7e1bfe06501df61aed156666d5597397d910a)
@@ -45,4 +45,7 @@
 #define CRC_DIVIDER_LE  0xedb88320
 
+/** Polynomial used in multicast address hashing */
+#define CRC_MCAST_POLYNOMIAL  0x04c11db6
+
 /** Compacts the computed checksum to the 16 bit number adding the carries.
  *
@@ -221,4 +224,39 @@
 }
 
+/** Compute the standard hash from MAC
+ *
+ * Hashing MAC into 64 possible values and using the value as index to
+ * 64bit number.
+ *
+ * The code is copied from qemu-0.13's implementation of ne2000 and rt8139
+ * drivers, but according to documentation there it originates in FreeBSD.
+ *
+ * @param[in] addr The 6-byte MAC address to be hashed
+ *
+ * @return 64-bit number with only single bit set to 1
+ *
+ */
+uint64_t multicast_hash(const uint8_t addr[6])
+{
+	uint32_t crc;
+    int carry, i, j;
+    uint8_t b;
+
+    crc = 0xffffffff;
+    for (i = 0; i < 6; i++) {
+        b = addr[i];
+        for (j = 0; j < 8; j++) {
+            carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
+            crc <<= 1;
+            b >>= 1;
+            if (carry)
+                crc = ((crc ^ CRC_MCAST_POLYNOMIAL) | carry);
+        }
+    }
+	
+    uint64_t one64 = 1;
+    return one64 << (crc >> 26);
+}
+
 /** @}
  */
Index: uspace/lib/net/il/ip_remote.c
===================================================================
--- uspace/lib/net/il/ip_remote.c	(revision 609243f4f1d6e7562d9c9b79e38925b36e844ac0)
+++ uspace/lib/net/il/ip_remote.c	(revision 00d7e1bfe06501df61aed156666d5597397d910a)
@@ -123,5 +123,5 @@
  *
  */
-int ip_device_req_remote(async_sess_t *sess, nic_device_id_t device_id,
+int ip_device_req(async_sess_t *sess, nic_device_id_t device_id,
     services_t service)
 {
Index: uspace/lib/net/include/ip_interface.h
===================================================================
--- uspace/lib/net/include/ip_interface.h	(revision 609243f4f1d6e7562d9c9b79e38925b36e844ac0)
+++ uspace/lib/net/include/ip_interface.h	(revision 00d7e1bfe06501df61aed156666d5597397d910a)
@@ -46,5 +46,4 @@
 #define ip_set_gateway_req     ip_set_gateway_req_remote
 #define ip_packet_size_req     ip_packet_size_req_remote
-#define ip_device_req          ip_device_req_remote
 #define ip_add_route_req       ip_add_route_req_remote
 #define ip_send_msg            ip_send_msg_remote
Index: uspace/lib/net/include/ip_remote.h
===================================================================
--- uspace/lib/net/include/ip_remote.h	(revision 609243f4f1d6e7562d9c9b79e38925b36e844ac0)
+++ uspace/lib/net/include/ip_remote.h	(revision 00d7e1bfe06501df61aed156666d5597397d910a)
@@ -48,5 +48,5 @@
 extern int ip_received_error_msg_remote(async_sess_t *, nic_device_id_t, packet_t *,
     services_t, services_t);
-extern int ip_device_req_remote(async_sess_t *, nic_device_id_t, services_t);
+extern int ip_device_req(async_sess_t *, nic_device_id_t, services_t);
 extern int ip_add_route_req_remote(async_sess_t *, nic_device_id_t, in_addr_t,
     in_addr_t, in_addr_t);
Index: uspace/lib/net/include/net_checksum.h
===================================================================
--- uspace/lib/net/include/net_checksum.h	(revision 609243f4f1d6e7562d9c9b79e38925b36e844ac0)
+++ uspace/lib/net/include/net_checksum.h	(revision 00d7e1bfe06501df61aed156666d5597397d910a)
@@ -67,4 +67,5 @@
 extern uint16_t flip_checksum(uint16_t);
 extern uint16_t ip_checksum(uint8_t *, size_t);
+extern uint64_t multicast_hash(const uint8_t addr[6]);
 
 #endif
Index: uspace/lib/net/tl/tl_skel.c
===================================================================
--- uspace/lib/net/tl/tl_skel.c	(revision 609243f4f1d6e7562d9c9b79e38925b36e844ac0)
+++ uspace/lib/net/tl/tl_skel.c	(revision 00d7e1bfe06501df61aed156666d5597397d910a)
@@ -123,4 +123,5 @@
 		goto out;
 	
+	task_retval(0);
 	async_manager();
 	
