Index: uspace/drv/bus/usb/usbmid/usbmid.c
===================================================================
--- uspace/drv/bus/usb/usbmid/usbmid.c	(revision 9d15d1bd38a7b5422ec653dd5c87ec3d9cb353b9)
+++ uspace/drv/bus/usb/usbmid/usbmid.c	(revision 8e4219abd8be9844df15e59ea2ac4481dbd47120)
@@ -59,4 +59,14 @@
 }
 
+static int usb_iface_device_handle(ddf_fun_t *fun, devman_handle_t *handle)
+{
+	assert(fun);
+	assert(handle);
+	usb_device_t *usb_dev = usb_device_get(ddf_fun_get_dev(fun));
+	assert(usb_dev);
+	*handle = usb_device_get_devman_handle(usb_dev);
+	return EOK;
+}
+
 /** Get USB device address by calling the parent usb_device_t.
  *
@@ -119,4 +129,5 @@
 	.get_hc_handle = usb_iface_device_hc_handle,
 	.get_my_address = usb_iface_device_address,
+	.get_device_handle = usb_iface_device_handle,
 	.get_my_interface = usb_iface_iface,
 	.register_endpoint = usb_iface_register_endpoint,
Index: uspace/lib/usbdev/include/usb/dev/device.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/device.h	(revision 9d15d1bd38a7b5422ec653dd5c87ec3d9cb353b9)
+++ uspace/lib/usbdev/include/usb/dev/device.h	(revision 8e4219abd8be9844df15e59ea2ac4481dbd47120)
@@ -62,5 +62,4 @@
 }
 
-
 usb_device_t * usb_device_create(devman_handle_t);
 void usb_device_destroy(usb_device_t *);
@@ -86,4 +85,5 @@
 
 int usb_device_get_iface_number(usb_device_t *);
+devman_handle_t usb_device_get_devman_handle(usb_device_t *);
 
 const usb_device_descriptors_t * usb_device_descriptors(usb_device_t *);
Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision 9d15d1bd38a7b5422ec653dd5c87ec3d9cb353b9)
+++ uspace/lib/usbdev/src/devdrv.c	(revision 8e4219abd8be9844df15e59ea2ac4481dbd47120)
@@ -78,5 +78,8 @@
 	void *driver_data;
 
+	/** Connection to device on USB bus */
 	usb_dev_session_t *bus_session;
+	/** devman handle */
+	devman_handle_t handle;
 } usb_device_t;
 
@@ -331,4 +334,10 @@
 }
 
