Index: uspace/lib/libc/generic/devman.c
===================================================================
--- uspace/lib/libc/generic/devman.c	(revision d347b53724c4a93926208e7fb3b0f34111cebc47)
+++ uspace/lib/libc/generic/devman.c	(revision 66babbd31207a4ebab2d1c97b381a5d7d6892de9)
@@ -39,4 +39,5 @@
 #include <malloc.h>
 #include <bool.h>
+#include <adt/list.h>
 
 static int devman_phone_driver = -1;
@@ -106,4 +107,31 @@
 }
 
+static int devman_send_match_id(int phone, match_id_t *match_id) \
+{
+	ipc_call_t answer;
+	async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer);
+	int retval = async_data_write_start(phone, match_id->id, str_size(match_id->id));
+	return retval;	
+}
+
+
+static int devman_send_match_ids(int phone, match_id_list_t *match_ids) 
+{
+	link_t *link = match_ids->ids.next;
+	match_id_t *match_id = NULL;
+	int ret = EOK;
+	
+	while (link != &match_ids->ids) {
+		match_id = list_get_instance(link, match_id_t, link); 
+		if (EOK != (ret = devman_send_match_id(phone, match_id))) 
+		{
+			printf("Driver failed to send match id, error number = %d\n", ret);
+			return ret;			
+		}
+		link = link->next;
+	}
+	return ret;	
+}
+
 int devman_child_device_register(
 	const char *name, match_id_list_t *match_ids, device_handle_t parent_handle, device_handle_t *handle)
@@ -116,6 +144,7 @@
 	async_serialize_start();
 	
+	int match_count = list_count(&match_ids->ids);	
 	ipc_call_t answer;
-	aid_t req = async_send_1(phone, DEVMAN_ADD_CHILD_DEVICE, parent_handle, &answer);
+	aid_t req = async_send_2(phone, DEVMAN_ADD_CHILD_DEVICE, parent_handle, match_count, &answer);
 
 	ipcarg_t retval = async_data_write_start(phone, name, str_size(name));
@@ -126,5 +155,5 @@
 	}
 	
-	// TODO match ids
+	devman_send_match_ids(phone, match_ids);
 	
 	async_wait_for(req, &retval);
@@ -141,4 +170,6 @@
 	if (handle != NULL)
 		*handle = (int) IPC_GET_ARG1(answer);	
+		
+	return retval;
 }
 
Index: uspace/lib/libc/include/ipc/devman.h
===================================================================
--- uspace/lib/libc/include/ipc/devman.h	(revision d347b53724c4a93926208e7fb3b0f34111cebc47)
+++ uspace/lib/libc/include/ipc/devman.h	(revision 66babbd31207a4ebab2d1c97b381a5d7d6892de9)
@@ -51,5 +51,5 @@
 	/** Id of device model.
 	 */
