Index: uspace/drv/uhci-hcd/batch.c
===================================================================
--- uspace/drv/uhci-hcd/batch.c	(revision c3ae877e50bebe06b28a4f14a1db4c3e38e097d9)
+++ uspace/drv/uhci-hcd/batch.c	(revision 86c2ccd245273c6c81f7d0d55fe8ea474dbd9cfd)
@@ -33,4 +33,5 @@
  */
 #include <errno.h>
+#include <str_error.h>
 
 #include <usb/debug.h>
@@ -194,4 +195,6 @@
 
 	instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
+	usb_log_debug("Control write last TD status: %x.\n",
+		instance->tds[i].status);
 
 	instance->next_step = batch_call_out_and_dispose;
@@ -228,4 +231,6 @@
 
 	instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
+	usb_log_debug("Control read last TD status: %x.\n",
+		instance->tds[i].status);
 
 	instance->next_step = batch_call_in_and_dispose;
@@ -293,6 +298,6 @@
 
 	int err = instance->error;
-	usb_log_info("Callback IN(%d): %d, %zu.\n", instance->transfer_type,
-	    err, instance->transfered_size);
+	usb_log_info("Callback IN(%d): %s(%d), %zu.\n", instance->transfer_type,
+	    str_error(err), err, instance->transfered_size);
 
 	instance->callback_in(instance->fun,
Index: uspace/drv/uhci-hcd/pci.c
===================================================================
--- uspace/drv/uhci-hcd/pci.c	(revision c3ae877e50bebe06b28a4f14a1db4c3e38e097d9)
+++ uspace/drv/uhci-hcd/pci.c	(revision 86c2ccd245273c6c81f7d0d55fe8ea474dbd9cfd)
@@ -90,6 +90,6 @@
 				io_address = res->res.io_range.address;
 				io_size = res->res.io_range.size;
-				usb_log_debug("Found io: %x %d.\n",
-				    res->res.io_range.address, res->res.io_range.size);
+				usb_log_debug("Found io: %llx %zu %zu.\n",
+				    res->res.io_range.address, res->res.io_range.size, io_size);
 				io_found = true;
 				break;
@@ -125,4 +125,5 @@
 	    IPC_FLAG_BLOCKING);
 	bool enabled = hw_res_enable_interrupt(parent_phone);
+	async_hangup(parent_phone);
 	return enabled ? EOK : EIO;
 }
Index: uspace/drv/uhci-hcd/transfer_list.c
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.c	(revision c3ae877e50bebe06b28a4f14a1db4c3e38e097d9)
+++ uspace/drv/uhci-hcd/transfer_list.c	(revision 86c2ccd245273c6c81f7d0d55fe8ea474dbd9cfd)
@@ -70,4 +70,5 @@
 	assert(instance);
 	assert(batch);
+	usb_log_debug("Adding batch(%p) to queue %s.\n", batch, instance->name);
 
 	uint32_t pa = (uintptr_t)addr_to_phys(batch->qh);
@@ -123,7 +124,10 @@
 }
 /*----------------------------------------------------------------------------*/
-void transfer_list_check(transfer_list_t *instance)
+void transfer_list_remove_finished(transfer_list_t *instance)
 {
 	assert(instance);
+
+	LIST_INITIALIZE(done);
+
 	fibril_mutex_lock(&instance->guard);
 	link_t *current = instance->batch_list.next;
@@ -134,9 +138,16 @@
 		if (batch_is_complete(batch)) {
 			transfer_list_remove_batch(instance, batch);
-			batch->next_step(batch);
+			list_append(current, &done);
 		}
 		current = next;
 	}
 	fibril_mutex_unlock(&instance->guard);
+
+	while (!list_empty(&done)) {
+		link_t *item = done.next;
+		list_remove(item);
+		batch_t *batch = list_get_instance(item, batch_t, link);
+		batch->next_step(batch);
+	}
 }
 /**
Index: uspace/drv/uhci-hcd/transfer_list.h
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.h	(revision c3ae877e50bebe06b28a4f14a1db4c3e38e097d9)
+++ uspace/drv/uhci-hcd/transfer_list.h	(revision 86c2ccd245273c6c81f7d0d55fe8ea474dbd9cfd)
@@ -60,5 +60,5 @@
 	queue_head_dispose(instance->queue_head);
 }
-void transfer_list_check(transfer_list_t *instance);
+void transfer_list_remove_finished(transfer_list_t *instance);
 
 void transfer_list_add_batch(transfer_list_t *instance, batch_t *batch);
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision c3ae877e50bebe06b28a4f14a1db4c3e38e097d9)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 86c2ccd245273c6c81f7d0d55fe8ea474dbd9cfd)
@@ -285,8 +285,8 @@
 		return;
 	usb_log_debug("UHCI interrupt: %X.\n", status);
-	transfer_list_check(&instance->transfers_interrupt);
-	transfer_list_check(&instance->transfers_control_slow);
-	transfer_list_check(&instance->transfers_control_full);
-	transfer_list_check(&instance->transfers_bulk_full);
+	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);
 }
 /*----------------------------------------------------------------------------*/
@@ -297,5 +297,5 @@
 	assert(instance);
 
-	while(1) {
+	while (1) {
 		uint16_t status = pio_read_16(&instance->registers->usbsts);
 		usb_log_debug("UHCI status: %x.\n", status);
@@ -303,5 +303,5 @@
 		uhci_interrupt(instance, status);
 		pio_write_16(&instance->registers->usbsts, 0x1f);
-		async_usleep(UHCI_CLEANER_TIMEOUT * 1000);
+		async_usleep(UHCI_CLEANER_TIMEOUT * 5);
 	}
 	return EOK;
Index: uspace/drv/uhci-hcd/utils/device_keeper.c
===================================================================
--- uspace/drv/uhci-hcd/utils/device_keeper.c	(revision c3ae877e50bebe06b28a4f14a1db4c3e38e097d9)
+++ uspace/drv/uhci-hcd/utils/device_keeper.c	(revision 86c2ccd245273c6c81f7d0d55fe8ea474dbd9cfd)
@@ -136,4 +136,5 @@
 			return address;
 		}
+		++address;
 	}
 	fibril_mutex_unlock(&instance->guard);
@@ -147,5 +148,4 @@
 	assert(address >= 0);
 	assert(address <= USB11_ADDRESS_MAX);
-	assert(instance->devices[address].occupied);
 	return instance->devices[address].speed;
 }
