Index: uspace/drv/bus/usb/ehci/ehci_endpoint.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_endpoint.c	(revision 5f5321eee7f6f64bb0d3ae16e416c1cf8e54d183)
+++ uspace/drv/bus/usb/ehci/ehci_endpoint.c	(revision 763dbcb6fa814713064622f2edceaccfc70dd70b)
@@ -107,9 +107,9 @@
 	ehci_endpoint_t *instance = ehci_endpoint_get(ep);
 	hc_dequeue_endpoint(hcd->driver.data, ep);
+	endpoint_clear_hc_data(ep);
 	if (instance) {
 		free32(instance->qh);
 		free(instance);
 	}
-	endpoint_clear_hc_data(ep);
 }
 /**
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision 5f5321eee7f6f64bb0d3ae16e416c1cf8e54d183)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision 763dbcb6fa814713064622f2edceaccfc70dd70b)
@@ -176,4 +176,5 @@
 	list_initialize(&instance->pending_batches);
 	fibril_mutex_initialize(&instance->guard);
+	fibril_condvar_initialize(&instance->async_doorbell);
 
 	ret = hc_init_memory(instance);
@@ -230,4 +231,24 @@
 void hc_dequeue_endpoint(hc_t *instance, const endpoint_t *ep)
 {
+	assert(instance);
+	assert(ep);
+	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
+	switch (ep->transfer_type)
+	{
+	case USB_TRANSFER_INTERRUPT:
+		endpoint_list_append_ep(&instance->int_list, ehci_ep);
+		/* Fall through */
+	case USB_TRANSFER_ISOCHRONOUS:
+		/* NOT SUPPORTED */
+		return;
+	case USB_TRANSFER_CONTROL:
+	case USB_TRANSFER_BULK:
+		endpoint_list_remove_ep(&instance->async_list, ehci_ep);
+		break;
+	}
+	fibril_mutex_lock(&instance->guard);
+	EHCI_SET(instance->registers->usbcmd, USB_CMD_ASYNC_SCHEDULE_FLAG);
+	fibril_condvar_wait(&instance->async_doorbell, &instance->guard);
+	fibril_mutex_unlock(&instance->guard);
 }
 
@@ -279,4 +300,7 @@
 	if (status & USB_STS_PORT_CHANGE_FLAG) {
 		ehci_rh_interrupt(&instance->rh);
+	}
+	if (status & USB_STS_ASYNC_SCHED_FLAG) {
+		fibril_condvar_signal(&instance->async_doorbell);
 	}
 }
@@ -313,6 +337,6 @@
 	}
 	/* Enable interrupts */
-	EHCI_WR(instance->registers->usbintr, USB_INTR_PORT_CHANGE_FLAG | USB_INTR_IRQ_FLAG);
-	/* Use lower 4G segment */
+	EHCI_WR(instance->registers->usbintr, USB_INTR_PORT_CHANGE_FLAG | USB_INTR_IRQ_FLAG | USB_INTR_ASYNC_ADVANCE_FLAG);
+	/* Use the lowest 4G segment */
 	EHCI_WR(instance->registers->ctrldssegment, 0);
 	/* Set periodic list */
@@ -326,4 +350,5 @@
 	EHCI_SET(instance->registers->usbcmd, USB_CMD_RUN_FLAG);
 	EHCI_SET(instance->registers->configflag, USB_CONFIG_FLAG_FLAG);
+
 #if 0
 	/*
Index: uspace/drv/bus/usb/ehci/hc.h
===================================================================
--- uspace/drv/bus/usb/ehci/hc.h	(revision 5f5321eee7f6f64bb0d3ae16e416c1cf8e54d183)
+++ uspace/drv/bus/usb/ehci/hc.h	(revision 763dbcb6fa814713064622f2edceaccfc70dd70b)
@@ -75,4 +75,7 @@
 	fibril_mutex_t guard;
 
+	/** Wait for hc to restart async chedule */
+	fibril_condvar_t async_doorbell;
+
 	/** USB hub emulation structure */
 	ehci_rh_t rh;
