Index: uspace/lib/usb/include/usb/devdrv.h
===================================================================
--- uspace/lib/usb/include/usb/devdrv.h	(revision 81dce9f771a48fddabf8296e844817d7c79b4879)
+++ uspace/lib/usb/include/usb/devdrv.h	(revision 2e1d5d702aa16e31df05fdd7e11092c7133b880a)
@@ -79,5 +79,10 @@
 	 */
 	const char *name;
-	/** Expected endpoints description. */
+	/** Expected endpoints description, excluding default control endpoint.
+	 *
+	 * It MUST be of size expected_enpoints_count(excluding default ctrl) + 1
+	 * where the last record MUST BE NULL, otherwise catastrophic things may
+	 * happen.
+	 */
 	usb_endpoint_description_t **endpoints;
 	/** Driver ops. */
Index: uspace/lib/usb/src/devdrv.c
===================================================================
--- uspace/lib/usb/src/devdrv.c	(revision 81dce9f771a48fddabf8296e844817d7c79b4879)
+++ uspace/lib/usb/src/devdrv.c	(revision 2e1d5d702aa16e31df05fdd7e11092c7133b880a)
@@ -206,5 +206,5 @@
  * @return Error code.
  */
-static int initialize_pipes(usb_driver_t *drv, usb_device_t *dev)
+static int initialize_pipes(usb_device_t *dev)
 {
 	int rc;
@@ -284,5 +284,5 @@
 	dev->driver_data = NULL;
 
-	rc = initialize_pipes(driver, dev);
+	rc = initialize_pipes(dev);
 	if (rc != EOK) {
 		free(dev);
Index: uspace/lib/usb/src/pipes.c
===================================================================
--- uspace/lib/usb/src/pipes.c	(revision 81dce9f771a48fddabf8296e844817d7c79b4879)
+++ uspace/lib/usb/src/pipes.c	(revision 2e1d5d702aa16e31df05fdd7e11092c7133b880a)
@@ -42,4 +42,6 @@
 #include <assert.h>
 
+#define IPC_AGAIN_DELAY (1000 * 2) /* 2ms */
+
 /** Tell USB address assigned to given device.
  *
@@ -150,9 +152,28 @@
 	}
 
-	my_address = get_my_address(parent_phone, dev);
-	if (my_address < 0) {
-		rc = my_address;
-		goto leave;
-	}
+	/*
+	 * Asking for "my" address may require several attempts.
+	 * That is because following scenario may happen:
+	 *  - parent driver (i.e. driver of parent device) announces new device
+	 *    and devman launches current driver
+	 *  - parent driver is preempted and thus does not send address-handle
+	 *    binding to HC driver
+	 *  - this driver gets here and wants the binding
+	 *  - the HC does not know the binding yet and thus it answers ENOENT
+	 *  So, we need to wait for the HC to learn the binding.
+	 */
+	do {
+		my_address = get_my_address(parent_phone, dev);
+
+		if (my_address == ENOENT) {
+			/* Be nice, let other fibrils run and try again. */
+			async_usleep(IPC_AGAIN_DELAY);
+		} else if (my_address < 0) {
+			/* Some other problem, no sense trying again. */
+			rc = my_address;
+			goto leave;
+		}
+
+	} while (my_address < 0);
 
 	rc = usb_device_connection_initialize(connection,
Index: uspace/lib/usb/src/recognise.c
===================================================================
--- uspace/lib/usb/src/recognise.c	(revision 81dce9f771a48fddabf8296e844817d7c79b4879)
+++ uspace/lib/usb/src/recognise.c	(revision 2e1d5d702aa16e31df05fdd7e11092c7133b880a)
@@ -247,4 +247,7 @@
 #undef VENDOR_ONLY_FMT
 #undef VENDOR_ONLY_ARGS
+
+	/* As a last resort, try fallback driver. */
+	ADD_MATCHID_OR_RETURN(matches, 10, "usb&interface&fallback");
 
 	return EOK;
@@ -291,4 +294,7 @@
 	}
 	
+	/* As a last resort, try fallback driver. */
+	ADD_MATCHID_OR_RETURN(matches, 10, "usb&fallback");
+
 	return EOK;
 }
