Index: .bzrignore
===================================================================
--- .bzrignore	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ .bzrignore	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -49,4 +49,5 @@
 ./uspace/app/killall/killall
 ./uspace/app/klog/klog
+./uspace/app/lsusb/lsusb
 ./uspace/app/mkfat/mkfat
 ./uspace/app/netstart/netstart
Index: boot/Makefile.common
===================================================================
--- boot/Makefile.common	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ boot/Makefile.common	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -128,4 +128,5 @@
 	$(USPACE_PATH)/app/killall/killall \
 	$(USPACE_PATH)/app/mkfat/mkfat \
+	$(USPACE_PATH)/app/lsusb/lsusb \
 	$(USPACE_PATH)/app/sbi/sbi \
 	$(USPACE_PATH)/app/redir/redir \
Index: uspace/Makefile
===================================================================
--- uspace/Makefile	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/Makefile	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -41,4 +41,5 @@
 	app/killall \
 	app/klog \
+	app/lsusb \
 	app/mkfat \
 	app/redir \
Index: uspace/app/lsusb/Makefile
===================================================================
--- uspace/app/lsusb/Makefile	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
+++ uspace/app/lsusb/Makefile	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2011 Vojtech Horky
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# - The name of the author may not be used to endorse or promote products
+#   derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+USPACE_PREFIX = ../..
+BINARY = lsusb
+
+LIBS = $(LIBUSB_PREFIX)/libusb.a $(LIBDRV_PREFIX)/libdrv.a
+EXTRA_CFLAGS = -I$(LIBUSB_PREFIX)/include -I$(LIBDRV_PREFIX)/include
+
+SOURCES = \
+	main.c
+
+include $(USPACE_PREFIX)/Makefile.common
Index: uspace/app/lsusb/main.c
===================================================================
--- uspace/app/lsusb/main.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
+++ uspace/app/lsusb/main.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2010-2011 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup lsusb
+ * @{
+ */
+/**
+ * @file
+ * Listing of USB host controllers.
+ */
+
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <str_error.h>
+#include <bool.h>
+#include <getopt.h>
+#include <devman.h>
+#include <devmap.h>
+#include <usb/host.h>
+
+#define NAME "lsusb"
+
+#define MAX_FAILED_ATTEMPTS 4
+#define MAX_PATH_LENGTH 1024
+
+int main(int argc, char *argv[])
+{
+	size_t class_index = 0;
+	size_t failed_attempts = 0;
+
+	while (failed_attempts < MAX_FAILED_ATTEMPTS) {
+		class_index++;
+		devman_handle_t hc_handle = 0;
+		int rc = usb_ddf_get_hc_handle_by_class(class_index, &hc_handle);
+		if (rc != EOK) {
+			failed_attempts++;
+			continue;
+		}
+		char path[MAX_PATH_LENGTH];
+		rc = devman_get_device_path(hc_handle, path, MAX_PATH_LENGTH);
+		if (rc != EOK) {
+			continue;
+		}
+		printf(NAME ": host controller %zu is `%s'.\n",
+		    class_index, path);
+	}
+
+	return 0;
+}
+
+
+/** @}
+ */
Index: uspace/app/usbinfo/main.c
===================================================================
--- uspace/app/usbinfo/main.c	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/app/usbinfo/main.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -45,5 +45,37 @@
 #include <usb/usbdevice.h>
 #include <usb/pipes.h>
+#include <usb/host.h>
 #include "usbinfo.h"
+
+static bool try_parse_class_and_address(const char *path,
+    devman_handle_t *out_hc_handle, usb_address_t *out_device_address)
+{
+	size_t class_index;
+	size_t address;
+	int rc;
+	char *ptr;
+
+	rc = str_size_t(path, &ptr, 10, false, &class_index);
+	if (rc != EOK) {
+		return false;
+	}
+	if ((*ptr == ':') || (*ptr == '.')) {
+		ptr++;
+	} else {
+		return false;
+	}
+	rc = str_size_t(ptr, NULL, 10, true, &address);
+	if (rc != EOK) {
+		return false;
+	}
+	rc = usb_ddf_get_hc_handle_by_class(class_index, out_hc_handle);
+	if (rc != EOK) {
+		return false;
+	}
+	if (out_device_address != NULL) {
+		*out_device_address = (usb_address_t) address;
+	}
+	return true;
+}
 
 static bool resolve_hc_handle_and_dev_addr(const char *devpath,
@@ -60,4 +92,9 @@
 	if (str_cmp(devpath, "virt") == 0) {
 		devpath = "/virt/usbhc/usb00_a1/usb00_a2";
+	}
+
+	if (try_parse_class_and_address(devpath,
+	    out_hc_handle, out_device_address)) {
+		return true;
 	}
 
Index: uspace/doc/doxygroups.h
===================================================================
--- uspace/doc/doxygroups.h	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/doc/doxygroups.h	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -220,4 +220,12 @@
 
 	/**
+	 * @defgroup lsusb HelenOS version of lsusb command
+	 * @ingroup usb
+	 * @brief Application for listing USB host controllers.
+	 * @details
+	 * List all found host controllers.
+	 */
+
+	/**
 	 * @defgroup drvusbmid USB multi interface device driver
 	 * @ingroup usb
Index: uspace/drv/ehci-hcd/main.c
===================================================================
--- uspace/drv/ehci-hcd/main.c	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/drv/ehci-hcd/main.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -97,8 +97,12 @@
 	}
 	hc_fun->ops = &hc_ops;
+
 	ret = ddf_fun_bind(hc_fun);
-
 	CHECK_RET_RETURN(ret,
 	    "Failed to bind EHCI function: %s.\n",
+	    str_error(ret));
+	ret = ddf_fun_add_to_class(hc_fun, USB_HC_DDF_CLASS_NAME);
+	CHECK_RET_RETURN(ret,
+	    "Failed to add EHCI to HC class: %s.\n",
 	    str_error(ret));
 
Index: uspace/drv/ohci/ohci.c
===================================================================
--- uspace/drv/ohci/ohci.c	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/drv/ohci/ohci.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -185,4 +185,8 @@
 	    "Failed(%d) to bind OHCI device function: %s.\n",
 	    ret, str_error(ret));
+	ret = ddf_fun_add_to_class(instance->hc_fun, USB_HC_DDF_CLASS_NAME);
+	CHECK_RET_DEST_FUN_RETURN(ret,
+	    "Failed to add OHCI to HC class: %s.\n", str_error(ret));
+
 #undef CHECK_RET_HC_RETURN
 
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -210,4 +210,8 @@
 	    "Failed(%d) to bind UHCI device function: %s.\n",
 	    ret, str_error(ret));
+	ret = ddf_fun_add_to_class(instance->hc_fun, USB_HC_DDF_CLASS_NAME);
+	CHECK_RET_DEST_FUN_RETURN(ret,
+	    "Failed to add UHCI to HC class: %s.\n", str_error(ret));
+
 #undef CHECK_RET_HC_RETURN
 
Index: uspace/drv/vhc/main.c
===================================================================
--- uspace/drv/vhc/main.c	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/drv/vhc/main.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -104,5 +104,11 @@
 	}
 
-	ddf_fun_add_to_class(hc, "usbhc");
+	rc = ddf_fun_add_to_class(hc, USB_HC_DDF_CLASS_NAME);
+	if (rc != EOK) {
+		usb_log_fatal("Failed to add function to HC class: %s.\n",
+		    str_error(rc));
+		free(data);
+		return rc;
+	}
 
 	virtual_hub_device_init(hc);
Index: uspace/lib/c/generic/devman.c
===================================================================
--- uspace/lib/c/generic/devman.c	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/lib/c/generic/devman.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -374,4 +374,54 @@
 }
 
+int devman_get_device_path(devman_handle_t handle, char *path, size_t path_size)
+{
+	int phone = devman_get_phone(DEVMAN_CLIENT, 0);
+
+	if (phone < 0)
+		return phone;
+
+	async_serialize_start();
+
+	ipc_call_t answer;
+	aid_t req = async_send_1(phone, DEVMAN_DEVICE_GET_DEVICE_PATH,
+	    handle, &answer);
+
+	ipc_call_t data_request_call;
+	aid_t data_request = async_data_read(phone, path, path_size,
+	    &data_request_call);
+	if (data_request == 0) {
+		async_wait_for(req, NULL);
+		async_serialize_end();
+		return ENOMEM;
+	}
+
+	sysarg_t data_request_rc;
+	sysarg_t opening_request_rc;
+	async_wait_for(data_request, &data_request_rc);
+	async_wait_for(req, &opening_request_rc);
+
+	async_serialize_end();
+
+	if (data_request_rc != EOK) {
+		/* Prefer the return code of the opening request. */
+		if (opening_request_rc != EOK) {
+			return (int) opening_request_rc;
+		} else {
+			return (int) data_request_rc;
+		}
+	}
+	if (opening_request_rc != EOK) {
+		return (int) opening_request_rc;
+	}
+
+	path[path_size - 1] = 0;
+
+	if (IPC_GET_ARG2(data_request_call) >= path_size) {
+		return ELIMIT;
+	}
+
+	return EOK;
+}
+
 
 /** @}
Index: uspace/lib/c/include/devman.h
===================================================================
--- uspace/lib/c/include/devman.h	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/lib/c/include/devman.h	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -55,4 +55,5 @@
 extern int devman_device_get_handle_by_class(const char *, const char *,
     devman_handle_t *, unsigned int);
+extern int devman_get_device_path(devman_handle_t, char *, size_t);
 
 extern int devman_add_device_to_class(devman_handle_t, const char *);
Index: uspace/lib/c/include/ipc/devman.h
===================================================================
--- uspace/lib/c/include/ipc/devman.h	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/lib/c/include/ipc/devman.h	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -149,5 +149,6 @@
 typedef enum {
 	DEVMAN_DEVICE_GET_HANDLE = IPC_FIRST_USER_METHOD,
-	DEVMAN_DEVICE_GET_HANDLE_BY_CLASS
+	DEVMAN_DEVICE_GET_HANDLE_BY_CLASS,
+	DEVMAN_DEVICE_GET_DEVICE_PATH
 } client_to_devman_t;
 
Index: uspace/lib/usb/Makefile
===================================================================
--- uspace/lib/usb/Makefile	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/lib/usb/Makefile	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -46,4 +46,5 @@
 	src/hidparser.c \
 	src/hiddescriptor.c \
+	src/host.c \
 	src/hub.c \
 	src/pipepriv.c \
Index: uspace/lib/usb/include/usb/host.h
===================================================================
--- uspace/lib/usb/include/usb/host.h	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
+++ uspace/lib/usb/include/usb/host.h	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2011 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libusb
+ * @{
+ */
+/** @file
+ * Host controller common functions.
+ */
+#ifndef LIBUSB_HOST_H_
+#define LIBUSB_HOST_H_
+
+#include <sys/types.h>
+#include <ipc/devman.h>
+
+int usb_ddf_get_hc_handle_by_class(size_t, devman_handle_t *);
+
+#endif
+/**
+ * @}
+ */
Index: uspace/lib/usb/include/usb/usb.h
===================================================================
--- uspace/lib/usb/include/usb/usb.h	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/lib/usb/include/usb/usb.h	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -172,4 +172,7 @@
 } usb_packet_id;
 
