Index: uspace/lib/drv/generic/remote_usb.c
===================================================================
--- uspace/lib/drv/generic/remote_usb.c	(revision 3cdaa7fe8c618e722683a161c68f1de35d864b77)
+++ uspace/lib/drv/generic/remote_usb.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
@@ -61,6 +61,5 @@
 
 typedef enum {
-	IPC_M_USB_GET_MY_INTERFACE,
-	IPC_M_USB_GET_MY_DEVICE_HANDLE,
+	IPC_M_USB_GET_MY_DESCRIPTION,
 } usb_iface_funcs_t;
 
@@ -71,41 +70,27 @@
  * @return Error code.
  */
-int usb_get_my_interface(async_exch_t *exch, int *usb_iface)
+int usb_get_my_description(async_exch_t *exch, usb_device_desc_t *desc)
 {
 	if (!exch)
 		return EBADMEM;
-	sysarg_t iface_no;
-	const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE),
-	    IPC_M_USB_GET_MY_INTERFACE, &iface_no);
-	if (ret == EOK && usb_iface)
-		*usb_iface = (int)iface_no;
+
+	usb_device_desc_t tmp_desc;
+
+	const int ret = async_req_1_4(exch, DEV_IFACE_ID(USB_DEV_IFACE),
+	    IPC_M_USB_GET_MY_DESCRIPTION,
+	    (sysarg_t *) &tmp_desc.address,
+	    (sysarg_t *) &tmp_desc.speed,
+	    &tmp_desc.handle,
+	    (sysarg_t *) &tmp_desc.iface);
+	if (ret == EOK && desc)
+		*desc = tmp_desc;
 	return ret;
 }
 
-/** 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_my_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_MY_DEVICE_HANDLE, &h);
-	if (ret == EOK && handle)
-		*handle = (devman_handle_t)h;
-	return ret;
-}
-
-static void remote_usb_get_my_interface(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
-static void remote_usb_get_my_device_handle(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
+static void remote_usb_get_my_description(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
 
 /** Remote USB interface operations. */
 static const remote_iface_func_ptr_t remote_usb_iface_ops [] = {
-	[IPC_M_USB_GET_MY_INTERFACE] = remote_usb_get_my_interface,
-	[IPC_M_USB_GET_MY_DEVICE_HANDLE] = remote_usb_get_my_device_handle,
+	[IPC_M_USB_GET_MY_DESCRIPTION] = remote_usb_get_my_description,
 };
 
@@ -117,40 +102,25 @@
 };
 
-void remote_usb_get_my_interface(ddf_fun_t *fun, void *iface,
+void remote_usb_get_my_description(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_my_interface == NULL) {
+	if (usb_iface->get_my_description == NULL) {
 		async_answer_0(callid, ENOTSUP);
 		return;
 	}
 
-	int iface_no;
-	const int ret = usb_iface->get_my_interface(fun, &iface_no);
+	usb_device_desc_t desc;
+	const int ret = usb_iface->get_my_description(fun, &desc);
 	if (ret != EOK) {
 		async_answer_0(callid, ret);
 	} else {
-		async_answer_1(callid, EOK, iface_no);
+		async_answer_4(callid, EOK,
+		    (sysarg_t) desc.address,
+		    (sysarg_t) desc.speed,
+		    desc.handle,
+		    desc.iface);
 	}
-}
-
-void remote_usb_get_my_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_my_device_handle == NULL) {
-		async_answer_0(callid, ENOTSUP);
-		return;
-	}
-
-	devman_handle_t handle;
-	const int ret = usb_iface->get_my_device_handle(fun, &handle);
-	if (ret != EOK) {
-		async_answer_0(callid, ret);
-	}
-
-	async_answer_1(callid, EOK, (sysarg_t) handle);
 }
 
Index: uspace/lib/drv/include/usb_iface.h
===================================================================
--- uspace/lib/drv/include/usb_iface.h	(revision 3cdaa7fe8c618e722683a161c68f1de35d864b77)
+++ uspace/lib/drv/include/usb_iface.h	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
@@ -40,6 +40,14 @@
 #include "ddf/driver.h"
 #include <async.h>
+#include <usbhc_iface.h>
 
 typedef async_sess_t usb_dev_session_t;
+
+typedef struct {
+	usb_address_t address;
+	usb_speed_t speed;
+	devman_handle_t handle;
+	int iface;
+} usb_device_desc_t;
 
 extern usb_dev_session_t *usb_dev_connect(devman_handle_t);
@@ -47,11 +55,9 @@
 extern void usb_dev_disconnect(usb_dev_session_t *);
 
-extern int usb_get_my_interface(async_exch_t *, int *);
-extern int usb_get_my_device_handle(async_exch_t *, devman_handle_t *);
+extern int usb_get_my_description(async_exch_t *, usb_device_desc_t *);
 
 /** USB device communication interface. */
 typedef struct {
-	int (*get_my_interface)(ddf_fun_t *, int *);
-	int (*get_my_device_handle)(ddf_fun_t *, devman_handle_t *);
+	int (*get_my_description)(ddf_fun_t *, usb_device_desc_t *);
 } usb_iface_t;
 
Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision 3cdaa7fe8c618e722683a161c68f1de35d864b77)
+++ uspace/lib/usbdev/src/devdrv.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
@@ -73,4 +73,10 @@
 	/** Number of other endpoint pipes. */
 	size_t pipes_count;
