Index: uspace/lib/drv/generic/remote_usbhc.c
===================================================================
--- uspace/lib/drv/generic/remote_usbhc.c	(revision 0cd80894622812e65d3abac4dcc0e5151ae6b43d)
+++ uspace/lib/drv/generic/remote_usbhc.c	(revision 67f55e7b2dfcb0148220fbd9ab6a82e92e67d3b6)
@@ -118,8 +118,9 @@
 	}
 
-	usb_speed_t speed = DEV_IPC_GET_ARG1(*call);
-
-	usb_address_t address;
-	int rc = usb_iface->request_address(fun, speed, &address);
+	usb_address_t address = DEV_IPC_GET_ARG1(*call);
+	const bool strict = DEV_IPC_GET_ARG2(*call);
+	const usb_speed_t speed = DEV_IPC_GET_ARG3(*call);
+
+	const int rc = usb_iface->request_address(fun, &address, strict, speed);
 	if (rc != EOK) {
 		async_answer_0(callid, rc);
Index: uspace/lib/drv/include/usbhc_iface.h
===================================================================
--- uspace/lib/drv/include/usbhc_iface.h	(revision 0cd80894622812e65d3abac4dcc0e5151ae6b43d)
+++ uspace/lib/drv/include/usbhc_iface.h	(revision 67f55e7b2dfcb0148220fbd9ab6a82e92e67d3b6)
@@ -170,5 +170,5 @@
 /** USB host controller communication interface. */
 typedef struct {
-	int (*request_address)(ddf_fun_t *, usb_speed_t, usb_address_t *);
+	int (*request_address)(ddf_fun_t *, usb_address_t *, bool, usb_speed_t);
 	int (*bind_address)(ddf_fun_t *, usb_address_t, devman_handle_t);
 	int (*find_by_address)(ddf_fun_t *, usb_address_t, devman_handle_t *);
Index: uspace/lib/usbdev/include/usb/dev/hub.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/hub.h	(revision 0cd80894622812e65d3abac4dcc0e5151ae6b43d)
+++ uspace/lib/usbdev/include/usb/dev/hub.h	(revision 67f55e7b2dfcb0148220fbd9ab6a82e92e67d3b6)
@@ -59,5 +59,6 @@
 } usb_hub_attached_device_t;
 
-usb_address_t usb_hc_request_address(usb_hc_connection_t *, usb_speed_t);
+usb_address_t usb_hc_request_address(usb_hc_connection_t *, usb_address_t,
+    bool, usb_speed_t);
 int usb_hc_register_device(usb_hc_connection_t *,
     const usb_hub_attached_device_t *);
Index: uspace/lib/usbdev/src/hub.c
===================================================================
--- uspace/lib/usbdev/src/hub.c	(revision 0cd80894622812e65d3abac4dcc0e5151ae6b43d)
+++ uspace/lib/usbdev/src/hub.c	(revision 67f55e7b2dfcb0148220fbd9ab6a82e92e67d3b6)
@@ -66,4 +66,6 @@
  *
  * @param connection Opened connection to host controller.
+ * @param preferred Preferred SUB address.
+ * @param strict Fail if the preferred address is not avialable.
  * @param speed Speed of the new device (device that will be assigned
  *    the returned address).
@@ -71,5 +73,5 @@
  */
 usb_address_t usb_hc_request_address(usb_hc_connection_t *connection,
-    usb_speed_t speed)
+    usb_address_t preferred, bool strict, usb_speed_t speed)
 {
 	CHECK_CONNECTION(connection);
@@ -78,7 +80,6 @@
 	
 	sysarg_t address;
-	int rc = async_req_2_1(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
-	    IPC_M_USBHC_REQUEST_ADDRESS, speed,
-	    &address);
+	int rc = async_req_4_1(exch, DEV_IFACE_ID(USBHC_DEV_IFACE),
+	    IPC_M_USBHC_REQUEST_ADDRESS, preferred, strict, speed, &address);
 	
 	async_exchange_end(exch);
@@ -223,5 +224,6 @@
 	 * Request new address.
 	 */
-	usb_address_t dev_addr = usb_hc_request_address(&hc_conn, dev_speed);
+	usb_address_t dev_addr =
+	    usb_hc_request_address(&hc_conn, 1, false, dev_speed);
 	if (dev_addr < 0) {
 		rc = EADDRNOTAVAIL;
Index: uspace/lib/usbhost/src/iface.c
===================================================================
--- uspace/lib/usbhost/src/iface.c	(revision 0cd80894622812e65d3abac4dcc0e5151ae6b43d)
+++ uspace/lib/usbhost/src/iface.c	(revision 67f55e7b2dfcb0148220fbd9ab6a82e92e67d3b6)
@@ -97,5 +97,5 @@
  */
 static int request_address(
-    ddf_fun_t *fun, usb_speed_t speed, usb_address_t *address)
+    ddf_fun_t *fun, usb_address_t *address, bool strict, usb_speed_t speed)
 {
 	assert(fun);
@@ -106,5 +106,5 @@
 	usb_log_debug("Address request speed: %s.\n", usb_str_speed(speed));
 	return usb_device_manager_request_address(
-	    &hcd->dev_manager, address, false, speed);
+	    &hcd->dev_manager, address, strict, speed);
 }
 /*----------------------------------------------------------------------------*/
