Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -388,9 +388,7 @@
 int hc_init_mem_structures(hc_t *instance, hc_device_t *hcd)
 {
-	int err;
 	assert(instance);
 
-	if ((err = usb2_bus_init(&instance->bus, BANDWIDTH_AVAILABLE_USB11)))
-		return err;
+	usb2_bus_init(&instance->bus, BANDWIDTH_AVAILABLE_USB11);
 
 	bus_t *bus = (bus_t *) &instance->bus;
Index: uspace/drv/bus/usb/usbhub/port.c
===================================================================
--- uspace/drv/bus/usb/usbhub/port.c	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/drv/bus/usb/usbhub/port.c	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -406,5 +406,5 @@
 
 	/* Reserve default address */
-	while ((ret = usbhc_reserve_default_address(exch, speed)) == ENOENT) {
+	while ((ret = usbhc_reserve_default_address(exch, speed)) == EAGAIN) {
 		async_usleep(1000000);
 	}
Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -426,24 +426,4 @@
 }
 
-static int reserve_default_address(bus_t *bus_base, usb_speed_t speed)
-{
-	xhci_bus_t *xhci_bus = bus_to_xhci_bus(bus_base);
-
-	if (xhci_bus->default_address_speed != USB_SPEED_MAX)
-		/* Already allocated */
-		return ENOENT;
-
-	xhci_bus->default_address_speed = speed;
-	return EOK;
-}
-
-static int release_default_address(bus_t *bus_base)
-{
-	xhci_bus_t *xhci_bus = bus_to_xhci_bus(bus_base);
-
-	xhci_bus->default_address_speed = USB_SPEED_MAX;
-	return EOK;
-}
-
 static usb_transfer_batch_t *batch_create(endpoint_t *ep)
 {
@@ -461,7 +441,4 @@
 // TODO: Is it good idea to use this macro? It blurrs the fact that the callbacks and static functions are called the same.
 #define BIND_OP(op) .op = op,
-	BIND_OP(reserve_default_address)
-	BIND_OP(release_default_address)
-
 	BIND_OP(device_enumerate)
 	BIND_OP(device_remove)
@@ -501,5 +478,4 @@
 	bus->hc = hc;
 	bus->base.ops = &xhci_bus_ops;
-	bus->default_address_speed = USB_SPEED_MAX;
 	return EOK;
 }
Index: uspace/drv/bus/usb/xhci/bus.h
===================================================================
--- uspace/drv/bus/usb/xhci/bus.h	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/drv/bus/usb/xhci/bus.h	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -51,6 +51,4 @@
 
 	xhci_device_t **devices_by_slot;	/**< Devices by Slot ID */
-
-	usb_speed_t default_address_speed;	/**< Used to get speed from usb hubs */
 } xhci_bus_t;
 
Index: uspace/lib/usbhost/include/usb/host/bus.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/bus.h	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/lib/usbhost/include/usb/host/bus.h	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -100,6 +100,4 @@
 	void (*interrupt)(bus_t *, uint32_t);
 	int (*status)(bus_t *, uint32_t *);
-	int (*reserve_default_address)(bus_t *, usb_speed_t);
-	int (*release_default_address)(bus_t *);
 
 	/* Operations on device */
@@ -139,4 +137,7 @@
 	const bus_ops_t *ops;
 
+	/* Reserving default address - USB_SPEED_MAX when free. */
+	usb_speed_t default_address_speed;
+
 	/* This structure is meant to be extended by overriding. */
 } bus_t;
@@ -166,5 +167,5 @@
 
 int bus_reserve_default_address(bus_t *, usb_speed_t);
-int bus_release_default_address(bus_t *);
+void bus_release_default_address(bus_t *);
 
 #endif
Index: uspace/lib/usbhost/include/usb/host/usb2_bus.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/usb2_bus.h	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/lib/usbhost/include/usb/host/usb2_bus.h	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -50,7 +50,4 @@
 	bus_t base;			/**< Inheritance - keep this first */
 
-	/** The speed which reserved default address. Invalid unless reserved. */
-	usb_speed_t default_address_speed;
-
 	/** Map of occupied addresses */
 	bool address_occupied [USB_ADDRESS_COUNT];
@@ -64,5 +61,5 @@
 extern const bus_ops_t usb2_bus_ops;
 
-extern int usb2_bus_init(usb2_bus_t *, size_t);
+extern void usb2_bus_init(usb2_bus_t *, size_t);
 
 #endif
Index: uspace/lib/usbhost/src/bus.c
===================================================================
--- uspace/lib/usbhost/src/bus.c	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/lib/usbhost/src/bus.c	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -54,4 +54,5 @@
 	fibril_mutex_initialize(&bus->guard);
 	bus->device_size = device_size;
+	bus->default_address_speed = USB_SPEED_MAX;
 }
 