+/** Class name for USB host controllers. */
+#define USB_HC_DDF_CLASS_NAME "usbhc"
+
 #endif
 /**
Index: uspace/lib/usb/src/host.c
===================================================================
--- uspace/lib/usb/src/host.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
+++ uspace/lib/usb/src/host.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2011 Vojtech Horky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libusb
+ * @{
+ */
+/**
+ * @file
+ * Host controller common functions (implementation).
+ */
+#include <stdio.h>
+#include <str_error.h>
+#include <errno.h>
+#include <assert.h>
+#include <bool.h>
+#include <usb/host.h>
+#include <usb/descriptor.h>
+#include <devman.h>
+
+/** Get host controller handle by its class index.
+ *
+ * @param class_index Class index for the host controller.
+ * @param hc_handle Where to store the HC handle
+ *	(can be NULL for existence test only).
+ * @return Error code.
+ */
+int usb_ddf_get_hc_handle_by_class(size_t class_index,
+    devman_handle_t *hc_handle)
+{
+	char *class_index_str;
+	devman_handle_t hc_handle_tmp;
+	int rc;
+
+	rc = asprintf(&class_index_str, "%zu", class_index);
+	if (rc < 0) {
+		return ENOMEM;
+	}
+	rc = devman_device_get_handle_by_class("usbhc", class_index_str,
+	    &hc_handle_tmp, 0);
+	free(class_index_str);
+	if (rc != EOK) {
+		return rc;
+	}
+
+	if (hc_handle != NULL) {
+		*hc_handle = hc_handle_tmp;
+	}
+
+	return EOK;
+}
+
+/** @}
+ */
Index: uspace/srv/devman/main.c
===================================================================
--- uspace/srv/devman/main.c	(revision 6fb003ef7abc7f146d3758c94e949fe4804ffe27)
+++ uspace/srv/devman/main.c	(revision 02804e1272f26b8eb1e3460a9ccc9603b44dac4c)
@@ -515,4 +515,41 @@
 }
 
