Index: uspace/drv/bus/usb/ehci/ehci_bus.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 17783bf834f04658146efb887997863c396d0d3a)
+++ uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 53a9d022bcb8935f7625df033977ef9871d0244e)
@@ -101,5 +101,4 @@
 	ehci_bus_t *bus = (ehci_bus_t *) bus_base;
 	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
-	assert(fibril_mutex_is_locked(&bus_base->guard));
 
 	const int err = usb2_bus_ops.endpoint_register(ep);
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 17783bf834f04658146efb887997863c396d0d3a)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision 53a9d022bcb8935f7625df033977ef9871d0244e)
@@ -745,9 +745,4 @@
 	usb_log_debug2("Obtained USB address: %d.\n", dev->base.address);
 
-	/* From now on, the device is officially online, yay! */
-	fibril_mutex_lock(&dev->base.guard);
-	dev->base.online = true;
-	fibril_mutex_unlock(&dev->base.guard);
-
 	return EOK;
 
Index: uspace/lib/usbhost/src/bus.c
===================================================================
--- uspace/lib/usbhost/src/bus.c	(revision 17783bf834f04658146efb887997863c396d0d3a)
+++ uspace/lib/usbhost/src/bus.c	(revision 53a9d022bcb8935f7625df033977ef9871d0244e)
@@ -109,13 +109,14 @@
 		return ENOTSUP;
 
-	if (dev->online) {
-		fibril_mutex_unlock(&dev->guard);
+	if (dev->online)
 		return EINVAL;
-	}
 
 	const int r = ops->device_enumerate(dev);
-	if (!r) {
-		dev->online = true;
-
+	if (r)
+		return r;
+
+	dev->online = true;
+
+	if (dev->hub) {
 		fibril_mutex_lock(&dev->hub->guard);
 		list_append(&dev->link, &dev->hub->devices);
@@ -123,5 +124,5 @@
 	}
 
-	return r;
+	return EOK;
 }
 
@@ -192,7 +193,9 @@
 
 	/* Remove our device from our hub's children. */
-	fibril_mutex_lock(&dev->hub->guard);
-	list_remove(&dev->link);
-	fibril_mutex_unlock(&dev->hub->guard);
+	if (dev->hub) {
+		fibril_mutex_lock(&dev->hub->guard);
+		list_remove(&dev->link);
+		fibril_mutex_unlock(&dev->hub->guard);
+	}
 
 	/*
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision 17783bf834f04658146efb887997863c396d0d3a)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision 53a9d022bcb8935f7625df033977ef9871d0244e)
@@ -106,5 +106,5 @@
  *
  * Reserve address, configure the control EP, issue a SET_ADDRESS command.
- * Configure the device with the new address, mark the device as online.
+ * Configure the device with the new address,
  */
 static int address_device(device_t *dev)
@@ -160,5 +160,4 @@
 		goto err_address;
 	}
-	endpoint_del_ref(default_ep);
 
 	dev->address = address;
@@ -173,14 +172,8 @@
 	}
 
-	/* From now on, the device is officially online, yay! */
-	fibril_mutex_lock(&dev->guard);
-	dev->online = true;
-	fibril_mutex_unlock(&dev->guard);
-
 	return EOK;
 
 err_default_control_ep:
 	bus_endpoint_remove(default_ep);
-	endpoint_del_ref(default_ep);
 err_address:
 	release_address(bus, address);
@@ -235,5 +228,5 @@
 {
 	usb2_bus_t *bus = bus_to_usb2_bus(ep->device->bus);
-	assert(fibril_mutex_is_locked(&bus->base.guard));
+	assert(fibril_mutex_is_locked(&ep->device->guard));
 	assert(ep);
 
