Index: uspace/drv/bus/usb/vhc/connhost.c
===================================================================
--- uspace/drv/bus/usb/vhc/connhost.c	(revision 7eb32a83ecef6c5d3f94768a887700cb83255e65)
+++ uspace/drv/bus/usb/vhc/connhost.c	(revision e779bd3c5b8ec9106b912f1444caf1cdf6565058)
@@ -172,10 +172,4 @@
 	VHC_DATA(vhc, fun);
 
-	endpoint_t *ep = usb_endpoint_manager_get_ep(&vhc->ep_manager,
-	    address, endpoint, direction, NULL);
-	if (ep == NULL) {
-		return ENOENT;
-	}
-
 	int rc = usb_endpoint_manager_unregister_ep(&vhc->ep_manager,
 	    address, endpoint, direction);
@@ -183,5 +177,5 @@
 	return rc;
 }
-
+#if 0
 /** Schedule interrupt out transfer.
  *
@@ -413,4 +407,82 @@
 	return EOK;
 }
+#endif
+static int usb_read(ddf_fun_t *fun, usb_target_t target, uint64_t setup_buffer,
+    uint8_t *data_buffer, size_t data_buffer_size,
+    usbhc_iface_transfer_in_callback_t callback, void *arg)
+{
+	VHC_DATA(vhc, fun);
+
+	endpoint_t *ep = usb_endpoint_manager_get_ep(&vhc->ep_manager,
+	    target.address, target.endpoint, USB_DIRECTION_IN, NULL);
+	if (ep == NULL) {
+		return ENOENT;
+	}
+	const usb_transfer_type_t transfer_type = ep->transfer_type;
+
+
+	vhc_transfer_t *transfer = vhc_transfer_create(target.address,
+	    target.endpoint, USB_DIRECTION_IN, transfer_type,
+	    fun, arg);
+	if (transfer == NULL) {
+		return ENOMEM;
+	}
+	if (transfer_type == USB_TRANSFER_CONTROL) {
+		transfer->setup_buffer = malloc(sizeof(uint64_t));
+		assert(transfer->setup_buffer);
+		memcpy(transfer->setup_buffer, &setup_buffer, sizeof(uint64_t));
+		transfer->setup_buffer_size = sizeof(uint64_t);
+	}
+	transfer->data_buffer = data_buffer;
+	transfer->data_buffer_size = data_buffer_size;
+	transfer->callback_in = callback;
+
+	int rc = vhc_virtdev_add_transfer(vhc, transfer);
+	if (rc != EOK) {
+		free(transfer);
+		return rc;
+	}
+
+	return EOK;
+}
+
+static int usb_write(ddf_fun_t *fun, usb_target_t target, uint64_t setup_buffer,
+    const uint8_t *data_buffer, size_t data_buffer_size,
+    usbhc_iface_transfer_out_callback_t callback, void *arg)
+{
+	VHC_DATA(vhc, fun);
+
+	endpoint_t *ep = usb_endpoint_manager_get_ep(&vhc->ep_manager,
+	    target.address, target.endpoint, USB_DIRECTION_OUT, NULL);
+	if (ep == NULL) {
+		return ENOENT;
+	}
+	const usb_transfer_type_t transfer_type = ep->transfer_type;
+
+
+	vhc_transfer_t *transfer = vhc_transfer_create(target.address,
+	    target.endpoint, USB_DIRECTION_OUT, transfer_type,
+	    fun, arg);
+	if (transfer == NULL) {
+		return ENOMEM;
+	}
+	if (transfer_type == USB_TRANSFER_CONTROL) {
+		transfer->setup_buffer = malloc(sizeof(uint64_t));
+		assert(transfer->setup_buffer);
+		memcpy(transfer->setup_buffer, &setup_buffer, sizeof(uint64_t));
+		transfer->setup_buffer_size = sizeof(uint64_t);
+	}
+	transfer->data_buffer = (void*)data_buffer;
+	transfer->data_buffer_size = data_buffer_size;
+	transfer->callback_out = callback;
+
+	int rc = vhc_virtdev_add_transfer(vhc, transfer);
+	if (rc != EOK) {
+		free(transfer);
+		return rc;
+	}
+
+	return EOK;
+}
 
 static int tell_address(ddf_fun_t *fun, devman_handle_t handle,
@@ -460,12 +532,6 @@
 	.unregister_endpoint = unregister_endpoint,
 
-	.interrupt_out = interrupt_out,
-	.interrupt_in = interrupt_in,
-
-	.bulk_in = bulk_in,
-	.bulk_out = bulk_out,
-
-	.control_write = control_write,
-	.control_read = control_read
+	.write = usb_write,
+	.read = usb_read,
 };
 
