Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision 23e5471a7e669e1c94154d4c5c294d521c8f6623)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision e9c5bd9fc1050fee7656e99b964ce9f120c6bb0b)
@@ -47,5 +47,5 @@
 
 //#include "ehci_endpoint.h"
-//#include "ehci_batch.h"
+#include "ehci_batch.h"
 #include "utils/malloc32.h"
 
@@ -280,8 +280,16 @@
 	/* Check for root hub communication */
 	if (batch->ep->address == ehci_rh_get_address(&instance->rh)) {
-		usb_log_debug("EHCI root hub request.\n");
 		return ehci_rh_schedule(&instance->rh, batch);
 	}
-	return ENOTSUP;
+	ehci_transfer_batch_t *ehci_batch = ehci_transfer_batch_get(batch);
+	if (!ehci_batch)
+		return ENOMEM;
+
+	fibril_mutex_lock(&instance->guard);
+	list_append(&ehci_batch->link, &instance->pending_batches);
+	ehci_transfer_batch_commit(ehci_batch);
+
+	fibril_mutex_unlock(&instance->guard);
+	return EOK;
 }
 
@@ -303,4 +311,22 @@
 		fibril_condvar_signal(&instance->async_doorbell);
 	}
+	if (status & (USB_STS_IRQ_FLAG | USB_STS_ERR_IRQ_FLAG)) {
+		fibril_mutex_lock(&instance->guard);
+
+		link_t *current = list_first(&instance->pending_batches);
+		while (current && current != &instance->pending_batches.head) {
+			link_t *next = current->next;
+			ehci_transfer_batch_t *batch =
+			    ehci_transfer_batch_from_link(current);
+
+			if (ehci_transfer_batch_is_complete(batch)) {
+				list_remove(current);
+				ehci_transfer_batch_finish_dispose(batch);
+			}
+			current = next;
+		}
+		fibril_mutex_unlock(&instance->guard);
+	}
+
 }
 
