Index: uspace/lib/c/generic/device/nic.c
===================================================================
--- uspace/lib/c/generic/device/nic.c	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/c/generic/device/nic.c	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -73,8 +73,7 @@
 }
 
-/** Connect the driver to the NET and NIL services
- *
- * @param[in] dev_sess
- * @param[in] nil_service Service identifier for the NIL service
+/** Create callback connection from NIC service
+ *
+ * @param[in] dev_sess
  * @param[in] device_id
  *
@@ -82,13 +81,24 @@
  *
  */
-int nic_connect_to_nil(async_sess_t *dev_sess, services_t nil_service,
-    nic_device_id_t device_id)
-{
-	async_exch_t *exch = async_exchange_begin(dev_sess);
-	int rc = async_req_3_0(exch, DEV_IFACE_ID(NIC_DEV_IFACE),
-	    NIC_CONNECT_TO_NIL, nil_service, device_id);
-	async_exchange_end(exch);
-	
-	return rc;
+int nic_callback_create(async_sess_t *dev_sess, nic_device_id_t device_id,
+    async_client_conn_t cfun, void *carg)
+{
+	ipc_call_t answer;
+	int rc;
+	sysarg_t retval;
+	
+	async_exch_t *exch = async_exchange_begin(dev_sess);
+	aid_t req = async_send_2(exch, DEV_IFACE_ID(NIC_DEV_IFACE),
+	    NIC_CALLBACK_CREATE, device_id, &answer);
+	
+	rc = async_connect_to_me(exch, 0, 0, 0, cfun, carg);
+	if (rc != EOK) {
+		async_wait_for(req, NULL);
+		return rc;
+	}
+	async_exchange_end(exch);
+	
+	async_wait_for(req, &retval);
+	return (int) retval;
 }
 
Index: uspace/lib/c/include/device/nic.h
===================================================================
--- uspace/lib/c/include/device/nic.h	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/c/include/device/nic.h	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -39,9 +39,10 @@
 #include <net/device.h>
 #include <net/packet.h>
+#include <ipc/common.h>
 #include <ipc/services.h>
 
 typedef enum {
 	NIC_SEND_MESSAGE = 0,
-	NIC_CONNECT_TO_NIL,
+	NIC_CALLBACK_CREATE,
 	NIC_GET_STATE,
 	NIC_SET_STATE,
@@ -85,6 +86,13 @@
 } nic_funcs_t;
 
+typedef enum {
+	NIC_EV_ADDR_CHANGED = IPC_FIRST_USER_METHOD,
+	NIC_EV_RECEIVED,
+	NIC_EV_DEVICE_STATE
+} nic_event_t;
+
 extern int nic_send_frame(async_sess_t *, void *, size_t);
-extern int nic_connect_to_nil(async_sess_t *, services_t, nic_device_id_t);
+extern int nic_callback_create(async_sess_t *, nic_device_id_t,
+    async_client_conn_t, void *);
 extern int nic_get_state(async_sess_t *, nic_device_state_t *);
 extern int nic_set_state(async_sess_t *, nic_device_state_t);
Index: uspace/lib/c/include/ipc/nil.h
===================================================================
--- uspace/lib/c/include/ipc/nil.h	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/c/include/ipc/nil.h	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -46,12 +46,4 @@
 	 */
 	NET_NIL_DEVICE = NET_NIL_FIRST,
-	/** New device state message.
-	 * @see nil_device_state_msg()
-	 */
-	NET_NIL_DEVICE_STATE,
-	/** Received packet queue message.
-	 * @see nil_received_msg()
-	 */
-	NET_NIL_RECEIVED,
 	/** Send packet queue message.
 	 * @see nil_send_msg()
@@ -69,9 +61,5 @@
 	 * @see nil_get_broadcast_addr()
 	 */
-	NET_NIL_BROADCAST_ADDR,
-	/** Device has changed address
-	 * @see nil_addr_changed_msg()
-	 */
-	NET_NIL_ADDR_CHANGED
+	NET_NIL_BROADCAST_ADDR
 } nil_messages;
 
