Index: uspace/lib/usbdev/include/usb/dev/device.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/device.h	(revision 28384868fe6a9bbe937ea13e4dd739b2076b2539)
+++ uspace/lib/usbdev/include/usb/dev/device.h	(revision 64e1fb2eca59f3163d32012107ab8b46a0fe2428)
@@ -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 28384868fe6a9bbe937ea13e4dd739b2076b2539)
+++ uspace/lib/usbdev/src/devdrv.c	(revision 64e1fb2eca59f3163d32012107ab8b46a0fe2428)
@@ -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);
