Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision ad29045f6fb1cc776d3102c17056834e1f3f7b7f)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 3cc5ccda9b784d3ca357dc5ba7ce9faaba72a3ba)
@@ -33,4 +33,5 @@
  */
 #include <errno.h>
+#include <adt/list.h>
 
 #include <usb/debug.h>
@@ -89,4 +90,5 @@
 
 	list_initialize(&instance->tracker_list);
+	fibril_mutex_initialize(&instance->tracker_list_mutex);
 
 	instance->cleaner = fibril_create(uhci_clean_finished, instance);
@@ -164,4 +166,10 @@
 	/* TODO: check available bandwith here */
 
+	usb_log_debug2("Scheduler(%d) acquiring tracker list mutex.\n",
+	    fibril_get_id());
+	fibril_mutex_lock(&instance->tracker_list_mutex);
+	usb_log_debug2("Scheduler(%d) acquired tracker list mutex.\n",
+	    fibril_get_id());
+
 	transfer_list_t *list =
 	    instance->transfers[low_speed][tracker->transfer_type];
@@ -170,4 +178,10 @@
 	list_append(&tracker->link, &instance->tracker_list);
 
+	usb_log_debug2("Scheduler(%d) releasing tracker list mutex.\n",
+	    fibril_get_id());
+	fibril_mutex_unlock(&instance->tracker_list_mutex);
+	usb_log_debug2("Scheduler(%d) released tracker list mutex.\n",
+	    fibril_get_id());
+
 	return EOK;
 }
@@ -180,8 +194,17 @@
 
 	while(1) {
+		LIST_INITIALIZE(done_trackers);
 		/* tracker iteration */
+
+		usb_log_debug2("Cleaner(%d) acquiring tracker list mutex.\n",
+		    fibril_get_id());
+		fibril_mutex_lock(&instance->tracker_list_mutex);
+		usb_log_debug2("Cleaner(%d) acquired tracker list mutex.\n",
+		    fibril_get_id());
+
 		link_t *current = instance->tracker_list.next;
 		while (current != &instance->tracker_list)
 		{
+
 			link_t *next = current->next;
 			tracker_t *tracker = list_get_instance(current, tracker_t, link);
@@ -196,7 +219,20 @@
 				    tracker->td->status, tracker->td->device);
 				list_remove(current);
-				tracker->next_step(tracker);
+				list_append(current, &done_trackers);
 			}
 			current = next;
+		}
+
+		usb_log_debug2("Cleaner(%d) releasing tracker list mutex.\n",
+		    fibril_get_id());
+		fibril_mutex_unlock(&instance->tracker_list_mutex);
+		usb_log_debug2("Cleaner(%d) released tracker list mutex.\n",
+		    fibril_get_id());
+
+		while (!list_empty(&done_trackers)) {
+			tracker_t *tracker = list_get_instance(
+			  done_trackers.next, tracker_t, link);
+			list_remove(&tracker->link);
+			tracker->next_step(tracker);
 		}
 		async_usleep(UHCI_CLEANER_TIMEOUT);
Index: uspace/drv/uhci-hcd/uhci.h
===================================================================
--- uspace/drv/uhci-hcd/uhci.h	(revision ad29045f6fb1cc776d3102c17056834e1f3f7b7f)
+++ uspace/drv/uhci-hcd/uhci.h	(revision 3cc5ccda9b784d3ca357dc5ba7ce9faaba72a3ba)
@@ -37,4 +37,5 @@
 
 #include <fibril.h>
+#include <fibril_synch.h>
 #include <adt/list.h>
 
@@ -81,4 +82,5 @@
 
 	link_t tracker_list;
+	fibril_mutex_t tracker_list_mutex;
 
 	transfer_list_t transfers_bulk_full;
Index: uspace/drv/uhci-hcd/uhci_struct/queue_head.h
===================================================================
--- uspace/drv/uhci-hcd/uhci_struct/queue_head.h	(revision ad29045f6fb1cc776d3102c17056834e1f3f7b7f)
+++ uspace/drv/uhci-hcd/uhci_struct/queue_head.h	(revision 3cc5ccda9b784d3ca357dc5ba7ce9faaba72a3ba)
@@ -43,6 +43,6 @@
 
 typedef struct queue_head {
-	link_pointer_t next_queue;
-	link_pointer_t element;
+	volatile link_pointer_t next_queue;
+	volatile link_pointer_t element;
 } __attribute__((packed)) queue_head_t;
 
