Index: uspace/lib/usbvirt/src/device.c
===================================================================
--- uspace/lib/usbvirt/src/device.c	(revision 7d521e248cf09e5e6637a3ddfb9a8c2d4ac5d716)
+++ uspace/lib/usbvirt/src/device.c	(revision 0eff68e2235e2f4737160b4f06cd3e6c1b217a5e)
@@ -65,12 +65,9 @@
 		bool processed = usbvirt_ipc_handle_call(DEV, callid, &call);
 		if (!processed) {
-			switch (IPC_GET_IMETHOD(call)) {
-				case IPC_M_PHONE_HUNGUP:
-					async_answer_0(callid, EOK);
-					return;
-				default:
-					async_answer_0(callid, EINVAL);
-					break;
-			}
+			if (!IPC_GET_IMETHOD(call)) {
+				async_answer_0(callid, EOK);
+				return;
+			} else
+				async_answer_0(callid, EINVAL);
 		}
 	}
@@ -85,30 +82,27 @@
 int usbvirt_device_plug(usbvirt_device_t *dev, const char *vhc_path)
 {
-	int rc;
+	if (DEV != NULL)
+		return ELIMIT;
+	
 	devman_handle_t handle;
-
-	if (DEV != NULL) {
-		return ELIMIT;
-	}
-
-	rc = devman_device_get_handle(vhc_path, &handle, 0);
-	if (rc != EOK) {
+	int rc = devman_device_get_handle(vhc_path, &handle, 0);
+	if (rc != EOK)
 		return rc;
-	}
-
-	int hcd_phone = devman_device_connect(handle, 0);
-
-	if (hcd_phone < 0) {
-		return hcd_phone;
-	}
-
+	
+	async_sess_t *hcd_sess =
+	    devman_device_connect(EXCHANGE_SERIALIZE, handle, 0);
+	if (!hcd_sess)
+		return ENOMEM;
+	
 	DEV = dev;
-	dev->vhc_phone = hcd_phone;
-
-	rc = async_connect_to_me(hcd_phone, 0, 0, 0, callback_connection);
-	if (rc != EOK) {
+	dev->vhc_sess = hcd_sess;
+	
+	async_exch_t *exch = async_exchange_begin(hcd_sess);
+	rc = async_connect_to_me(exch, 0, 0, 0, callback_connection);
+	async_exchange_end(exch);
+	
+	if (rc != EOK)
 		DEV = NULL;
-	}
-
+	
 	return rc;
 }
@@ -120,5 +114,5 @@
 void usbvirt_device_unplug(usbvirt_device_t *dev)
 {
-	async_hangup(dev->vhc_phone);
+	async_hangup(dev->vhc_sess);
 }
 
Index: uspace/lib/usbvirt/src/ipc_hc.c
===================================================================
--- uspace/lib/usbvirt/src/ipc_hc.c	(revision 7d521e248cf09e5e6637a3ddfb9a8c2d4ac5d716)
+++ uspace/lib/usbvirt/src/ipc_hc.c	(revision 0eff68e2235e2f4737160b4f06cd3e6c1b217a5e)
@@ -45,5 +45,5 @@
 /** Send control read transfer to virtual USB device.
  *
- * @param phone IPC phone to the virtual device.
+ * @param sess Session to the virtual device.
  * @param ep Target endpoint number.
  * @param setup_buffer Setup buffer.
@@ -52,64 +52,67 @@
  * @param data_buffer_size Size of data buffer in bytes.
  * @param data_transfered_size Number of actually transferred bytes.
+ *
  * @return Error code.
- */
-int usbvirt_ipc_send_control_read(int phone,
-    void *setup_buffer, size_t setup_buffer_size,
-    void *data_buffer, size_t data_buffer_size, size_t *data_transfered_size)
+ *
+ */
+int usbvirt_ipc_send_control_read(async_sess_t *sess, void *setup_buffer,
+    size_t setup_buffer_size, void *data_buffer, size_t data_buffer_size,
+    size_t *data_transfered_size)
 {
-	if (phone < 0) {
-		return EINVAL;
-	}
-	if ((setup_buffer == NULL) || (setup_buffer_size == 0)) {
-		return EINVAL;
-	}
-	if ((data_buffer == NULL) || (data_buffer_size == 0)) {
-		return EINVAL;
-	}
-
-	aid_t opening_request = async_send_0(phone,
-	    IPC_M_USBVIRT_CONTROL_READ, NULL);
+	if (!sess)
+		return EINVAL;
+	
+	if ((setup_buffer == NULL) || (setup_buffer_size == 0))
+		return EINVAL;
+	
+	if ((data_buffer == NULL) || (data_buffer_size == 0))
+		return EINVAL;
+	
+	async_exch_t *exch = async_exchange_begin(sess);
+	
+	aid_t opening_request = async_send_0(exch, IPC_M_USBVIRT_CONTROL_READ,
+	    NULL);
 	if (opening_request == 0) {
-		return ENOMEM;
-	}
-
-	int rc = async_data_write_start(phone,
-	    setup_buffer, setup_buffer_size);
+		async_exchange_end(exch);
+		return ENOMEM;
+	}
+	
+	int rc = async_data_write_start(exch, setup_buffer, setup_buffer_size);
 	if (rc != EOK) {
+		async_exchange_end(exch);
 		async_wait_for(opening_request, NULL);
 		return rc;
 	}
