Index: uspace/srv/devman/devman.c
===================================================================
--- uspace/srv/devman/devman.c	(revision c16cf623b359a6846e36f73f2bc995be0ffb2716)
+++ uspace/srv/devman/devman.c	(revision 7707954c8462caa1ddf08a7f529ad43f26141e2c)
@@ -34,4 +34,6 @@
 #include <fcntl.h>
 #include <sys/stat.h>
+#include <ipc/driver.h>
+#include <ipc/devman.h>
 
 #include "devman.h"
@@ -308,20 +310,22 @@
 }
 
-/** Create root device node of the device tree.
- * 
- * @return root device node.
- */
-node_t * create_root_node()
+/** Create root device node in the device tree.
+ * 
+ * @param tree the device tree.
+ * @return true on success, false otherwise.
+ */
+bool create_root_node(dev_tree_t *tree)
 {
 	printf(NAME ": create_root_node\n");
 	node_t *node = create_dev_node();
 	if (node) {
-		init_dev_node(node, NULL);
+		insert_dev_node(tree, node, NULL);
 		match_id_t *id = create_match_id();
 		id->id = "root";
 		id->score = 100;
 		add_match_id(&node->match_ids, id);
-	}
-	return node;	
+		tree->root_node = node;
+	}
+	return node != NULL;	
 }
 
@@ -448,10 +452,17 @@
 	link_t *link;
 	
-	link = driver->devices.next;
-	while (link != &driver->devices) {
-		dev = list_get_instance(link, node_t, driver_devices);
-		add_device(driver, dev);
-		link = link->next;
-	}	
+	int phone = ipc_connect_me_to(driver->phone, DRIVER_DEVMAN, 0, 0);
+	
+	if (0 < phone) {
+		
+		link = driver->devices.next;
+		while (link != &driver->devices) {
+			dev = list_get_instance(link, node_t, driver_devices);
+			add_device(phone, driver, dev);
+			link = link->next;
+		}
+		
+		ipc_hangup(phone);
+	}
 }
 
@@ -463,5 +474,5 @@
  */
 void initialize_running_driver(driver_t *driver) 
-{
+{	
 	fibril_mutex_lock(&driver->driver_mutex);
 	
@@ -480,19 +491,21 @@
  * @param node the device's node in the device tree.
  */
-void add_device(driver_t *drv, node_t *node)
+void add_device(int phone, driver_t *drv, node_t *node)
 {
 	printf(NAME ": add_device\n");
-	
-	// TODO
-	
-	// pass a new device to the running driver, which was previously assigned to it
-		// send the phone of the parent's driver and device's handle within the parent's driver to the driver 
-		// let the driver to probe the device and specify whether the device is actually present
-		// if the device is present, remember its handle within the driver
+
+	ipcarg_t ret;
+	ipcarg_t rc = async_req_1_1(phone, DRIVER_ADD_DEVICE, node->handle, &ret);
+	if (rc != EOK) {
+		// TODO handle error
+		return false;
+	}
+	
+	// TODO inspect return value (ret) to find out whether the device was successfully probed and added
 	
 	return true;
 }
 
-/**
+/** 
  * Find suitable driver for a device and assign the driver to it.
  * 
@@ -523,5 +536,9 @@
 	if (DRIVER_RUNNING == drv->state) {
 		// notify driver about new device
-		add_device(drv, node);		
+		int phone = ipc_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);
+		if (phone > 0) {
+			add_device(phone, drv, node);		
+			ipc_hangup(phone);
+		}
 	}
 	
@@ -542,6 +559,8 @@
 	printf(NAME ": init_device_tree.\n");
 	
+	atomic_set(&tree->current_handle, 0);
+	
 	// create root node and add it to the device tree
-	if (NULL == (tree->root_node = create_root_node())) {
+	if (!create_root_node(tree)) {
 		return false;
 	}
Index: uspace/srv/devman/devman.h
===================================================================
--- uspace/srv/devman/devman.h	(revision c16cf623b359a6846e36f73f2bc995be0ffb2716)
+++ uspace/srv/devman/devman.h	(revision 7707954c8462caa1ddf08a7f529ad43f26141e2c)
@@ -41,4 +41,5 @@
 #include <ipc/ipc.h>
 #include <fibril_synch.h>
+#include <atomic.h>
 
 #include "util.h"
@@ -115,4 +116,6 @@
 /** Representation of a node in the device tree.*/
 struct node {
+	/** The global unique identifier of the device.*/
+	long handle;
 	/** The node of the parent device. */
 	node_t *parent;
@@ -137,4 +140,5 @@
 	/** Root device node. */
 	node_t *root_node;
+	atomic_t current_handle;
 } dev_tree_t;
 
@@ -191,5 +195,5 @@
 void add_driver(driver_list_t *drivers_list, driver_t *drv);
 void attach_driver(node_t *node, driver_t *drv);
-void add_device(driver_t *drv, node_t *node);
+void add_device(int phone, driver_t *drv, node_t *node);
 bool start_driver(driver_t *drv);
 
@@ -230,5 +234,4 @@
 
 // Device nodes
-node_t * create_root_node();
 
 static inline node_t * create_dev_node()
@@ -238,19 +241,23 @@
 		memset(res, 0, sizeof(node_t));
 	}
+	
+	list_initialize(&res->children);
+	list_initialize(&res->match_ids.ids);
+	
 	return res;
 }
 
-static inline void init_dev_node(node_t *node, node_t *parent)
-{
-	assert(NULL != node);
+static inline void insert_dev_node(dev_tree_t *tree, node_t *node, node_t *parent)
+{
+	assert(NULL != node && NULL != tree);
+	
+	node->handle = atomic_postinc(&tree->current_handle);
 
 	node->parent = parent;
 	if (NULL != parent) {
+		fibril_mutex_lock(&parent->children_mutex);
 		list_append(&node->sibling, &parent->children);
+		fibril_mutex_unlock(&parent->children_mutex);
 	}
-
-	list_initialize(&node->children);
-
-	list_initialize(&node->match_ids.ids);
 }
 
@@ -259,4 +266,5 @@
 
 bool init_device_tree(dev_tree_t *tree, driver_list_t *drivers_list);
+bool create_root_node(dev_tree_t *tree);
 
 
