Index: uspace/lib/usbdev/src/hub.c
===================================================================
--- uspace/lib/usbdev/src/hub.c	(revision 70452dd41310ff17f35dcb915b66bab0d5fd7c5f)
+++ uspace/lib/usbdev/src/hub.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -42,4 +42,5 @@
 #include <usb/debug.h>
 #include <time.h>
+#include <async.h>
 
 /** How much time to wait between attempts to register endpoint 0:0.
@@ -71,15 +72,18 @@
 {
 	CHECK_CONNECTION(connection);
-
+	
+	async_exch_t *exch = async_exchange_begin(connection->hc_sess);
+	
 	sysarg_t address;
-	int rc = async_req_2_1(connection->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE),
+	int rc = async_req_2_1(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
 	    IPC_M_USBHC_REQUEST_ADDRESS, speed,
 	    &address);
-	if (rc != EOK) {
+	
+	async_exchange_end(exch);
+	
+	if (rc != EOK)
 		return (usb_address_t) rc;
-	} else {
-		return (usb_address_t) address;
-	}
+	
+	return (usb_address_t) address;
 }
 
@@ -94,12 +98,15 @@
 {
 	CHECK_CONNECTION(connection);
-	if (attached_device == NULL) {
+	
+	if (attached_device == NULL)
 		return EBADMEM;
-	}
-
-	return async_req_3_0(connection->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE),
+	
+	async_exch_t *exch = async_exchange_begin(connection->hc_sess);
+	int rc = async_req_3_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
 	    IPC_M_USBHC_BIND_ADDRESS,
 	    attached_device->address, attached_device->handle);
+	async_exchange_end(exch);
+	
+	return rc;
 }
 
@@ -114,8 +121,11 @@
 {
 	CHECK_CONNECTION(connection);
-
-	return async_req_2_0(connection->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE),
+	
+	async_exch_t *exch = async_exchange_begin(connection->hc_sess);
+	int rc = async_req_2_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
 	    IPC_M_USBHC_RELEASE_ADDRESS, address);
+	async_exchange_end(exch);
+	
+	return rc;
 }
 
@@ -192,5 +202,5 @@
 	usb_hc_connection_t hc_conn = {
 		.hc_handle = connection->hc_handle,
-		.hc_phone = -1
+		.hc_sess = NULL
 	};
 
Index: uspace/lib/usbdev/src/pipepriv.c
===================================================================
--- uspace/lib/usbdev/src/pipepriv.c	(revision 70452dd41310ff17f35dcb915b66bab0d5fd7c5f)
+++ uspace/lib/usbdev/src/pipepriv.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -44,5 +44,5 @@
 void pipe_start_transaction(usb_pipe_t *pipe)
 {
-	fibril_mutex_lock(&pipe->hc_phone_mutex);
+	fibril_mutex_lock(&pipe->hc_sess_mutex);
 }
 
@@ -53,5 +53,5 @@
 void pipe_end_transaction(usb_pipe_t *pipe)
 {
-	fibril_mutex_unlock(&pipe->hc_phone_mutex);
+	fibril_mutex_unlock(&pipe->hc_sess_mutex);
 }
 
@@ -85,26 +85,31 @@
 {
 	pipe_acquire(pipe);
-
+	
 	if (pipe->refcount == 0) {
 		/* Need to open the phone by ourselves. */
-		int phone = devman_device_connect(pipe->wire->hc_handle, 0);
-		if (phone < 0) {
+		async_sess_t *sess =
+		    devman_device_connect(EXCHANGE_SERIALIZE, pipe->wire->hc_handle, 0);
+		if (!sess) {
 			if (hide_failure) {
 				pipe->refcount_soft++;
-				phone = EOK;
+				pipe_release(pipe);
+				return EOK;
 			}
+			
 			pipe_release(pipe);
-			return phone;
+			return ENOMEM;
 		}
+		
 		/*
 		 * No locking is needed, refcount is zero and whole pipe
 		 * mutex is locked.
 		 */
-		pipe->hc_phone = phone;
+		
+		pipe->hc_sess = sess;
 	}
+	
 	pipe->refcount++;
-
 	pipe_release(pipe);
-
+	
 	return EOK;
 }
@@ -117,4 +122,5 @@
 {
 	pipe_acquire(pipe);
+	
 	if (pipe->refcount_soft > 0) {
 		pipe->refcount_soft--;
@@ -122,11 +128,15 @@
 		return;
 	}
+	
 	assert(pipe->refcount > 0);
+	
 	pipe->refcount--;
+	
 	if (pipe->refcount == 0) {
 		/* We were the last users, let's hang-up. */
-		async_hangup(pipe->hc_phone);
-		pipe->hc_phone = -1;
+		async_hangup(pipe->hc_sess);
+		pipe->hc_sess = NULL;
 	}
+	
 	pipe_release(pipe);
 }
