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
Index: uspace/lib/drv/generic/remote_usb.c
===================================================================
--- uspace/lib/drv/generic/remote_usb.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/lib/drv/generic/remote_usb.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -41,8 +41,10 @@
 
 static void remote_usb_get_hc_handle(device_t *, void *, ipc_callid_t, ipc_call_t *);
+static void remote_usb_get_address(device_t *, void *, ipc_callid_t, ipc_call_t *);
 //static void remote_usb(device_t *, void *, ipc_callid_t, ipc_call_t *);
 
 /** Remote USB interface operations. */
 static remote_iface_func_ptr_t remote_usb_iface_ops [] = {
+	remote_usb_get_address,
 	remote_usb_get_hc_handle
 };
@@ -55,4 +57,26 @@
 	.methods = remote_usb_iface_ops
 };
+
+
+void remote_usb_get_address(device_t *device, void *iface,
+    ipc_callid_t callid, ipc_call_t *call)
+{
+	usb_iface_t *usb_iface = (usb_iface_t *) iface;
+
+	if (usb_iface->get_address == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	devman_handle_t handle = DEV_IPC_GET_ARG1(*call);
+
+	usb_address_t address;
+	int rc = usb_iface->get_address(device, handle, &address);
+	if (rc != EOK) {
+		async_answer_0(callid, rc);
+	} else {
+		async_answer_1(callid, EOK, address);
+	}
+}
 
 
Index: uspace/lib/drv/generic/remote_usbhc.c
===================================================================
--- uspace/lib/drv/generic/remote_usbhc.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/lib/drv/generic/remote_usbhc.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -43,5 +43,4 @@
 #define HACK_MAX_PACKET_SIZE_INTERRUPT_IN 4
 
-static void remote_usbhc_get_address(device_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_usbhc_interrupt_out(device_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_usbhc_interrupt_in(device_t *, void *, ipc_callid_t, ipc_call_t *);
@@ -59,6 +58,4 @@
 /** Remote USB host controller interface operations. */
 static remote_iface_func_ptr_t remote_usbhc_iface_ops [] = {
-	remote_usbhc_get_address,
-
 	remote_usbhc_reserve_default_address,
 	remote_usbhc_release_default_address,
@@ -124,25 +121,4 @@
 
 	return trans;
-}
-
-void remote_usbhc_get_address(device_t *device, void *iface,
-    ipc_callid_t callid, ipc_call_t *call)
-{
-	usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;
-
-	if (!usb_iface->tell_address) {
-		async_answer_0(callid, ENOTSUP);
-		return;
-	}
-
-	devman_handle_t handle = DEV_IPC_GET_ARG1(*call);
-
-	usb_address_t address;
-	int rc = usb_iface->tell_address(device, handle, &address);
-	if (rc != EOK) {
-		async_answer_0(callid, rc);
-	} else {
-		async_answer_1(callid, EOK, address);
-	}
 }
 
Index: uspace/lib/drv/include/usb_iface.h
===================================================================
--- uspace/lib/drv/include/usb_iface.h	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/lib/drv/include/usb_iface.h	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -41,4 +41,15 @@
 #include <usb/usb.h>
 typedef enum {
+	/** Tell USB address assigned to device.
+	 * Parameters:
+	 * - devman handle id
+	 * Answer:
+	 * - EINVAL - unknown handle or handle not managed by this driver
+	 * - ENOTSUP - operation not supported (shall not happen)
+	 * - arbitrary error code if returned by remote implementation
+	 * - EOK - handle found, first parameter contains the USB address
+	 */
+	IPC_M_USB_GET_ADDRESS,
+
 	/** Tell devman handle of device host controller.
 	 * Parameters:
@@ -55,4 +66,5 @@
 /** USB device communication interface. */
 typedef struct {
+	int (*get_address)(device_t *, devman_handle_t, usb_address_t *);
 	int (*get_hc_handle)(device_t *, devman_handle_t *);
 } usb_iface_t;
Index: uspace/lib/drv/include/usbhc_iface.h
===================================================================
--- uspace/lib/drv/include/usbhc_iface.h	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/lib/drv/include/usbhc_iface.h	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -85,16 +85,4 @@
  */
 typedef enum {
-	/** Tell USB address assigned to device.
-	 * Parameters:
-	 * - devman handle id
-	 * Answer:
-	 * - EINVAL - unknown handle or handle not managed by this driver
-	 * - ENOTSUP - operation not supported by HC (shall not happen)
-	 * - arbitrary error code if returned by remote implementation
-	 * - EOK - handle found, first parameter contains the USB address
-	 */
-	IPC_M_USBHC_GET_ADDRESS,
-
-
 	/** Reserve usage of default address.
 	 * This call informs the host controller that the caller will be
@@ -206,6 +194,4 @@
 /** USB host controller communication interface. */
 typedef struct {
-	int (*tell_address)(device_t *, devman_handle_t, usb_address_t *);
-
 	int (*reserve_default_address)(device_t *, usb_speed_t);
 	int (*release_default_address)(device_t *);
Index: uspace/lib/usb/Makefile
===================================================================
--- uspace/lib/usb/Makefile	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/lib/usb/Makefile	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -35,4 +35,5 @@
 	src/addrkeep.c \
 	src/class.c \
+	src/ddfiface.c \
 	src/debug.c \
 	src/dp.c \
Index: uspace/lib/usb/include/usb/ddfiface.h
===================================================================
--- uspace/lib/usb/include/usb/ddfiface.h	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
+++ uspace/lib/usb/include/usb/ddfiface.h	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2011 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libusb
+ * @{
+ */
+/** @file
+ * Implementations of DDF interfaces functions.
+ */
+#ifndef LIBUSB_DDFIFACE_H_
+#define LIBUSB_DDFIFACE_H_
+
+#include <sys/types.h>
+#include <usb/usbdevice.h>
+#include <usb_iface.h>
+
+int usb_iface_get_hc_handle_hub_impl(device_t *, devman_handle_t *);
+int usb_iface_get_address_hub_impl(device_t *, devman_handle_t,
+    usb_address_t *);
+extern usb_iface_t usb_iface_hub_impl;
+
+int usb_iface_get_hc_handle_hub_child_impl(device_t *, devman_handle_t *);
+int usb_iface_get_address_hub_child_impl(device_t *, devman_handle_t,
+    usb_address_t *);
+extern usb_iface_t usb_iface_hub_child_impl;
+
+int usb_iface_get_hc_handle_hc_impl(device_t *, devman_handle_t *);
+
+
+#endif
+/**
+ * @}
+ */
Index: uspace/lib/usb/src/ddfiface.c
===================================================================
--- uspace/lib/usb/src/ddfiface.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
+++ uspace/lib/usb/src/ddfiface.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2011 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libusb
+ * @{
+ */
+/** @file
+ * Implementations of DDF interfaces functions (actual implementation).
+ */
+#include <ipc/devman.h>
+#include <usb/ddfiface.h>
+#include <errno.h>
+
+/** DDF interface for USB device, implementation for typical hub. */
+usb_iface_t  usb_iface_hub_impl = {
+	.get_hc_handle = usb_iface_get_hc_handle_hub_impl,
+	.get_address = usb_iface_get_address_hub_impl
+};
+
+/** DDF interface for USB device, implementation for child of a typical hub. */
+usb_iface_t  usb_iface_hub_child_impl = {
+	.get_hc_handle = usb_iface_get_hc_handle_hub_child_impl,
+	.get_address = usb_iface_get_address_hub_child_impl
+};
+
+
+/** Get host controller handle, interface implementation for hub driver.
+ *
+ * @param[in] device Device the operation is running on.
+ * @param[out] handle Storage for the host controller handle.
+ * @return Error code.
+ */
+int usb_iface_get_hc_handle_hub_impl(device_t *device, devman_handle_t *handle)
+{
+	assert(device);
+	return usb_hc_find(device->handle, handle);
+}
+
+/** Get host controller handle, interface implementation for child of
+ * a hub driver.
+ *
+ * @param[in] device Device the operation is running on.
+ * @param[out] handle Storage for the host controller handle.
+ * @return Error code.
+ */
+int usb_iface_get_hc_handle_hub_child_impl(device_t *device,
+    devman_handle_t *handle)
+{
+	assert(device);
+	device_t *parent = device->parent;
+
+	/* Default error, device does not support this operation. */
+	int rc = ENOTSUP;
+
+	if (parent && parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) {
+		usb_iface_t *usb_iface
+		    = (usb_iface_t *) parent->ops->interfaces[USB_DEV_IFACE];
+		assert(usb_iface != NULL);
+
+		if (usb_iface->get_hc_handle) {
+			rc = usb_iface->get_hc_handle(parent, handle);
+		}
+	}
+
+	return rc;
+}
+
+/** Get host controller handle, interface implementation for HC driver.
+ *
+ * @param[in] device Device the operation is running on.
+ * @param[out] handle Storage for the host controller handle.
+ * @return Always EOK.
+ */
+int usb_iface_get_hc_handle_hc_impl(device_t *device, devman_handle_t *handle)
+{
+	assert(device);
+
+	if (handle != NULL) {
+		*handle = device->handle;
+	}
+
+	return EOK;
+}
+
+/** Get USB device address, interface implementation for hub driver.
+ *
+ * @param[in] device Device the operation is running on.
+ * @param[in] handle Devman handle of USB device we want address of.
+ * @param[out] address Storage for USB address of device with handle @p handle.
+ * @return Error code.
+ */
+int usb_iface_get_address_hub_impl(device_t *device, devman_handle_t handle,
+    usb_address_t *address)
+{
+	assert(device);
+	int parent_phone = devman_parent_device_connect(device->handle,
+	    IPC_FLAG_BLOCKING);
+	if (parent_phone < 0) {
+		return parent_phone;
+	}
+
+	sysarg_t addr;
+	int rc = async_req_2_1(parent_phone, DEV_IFACE_ID(USB_DEV_IFACE),
+	    IPC_M_USB_GET_ADDRESS, handle, &addr);
+
+	async_hangup(parent_phone);
+
+	if (rc != EOK) {
+		return rc;
+	}
+
+	if (address != NULL) {
+		*address = (usb_address_t) addr;
+	}
+
+	return EOK;
+}
+
+/** Get USB device address, interface implementation for child of
+ * a hub driver.
+ *
+ * @param[in] device Device the operation is running on.
+ * @param[in] handle Devman handle of USB device we want address of.
+ * @param[out] address Storage for USB address of device with handle @p handle.
+ * @return Error code.
+ */
+int usb_iface_get_address_hub_child_impl(device_t *device,
+    devman_handle_t handle, usb_address_t *address)
+{
+	assert(device);
+	device_t *parent = device->parent;
+
+	/* Default error, device does not support this operation. */
+	int rc = ENOTSUP;
+
+	if (parent && parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) {
+		usb_iface_t *usb_iface
+		    = (usb_iface_t *) parent->ops->interfaces[USB_DEV_IFACE];
+		assert(usb_iface != NULL);
+
+		if (usb_iface->get_address) {
+			rc = usb_iface->get_address(parent, handle, address);
+		}
+	}
+
+	return rc;
+}
+
+/**
+ * @}
+ */
Index: uspace/lib/usb/src/hub.c
===================================================================
--- uspace/lib/usb/src/hub.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/lib/usb/src/hub.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -301,5 +301,4 @@
 }
 
-
 /**
  * @}
Index: uspace/lib/usb/src/pipes.c
===================================================================
--- uspace/lib/usb/src/pipes.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/lib/usb/src/pipes.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -36,4 +36,5 @@
 #include <usb/pipes.h>
 #include <usbhc_iface.h>
+#include <usb_iface.h>
 #include <errno.h>
 #include <assert.h>
@@ -41,5 +42,5 @@
 /** Tell USB address assigned to given device.
  *
- * @param phone Phone to my HC.
+ * @param phone Phone to parent device.
  * @param dev Device in question.
  * @return USB address or error code.
@@ -48,6 +49,6 @@
 {
 	sysarg_t address;
-	int rc = async_req_2_1(phone, DEV_IFACE_ID(USBHC_DEV_IFACE),
-	    IPC_M_USBHC_GET_ADDRESS,
+	int rc = async_req_2_1(phone, DEV_IFACE_ID(USB_DEV_IFACE),
+	    IPC_M_USB_GET_ADDRESS,
 	    dev->handle, &address);
 
@@ -80,10 +81,11 @@
 	}
 
-	int hc_phone = devman_device_connect(hc_handle, 0);
-	if (hc_phone < 0) {
-		return hc_phone;
-	}
-
-	my_address = get_my_address(hc_phone, device);
+	int parent_phone = devman_parent_device_connect(device->handle,
+	    IPC_FLAG_BLOCKING);
+	if (parent_phone < 0) {
+		return parent_phone;
+	}
+
+	my_address = get_my_address(parent_phone, device);
 	if (my_address < 0) {
 		rc = my_address;
@@ -95,5 +97,5 @@
 
 leave:
-	async_hangup(hc_phone);
+	async_hangup(parent_phone);
 	return rc;
 }
Index: uspace/lib/usb/src/recognise.c
===================================================================
--- uspace/lib/usb/src/recognise.c	(revision 3ae93a822febda099a86ca24250d39ee29ddb5f0)
+++ uspace/lib/usb/src/recognise.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -34,8 +34,8 @@
  */
 #include <sys/types.h>
-#include <usb_iface.h>
 #include <usb/usbdrv.h>
 #include <usb/pipes.h>
 #include <usb/recognise.h>
+#include <usb/ddfiface.h>
 #include <usb/request.h>
 #include <usb/classes/classes.h>
@@ -46,36 +46,6 @@
 static FIBRIL_MUTEX_INITIALIZE(device_name_index_mutex);
 
-/** Callback for getting host controller handle.
- *
- * @param dev Device in question.
- * @param[out] handle Devman handle of the host controller.
- * @return Error code.
- */
-static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle)
-{
-	assert(dev);
-	assert(dev->parent != NULL);
-
-	device_t *parent = dev->parent;
-
-	if (parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) {
-		usb_iface_t *usb_iface
-		    = (usb_iface_t *) parent->ops->interfaces[USB_DEV_IFACE];
-		assert(usb_iface != NULL);
-		if (usb_iface->get_hc_handle) {
-			int rc = usb_iface->get_hc_handle(parent, handle);
-			return rc;
-		}
-	}
-
-	return ENOTSUP;
-}
-
-static usb_iface_t usb_iface = {
-	.get_hc_handle = usb_iface_get_hc_handle
-};
-
 device_ops_t child_ops = {
-	.interfaces[USB_DEV_IFACE] = &usb_iface
+	.interfaces[USB_DEV_IFACE] = &usb_iface_hub_child_impl
 };
 
