Index: uspace/drv/ehci_hcd/pci.c
===================================================================
--- uspace/drv/ehci_hcd/pci.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/ehci_hcd/pci.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -26,4 +26,5 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
 /**
  * @addtogroup drvusbehci
@@ -34,4 +35,5 @@
  * PCI related functions needed by the EHCI driver.
  */
+
 #include <errno.h>
 #include <str_error.h>
@@ -72,56 +74,76 @@
 #define PCI_READ(size) \
 do { \
-	const int parent_phone = \
-	    devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);\
-	if (parent_phone < 0) {\
-		return parent_phone; \
-	} \
-	sysarg_t add = (sysarg_t)address; \
+	async_sess_t *parent_sess = \
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle, \
+	    IPC_FLAG_BLOCKING); \
+	if (!parent_sess) \
+		return ENOMEM; \
+	\
+	sysarg_t add = (sysarg_t) address; \
 	sysarg_t val; \
+	\
+	async_exch_t *exch = async_exchange_begin(parent_sess); \
+	\
 	const int ret = \
-	    async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE), \
+	    async_req_2_1(exch, DEV_IFACE_ID(PCI_DEV_IFACE), \
 	        IPC_M_CONFIG_SPACE_READ_##size, add, &val); \
+	\
+	async_exchange_end(exch); \
+	async_hangup(parent_sess); \
+	\
 	assert(value); \
+	\
 	*value = val; \
-	async_hangup(parent_phone); \
+	return ret; \
+} while (0)
+
+static int pci_read32(const ddf_dev_t *dev, int address, uint32_t *value)
+{
+	PCI_READ(32);
+}
+
+static int pci_read16(const ddf_dev_t *dev, int address, uint16_t *value)
+{
+	PCI_READ(16);
+}
+
+static int pci_read8(const ddf_dev_t *dev, int address, uint8_t *value)
+{
+	PCI_READ(8);
+}
+
+#define PCI_WRITE(size) \
+do { \
+	async_sess_t *parent_sess = \
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle, \
+	    IPC_FLAG_BLOCKING); \
+	if (!parent_sess) \
+		return ENOMEM; \
+	\
+	sysarg_t add = (sysarg_t) address; \
+	sysarg_t val = value; \
+	\
+	async_exch_t *exch = async_exchange_begin(parent_sess); \
+	\
+	const int ret = \
+	    async_req_3_0(exch, DEV_IFACE_ID(PCI_DEV_IFACE), \
+	        IPC_M_CONFIG_SPACE_WRITE_##size, add, val); \
+	\
+	async_exchange_end(exch); \
+	async_hangup(parent_sess); \
+	\
 	return ret; \
 } while(0)
 
-static int pci_read32(const ddf_dev_t *dev, int address, uint32_t *value)
-{
-	PCI_READ(32);
-}
-static int pci_read16(const ddf_dev_t *dev, int address, uint16_t *value)
-{
-	PCI_READ(16);
-}
-static int pci_read8(const ddf_dev_t *dev, int address, uint8_t *value)
-{
-	PCI_READ(8);
-}
-#define PCI_WRITE(size) \
-do { \
-	const int parent_phone = \
-	    devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);\
-	if (parent_phone < 0) {\
-		return parent_phone; \
-	} \
-	sysarg_t add = (sysarg_t)address; \
-	sysarg_t val = value; \
-	const int ret = \
-	    async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE), \
-	        IPC_M_CONFIG_SPACE_WRITE_##size, add, val); \
-	async_hangup(parent_phone); \
-	return ret; \
-} while(0)
-
 static int pci_write32(const ddf_dev_t *dev, int address, uint32_t value)
 {
 	PCI_WRITE(32);
 }
+
 static int pci_write16(const ddf_dev_t *dev, int address, uint16_t value)
 {
 	PCI_WRITE(16);
 }
+
 static int pci_write8(const ddf_dev_t *dev, int address, uint8_t value)
 {
@@ -141,32 +163,29 @@
 {
 	assert(dev != NULL);
-
-	const int parent_phone =
-	    devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
-		return parent_phone;
-	}
-
-	int rc;
-
+	
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle,
+	    IPC_FLAG_BLOCKING);
+	if (!parent_sess)
+		return ENOMEM;
+	
 	hw_resource_list_t hw_resources;
-	rc = hw_res_get_resource_list(parent_phone, &hw_resources);
+	int rc = hw_res_get_resource_list(parent_sess, &hw_resources);
 	if (rc != EOK) {
-		async_hangup(parent_phone);
+		async_hangup(parent_sess);
 		return rc;
 	}
-
+	
 	uintptr_t mem_address = 0;
 	size_t mem_size = 0;
 	bool mem_found = false;
-
+	
 	int irq = 0;
 	bool irq_found = false;
-
+	
 	size_t i;
 	for (i = 0; i < hw_resources.count; i++) {
 		hw_resource_t *res = &hw_resources.resources[i];
-		switch (res->type)
-		{
+		switch (res->type) {
 		case INTERRUPT:
 			irq = res->res.interrupt.irq;
@@ -174,5 +193,4 @@
 			usb_log_debug2("Found interrupt: %d.\n", irq);
 			break;
-
 		case MEM_RANGE:
 			if (res->res.mem_range.address != 0
@@ -183,10 +201,10 @@
 				    mem_address, mem_size);
 				mem_found = true;
-				}
+			}
 		default:
 			break;
 		}
 	}
