Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -442,5 +442,5 @@
 	assert(batch);
 
-	if (batch->ep->address == uhci_rh_get_address(&instance->rh))
+	if (batch->ep->target.address == uhci_rh_get_address(&instance->rh))
 		return uhci_rh_schedule(&instance->rh, batch);
 
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -43,4 +43,5 @@
 #include <ddi.h>
 #include <usb/host/hcd.h>
+#include <usb/host/usb2_bus.h>
 #include <usb/host/usb_transfer_batch.h>
 
@@ -100,4 +101,5 @@
 typedef struct hc {
 	uhci_rh_t rh;
+	usb2_bus_t bus;
 	/** Addresses of I/O registers */
 	uhci_regs_t *registers;
Index: uspace/drv/bus/usb/uhci/main.c
===================================================================
--- uspace/drv/bus/usb/uhci/main.c	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/drv/bus/usb/uhci/main.c	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -45,4 +45,5 @@
 #include <usb/debug.h>
 #include <usb/host/ddf_helpers.h>
+#include <usb/host/bandwidth.h>
 
 #include "hc.h"
@@ -57,5 +58,4 @@
 static const ddf_hc_driver_t uhci_hc_driver = {
         .claim = disable_legacy,
-        .hc_speed = USB_SPEED_FULL,
         .irq_code_gen = uhci_hc_gen_irq_code,
         .init = uhci_driver_init,
@@ -72,4 +72,6 @@
 static int uhci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res)
 {
+	int err;
+
 	assert(hcd);
 	assert(hcd_get_driver_data(hcd) == NULL);
@@ -79,11 +81,17 @@
 		return ENOMEM;
 
-	const int ret = hc_init(instance, res);
-	if (ret == EOK) {
-		hcd_set_implementation(hcd, instance, &uhci_hc_driver.ops);
-	} else {
-		free(instance);
-	}
-	return ret;
+	if ((err = hc_init(instance, res)) != EOK)
+		goto err;
+
+	if ((err = usb2_bus_init(&instance->bus, hcd, BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11)))
+		goto err;
+
+	hcd_set_implementation(hcd, instance, &uhci_hc_driver.ops, &instance->bus.base);
+
+	return EOK;
+
+err:
+	free(instance);
+	return err;
 }
 
@@ -105,5 +113,5 @@
 		hc_fini(hc);
 
-	hcd_set_implementation(hcd, NULL, NULL);
+	hcd_set_implementation(hcd, NULL, NULL, NULL);
 	free(hc);
 }
Index: uspace/drv/bus/usb/uhci/uhci_batch.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.c	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/drv/bus/usb/uhci/uhci_batch.c	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -228,7 +228,5 @@
 	    uhci_batch->usb_batch->ep->speed == USB_SPEED_LOW;
 	const size_t mps = uhci_batch->usb_batch->ep->max_packet_size;
-	const usb_target_t target = {{
-	    uhci_batch->usb_batch->ep->address,
-	    uhci_batch->usb_batch->ep->endpoint }};
+	const usb_target_t target = uhci_batch->usb_batch->ep->target;
 
 	int toggle = endpoint_toggle_get(uhci_batch->usb_batch->ep);
@@ -293,7 +291,5 @@
 	    uhci_batch->usb_batch->ep->speed == USB_SPEED_LOW;
 	const size_t mps = uhci_batch->usb_batch->ep->max_packet_size;
-	const usb_target_t target = {{
-	    uhci_batch->usb_batch->ep->address,
-	    uhci_batch->usb_batch->ep->endpoint }};
+	const usb_target_t target = uhci_batch->usb_batch->ep->target;
 
 	/* setup stage */
Index: uspace/drv/bus/usb/uhci/uhci_rh.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_rh.c	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/drv/bus/usb/uhci/uhci_rh.c	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -103,8 +103,5 @@
 	assert(batch);
 