@@ -239,26 +240,19 @@
 	assert(bus);
 
-	const bus_ops_t *ops = BUS_OPS_LOOKUP(bus->ops, reserve_default_address);
-	if (!ops)
-		return ENOTSUP;
-
 	fibril_mutex_lock(&bus->guard);
-	const int r = ops->reserve_default_address(bus, speed);
-	fibril_mutex_unlock(&bus->guard);
-	return r;
-}
-
-int bus_release_default_address(bus_t *bus)
+	if (bus->default_address_speed != USB_SPEED_MAX) {
+		fibril_mutex_unlock(&bus->guard);
+		return EAGAIN;
+	} else {
+		bus->default_address_speed = speed;
+		fibril_mutex_unlock(&bus->guard);
+		return EOK;
+	}
+}
+
+void bus_release_default_address(bus_t *bus)
 {
 	assert(bus);
-
-	const bus_ops_t *ops = BUS_OPS_LOOKUP(bus->ops, release_default_address);
-	if (!ops)
-		return ENOTSUP;
-
-	fibril_mutex_lock(&bus->guard);
-	const int r = ops->release_default_address(bus);
-	fibril_mutex_unlock(&bus->guard);
-	return r;
+	bus->default_address_speed = USB_SPEED_MAX;
 }
 
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -137,5 +137,7 @@
 
 	usb_log_debug("Device %d released default address\n", dev->address);
-	return bus_release_default_address(hcd->bus);
+	bus_release_default_address(hcd->bus);
+
+	return EOK;
 }
 
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision 63431db22d38ba4867125d47d6fc3180e8026b8b)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision 5e2b1ae6fe35b358dd5e76f6cedd1d7991973fe2)
@@ -100,9 +100,8 @@
  * @param bus usb_device_manager
  * @param addr Pointer to requested address value, place to store new address
- * @parma strict Fail if the requested address is not available.
  * @return Error code.
  * @note Default address is only available in strict mode.
  */
-static int request_address(usb2_bus_t *bus, usb_address_t *addr, bool strict)
+static int request_address(usb2_bus_t *bus, usb_address_t *addr)
 {
 	int err;
@@ -114,20 +113,10 @@
 		return EINVAL;
 
-	/* Only grant default address to strict requests */
-	if ((*addr == USB_ADDRESS_DEFAULT) && !strict) {
-		if ((err = get_free_address(bus, addr)))
-			return err;
-	}
-	else if (bus->address_occupied[*addr]) {
-		if (strict) {
-			return ENOENT;
-		}
-		if ((err = get_free_address(bus, addr)))
-			return err;
-	}
+	if ((err = get_free_address(bus, addr)))
+		return err;
 
 	assert(usb_address_is_valid(*addr));
 	assert(bus->address_occupied[*addr] == false);
-	assert(*addr != USB_ADDRESS_DEFAULT || strict);
+	assert(*addr != USB_ADDRESS_DEFAULT);
 
 	bus->address_occupied[*addr] = true;
@@ -152,5 +141,5 @@
 	/** Reserve address early, we want pretty log messages */
 	usb_address_t address = USB_ADDRESS_DEFAULT;
-	if ((err = request_address(bus, &address, false))) {
+	if ((err = request_address(bus, &address))) {
 		usb_log_error("Failed to reserve new address: %s.",
 		    str_error(err));
@@ -231,5 +220,5 @@
 	 * default address.
 	 */
-	dev->speed = bus->default_address_speed;
+	dev->speed = bus->base.default_address_speed;
 	usb_log_debug("Found new %s speed USB device.", usb_str_speed(dev->speed));
 
@@ -301,24 +290,5 @@
 }
 
-static int usb2_bus_register_default_address(bus_t *bus_base, usb_speed_t speed)
-{
-	usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
-	usb_address_t addr = USB_ADDRESS_DEFAULT;
-	const int err = request_address(bus, &addr, true);
-	if (err)
-		return err;
-	bus->default_address_speed = speed;
-	return EOK;
-}
-
-static int usb2_bus_release_default_address(bus_t *bus_base)
-{
-	usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
-	return release_address(bus, USB_ADDRESS_DEFAULT);
-}
-
 const bus_ops_t usb2_bus_ops = {
-	.reserve_default_address = usb2_bus_register_default_address,
-	.release_default_address = usb2_bus_release_default_address,
 	.device_enumerate = usb2_bus_device_enumerate,
 	.endpoint_create = usb2_bus_create_ep,
@@ -334,5 +304,5 @@
  * @return Error code.
  */
-int usb2_bus_init(usb2_bus_t *bus, size_t available_bandwidth)
+void usb2_bus_init(usb2_bus_t *bus, size_t available_bandwidth)
 {
 	assert(bus);
@@ -342,6 +312,4 @@
 
 	bus->free_bw = available_bandwidth;
-
-	return EOK;
 }
 /**