+/** Find device path by its handle. */
+static void devman_get_device_path_by_handle(ipc_callid_t iid,
+    ipc_call_t *icall)
+{
+	devman_handle_t handle = IPC_GET_ARG1(*icall);
+
+	fun_node_t *fun = find_fun_node(&device_tree, handle);
+	if (fun == NULL) {
+		async_answer_0(iid, ENOMEM);
+		return;
+	}
+
+	ipc_callid_t data_callid;
+	size_t data_len;
+	if (!async_data_read_receive(&data_callid, &data_len)) {
+		async_answer_0(iid, EINVAL);
+		return;
+	}
+
+	void *buffer = malloc(data_len);
+	if (buffer == NULL) {
+		async_answer_0(data_callid, ENOMEM);
+		async_answer_0(iid, ENOMEM);
+		return;
+	}
+
+	size_t sent_length = str_size(fun->pathname);
+	if (sent_length > data_len) {
+		sent_length = data_len;
+	}
+
+	async_data_read_finalize(data_callid, fun->pathname, sent_length);
+	async_answer_0(iid, EOK);
+
+	free(buffer);
+}
+
 
 /** Function for handling connections from a client to the device manager. */
@@ -536,4 +573,7 @@
 		case DEVMAN_DEVICE_GET_HANDLE_BY_CLASS:
 			devman_function_get_handle_by_class(callid, &call);
+			break;
+		case DEVMAN_DEVICE_GET_DEVICE_PATH:
+			devman_get_device_path_by_handle(callid, &call);
 			break;
 		default:
