Index: uspace/srv/devman/devman.c
===================================================================
--- uspace/srv/devman/devman.c	(revision ce89036b64f8d563964217c344f139b41be8d6cf)
+++ uspace/srv/devman/devman.c	(revision 7bbc389b6ab1bab814d90a950f90c3a5af4f623d)
@@ -36,4 +36,5 @@
 #include <ipc/driver.h>
 #include <ipc/devman.h>
+#include <devmap.h>
 
 #include "devman.h"
@@ -488,5 +489,5 @@
  * @param driver the driver to which the devices are passed.
  */
-static void pass_devices_to_driver(driver_t *driver)
+static void pass_devices_to_driver(driver_t *driver, dev_tree_t *tree)
 {	
 	printf(NAME ": pass_devices_to_driver\n");
@@ -501,5 +502,5 @@
 		while (link != &driver->devices) {
 			dev = list_get_instance(link, node_t, driver_devices);
-			add_device(phone, driver, dev);
+			add_device(phone, driver, dev, tree);
 			link = link->next;
 		}
@@ -516,5 +517,5 @@
  * @param driver the driver which registered itself as running by the device manager.
  */
-void initialize_running_driver(driver_t *driver) 
+void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 
 {	
 	printf(NAME ": initialize_running_driver\n");
@@ -522,5 +523,5 @@
 	
 	// pass devices which have been already assigned to the driver to the driver
-	pass_devices_to_driver(driver);	
+	pass_devices_to_driver(driver, tree);	
 	
 	// change driver's state to running
@@ -530,4 +531,33 @@
 }
 
+
+static void devmap_register_tree_device(node_t *node, dev_tree_t *tree)
+{
+	// create devmap path and name for the device
+	char *devmap_pathname = NULL;
+	char *devmap_name = NULL;
+	
+	asprintf(&devmap_name, "%s", node->pathname);
+	if (NULL == devmap_name) {
+		return;
+	}
+	
+	replace_char(devmap_name, '/', DEVMAP_SEPARATOR);
+	
+	asprintf(&devmap_pathname, "%s/%s", DEVMAP_DEVICE_NAMESPACE, devmap_name);
+	if (NULL == devmap_pathname) {
+		free(devmap_name);
+		return;
+	}	
+	
+	devmap_device_register(devmap_pathname, &node->devmap_handle);
+	
+	tree_add_devmap_device(tree, node);
+	
+	free(devmap_name);
+	free(devmap_pathname);	
+}
+
+
 /** Pass a device to running driver.
  * 
@@ -535,5 +565,5 @@
  * @param node the device's node in the device tree.
  */
-void add_device(int phone, driver_t *drv, node_t *node)
+void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree)
 {
 	printf(NAME ": add_device\n");
@@ -556,4 +586,5 @@
 	case EOK:
 		node->state = DEVICE_USABLE;
+		devmap_register_tree_device(node, tree);
 		break;
 	case ENOENT:
@@ -575,5 +606,5 @@
  * @return true if the suitable driver is found and successfully assigned to the device, false otherwise. 
  */
-bool assign_driver(node_t *node, driver_list_t *drivers_list) 
+bool assign_driver(node_t *node, driver_list_t *drivers_list, dev_tree_t *tree) 
 {
 	//printf(NAME ": assign_driver\n");
@@ -598,5 +629,5 @@
 		int phone = ipc_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);
 		if (phone > 0) {
-			add_device(phone, drv, node);		
+			add_device(phone, drv, node, tree);		
 			ipc_hangup(phone);
 		}
@@ -632,5 +663,5 @@
 
 	// find suitable driver and start it
-	return assign_driver(tree->root_node, drivers_list);
+	return assign_driver(tree->root_node, drivers_list, tree);
 }
 
Index: uspace/srv/devman/devman.h
===================================================================
--- uspace/srv/devman/devman.h	(revision ce89036b64f8d563964217c344f139b41be8d6cf)
+++ uspace/srv/devman/devman.h	(revision 7bbc389b6ab1bab814d90a950f90c3a5af4f623d)
@@ -55,5 +55,5 @@
 #define DEVMAP_CLASS_NAMESPACE "class"
 #define DEVMAP_DEVICE_NAMESPACE "devices"
