Index: uspace/lib/usb/include/usb/dev.h
===================================================================
--- uspace/lib/usb/include/usb/dev.h	(revision 899f1a95f22eca90d14c5209d80a487c9a0979f0)
+++ uspace/lib/usb/include/usb/dev.h	(revision c24c157d1eb375ea2bba9e9f91d169ea1e61a238)
@@ -66,7 +66,22 @@
 }
 
-usb_address_t usb_get_address_by_handle(devman_handle_t);
+int usb_get_info_by_handle(devman_handle_t,
+    devman_handle_t *, usb_address_t *, int *);
 
-int usb_get_hc_by_handle(devman_handle_t, devman_handle_t *);
+static inline int usb_get_hc_by_handle(devman_handle_t dev, devman_handle_t *hc)
+{
+	return usb_get_info_by_handle(dev, hc, NULL, NULL);
+}
+
+static inline int usb_get_address_by_handle(
+    devman_handle_t dev, usb_address_t *address)
+{
+	return usb_get_info_by_handle(dev, NULL, address, NULL);
+}
+
+static inline int usb_get_iface_by_handle(devman_handle_t dev, int *iface)
+{
+	return usb_get_info_by_handle(dev, NULL, NULL, iface);
+}
 
 int usb_resolve_device_handle(const char *, devman_handle_t *, usb_address_t *,
Index: uspace/lib/usb/src/dev.c
===================================================================
--- uspace/lib/usb/src/dev.c	(revision 899f1a95f22eca90d14c5209d80a487c9a0979f0)
+++ uspace/lib/usb/src/dev.c	(revision c24c157d1eb375ea2bba9e9f91d169ea1e61a238)
@@ -31,14 +31,19 @@
 #include <usb_iface.h>
 
-/** Tell USB address assigned to device with given handle.
+/** Find host controller handle, address and iface number for the device.
  *
- * @param dev_handle Devman handle of the USB device in question.
- * @return USB address or negative error code.
+ * @param[in] device_handle Device devman handle.
+ * @param[out] hc_handle Where to store handle of host controller
+ *	controlling device with @p device_handle handle.
+ * @param[out] address Place to store the device's address
+ * @param[out] iface Place to stoer the assigned USB interface number.
+ * @return Error code.
  */
-usb_address_t usb_get_address_by_handle(devman_handle_t dev_handle)
+int usb_get_info_by_handle(devman_handle_t device_handle,
+    devman_handle_t *hc_handle, usb_address_t *address, int *iface)
 {
 	async_sess_t *parent_sess =
-	    devman_parent_device_connect(EXCHANGE_ATOMIC, dev_handle,
-	    IPC_FLAG_BLOCKING);
+	    devman_parent_device_connect(EXCHANGE_ATOMIC, device_handle,
+	        IPC_FLAG_BLOCKING);
 	if (!parent_sess)
 		return ENOMEM;
@@ -49,43 +54,55 @@
 		return ENOMEM;
 	}
-	usb_address_t address;
-	const int ret = usb_get_my_address(exch, &address);
+
+	usb_address_t tmp_address;
+	devman_handle_t tmp_handle;
+	int tmp_iface;
+
+	if (address) {
+		const int ret = usb_get_my_address(exch, &tmp_address);
+		if (ret != EOK) {
+			async_exchange_end(exch);
+			async_hangup(parent_sess);
+			return ret;
+		}
+	}
+
+	if (hc_handle) {
+		const int ret = usb_get_hc_handle(exch, &tmp_handle);
+		if (ret != EOK) {
+			async_exchange_end(exch);
+			async_hangup(parent_sess);
+			return ret;
+		}
+	}
+
+	if (iface) {
+		const int ret = usb_get_my_interface(exch, &tmp_iface);
+		switch (ret) {
+		case ENOTSUP:
+			/* Implementing GET_MY_INTERFACE is voluntary. */
+			tmp_iface = -1;
+		case EOK:
+			break;
+		default:
+			async_exchange_end(exch);
+			async_hangup(parent_sess);
+			return ret;
+		}
+	}
+
+	if (hc_handle)
+		*hc_handle = tmp_handle;
+
+	if (address)
+		*address = tmp_address;
+
+	if (iface)
+		*iface = tmp_iface;
 
 	async_exchange_end(exch);
 	async_hangup(parent_sess);
 
-	if (ret != EOK)
-		return ret;
-
-	return address;
-}
-/*----------------------------------------------------------------------------*/
-/** Find host controller handle for the device.
- *
- * @param[in] device_handle Device devman handle.
- * @param[out] hc_handle Where to store handle of host controller
- *	controlling device with @p device_handle handle.
- * @return Error code.
- */
-int usb_get_hc_by_handle(devman_handle_t device_handle,
-    devman_handle_t *hc_handle)
-{
-	async_sess_t *parent_sess =
-	    devman_parent_device_connect(EXCHANGE_ATOMIC, device_handle,
-	    IPC_FLAG_BLOCKING);
-	if (!parent_sess)
-		return ENOMEM;
-
-	async_exch_t *exch = async_exchange_begin(parent_sess);
-	if (!exch) {
-		async_hangup(parent_sess);
-		return ENOMEM;
-	}
-	const int ret = usb_get_hc_handle(exch, hc_handle);
-
-	async_exchange_end(exch);
-	async_hangup(parent_sess);
-
-	return ret;
+	return EOK;
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/lib/usb/src/resolve.c
===================================================================
--- uspace/lib/usb/src/resolve.c	(revision 899f1a95f22eca90d14c5209d80a487c9a0979f0)
+++ uspace/lib/usb/src/resolve.c	(revision c24c157d1eb375ea2bba9e9f91d169ea1e61a238)
@@ -193,6 +193,6 @@
 		/* Try to get its address. */
 		if (!found_addr) {
-			dev_addr = usb_get_address_by_handle(tmp_handle);
-			if (dev_addr >= 0) {
+			rc = usb_get_address_by_handle(tmp_handle, &dev_addr);
+			if (rc == 0) {
 				found_addr = true;
 			}
Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision 899f1a95f22eca90d14c5209d80a487c9a0979f0)
+++ uspace/lib/usbdev/src/devdrv.c	(revision c24c157d1eb375ea2bba9e9f91d169ea1e61a238)
@@ -484,11 +484,20 @@
 	usb_dev->pipes = NULL;
 
+	/* Get assigned params */
+	devman_handle_t hc_handle;
+	usb_address_t address;
+
+	int rc = usb_get_info_by_handle(ddf_dev->handle,
+	    &hc_handle, &address, &usb_dev->interface_no);
+	if (rc != EOK) {
+		*errstr_ptr = "device parameters retrieval";
+		return rc;
+	}
+
 	/* Initialize hc connection. */
-	usb_hc_connection_initialize_from_device(&usb_dev->hc_conn, ddf_dev);
-	const usb_address_t address =
-	    usb_get_address_by_handle(ddf_dev->handle);
+	usb_hc_connection_initialize(&usb_dev->hc_conn, hc_handle);
 
 	/* Initialize backing wire and control pipe. */
-	int rc = usb_device_connection_initialize(
+	rc = usb_device_connection_initialize(
 	    &usb_dev->wire, &usb_dev->hc_conn, address);
 	if (rc != EOK) {
@@ -512,6 +521,4 @@
 	}
 
-	/* Get our interface. */
-	usb_dev->interface_no = usb_device_get_assigned_interface(ddf_dev);
 	/* Retrieve standard descriptors. */
 	rc = usb_device_retrieve_descriptors(
