Index: uspace/lib/usbhost/include/usb/host/ddf_helpers.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/ddf_helpers.h	(revision 366e9b6e9dc1eec138a5ceadc18883937ba67764)
+++ uspace/lib/usbhost/include/usb/host/ddf_helpers.h	(revision 867b3757d6898c102509e02a34857fa95c832191)
@@ -49,5 +49,5 @@
 typedef int (*claim_t)(hcd_t *, ddf_dev_t *);
 typedef int (*driver_start_t)(hcd_t *, bool irq);
-typedef int (*setup_root_hub_t)(ddf_dev_t *);
+typedef int (*setup_root_hub_t)(hcd_t *, ddf_dev_t *);
 
 typedef void (*driver_stop_t)(hcd_t *);
@@ -81,5 +81,5 @@
 void hcd_ddf_clean_hc(ddf_dev_t *device);
 
-int hcd_setup_virtual_root_hub(ddf_dev_t *);
+int hcd_setup_virtual_root_hub(hcd_t *, ddf_dev_t *);
 
 hcd_t *dev_to_hcd(ddf_dev_t *dev);
@@ -93,4 +93,15 @@
 void ddf_hcd_gen_irq_handler(ipc_callid_t iid, ipc_call_t *call, ddf_dev_t *dev);
 
+/* For xHCI, we need to drive the roothub without roothub having assigned an
+ * address. Thus we cannot create function for it, and we have to carry the
+ * usb_dev_t somewhere.
+ *
+ * This is sort of hacky, but at least does not expose the internals of ddf_helpers.
+ */
+typedef struct hcd_roothub hcd_roothub_t;
+
+hcd_roothub_t *hcd_roothub_create(hcd_t *, ddf_dev_t *, usb_speed_t);
+int hcd_roothub_new_device(hcd_roothub_t *, unsigned port);
+
 #endif
 
Index: uspace/lib/usbhost/include/usb/host/endpoint.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/endpoint.h	(revision 366e9b6e9dc1eec138a5ceadc18883937ba67764)
+++ uspace/lib/usbhost/include/usb/host/endpoint.h	(revision 867b3757d6898c102509e02a34857fa95c832191)
@@ -79,8 +79,5 @@
 	fibril_condvar_t avail;
 	/** High speed TT data */
-	struct {
-		usb_address_t address;
-		unsigned port;
-	} tt;
+	usb_tt_address_t tt;
 
 	/* This structure is meant to be extended by overriding. */
Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision 366e9b6e9dc1eec138a5ceadc18883937ba67764)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision 867b3757d6898c102509e02a34857fa95c832191)
@@ -50,8 +50,7 @@
 
 typedef int (*schedule_hook_t)(hcd_t *, usb_transfer_batch_t *);
-typedef int (*ep_add_hook_t)(hcd_t *, endpoint_t *);
-typedef void (*ep_remove_hook_t)(hcd_t *, endpoint_t *);
 typedef void (*interrupt_hook_t)(hcd_t *, uint32_t);
 typedef int (*status_hook_t)(hcd_t *, uint32_t *);
+typedef int (*address_device_hook_t)(hcd_t *, usb_speed_t, usb_tt_address_t, usb_address_t *);
 
 typedef struct {
@@ -62,4 +61,6 @@
 	/** Periodic polling hook */
 	status_hook_t status_hook;
+	/** Hook to setup device address */
+	address_device_hook_t address_device;
 } hcd_ops_t;
 
@@ -112,6 +113,5 @@
 
 extern int hcd_add_ep(hcd_t *, usb_target_t, usb_direction_t,
-    usb_transfer_type_t, size_t, unsigned int, size_t, usb_address_t,
-    unsigned int);
+    usb_transfer_type_t, size_t, unsigned int, size_t, usb_tt_address_t);
 
 extern int hcd_remove_ep(hcd_t *, usb_target_t, usb_direction_t);
