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;
 	}
