Index: uspace/lib/usb/hcdhubd.c
===================================================================
--- uspace/lib/usb/hcdhubd.c	(revision 91db50ac4a0d8739daf1220f83a40c68c562e4cd)
+++ uspace/lib/usb/hcdhubd.c	(revision 7034be15c0af2249a6ef774fecbf440e2c7a3ef4)
@@ -34,4 +34,5 @@
  */
 #include "hcdhubd.h"
+#include <usb_iface.h>
 #include <driver.h>
 #include <bool.h>
@@ -44,4 +45,13 @@
 static usb_hc_driver_t *hc_driver = NULL;
 
+static usb_iface_t usb_interface = {
+	.interrupt_out = NULL,
+	.interrupt_in = NULL
+};
+
+static device_ops_t usb_device_ops = {
+	.interfaces[USB_DEV_IFACE] = &usb_interface
+};
+
 /** Callback when new device is detected and must be handled by this driver.
  *
@@ -63,4 +73,5 @@
 		usb_hc_device_t *hc_dev = malloc(sizeof(usb_hc_device_t));
 		list_initialize(&hc_dev->link);
+		hc_dev->transfer_ops = NULL;
 
 		hc_dev->generic = dev;
@@ -71,5 +82,15 @@
 		}
 
-		add_device_to_class(dev, "usbhc");
+		/*
+		 * Finish initialization of dev and hc_dev structures.
+		 */
+		hc_dev->generic->driver_data = hc_dev;
+		dev->ops = &usb_device_ops;
+
+		/*
+		 * FIXME: The following line causes devman to hang.
+		 * Will investigate later why.
+		 */
+		// add_device_to_class(dev, "usbhc");
 
 		list_append(&hc_dev->link, &hc_list);
@@ -128,9 +149,9 @@
 			 * FIXME: check returned value for possible errors
 			 */
