Index: uspace/lib/drv/generic/remote_usbhc.c
===================================================================
--- uspace/lib/drv/generic/remote_usbhc.c	(revision 17aca1c1f6f00b4b526e475b7eead4405501c16b)
+++ uspace/lib/drv/generic/remote_usbhc.c	(revision 0a6fa9fe59b6049f04024724a7889d8ad48bf28f)
@@ -98,4 +98,5 @@
 typedef struct {
 	ipc_callid_t caller;
+	ipc_callid_t data_caller;
 	void *buffer;
 	void *setup_packet;
@@ -127,4 +128,5 @@
 
 	trans->caller = caller;
+	trans->data_caller = 0;
 	trans->buffer = NULL;
 	trans->setup_packet = NULL;
@@ -295,5 +297,11 @@
 
 	trans->size = actual_size;
-	async_answer_1(trans->caller, USB_OUTCOME_OK, (sysarg_t)trans);
+
+	if (trans->data_caller) {
+		async_data_read_finalize(trans->data_caller,
+		    trans->buffer, actual_size);
+	}
+
+	async_answer_0(trans->caller, USB_OUTCOME_OK);
 }
 
@@ -376,4 +384,10 @@
 	};
 
+	ipc_callid_t data_callid;
+	if (!async_data_read_receive(&data_callid, &len)) {
+		async_answer_0(callid, EPARTY);
+		return;
+	}
+
 	async_transaction_t *trans = async_transaction_create(callid);
 	if (trans == NULL) {
@@ -381,4 +395,5 @@
 		return;
 	}
+	trans->data_caller = data_callid;
 	trans->buffer = malloc(len);
 	trans->size = len;
@@ -630,4 +645,11 @@
 	}
 
+	ipc_callid_t data_callid;
+	if (!async_data_read_receive(&data_callid, &data_len)) {
+		async_answer_0(callid, EPARTY);
+		free(setup_packet);
+		return;
+	}
+
 	async_transaction_t *trans = async_transaction_create(callid);
 	if (trans == NULL) {
@@ -636,4 +658,5 @@
 		return;
 	}
+	trans->data_caller = data_callid;
 	trans->setup_packet = setup_packet;
 	trans->size = data_len;
