Index: kernel/generic/include/ipc/ipc.h
===================================================================
--- kernel/generic/include/ipc/ipc.h	(revision 4144630f53ee5e44772efd8ae1c1f4ee7e942bf7)
+++ kernel/generic/include/ipc/ipc.h	(revision 2cb65715d0ed6e1e5320c16c6c26044ba9f8afcd)
@@ -45,5 +45,5 @@
 /** Maximum active async calls per thread */
 #ifdef CONFIG_DEBUG
-	#define IPC_MAX_ASYNC_CALLS  4
+	#define IPC_MAX_ASYNC_CALLS  16
 #else
 	#define IPC_MAX_ASYNC_CALLS  4000
Index: uspace/drv/uhci/main.c
===================================================================
--- uspace/drv/uhci/main.c	(revision 4144630f53ee5e44772efd8ae1c1f4ee7e942bf7)
+++ uspace/drv/uhci/main.c	(revision 2cb65715d0ed6e1e5320c16c6c26044ba9f8afcd)
@@ -77,8 +77,6 @@
 	/*
 	 * We need to announce the presence of our root hub.
-	 * Commented out until the problem which causes the whole task to
-	 * block is solved.
 	 */
-	//usb_hcd_add_root_hub(device);
+	usb_hcd_add_root_hub(device);
 
 	return EOK;
Index: uspace/lib/usb/include/usb/hcdhubd.h
===================================================================
--- uspace/lib/usb/include/usb/hcdhubd.h	(revision 4144630f53ee5e44772efd8ae1c1f4ee7e942bf7)
+++ uspace/lib/usb/include/usb/hcdhubd.h	(revision 2cb65715d0ed6e1e5320c16c6c26044ba9f8afcd)
@@ -191,4 +191,5 @@
  */
 
+device_t *usb_hc_connect(device_t *);
 
 int usb_hc_async_interrupt_out(usb_hc_device_t *, usb_target_t,
Index: uspace/lib/usb/src/hcdhubd.c
===================================================================
--- uspace/lib/usb/src/hcdhubd.c	(revision 4144630f53ee5e44772efd8ae1c1f4ee7e942bf7)
+++ uspace/lib/usb/src/hcdhubd.c	(revision 2cb65715d0ed6e1e5320c16c6c26044ba9f8afcd)
@@ -107,5 +107,5 @@
 int usb_hcd_add_root_hub(usb_hc_device_t *dev) {
 	char *id;
-	int rc = asprintf(&id, "usb&hc=%s&hub", dev->generic->name);
+	int rc = asprintf(&id, "usb&hc=%s&hub", hc_driver->name);
 	if (rc <= 0) {
 		return rc;
@@ -133,4 +133,6 @@
 	int rc;
 
+	async_usleep(1000);
+
 	device_t *child = create_device();
 	match_id_t *match_id = NULL;
@@ -196,4 +198,10 @@
 	printf("%s: about to add child device `%s' (%s)\n", hc_driver->name,
 			name, match_id);
+
+	/*
+	 * Seems that creating fibril which postpones the action
+	 * is the best solution.
+	 */
+	create_fibril = true;
 
 	struct child_device_info *child_info
Index: uspace/lib/usb/src/localdrv.c
===================================================================
--- uspace/lib/usb/src/localdrv.c	(revision 4144630f53ee5e44772efd8ae1c1f4ee7e942bf7)
+++ uspace/lib/usb/src/localdrv.c	(revision 2cb65715d0ed6e1e5320c16c6c26044ba9f8afcd)
@@ -39,4 +39,29 @@
 #include <errno.h>
 
+/** Find host controller when handled by current task.
+ *
+ * @param dev Device asking for connection.
+ * @return Device structure corresponding to parent host controller.
+ * @retval NULL Corresponding host controller not found.
+ */
+device_t *usb_hc_connect(device_t *dev)
+{
+	/*
+	 * FIXME: this will not work when some hub on the path is
+	 * not driven by the same task.
+	 */
+	device_t *parent = dev;
+	while (parent->parent != NULL) {
+		parent = parent->parent;
+	}
+	
+	if (dev == parent) {
+		printf("FIXME in %s:%d encountered!\n", __FILE__, __LINE__);
+		parent = NULL;
+	}
+
+	return parent;
+}
+
 /** Information about pending transaction on HC. */
 typedef struct {
Index: uspace/lib/usb/src/usbdrv.c
===================================================================
--- uspace/lib/usb/src/usbdrv.c	(revision 4144630f53ee5e44772efd8ae1c1f4ee7e942bf7)
+++ uspace/lib/usb/src/usbdrv.c	(revision 2cb65715d0ed6e1e5320c16c6c26044ba9f8afcd)
@@ -55,5 +55,5 @@
 /** Connect to host controller the device is physically attached to.
  *
- * @param handle Device handle.
+ * @param dev Device asking for connection.
  * @param flags Connection flags (blocking connection).
  * @return Phone to corresponding HC or error code.