-
+	
 	if (mem_found && irq_found) {
 		*mem_reg_address = mem_address;
@@ -197,6 +215,6 @@
 		rc = ENOENT;
 	}
-
-	async_hangup(parent_phone);
+	
+	async_hangup(parent_sess);
 	return rc;
 }
@@ -209,11 +227,13 @@
 int pci_enable_interrupts(const ddf_dev_t *device)
 {
-	const int parent_phone =
-	    devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
-		return parent_phone;
-	}
-	const bool enabled = hw_res_enable_interrupt(parent_phone);
-	async_hangup(parent_phone);
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle,
+	    IPC_FLAG_BLOCKING);
+	if (!parent_sess)
+		return ENOMEM;
+	
+	const bool enabled = hw_res_enable_interrupt(parent_sess);
+	async_hangup(parent_sess);
+	
 	return enabled ? EOK : EIO;
 }
@@ -366,10 +386,6 @@
 #undef CHECK_RET_RETURN
 }
-/*----------------------------------------------------------------------------*/
+
 /**
  * @}
  */
-
-/**
- * @}
- */
Index: uspace/drv/ns8250/ns8250.c
===================================================================
--- uspace/drv/ns8250/ns8250.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/ns8250/ns8250.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -263,7 +263,7 @@
 static void ns8250_dev_cleanup(ns8250_t *ns)
 {
-	if (ns->dev->parent_phone > 0) {
-		async_hangup(ns->dev->parent_phone);
-		ns->dev->parent_phone = 0;
+	if (ns->dev->parent_sess) {
+		async_hangup(ns->dev->parent_sess);
+		ns->dev->parent_sess = NULL;
 	}
 }
@@ -337,15 +337,15 @@
 	
 	/* Connect to the parent's driver. */
-	ns->dev->parent_phone = devman_parent_device_connect(ns->dev->handle,
-	    IPC_FLAG_BLOCKING);
-	if (ns->dev->parent_phone < 0) {
+	ns->dev->parent_sess = devman_parent_device_connect(EXCHANGE_SERIALIZE,
+	    ns->dev->handle, IPC_FLAG_BLOCKING);
+	if (!ns->dev->parent_sess) {
 		ddf_msg(LVL_ERROR, "Failed to connect to parent driver of "
 		    "device %s.", ns->dev->name);
-		ret = ns->dev->parent_phone;
+		ret = ENOENT;
 		goto failed;
 	}
 	
 	/* Get hw resources. */
-	ret = hw_res_get_resource_list(ns->dev->parent_phone, &hw_resources);
+	ret = hw_res_get_resource_list(ns->dev->parent_sess, &hw_resources);
 	if (ret != EOK) {
 		ddf_msg(LVL_ERROR, "Failed to get HW resources for device "
Index: uspace/drv/ohci/pci.c
===================================================================
--- uspace/drv/ohci/pci.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/ohci/pci.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -26,4 +26,5 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
 /**
  * @addtogroup drvusbohci
@@ -34,4 +35,5 @@
  * PCI related functions needed by the OHCI driver.
  */
+
 #include <errno.h>
 #include <assert.h>
@@ -63,31 +65,28 @@
 	assert(irq_no);
 
-	int parent_phone = devman_parent_device_connect(dev->handle,
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle,
 	    IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
-		return parent_phone;
-	}
-
-	int rc;
-
+	if (!parent_sess)
+		return ENOMEM;
+	
 	hw_resource_list_t hw_resources;
-	rc = hw_res_get_resource_list(parent_phone, &hw_resources);
+	int rc = hw_res_get_resource_list(parent_sess, &hw_resources);
 	if (rc != EOK) {
-		async_hangup(parent_phone);
+		async_hangup(parent_sess);
 		return rc;
 	}
-
+	
 	uintptr_t mem_address = 0;
 	size_t mem_size = 0;
 	bool mem_found = false;
-
+	
 	int irq = 0;
 	bool irq_found = false;
-
+	
 	size_t i;
 	for (i = 0; i < hw_resources.count; i++) {
 		hw_resource_t *res = &hw_resources.resources[i];
-		switch (res->type)
-		{
+		switch (res->type) {
 		case INTERRUPT:
 			irq = res->res.interrupt.irq;
@@ -95,5 +94,4 @@
 			usb_log_debug2("Found interrupt: %d.\n", irq);
 			break;
-
 		case MEM_RANGE:
 			if (res->res.mem_range.address != 0
@@ -104,10 +102,10 @@
 				    (void *) mem_address, mem_size);
 				mem_found = true;
-				}
+			}
 		default:
 			break;
 		}
 	}
-
+	
 	if (mem_found && irq_found) {
 		*mem_reg_address = mem_address;
@@ -115,13 +113,12 @@
 		*irq_no = irq;
 		rc = EOK;
-	} else {
+	} else
 		rc = ENOENT;
-	}
-
-	async_hangup(parent_phone);
+	
+	async_hangup(parent_sess);
 	return rc;
 }
-/*----------------------------------------------------------------------------*/
-/** Calls the PCI driver with a request to enable interrupts
+
+/** Call the PCI driver with a request to enable interrupts
  *
  * @param[in] device Device asking for interrupts
@@ -130,16 +127,15 @@
 int pci_enable_interrupts(ddf_dev_t *device)
 {
-	int parent_phone =
-	    devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
-		return parent_phone;
-	}
-	bool enabled = hw_res_enable_interrupt(parent_phone);
-	async_hangup(parent_phone);
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle,
+	    IPC_FLAG_BLOCKING);
+	if (!parent_sess)
+		return ENOMEM;
+	
+	bool enabled = hw_res_enable_interrupt(parent_sess);
+	async_hangup(parent_sess);
+	
 	return enabled ? EOK : EIO;
 }
-/**
- * @}
- */
 
 /**
Index: uspace/drv/pciintel/pci.c
===================================================================
--- uspace/drv/pciintel/pci.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/pciintel/pci.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -53,5 +53,5 @@
 #include <ipc/dev_iface.h>
 #include <ipc/irc.h>
-#include <ipc/ns.h>
+#include <ns.h>
 #include <ipc/services.h>
 #include <sysinfo.h>
@@ -92,19 +92,19 @@
 	assert(fnode);
 	pci_fun_t *dev_data = (pci_fun_t *) fnode->driver_data;
-
+	
 	sysarg_t apic;
 	sysarg_t i8259;
-
-	int irc_phone = ENOTSUP;
-
+	
+	async_sess_t *irc_sess = NULL;
+	
 	if (((sysinfo_get_value("apic", &apic) == EOK) && (apic))
 	    || ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259))) {
-		irc_phone = service_connect_blocking(SERVICE_IRC, 0, 0);
-	}
-
-	if (irc_phone < 0) {
+		irc_sess = service_connect_blocking(EXCHANGE_SERIALIZE,
+		    SERVICE_IRC, 0, 0);
+	}
+	
+	if (!irc_sess)
 		return false;
-	}
-
+	
 	size_t i = 0;
 	hw_resource_list_t *res = &dev_data->hw_resources;
@@ -112,19 +112,23 @@
 		if (res->resources[i].type == INTERRUPT) {
 			const int irq = res->resources[i].res.interrupt.irq;
+			
+			async_exch_t *exch = async_exchange_begin(irc_sess);
 			const int rc =
-			    async_req_1_0(irc_phone, IRC_ENABLE_INTERRUPT, irq);
+			    async_req_1_0(exch, IRC_ENABLE_INTERRUPT, irq);
+			async_exchange_end(exch);
+			
 			if (rc != EOK) {
-				async_hangup(irc_phone);
+				async_hangup(irc_sess);
 				return false;
 			}
 		}
 	}
-
-	async_hangup(irc_phone);
+	
+	async_hangup(irc_sess);
 	return true;
 }
 
-static int pci_config_space_write_32(
-    ddf_fun_t *fun, uint32_t address, uint32_t data)
+static int pci_config_space_write_32(ddf_fun_t *fun, uint32_t address,
+    uint32_t data)
 {
 	if (address > 252)
@@ -576,5 +580,5 @@
 	
 	ddf_msg(LVL_DEBUG, "pci_add_device");
-	dnode->parent_phone = -1;
+	dnode->parent_sess = NULL;
 	
 	bus = pci_bus_new();
@@ -587,10 +591,10 @@
 	dnode->driver_data = bus;
 	
-	dnode->parent_phone = devman_parent_device_connect(dnode->handle,
-	    IPC_FLAG_BLOCKING);
-	if (dnode->parent_phone < 0) {
+	dnode->parent_sess = devman_parent_device_connect(EXCHANGE_SERIALIZE,
+	    dnode->handle, IPC_FLAG_BLOCKING);
+	if (!dnode->parent_sess) {
 		ddf_msg(LVL_ERROR, "pci_add_device failed to connect to the "
-		    "parent's driver.");
-		rc = dnode->parent_phone;
+		    "parent driver.");
+		rc = ENOENT;
 		goto fail;
 	}
@@ -598,5 +602,5 @@
 	hw_resource_list_t hw_resources;
 	
-	rc = hw_res_get_resource_list(dnode->parent_phone, &hw_resources);
+	rc = hw_res_get_resource_list(dnode->parent_sess, &hw_resources);
 	if (rc != EOK) {
 		ddf_msg(LVL_ERROR, "pci_add_device failed to get hw resources "
@@ -651,11 +655,14 @@
 	if (bus != NULL)
 		pci_bus_delete(bus);
-	if (dnode->parent_phone >= 0)
-		async_hangup(dnode->parent_phone);
+	
+	if (dnode->parent_sess)
+		async_hangup(dnode->parent_sess);
+	
 	if (got_res)
 		hw_res_clean_resource_list(&hw_resources);
+	
 	if (ctl != NULL)
 		ddf_fun_destroy(ctl);
-
+	
 	return rc;
 }
Index: uspace/drv/uhci_hcd/pci.c
===================================================================
--- uspace/drv/uhci_hcd/pci.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/uhci_hcd/pci.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -26,4 +26,5 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
 /**
  * @addtogroup drvusbuhcihc
@@ -34,4 +35,5 @@
  * PCI related functions needed by the UHCI driver.
  */
+
 #include <errno.h>
 #include <assert.h>
@@ -59,30 +61,29 @@
 	assert(io_reg_size);
 	assert(irq_no);
-
-	int parent_phone =
-	    devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
-		return parent_phone;
-	}
-
+	
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle,
+	    IPC_FLAG_BLOCKING);
+	if (!parent_sess)
+		return ENOMEM;
+	
 	hw_resource_list_t hw_resources;
