Index: uspace/lib/usbvirt/src/ipc.c
===================================================================
--- uspace/lib/usbvirt/src/ipc.c	(revision 6fd70622ada123b478f6a4689a97e328f511d5f0)
+++ uspace/lib/usbvirt/src/ipc.c	(revision aa9a53df9e0a52704cbfa7e01ae573b3d623aba9)
@@ -160,7 +160,4 @@
 	usb_transfer_type_t transfer_type = IPC_GET_ARG2(*icall);
 
-	usb_log_debug("ipc_interrupt_in(.%d, %s)\n",
-	    endpoint, usb_str_transfer_type_short(transfer_type));
-
 	int rc;
 
@@ -198,6 +195,23 @@
     ipc_callid_t iid, ipc_call_t *icall)
 {
-	printf("ipc_interrupt_out()\n");
-	async_answer_0(iid, ENOTSUP);
+	usb_endpoint_t endpoint = IPC_GET_ARG1(*icall);
+	usb_transfer_type_t transfer_type = IPC_GET_ARG2(*icall);
+
+	void *data_buffer = NULL;
+	size_t data_buffer_size = 0;
+
+	int rc = async_data_write_accept(&data_buffer, false,
+	    1, 1024, 0, &data_buffer_size);
+	if (rc != EOK) {
+		async_answer_0(iid, rc);
+		return;
+	}
+
+	rc = usbvirt_data_out(dev, transfer_type, endpoint,
+	    data_buffer, data_buffer_size);
+
+	async_answer_0(iid, rc);
+
+	free(data_buffer);
 }
 
@@ -417,5 +431,21 @@
     usb_transfer_type_t tr_type, void *data, size_t data_size)
 {
-	return ENOTSUP;
+	aid_t opening_request = async_send_2(phone,
+	    IPC_M_USBVIRT_INTERRUPT_OUT, ep, tr_type, NULL);
+	if (opening_request == 0) {
+		return ENOMEM;
+	}
+
+	int rc = async_data_write_start(phone,
+	    data, data_size);
+	if (rc != EOK) {
+		async_wait_for(opening_request, NULL);
+		return rc;
+	}
+
+	sysarg_t opening_request_rc;
+	async_wait_for(opening_request, &opening_request_rc);
+
+	return (int) opening_request_rc;
 }
 
