Index: uspace/drv/uhci-hcd/iface.c
===================================================================
--- uspace/drv/uhci-hcd/iface.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/drv/uhci-hcd/iface.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -42,15 +42,4 @@
 #include "uhci.h"
 
-static int get_address(device_t *dev, devman_handle_t handle,
-    usb_address_t *address)
-{
-	assert(dev);
-	uhci_t *hc = dev_to_uhci(dev);
-	assert(hc);
-	*address = usb_address_keeping_find(&hc->address_manager, handle);
-	if (*address <= 0)
-	  return *address;
-	return EOK;
-}
 /*----------------------------------------------------------------------------*/
 static int reserve_default_address(device_t *dev, usb_speed_t speed)
@@ -168,6 +157,4 @@
 /*----------------------------------------------------------------------------*/
 usbhc_iface_t uhci_iface = {
-	.tell_address = get_address,
-
 	.reserve_default_address = reserve_default_address,
 	.release_default_address = release_default_address,
Index: uspace/drv/uhci-hcd/main.c
===================================================================
--- uspace/drv/uhci-hcd/main.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/drv/uhci-hcd/main.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -55,6 +55,27 @@
 }
 
+static int usb_iface_get_address(device_t *dev, devman_handle_t handle,
+    usb_address_t *address)
+{
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+
+	usb_address_t addr = usb_address_keeping_find(&hc->address_manager,
+	    handle);
+	if (addr < 0) {
+		return addr;
+	}
+
+	if (address != NULL) {
+		*address = addr;
+	}
+
+	return EOK;
+}
+
 static usb_iface_t hc_usb_iface = {
-	.get_hc_handle = usb_iface_get_hc_handle
+	.get_hc_handle = usb_iface_get_hc_handle,
+	.get_address = usb_iface_get_address
 };
 
Index: uspace/drv/uhci-rhd/main.c
===================================================================
--- uspace/drv/uhci-rhd/main.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/drv/uhci-rhd/main.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -34,4 +34,5 @@
 #include <driver.h>
 #include <usb_iface.h>
+#include <usb/ddfiface.h>
 
 #include <errno.h>
@@ -56,5 +57,6 @@
 
 static usb_iface_t uhci_rh_usb_iface = {
-	.get_hc_handle = usb_iface_get_hc_handle
+	.get_hc_handle = usb_iface_get_hc_handle,
+	.get_address = usb_iface_get_address_hub_impl
 };
 
Index: uspace/drv/usbhub/usbhub.c
===================================================================
--- uspace/drv/usbhub/usbhub.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/drv/usbhub/usbhub.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -39,4 +39,5 @@
 
 #include <usb_iface.h>
+#include <usb/ddfiface.h>
 #include <usb/usbdrv.h>
 #include <usb/descriptor.h>
@@ -50,15 +51,6 @@
 #include "usb/usb.h"
 
-static int iface_get_hc_handle(device_t *device, devman_handle_t *handle)
-{
-	return usb_hc_find(device->handle, handle);
-}
-
-static usb_iface_t hub_usb_iface = {
-	.get_hc_handle = iface_get_hc_handle
-};
-
 static device_ops_t hub_device_ops = {
-	.interfaces[USB_DEV_IFACE] = &hub_usb_iface
+	.interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl
 };
 
Index: uspace/drv/vhc/conn.h
===================================================================
--- uspace/drv/vhc/conn.h	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/drv/vhc/conn.h	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -38,4 +38,5 @@
 #include <usb/usb.h>
 #include <usbhc_iface.h>
+#include <usb_iface.h>
 #include "vhcd.h"
 #include "devices.h"
@@ -43,5 +44,6 @@
 void connection_handler_host(sysarg_t);
 
-usbhc_iface_t vhc_iface;
+extern usbhc_iface_t vhc_iface;
+extern usb_iface_t vhc_usb_iface;
 
 void address_init(void);
Index: uspace/drv/vhc/connhost.c
===================================================================
--- uspace/drv/vhc/connhost.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/drv/vhc/connhost.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -37,4 +37,5 @@
 #include <usb/usb.h>
 #include <usb/addrkeep.h>
+#include <usb/ddfiface.h>
 
 #include "vhcd.h"
@@ -313,4 +314,15 @@
 static usb_address_keeping_t addresses;
 
+static int tell_address(device_t *dev, devman_handle_t handle,
+    usb_address_t *address)
+{
+	usb_address_t addr = usb_address_keeping_find(&addresses, handle);
+	if (addr < 0) {
+		return addr;
+	}
+
+	*address = addr;
+	return EOK;
+}
 
 static int reserve_default_address(device_t *dev, usb_speed_t ignored)
@@ -350,16 +362,4 @@
 }
 
-static int tell_address(device_t *dev, devman_handle_t handle,
-    usb_address_t *address)
-{
-	usb_address_t addr = usb_address_keeping_find(&addresses, handle);
-	if (addr < 0) {
-		return addr;
-	}
-
-	*address = addr;
-	return EOK;
-}
-
 void address_init(void)
 {
@@ -368,6 +368,4 @@
 
 usbhc_iface_t vhc_iface = {
-	.tell_address = tell_address,
-
 	.reserve_default_address = reserve_default_address,
 	.release_default_address = release_default_address,
@@ -383,4 +381,10 @@
 };
 
+usb_iface_t vhc_usb_iface = {
+	.get_hc_handle = usb_iface_get_hc_handle_hc_impl,
+	.get_address = tell_address
+};
+
+
 /**
  * @}
Index: uspace/drv/vhc/hcd.c
===================================================================
--- uspace/drv/vhc/hcd.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/drv/vhc/hcd.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -45,4 +45,5 @@
 
 #include <usb/usb.h>
+#include <usb/ddfiface.h>
 #include <usb_iface.h>
 #include "vhcd.h"
@@ -52,20 +53,7 @@
 #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,
+	.interfaces[USB_DEV_IFACE] = &vhc_usb_iface,
 	.close = on_client_close,
 	.default_handler = default_connection_handler