-	int rc = hw_res_get_resource_list(parent_phone, &hw_resources);
+	int rc = hw_res_get_resource_list(parent_sess, &hw_resources);
 	if (rc != EOK) {
-		async_hangup(parent_phone);
+		async_hangup(parent_sess);
 		return rc;
 	}
-
+	
 	uintptr_t io_address = 0;
 	size_t io_size = 0;
 	bool io_found = false;
-
+	
 	int irq = 0;
 	bool irq_found = false;
-
+	
 	size_t i;
 	for (i = 0; i < hw_resources.count; i++) {
 		const hw_resource_t *res = &hw_resources.resources[i];
-		switch (res->type)
-		{
+		switch (res->type) {
 		case INTERRUPT:
 			irq = res->res.interrupt.irq;
@@ -90,5 +91,4 @@
 			usb_log_debug2("Found interrupt: %d.\n", irq);
 			break;
-
 		case IO_RANGE:
 			io_address = res->res.io_range.address;
@@ -98,21 +98,21 @@
 			io_found = true;
 			break;
-
 		default:
 			break;
 		}
 	}
-	async_hangup(parent_phone);
-
+	
+	async_hangup(parent_sess);
+	
 	if (!io_found || !irq_found)
 		return ENOENT;
-
+	
 	*io_reg_address = io_address;
 	*io_reg_size = io_size;
 	*irq_no = irq;
-
+	
 	return EOK;
 }
