Index: uspace/lib/usbdev/src/pipes.c
===================================================================
--- uspace/lib/usbdev/src/pipes.c	(revision 7f70d1c93f7231d3c5d9a97f24f6558552056488)
+++ uspace/lib/usbdev/src/pipes.c	(revision ba2fc2cc15256ed4e212519d27ecc3e87be7ba47)
@@ -191,10 +191,9 @@
 	}
 
-	/* Isochronous transfer are not supported (yet) */
-	if (pipe->desc.transfer_type != USB_TRANSFER_INTERRUPT &&
-	    pipe->desc.transfer_type != USB_TRANSFER_BULK)
-	    return ENOTSUP;
-
-	async_exch_t *exch = async_exchange_begin(pipe->bus_session);
+	async_exch_t *exch;
+	if (pipe->desc.transfer_type == USB_TRANSFER_ISOCHRONOUS)
+		exch = async_exchange_begin(pipe->isoch_session);
+	else
+	 	exch = async_exchange_begin(pipe->bus_session);
 	size_t act_size = 0;
 	const int rc =
@@ -232,13 +231,39 @@
 	}
 
-	/* Isochronous transfer are not supported (yet) */
-	if (pipe->desc.transfer_type != USB_TRANSFER_INTERRUPT &&
-	    pipe->desc.transfer_type != USB_TRANSFER_BULK)
-	    return ENOTSUP;
-
-	async_exch_t *exch = async_exchange_begin(pipe->bus_session);
+	async_exch_t *exch;
+	if (pipe->desc.transfer_type == USB_TRANSFER_ISOCHRONOUS)
+		exch = async_exchange_begin(pipe->isoch_session);
+	else
+	 	exch = async_exchange_begin(pipe->bus_session);
+
 	const int rc = usbhc_write(exch, pipe->desc.endpoint_no, 0, buffer, size);
 	async_exchange_end(exch);
 	return rc;
+}
+
+/** Setup isochronous session for isochronous communication.
+ *  Isochronous endpoints need a different session as they might block while waiting for data.
+ *
+ * @param pipe Endpoint pipe being initialized.
+ * @return Error code.
+ */
+static int usb_isoch_session_initialize(usb_pipe_t *pipe) {
+	devman_handle_t handle;
+
+	async_exch_t *exch = async_exchange_begin(pipe->bus_session);
+	if (!exch)
+		return EPARTY;
+
+	int ret = usb_get_my_device_handle(exch, &handle);
+
+	async_exchange_end(exch);
+	if (ret != EOK)
+		return ret;
+
+	pipe->isoch_session = usb_dev_connect(handle);
+	if (!pipe->isoch_session)
+		return ENAK;
+
+	return EOK;
 }
 
@@ -258,4 +283,5 @@
 	unsigned mult, usb_dev_session_t *bus_session)
 {
+	int ret = EOK;
 	// FIXME: refactor this function PLEASE
 	assert(pipe);
@@ -273,5 +299,9 @@
 	pipe->bus_session = bus_session;
 
-	return EOK;
+	if (transfer_type == USB_TRANSFER_ISOCHRONOUS) {
+		ret = usb_isoch_session_initialize(pipe);
+	}
+
+	return ret;
 }
 
