Index: uspace/lib/usb/include/usb/usbdrv.h
===================================================================
--- uspace/lib/usb/include/usb/usbdrv.h	(revision 03e0224878d1d450422cb4f06ed01afe585e3c42)
+++ uspace/lib/usb/include/usb/usbdrv.h	(revision 7ed5b5763472e1fff14e208a3facac2a1b05b956)
@@ -95,4 +95,7 @@
 
 int usb_drv_create_device_match_ids(int, match_id_list_t *, usb_address_t);
+int usb_drv_register_child_in_devman(int, device_t *, usb_address_t,
+    devman_handle_t *);
+
 
 #endif
Index: uspace/lib/usb/src/recognise.c
===================================================================
--- uspace/lib/usb/src/recognise.c	(revision 03e0224878d1d450422cb4f06ed01afe585e3c42)
+++ uspace/lib/usb/src/recognise.c	(revision 7ed5b5763472e1fff14e208a3facac2a1b05b956)
@@ -174,18 +174,64 @@
 }
 
-#if 0
+
 /** Probe for device kind and register it in devman.
  *
  * @param hc Open phone to the host controller.
- * @param dev Parent device.
+ * @param parent Parent device.
  * @param address Address of the (unknown) attached device.
  * @return Error code.
  */
-int usb_drv_register_child_in_devman(int hc, device_t *dev,
-    usb_address_t address)
+int usb_drv_register_child_in_devman(int hc, device_t *parent,
+    usb_address_t address, devman_handle_t *child_handle)
 {
+	device_t *child = NULL;
+	char *child_name = NULL;
+	int rc;
+
+	child = create_device();
+	if (child == NULL) {
+		rc = ENOMEM;
+		goto failure;
+	}
+
+	/*
+	 * TODO: some better child naming
+	 */
+	rc = asprintf(&child_name, "usb%p", child);
+	if (rc < 0) {
+		goto failure;
+	}
+	child->name = child_name;
+	
+	rc = usb_drv_create_device_match_ids(hc, &child->match_ids, address);
+	if (rc != EOK) {
+		goto failure;
+	}
+
+	rc = child_device_register(child, parent);
+	if (rc != EOK) {
+		goto failure;
+	}
+
+	if (child_handle != NULL) {
+		*child_handle = child->handle;
+	}
+	
+	return EOK;
+
+failure:
+	if (child != NULL) {
+		child->name = NULL;
+		/* This takes care of match_id deallocation as well. */
+		delete_device(child);
+	}
+	if (child_name != NULL) {
+		free(child_name);
+	}
+
+	return rc;
 
 }
-#endif
+
 
 /**
