Index: uspace/drv/bus/usb/ehci/hw_struct/queue_head.c
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 01d9707def50a27e9dac22665ae9b52e4e869ffa)
+++ uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 4c25c2fb2df98f402ead06e842c2077acddf081e)
@@ -83,8 +83,9 @@
 	uint32_t ep_cap = QH_EP_CAP_C_MASK_SET(3 << 2) |
 		    QH_EP_CAP_MULTI_SET(ep->packets_per_uframe);
-	if (ep->device->speed != USB_SPEED_HIGH) {
+	if (usb_speed_is_11(ep->device->speed)) {
+		assert(ep->device->tt.dev != NULL);
 		ep_cap |=
 		    QH_EP_CAP_TT_PORT_SET(ep->device->tt.port) |
-		    QH_EP_CAP_TT_ADDR_SET(ep->device->tt.address);
+		    QH_EP_CAP_TT_ADDR_SET(ep->device->tt.dev->address);
 	}
 	if (ep->transfer_type == USB_TRANSFER_INTERRUPT) {
Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision 01d9707def50a27e9dac22665ae9b52e4e869ffa)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision 4c25c2fb2df98f402ead06e842c2077acddf081e)
@@ -149,6 +149,4 @@
 	xhci_device_t *xhci_dev = xhci_device_get(dev);
 
-	hcd_setup_device_tt(dev);
-
 	/* Calculate route string */
 	xhci_device_t *xhci_hub = xhci_device_get(dev->hub);
Index: uspace/lib/drv/include/usb_iface.h
===================================================================
--- uspace/lib/drv/include/usb_iface.h	(revision 01d9707def50a27e9dac22665ae9b52e4e869ffa)
+++ uspace/lib/drv/include/usb_iface.h	(revision 4c25c2fb2df98f402ead06e842c2077acddf081e)
@@ -67,11 +67,4 @@
 typedef int16_t usb_address_t;
 
-/** USB address for the purposes of Transaction Translation.
- */
-typedef struct {
-	usb_address_t address;
-	unsigned port;
-} usb_tt_address_t;
-
 /** USB transfer type. */
 typedef enum {
Index: uspace/lib/usbhost/include/usb/host/bus.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/bus.h	(revision 01d9707def50a27e9dac22665ae9b52e4e869ffa)
+++ uspace/lib/usbhost/include/usb/host/bus.h	(revision 4c25c2fb2df98f402ead06e842c2077acddf081e)
@@ -71,5 +71,8 @@
 
 	/* Transaction translator */
-	usb_tt_address_t tt;
+	struct {
+		device_t *dev;
+		unsigned port;
+	} tt;
 
 	/* The following are not set by the library */
Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision 01d9707def50a27e9dac22665ae9b52e4e869ffa)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision 4c25c2fb2df98f402ead06e842c2077acddf081e)
@@ -114,5 +114,4 @@
  */
 extern int hcd_get_ep0_max_packet_size(uint16_t *, bus_t *, device_t *);
-extern void hcd_setup_device_tt(device_t *);
 
 /** How many toggles need to be reset */
Index: uspace/lib/usbhost/src/bus.c
===================================================================
--- uspace/lib/usbhost/src/bus.c	(revision 01d9707def50a27e9dac22665ae9b52e4e869ffa)
+++ uspace/lib/usbhost/src/bus.c	(revision 4c25c2fb2df98f402ead06e842c2077acddf081e)
@@ -97,4 +97,28 @@
 
 /**
+ * Setup devices Transaction Translation.
+ *
+ * This applies for Low/Full speed devices under High speed hub only. Other
+ * devices just inherit TT from the hub.
+ *
+ * Roothub must be handled specially.
+ */
+static void device_setup_tt(device_t *dev)
+{
+	if (!dev->hub)
+		return;
+
+	if (dev->hub->speed == USB_SPEED_HIGH && usb_speed_is_11(dev->speed)) {
+		/* For LS devices under HS hub */
+		dev->tt.dev = dev->hub;
+		dev->tt.port = dev->port;
+	}
+	else {
+		/* Inherit hub's TT */
+		dev->tt = dev->hub->tt;
+	}
+}
+
+/**
  * Invoke the device_enumerate bus operation.
  *
@@ -111,4 +135,6 @@
 	if (dev->online)
 		return EINVAL;
+
+	device_setup_tt(dev);
 
 	const int r = ops->device_enumerate(dev);
Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision 01d9707def50a27e9dac22665ae9b52e4e869ffa)
+++ uspace/lib/usbhost/src/hcd.c	(revision 4c25c2fb2df98f402ead06e842c2077acddf081e)
@@ -426,28 +426,4 @@
 	}
 	return EOK;
-}
-
-/**
- * Setup devices Transaction Translation.
- *
- * This applies for Low/Full speed devices under High speed hub only. Other
- * devices just inherit TT from the hub.
- *
- * Roothub must be handled specially.
- */
-void hcd_setup_device_tt(device_t *dev)
-{
-	if (!dev->hub)
-		return;
-
-	if (dev->hub->speed == USB_SPEED_HIGH && usb_speed_is_11(dev->speed)) {
-		/* For LS devices under HS hub */
-		dev->tt.address = dev->hub->address;
-		dev->tt.port = dev->port;
-	}
-	else {
-		/* Inherit hub's TT */
-		dev->tt = dev->hub->tt;
-	}
 }
 
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision 01d9707def50a27e9dac22665ae9b52e4e869ffa)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision 4c25c2fb2df98f402ead06e842c2077acddf081e)
@@ -196,14 +196,4 @@
 	usb_log_debug("Found new %s speed USB device.", usb_str_speed(dev->speed));
 
-	if (!dev->hub) {
-		/* The device is the roothub */
-		dev->tt = (usb_tt_address_t) {
-			.address = -1,
-			.port = 0,
-		};
-	} else {
-		hcd_setup_device_tt(dev);
-	}
-
 	/* Assign an address to the device */
 	if ((err = address_device(dev))) {
