Index: uspace/lib/usb/include/usb/pipes.h
===================================================================
--- uspace/lib/usb/include/usb/pipes.h	(revision 61727bf36357abe753a1c572def9dfcdb44253ad)
+++ uspace/lib/usb/include/usb/pipes.h	(revision d5ac90f0e33c4c353bae229add2cc7d993740ee7)
@@ -42,4 +42,5 @@
 #include <ipc/devman.h>
 #include <ddf/driver.h>
+#include <fibril_synch.h>
 
 /** Abstraction of a physical connection to the device.
@@ -80,4 +81,7 @@
 	 */
 	int hc_phone;
+
+	/** Guard for serialization of requests over the phone. */
+	fibril_mutex_t hc_phone_mutex;
 } usb_pipe_t;
 
Index: uspace/lib/usb/src/pipesinit.c
===================================================================
--- uspace/lib/usb/src/pipesinit.c	(revision 61727bf36357abe753a1c572def9dfcdb44253ad)
+++ uspace/lib/usb/src/pipesinit.c	(revision d5ac90f0e33c4c353bae229add2cc7d993740ee7)
@@ -358,4 +358,5 @@
 	pipe->wire = connection;
 	pipe->hc_phone = -1;
+	fibril_mutex_initialize(&pipe->hc_phone_mutex);
 	pipe->endpoint_no = endpoint_no;
 	pipe->transfer_type = transfer_type;
Index: uspace/lib/usb/src/pipesio.c
===================================================================
--- uspace/lib/usb/src/pipesio.c	(revision 61727bf36357abe753a1c572def9dfcdb44253ad)
+++ uspace/lib/usb/src/pipesio.c	(revision d5ac90f0e33c4c353bae229add2cc7d993740ee7)
@@ -50,4 +50,24 @@
 #include <usbhc_iface.h>
 
+/** Ensure exclusive access to the IPC phone of given pipe.
+ *
+ * @param pipe Pipe to be exclusively accessed.
+ */
+static void pipe_acquire(usb_pipe_t *pipe)
+{
+	fibril_mutex_lock(&pipe->hc_phone_mutex);
+}
+
+/** Terminate exclusive access to the IPC phone of given pipe.
+ *
+ * @param pipe Pipe to be released from exclusive usage.
+ */
+static void pipe_release(usb_pipe_t *pipe)
+{
+	fibril_mutex_unlock(&pipe->hc_phone_mutex);
+}
+
+
+
 /** Request an in transfer, no checking of input parameters.
  *
@@ -78,4 +98,7 @@
 	}
 
+	/* Ensure serialization over the phone. */
+	pipe_acquire(pipe);
+
 	/*
 	 * Make call identifying target USB device and type of transfer.
@@ -87,4 +110,5 @@
 	    NULL);
 	if (opening_request == 0) {
+		pipe_release(pipe);
 		return ENOMEM;
 	}
@@ -96,4 +120,10 @@
 	aid_t data_request = async_data_read(pipe->hc_phone, buffer, size,
 	    &data_request_call);
+
+	/*
+	 * Since now on, someone else might access the backing phone
+	 * without breaking the transfer IPC protocol.
+	 */
+	pipe_release(pipe);
 
 	if (data_request == 0) {
@@ -210,4 +240,7 @@
 	}
 
+	/* Ensure serialization over the phone. */
+	pipe_acquire(pipe);
+
 	/*
 	 * Make call identifying target USB device and type of transfer.
@@ -219,4 +252,5 @@
 	    NULL);
 	if (opening_request == 0) {
+		pipe_release(pipe);
 		return ENOMEM;
 	}
@@ -226,4 +260,11 @@
 	 */
 	int rc = async_data_write_start(pipe->hc_phone, buffer, size);
+
+	/*
+	 * Since now on, someone else might access the backing phone
+	 * without breaking the transfer IPC protocol.
+	 */
+	pipe_release(pipe);
+
 	if (rc != EOK) {
 		async_wait_for(opening_request, NULL);
@@ -293,4 +334,7 @@
     void *data_buffer, size_t data_buffer_size, size_t *data_transfered_size)
 {
+	/* Ensure serialization over the phone. */
+	pipe_acquire(pipe);
+
 	/*
 	 * Make call identifying target USB device and control transfer type.
@@ -311,4 +355,5 @@
 	    setup_buffer, setup_buffer_size);
 	if (rc != EOK) {
+		pipe_release(pipe);
 		async_wait_for(opening_request, NULL);
 		return rc;
@@ -322,4 +367,12 @@
 	    data_buffer, data_buffer_size,
 	    &data_request_call);
+
+	/*
+	 * Since now on, someone else might access the backing phone
+	 * without breaking the transfer IPC protocol.
+	 */
+	pipe_release(pipe);
+
+
 	if (data_request == 0) {
 		async_wait_for(opening_request, NULL);
@@ -418,4 +471,7 @@
     void *data_buffer, size_t data_buffer_size)
 {
+	/* Ensure serialization over the phone. */
+	pipe_acquire(pipe);
+
 	/*
 	 * Make call identifying target USB device and control transfer type.
@@ -428,4 +484,5 @@
 	    NULL);
 	if (opening_request == 0) {
+		pipe_release(pipe);
 		return ENOMEM;
 	}
@@ -437,4 +494,5 @@
 	    setup_buffer, setup_buffer_size);
 	if (rc != EOK) {
+		pipe_release(pipe);
 		async_wait_for(opening_request, NULL);
 		return rc;
@@ -447,8 +505,15 @@
 		rc = async_data_write_start(pipe->hc_phone,
 		    data_buffer, data_buffer_size);
+
+		/* All data sent, pipe can be released. */
+		pipe_release(pipe);
+
 		if (rc != EOK) {
 			async_wait_for(opening_request, NULL);
 			return rc;
 		}
+	} else {
+		/* No data to send, we can release the pipe for others. */
+		pipe_release(pipe);
 	}
 
