Index: uspace/lib/drv/generic/remote_usb.c
===================================================================
--- uspace/lib/drv/generic/remote_usb.c	(revision 4b4c797d23deaa3f0f365f40c3d0d3960c0218c7)
+++ uspace/lib/drv/generic/remote_usb.c	(revision 1b22bd45ebc7f42217757e90fa6e5b57f6ed5d1d)
@@ -40,4 +40,6 @@
 #include "driver.h"
 
+#define USB_MAX_PAYLOAD_SIZE 1020
+
 static void remote_usb_get_buffer(device_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_usb_interrupt_out(device_t *, void *, ipc_callid_t, ipc_call_t *);
@@ -60,4 +62,9 @@
 };
 
+typedef struct {
+	ipc_callid_t caller;
+	void *buffer;
+	size_t size;
+} async_transaction_t;
 
 
@@ -65,5 +72,55 @@
     ipc_callid_t callid, ipc_call_t *call)
 {
-	ipc_answer_0(callid, ENOTSUP);
+	ipcarg_t buffer_hash = IPC_GET_ARG1(*call);
+	async_transaction_t * trans = (async_transaction_t *)buffer_hash;
+	if (trans == NULL) {
+		ipc_answer_0(callid, ENOENT);
+		return;
+	}
+	if (trans->buffer == NULL) {
+		ipc_answer_0(callid, EINVAL);
+		free(trans);
+		return;
+	}
+
+	ipc_callid_t cid;
+	size_t accepted_size;
+	if (!async_data_read_receive(&cid, &accepted_size)) {
+		ipc_answer_0(callid, EINVAL);
+		return;
+	}
+
+	if (accepted_size > trans->size) {
+		accepted_size = trans->size;
+	}
+	async_data_read_finalize(callid, trans->buffer, accepted_size);
+
+	ipc_answer_1(callid, EOK, accepted_size);
+
+	free(trans->buffer);
+	free(trans);
+}
+
+
+static void callback_out(device_t *device,
+    usb_transaction_outcome_t outcome, void *arg)
+{
+	async_transaction_t *trans = (async_transaction_t *)arg;
+
+	// FIXME - answer according to outcome
+	ipc_answer_0(trans->caller, EOK);
+
+	free(trans);
+}
+
+static void callback_in(device_t *device,
+    usb_transaction_outcome_t outcome, size_t actual_size, void *arg)
+{
+	async_transaction_t *trans = (async_transaction_t *)arg;
+
+	// FIXME - answer according to outcome
+	ipc_answer_1(trans->caller, EOK, (ipcarg_t)trans);
+
+	trans->size = actual_size;
 }
 
@@ -71,5 +128,42 @@
 	    ipc_callid_t callid, ipc_call_t *call)
 {
-	ipc_answer_0(callid, ENOTSUP);
+	usb_iface_t *usb_iface = (usb_iface_t *) iface;
+
+	size_t expected_len = IPC_GET_ARG3(*call);
+	usb_target_t target = {
+		.address = IPC_GET_ARG1(*call),
+		.endpoint = IPC_GET_ARG2(*call)
+	};
+
+	size_t len = 0;
+	void *buffer = NULL;
+	if (expected_len > 0) {
+		int rc = async_data_write_accept(&buffer, false,
+		    1, USB_MAX_PAYLOAD_SIZE,
+		    0, &len);
+
+		if (rc != EOK) {
+			ipc_answer_0(callid, rc);
+			return;
+		}
+	}
+
+	if (!usb_iface->interrupt_out) {
+		ipc_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	async_transaction_t *trans = malloc(sizeof(async_transaction_t));
+	trans->caller = callid;
+	trans->buffer = NULL;
+	trans->size = 0;
+
+	int rc = usb_iface->interrupt_out(device, target, buffer, len,
+	    callback_out, trans);
+
+	if (rc != EOK) {
+		ipc_answer_0(callid, rc);
+		free(trans);
+	}
 }
 
@@ -77,6 +171,32 @@
 	    ipc_callid_t callid, ipc_call_t *call)
 {
-	ipc_answer_0(callid, ENOTSUP);
-}
+	usb_iface_t *usb_iface = (usb_iface_t *) iface;
+
+	size_t len = IPC_GET_ARG3(*call);
+	usb_target_t target = {
+		.address = IPC_GET_ARG1(*call),
+		.endpoint = IPC_GET_ARG2(*call)
+	};
+
+	if (!usb_iface->interrupt_in) {
+		ipc_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	async_transaction_t *trans = malloc(sizeof(async_transaction_t));
+	trans->caller = callid;
+	trans->buffer = malloc(len);
+	trans->size = len;
+
+	int rc = usb_iface->interrupt_in(device, target, trans->buffer, len,
+	    callback_in, trans);
+
+	if (rc != EOK) {
+		ipc_answer_0(callid, rc);
+		free(trans->buffer);
+		free(trans);
+	}
+}
+
 
 /**
Index: uspace/lib/drv/include/usb_iface.h
===================================================================
--- uspace/lib/drv/include/usb_iface.h	(revision 4b4c797d23deaa3f0f365f40c3d0d3960c0218c7)
+++ uspace/lib/drv/include/usb_iface.h	(revision 1b22bd45ebc7f42217757e90fa6e5b57f6ed5d1d)
@@ -93,5 +93,7 @@
 typedef enum {
 	/** Asks for data buffer.
-	 * See explanation at usb_method_t.
+	 * See explanation at usb_iface_funcs_t.
+	 * This function does not have counter part in functional interface
+	 * as it is handled by the remote part itself.
 	 */
 	IPC_M_USB_GET_BUFFER,