-/*----------------------------------------------------------------------------*/
+
 /** Call the PCI driver with a request to enable interrupts
  *
@@ -122,14 +122,16 @@
 int pci_enable_interrupts(const ddf_dev_t *device)
 {
-	const int parent_phone =
-	    devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
-		return parent_phone;
-	}
-	const bool enabled = hw_res_enable_interrupt(parent_phone);
-	async_hangup(parent_phone);
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle,
+	    IPC_FLAG_BLOCKING);
+	if (!parent_sess)
+		return ENOMEM;
+	
+	const bool enabled = hw_res_enable_interrupt(parent_sess);
+	async_hangup(parent_sess);
+	
 	return enabled ? EOK : EIO;
 }
-/*----------------------------------------------------------------------------*/
+
 /** Call the PCI driver with a request to clear legacy support register
  *
@@ -140,25 +142,26 @@
 {
 	assert(device);
-	const int parent_phone =
-	    devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
-		return parent_phone;
-	}
-
+	
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle,
+	    IPC_FLAG_BLOCKING);
+	if (!parent_sess)
+		return ENOMEM;
+	
 	/* See UHCI design guide for these values p.45,
 	 * write all WC bits in USB legacy register */
 	const sysarg_t address = 0xc0;
 	const sysarg_t value = 0xaf00;
-
-	const int rc = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
+	
+	async_exch_t *exch = async_exchange_begin(parent_sess);
+	
+	const int rc = async_req_3_0(exch, DEV_IFACE_ID(PCI_DEV_IFACE),
 	    IPC_M_CONFIG_SPACE_WRITE_16, address, value);
-	async_hangup(parent_phone);
-
+	
+	async_exchange_end(exch);
+	async_hangup(parent_sess);
+	
 	return rc;
 }
-/*----------------------------------------------------------------------------*/
-/**
- * @}
- */
 
 /**
Index: uspace/drv/uhci_rhd/main.c
===================================================================
--- uspace/drv/uhci_rhd/main.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/uhci_rhd/main.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -26,4 +26,5 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
 /** @addtogroup drvusbuhcirh
  * @{
@@ -32,4 +33,5 @@
  * @brief UHCI root hub initialization routines
  */
+
 #include <ddf/driver.h>
 #include <devman.h>
@@ -48,16 +50,16 @@
 static int hc_get_my_registers(const ddf_dev_t *dev,
     uintptr_t *io_reg_address, size_t *io_reg_size);
-/*----------------------------------------------------------------------------*/
+
 static int uhci_rh_add_device(ddf_dev_t *device);
-/*----------------------------------------------------------------------------*/
+
 static driver_ops_t uhci_rh_driver_ops = {
 	.add_device = uhci_rh_add_device,
 };
-/*----------------------------------------------------------------------------*/
+
 static driver_t uhci_rh_driver = {
 	.name = NAME,
 	.driver_ops = &uhci_rh_driver_ops
 };
