Index: uspace/lib/usbdev/include/usb/dev/recognise.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/recognise.h	(revision 3238506cbb730ad7eb43c2168531ab063f6dcf63)
+++ uspace/lib/usbdev/include/usb/dev/recognise.h	(revision 2179cf95aa5da4ce9635bdfad80559815a215a12)
@@ -50,5 +50,5 @@
 int usb_device_create_match_ids(usb_pipe_t *, match_id_list_t *);
 
-int usb_device_register_child_in_devman(usb_address_t, devman_handle_t,
+int usb_device_register_child_in_devman(usb_pipe_t *ctrl_pipe,
     ddf_dev_t *, ddf_dev_ops_t *, void *, ddf_fun_t **);
 
Index: uspace/lib/usbdev/src/hub.c
===================================================================
--- uspace/lib/usbdev/src/hub.c	(revision 3238506cbb730ad7eb43c2168531ab063f6dcf63)
+++ uspace/lib/usbdev/src/hub.c	(revision 2179cf95aa5da4ce9635bdfad80559815a215a12)
@@ -348,5 +348,5 @@
 	/* FIXME: create device_register that will get opened ctrl pipe. */
 	ddf_fun_t *child_fun;
-	rc = usb_device_register_child_in_devman(dev_addr, dev_conn.hc_handle,
+	rc = usb_device_register_child_in_devman(&ctrl_pipe,
 	    parent, dev_ops, new_dev_data, &child_fun);
 	if (rc != EOK) {
Index: uspace/lib/usbdev/src/recognise.c
===================================================================
--- uspace/lib/usbdev/src/recognise.c	(revision 3238506cbb730ad7eb43c2168531ab063f6dcf63)
+++ uspace/lib/usbdev/src/recognise.c	(revision 2179cf95aa5da4ce9635bdfad80559815a215a12)
@@ -316,4 +316,5 @@
     match_id_list_t *matches)
 {
+	assert(ctrl_pipe);
 	int rc;
 	/*
@@ -338,6 +339,5 @@
 /** Probe for device kind and register it in devman.
  *
- * @param[in] address Address of the (unknown) attached device.
- * @param[in] hc_handle Handle of the host controller.
+ * @param[in] ctrl_pipe Control pipe to the device.
  * @param[in] parent Parent device.
  * @param[in] dev_ops Child device ops. Default child_ops will be used if NULL.
@@ -348,9 +348,9 @@
  * @return Error code.
  */
-int usb_device_register_child_in_devman(usb_address_t address,
-    devman_handle_t hc_handle, ddf_dev_t *parent,
-    ddf_dev_ops_t *dev_ops, void *dev_data, ddf_fun_t **child_fun)
+int usb_device_register_child_in_devman(usb_pipe_t *ctrl_pipe,
+    ddf_dev_t *parent, ddf_dev_ops_t *dev_ops, void *dev_data,
+    ddf_fun_t **child_fun)
 {
-	if (child_fun == NULL)
+	if (child_fun == NULL || ctrl_pipe == NULL)
 		return EINVAL;
 
@@ -360,31 +360,10 @@
 	}
 
-	size_t this_device_name_index;
-
 	fibril_mutex_lock(&device_name_index_mutex);
-	this_device_name_index = device_name_index;
-	device_name_index++;
+	const size_t this_device_name_index = device_name_index++;
 	fibril_mutex_unlock(&device_name_index_mutex);
 
 	ddf_fun_t *child = NULL;
-	char *child_name = NULL;
 	int rc;
-	usb_device_connection_t dev_connection;
-	usb_pipe_t ctrl_pipe;
-
-	rc = usb_device_connection_initialize(
-	    &dev_connection, hc_handle, address);
-	if (rc != EOK) {
-		goto failure;
-	}
-
-	rc = usb_pipe_initialize_default_control(&ctrl_pipe, &dev_connection);
-	if (rc != EOK) {
-		goto failure;
-	}
-	rc = usb_pipe_probe_default_control(&ctrl_pipe);
-	if (rc != EOK) {
-		goto failure;
-	}
 
 	/*
@@ -392,6 +371,7 @@
 	 * naming etc., something more descriptive could be created.
 	 */
-	rc = asprintf(&child_name, "usb%02zu_a%d",
-	    this_device_name_index, address);
+	char child_name[12]; /* The format is: "usbAB_aXYZ", length 11 */
+	rc = snprintf(child_name, sizeof(child_name),
+	    "usb%02zu_a%d", this_device_name_index, ctrl_pipe->wire->address);
 	if (rc < 0) {
 		goto failure;
@@ -399,5 +379,4 @@
 
 	child = ddf_fun_create(parent, fun_inner, child_name);
-	free(child_name);
 	if (child == NULL) {
 		rc = ENOMEM;
@@ -421,10 +400,10 @@
 			goto failure;
 		}
-		new_device->address = address;
+		new_device->address = ctrl_pipe->wire->address;
 		new_device->fun = child;
 	}
 
 
-	rc = usb_device_create_match_ids(&ctrl_pipe, &child->match_ids);
+	rc = usb_device_create_match_ids(ctrl_pipe, &child->match_ids);
 	if (rc != EOK) {
 		goto failure;
