Index: uspace/drv/uhci-hcd/iface.c
===================================================================
--- uspace/drv/uhci-hcd/iface.c	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/iface.c	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -166,5 +166,5 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	usb_log_warning("Using deprecated API control write setup.\n");
+	usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
 	tracker_t *tracker = tracker_get(dev, target, USB_TRANSFER_CONTROL,
 	    8, FULL_SPEED, data, size, NULL, callback, arg);
@@ -179,4 +179,5 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
+	usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
 	tracker_t *tracker = tracker_get(dev, target, USB_TRANSFER_CONTROL,
 	    size, FULL_SPEED, data, size, NULL, callback, arg);
@@ -190,4 +191,5 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
+	usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
 	tracker_t *tracker = tracker_get(dev, target, USB_TRANSFER_CONTROL,
 	    0, FULL_SPEED, NULL, 0, callback, NULL, arg);
@@ -202,5 +204,5 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	usb_log_warning("Using deprecated API control read setup.\n");
+	usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
 	tracker_t *tracker = tracker_get(dev, target, USB_TRANSFER_CONTROL,
 	    8, FULL_SPEED, data, size, NULL, callback, arg);
@@ -215,4 +217,5 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
+	usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
 	tracker_t *tracker = tracker_get(dev, target, USB_TRANSFER_CONTROL,
 	    size, FULL_SPEED, data, size, callback, NULL, arg);
@@ -226,4 +229,5 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
+	usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
 	tracker_t *tracker = tracker_get(dev, target, USB_TRANSFER_CONTROL,
 	    0, FULL_SPEED, NULL, 0, NULL, callback, arg);
Index: uspace/drv/uhci-hcd/root_hub.c
===================================================================
--- uspace/drv/uhci-hcd/root_hub.c	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/root_hub.c	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -35,39 +35,11 @@
 #include <errno.h>
 #include <stdio.h>
-
 #include <usb_iface.h>
-
 #include <usb/debug.h>
 
 #include "root_hub.h"
+
+extern device_ops_t child_ops;
 /*----------------------------------------------------------------------------*/
-static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle)
-{
-  assert(dev);
-  assert(dev->parent != NULL);
-
-  device_t *parent = dev->parent;
-
-  if (parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) {
-    usb_iface_t *usb_iface
-        = (usb_iface_t *) parent->ops->interfaces[USB_DEV_IFACE];
-    assert(usb_iface != NULL);
-    if (usb_iface->get_hc_handle) {
-      int rc = usb_iface->get_hc_handle(parent, handle);
-      return rc;
-    }
-  }
-
-  return ENOTSUP;
-}
-/*----------------------------------------------------------------------------*/
-static usb_iface_t usb_iface = {
-  .get_hc_handle = usb_iface_get_hc_handle
-};
-
-static device_ops_t rh_ops = {
-	.interfaces[USB_DEV_IFACE] = &usb_iface
-};
-
 int setup_root_hub(device_t **device, device_t *hc)
 {
@@ -108,5 +80,5 @@
 	hub->name = name;
 	hub->parent = hc;
-	hub->ops = &rh_ops;
+	hub->ops = &child_ops;
 
 	*device = hub;
Index: uspace/drv/uhci-hcd/tracker.c
===================================================================
--- uspace/drv/uhci-hcd/tracker.c	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/tracker.c	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -37,4 +37,5 @@
 
 #include "tracker.h"
+#include "transfer_list.h"
 #include "uhci.h"
 #include "utils/malloc32.h"
@@ -387,4 +388,5 @@
 	assert(instance);
 	tracker_call_in(instance);
+	transfer_list_remove_tracker(instance->scheduled_list, instance);
 	free32(instance->td);
 	free32(instance->packet);
@@ -396,4 +398,6 @@
 	assert(instance);
 	tracker_call_out(instance);
+	assert(instance->scheduled_list);
+	transfer_list_remove_tracker(instance->scheduled_list, instance);
 	free32(instance->td);
 	free32(instance->packet);
Index: uspace/drv/uhci-hcd/tracker.h
===================================================================
--- uspace/drv/uhci-hcd/tracker.h	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/tracker.h	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -47,4 +47,6 @@
 } dev_speed_t;
 
+struct transfer_list;
+
 typedef struct tracker
 {
@@ -68,4 +70,6 @@
 	void (*next_step)(struct tracker*);
 	unsigned toggle:1;
+
+	struct transfer_list *scheduled_list;
 } tracker_t;
 
Index: uspace/drv/uhci-hcd/transfer_list.c
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.c	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/transfer_list.c	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -100,4 +100,17 @@
 	}
 }
