Index: uspace/drv/ohci/batch.c
===================================================================
--- uspace/drv/ohci/batch.c	(revision 9a6fde4bb9c25bfa30c0b3c90d05987bac467574)
+++ uspace/drv/ohci/batch.c	(revision 7013b14b3a18e6a7ccde76e9c2b111d1eb64af46)
@@ -169,4 +169,12 @@
 }
 /*----------------------------------------------------------------------------*/
+void batch_commit(usb_transfer_batch_t *instance)
+{
+	assert(instance);
+	ohci_transfer_batch_t *data = instance->private_data;
+	assert(data);
+	ed_set_end_td(data->ed, data->tds[data->td_count]);
+}
+/*----------------------------------------------------------------------------*/
 void batch_control_write(usb_transfer_batch_t *instance)
 {
Index: uspace/drv/ohci/batch.h
===================================================================
--- uspace/drv/ohci/batch.h	(revision 9a6fde4bb9c25bfa30c0b3c90d05987bac467574)
+++ uspace/drv/ohci/batch.h	(revision 7013b14b3a18e6a7ccde76e9c2b111d1eb64af46)
@@ -52,4 +52,6 @@
 bool batch_is_complete(usb_transfer_batch_t *instance);
 
+void batch_commit(usb_transfer_batch_t *instance);
+
 void batch_control_write(usb_transfer_batch_t *instance);
 
Index: uspace/drv/ohci/endpoint_list.c
===================================================================
--- uspace/drv/ohci/endpoint_list.c	(revision 9a6fde4bb9c25bfa30c0b3c90d05987bac467574)
+++ uspace/drv/ohci/endpoint_list.c	(revision 7013b14b3a18e6a7ccde76e9c2b111d1eb64af46)
@@ -191,5 +191,6 @@
 	assert(hcd_ep);
 	assert(hcd_ep->ed);
-	assert(fibril_mutex_is_locked(&instance->guard));
+
+	fibril_mutex_lock(&instance->guard);
 
 	usb_log_debug2(
@@ -218,4 +219,5 @@
 	/* Remove from the endpoint list */
 	list_remove(&hcd_ep->link);
+	fibril_mutex_unlock(&instance->guard);
 }
 /**
Index: uspace/drv/ohci/hc.c
===================================================================
--- uspace/drv/ohci/hc.c	(revision 9a6fde4bb9c25bfa30c0b3c90d05987bac467574)
+++ uspace/drv/ohci/hc.c	(revision 7013b14b3a18e6a7ccde76e9c2b111d1eb64af46)
@@ -109,5 +109,4 @@
 	    ret, str_error(ret));
 
-	instance->ddf_instance = fun;
 	usb_device_keeper_init(&instance->manager);
 	ret = usb_endpoint_manager_init(&instance->ep_manager,
@@ -130,4 +129,6 @@
 		fibril_add_ready(instance->interrupt_emulator);
 	}
+
+	list_initialize(&instance->pending_batches);
 #undef CHECK_RET_RETURN
 	return EOK;
@@ -262,40 +263,20 @@
 		return rh_request(&instance->rh, batch);
 	}
-#if 0
+
 	fibril_mutex_lock(&instance->guard);
+	list_append(&batch->link, &instance->pending_batches);
+	batch_commit(batch);
 	switch (batch->ep->transfer_type) {
 	case USB_TRANSFER_CONTROL:
-		instance->registers->control &= ~C_CLE;
-		transfer_list_add_batch(
-		    instance->transfers[batch->ep->transfer_type], batch);
 		instance->registers->command_status |= CS_CLF;
-		usb_log_debug2("Set CS control transfer filled: %x.\n",
-			instance->registers->command_status);
-		instance->registers->control_current = 0;
-		instance->registers->control |= C_CLE;
 		break;
 	case USB_TRANSFER_BULK:
-		instance->registers->control &= ~C_BLE;
-		transfer_list_add_batch(
-		    instance->transfers[batch->ep->transfer_type], batch);
 		instance->registers->command_status |= CS_BLF;
-		usb_log_debug2("Set bulk transfer filled: %x.\n",
-			instance->registers->command_status);
-		instance->registers->control |= C_BLE;
-		break;
-	case USB_TRANSFER_INTERRUPT:
-	case USB_TRANSFER_ISOCHRONOUS:
-		instance->registers->control &= (~C_PLE & ~C_IE);
-		transfer_list_add_batch(
-		    instance->transfers[batch->ep->transfer_type], batch);
-		instance->registers->control |= C_PLE | C_IE;
-		usb_log_debug2("Added periodic transfer: %x.\n",
-		    instance->registers->periodic_current);
 		break;
 	default:
 		break;
 	}
+
 	fibril_mutex_unlock(&instance->guard);
-#endif
 	return EOK;
 }
@@ -317,24 +298,17 @@
 		usb_log_debug2("Periodic current: %p.\n",
 		    instance->registers->periodic_current);
-#if 0
-		LIST_INITIALIZE(done);
-		transfer_list_remove_finished(
-		    &instance->transfers_interrupt, &done);
-		transfer_list_remove_finished(
-		    &instance->transfers_isochronous, &done);
-		transfer_list_remove_finished(
-		    &instance->transfers_control, &done);
-		transfer_list_remove_finished(
-		    &instance->transfers_bulk, &done);
-
-		while (!list_empty(&done)) {
-			link_t *item = done.next;
-			list_remove(item);
+
+		link_t *current = instance->pending_batches.next;
+		while (current != &instance->pending_batches) {
+			link_t *next = current->next;
 			usb_transfer_batch_t *batch =
-			    list_get_instance(item, usb_transfer_batch_t, link);
-			usb_transfer_batch_finish(batch);
+			    usb_transfer_batch_from_link(current);
+
+			if (batch_is_complete(batch)) {
+				usb_transfer_batch_finish(batch);
+			}
+			current = next;
 		}
 		fibril_mutex_unlock(&instance->guard);
-#endif
 	}
 }
Index: uspace/drv/ohci/hc.h
===================================================================
--- uspace/drv/ohci/hc.h	(revision 9a6fde4bb9c25bfa30c0b3c90d05987bac467574)
+++ uspace/drv/ohci/hc.h	(revision 7013b14b3a18e6a7ccde76e9c2b111d1eb64af46)
@@ -53,12 +53,12 @@
 typedef struct hc {
 	ohci_regs_t *registers;
+	hcca_t *hcca;
+
 	usb_address_t rh_address;
 	rh_t rh;
 
-	hcca_t *hcca;
+	endpoint_list_t lists[4];
+	link_t pending_batches;
 
-	endpoint_list_t lists[4];
-
-	ddf_fun_t *ddf_instance;
 	usb_device_keeper_t manager;
 	usb_endpoint_manager_t ep_manager;
@@ -80,5 +80,5 @@
 int hc_add_endpoint(hc_t *instance, usb_address_t address, usb_endpoint_t ep,
     usb_speed_t speed, usb_transfer_type_t type, usb_direction_t direction,
-		size_t max_packet_size, size_t size, unsigned interval);
+    size_t max_packet_size, size_t size, unsigned interval);
 
 int hc_remove_endpoint(hc_t *instance, usb_address_t address,
