Index: uspace/lib/drv/Makefile
===================================================================
--- uspace/lib/drv/Makefile	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
+++ uspace/lib/drv/Makefile	(revision ec700c75765e920cd0cb4090eb421a98256eb4b3)
@@ -33,4 +33,5 @@
 	-Igeneric/private \
 	-I$(LIBUSB_PREFIX)/include \
+	-I$(LIBUSBHOST_PREFIX)/include \
 	-I$(LIBPCM_PREFIX)/include
 LIBRARY = libdrv
Index: uspace/lib/drv/generic/remote_usb.c
===================================================================
--- uspace/lib/drv/generic/remote_usb.c	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
+++ uspace/lib/drv/generic/remote_usb.c	(revision ec700c75765e920cd0cb4090eb421a98256eb4b3)
@@ -38,4 +38,5 @@
 #include <errno.h>
 #include <devman.h>
+#include <usb/host/usb_transfer_batch.h>
 
 #include "usb_iface.h"
@@ -539,34 +540,31 @@
 }
 
-static void callback_out(int outcome, void *arg)
-{
-	async_transaction_t *trans = arg;
-
-	async_answer_0(trans->caller, outcome);
+static int callback_out(usb_transfer_batch_t *batch)
+{
+	async_transaction_t *trans = batch->on_complete_data;
+
+	const int err = async_answer_0(trans->caller, batch->error);
 
 	async_transaction_destroy(trans);
-}
-
-static void callback_in(int outcome, size_t actual_size, void *arg)
-{
-	async_transaction_t *trans = (async_transaction_t *)arg;
-
-	if (outcome != EOK) {
-		async_answer_0(trans->caller, outcome);
-		if (trans->data_caller) {
+
+	return err;
+}
+
+static int callback_in(usb_transfer_batch_t *batch)
+{
+	async_transaction_t *trans = batch->on_complete_data;
+
+	if (trans->data_caller) {
+		if (batch->error == EOK) {
+			batch->error = async_data_read_finalize(trans->data_caller,
+			    trans->buffer, batch->transfered_size);
+		} else {
 			async_answer_0(trans->data_caller, EINTR);
 		}
-		async_transaction_destroy(trans);
-		return;
-	}
-
-	if (trans->data_caller) {
-		async_data_read_finalize(trans->data_caller,
-		    trans->buffer, actual_size);
-	}
-
-	async_answer_0(trans->caller, EOK);
-
+	}
+
+	const int err = async_answer_0(trans->caller, batch->error);
 	async_transaction_destroy(trans);
+	return err;
 }
 
@@ -611,6 +609,11 @@
 	}
 
+	const usb_target_t target = {{
+		/* .address is initialized by read itself */
+		.endpoint = ep,
+	}};
+
 	const int rc = usb_iface->read(
-	    fun, ep, setup, trans->buffer, size, callback_in, trans);
+	    fun, target, setup, trans->buffer, size, callback_in, trans);
 
 	if (rc != EOK) {
@@ -659,6 +662,11 @@
 	}
 
+	const usb_target_t target = {{
+		/* .address is initialized by write itself */
+		.endpoint = ep,
+	}};
+
 	const int rc = usb_iface->write(
-	    fun, ep, setup, trans->buffer, size, callback_out, trans);
+	    fun, target, setup, trans->buffer, size, callback_out, trans);
 
 	if (rc != EOK) {
Index: uspace/lib/drv/include/usb_iface.h
===================================================================
--- uspace/lib/drv/include/usb_iface.h	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
+++ uspace/lib/drv/include/usb_iface.h	(revision ec700c75765e920cd0cb4090eb421a98256eb4b3)
@@ -64,9 +64,9 @@
     size_t);
 
-/** Callback for outgoing transfer. */
-typedef void (*usb_iface_transfer_out_callback_t)(int, void *);
+/** Defined in usb/host/usb_transfer_batch.h */
+typedef struct usb_transfer_batch usb_transfer_batch_t;
 
-/** Callback for incoming transfer. */
-typedef void (*usb_iface_transfer_in_callback_t)(int, size_t, void *);
+/** Callback for outgoing transfer - clone of usb_transfer_batch_callback_t */
+typedef int (*usb_iface_transfer_callback_t)(usb_transfer_batch_t *);
 
 /** USB device communication interface. */
@@ -84,8 +84,10 @@
 	int (*unregister_endpoint)(ddf_fun_t *, usb_endpoint_desc_t *);
 
-	int (*read)(ddf_fun_t *, usb_endpoint_t, uint64_t, uint8_t *, size_t,
-	    usb_iface_transfer_in_callback_t, void *);
-	int (*write)(ddf_fun_t *, usb_endpoint_t, uint64_t, const uint8_t *,
-	    size_t, usb_iface_transfer_out_callback_t, void *);
+	int (*read)(ddf_fun_t *, usb_target_t,
+		uint64_t, char *, size_t,
+		usb_iface_transfer_callback_t, void *);
+	int (*write)(ddf_fun_t *, usb_target_t,
+		uint64_t, const char *, size_t,
+		usb_iface_transfer_callback_t, void *);
 } usb_iface_t;
 