Index: uspace/lib/usbdev/src/pipes.c
===================================================================
--- uspace/lib/usbdev/src/pipes.c	(revision 70452dd41310ff17f35dcb915b66bab0d5fd7c5f)
+++ uspace/lib/usbdev/src/pipes.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -48,12 +48,12 @@
 /** Tell USB address assigned to given device.
  *
- * @param phone Phone to parent device.
+ * @param sess Session to parent device.
  * @param dev Device in question.
  * @return USB address or error code.
  */
-static usb_address_t get_my_address(int phone, ddf_dev_t *dev)
-{
-	sysarg_t address;
-
+static usb_address_t get_my_address(async_sess_t *sess, ddf_dev_t *dev)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
+	
 	/*
 	 * We are sending special value as a handle - zero - to get
@@ -61,12 +61,13 @@
 	 * when registering our device @p dev.
 	 */
-	int rc = async_req_2_1(phone, DEV_IFACE_ID(USB_DEV_IFACE),
-	    IPC_M_USB_GET_ADDRESS,
-	    0, &address);
-
-	if (rc != EOK) {
+	sysarg_t address;
+	int rc = async_req_2_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
+	    IPC_M_USB_GET_ADDRESS, 0, &address);
+	
+	async_exchange_end(exch);
+	
+	if (rc != EOK)
 		return rc;
-	}
-
+	
 	return (usb_address_t) address;
 }
@@ -79,21 +80,22 @@
 int usb_device_get_assigned_interface(ddf_dev_t *device)
 {
-	int parent_phone = devman_parent_device_connect(device->handle,
+	async_sess_t *parent_sess =
+	    devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle,
 	    IPC_FLAG_BLOCKING);
-	if (parent_phone < 0) {
+	if (!parent_sess)
 		return -1;
-	}
-
+	
+	async_exch_t *exch = async_exchange_begin(parent_sess);
+	
 	sysarg_t iface_no;
-	int rc = async_req_2_1(parent_phone, DEV_IFACE_ID(USB_DEV_IFACE),
-	    IPC_M_USB_GET_INTERFACE,
-	    device->handle, &iface_no);
-
-	async_hangup(parent_phone);
-
-	if (rc != EOK) {
+	int rc = async_req_2_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
+	    IPC_M_USB_GET_INTERFACE, device->handle, &iface_no);
+	
+	async_exchange_end(exch);
+	async_hangup(parent_sess);
+	
+	if (rc != EOK)
 		return -1;
-	}
-
+	
 	return (int) iface_no;
 }
@@ -110,20 +112,19 @@
 	assert(connection);
 	assert(dev);
-
+	
 	int rc;
 	devman_handle_t hc_handle;
 	usb_address_t my_address;
-
+	
 	rc = usb_hc_find(dev->handle, &hc_handle);
-	if (rc != EOK) {
+	if (rc != EOK)
 		return rc;
-	}
-
-	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;
+	
 	/*
 	 * Asking for "my" address may require several attempts.
@@ -137,7 +138,8 @@
 	 *  So, we need to wait for the HC to learn the binding.
 	 */
+	
 	do {
-		my_address = get_my_address(parent_phone, dev);
-
+		my_address = get_my_address(parent_sess, dev);
+		
 		if (my_address == ENOENT) {
 			/* Be nice, let other fibrils run and try again. */
@@ -148,12 +150,12 @@
 			goto leave;
 		}
-
+	
 	} while (my_address < 0);
-
+	
 	rc = usb_device_connection_initialize(connection,
 	    hc_handle, my_address);
-
+	
 leave:
-	async_hangup(parent_phone);
+	async_hangup(parent_sess);
 	return rc;
 }
Index: uspace/lib/usbdev/src/pipesinit.c
===================================================================
--- uspace/lib/usbdev/src/pipesinit.c	(revision 70452dd41310ff17f35dcb915b66bab0d5fd7c5f)
+++ uspace/lib/usbdev/src/pipesinit.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -358,6 +358,6 @@
 	fibril_mutex_initialize(&pipe->guard);
 	pipe->wire = connection;
-	pipe->hc_phone = -1;
-	fibril_mutex_initialize(&pipe->hc_phone_mutex);
+	pipe->hc_sess = NULL;
+	fibril_mutex_initialize(&pipe->hc_sess_mutex);
 	pipe->endpoint_no = endpoint_no;
 	pipe->transfer_type = transfer_type;
@@ -482,20 +482,23 @@
 	assert(pipe);
 	assert(hc_connection);
