Index: uspace/drv/uhci-hcd/batch.c
===================================================================
--- uspace/drv/uhci-hcd/batch.c	(revision 71b6e92081c1ec7a1d306bbd9353e4f75dbe34c4)
+++ uspace/drv/uhci-hcd/batch.c	(revision 7f810b370680b8fdfedc51dd6d60b07d6997139f)
@@ -318,4 +318,5 @@
 		++packet;
 	}
+	instance->tds[packet - 1].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
 	device_keeper_set_toggle(instance->manager, instance->target, toggle);
 }
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision 71b6e92081c1ec7a1d306bbd9353e4f75dbe34c4)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 7f810b370680b8fdfedc51dd6d60b07d6997139f)
@@ -372,8 +372,11 @@
 	assert(instance);
 	/* TODO: Check interrupt cause here */
-	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);
+	/* 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);
+	}
 }
 /*----------------------------------------------------------------------------*/
@@ -390,10 +393,10 @@
 
 	while (1) {
+		/* read and ack interrupts */
 		uint16_t status = pio_read_16(&instance->registers->usbsts);
+		pio_write_16(&instance->registers->usbsts, 0x1f);
 		if (status != 0)
 			usb_log_debug2("UHCI status: %x.\n", status);
-		status |= 1;
 		uhci_interrupt(instance, status);
-		pio_write_16(&instance->registers->usbsts, 0x1f);
 		async_usleep(UHCI_CLEANER_TIMEOUT);
 	}
Index: uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.h
===================================================================
--- uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.h	(revision 71b6e92081c1ec7a1d306bbd9353e4f75dbe34c4)
+++ uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.h	(revision 7f810b370680b8fdfedc51dd6d60b07d6997139f)
@@ -91,7 +91,7 @@
 
 
-void td_init(td_t *instance, int error_count, size_t size, bool toggle, bool iso,
-    bool low_speed, usb_target_t target, usb_packet_id pid, void *buffer,
-    td_t *next);
+void td_init(td_t *instance, int error_count, size_t size, bool toggle,
+    bool iso, bool low_speed, usb_target_t target, usb_packet_id pid,
+    void *buffer, td_t *next);
 
 int td_status(td_t *instance);