+/*----------------------------------------------------------------------------*/
+void transfer_list_remove_tracker(transfer_list_t *instance, tracker_t *tracker)
+{
+	assert(instance);
+	assert(tracker);
+	assert(instance->queue_head);
+	assert(tracker->td);
+
+	uint32_t pa = (uintptr_t)addr_to_phys(tracker->td);
+	if ((instance->queue_head->element & LINK_POINTER_ADDRESS_MASK) == pa) {
+		instance->queue_head->element = tracker->td->next;
+	}
+}
 /**
  * @}
Index: uspace/drv/uhci-hcd/transfer_list.h
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.h	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/transfer_list.h	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -36,4 +36,5 @@
 
 #include "uhci_struct/queue_head.h"
+
 #include "tracker.h"
 
@@ -52,4 +53,5 @@
 void transfer_list_set_next(transfer_list_t *instance, transfer_list_t *next);
 
+
 static inline void transfer_list_fini(transfer_list_t *instance)
 {
@@ -58,6 +60,7 @@
 }
 
+void transfer_list_add_tracker(transfer_list_t *instance, tracker_t *tracker);
 
-void transfer_list_add_tracker(transfer_list_t *instance, tracker_t *tracker);
+void transfer_list_remove_tracker(transfer_list_t *instance, tracker_t *track);
 
 #endif
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/uhci.c	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -178,4 +178,6 @@
 	list_append(&tracker->link, &instance->tracker_list);
 
+	tracker->scheduled_list = list;
+
 	usb_log_debug2("Scheduler(%d) releasing tracker list mutex.\n",
 	    fibril_get_id());
Index: uspace/drv/uhci-hcd/uhci.h
===================================================================
--- uspace/drv/uhci-hcd/uhci.h	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/uhci.h	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -72,5 +72,5 @@
 
 #define UHCI_FRAME_LIST_COUNT 1024
-#define UHCI_CLEANER_TIMEOUT 10000
+#define UHCI_CLEANER_TIMEOUT 1000
 #define UHCI_DEBUGER_TIMEOUT 5000000
 
Index: uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c	(revision 4e8e1f51aca228845c8d503a3f52fbf34a47bb20)
+++ uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c	(revision edfed73c1e40066e7c0e6056eea635fd2cf30c06)
@@ -80,38 +80,27 @@
 #endif
 }
-
-static inline usb_transaction_outcome_t convert_outcome(uint32_t status)
-{
-	/*TODO: refactor into something sane */
-	/*TODO: add additional usb_errors to usb_outcome_t */
-
-	if (status & TD_STATUS_ERROR_STALLED)
-		return USB_OUTCOME_CRCERROR;
-
-	if (status & TD_STATUS_ERROR_BUFFER)
-		return USB_OUTCOME_CRCERROR;
-
-	if (status & TD_STATUS_ERROR_BABBLE)
-		return USB_OUTCOME_BABBLE;
-
-	if (status & TD_STATUS_ERROR_NAK)
-		return USB_OUTCOME_CRCERROR;
-
-  if (status & TD_STATUS_ERROR_CRC)
-		return USB_OUTCOME_CRCERROR;
-
-	if (status & TD_STATUS_ERROR_BIT_STUFF)
-		return USB_OUTCOME_CRCERROR;
-
-//	assert((((status >> TD_STATUS_ERROR_POS) & TD_STATUS_ERROR_MASK)
-//	| TD_STATUS_ERROR_RESERVED) == TD_STATUS_ERROR_RESERVED);
-	return USB_OUTCOME_OK;
-}
 /*----------------------------------------------------------------------------*/
 int transfer_descriptor_status(transfer_descriptor_t *instance)
 {
 	assert(instance);
-	if (convert_outcome(instance->status))
-		return EINVAL; //TODO: use sane error value here
+
+	if ((instance->status & TD_STATUS_ERROR_STALLED) != 0)
+		return EIO;
+
+	if ((instance->status & TD_STATUS_ERROR_CRC) != 0)
+		return EAGAIN;
+
+	if ((instance->status & TD_STATUS_ERROR_BUFFER) != 0)
+		return EAGAIN;
+
+	if ((instance->status & TD_STATUS_ERROR_BABBLE) != 0)
+		return EIO;
+
+	if ((instance->status & TD_STATUS_ERROR_NAK) != 0)
+		return EAGAIN;
+
+	if ((instance->status & TD_STATUS_ERROR_BIT_STUFF) != 0)
+		return EAGAIN;
+
 	return EOK;
 }