+
+	/** USB address of this device */
+	usb_address_t address;
+
+	/** USB speed of this device */
+	usb_speed_t speed;
 
 	/** Current interface.
@@ -414,6 +420,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, int interface_no)
+    const usb_endpoint_description_t **endpoints, const char **errstr_ptr)
 {
 	assert(usb_dev != NULL);
@@ -423,6 +428,4 @@
 
 	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;
@@ -431,5 +434,5 @@
 	usb_dev->pipes = NULL;
 
-	usb_dev->bus_session = usb_dev_connect(handle);
+	usb_dev->bus_session = usb_dev_connect(usb_dev->handle);
 
 	if (!usb_dev->bus_session) {
@@ -476,9 +479,7 @@
 }
 
-static int usb_device_get_info(async_sess_t *sess, devman_handle_t *handle,
-	int *iface_no)
-{
-	assert(handle);
-	assert(iface_no);
+static int usb_device_get_info(async_sess_t *sess, usb_device_t *dev)
+{
+	assert(dev);
 
 	async_exch_t *exch = async_exchange_begin(sess);
@@ -486,11 +487,12 @@
 		return EPARTY;
 
-	int ret = usb_get_my_device_handle(exch, handle);
+	usb_device_desc_t dev_desc;
+	const int ret = usb_get_my_description(exch, &dev_desc);
+
 	if (ret == EOK) {
-		ret = usb_get_my_interface(exch, iface_no);
-		if (ret == ENOTSUP) {
-			*iface_no = -1;
-			ret = EOK;
-		}
+		dev->address = dev_desc.address;
+		dev->speed = dev_desc.speed;
+		dev->handle = dev_desc.handle;
+		dev->interface_no = dev_desc.iface;
 	}
 
@@ -504,14 +506,8 @@
 	assert(ddf_dev);
 	assert(err);
-
-	devman_handle_t h = 0;
-	int iface_no = -1;
 
 	async_sess_t *sess = ddf_dev_parent_sess_get(ddf_dev);
 	if (sess == NULL)
 		return ENOMEM;
-	const int ret = usb_device_get_info(sess, &h, &iface_no);
-	if (ret != EOK)
-		return ret;
 
 	usb_device_t *usb_dev =
@@ -522,5 +518,9 @@
 	}
 
-	return usb_device_init(usb_dev, ddf_dev, desc, err, h, iface_no);
+	const int ret = usb_device_get_info(sess, usb_dev);
+	if (ret != EOK)
+		return ret;
+
+	return usb_device_init(usb_dev, ddf_dev, desc, err);
 }
 
@@ -536,9 +536,10 @@
 usb_device_t * usb_device_create(devman_handle_t handle)
 {
-	devman_handle_t h = 0;
-	int iface_no = -1;
+	usb_device_t *usb_dev = malloc(sizeof(usb_device_t));
+	if (!usb_dev)
+		return NULL;
 
 	async_sess_t *sess = devman_device_connect(handle, IPC_FLAG_BLOCKING);
-	int ret = usb_device_get_info(sess, &h, &iface_no);
+	int ret = usb_device_get_info(sess, usb_dev);
 	if (sess)
 		async_hangup(sess);
@@ -546,10 +547,6 @@
 		return NULL;
 
-	usb_device_t *usb_dev = malloc(sizeof(usb_device_t));
-	if (!usb_dev)
-		return NULL;
-
 	const char* dummy = NULL;
-	ret = usb_device_init(usb_dev, NULL, NULL, &dummy, handle, iface_no);
+	ret = usb_device_init(usb_dev, NULL, NULL, &dummy);
 	if (ret != EOK) {
 		free(usb_dev);
Index: uspace/lib/usbdev/src/pipes.c
===================================================================
--- uspace/lib/usbdev/src/pipes.c	(revision 3cdaa7fe8c618e722683a161c68f1de35d864b77)
+++ uspace/lib/usbdev/src/pipes.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
@@ -248,20 +248,11 @@
  */
 static int usb_isoch_session_initialize(usb_pipe_t *pipe) {
-	devman_handle_t handle;
-
-	async_exch_t *exch = async_exchange_begin(pipe->bus_session);
-	if (!exch)
-		return EPARTY;
-
-	int ret = usb_get_my_device_handle(exch, &handle);
-
-	async_exchange_end(exch);
-	if (ret != EOK)
-		return ret;
-
-	pipe->isoch_session = usb_dev_connect(handle);
-	if (!pipe->isoch_session)
-		return ENAK;
-
+
+	/*
+	 * XXX: As parallel exhanges are implemented by using parallel sessions,
+	 * it is safe to just take the same session. Once this won't be true,
+	 * just use session cloning to clone the bus session.
+	 */
+	pipe->isoch_session = pipe->bus_session;
 	return EOK;
 }
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 3cdaa7fe8c618e722683a161c68f1de35d864b77)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
@@ -224,15 +224,26 @@
 }
 
-/** Gets handle of the respective device.
+/**
+ * Gets description of the device that is calling.
  *
  * @param[in] fun Device function.
- * @param[out] handle Place to write the handle.
+ * @param[out] desc Device descriptor to be filled.
  * @return Error code.
  */
-static int get_my_device_handle(ddf_fun_t *fun, devman_handle_t *handle)
-{
-	assert(fun);
-	if (handle)
-		*handle = ddf_fun_get_handle(fun);
+static int get_device_description(ddf_fun_t *fun, usb_device_desc_t *desc)
+{
+	assert(fun);
+	device_t *dev = ddf_fun_data_get(fun);
+	assert(dev);
+
+	if (!desc)
+		return EOK;
+
+	*desc = (usb_device_desc_t) {
+		.address = dev->address,
+		.speed = dev->speed,
+		.handle = ddf_fun_get_handle(fun),
+		.iface = -1,
+	};
 	return EOK;
 }
@@ -290,5 +301,5 @@
 /** USB device interface */
 static usb_iface_t usb_iface = {
-	.get_my_device_handle = get_my_device_handle,
+	.get_my_description = get_device_description,
 };
 
