Index: uspace/drv/uhci-hcd/hc.c
===================================================================
--- uspace/drv/uhci-hcd/hc.c	(revision d93b3e36bf0cc42d6485a352380282177488c228)
+++ uspace/drv/uhci-hcd/hc.c	(revision 1585c7e5b41f63d6862b9c2d4e5e2043ea72abad)
@@ -336,4 +336,8 @@
 	    instance->transfers[batch->speed][batch->transfer_type];
 	assert(list);
+	if (batch->transfer_type == USB_TRANSFER_CONTROL) {
+		usb_device_keeper_use_control(
+		    &instance->manager, batch->target.address);
+	}
 	transfer_list_add_batch(list, batch);
 
@@ -357,8 +361,25 @@
 	/* Lower 2 bits are transaction error and transaction complete */
 	if (status & 0x3) {
-		transfer_list_remove_finished(&instance->transfers_interrupt);
-		transfer_list_remove_finished(&instance->transfers_control_slow);
-		transfer_list_remove_finished(&instance->transfers_control_full);
-		transfer_list_remove_finished(&instance->transfers_bulk_full);
+		LIST_INITIALIZE(done);
+		transfer_list_remove_finished(
+		    &instance->transfers_interrupt, &done);
+		transfer_list_remove_finished(
+		    &instance->transfers_control_slow, &done);
+		transfer_list_remove_finished(
+		    &instance->transfers_control_full, &done);
+		transfer_list_remove_finished(
+		    &instance->transfers_bulk_full, &done);
+
+		while (!list_empty(&done)) {
+			link_t *item = done.next;
+			list_remove(item);
+			usb_transfer_batch_t *batch =
+			    list_get_instance(item, usb_transfer_batch_t, link);
+			if (batch->transfer_type == USB_TRANSFER_CONTROL) {
+				usb_device_keeper_release_control(
+				    &instance->manager, batch->target.address);
+			}
+			batch->next_step(batch);
+		}
 	}
 	/* bits 4 and 5 indicate hc error */
Index: uspace/drv/uhci-hcd/transfer_list.c
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.c	(revision d93b3e36bf0cc42d6485a352380282177488c228)
+++ uspace/drv/uhci-hcd/transfer_list.c	(revision 1585c7e5b41f63d6862b9c2d4e5e2043ea72abad)
@@ -142,9 +142,8 @@
  * this transfer list leading to the deadlock if its done inline.
  */
-void transfer_list_remove_finished(transfer_list_t *instance)
-{
-	assert(instance);
-
-	LIST_INITIALIZE(done);
+void transfer_list_remove_finished(transfer_list_t *instance, link_t *done)
+{
+	assert(instance);
+	assert(done);
 
 	fibril_mutex_lock(&instance->guard);
@@ -158,5 +157,5 @@
 			/* Save for post-processing */
 			transfer_list_remove_batch(instance, batch);
-			list_append(current, &done);
+			list_append(current, done);
 		}
 		current = next;
@@ -164,12 +163,4 @@
 	fibril_mutex_unlock(&instance->guard);
 
-	async_usleep(1000);
-	while (!list_empty(&done)) {
-		link_t *item = done.next;
-		list_remove(item);
-		usb_transfer_batch_t *batch =
-		    list_get_instance(item, usb_transfer_batch_t, link);
-		batch->next_step(batch);
-	}
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/uhci-hcd/transfer_list.h
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.h	(revision d93b3e36bf0cc42d6485a352380282177488c228)
+++ uspace/drv/uhci-hcd/transfer_list.h	(revision 1585c7e5b41f63d6862b9c2d4e5e2043ea72abad)
@@ -67,5 +67,5 @@
 void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch);
 
-void transfer_list_remove_finished(transfer_list_t *instance);
+void transfer_list_remove_finished(transfer_list_t *instance, link_t *done);
 
 void transfer_list_abort_all(transfer_list_t *instance);
