Index: uspace/drv/uhci-hcd/hc.c
===================================================================
--- uspace/drv/uhci-hcd/hc.c	(revision cd1cec3bc8deaa31b192d8430abb26ebf75ce6f3)
+++ uspace/drv/uhci-hcd/hc.c	(revision 4fd3faf06b8a4954818da61d7c31ecaba4839d5c)
@@ -332,8 +332,4 @@
 	    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);
-	}
 	transfer_list_add_batch(list, batch);
 
@@ -373,16 +369,4 @@
 			usb_transfer_batch_t *batch =
 			    list_get_instance(item, usb_transfer_batch_t, link);
-			switch (batch->transfer_type)
-			{
-			case USB_TRANSFER_CONTROL:
-				usb_device_keeper_release_control(
-				    &instance->manager, batch->target);
-				break;
-			case USB_TRANSFER_INTERRUPT:
-			case USB_TRANSFER_ISOCHRONOUS: {
-				}
-			default:
-				break;
-			}
 			usb_transfer_batch_finish(batch);
 		}
Index: uspace/drv/uhci-hcd/transfer_list.c
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.c	(revision cd1cec3bc8deaa31b192d8430abb26ebf75ce6f3)
+++ uspace/drv/uhci-hcd/transfer_list.c	(revision 4fd3faf06b8a4954818da61d7c31ecaba4839d5c)
@@ -132,12 +132,8 @@
 }
 /*----------------------------------------------------------------------------*/
-/** Check list for finished batches.
- *
- * @param[in] instance List to use.
- * @return Error code
- *
- * Creates a local list of finished batches and calls next_step on each and
- * every one. This is safer because next_step may theoretically access
- * this transfer list leading to the deadlock if its done inline.
+/** Create list for finished batches.
+ *
+ * @param[in] instance List to use.
+ * @param[in] done list to fill
  */
 void transfer_list_remove_finished(transfer_list_t *instance, link_t *done)
@@ -161,5 +157,4 @@
 	}
 	fibril_mutex_unlock(&instance->guard);
-
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/lib/usb/include/usb/host/endpoint.h
===================================================================
--- uspace/lib/usb/include/usb/host/endpoint.h	(revision cd1cec3bc8deaa31b192d8430abb26ebf75ce6f3)
+++ uspace/lib/usb/include/usb/host/endpoint.h	(revision 4fd3faf06b8a4954818da61d7c31ecaba4839d5c)
@@ -53,5 +53,5 @@
 	fibril_mutex_t guard;
 	fibril_condvar_t avail;
-	bool active;
+	volatile bool active;
 	link_t same_device_eps;
 } endpoint_t;
Index: uspace/lib/usb/src/host/batch.c
===================================================================
--- uspace/lib/usb/src/host/batch.c	(revision cd1cec3bc8deaa31b192d8430abb26ebf75ce6f3)
+++ uspace/lib/usb/src/host/batch.c	(revision 4fd3faf06b8a4954818da61d7c31ecaba4839d5c)
@@ -79,4 +79,5 @@
 	instance->error = EOK;
 	instance->ep = ep;
+	endpoint_use(instance->ep);
 }
 /*----------------------------------------------------------------------------*/
@@ -89,4 +90,6 @@
 {
 	assert(instance);
+	assert(instance->ep);
+	endpoint_release(instance->ep);
 	instance->next_step(instance);
 }
Index: uspace/lib/usb/src/host/endpoint.c
===================================================================
--- uspace/lib/usb/src/host/endpoint.c	(revision cd1cec3bc8deaa31b192d8430abb26ebf75ce6f3)
+++ uspace/lib/usb/src/host/endpoint.c	(revision 4fd3faf06b8a4954818da61d7c31ecaba4839d5c)
@@ -60,4 +60,5 @@
 {
 	assert(instance);
+	assert(!instance->active);
 	list_remove(&instance->same_device_eps);
 	free(instance);
@@ -79,6 +80,6 @@
 	fibril_mutex_lock(&instance->guard);
 	instance->active = false;
+	fibril_mutex_unlock(&instance->guard);
 	fibril_condvar_signal(&instance->avail);
-	fibril_mutex_unlock(&instance->guard);
 }
 /*----------------------------------------------------------------------------*/