@@ -99,10 +101,10 @@
 
 	/** Send interrupt data to device.
-	 * See explanation at usb_method_t (OUT transaction).
+	 * See explanation at usb_iface_funcs_t (OUT transaction).
 	 */
 	IPC_M_USB_INTERRUPT_OUT,
 
 	/** Get interrupt data from device.
-	 * See explanation at usb_method_t (IN transaction).
+	 * See explanation at usb_iface_funcs_t (IN transaction).
 	 */
 	IPC_M_USB_INTERRUPT_IN,
@@ -110,15 +112,15 @@
 
 	/** Start WRITE control transfer.
-	 * See explanation at usb_method_t (OUT transaction).
+	 * See explanation at usb_iface_funcs_t (OUT transaction).
 	 */
 	IPC_M_USB_CONTROL_WRITE_SETUP,
 
 	/** Send control-transfer data to device.
-	 * See explanation at usb_method_t (OUT transaction).
+	 * See explanation at usb_iface_funcs_t (OUT transaction).
 	 */
 	IPC_M_USB_CONTROL_WRITE_DATA,
 
 	/** Terminate WRITE control transfer.
-	 * See explanation at usb_method_t (NO-DATA transaction).
+	 * See explanation at usb_iface_funcs_t (NO-DATA transaction).
 	 */
 	IPC_M_USB_CONTROL_WRITE_STATUS,
@@ -127,15 +129,15 @@
 
 	/** Start READ control transfer.
-	 * See explanation at usb_method_t (OUT transaction).
+	 * See explanation at usb_iface_funcs_t (OUT transaction).
 	 */
 	IPC_M_USB_CONTROL_READ_SETUP,
 
 	/** Get control-transfer data from device.
-	 * See explanation at usb_method_t (IN transaction).
+	 * See explanation at usb_iface_funcs_t (IN transaction).
 	 */
 	IPC_M_USB_CONTROL_READ_DATA,
 
 	/** Terminate READ control transfer.
-	 * See explanation at usb_method_t (NO-DATA transaction).
+	 * See explanation at usb_iface_funcs_t (NO-DATA transaction).
 	 */
 	IPC_M_USB_CONTROL_READ_STATUS,
@@ -155,8 +157,8 @@
 /** USB devices communication interface. */
 typedef struct {
-	int (*interrupt_out)(device_t *, usb_endpoint_t,
+	int (*interrupt_out)(device_t *, usb_target_t,
 	    void *, size_t,
 	    usb_iface_transfer_out_callback_t, void *);
-	int (*interrupt_in)(device_t *, usb_endpoint_t,
+	int (*interrupt_in)(device_t *, usb_target_t,
 	    void *, size_t,
 	    usb_iface_transfer_in_callback_t, void *);