-
+	
 	ipc_call_t data_request_call;
-	aid_t data_request = async_data_read(phone,
-	    data_buffer, data_buffer_size,
+	aid_t data_request = async_data_read(exch, data_buffer, data_buffer_size,
 	    &data_request_call);
-
+	
+	async_exchange_end(exch);
+	
 	if (data_request == 0) {
 		async_wait_for(opening_request, NULL);
 		return ENOMEM;
 	}
-
+	
 	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) {
 		/* Prefer the return code of the opening request. */
-		if (opening_request_rc != EOK) {
+		if (opening_request_rc != EOK)
 			return (int) opening_request_rc;
-		} else {
+		else
 			return (int) data_request_rc;
-		}
-	}
-	if (opening_request_rc != EOK) {
+	}
+	
+	if (opening_request_rc != EOK)
 		return (int) opening_request_rc;
-	}
-
-	if (data_transfered_size != NULL) {
+	
+	if (data_transfered_size != NULL)
 		*data_transfered_size = IPC_GET_ARG2(data_request_call);
-	}
-
+	
 	return EOK;
 }
@@ -117,5 +120,5 @@
 /** Send control write transfer to virtual USB device.
  *
- * @param phone IPC phone to the virtual device.
+ * @param sess Session to the virtual device.
  * @param ep Target endpoint number.
  * @param setup_buffer Setup buffer.
@@ -123,46 +126,50 @@
  * @param data_buffer Data buffer (DATA stage of control transfer).
  * @param data_buffer_size Size of data buffer in bytes.
+ *
  * @return Error code.
- */
-int usbvirt_ipc_send_control_write(int phone,
-    void *setup_buffer, size_t setup_buffer_size,
-    void *data_buffer, size_t data_buffer_size)
+ *
+ */
+int usbvirt_ipc_send_control_write(async_sess_t *sess, void *setup_buffer,
+    size_t setup_buffer_size, void *data_buffer, size_t data_buffer_size)
 {
-	if (phone < 0) {
-		return EINVAL;
-	}
-	if ((setup_buffer == NULL) || (setup_buffer_size == 0)) {
-		return EINVAL;
-	}
-	if ((data_buffer_size > 0) && (data_buffer == NULL)) {
-		return EINVAL;
-	}
-
-	aid_t opening_request = async_send_1(phone,
-	    IPC_M_USBVIRT_CONTROL_WRITE, data_buffer_size,  NULL);
+	if (!sess)
+		return EINVAL;
+	
+	if ((setup_buffer == NULL) || (setup_buffer_size == 0))
+		return EINVAL;
+	
+	if ((data_buffer_size > 0) && (data_buffer == NULL))
+		return EINVAL;
+	
+	async_exch_t *exch = async_exchange_begin(sess);
+	
+	aid_t opening_request = async_send_1(exch, IPC_M_USBVIRT_CONTROL_WRITE,
+	    data_buffer_size, NULL);
 	if (opening_request == 0) {
-		return ENOMEM;
-	}
-
-	int rc = async_data_write_start(phone,
-	    setup_buffer, setup_buffer_size);
+		async_exchange_end(exch);
+		return ENOMEM;
+	}
+	
+	int rc = async_data_write_start(exch, setup_buffer, setup_buffer_size);
 	if (rc != EOK) {
+		async_exchange_end(exch);
 		async_wait_for(opening_request, NULL);
 		return rc;
 	}
-
+	
 	if (data_buffer_size > 0) {
-		rc = async_data_write_start(phone,
-		    data_buffer, data_buffer_size);
-
+		rc = async_data_write_start(exch, data_buffer, data_buffer_size);
 		if (rc != EOK) {
+			async_exchange_end(exch);
 			async_wait_for(opening_request, NULL);
 			return rc;
 		}
 	}
-
+	
+	async_exchange_end(exch);
+	
 	sysarg_t opening_request_rc;
 	async_wait_for(opening_request, &opening_request_rc);
-
+	
 	return (int) opening_request_rc;
 }