+devman_handle_t usb_device_get_devman_handle(usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	return usb_dev->handle;
+}
+
 const usb_device_descriptors_t *usb_device_descriptors(usb_device_t *usb_dev)
 {
@@ -405,5 +414,5 @@
 static int usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev,
     const usb_endpoint_description_t **endpoints, const char **errstr_ptr,
-    devman_handle_t handle)
+    devman_handle_t handle, int interface_no)
 {
 	assert(usb_dev != NULL);
@@ -413,4 +422,6 @@
 
 	usb_dev->ddf_dev = ddf_dev;
+	usb_dev->handle = handle;
+	usb_dev->interface_no = interface_no;
 	usb_dev->driver_data = NULL;
 	usb_dev->descriptors.full_config = NULL;
@@ -419,8 +430,5 @@
 	usb_dev->pipes = NULL;
 
-	if (ddf_dev)
-		usb_dev->bus_session = usb_dev_connect_to_self(ddf_dev);
-	else
-		usb_dev->bus_session = usb_dev_connect(handle);
+	usb_dev->bus_session = usb_dev_connect(handle);
 
 	if (!usb_dev->bus_session) {
@@ -433,6 +441,5 @@
 	usb_address_t address;
 
-	int rc = usb_dev_get_info(usb_dev,
-	    &hc_handle, &address, &usb_dev->interface_no);
+	int rc = usb_dev_get_info(usb_dev, &hc_handle, &address, NULL);
 	if (rc != EOK) {
 		usb_dev_disconnect(usb_dev->bus_session);
@@ -503,4 +510,24 @@
 }
 
+static int usb_device_get_info(async_sess_t *sess, devman_handle_t *handle,
+	int *iface_no)
+{
+	assert(handle);
+	assert(iface_no);
+	async_exch_t *exch = async_exchange_begin(sess);
+	if (!exch)
+		return EPARTY;
+	int ret = usb_get_device_handle(exch, handle);
+	if (ret == EOK) {
+		ret = usb_get_my_interface(exch, iface_no);
+		if (ret == ENOTSUP) {
+			*iface_no = -1;
+			ret = EOK;
+		}
+	}
+	async_exchange_end(exch);
+	return ret;
+}
+
 int usb_device_create_ddf(ddf_dev_t *ddf_dev,
     const usb_endpoint_description_t **desc, const char **err)
@@ -508,4 +535,15 @@
 	assert(ddf_dev);
 	assert(err);
+
+	devman_handle_t h = 0;
+	int iface_no = -1;
+
+	async_sess_t *sess = devman_parent_device_connect(EXCHANGE_ATOMIC,
+	    ddf_dev_get_handle(ddf_dev), IPC_FLAG_BLOCKING);
+	const int ret = usb_device_get_info(sess, &h, &iface_no);
+	async_hangup(sess);
+	if (ret != EOK)
+		return ret;
+
 	usb_device_t *usb_dev =
 	    ddf_dev_data_alloc(ddf_dev, sizeof(usb_device_t));
@@ -514,5 +552,6 @@
 		return ENOMEM;
 	}
-	return usb_device_init(usb_dev, ddf_dev, desc, err, 0);
+	
+	return usb_device_init(usb_dev, ddf_dev, desc, err, h, iface_no);
 }
 
@@ -528,9 +567,20 @@
 usb_device_t * usb_device_create(devman_handle_t handle)
 {
+	devman_handle_t h = 0;
+	int iface_no = -1;
+
+	async_sess_t *sess = devman_device_connect(
+	    EXCHANGE_ATOMIC, handle, IPC_FLAG_BLOCKING);
+	int ret = usb_device_get_info(sess, &h, &iface_no);
+	async_hangup(sess);
+	if (ret != EOK)
+		return NULL;
+
 	usb_device_t *usb_dev = malloc(sizeof(usb_device_t));
 	if (!usb_dev)
 		return NULL;
+
 	const char* dummy = NULL;
-	const int ret = usb_device_init(usb_dev, NULL, NULL, &dummy, handle);
+	ret = usb_device_init(usb_dev, NULL, NULL, &dummy, handle, iface_no);
 	if (ret != EOK) {
 		free(usb_dev);
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 9d15d1bd38a7b5422ec653dd5c87ec3d9cb353b9)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 8e4219abd8be9844df15e59ea2ac4481dbd47120)
@@ -216,8 +216,24 @@
 }
 
+/** Gets handle of the respective hc (this device, hc function).
+ *
+ * @param[in] root_hub_fun Root hub function seeking hc handle.
+ * @param[out] handle Place to write the handle.
+ * @return Error code.
+ */
+static int get_device_handle(ddf_fun_t *fun, devman_handle_t *handle)
+{
+	assert(fun);
+	if (handle)
+		*handle = ddf_fun_get_handle(fun);
+	return EOK;
+}
+
 /** Root hub USB interface */
 static usb_iface_t usb_iface = {
 	.get_hc_handle = get_hc_handle,
 	.get_my_address = get_my_address,
+
+	.get_device_handle = get_device_handle,
 
 	.reserve_default_address = reserve_default_address,
@@ -228,5 +244,6 @@
 	.unregister_endpoint = unregister_endpoint,
 };
-/** Standard USB RH options (RH interface) */
+
+/** Standard USB RH options (device interface) */
 static ddf_dev_ops_t usb_ops = {
 	.interfaces[USB_DEV_IFACE] = &usb_iface,