-	const char *id;
+	char *id;
 	/** Relevancy of device-to-driver match.
 	 * The higher is the product of scores specified for the device by the bus driver and by the leaf driver,
@@ -121,5 +121,6 @@
 typedef enum {
 	DEVMAN_DRIVER_REGISTER = IPC_FIRST_USER_METHOD,
-	DEVMAN_ADD_CHILD_DEVICE
+	DEVMAN_ADD_CHILD_DEVICE,
+	DEVMAN_ADD_MATCH_ID
 
 } driver_to_devman_t;
Index: uspace/lib/libdrv/generic/driver.c
===================================================================
--- uspace/lib/libdrv/generic/driver.c	(revision d347b53724c4a93926208e7fb3b0f34111cebc47)
+++ uspace/lib/libdrv/generic/driver.c	(revision 66babbd31207a4ebab2d1c97b381a5d7d6892de9)
@@ -47,4 +47,5 @@
 #include <string.h>
 #include <ctype.h>
+#include <errno.h>
 
 #include <devman.h>
@@ -153,6 +154,5 @@
 	assert(NULL != child->name);
 	
-	if (devman_child_device_register(child->name, &child->match_ids, parent->handle, &child->handle)) {
-		// TODO initialize child device
+	if (EOK == devman_child_device_register(child->name, &child->match_ids, parent->handle, &child->handle)) {
 		return true;
 	}
Index: uspace/srv/devman/main.c
===================================================================
--- uspace/srv/devman/main.c	(revision d347b53724c4a93926208e7fb3b0f34111cebc47)
+++ uspace/srv/devman/main.c	(revision 66babbd31207a4ebab2d1c97b381a5d7d6892de9)
@@ -120,9 +120,56 @@
 }
 
+static int devman_receive_match_id(match_id_list_t *match_ids) {
+	
+	match_id_t *match_id = create_match_id();
+	ipc_callid_t callid;
+	ipc_call_t call;
+	int rc = 0;
+	
+	callid = async_get_call(&call);
+	if (DEVMAN_ADD_MATCH_ID != IPC_GET_METHOD(call)) {
+		printf(NAME ": ERROR: devman_receive_match_id - invalid protocol.\n");
+		ipc_answer_0(callid, EINVAL); 
+		delete_match_id(match_id);
+		return EINVAL;
+	}
+	
+	if (NULL == match_id) {
+		printf(NAME ": ERROR: devman_receive_match_id - failed to allocate match id.\n");
+		ipc_answer_0(callid, ENOMEM);
+		return ENOMEM;
+	}
+	
+	match_id->score = IPC_GET_ARG1(call);
+	
+	rc = async_string_receive(&match_id->id, DEVMAN_NAME_MAXLEN, NULL);	
+	if (EOK != rc) {
+		delete_match_id(match_id);
+		return rc;
+	}
+	
+	list_append(&match_id->link, &match_ids->ids);
+	return rc;
+}
+
+static int devman_receive_match_ids(ipcarg_t match_count, match_id_list_t *match_ids) 
+{
+	int ret = EOK;
+	int i;
+	for (i = 0; i < match_count; i++) {
+		if (EOK != (ret = devman_receive_match_id(match_ids))) {
+			return ret;
+		}
+	}
+	return ret;
+}
+
 static void devman_add_child(ipc_callid_t callid, ipc_call_t *call, driver_t *driver)
 {
 	printf(NAME ": devman_add_child\n");
-
+	
 	device_handle_t parent_handle = IPC_GET_ARG1(*call);
+	ipcarg_t match_count = IPC_GET_ARG2(*call);
+	
 	node_t *parent =  find_dev_node(&device_tree, parent_handle);
 	
@@ -130,9 +177,9 @@
 		ipc_answer_0(callid, ENOENT);
 		return;
-	}
+	}	
 	
 	char *dev_name = NULL;
 	int rc = async_string_receive(&dev_name, DEVMAN_NAME_MAXLEN, NULL);	
-	if (rc != EOK) {
+	if (EOK != rc) {
 		ipc_answer_0(callid, rc);
 		return;
@@ -147,5 +194,5 @@
 	}	
 	
-	// TODO match ids
+	devman_receive_match_ids(match_count, &node->match_ids);
 	
 	// return device handle to parent's driver
Index: uspace/srv/drivers/root/root.c
===================================================================
--- uspace/srv/drivers/root/root.c	(revision d347b53724c4a93926208e7fb3b0f34111cebc47)
+++ uspace/srv/drivers/root/root.c	(revision 66babbd31207a4ebab2d1c97b381a5d7d6892de9)
@@ -55,8 +55,12 @@
 static bool root_init();
 
+/** The root device driver's standard operations.
+ */
 static driver_ops_t root_ops = {
 	.add_device = &root_add_device
 };
 
+/** The root device driver structure. 
+ */
 static driver_t root_driver = {
 	.name = NAME,
@@ -64,4 +68,7 @@
 };
 
+/** Create the device which represents the root of HW device tree. 
+ * @param parent parent of the newly created device.
+ */
 static bool add_platform_child(device_t *parent) {
 	printf(NAME ": adding new child for platform device.\n");
@@ -107,4 +114,7 @@
 }
 
+/** Get the root device.
+ * @param dev the device which is root of the whole device tree (both of HW and pseudo devices).
+ */
 static bool root_add_device(device_t *dev) 
 {