@@ -170,5 +177,5 @@
 /** Request data transfer from virtual USB device.
  *
- * @param phone IPC phone to the virtual device.
+ * @param sess Session to the virtual device.
  * @param ep Target endpoint number.
  * @param tr_type Transfer type (interrupt or bulk).
@@ -176,13 +183,16 @@
  * @param data_size Size of the data buffer in bytes.
  * @param act_size Number of actually returned bytes.
+ *
  * @return Error code.
- */
-int usbvirt_ipc_send_data_in(int phone, usb_endpoint_t ep,
+ *
+ */
+int usbvirt_ipc_send_data_in(async_sess_t *sess, usb_endpoint_t ep,
     usb_transfer_type_t tr_type, void *data, size_t data_size, size_t *act_size)
 {
-	if (phone < 0) {
-		return EINVAL;
-	}
+	if (!sess)
+		return EINVAL;
+	
 	usbvirt_hc_to_device_method_t method;
+	
 	switch (tr_type) {
 	case USB_TRANSFER_INTERRUPT:
@@ -195,48 +205,49 @@
 		return EINVAL;
 	}
-	if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) {
-		return EINVAL;
-	}
-	if ((data == NULL) || (data_size == 0)) {
-		return EINVAL;
-	}
-
-
-	aid_t opening_request = async_send_2(phone, method, ep, tr_type, NULL);
+	
+	if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX))
+		return EINVAL;
+	
+	if ((data == NULL) || (data_size == 0))
+		return EINVAL;
+	
+	async_exch_t *exch = async_exchange_begin(sess);
+	
+	aid_t opening_request = async_send_2(exch, method, ep, tr_type, NULL);
 	if (opening_request == 0) {
-		return ENOMEM;
-	}
-
-
+		async_exchange_end(exch);
+		return ENOMEM;
+	}
+	
 	ipc_call_t data_request_call;
-	aid_t data_request = async_data_read(phone,
-	    data, data_size,  &data_request_call);
-
+	aid_t data_request = async_data_read(exch, data, data_size,
+	    &data_request_call);
+	
+	async_exchange_end(exch);
+	
 	if (data_request == 0) {
 		async_wait_for(opening_request, NULL);
 		return ENOMEM;
 	}
-
+	
 	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) {
 		/* Prefer the return code of the opening request. */
-		if (opening_request_rc != EOK) {
+		if (opening_request_rc != EOK)
 			return (int) opening_request_rc;
-		} else {
+		else
 			return (int) data_request_rc;
-		}
-	}
-	if (opening_request_rc != EOK) {
+	}
+	
+	if (opening_request_rc != EOK)
 		return (int) opening_request_rc;
-	}
-
-	if (act_size != NULL) {
+	
+	if (act_size != NULL)
 		*act_size = IPC_GET_ARG2(data_request_call);
-	}
-
+	
 	return EOK;
 }
@@ -244,18 +255,21 @@
 /** Send data to virtual USB device.
  *
- * @param phone IPC phone to the virtual device.
+ * @param sess Session to the virtual device.
  * @param ep Target endpoint number.
  * @param tr_type Transfer type (interrupt or bulk).
  * @param data Data buffer.
  * @param data_size Size of the data buffer in bytes.
+ *
  * @return Error code.
- */
-int usbvirt_ipc_send_data_out(int phone, usb_endpoint_t ep,
+ *
+ */
+int usbvirt_ipc_send_data_out(async_sess_t *sess, usb_endpoint_t ep,
     usb_transfer_type_t tr_type, void *data, size_t data_size)
 {
-	if (phone < 0) {
-		return EINVAL;
-	}
+	if (!sess)
+		return EINVAL;
+	
 	usbvirt_hc_to_device_method_t method;
+	
 	switch (tr_type) {
 	case USB_TRANSFER_INTERRUPT:
@@ -268,30 +282,34 @@
 		return EINVAL;
 	}
-	if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) {
-		return EINVAL;
-	}
-	if ((data == NULL) || (data_size == 0)) {
-		return EINVAL;
-	}
-
-	aid_t opening_request = async_send_1(phone, method, ep, NULL);
+	
+	if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX))
+		return EINVAL;
+	
+	if ((data == NULL) || (data_size == 0))
+		return EINVAL;
+	
+	async_exch_t *exch = async_exchange_begin(sess);
+	
+	aid_t opening_request = async_send_1(exch, method, ep, NULL);
 	if (opening_request == 0) {
-		return ENOMEM;
-	}
-
-	int rc = async_data_write_start(phone,
-	    data, data_size);
+		async_exchange_end(exch);
+		return ENOMEM;
+	}
+	
+	int rc = async_data_write_start(exch, data, data_size);
+	
+	async_exchange_end(exch);
+	
 	if (rc != EOK) {
 		async_wait_for(opening_request, NULL);
 		return rc;
 	}
-
+	
 	sysarg_t opening_request_rc;
 	async_wait_for(opening_request, &opening_request_rc);
-
+	
 	return (int) opening_request_rc;
 }
 
-
 /**
  * @}
