Index: uspace/drv/usbmid/main.c
===================================================================
--- uspace/drv/usbmid/main.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
+++ uspace/drv/usbmid/main.c	(revision b68b27909054c76dc019f8747e5deced7215822a)
@@ -48,5 +48,4 @@
 	usbmid_device_t *dev = usbmid_device_create(gen_dev);
 	if (dev == NULL) {
-		usb_log_error("Initialization of new USB MID device failed.\n");
 		return ENOMEM;
 	}
Index: uspace/drv/usbmid/usbmid.c
===================================================================
--- uspace/drv/usbmid/usbmid.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
+++ uspace/drv/usbmid/usbmid.c	(revision b68b27909054c76dc019f8747e5deced7215822a)
@@ -38,4 +38,5 @@
 #include <stdlib.h>
 #include <usb_iface.h>
+#include <usb/ddfiface.h>
 #include <usb/pipes.h>
 #include <usb/classes/classes.h>
@@ -44,9 +45,12 @@
 
 /** Callback for DDF USB interface. */
-static int iface_get_hc_handle(device_t *dev, devman_handle_t *handle)
+static int usb_iface_get_address_impl(device_t *device, devman_handle_t handle,
+    usb_address_t *address)
 {
-	device_t *parent = dev->parent;
+	assert(device);
+	device_t *parent = device->parent;
 
-	usb_log_debug("iface_get_hc_handle(dev=%zu)\n", (size_t) dev->handle);
+	/* Default error, device does not support this operation. */
+	int rc = ENOTSUP;
 
 	if (parent && parent->ops && parent->ops->interfaces[USB_DEV_IFACE]) {
@@ -54,20 +58,26 @@
 		    = (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;
+
+		if (usb_iface->get_address) {
+			rc = usb_iface->get_address(parent, parent->handle,
+			    address);
 		}
-		return ENOTSUP;
-	} else {
-		return usb_hc_find(dev->handle, handle);
 	}
+
+	return rc;
 }
 
-static usb_iface_t usb_iface = {
-	.get_hc_handle = iface_get_hc_handle
+static usb_iface_t child_usb_iface = {
+	.get_hc_handle = usb_iface_get_hc_handle_hub_child_impl,
+	.get_address = usb_iface_get_address_impl
 };
 
-static device_ops_t device_ops = {
-	.interfaces[USB_DEV_IFACE] = &usb_iface
+
+static device_ops_t child_device_ops = {
+	.interfaces[USB_DEV_IFACE] = &child_usb_iface
+};
+
+static device_ops_t mid_device_ops = {
+	.interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl
 };
 
@@ -82,4 +92,6 @@
 	usbmid_device_t *mid = malloc(sizeof(usbmid_device_t));
 	if (mid == NULL) {
+		usb_log_error("Out of memory (wanted %zu bytes).\n",
+		    sizeof(usbmid_device_t));
 		return NULL;
 	}
@@ -88,4 +100,6 @@
 	rc = usb_device_connection_initialize_from_device(&mid->wire, dev);
 	if (rc != EOK) {
+		usb_log_error("Failed to initialize `USB wire': %s.\n",
+		    str_error(rc));
 		free(mid);
 		return NULL;
@@ -95,4 +109,6 @@
 	    &mid->wire);
 	if (rc != EOK) {
+		usb_log_error("Failed to initialize control pipe: %s.\n",
+		    str_error(rc));
 		free(mid);
 		return NULL;
@@ -100,5 +116,5 @@
 
 	mid->dev = dev;
-	dev->ops = &device_ops;
+	dev->ops = &mid_device_ops;
 
 	return mid;
@@ -141,5 +157,5 @@
 	child->parent = parent->dev;
 	child->name = child_name;
-	child->ops = &device_ops;
+	child->ops = &child_device_ops;
 
 	rc = usb_device_create_match_ids_from_interface(interface_descriptor,
