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,
