Index: uspace/lib/libc/generic/devman.c
===================================================================
--- uspace/lib/libc/generic/devman.c	(revision 084ff99a2c165918dddaf6cfa41eaf8810507a93)
+++ uspace/lib/libc/generic/devman.c	(revision 7707954c8462caa1ddf08a7f529ad43f26141e2c)
@@ -106,4 +106,38 @@
 }
 
+int devman_child_device_register(const char *name, long parent_handle, long *handle)
+{	
+	int phone = devman_get_phone(DEVMAN_DRIVER, IPC_FLAG_BLOCKING);
+	
+	if (phone < 0)
+		return phone;
+	
+	async_serialize_start();
+	
+	ipc_call_t answer;
+	aid_t req = async_send_1(phone, DEVMAN_ADD_CHILD_DEVICE, parent_handle, &answer);
+
+	ipcarg_t retval = async_data_write_start(phone, name, str_size(name));
+	if (retval != EOK) {
+		async_wait_for(req, NULL);
+		async_serialize_end();
+		return retval;
+	}
+	
+	async_wait_for(req, &retval);
+	
+	async_serialize_end();
+	
+	if (retval != EOK) {
+		if (handle != NULL) {
+			*handle = -1;
+		}
+		return retval;
+	}	
+	
+	if (handle != NULL)
+		*handle = (int) IPC_GET_ARG1(answer);	
+}
+
 void devman_hangup_phone(devman_interface_t iface)
 {
Index: uspace/lib/libc/include/devman.h
===================================================================
--- uspace/lib/libc/include/devman.h	(revision 084ff99a2c165918dddaf6cfa41eaf8810507a93)
+++ uspace/lib/libc/include/devman.h	(revision 7707954c8462caa1ddf08a7f529ad43f26141e2c)
@@ -41,8 +41,10 @@
 #include <bool.h>
 
-extern int devman_get_phone(devman_interface_t, unsigned int);
-extern void devman_hangup_phone(devman_interface_t iface);
 
-extern int devman_driver_register(const char *, async_client_conn_t);
+int devman_get_phone(devman_interface_t, unsigned int);
+void devman_hangup_phone(devman_interface_t iface);
+
+int devman_driver_register(const char *, async_client_conn_t);
+int devman_child_device_register(const char *name, long parent_handle, long *handle);
 
 
Index: uspace/lib/libdrv/generic/driver.c
===================================================================
--- uspace/lib/libdrv/generic/driver.c	(revision 084ff99a2c165918dddaf6cfa41eaf8810507a93)
+++ uspace/lib/libdrv/generic/driver.c	(revision 7707954c8462caa1ddf08a7f529ad43f26141e2c)
@@ -129,5 +129,4 @@
 static void driver_connection(ipc_callid_t iid, ipc_call_t *icall)
 {
-	ipc_callid_t callid;
 	/* Select interface */
 	switch ((ipcarg_t) (IPC_GET_ARG1(*icall))) {
@@ -151,4 +150,13 @@
 }
 
+bool child_device_register(device_t *child, const char *child_name, device_t *parent)
+{
+	if (devman_child_device_register(child_name, parent->handle, &child->handle)) {
+		// TODO initialize child device
+		return true;
+	}
+	return false;
+}
+
 int driver_main(driver_t *drv) 
 {
Index: uspace/lib/libdrv/include/driver.h
===================================================================
--- uspace/lib/libdrv/include/driver.h	(revision 084ff99a2c165918dddaf6cfa41eaf8810507a93)
+++ uspace/lib/libdrv/include/driver.h	(revision 7707954c8462caa1ddf08a7f529ad43f26141e2c)
@@ -38,6 +38,4 @@
 #include <adt/list.h>
 
-
-
 typedef struct device {
 	long handle;
@@ -61,4 +59,18 @@
 int driver_main(driver_t *drv);
 
+static inline device_t * create_device()
+{
+	device_t *dev = malloc(sizeof(device_t));
+	if (NULL != dev) {
+		memset(dev, 0, sizeof(device_t));
+	}
+	
+	return dev;
+}
+
+bool child_device_register(device_t *child, const char *child_name, device_t *parent);
+
+
+
 #endif
 