-#define DEVMAP_SEPARATOR "\\"
+#define DEVMAP_SEPARATOR '\\'
 
 struct node;
@@ -230,14 +230,14 @@
 
 driver_t * find_best_match_driver(driver_list_t *drivers_list, node_t *node);
-bool assign_driver(node_t *node, driver_list_t *drivers_list);
+bool assign_driver(node_t *node, driver_list_t *drivers_list, dev_tree_t *tree);
 
 void add_driver(driver_list_t *drivers_list, driver_t *drv);
 void attach_driver(node_t *node, driver_t *drv);
-void add_device(int phone, driver_t *drv, node_t *node);
+void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree);
 bool start_driver(driver_t *drv);
 
 driver_t * find_driver(driver_list_t *drv_list, const char *drv_name);
 void set_driver_phone(driver_t *driver, ipcarg_t phone);
-void initialize_running_driver(driver_t *driver);
+void initialize_running_driver(driver_t *driver, dev_tree_t *tree);
 
 /** 
@@ -427,4 +427,21 @@
 node_t *find_devmap_class_device(class_list_t *classes, dev_handle_t devmap_handle);
 
+
+static inline void class_add_devmap_device(class_list_t *class_list, dev_class_info_t *cli)
+{
+	unsigned long key = (unsigned long)cli->devmap_handle;
+	fibril_rwlock_write_lock(&class_list->rwlock);
+	hash_table_insert(&class_list->devmap_devices, &key, &cli->devmap_link);
+	fibril_rwlock_write_unlock(&class_list->rwlock);
+}
+
+static inline void tree_add_devmap_device(dev_tree_t *tree, node_t *node)
+{
+	unsigned long key = (unsigned long)node->devmap_handle;
+	fibril_rwlock_write_lock(&tree->rwlock);
+	hash_table_insert(&tree->devmap_devices, &key, &node->devmap_link);
+	fibril_rwlock_write_unlock(&tree->rwlock);	
+}
+
 #endif
 
Index: uspace/srv/devman/main.c
===================================================================
--- uspace/srv/devman/main.c	(revision ce89036b64f8d563964217c344f139b41be8d6cf)
+++ uspace/srv/devman/main.c	(revision 7bbc389b6ab1bab814d90a950f90c3a5af4f623d)
@@ -240,5 +240,5 @@
 	
 	// try to find suitable driver and assign it to the device
-	assign_driver(node, &drivers_list);	
+	assign_driver(node, &drivers_list, &device_tree);	
 }
 
@@ -247,5 +247,5 @@
 	// create devmap path and name for the device
 	char *devmap_pathname = NULL;
-	asprintf(&devmap_pathname, "%s/%s%s%s", DEVMAP_CLASS_NAMESPACE, cli->dev_class->name, DEVMAP_SEPARATOR, cli->dev_name);
+	asprintf(&devmap_pathname, "%s/%s%c%s", DEVMAP_CLASS_NAMESPACE, cli->dev_class->name, DEVMAP_SEPARATOR, cli->dev_name);
 	if (NULL == devmap_pathname) {
 		return;
@@ -254,4 +254,7 @@
 	// register the device by the device mapper and remember its devmap handle
 	devmap_device_register(devmap_pathname, &cli->devmap_handle);	
+	
+	// add device to the hash map of class devices registered by device mapper
+	class_add_devmap_device(&class_list, cli);
 	
 	free(devmap_pathname);	
@@ -297,5 +300,5 @@
 {
 	driver_t *driver = (driver_t *)drv;
-	initialize_running_driver(driver);	
+	initialize_running_driver(driver, &device_tree);	
 	printf(NAME ": the %s driver was successfully initialized. \n", driver->name);
 	return 0;
Index: uspace/srv/devman/util.h
===================================================================
--- uspace/srv/devman/util.h	(revision ce89036b64f8d563964217c344f139b41be8d6cf)
+++ uspace/srv/devman/util.h	(revision 7bbc389b6ab1bab814d90a950f90c3a5af4f623d)
@@ -77,3 +77,13 @@
 }
 
+static inline void replace_char(char *str, char orig, char repl)
+{
+	while (*str) {
+		if (orig == *str) {
+			*str = repl;
+		}
+		str++;
+	}
+}
+
 #endif
