Index: uspace/drv/vhc/connhost.c
===================================================================
--- uspace/drv/vhc/connhost.c	(revision 4d31d588a74050d0044cafb7d565b7761a3b607c)
+++ uspace/drv/vhc/connhost.c	(revision c4ba29c7688e121e2c22a263ae8e83c21b9fc046)
@@ -41,4 +41,50 @@
 #include "hc.h"
 
+typedef struct {
+	usb_direction_t direction;
+	usb_hcd_transfer_callback_out_t out_callback;
+	usb_hcd_transfer_callback_in_t in_callback;
+	usb_hc_device_t *hc;
+	void *arg;
+} transfer_info_t;
+
+static void universal_callback(void *buffer, size_t size,
+    usb_transaction_outcome_t outcome, void *arg)
+{
+	transfer_info_t *transfer = (transfer_info_t *) arg;
+
+	switch (transfer->direction) {
+		case USB_DIRECTION_IN:
+			transfer->in_callback(transfer->hc,
+			    size, outcome,
+			    transfer->arg);
+			break;
+		case USB_DIRECTION_OUT:
+			transfer->out_callback(transfer->hc,
+			    outcome,
+			    transfer->arg);
+			break;
+		default:
+			assert(false && "unreachable");
+			break;
+	}
+
+	free(transfer);
+}
+
+static transfer_info_t *create_transfer_info(usb_hc_device_t *hc,
+    usb_direction_t direction, void *arg)
+{
+	transfer_info_t *transfer = malloc(sizeof(transfer_info_t));
+
+	transfer->direction = direction;
+	transfer->in_callback = NULL;
+	transfer->out_callback = NULL;
+	transfer->arg = arg;
+	transfer->hc = hc;
+
+	return transfer;
+}
+
 static int enqueue_transfer_out(usb_hc_device_t *hc,
     usb_hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint,
@@ -50,5 +96,18 @@
 	    usb_str_transfer_type(endpoint->transfer_type),
 	    size);
-	return ENOTSUP;
+
+	transfer_info_t *transfer
+	    = create_transfer_info(hc, USB_DIRECTION_OUT, arg);
+	transfer->out_callback = callback;
+
+	usb_target_t target = {
+		.address = dev->address,
+		.endpoint = endpoint->endpoint
+	};
+
+	hc_add_transaction_to_device(false, target, buffer, size,
+	    universal_callback, transfer);
+
+	return EOK;
 }
 
@@ -62,5 +121,18 @@
 	    usb_str_transfer_type(endpoint->transfer_type),
 	    size);
-	return ENOTSUP;
+
+	transfer_info_t *transfer
+	    = create_transfer_info(hc, USB_DIRECTION_OUT, arg);
+	transfer->out_callback = callback;
+
+	usb_target_t target = {
+		.address = dev->address,
+		.endpoint = endpoint->endpoint
+	};
+
+	hc_add_transaction_to_device(true, target, buffer, size,
+	    universal_callback, transfer);
+
+	return EOK;
 }
 
@@ -74,5 +146,18 @@
 	    usb_str_transfer_type(endpoint->transfer_type),
 	    size);
-	return ENOTSUP;
+
+	transfer_info_t *transfer
+	    = create_transfer_info(hc, USB_DIRECTION_IN, arg);
+	transfer->in_callback = callback;
+
+	usb_target_t target = {
+		.address = dev->address,
+		.endpoint = endpoint->endpoint
+	};
+
+	hc_add_transaction_from_device(target, buffer, size,
+	    universal_callback, transfer);
+
+	return EOK;
 }
 
Index: uspace/drv/vhc/hc.c
===================================================================
--- uspace/drv/vhc/hc.c	(revision 4d31d588a74050d0044cafb7d565b7761a3b607c)
+++ uspace/drv/vhc/hc.c	(revision c4ba29c7688e121e2c22a263ae8e83c21b9fc046)
@@ -131,5 +131,5 @@
 		
 		process_transaction_with_outcome(transaction, outcome);
-		
+
 		free(transaction);
 	}
Index: uspace/drv/vhc/hc.h
===================================================================
--- uspace/drv/vhc/hc.h	(revision 4d31d588a74050d0044cafb7d565b7761a3b607c)
+++ uspace/drv/vhc/hc.h	(revision c4ba29c7688e121e2c22a263ae8e83c21b9fc046)
@@ -79,6 +79,4 @@
     hc_transaction_done_callback_t callback, void * arg);
 
-int hc_fillin_transaction_from_device(usb_target_t target,
-    void * buffer, size_t len);
 
 #endif
Index: uspace/drv/vhc/hcd.c
===================================================================
--- uspace/drv/vhc/hcd.c	(revision 4d31d588a74050d0044cafb7d565b7761a3b607c)
+++ uspace/drv/vhc/hcd.c	(revision c4ba29c7688e121e2c22a263ae8e83c21b9fc046)
@@ -69,6 +69,7 @@
 
 	/*
-	 * Announce that we have some root hub present.
+	 * Initialize our hub and announce its presence.
 	 */
+	hub_init();
 	usb_hcd_add_root_hub(dev);
 
@@ -83,9 +84,27 @@
 };
 
+/** Fibril wrapper for HC transaction manager.
+ *
+ * @param arg Not used.
+ * @return Nothing, return argument is unreachable.
+ */
+static int hc_manager_fibril(void *arg)
+{
+	hc_manager();
+	return EOK;
+}
+
 int main(int argc, char * argv[])
 {	
 	printf("%s: virtual USB host controller driver.\n", NAME);
 
-	debug_level = 5;
+	debug_level = 10;
+
+	fid_t fid = fibril_create(hc_manager_fibril, NULL);
+	if (fid == 0) {
+		printf("%s: failed to start HC manager fibril\n", NAME);
+		return ENOMEM;
+	}
+	fibril_add_ready(fid);
 
 	return usb_hcd_main(&vhc_driver);
