Index: uspace/app/usbinfo/dump.c
===================================================================
--- uspace/app/usbinfo/dump.c	(revision a09128cbdc117aa1c1d8c76b2386e2286ec0ef82)
+++ uspace/app/usbinfo/dump.c	(revision b00849e82cbb38db4b639f04db025046a35c00a7)
@@ -96,4 +96,5 @@
 void dump_usb_descriptor(uint8_t *descriptor, size_t size)
 {
+	printf("Device descriptor:\n");
 	usb_dump_standard_descriptor(stdout, get_indent(0), "\n",
 	    descriptor, size);
Index: uspace/app/usbinfo/info.c
===================================================================
--- uspace/app/usbinfo/info.c	(revision a09128cbdc117aa1c1d8c76b2386e2286ec0ef82)
+++ uspace/app/usbinfo/info.c	(revision b00849e82cbb38db4b639f04db025046a35c00a7)
@@ -38,8 +38,23 @@
 #include <errno.h>
 #include <usb/usbdrv.h>
+#include <usb/pipes.h>
+#include <usb/request.h>
 #include "usbinfo.h"
 
-int dump_device(int hc_phone, usb_address_t address)
+int dump_device(devman_handle_t hc_handle, usb_address_t address)
 {
+	int rc;
+	usb_device_connection_t wire;
+	usb_endpoint_pipe_t ctrl_pipe;
+	ctrl_pipe.hc_phone = -1;
+
+	int hc_phone = devman_device_connect(hc_handle, 0);
+	if (hc_phone < 0) {
+		fprintf(stderr,
+		    NAME ": failed to connect to host controller (%zu): %s.\n",
+		        (size_t) hc_handle, str_error(hc_phone));
+		return hc_phone;
+	}
+
 	/*
 	 * Dump information about possible match ids.
@@ -47,12 +62,37 @@
 	match_id_list_t match_id_list;
 	init_match_ids(&match_id_list);
-	int rc = usb_drv_create_device_match_ids(hc_phone, &match_id_list, address);
+	rc = usb_drv_create_device_match_ids(hc_phone, &match_id_list, address);
 	if (rc != EOK) {
 		fprintf(stderr,
 		    NAME ": failed to fetch match ids of the device: %s.\n",
 		    str_error(rc));
-		return rc;
+		goto leave;
 	}
 	dump_match_ids(&match_id_list);
+
+	/*
+	 * Initialize pipes.
+	 */
+	rc = usb_device_connection_initialize(&wire, hc_handle, address);
+	if (rc != EOK) {
+		fprintf(stderr,
+		    NAME ": failed to create connection to the device: %s.\n",
+		    str_error(rc));
+		goto leave;
+	}
+	rc = usb_endpoint_pipe_initialize_default_control(&ctrl_pipe, &wire);
+	if (rc != EOK) {
+		fprintf(stderr,
+		    NAME ": failed to create default control pipe: %s.\n",
+		    str_error(rc));
+		goto leave;
+	}
+	rc = usb_endpoint_pipe_start_session(&ctrl_pipe);
+	if (rc != EOK) {
+		fprintf(stderr,
+		    NAME ": failed to start session on control pipe: %s.\n",
+		    str_error(rc));
+		goto leave;
+	}
 
 	/*
@@ -60,15 +100,10 @@
 	 */
 	usb_standard_device_descriptor_t device_descriptor;
-	usb_dprintf(NAME, 1,
-	    "usb_drv_req_get_device_descriptor(%d, %d, %p)\n",
-	    hc_phone, (int) address, &device_descriptor);
-
-	rc = usb_drv_req_get_device_descriptor(hc_phone, address,
-	    &device_descriptor);
+	rc = usb_request_get_device_descriptor(&ctrl_pipe, &device_descriptor);
 	if (rc != EOK) {
 		fprintf(stderr,
 		    NAME ": failed to fetch standard device descriptor: %s.\n",
 		    str_error(rc));
-		return rc;
+		goto leave;
 	}
 	dump_usb_descriptor((uint8_t *)&device_descriptor, sizeof(device_descriptor));
@@ -79,25 +114,16 @@
 	usb_standard_configuration_descriptor_t config_descriptor;
 	int config_index = 0;
-	usb_dprintf(NAME, 1,
-	    "usb_drv_req_get_bare_configuration_descriptor(%d, %d, %d, %p)\n",
-	    hc_phone, (int) address, config_index, &config_descriptor);
-
-	rc = usb_drv_req_get_bare_configuration_descriptor(hc_phone, address,
-	    config_index, &config_descriptor );
+	rc = usb_request_get_bare_configuration_descriptor(&ctrl_pipe,
+	    config_index, &config_descriptor);
 	if (rc != EOK) {
 		fprintf(stderr,
 		    NAME ": failed to fetch standard configuration descriptor: %s.\n",
 		    str_error(rc));
-		return rc;
+		goto leave;
 	}
 	//dump_standard_configuration_descriptor(config_index, &config_descriptor);
 
 	void *full_config_descriptor = malloc(config_descriptor.total_length);
-	usb_dprintf(NAME, 1,
-	    "usb_drv_req_get_full_configuration_descriptor(%d, %d, %d, %p, %zu)\n",
-	    hc_phone, (int) address, config_index,
-	    full_config_descriptor, config_descriptor.total_length);
-
-	rc = usb_drv_req_get_full_configuration_descriptor(hc_phone, address,
+	rc = usb_request_get_full_configuration_descriptor(&ctrl_pipe,
 	    config_index,
 	    full_config_descriptor, config_descriptor.total_length, NULL);
@@ -106,5 +132,5 @@
 		    NAME ": failed to fetch full configuration descriptor: %s.\n",
 		    str_error(rc));
-		return rc;
+		goto leave;
 	}
 
@@ -112,5 +138,11 @@
 	    config_descriptor.total_length);
 
