Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision ef1a3a845e39a31bdb2c627b5c2a36d75747ad0a)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision a312d8f527427930eb111c09105cfcf076485261)
@@ -177,5 +177,5 @@
 			uhci_transfer_batch_t *batch =
 			    uhci_transfer_batch_from_link(current);
-			usb_transfer_batch_finish(&batch->base);
+			uhci_transfer_batch_finish(batch);
 		}
 	}
Index: uspace/drv/bus/usb/uhci/uhci_batch.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.c	(revision ef1a3a845e39a31bdb2c627b5c2a36d75747ad0a)
+++ uspace/drv/bus/usb/uhci/uhci_batch.c	(revision a312d8f527427930eb111c09105cfcf076485261)
@@ -64,4 +64,13 @@
 }
 
+void uhci_transfer_batch_finish(uhci_transfer_batch_t *batch)
+{
+	if (batch->base.dir == USB_DIRECTION_IN) {
+		assert(batch->base.transfered_size <= batch->base.buffer_size);
+		memcpy(batch->base.buffer, uhci_transfer_batch_data_buffer(batch), batch->base.transfered_size);
+	}
+	usb_transfer_batch_finish(&batch->base);
+}
+
 /** Allocate memory and initialize internal data structure.
  *
@@ -131,5 +140,5 @@
 	dest += setup_size;
 	/* Copy generic data unless they are provided by the device */
-	if (usb_batch->ep->direction != USB_DIRECTION_IN) {
+	if (usb_batch->dir != USB_DIRECTION_IN) {
 		memcpy(dest, usb_batch->buffer, usb_batch->buffer_size);
 	}
Index: uspace/drv/bus/usb/uhci/uhci_batch.h
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.h	(revision ef1a3a845e39a31bdb2c627b5c2a36d75747ad0a)
+++ uspace/drv/bus/usb/uhci/uhci_batch.h	(revision a312d8f527427930eb111c09105cfcf076485261)
@@ -67,8 +67,9 @@
 } uhci_transfer_batch_t;
 
-uhci_transfer_batch_t * uhci_transfer_batch_create(endpoint_t *ep);
-int uhci_transfer_batch_prepare(uhci_transfer_batch_t *uhci_batch);
-bool uhci_transfer_batch_check_completed(uhci_transfer_batch_t *uhci_batch);
-void uhci_transfer_batch_destroy(uhci_transfer_batch_t *uhci_batch);
+uhci_transfer_batch_t * uhci_transfer_batch_create(endpoint_t *);
+int uhci_transfer_batch_prepare(uhci_transfer_batch_t *);
+bool uhci_transfer_batch_check_completed(uhci_transfer_batch_t *);
+void uhci_transfer_batch_finish(uhci_transfer_batch_t *);
+void uhci_transfer_batch_destroy(uhci_transfer_batch_t *);
 
 /** Get offset to setup buffer accessible to the HC hw.