Index: uspace/lib/drv/generic/remote_nic.c
===================================================================
--- uspace/lib/drv/generic/remote_nic.c	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/drv/generic/remote_nic.c	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -63,14 +63,13 @@
 }
 
-static void remote_nic_connect_to_nil(ddf_fun_t *dev, void *iface,
-    ipc_callid_t callid, ipc_call_t *call)
-{
-	nic_iface_t *nic_iface = (nic_iface_t *) iface;
-	assert(nic_iface->connect_to_nil);
-	
-	services_t nil_service = (services_t) IPC_GET_ARG2(*call);
-	nic_device_id_t device_id = (nic_device_id_t) IPC_GET_ARG3(*call);
-	
-	int rc = nic_iface->connect_to_nil(dev, nil_service, device_id);
+static void remote_nic_callback_create(ddf_fun_t *dev, void *iface,
+    ipc_callid_t callid, ipc_call_t *call)
+{
+	nic_iface_t *nic_iface = (nic_iface_t *) iface;
+	assert(nic_iface->callback_create);
+	
+	nic_device_id_t device_id = (nic_device_id_t) IPC_GET_ARG2(*call);
+	
+	int rc = nic_iface->callback_create(dev, device_id);
 	async_answer_0(callid, rc);
 }
@@ -1203,5 +1202,5 @@
 static remote_iface_func_ptr_t remote_nic_iface_ops[] = {
 	&remote_nic_send_frame,
-	&remote_nic_connect_to_nil,
+	&remote_nic_callback_create,
 	&remote_nic_get_state,
 	&remote_nic_set_state,
Index: uspace/lib/drv/include/ops/nic.h
===================================================================
--- uspace/lib/drv/include/ops/nic.h	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/drv/include/ops/nic.h	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -46,5 +46,5 @@
 	/** Mandatory methods */
 	int (*send_frame)(ddf_fun_t *, void *, size_t);
-	int (*connect_to_nil)(ddf_fun_t *, services_t, nic_device_id_t);
+	int (*callback_create)(ddf_fun_t *, nic_device_id_t);
 	int (*get_state)(ddf_fun_t *, nic_device_state_t *);
 	int (*set_state)(ddf_fun_t *, nic_device_state_t);
Index: uspace/lib/net/include/nil_remote.h
===================================================================
--- uspace/lib/net/include/nil_remote.h	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/net/include/nil_remote.h	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -62,8 +62,4 @@
 extern int nil_device_req(async_sess_t *, nic_device_id_t, devman_handle_t,
     size_t);
-extern int nil_device_state_msg(async_sess_t *, nic_device_id_t, sysarg_t);
-extern int nil_received_msg(async_sess_t *, nic_device_id_t, void *, size_t);
-extern int nil_addr_changed_msg(async_sess_t *, nic_device_id_t,
-    const nic_address_t *);
 
 #endif
Index: uspace/lib/net/nil/nil_remote.c
===================================================================
--- uspace/lib/net/nil/nil_remote.c	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/net/nil/nil_remote.c	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -44,83 +44,4 @@
 #include <ipc/nil.h>
 
-/** Notify the network interface layer about the device state change.
- *
- * @param[in] sess      Network interface layer session.
- * @param[in] device_id Device identifier.
- * @param[in] state     New device state.
- *
- * @return EOK on success.
- * @return Other error codes as defined for each specific module
- *         device state function.
- *
- */
-int nil_device_state_msg(async_sess_t *sess, nic_device_id_t device_id,
-    sysarg_t state)
-{
-	return generic_device_state_msg_remote(sess, NET_NIL_DEVICE_STATE,
-	    device_id, state, 0);
-}
-
-/** Pass the packet queue to the network interface layer.
- *
- * Process and redistribute the received packet queue to the registered
- * upper layers.
- *
- * @param[in] sess      Network interface layer session.
- * @param[in] device_id Source device identifier.
- * @param[in] packet    Received packet or the received packet queue.
- * @param[in] target    Target service. Ignored parameter.
- *
- * @return EOK on success.
- * @return Other error codes as defined for each specific module
- *         received function.
- *
- */
-int nil_received_msg(async_sess_t *sess, nic_device_id_t device_id,
-    void *data, size_t size)
-{
-	async_exch_t *exch = async_exchange_begin(sess);
-
-	ipc_call_t answer;
-	aid_t req = async_send_1(exch, NET_NIL_RECEIVED, (sysarg_t) device_id,
-	    &answer);
-	sysarg_t retval = async_data_write_start(exch, data, size);
-
-	async_exchange_end(exch);
-
-	if (retval != EOK) {
-		async_wait_for(req, NULL);
-		return retval;
-	}
-
-	async_wait_for(req, &retval);
-	return retval;
-}
-
-/** Notify upper layers that device address has changed
- *
- */
-int nil_addr_changed_msg(async_sess_t *sess, nic_device_id_t device_id,
-    const nic_address_t *address)
-{
-	assert(sess);
-	
-	async_exch_t *exch = async_exchange_begin(sess);
-	
-	aid_t message_id = async_send_1(exch, NET_NIL_ADDR_CHANGED,
-	    (sysarg_t) device_id, NULL);
-	int rc = async_data_write_start(exch, address, sizeof (nic_address_t));
-	
-	async_exchange_end(exch);
-	
-	sysarg_t res;
-    async_wait_for(message_id, &res);
-	
-    if (rc != EOK)
-		return rc;
-	
-    return (int) res;
-}
-
 int nil_device_req(async_sess_t *sess, nic_device_id_t device_id,
     service_id_t sid, size_t mtu)
Index: uspace/lib/nic/Makefile
===================================================================
--- uspace/lib/nic/Makefile	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/nic/Makefile	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -34,4 +34,5 @@
 SOURCES = \
 	src/nic_driver.c \
+	src/nic_ev.c \
 	src/nic_addr_db.c \
 	src/nic_rx_control.c \
Index: uspace/lib/nic/include/nic_driver.h
===================================================================
--- uspace/lib/nic/include/nic_driver.h	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/nic/include/nic_driver.h	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -80,6 +80,6 @@
 	/** Device's default MAC address (assigned the first time, used in STOP) */
 	nic_address_t default_mac;
-	/** Session to SERVICE_ETHERNET or SERVICE_NILDUMMY */
-	async_sess_t *nil_session;
+	/** Client callback session */
+	async_sess_t *client_session;
 	/** Phone to APIC or i8259 */
 	async_sess_t *irc_session;
Index: uspace/lib/nic/include/nic_ev.h
===================================================================
--- uspace/lib/nic/include/nic_ev.h	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
+++ uspace/lib/nic/include/nic_ev.h	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2011 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @addtogroup libnic
+ * @{
+ */
+/**
+ * @file
+ * @brief Prototypes of default DDF NIC interface methods implementations
+ */
+
+#ifndef NIC_EV_H__
+#define NIC_EV_H__
+
+#include <async.h>
+/* XXX for nic_device_id_t and nic_address_t */
+#include <net/device.h>
+#include <sys/types.h>
+
+extern int nic_ev_addr_changed(async_sess_t *, nic_device_id_t,
+    const nic_address_t *);
+extern int nic_ev_device_state(async_sess_t *, nic_device_id_t, sysarg_t);
+extern int nic_ev_received(async_sess_t *, nic_device_id_t, void *, size_t);
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/nic/include/nic_impl.h
===================================================================
--- uspace/lib/nic/include/nic_impl.h	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/nic/include/nic_impl.h	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -49,6 +49,5 @@
 extern int nic_get_address_impl(ddf_fun_t *dev_fun, nic_address_t *address);
 extern int nic_send_frame_impl(ddf_fun_t *dev_fun, void *data, size_t size);
-extern int nic_connect_to_nil_impl(ddf_fun_t *dev_fun, services_t nil_service,
-	int device_id);
+extern int nic_callback_create_impl(ddf_fun_t *dev_fun, int device_id);
 extern int nic_get_state_impl(ddf_fun_t *dev_fun, nic_device_state_t *state);
 extern int nic_set_state_impl(ddf_fun_t *dev_fun, nic_device_state_t state);
Index: uspace/lib/nic/src/nic_driver.c
===================================================================
--- uspace/lib/nic/src/nic_driver.c	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/nic/src/nic_driver.c	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -53,4 +53,5 @@
 
 #include "nic_driver.h"
+#include "nic_ev.h"
 #include "nic_impl.h"
 
@@ -106,6 +107,6 @@
 		if (!iface->send_frame)
 			iface->send_frame = nic_send_frame_impl;
-		if (!iface->connect_to_nil)
-			iface->connect_to_nil = nic_connect_to_nil_impl;
+		if (!iface->callback_create)
+			iface->callback_create = nic_callback_create_impl;
 		if (!iface->get_address)
 			iface->get_address = nic_get_address_impl;
@@ -494,6 +495,6 @@
 	
 	/* Notify NIL layer (and uppper) if bound - not in add_device */
-	if (nic_data->nil_session != NULL) {
-		int rc = nil_addr_changed_msg(nic_data->nil_session,
+	if (nic_data->client_session != NULL) {
+		int rc = nic_ev_addr_changed(nic_data->client_session,
 		    nic_data->device_id, address);
 		if (rc != EOK) {
@@ -603,5 +604,5 @@
 		}
 		fibril_rwlock_write_unlock(&nic_data->stats_lock);
-		nil_received_msg(nic_data->nil_session, nic_data->device_id,
+		nic_ev_received(nic_data->client_session, nic_data->device_id,
 		    frame->data, frame->size);
 	} else {
@@ -638,5 +639,5 @@
 	fibril_rwlock_write_unlock(&nic_data->stats_lock);
 	
-	nil_received_msg(nic_data->nil_session, nic_data->device_id,
+	nic_ev_received(nic_data->client_session, nic_data->device_id,
 	    data, size);
 }
@@ -692,5 +693,5 @@
 	nic_data->device_id = NIC_DEVICE_INVALID_ID;
 	nic_data->state = NIC_STATE_STOPPED;
-	nic_data->nil_session = NULL;
+	nic_data->client_session = NULL;
 	nic_data->irc_session = NULL;
 	nic_data->poll_mode = NIC_POLL_IMMEDIATE;
@@ -746,6 +747,6 @@
  */
 static void nic_destroy(nic_t *nic_data) {
-	if (nic_data->nil_session != NULL) {
-		async_hangup(nic_data->nil_session);
+	if (nic_data->client_session != NULL) {
+		async_hangup(nic_data->client_session);
 	}
 
Index: uspace/lib/nic/src/nic_ev.c
===================================================================
--- uspace/lib/nic/src/nic_ev.c	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
+++ uspace/lib/nic/src/nic_ev.c	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2011 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @addtogroup libnic
+ * @{
+ */
+/**
+ * @file
+ * @brief
+ */
+
+#include <async.h>
+#include <device/nic.h>
+#include "nic_ev.h"
+
+/** Device address changed. */
+int nic_ev_addr_changed(async_sess_t *sess, nic_device_id_t dev_id,
+    const nic_address_t *addr)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
+
+	ipc_call_t answer;
+	aid_t req = async_send_1(exch, NIC_EV_ADDR_CHANGED, (sysarg_t) dev_id,
+	    &answer);
+	sysarg_t retval = async_data_write_start(exch, addr,
+	    sizeof(nic_address_t));
+
+	async_exchange_end(exch);
+
+	if (retval != EOK) {
+		async_wait_for(req, NULL);
+		return retval;
+	}
+
+	async_wait_for(req, &retval);
+	return retval;
+}
+
+/** Device state changed. */
+extern int nic_ev_device_state(async_sess_t *sess, nic_device_id_t dev_id,
+    sysarg_t state)
+{
+	int rc;
+
+	async_exch_t *exch = async_exchange_begin(sess);
+	rc = async_req_2_0(exch, NIC_EV_DEVICE_STATE, dev_id, state);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
+/** Frame received. */
+int nic_ev_received(async_sess_t *sess, nic_device_id_t dev_id, void *data,
+    size_t size)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
+
+	ipc_call_t answer;
+	aid_t req = async_send_1(exch, NIC_EV_RECEIVED, (sysarg_t) dev_id,
+	    &answer);
+	sysarg_t retval = async_data_write_start(exch, data, size);
+
+	async_exchange_end(exch);
+
+	if (retval != EOK) {
+		async_wait_for(req, NULL);
+		return retval;
+	}
+
+	async_wait_for(req, &retval);
+	return retval;
+}
+
+/** @}
+ */
Index: uspace/lib/nic/src/nic_impl.c
===================================================================
--- uspace/lib/nic/src/nic_impl.c	(revision 01380b1754f524b80af20dc73185b3b21e79581b)
+++ uspace/lib/nic/src/nic_impl.c	(revision 8d7ec69d8e6ebbc57c70b70b6ed09ed1b8ceba0c)
@@ -40,4 +40,5 @@
 #include <ns.h>
 #include "nic_driver.h"
+#include "nic_ev.h"
 #include "nic_impl.h"
 
@@ -85,5 +86,5 @@
 	}
 	if (state == NIC_STATE_ACTIVE) {
-		if (nic_data->nil_session == NULL || nic_data->device_id < 0) {
+		if (nic_data->client_session == NULL || nic_data->device_id < 0) {
 			fibril_rwlock_write_unlock(&nic_data->main_lock);
 			return EINVAL;
@@ -115,5 +116,5 @@
 	if (state == NIC_STATE_STOPPED) {
 		/* Notify upper layers that we are reseting the MAC */
-		int rc = nil_addr_changed_msg(nic_data->nil_session,
+		int rc = nic_ev_addr_changed(nic_data->client_session,
 			nic_data->device_id, &nic_data->default_mac);
 		nic_data->poll_mode = nic_data->default_poll_mode;
@@ -148,5 +149,5 @@
 	nic_data->state = state;
 
-	nil_device_state_msg(nic_data->nil_session, nic_data->device_id, state);
+	nic_ev_device_state(nic_data->client_session, nic_data->device_id, state);
 
 	fibril_rwlock_write_unlock(&nic_data->main_lock);
@@ -181,31 +182,27 @@
 
 /**
- * Default implementation of the connect_to_nil method.
- * Connects the driver to the NIL service.
+ * Default implementation of the connect_client method.
+ * Creates callback connection to the client.
  *
  * @param	fun
- * @param	nil_service	ID of the server implementing the NIL service
  * @param	device_id	ID of the device as used in higher layers
  *
- * @return EOK		If the services were bound
- * @return 			Negative error code from service_connect_blocking
- */
-int nic_connect_to_nil_impl(ddf_fun_t *fun, services_t nil_service,
-    nic_device_id_t device_id)
-{
-	nic_t *nic_data = (nic_t *) fun->driver_data;
-	fibril_rwlock_write_lock(&nic_data->main_lock);
+ * @return EOK		On success, or negative error code.
+ */
+int nic_callback_create_impl(ddf_fun_t *fun, nic_device_id_t device_id)
+{
+	nic_t *nic = (nic_t *) fun->driver_data;
+	fibril_rwlock_write_lock(&nic->main_lock);
 	
-	nic_data->device_id = device_id;
+	nic->device_id = device_id;
 	
-	nic_data->nil_session = service_connect_blocking(EXCHANGE_SERIALIZE,
-	    nil_service, 0, 0);
-	if (nic_data->nil_session != NULL) {
-		fibril_rwlock_write_unlock(&nic_data->main_lock);
-		return EOK;
+	nic->client_session = async_callback_receive(EXCHANGE_SERIALIZE);
+	if (nic->client_session == NULL) {
+		fibril_rwlock_write_unlock(&nic->main_lock);
+		return ENOMEM;
 	}
 	
-	fibril_rwlock_write_unlock(&nic_data->main_lock);
-	return EHANGUP;
+	fibril_rwlock_write_unlock(&nic->main_lock);
+	return EOK;
 }
 