-/*----------------------------------------------------------------------------*/
+
 /** Initialize global driver structures (NONE).
  *
@@ -74,5 +76,5 @@
 	return ddf_driver_main(&uhci_rh_driver);
 }
-/*----------------------------------------------------------------------------*/
+
 /** Initialize a new ddf driver instance of UHCI root hub.
  *
@@ -122,5 +124,5 @@
 	return EOK;
 }
-/*----------------------------------------------------------------------------*/
+
 /** Get address of I/O registers.
  *
@@ -134,22 +136,22 @@
 {
 	assert(dev);
-
-	const int parent_phone = devman_parent_device_connect(dev->handle,
+	
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle,
 	    IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
-		return parent_phone;
-	}
-
+	if (!parent_sess)
+		return ENOMEM;
+	
 	hw_resource_list_t hw_resources;
-	const int ret = hw_res_get_resource_list(parent_phone, &hw_resources);
+	const int ret = hw_res_get_resource_list(parent_sess, &hw_resources);
 	if (ret != EOK) {
-		async_hangup(parent_phone);
+		async_hangup(parent_sess);
 		return ret;
 	}
-
+	
 	uintptr_t io_address = 0;
 	size_t io_size = 0;
 	bool io_found = false;
-
+	
 	size_t i = 0;
 	for (; i < hw_resources.count; i++) {
@@ -160,18 +162,20 @@
 			io_found = true;
 		}
+	
 	}
-	async_hangup(parent_phone);
-
-	if (!io_found) {
+	async_hangup(parent_sess);
+	
+	if (!io_found)
 		return ENOENT;
-	}
-	if (io_reg_address != NULL) {
+	
+	if (io_reg_address != NULL)
 		*io_reg_address = io_address;
-	}
-	if (io_reg_size != NULL) {
+	
+	if (io_reg_size != NULL)
 		*io_reg_size = io_size;
-	}
+	
 	return EOK;
 }
+
 /**
  * @}
Index: uspace/drv/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/usbhid/kbd/kbddev.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/usbhid/kbd/kbddev.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -42,4 +42,5 @@
 #include <ipc/kbd.h>
 #include <async.h>
+#include <async_obsolete.h>
 #include <fibril.h>
 #include <fibril_synch.h>
@@ -67,4 +68,7 @@
 
 #include "../usbhid.h"
+
+// FIXME: remove this header
+#include <kernel/ipc/ipc_methods.h>
 
 /*----------------------------------------------------------------------------*/
@@ -307,5 +311,5 @@
     unsigned int key)
 {
-	console_event_t ev;
+	kbd_event_t ev;
 	unsigned mod_mask;
 
@@ -399,5 +403,5 @@
 	}
 	
-	async_msg_4(kbd_dev->console_phone, KBD_EVENT, ev.type, ev.key, 
+	async_obsolete_msg_4(kbd_dev->console_phone, KBD_EVENT, ev.type, ev.key, 
 	    ev.mods, ev.c);
 }
@@ -892,5 +896,5 @@
 	
 	// hangup phone to the console
