Index: uspace/drv/uhci/main.c
===================================================================
--- uspace/drv/uhci/main.c	(revision f8b00f1e5f27b1bdfb0f457296c64fb917ef4ebf)
+++ uspace/drv/uhci/main.c	(revision 8f8a0cd66d82dc0f39e3ccc0ff2eb654c731d249)
@@ -27,4 +27,5 @@
  */
 #include <usb/hcdhubd.h>
+#include <usb_iface.h>
 #include <usb/debug.h>
 #include <errno.h>
@@ -32,6 +33,20 @@
 #include "uhci.h"
 
+static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle)
+{
+	/* This shall be called only for the UHCI itself. */
+	assert(dev->parent == NULL);
+
+	*handle = dev->handle;
+	return EOK;
+}
+
+static usb_iface_t hc_usb_iface = {
+	.get_hc_handle = usb_iface_get_hc_handle
+};
+
 static device_ops_t uhci_ops = {
-	.interfaces[USBHC_DEV_IFACE] = &uhci_iface,
+	.interfaces[USB_DEV_IFACE] = &hc_usb_iface,
+	.interfaces[USBHC_DEV_IFACE] = &uhci_iface
 };
 
Index: uspace/drv/usbhub/usbhub.c
===================================================================
--- uspace/drv/usbhub/usbhub.c	(revision f8b00f1e5f27b1bdfb0f457296c64fb917ef4ebf)
+++ uspace/drv/usbhub/usbhub.c	(revision 8f8a0cd66d82dc0f39e3ccc0ff2eb654c731d249)
@@ -37,5 +37,5 @@
 #include <errno.h>
 
-#include <usbhc_iface.h>
+#include <usb_iface.h>
 #include <usb/usbdrv.h>
 #include <usb/descriptor.h>
@@ -46,4 +46,12 @@
 #include "usbhub_private.h"
 #include "port_status.h"
+
+static usb_iface_t hub_usb_iface = {
+	.get_hc_handle = usb_drv_find_hc
+};
+
+static device_ops_t hub_device_ops = {
+	.interfaces[USB_DEV_IFACE] = &hub_usb_iface
+};
 
 //*********************************************
@@ -135,8 +143,12 @@
 	 * connected devices.
 	 */
+	dev->ops = &hub_device_ops;
 
 	//create the hub structure
 	//get hc connection
-	int hc = usb_drv_hc_connect(dev, 0);
+	int hc = usb_drv_hc_connect_auto(dev, 0);
+	if (hc < 0) {
+		return hc;
+	}
 
 	usb_hub_info_t * hub_info = usb_create_hub_info(dev, hc);
@@ -464,5 +476,5 @@
 		 * Connect to respective HC.
 		 */
-		int hc = usb_drv_hc_connect(hub_info->device, 0);
+		int hc = usb_drv_hc_connect_auto(hub_info->device, 0);
 		if (hc < 0) {
 			continue;
Index: uspace/drv/usbkbd/main.c
===================================================================
--- uspace/drv/usbkbd/main.c	(revision f8b00f1e5f27b1bdfb0f457296c64fb917ef4ebf)
+++ uspace/drv/usbkbd/main.c	(revision 8f8a0cd66d82dc0f39e3ccc0ff2eb654c731d249)
@@ -190,5 +190,5 @@
 	// get phone to my HC and save it as my parent's phone
 	// TODO: maybe not a good idea if DDF will use parent_phone
-	kbd_dev->device->parent_phone = usb_drv_hc_connect(dev, 0);
+	kbd_dev->device->parent_phone = usb_drv_hc_connect_auto(dev, 0);
 
 	kbd_dev->address = usb_drv_get_my_address(dev->parent_phone,
@@ -325,5 +325,5 @@
 	 * Not supported yet, skip..
 	 */
-//	int phone = usb_drv_hc_connect(dev, 0);
+//	int phone = usb_drv_hc_connect_auto(dev, 0);
 //	if (phone < 0) {
 //		/*
Index: uspace/drv/vhc/hcd.c
===================================================================
--- uspace/drv/vhc/hcd.c	(revision f8b00f1e5f27b1bdfb0f457296c64fb917ef4ebf)
+++ uspace/drv/vhc/hcd.c	(revision 8f8a0cd66d82dc0f39e3ccc0ff2eb654c731d249)
@@ -46,4 +46,5 @@
 
 #include <usb/usb.h>
+#include <usb_iface.h>
 #include "vhcd.h"
 #include "hc.h"
@@ -52,6 +53,20 @@
 #include "conn.h"
 
+static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle)
+{
+	/* This shall be called only for VHC device. */
+	assert(dev->parent == NULL);
+
+	*handle = dev->handle;
+	return EOK;
+}
+
+static usb_iface_t hc_usb_iface = {
+	.get_hc_handle = usb_iface_get_hc_handle
+};
+
 static device_ops_t vhc_ops = {
 	.interfaces[USBHC_DEV_IFACE] = &vhc_iface,
+	.interfaces[USB_DEV_IFACE] = &hc_usb_iface,
 	.default_handler = default_connection_handler
 };
Index: uspace/drv/vhc/hub.c
===================================================================
--- uspace/drv/vhc/hub.c	(revision f8b00f1e5f27b1bdfb0f457296c64fb917ef4ebf)
+++ uspace/drv/vhc/hub.c	(revision 8f8a0cd66d82dc0f39e3ccc0ff2eb654c731d249)
@@ -79,5 +79,5 @@
 	device_t *hc_dev = (device_t *) arg;
 
-	int hc = usb_drv_hc_connect(hc_dev, IPC_FLAG_BLOCKING);
+	int hc = usb_drv_hc_connect(hc_dev, hc_dev->handle, IPC_FLAG_BLOCKING);
 	if (hc < 0) {
 		printf(NAME ": failed to register root hub\n");