-
-	if (!usb_hc_connection_is_opened(hc_connection)) {
+	
+	if (!usb_hc_connection_is_opened(hc_connection))
 		return EBADF;
-	}
-
+	
 #define _PACK2(high, low) (((high) << 16) + (low))
 #define _PACK3(high, middle, low) (((((high) << 8) + (middle)) << 8) + (low))
-
-	return async_req_4_0(hc_connection->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE), IPC_M_USBHC_REGISTER_ENDPOINT,
+	
+	async_exch_t *exch = async_exchange_begin(hc_connection->hc_sess);
+	int rc = async_req_4_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_REGISTER_ENDPOINT,
 	    _PACK2(pipe->wire->address, pipe->endpoint_no),
 	    _PACK3(speed, pipe->transfer_type, pipe->direction),
 	    _PACK2(pipe->max_packet_size, interval));
-
+	async_exchange_end(exch);
+	
 #undef _PACK2
 #undef _PACK3
+	
+	return rc;
 }
 
@@ -511,12 +514,15 @@
 	assert(pipe);
 	assert(hc_connection);
-
-	if (!usb_hc_connection_is_opened(hc_connection)) {
+	
+	if (!usb_hc_connection_is_opened(hc_connection))
 		return EBADF;
-	}
-
-	return async_req_4_0(hc_connection->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE), IPC_M_USBHC_UNREGISTER_ENDPOINT,
+	
+	async_exch_t *exch = async_exchange_begin(hc_connection->hc_sess);
+	int rc = async_req_4_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_UNREGISTER_ENDPOINT,
 	    pipe->wire->address, pipe->endpoint_no, pipe->direction);
+	async_exchange_end(exch);
+	
+	return rc;
 }
 
Index: uspace/lib/usbdev/src/pipesio.c
===================================================================
--- uspace/lib/usbdev/src/pipesio.c	(revision 70452dd41310ff17f35dcb915b66bab0d5fd7c5f)
+++ uspace/lib/usbdev/src/pipesio.c	(revision 79ae36ddc409577eb0da3750b3a7280e034566a2)
@@ -44,4 +44,5 @@
  * obviously).
  */
+
 #include <usb/usb.h>
 #include <usb/dev/pipes.h>
@@ -50,4 +51,5 @@
 #include <usbhc_iface.h>
 #include <usb/dev/request.h>
+#include <async.h>
 #include "pipepriv.h"
 
@@ -79,33 +81,35 @@
 			return ENOTSUP;
 	}
-
+	
 	/* Ensure serialization over the phone. */
 	pipe_start_transaction(pipe);
-
+	async_exch_t *exch = async_exchange_begin(pipe->hc_sess);
+	
 	/*
 	 * Make call identifying target USB device and type of transfer.
 	 */
-	aid_t opening_request = async_send_3(pipe->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE), ipc_method,
-	    pipe->wire->address, pipe->endpoint_no,
-	    NULL);
+	aid_t opening_request = async_send_3(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    ipc_method, pipe->wire->address, pipe->endpoint_no, NULL);
+	
 	if (opening_request == 0) {
+		async_exchange_end(exch);
 		pipe_end_transaction(pipe);
 		return ENOMEM;
 	}
-
+	
 	/*
 	 * Retrieve the data.
 	 */
 	ipc_call_t data_request_call;
-	aid_t data_request = async_data_read(pipe->hc_phone, buffer, size,
+	aid_t data_request = async_data_read(exch, buffer, size,
 	    &data_request_call);
-
+	
 	/*
 	 * Since now on, someone else might access the backing phone
 	 * without breaking the transfer IPC protocol.
 	 */
+	async_exchange_end(exch);
 	pipe_end_transaction(pipe);
-
+	
 	if (data_request == 0) {
 		/*
@@ -116,5 +120,5 @@
 		return ENOMEM;
 	}
-
+	
 	/*
 	 * Wait for the answer.
@@ -124,5 +128,5 @@
 	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. */
@@ -136,7 +140,7 @@
 		return (int) opening_request_rc;
 	}
-
+	
 	*size_transfered = IPC_GET_ARG2(data_request_call);
-
+	
 	return EOK;
 }
@@ -228,33 +232,35 @@
 	/* Ensure serialization over the phone. */
 	pipe_start_transaction(pipe);
-
+	async_exch_t *exch = async_exchange_begin(pipe->hc_sess);
+	
 	/*
 	 * Make call identifying target USB device and type of transfer.
 	 */
-	aid_t opening_request = async_send_3(pipe->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE), ipc_method,
-	    pipe->wire->address, pipe->endpoint_no,
-	    NULL);
+	aid_t opening_request = async_send_3(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    ipc_method, pipe->wire->address, pipe->endpoint_no, NULL);
+	
 	if (opening_request == 0) {
+		async_exchange_end(exch);
 		pipe_end_transaction(pipe);
 		return ENOMEM;
 	}