-	async_hangup((*kbd_dev)->console_phone);
+	async_obsolete_hangup((*kbd_dev)->console_phone);
 	
 	if ((*kbd_dev)->repeat_mtx != NULL) {
Index: uspace/drv/usbhid/layout.h
===================================================================
--- uspace/drv/usbhid/layout.h	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/usbhid/layout.h	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -44,5 +44,5 @@
 typedef struct {
 	void (*reset)(void);
-	wchar_t (*parse_ev)(console_event_t *);
+	wchar_t (*parse_ev)(kbd_event_t *);
 } layout_op_t;
 
Index: uspace/drv/usbhid/mouse/mousedev.c
===================================================================
--- uspace/drv/usbhid/mouse/mousedev.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/usbhid/mouse/mousedev.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -41,4 +41,6 @@
 #include <usb/hid/usages/core.h>
 #include <errno.h>
+#include <async.h>
+#include <async_obsolete.h>
 #include <str_error.h>
 #include <ipc/mouse.h>
@@ -50,4 +52,7 @@
 #include "mousedev.h"
 #include "../usbhid.h"
+
+// FIXME: remove this header
+#include <kernel/ipc/ipc_methods.h>
 
 #define NAME "mouse"
@@ -181,9 +186,9 @@
 	// hangup phone to the console
 	if ((*mouse_dev)->mouse_phone >= 0) {
-		async_hangup((*mouse_dev)->mouse_phone);
+		async_obsolete_hangup((*mouse_dev)->mouse_phone);
 	}
 	
 	if ((*mouse_dev)->wheel_phone >= 0) {
-		async_hangup((*mouse_dev)->wheel_phone);
+		async_obsolete_hangup((*mouse_dev)->wheel_phone);
 	}
 	
@@ -196,5 +201,5 @@
 static void usb_mouse_send_wheel(const usb_mouse_t *mouse_dev, int wheel)
 {
-	console_event_t ev;
+	kbd_event_t ev;
 	
 	ev.type = KEY_PRESS;
@@ -214,8 +219,8 @@
 	for (i = 0; i < count * 3; ++i) {
 		usb_log_debug2("Sending key %d to the console\n", ev.key);
-		async_msg_4(mouse_dev->wheel_phone, KBD_EVENT, ev.type, 
+		async_obsolete_msg_4(mouse_dev->wheel_phone, KBD_EVENT, ev.type, 
 		    ev.key, ev.mods, ev.c);
 		// send key release right away
-		async_msg_4(mouse_dev->wheel_phone, KBD_EVENT, KEY_RELEASE, 
+		async_obsolete_msg_4(mouse_dev->wheel_phone, KBD_EVENT, KEY_RELEASE, 
 		    ev.key, ev.mods, ev.c);
 	}
@@ -303,5 +308,5 @@
 	
 	if ((shift_x != 0) || (shift_y != 0)) {
-		async_req_2_0(mouse_dev->mouse_phone,
+		async_obsolete_req_2_0(mouse_dev->mouse_phone,
 		    MEVENT_MOVE, shift_x, shift_y);
 	}
@@ -353,5 +358,5 @@
 		if (mouse_dev->buttons[field->usage - field->usage_minimum] == 0
 		    && field->value != 0) {
-			async_req_2_0(mouse_dev->mouse_phone,
+			async_obsolete_req_2_0(mouse_dev->mouse_phone,
 			    MEVENT_BUTTON, field->usage, 1);
 			mouse_dev->buttons[field->usage - field->usage_minimum]
@@ -360,5 +365,5 @@
 		    mouse_dev->buttons[field->usage - field->usage_minimum] != 0
 		    && field->value == 0) {
-		       async_req_2_0(mouse_dev->mouse_phone,
+		       async_obsolete_req_2_0(mouse_dev->mouse_phone,
 			   MEVENT_BUTTON, field->usage, 0);
 		       mouse_dev->buttons[field->usage - field->usage_minimum]
Index: uspace/drv/usbhid/multimedia/multimedia.c
===================================================================
--- uspace/drv/usbhid/multimedia/multimedia.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/usbhid/multimedia/multimedia.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -46,8 +46,13 @@
 
 #include <errno.h>
+#include <async.h>
+#include <async_obsolete.h>
 #include <str_error.h>
 
 #include <ipc/kbd.h>
 #include <io/console.h>
+
+// FIXME: remove this header
+#include <kernel/ipc/ipc_methods.h>
 
 #define NAME "multimedia-keys"
@@ -143,5 +148,5 @@
 	assert(multim_dev != NULL);
 	
-	console_event_t ev;
+	kbd_event_t ev;
 	
 	ev.type = type;
@@ -157,5 +162,5 @@
 	}
 	
-	async_msg_4(multim_dev->console_phone, KBD_EVENT, ev.type, ev.key, 
+	async_obsolete_msg_4(multim_dev->console_phone, KBD_EVENT, ev.type, ev.key, 
 	    ev.mods, ev.c);
 }
@@ -170,5 +175,5 @@
 	
 	// hangup phone to the console
-	async_hangup((*multim_dev)->console_phone);
+	async_obsolete_hangup((*multim_dev)->console_phone);
 
 	free(*multim_dev);
Index: uspace/drv/usbmouse/init.c
===================================================================
--- uspace/drv/usbmouse/init.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/usbmouse/init.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -34,4 +34,5 @@
  * Initialization routines for USB mouse driver.
  */
+
 #include "mouse.h"
 #include <usb/debug.h>
@@ -41,4 +42,7 @@
 #include <usb/hid/request.h>
 #include <errno.h>
+
+// FIXME: remove this header
+#include <kernel/ipc/ipc_methods.h>
 
 /** Mouse polling endpoint description for boot protocol subclass. */
Index: uspace/drv/usbmouse/mouse.c
===================================================================
--- uspace/drv/usbmouse/mouse.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/usbmouse/mouse.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -34,9 +34,12 @@
  * Actual handling of USB mouse protocol.
  */
-#include "mouse.h"
+
 #include <usb/debug.h>
 #include <errno.h>
 #include <str_error.h>
 #include <ipc/mouse.h>
+#include <async.h>
+#include <async_obsolete.h>
+#include "mouse.h"
 
 /** Mouse polling callback.
@@ -81,5 +84,5 @@
 		if ((shift_x != 0) || (shift_y != 0)) {
 			/* FIXME: guessed for QEMU */
-			async_req_2_0(mouse->console_phone,
+			async_obsolete_req_2_0(mouse->console_phone,
 			    MEVENT_MOVE,
 			    - shift_x / 10,  - shift_y / 10);
@@ -87,7 +90,7 @@
 		if (butt) {
 			/* FIXME: proper button clicking. */
-			async_req_2_0(mouse->console_phone,
+			async_obsolete_req_2_0(mouse->console_phone,
 			    MEVENT_BUTTON, 1, 1);
-			async_req_2_0(mouse->console_phone,
+			async_obsolete_req_2_0(mouse->console_phone,
 			    MEVENT_BUTTON, 1, 0);
 		}
@@ -115,5 +118,5 @@
 	usb_mouse_t *mouse = (usb_mouse_t *) arg;
 
-	async_hangup(mouse->console_phone);
+	async_obsolete_hangup(mouse->console_phone);
 	mouse->console_phone = -1;
 
Index: uspace/drv/vhc/conndev.c
===================================================================
--- uspace/drv/vhc/conndev.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/vhc/conndev.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -38,4 +38,5 @@
 #include <ddf/driver.h>
 #include <usbvirt/ipc.h>
+#include <async.h>
 #include "conn.h"
 
@@ -44,40 +45,45 @@
 static fibril_local char plugged_device_name[PLUGGED_DEVICE_NAME_MAXLEN + 1] = "<unknown>";
 
+#if 0
 /** Receive device name.
  *
  * @warning Errors are silently ignored.
  *
- * @param phone Phone to the virtual device.
+ * @param sess Session to the virtual device.
+ *
  */
-static void receive_device_name(int phone)
+static void receive_device_name(async_sess_t *sess)
 {
-	aid_t opening_request = async_send_0(phone, IPC_M_USBVIRT_GET_NAME, NULL);
+	async_exch_t *exch = async_exchange_begin(sess);
+	
+	aid_t opening_request = async_send_0(exch, IPC_M_USBVIRT_GET_NAME, NULL);
 	if (opening_request == 0) {
+		async_exchange_end(exch);
 		return;
 	}
-
-
+	
 	ipc_call_t data_request_call;
-	aid_t data_request = async_data_read(phone,
-	     plugged_device_name, PLUGGED_DEVICE_NAME_MAXLEN,
-	     &data_request_call);
-
+	aid_t data_request = async_data_read(exch, plugged_device_name,
+	     PLUGGED_DEVICE_NAME_MAXLEN, &data_request_call);
+	
+	async_exchange_end(exch);
+	
 	if (data_request == 0) {
 		async_wait_for(opening_request, NULL);
 		return;
 	}
-
+	
 	sysarg_t data_request_rc;
 	sysarg_t opening_request_rc;
 	async_wait_for(data_request, &data_request_rc);
 	async_wait_for(opening_request, &opening_request_rc);
-
-	if ((data_request_rc != EOK) || (opening_request_rc != EOK)) {
+	
+	if ((data_request_rc != EOK) || (opening_request_rc != EOK))
 		return;
-	}
-
+	
 	size_t len = IPC_GET_ARG2(data_request_call);
 	plugged_device_name[len] = 0;
 }
+#endif
 
 /** Default handler for IPC methods not handled by DDF.
@@ -90,4 +96,10 @@
     ipc_callid_t icallid, ipc_call_t *icall)
 {
+// FIXME:
+// This code needs to be refactored since the async
+// framework does not support automatic callback connections
+// yet.
+
+#if 0
 	vhc_data_t *vhc = fun->dev->driver_data;
 	sysarg_t method = IPC_GET_IMETHOD(*icall);
@@ -112,4 +124,5 @@
 		return;
 	}
+#endif
 
 	async_answer_0(icallid, EINVAL);
Index: uspace/drv/vhc/devconn.c
===================================================================
--- uspace/drv/vhc/devconn.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/vhc/devconn.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -1,2 +1,30 @@
+/*
+ * Copyright (c) 2011 Vojtech Horky
+ * 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.
+ */
+
 #include <errno.h>
 #include "vhcd.h"
@@ -11,5 +39,5 @@
 	}
 	dev->address = 0;
-	dev->dev_phone = -1;
+	dev->dev_sess = NULL;
 	dev->dev_local = NULL;
 	dev->plugged = true;
@@ -22,5 +50,5 @@
 
 static int vhc_virtdev_plug_generic(vhc_data_t *vhc,
-    int phone, usbvirt_device_t *virtdev,
+    async_sess_t *sess, usbvirt_device_t *virtdev,
     uintptr_t *handle, bool connect)
 {
@@ -30,5 +58,5 @@
 	}
 
-	dev->dev_phone = phone;
+	dev->dev_sess = sess;
 	dev->dev_local = virtdev;
 
@@ -56,17 +84,17 @@
 }
 
-int vhc_virtdev_plug(vhc_data_t *vhc, int phone, uintptr_t *handle)
+int vhc_virtdev_plug(vhc_data_t *vhc, async_sess_t *sess, uintptr_t *handle)
 {
-	return vhc_virtdev_plug_generic(vhc, phone, NULL, handle, true);
+	return vhc_virtdev_plug_generic(vhc, sess, NULL, handle, true);
 }
 
 int vhc_virtdev_plug_local(vhc_data_t *vhc, usbvirt_device_t *dev, uintptr_t *handle)
 {
-	return vhc_virtdev_plug_generic(vhc, -1, dev, handle, true);
+	return vhc_virtdev_plug_generic(vhc, NULL, dev, handle, true);
 }
 
 int vhc_virtdev_plug_hub(vhc_data_t *vhc, usbvirt_device_t *dev, uintptr_t *handle)
 {
-	return vhc_virtdev_plug_generic(vhc, -1, dev, handle, false);
+	return vhc_virtdev_plug_generic(vhc, NULL, dev, handle, false);
 }
 
Index: uspace/drv/vhc/hub.c
===================================================================
--- uspace/drv/vhc/hub.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/vhc/hub.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -33,7 +33,9 @@
  * @brief Virtual USB hub.
  */
+
 #include <usb/classes/classes.h>
 #include <usbvirt/device.h>
 #include <errno.h>
+#include <async.h>
 #include <str_error.h>
 #include <stdlib.h>
@@ -44,5 +46,4 @@
 
 #include "hub.h"
-//#include "hub/virthub.h"
 #include "vhcd.h"
 #include "conn.h"
@@ -97,9 +98,9 @@
 	 * Wait until parent device is properly initialized.
 	 */
-	int phone;
+	async_sess_t *sess;
 	do {
-		phone = devman_device_connect(hc_dev->handle, 0);
-	} while (phone < 0);
-	async_hangup(phone);
+		sess = devman_device_connect(EXCHANGE_SERIALIZE, hc_dev->handle, 0);
+	} while (!sess);
+	async_hangup(sess);
 
 	int rc;
@@ -129,5 +130,4 @@
 	return 0;
 }
-	
 
 /**
Index: uspace/drv/vhc/hub.h
===================================================================
--- uspace/drv/vhc/hub.h	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/vhc/hub.h	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -33,4 +33,5 @@
  * @brief Virtual USB hub.
  */
+
 #ifndef VHCD_HUB_H_
 #define VHCD_HUB_H_
Index: uspace/drv/vhc/main.c
===================================================================
--- uspace/drv/vhc/main.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/vhc/main.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -29,5 +29,5 @@
 /** @addtogroup drvusbvhc
  * @{
- */ 
+ */
 /** @file
  * Virtual host controller.
Index: uspace/drv/vhc/transfer.c
===================================================================
--- uspace/drv/vhc/transfer.c	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/vhc/transfer.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -1,2 +1,30 @@
+/*
+ * Copyright (c) 2011 Vojtech Horky
+ * 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.
+ */
+
 #include <errno.h>
 #include <str_error.h>
@@ -123,5 +151,5 @@
 
 static int process_transfer_remote(vhc_transfer_t *transfer,
-    int phone, size_t *actual_data_size)
+    async_sess_t *sess, size_t *actual_data_size)
 {
 	int rc;
@@ -129,17 +157,17 @@
 	if (transfer->transfer_type == USB_TRANSFER_CONTROL) {
 		if (transfer->direction == USB_DIRECTION_IN) {
-			rc = usbvirt_ipc_send_control_read(phone,
-			    transfer->setup_buffer, transfer->setup_buffer_size,
-			    transfer->data_buffer, transfer->data_buffer_size,
-			    actual_data_size);
-		} else {
-			assert(transfer->direction == USB_DIRECTION_OUT);
-			rc = usbvirt_ipc_send_control_write(phone,
-			    transfer->setup_buffer, transfer->setup_buffer_size,
-			    transfer->data_buffer, transfer->data_buffer_size);
-		}
-	} else {
-		if (transfer->direction == USB_DIRECTION_IN) {
-			rc = usbvirt_ipc_send_data_in(phone, transfer->endpoint,
+			rc = usbvirt_ipc_send_control_read(sess,
+			    transfer->setup_buffer, transfer->setup_buffer_size,
+			    transfer->data_buffer, transfer->data_buffer_size,
+			    actual_data_size);
+		} else {
+			assert(transfer->direction == USB_DIRECTION_OUT);
+			rc = usbvirt_ipc_send_control_write(sess,
+			    transfer->setup_buffer, transfer->setup_buffer_size,
+			    transfer->data_buffer, transfer->data_buffer_size);
+		}
+	} else {
+		if (transfer->direction == USB_DIRECTION_IN) {
+			rc = usbvirt_ipc_send_data_in(sess, transfer->endpoint,
 			    transfer->transfer_type,
 			    transfer->data_buffer, transfer->data_buffer_size,
@@ -147,5 +175,5 @@
 		} else {
 			assert(transfer->direction == USB_DIRECTION_OUT);
-			rc = usbvirt_ipc_send_data_out(phone, transfer->endpoint,
+			rc = usbvirt_ipc_send_data_out(sess, transfer->endpoint,
 			    transfer->transfer_type,
 			    transfer->data_buffer, transfer->data_buffer_size);
@@ -206,6 +234,6 @@
 		int rc = EOK;
 		size_t data_transfer_size = 0;
-		if (dev->dev_phone > 0) {
-			rc = process_transfer_remote(transfer, dev->dev_phone,
+		if (dev->dev_sess) {
+			rc = process_transfer_remote(transfer, dev->dev_sess,
 			    &data_transfer_size);
 		} else if (dev->dev_local != NULL) {
Index: uspace/drv/vhc/vhcd.h
===================================================================
--- uspace/drv/vhc/vhcd.h	(revision 8d6c1f139a0fd8ef52d018e1c68b0dcca5ec1ec9)
+++ uspace/drv/vhc/vhcd.h	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -41,4 +41,5 @@
 #include <usb/host/device_keeper.h>
 #include <usbhc_iface.h>
+#include <async.h>
 
 #define NAME "vhc"
@@ -46,5 +47,5 @@
 typedef struct {
 	link_t link;
-	int dev_phone;
+	async_sess_t *dev_sess;
 	usbvirt_device_t *dev_local;
 	bool plugged;
@@ -82,5 +83,5 @@
 vhc_transfer_t *vhc_transfer_create(usb_address_t, usb_endpoint_t,
     usb_direction_t, usb_transfer_type_t, ddf_fun_t *, void *);
-int vhc_virtdev_plug(vhc_data_t *, int, uintptr_t *);
+int vhc_virtdev_plug(vhc_data_t *, async_sess_t *, uintptr_t *);
 int vhc_virtdev_plug_local(vhc_data_t *, usbvirt_device_t *, uintptr_t *);
 int vhc_virtdev_plug_hub(vhc_data_t *, usbvirt_device_t *, uintptr_t *);
