Index: uspace/lib/drv/generic/remote_usb.c
===================================================================
--- uspace/lib/drv/generic/remote_usb.c	(revision 7c10198d390820dc1fcb46744f0585f3bf1fb8b6)
+++ uspace/lib/drv/generic/remote_usb.c	(revision 9d15d1bd38a7b5422ec653dd5c87ec3d9cb353b9)
@@ -70,4 +70,5 @@
 	IPC_M_USB_GET_MY_INTERFACE,
 	IPC_M_USB_GET_HOST_CONTROLLER_HANDLE,
+	IPC_M_USB_GET_DEVICE_HANDLE,
 	IPC_M_USB_RESERVE_DEFAULT_ADDRESS,
 	IPC_M_USB_RELEASE_DEFAULT_ADDRESS,
@@ -131,4 +132,19 @@
 }
 
+/** Tell devman handle of the usb device function.
+ * @param[in] exch IPC communication exchange
+ * @param[out] handle devman handle of the HC used by the target device.
+ * @return Error code.
+ */
+int usb_get_device_handle(async_exch_t *exch, devman_handle_t *handle)
+{
+	devman_handle_t h = 0;
+	const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
+	    IPC_M_USB_GET_DEVICE_HANDLE, &h);
+	if (ret == EOK && handle)
+		*handle = (devman_handle_t)h;
+	return ret;
+}
+
 /** Reserve default USB address.
  * @param[in] exch IPC communication exchange
@@ -213,4 +229,5 @@
 static void remote_usb_get_my_interface(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_usb_get_hc_handle(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
+static void remote_usb_get_device_handle(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
 
 static void remote_usb_reserve_default_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
@@ -226,4 +243,5 @@
 	[IPC_M_USB_GET_MY_INTERFACE] = remote_usb_get_my_interface,
 	[IPC_M_USB_GET_HOST_CONTROLLER_HANDLE] = remote_usb_get_hc_handle,
+	[IPC_M_USB_GET_DEVICE_HANDLE] = remote_usb_get_device_handle,
 	[IPC_M_USB_RESERVE_DEFAULT_ADDRESS] = remote_usb_reserve_default_address,
 	[IPC_M_USB_RELEASE_DEFAULT_ADDRESS] = remote_usb_release_default_address,
@@ -299,4 +317,23 @@
 }
 
+void remote_usb_get_device_handle(ddf_fun_t *fun, void *iface,
+    ipc_callid_t callid, ipc_call_t *call)
+{
+	const usb_iface_t *usb_iface = (usb_iface_t *) iface;
+
+	if (usb_iface->get_device_handle == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	devman_handle_t handle;
+	const int ret = usb_iface->get_device_handle(fun, &handle);
+	if (ret != EOK) {
+		async_answer_0(callid, ret);
+	}
+
+	async_answer_1(callid, EOK, (sysarg_t) handle);
+}
+
 void remote_usb_reserve_default_address(ddf_fun_t *fun, void *iface,
     ipc_callid_t callid, ipc_call_t *call)
Index: uspace/lib/drv/include/usb_iface.h
===================================================================
--- uspace/lib/drv/include/usb_iface.h	(revision 7c10198d390820dc1fcb46744f0585f3bf1fb8b6)
+++ uspace/lib/drv/include/usb_iface.h	(revision 9d15d1bd38a7b5422ec653dd5c87ec3d9cb353b9)
@@ -55,4 +55,5 @@
 int usb_get_my_interface(async_exch_t *, int *);
 int usb_get_hc_handle(async_exch_t *, devman_handle_t *);
+int usb_get_device_handle(async_exch_t *, devman_handle_t *);
 
 int usb_reserve_default_address(async_exch_t *, usb_speed_t);
@@ -72,4 +73,6 @@
 	int (*get_hc_handle)(ddf_fun_t *, devman_handle_t *);
 
+	int (*get_device_handle)(ddf_fun_t *, devman_handle_t *);
+
 	int (*reserve_default_address)(ddf_fun_t *, usb_speed_t);
 	int (*release_default_address)(ddf_fun_t *);
