Index: uspace/lib/usbhost/src/bus.c
===================================================================
--- uspace/lib/usbhost/src/bus.c	(revision 2cf28b9d069a6ca711200eb94197fa3b893ee323)
+++ uspace/lib/usbhost/src/bus.c	(revision 8b8c164397f69eeebe6f33b2ef55e23bfa483828)
@@ -117,6 +117,5 @@
 	endpoint_add_ref(ep);
 
-	ep->device = device;
-	if ((err = bus->ops.register_endpoint(bus, ep, desc)))
+	if ((err = bus->ops.register_endpoint(bus, device, ep, desc)))
 		goto err_ep;
 
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 2cf28b9d069a6ca711200eb94197fa3b893ee323)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 8b8c164397f69eeebe6f33b2ef55e23bfa483828)
@@ -519,9 +519,4 @@
 	ddf_fun_set_name(dev->fun, "roothub");
 
-	dev->tt = (usb_tt_address_t) {
-		.address = -1,
-		.port = 0,
-	};
-
 	/* Assign an address to the device */
 	if ((err = bus_enumerate_device(hcd->bus, hcd, dev))) {
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision 2cf28b9d069a6ca711200eb94197fa3b893ee323)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision 8b8c164397f69eeebe6f33b2ef55e23bfa483828)
@@ -110,9 +110,9 @@
 
 	/** Reserve address early, we want pretty log messages */
-	const usb_address_t address = bus_reserve_default_address(bus, dev->speed);
-	if (address < 0) {
+	usb_address_t address;
+	if ((err = bus_request_address(bus, &address, false, dev->speed))) {
 		usb_log_error("Failed to reserve new address: %s.",
-		    str_error(address));
-		return address;
+		    str_error(err));
+		return err;
 	}
 	usb_log_debug("Device(%d): Reserved new address.", address);
@@ -159,4 +159,11 @@
 	}
 
+	/* We need to remove ep before we change the address */
+	if ((err = bus_remove_endpoint(bus, default_ep))) {
+		usb_log_error("Device(%d): Failed to unregister default target: %s", address, str_error(err));
+		goto err_address;
+	}
+	endpoint_del_ref(default_ep);
+
 	dev->address = address;
 
@@ -175,13 +182,6 @@
 		usb_log_error("Device(%d): Failed to register EP0: %s",
 		    address, str_error(err));
-		goto err_default_control_ep;
-	}
-
-	err = bus_remove_endpoint(bus, default_ep);
-	assert(err == EOK);
-	endpoint_del_ref(default_ep);
-
-	err = bus_release_address(bus, address);
-	assert(err == EOK);
+		goto err_address;
+	}
 
 	return EOK;
@@ -210,14 +210,22 @@
 	usb_log_debug("Found new %s speed USB device.", usb_str_speed(dev->speed));
 
-	/* Manage TT */
-	if (dev->hub->speed == USB_SPEED_HIGH && usb_speed_is_11(dev->speed)) {
-		/* For LS devices under HS hub */
-		/* TODO: How about SS hubs? */
-		dev->tt.address = dev->hub->address;
-		dev->tt.port = dev->port;
+	if (dev->hub) {
+		/* Manage TT */
+		if (dev->hub->speed == USB_SPEED_HIGH && usb_speed_is_11(dev->speed)) {
+			/* For LS devices under HS hub */
+			/* TODO: How about SS hubs? */
+			dev->tt.address = dev->hub->address;
+			dev->tt.port = dev->port;
+		}
+		else {
+			/* Inherit hub's TT */
+			dev->tt = dev->hub->tt;
+		}
 	}
 	else {
-		/* Inherit hub's TT */
-		dev->tt = dev->hub->tt;
+		dev->tt = (usb_tt_address_t) {
+			.address = -1,
+			.port = 0,
+		};
 	}
 
@@ -310,10 +318,10 @@
  * @param endpoint USB endpoint number.
  */
-static int usb2_bus_register_ep(bus_t *bus_base, endpoint_t *ep, const usb_endpoint_desc_t *desc)
+static int usb2_bus_register_ep(bus_t *bus_base, device_t *device, endpoint_t *ep, const usb_endpoint_desc_t *desc)
 {
 	usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
 	assert(ep);
 
-	assert(ep->device);
+	ep->device = device;
 
 	/* Extract USB2-related information from endpoint_desc */
@@ -347,4 +355,7 @@
 	usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
 	assert(ep);
+
+	list_remove(&ep->link);
+	ep->device = NULL;
 
 	bus->free_bw += ep->bandwidth;