-
+	
 	/*
 	 * Send the data.
 	 */
-	int rc = async_data_write_start(pipe->hc_phone, buffer, size);
-
+	int rc = async_data_write_start(exch, buffer, size);
+	
 	/*
 	 * Since now on, someone else might access the backing phone
 	 * without breaking the transfer IPC protocol.
 	 */
+	async_exchange_end(exch);
 	pipe_end_transaction(pipe);
-
+	
 	if (rc != EOK) {
 		async_wait_for(opening_request, NULL);
 		return rc;
 	}
-
+	
 	/*
 	 * Wait for the answer.
@@ -262,5 +268,5 @@
 	sysarg_t opening_request_rc;
 	async_wait_for(opening_request, &opening_request_rc);
-
+	
 	return (int) opening_request_rc;
 }
@@ -349,38 +355,39 @@
 	 * Make call identifying target USB device and control transfer type.
 	 */
-	aid_t opening_request = async_send_3(pipe->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE), IPC_M_USBHC_CONTROL_READ,
-	    pipe->wire->address, pipe->endpoint_no,
+	async_exch_t *exch = async_exchange_begin(pipe->hc_sess);
+	aid_t opening_request = async_send_3(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_CONTROL_READ, pipe->wire->address, pipe->endpoint_no,
 	    NULL);
+	
 	if (opening_request == 0) {
+		async_exchange_end(exch);
 		return ENOMEM;
 	}
-
+	
 	/*
 	 * Send the setup packet.
 	 */
-	int rc = async_data_write_start(pipe->hc_phone,
-	    setup_buffer, setup_buffer_size);
-	if (rc != EOK) {
+	int rc = async_data_write_start(exch, setup_buffer, setup_buffer_size);
+	if (rc != EOK) {
+		async_exchange_end(exch);
 		pipe_end_transaction(pipe);
 		async_wait_for(opening_request, NULL);
 		return rc;
 	}
-
+	
 	/*
 	 * Retrieve the data.
 	 */
 	ipc_call_t data_request_call;
-	aid_t data_request = async_data_read(pipe->hc_phone,
-	    data_buffer, data_buffer_size,
-	    &data_request_call);
-
+	aid_t data_request = async_data_read(exch, data_buffer,
+	    data_buffer_size, &data_request_call);
+	
 	/*
 	 * Since now on, someone else might access the backing phone
 	 * without breaking the transfer IPC protocol.
 	 */
+	async_exchange_end(exch);
 	pipe_end_transaction(pipe);
-
-
+	
 	if (data_request == 0) {
 		async_wait_for(opening_request, NULL);
@@ -494,35 +501,36 @@
 	 * Make call identifying target USB device and control transfer type.
 	 */
-	aid_t opening_request = async_send_4(pipe->hc_phone,
-	    DEV_IFACE_ID(USBHC_DEV_IFACE), IPC_M_USBHC_CONTROL_WRITE,
-	    pipe->wire->address, pipe->endpoint_no,
-	    data_buffer_size,
-	    NULL);
+	async_exch_t *exch = async_exchange_begin(pipe->hc_sess);
+	aid_t opening_request = async_send_4(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_CONTROL_WRITE, pipe->wire->address, pipe->endpoint_no,
+	    data_buffer_size, NULL);
+	
 	if (opening_request == 0) {
+		async_exchange_end(exch);
 		pipe_end_transaction(pipe);
 		return ENOMEM;
 	}
-
+	
 	/*
 	 * Send the setup packet.
 	 */
-	int rc = async_data_write_start(pipe->hc_phone,
-	    setup_buffer, setup_buffer_size);
-	if (rc != EOK) {
+	int rc = async_data_write_start(exch, setup_buffer, setup_buffer_size);
+	if (rc != EOK) {
+		async_exchange_end(exch);
 		pipe_end_transaction(pipe);
 		async_wait_for(opening_request, NULL);
 		return rc;
 	}
-
+	
 	/*
 	 * Send the data (if any).
 	 */
 	if (data_buffer_size > 0) {
-		rc = async_data_write_start(pipe->hc_phone,
-		    data_buffer, data_buffer_size);
-
+		rc = async_data_write_start(exch, data_buffer, data_buffer_size);
+		
 		/* All data sent, pipe can be released. */
+		async_exchange_end(exch);
 		pipe_end_transaction(pipe);
-
+	
 		if (rc != EOK) {
 			async_wait_for(opening_request, NULL);
@@ -531,7 +539,8 @@
 	} else {
 		/* No data to send, we can release the pipe for others. */
+		async_exchange_end(exch);
 		pipe_end_transaction(pipe);
 	}
-
+	
 	/*
 	 * Wait for the answer.