-	return EOK;
+	rc = EOK;
+leave:
+	/* Ignoring errors here. */
+	ipc_hangup(hc_phone);
+	usb_endpoint_pipe_end_session(&ctrl_pipe);
+
+	return rc;
 }
 
Index: uspace/app/usbinfo/main.c
===================================================================
--- uspace/app/usbinfo/main.c	(revision a09128cbdc117aa1c1d8c76b2386e2286ec0ef82)
+++ uspace/app/usbinfo/main.c	(revision b00849e82cbb38db4b639f04db025046a35c00a7)
@@ -77,72 +77,32 @@
 }
 
-static int set_new_host_controller(int *phone, const char *path)
+static int get_host_controller_handle(const char *path,
+    devman_handle_t *hc_handle)
 {
 	int rc;
-	int tmp_phone;
 
-	if (path[0] != '/') {
-		int hc_class_index = (int) strtol(path, NULL, 10);
-		char *dev_path;
-		rc = asprintf(&dev_path, "class/usbhc\\%d", hc_class_index);
-		if (rc < 0) {
-			internal_error(rc);
-			return rc;
-		}
-		devmap_handle_t handle;
-		rc = devmap_device_get_handle(dev_path, &handle, 0);
-		if (rc < 0) {
-			fprintf(stderr,
-			    NAME ": failed getting handle of `devman://%s'.\n",
-			    dev_path);
-			free(dev_path);
-			return rc;
-		}
-		tmp_phone = devmap_device_connect(handle, 0);
-		if (tmp_phone < 0) {
-			fprintf(stderr,
-			    NAME ": could not connect to `%s'.\n",
-			    dev_path);
-			free(dev_path);
-			return tmp_phone;
-		}
-		free(dev_path);
-	} else {
-		devman_handle_t handle;
-		rc = devman_device_get_handle(path, &handle, 0);
-		if (rc != EOK) {
-			fprintf(stderr,
-			    NAME ": failed getting handle of `devmap::/%s'.\n",
-			    path);
-			return rc;
-		}
-		tmp_phone = devman_device_connect(handle, 0);
-		if (tmp_phone < 0) {
-			fprintf(stderr,
-			    NAME ": could not connect to `%s'.\n",
-			    path);
-			return tmp_phone;
-		}
+	devman_handle_t handle;
+	rc = devman_device_get_handle(path, &handle, 0);
+	if (rc != EOK) {
+		fprintf(stderr,
+		    NAME ": failed getting handle of `devman::/%s'.\n",
+		    path);
+		return rc;
 	}
-
-	*phone = tmp_phone;
+	*hc_handle = handle;
 
 	return EOK;
 }
 
-static int connect_with_address(int hc_phone, const char *str_address)
+static int get_device_address(const char *str_address, usb_address_t *address)
 {
-	usb_address_t address = (usb_address_t) strtol(str_address, NULL, 0);
-	if ((address < 0) || (address >= USB11_ADDRESS_MAX)) {
+	usb_address_t addr = (usb_address_t) strtol(str_address, NULL, 0);
+	if ((addr < 0) || (addr >= USB11_ADDRESS_MAX)) {
 		fprintf(stderr, NAME ": USB address out of range.\n");
 		return ERANGE;
 	}
 
-	if (hc_phone < 0) {
-		fprintf(stderr, NAME ": no active host controller.\n");
-		return ENOENT;
-	}
-
-	return dump_device(hc_phone, address);
+	*address = addr;
+	return EOK;
 }
 
@@ -150,5 +110,6 @@
 int main(int argc, char *argv[])
 {
-	int hc_phone = -1;
+	devman_handle_t hc_handle = (devman_handle_t) -1;
+	usb_address_t device_address = (usb_address_t) -1;
 
 	if (argc <= 1) {
@@ -175,5 +136,6 @@
 			case 'a':
 			case ACTION_DEVICE_ADDRESS: {
-				int rc = connect_with_address(hc_phone, optarg);
+				int rc = get_device_address(optarg,
+				    &device_address);
 				if (rc != EOK) {
 					return rc;
@@ -184,6 +146,6 @@
 			case 't':
 			case ACTION_HOST_CONTROLLER: {
-				int rc = set_new_host_controller(&hc_phone,
-				    optarg);
+				int rc = get_host_controller_handle(optarg,
+				   &hc_handle);
 				if (rc != EOK) {
 					return rc;
@@ -202,4 +164,12 @@
 	} while (i != -1);
 
+	if ((hc_handle == (devman_handle_t) -1)
+	    || (device_address == (usb_address_t) -1)) {
+		fprintf(stderr, NAME ": no target specified.\n");
+		return EINVAL;
+	}
+
+	dump_device(hc_handle, device_address);
+
 	return 0;
 }
Index: uspace/app/usbinfo/usbinfo.h
===================================================================
--- uspace/app/usbinfo/usbinfo.h	(revision a09128cbdc117aa1c1d8c76b2386e2286ec0ef82)
+++ uspace/app/usbinfo/usbinfo.h	(revision b00849e82cbb38db4b639f04db025046a35c00a7)
@@ -47,5 +47,5 @@
 void dump_match_ids(match_id_list_t *matches);
 void dump_usb_descriptor(uint8_t *, size_t);
-int dump_device(int, usb_address_t);
+int dump_device(devman_handle_t, usb_address_t);
 void dump_descriptor_tree(uint8_t *, size_t);
 
