Index: uspace/drv/bus/usb/uhci/uhci_batch.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.c	(revision 70fb8229850edcd3f6f47d4e82abe94c0a27f851)
+++ uspace/drv/bus/usb/uhci/uhci_batch.c	(revision f18d82f058cb6087d2a2dfe4118693b064b90147)
@@ -66,14 +66,7 @@
 	assert(uhci_batch);
 	assert(uhci_batch->usb_batch);
-	/* Copy data unless we are sure we sent it */
-	if (uhci_batch->usb_batch->ep->direction != USB_DIRECTION_OUT) {
-		memcpy(uhci_batch->usb_batch->buffer,
-		    uhci_transfer_batch_data_buffer(uhci_batch),
-		    uhci_batch->usb_batch->buffer_size);
-	}
-	if (uhci_batch->usb_batch->callback_out)
-		usb_transfer_batch_call_out(uhci_batch->usb_batch);
-	if (uhci_batch->usb_batch->callback_in)
-		usb_transfer_batch_call_in(uhci_batch->usb_batch);
+	usb_transfer_batch_finish(uhci_batch->usb_batch,
+	    uhci_transfer_batch_data_buffer(uhci_batch),
+	    uhci_batch->usb_batch->buffer_size);
 	uhci_transfer_batch_dispose(uhci_batch);
 }
Index: uspace/lib/usbhost/include/usb/host/batch.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/batch.h	(revision 70fb8229850edcd3f6f47d4e82abe94c0a27f851)
+++ uspace/lib/usbhost/include/usb/host/batch.h	(revision f18d82f058cb6087d2a2dfe4118693b064b90147)
@@ -90,5 +90,6 @@
 );
 
-void usb_transfer_batch_finish(usb_transfer_batch_t *instance);
+void usb_transfer_batch_finish(usb_transfer_batch_t *instance,
+    const void* data, size_t size);
 void usb_transfer_batch_call_in(usb_transfer_batch_t *instance);
 void usb_transfer_batch_call_out(usb_transfer_batch_t *instance);
@@ -120,9 +121,9 @@
 /*----------------------------------------------------------------------------*/
 static inline void usb_transfer_batch_finish_error(
-    usb_transfer_batch_t *instance, int error)
+    usb_transfer_batch_t *instance, const void* data, size_t size, int error)
 {
 	assert(instance);
 	instance->error = error;
-	usb_transfer_batch_finish(instance);
+	usb_transfer_batch_finish(instance, data, size);
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/lib/usbhost/src/batch.c
===================================================================
--- uspace/lib/usbhost/src/batch.c	(revision 70fb8229850edcd3f6f47d4e82abe94c0a27f851)
+++ uspace/lib/usbhost/src/batch.c	(revision f18d82f058cb6087d2a2dfe4118693b064b90147)
@@ -84,9 +84,21 @@
  *
  */
-void usb_transfer_batch_finish(usb_transfer_batch_t *instance)
+void usb_transfer_batch_finish(
+    usb_transfer_batch_t *instance, const void *data, size_t size)
 {
 	assert(instance);
-	if (instance->next_step)
-		instance->next_step(instance);
+	assert(instance->ep);
+	/* we care about the data and there are some to copy */
+        if (instance->ep->direction != USB_DIRECTION_OUT
+	    && data) {
+		const size_t min_size =
+		    size < instance->buffer_size ? size : instance->buffer_size;
+                memcpy(instance->buffer, data, min_size);
+        }
+        if (instance->callback_out)
+                usb_transfer_batch_call_out(instance);
+        if (instance->callback_in)
+                usb_transfer_batch_call_in(instance);
+
 }
 /*----------------------------------------------------------------------------*/