-	const usb_target_t target = {{
-		.address = batch->ep->address,
-		.endpoint = batch->ep->endpoint
-	}};
+	const usb_target_t target = batch->ep->target;
 	do {
 		batch->error = virthub_base_request(&instance->base, target,
Index: uspace/lib/usbhost/include/usb/host/bandwidth.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/bandwidth.h	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/lib/usbhost/include/usb/host/bandwidth.h	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -49,7 +49,9 @@
 #define BANDWIDTH_AVAILABLE_USB20  1
 
-extern size_t bandwidth_count_usb11(usb_speed_t, usb_transfer_type_t, size_t, size_t);
+typedef struct endpoint endpoint_t;
 
-extern size_t bandwidth_count_usb20(usb_speed_t, usb_transfer_type_t, size_t, size_t);
+extern size_t bandwidth_count_usb11(endpoint_t *, size_t);
+
+extern size_t bandwidth_count_usb20(endpoint_t *, size_t);
 
 #endif
Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -58,8 +58,4 @@
 	/** Transfer scheduling, implement in device driver. */
 	schedule_hook_t schedule;
-	/** Hook called upon registering new endpoint. */
-	ep_add_hook_t ep_add_hook;
-	/** Hook called upon removing of an endpoint. */
-	ep_remove_hook_t ep_remove_hook;
 	/** Hook to be called on device interrupt, passes ARG1 */
 	interrupt_hook_t irq_hook;
Index: uspace/lib/usbhost/include/usb/host/usb2_bus.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/usb2_bus.h	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/lib/usbhost/include/usb/host/usb2_bus.h	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -50,5 +50,5 @@
 /** Endpoint management structure */
 typedef struct usb2_bus {
-	bus_t bus;			/**< Inheritance - keep this first */
+	bus_t base;			/**< Inheritance - keep this first */
 
 	/* Device bookkeeping */
Index: uspace/lib/usbhost/src/bandwidth.c
===================================================================
--- uspace/lib/usbhost/src/bandwidth.c	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/lib/usbhost/src/bandwidth.c	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -35,4 +35,5 @@
 
 #include <usb/host/bandwidth.h>
+#include <usb/host/endpoint.h>
 
 #include <assert.h>
@@ -46,7 +47,10 @@
  * @param max_packet_size Maximum bytes in one packet.
  */
-size_t bandwidth_count_usb11(usb_speed_t speed, usb_transfer_type_t type,
-    size_t size, size_t max_packet_size)
+size_t bandwidth_count_usb11(endpoint_t *ep, size_t size)
 {
+	assert(ep);
+
+	const usb_transfer_type_t type = ep->transfer_type;
+
 	/* We care about bandwidth only for interrupt and isochronous. */
 	if ((type != USB_TRANSFER_INTERRUPT)
@@ -55,4 +59,6 @@
 	}
 
+	const size_t max_packet_size = ep->max_packet_size;
+
 	const unsigned packet_count =
 	    (size + max_packet_size - 1) / max_packet_size;
@@ -60,5 +66,5 @@
 	 * transaction, but I did not find text in USB spec to confirm this */
 	/* NOTE: All data packets will be considered to be max_packet_size */
-	switch (speed)
+	switch (ep->speed)
 	{
 	case USB_SPEED_LOW:
@@ -94,7 +100,10 @@
  * @param max_packet_size Maximum bytes in one packet.
  */
-size_t bandwidth_count_usb20(usb_speed_t speed, usb_transfer_type_t type,
-    size_t size, size_t max_packet_size)
+size_t bandwidth_count_usb20(endpoint_t *ep, size_t size)
 {
+	assert(ep);
+
+	const usb_transfer_type_t type = ep->transfer_type;
+
 	/* We care about bandwidth only for interrupt and isochronous. */
 	if ((type != USB_TRANSFER_INTERRUPT)
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision d0db4a054c8e6bd467dcb0efc96ed554c82383be)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision fc0271a550440de57d1676cc1511bf5eedae0d8f)
@@ -291,8 +291,8 @@
 	assert(bus);
 
-	bus_init(&bus->bus, hcd);
-
-	bus->bus.ops = usb2_bus_ops;
-	bus->bus.ops.count_bw = count_bw;
+	bus_init(&bus->base, hcd);
+
+	bus->base.ops = usb2_bus_ops;
+	bus->base.ops.count_bw = count_bw;
 
 	bus->free_bw = available_bandwidth;