-			usb_hcd_local_transfer_interrupt_in(hc, target,
+			usb_hc_async_interrupt_in(hc, target,
 			    change_bitmap, byte_length, &actual_size,
 			    &handle);
 
-			usb_hcd_local_wait_for(handle);
+			usb_hc_async_wait_for(handle);
 
 			/*
@@ -187,4 +208,18 @@
 int usb_hcd_add_root_hub(usb_hc_device_t *dev)
 {
+	int rc;
+
+	/*
+	 * For testing/debugging purposes only.
+	 * Try to send some data to default USB address.
+	 */
+	usb_target_t target = {0, 0};
+	usb_handle_t handle = 0;
+	char *data = (char *) "Hello, World!";
+
+
+	(void)usb_hc_async_interrupt_out(dev, target, data, str_length(data), &handle);
+	(void)usb_hc_async_wait_for(handle);
+
 	/*
 	 * Announce presence of child device.
@@ -192,5 +227,4 @@
 	device_t *hub = NULL;
 	match_id_t *match_id = NULL;
-	int rc;
 
 	hub = create_device();
@@ -215,5 +249,5 @@
 
 	match_id->id = id;
-	match_id->score = 10;
+	match_id->score = 30;
 
 	add_match_id(&hub->match_ids, match_id);
@@ -224,4 +258,5 @@
 	}
 
+	printf("%s: registered root hub\n", dev->generic->name);
 	return EOK;
 
@@ -236,9 +271,51 @@
 }
 
+/** Issue interrupt OUT transfer to HC driven by current task.
+ *
+ * @param hc Host controller to handle the transfer.
+ * @param target Target device address.
+ * @param buffer Data buffer.
+ * @param size Buffer size.
+ * @param handle Transfer handle.
+ * @return Error code.
+ */
+int usb_hc_async_interrupt_out(usb_hc_device_t *hc, usb_target_t target,
+    void *buffer, size_t size,
+    usb_handle_t *handle)
+{
+	if ((hc->transfer_ops == NULL)
+	    || (hc->transfer_ops->transfer_out == NULL)) {
+		return ENOTSUP;
+	}
+
+	/*
+	 * For debugging purposes only.
+	 * We need to find appropriate device in list of managed device
+	 * and pass it to the transfer callback function.
+	 */
+	usb_hcd_attached_device_info_t dev = {
+		.address = target.address,
+		.endpoint_count = 0,
+		.endpoints = NULL,
+	};
+	usb_hc_endpoint_info_t endpoint = {
+		.endpoint = target.endpoint,
+		.transfer_type = USB_TRANSFER_INTERRUPT,
+		.direction = USB_DIRECTION_OUT,
+		.data_toggle = 0
+	};
+
+	hc->transfer_ops->transfer_out(hc, &dev, &endpoint, buffer, size, NULL, NULL);
+
+	*handle = NULL;
+
+	return EOK;
+}
+
 
 /** Issue interrupt IN transfer to HC driven by current task.
  *
  * @warning The @p buffer and @p actual_size parameters shall not be
- * touched until this transfer is waited for by usb_hcd_local_wait_for().
+ * touched until this transfer is waited for by usb_hc_async_wait_for().
  *
  * @param hc Host controller to handle the transfer.
@@ -250,6 +327,6 @@
  * @return Error code.
  */
-int usb_hcd_local_transfer_interrupt_in(usb_hc_device_t *hc,
-    usb_target_t target, void *buffer, size_t size, size_t *actual_size,
+int usb_hc_async_interrupt_in(usb_hc_device_t *hc, usb_target_t target,
+    void *buffer, size_t size, size_t *actual_size,
     usb_handle_t *handle)
 {
@@ -266,5 +343,5 @@
  * @return Error code.
  */
-int usb_hcd_local_wait_for(usb_handle_t handle)
+int usb_hc_async_wait_for(usb_handle_t handle)
 {
 	return ENOTSUP;
Index: uspace/lib/usb/hcdhubd.h
===================================================================
--- uspace/lib/usb/hcdhubd.h	(revision 91db50ac4a0d8739daf1220f83a40c68c562e4cd)
+++ uspace/lib/usb/hcdhubd.h	(revision 7034be15c0af2249a6ef774fecbf440e2c7a3ef4)
@@ -80,13 +80,9 @@
 /** Callback for OUT transfers. */
 typedef void (*usb_hcd_transfer_callback_out_t)
-    (usb_hc_device_t *, usb_hcd_attached_device_info_t *,
-    usb_hc_endpoint_info_t *,
-    usb_transaction_outcome_t, void *);
+    (usb_hc_device_t *, usb_transaction_outcome_t, void *);
 
 /** Callback for IN transfers. */
 typedef void (*usb_hcd_transfer_callback_in_t)
-    (usb_hc_device_t *, usb_hcd_attached_device_info_t *,
-    usb_hc_endpoint_info_t *,
-    size_t, usb_transaction_outcome_t, void *);
+    (usb_hc_device_t *, size_t, usb_transaction_outcome_t, void *);
 
 
@@ -158,17 +154,11 @@
  */
 
-int usb_hcd_local_set_endpoint_properties(usb_hc_device_t *, usb_target_t,
-    usb_transfer_type_t, usb_direction_t);
 
-/* First variant - repeat transfer type. */
-int usb_hcd_local_transfer_interrupt_in(usb_hc_device_t *, usb_target_t,
+int usb_hc_async_interrupt_out(usb_hc_device_t *, usb_target_t,
+    void *, size_t, usb_handle_t *);
+int usb_hc_async_interrupt_in(usb_hc_device_t *, usb_target_t,
     void *, size_t, size_t *, usb_handle_t *);
 
-/* Second variant - determine transfer type from endpoint properties. */
-int usb_hcd_local_transfer_in(usb_hc_device_t *, usb_target_t,
-    void *, size_t, size_t *, usb_handle_t *);
-
-
-int usb_hcd_local_wait_for(usb_handle_t);
+int usb_hc_async_wait_for(usb_handle_t);
 
 
