Index: uspace/drv/bus/usb/ohci/ohci_batch.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_batch.c	(revision 27b0ea0a00cc0299524227524d10e0207768f6d3)
+++ uspace/drv/bus/usb/ohci/ohci_batch.c	(revision 9162b27c0985e8e5c40afe8e921a403b97e66a8c)
@@ -58,5 +58,5 @@
 	if (ohci_batch->tds) {
 		const ohci_endpoint_t *ohci_ep =
-		    ohci_endpoint_get(ohci_batch->usb_batch->ep);
+		    ohci_endpoint_get(ohci_batch->base.ep);
 		assert(ohci_ep);
 		for (unsigned i = 0; i < ohci_batch->td_count; ++i) {
@@ -72,5 +72,5 @@
 /** Allocate memory and initialize internal data structure.
  *
- * @param[in] usb_batch Pointer to generic USB batch structure.
+ * @param[in] ep Endpoint for which the batch will be created
  * @return Valid pointer if all structures were successfully created,
  * NULL otherwise.
@@ -176,5 +176,5 @@
 
 	usb_log_debug("Batch %p checking %zu td(s) for completion.\n",
-	    ohci_batch->usb_batch, ohci_batch->td_count);
+	    &ohci_batch->base, ohci_batch->td_count);
 	usb_log_debug2("ED: %08x:%08x:%08x:%08x.\n",
 	    ohci_batch->ed->status, ohci_batch->ed->td_head,
@@ -218,5 +218,5 @@
 		} else {
 			usb_log_debug("Batch %p found error TD(%zu):%08x.\n",
-			    ohci_batch->usb_batch, i,
+			    &ohci_batch->base, i,
 			    ohci_batch->tds[i]->status);
 
@@ -248,6 +248,12 @@
 	    ohci_batch->base.buffer_size);
 
+	const size_t setup_size = (ohci_batch->base.ep->transfer_type == USB_TRANSFER_CONTROL)
+		? USB_SETUP_PACKET_SIZE
+		: 0;
+
 	if (ohci_batch->base.dir == USB_DIRECTION_IN)
-		memcpy(ohci_batch->base.buffer, ohci_batch->device_buffer, ohci_batch->base.transfered_size);
+		memcpy(ohci_batch->base.buffer,
+		    ohci_batch->device_buffer + setup_size,
+		    ohci_batch->base.transfered_size);
 
 	/* Store the remaining TD */
@@ -313,5 +319,5 @@
 	/* Data stage */
 	size_t td_current = 1;
-	size_t remain_size = ohci_batch->usb_batch->buffer_size;
+	size_t remain_size = ohci_batch->base.buffer_size;
 	while (remain_size > 0) {
 		const size_t transfer_size =
@@ -345,8 +351,8 @@
 	usb_log_debug2(
 	    "Batch %p %s %s " USB_TRANSFER_BATCH_FMT " initialized.\n", \
-	    ohci_batch->usb_batch,
-	    usb_str_transfer_type(ohci_batch->usb_batch->ep->transfer_type),
+	    &ohci_batch->base,
+	    usb_str_transfer_type(ohci_batch->base.ep->transfer_type),
 	    usb_str_direction(dir),
-	    USB_TRANSFER_BATCH_ARGS(*ohci_batch->usb_batch));
+	    USB_TRANSFER_BATCH_ARGS(ohci_batch->base));
 }
 
@@ -370,5 +376,5 @@
 
 	size_t td_current = 0;
-	size_t remain_size = ohci_batch->usb_batch->buffer_size;
+	size_t remain_size = ohci_batch->base.buffer_size;
 	char *buffer = ohci_batch->device_buffer;
 	while (remain_size > 0) {
@@ -393,8 +399,8 @@
 	usb_log_debug2(
 	    "Batch %p %s %s " USB_TRANSFER_BATCH_FMT " initialized.\n", \
-	    ohci_batch->usb_batch,
-	    usb_str_transfer_type(ohci_batch->usb_batch->ep->transfer_type),
+	    &ohci_batch->base,
+	    usb_str_transfer_type(ohci_batch->base.ep->transfer_type),
 	    usb_str_direction(dir),
-	    USB_TRANSFER_BATCH_ARGS(*ohci_batch->usb_batch));
+	    USB_TRANSFER_BATCH_ARGS(ohci_batch->base));
 }
 
Index: uspace/drv/bus/usb/ohci/ohci_batch.h
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_batch.h	(revision 27b0ea0a00cc0299524227524d10e0207768f6d3)
+++ uspace/drv/bus/usb/ohci/ohci_batch.h	(revision 9162b27c0985e8e5c40afe8e921a403b97e66a8c)
@@ -57,6 +57,4 @@
 	/** Data buffer, must be accessible by the OHCI hw. */
 	char *device_buffer;
-	/** Generic USB transfer structure */
-	usb_transfer_batch_t *usb_batch;
 } ohci_transfer_batch_t;
 
