Index: uspace/lib/usbhost/src/bus.c
===================================================================
--- uspace/lib/usbhost/src/bus.c	(revision 56db65dc41b80ff74d067c9103026ffe34cc8e46)
+++ uspace/lib/usbhost/src/bus.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
@@ -66,33 +66,4 @@
 }
 
-int bus_add_ep(bus_t *bus, device_t *device, const usb_endpoint_desc_t *desc)
-{
-	assert(bus);
-	assert(device);
-
-	/* Temporary reference */
-	endpoint_t *ep = bus_create_endpoint(bus);
-	if (!ep)
-		return ENOMEM;
-
-	ep->device = device;
-	const int err = bus_register_endpoint(bus, ep, desc);
-
-	/* drop Temporary reference */
-	endpoint_del_ref(ep);
-
-	return err;
-}
-
-int bus_remove_ep(bus_t *bus, device_t *dev, usb_target_t target, usb_direction_t dir)
-{
-	assert(bus);
-	endpoint_t *ep = bus_find_endpoint(bus, dev, target, dir);
-	if (!ep)
-		return ENOENT;
-
-	return bus_unregister_endpoint(bus, ep);
-}
-
 int device_set_default_name(device_t *dev)
 {
@@ -136,50 +107,37 @@
 }
 
-endpoint_t *bus_create_endpoint(bus_t *bus)
-{
-	assert(bus);
-
-	fibril_mutex_lock(&bus->guard);
+int bus_add_endpoint(bus_t *bus, device_t *device, const usb_endpoint_desc_t *desc, endpoint_t **out_ep)
+{
+	int err = ENOMEM;
+
+	assert(bus);
+	assert(device);
+
+	fibril_mutex_lock(&bus->guard);
+
 	endpoint_t *ep = bus->ops.create_endpoint(bus);
-	if (ep) {
-		/* Exporting reference */
-		endpoint_add_ref(ep);
-	}
-	fibril_mutex_unlock(&bus->guard);
-
-	return ep;
-}
-
-int bus_register_endpoint(bus_t *bus, endpoint_t *ep, const usb_endpoint_desc_t *desc)
-{
-	assert(bus);
-	assert(ep);
+	if (!ep)
+		goto err;
 
 	/* Bus reference */
 	endpoint_add_ref(ep);
 
-	fibril_mutex_lock(&bus->guard);
-	const int r = bus->ops.register_endpoint(bus, ep, desc);
-	fibril_mutex_unlock(&bus->guard);
-
-	return r;
-}
-
-int bus_unregister_endpoint(bus_t *bus, endpoint_t *ep)
-{
-	assert(bus);
-	assert(ep);
-
-	fibril_mutex_lock(&bus->guard);
-	const int r = bus->ops.unregister_endpoint(bus, ep);
-	fibril_mutex_unlock(&bus->guard);
-
-	if (r)
-		return r;
-
-	/* Bus reference */
+	ep->device = device;
+	if ((err = bus->ops.register_endpoint(bus, ep, desc)))
+		goto err_ep;
+
+	if (out_ep) {
+		endpoint_add_ref(ep);
+		*out_ep = ep;
+	}
+
+	fibril_mutex_unlock(&bus->guard);
+	return EOK;
+
+err_ep:
 	endpoint_del_ref(ep);
-
-	return EOK;
+err:
+	fibril_mutex_unlock(&bus->guard);
+	return err;
 }
 
@@ -201,4 +159,22 @@
 }
 
+int bus_remove_endpoint(bus_t *bus, endpoint_t *ep)
+{
+	assert(bus);
+	assert(ep);
+
+	fibril_mutex_lock(&bus->guard);
+	const int r = bus->ops.unregister_endpoint(bus, ep);
+	fibril_mutex_unlock(&bus->guard);
+
+	if (r)
+		return r;
+
+	/* Bus reference */
+	endpoint_del_ref(ep);
+
+	return EOK;
+}
+
 int bus_request_address(bus_t *bus, usb_address_t *hint, bool strict, usb_speed_t speed)
 {
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 56db65dc41b80ff74d067c9103026ffe34cc8e46)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
@@ -104,5 +104,5 @@
 		endpoint_desc->max_packet_size, endpoint_desc->usb2.polling_interval);
 
-	return bus_add_ep(hcd->bus, dev, endpoint_desc);
+	return bus_add_endpoint(hcd->bus, dev, endpoint_desc, NULL);
 }
 
@@ -130,5 +130,10 @@
 		dev->address, endpoint_desc->endpoint_no,
 		usb_str_direction(endpoint_desc->direction));
-	return bus_remove_ep(hcd->bus, dev, target, endpoint_desc->direction);
+
+	endpoint_t *ep = bus_find_endpoint(hcd->bus, dev, target, endpoint_desc->direction);
+	if (!ep)
+		return ENOENT;
+
+	return bus_remove_endpoint(hcd->bus, ep);
 }
 
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision 56db65dc41b80ff74d067c9103026ffe34cc8e46)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision c3d926f3ce91a6e5d315f2628cac95ccdcbebeff)
@@ -120,5 +120,7 @@
 	/* Add default pipe on default address */
 	usb_log_debug("Device(%d): Adding default target (0:0)", address);
-	err = bus_add_ep(bus, dev, &usb2_default_control_ep);
+
+	endpoint_t *default_ep;
+	err = bus_add_endpoint(bus, dev, &usb2_default_control_ep, &default_ep);
 	if (err != EOK) {
 		usb_log_error("Device(%d): Failed to add default target: %s.",
@@ -169,5 +171,5 @@
 	/* Register EP on the new address */
 	usb_log_debug("Device(%d): Registering control EP.", address);
-	err = bus_add_ep(bus, dev, &control_ep);
+	err = bus_add_endpoint(bus, dev, &control_ep, NULL);
 	if (err != EOK) {
 		usb_log_error("Device(%d): Failed to register EP0: %s",
@@ -176,9 +178,16 @@
 	}
 
-	bus_remove_ep(bus, dev, usb2_default_target, USB_DIRECTION_BOTH);
+	err = bus_remove_endpoint(bus, default_ep);
+	assert(err == EOK);
+	endpoint_del_ref(default_ep);
+
+	err = bus_release_address(bus, address);
+	assert(err == EOK);
+
 	return EOK;
 
 err_default_control_ep:
-	bus_remove_ep(bus, dev, usb2_default_target, USB_DIRECTION_BOTH);
+	bus_remove_endpoint(bus, default_ep);
+	endpoint_del_ref(default_ep);
 err_address:
 	bus_release_address(bus, address);
