Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -473,4 +473,12 @@
 }
 
+/**
+ * Setup roothub as a virtual hub.
+ */
+int hc_setup_roothub(hc_device_t *hcd)
+{
+	return hc_setup_virtual_root_hub(hcd, USB_SPEED_HIGH);
+}
+
 /** Initialize memory structures used by the EHCI hcd.
  *
Index: uspace/drv/bus/usb/ehci/hc.h
===================================================================
--- uspace/drv/bus/usb/ehci/hc.h	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/ehci/hc.h	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -102,4 +102,5 @@
 int hc_add(hc_device_t *, const hw_res_list_parsed_t *);
 int hc_start(hc_device_t *);
+int hc_setup_roothub(hc_device_t *);
 int hc_gen_irq_code(irq_code_t *, hc_device_t *, const hw_res_list_parsed_t *);
 int hc_gone(hc_device_t *);
Index: uspace/drv/bus/usb/ehci/hw_struct/queue_head.c
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -46,7 +46,4 @@
 	[USB_SPEED_FULL] = QH_EP_CHAR_EPS_FS,
 	[USB_SPEED_HIGH] = QH_EP_CHAR_EPS_HS,
-
-	/* Solely for the roothub */
-	[USB_SPEED_MAX] = 0,
 };
 
Index: uspace/drv/bus/usb/ehci/main.c
===================================================================
--- uspace/drv/bus/usb/ehci/main.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/ehci/main.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -37,5 +37,4 @@
 #include <io/logctl.h>
 #include <usb/host/hcd.h>
-#include <usb/host/utility.h>
 
 #include "res.h"
@@ -52,5 +51,5 @@
 	.claim = disable_legacy,
 	.start = hc_start,
-	.setup_root_hub = hc_setup_virtual_root_hub,
+	.setup_root_hub = hc_setup_roothub,
 	.hc_gone = hc_gone,
 };
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -540,4 +540,12 @@
 }
 
+/**
+ * Setup roothub as a virtual hub.
+ */
+int hc_setup_roothub(hc_device_t *hcd)
+{
+	return hc_setup_virtual_root_hub(hcd, USB_SPEED_FULL);
+}
+
 /** Initialize schedule queues
  *
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -93,4 +93,5 @@
 extern int hc_gain_control(hc_device_t *);
 extern int hc_start(hc_device_t *);
+extern int hc_setup_roothub(hc_device_t *);
 extern int hc_gone(hc_device_t *);
 
Index: uspace/drv/bus/usb/ohci/main.c
===================================================================
--- uspace/drv/bus/usb/ohci/main.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/ohci/main.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -43,5 +43,4 @@
 
 #include <usb/debug.h>
-#include <usb/host/utility.h>
 
 #include "hc.h"
@@ -58,5 +57,5 @@
 	.claim = hc_gain_control,
 	.start = hc_start,
-	.setup_root_hub = hc_setup_virtual_root_hub,
+	.setup_root_hub = hc_setup_roothub,
 	.hc_gone = hc_gone,
 };
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -51,4 +51,5 @@
 #include <usb/host/utils/malloc32.h>
 #include <usb/host/bandwidth.h>
+#include <usb/host/utility.h>
 
 #include "uhci_batch.h"
@@ -258,4 +259,9 @@
 }
 
+int hc_setup_roothub(hc_device_t *hcd)
+{
+	return hc_setup_virtual_root_hub(hcd, USB_SPEED_FULL);
+}
+
 /** Safely dispose host controller internal structures
  *
@@ -330,5 +336,5 @@
 
 	// Check for the roothub, as it does not schedule into lists
-	if (ep->device->speed == USB_SPEED_MAX) {
+	if (ep->device->address == uhci_rh_get_address(&hc->rh)) {
 		// FIXME: We shall check the roothub for active transfer. But
 		// as it is polling, there is no way to make it stop doing so.
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -150,4 +150,5 @@
 extern int hc_gen_irq_code(irq_code_t *, hc_device_t *, const hw_res_list_parsed_t *);
 extern int hc_start(hc_device_t *);
+extern int hc_setup_roothub(hc_device_t *);
 extern int hc_gone(hc_device_t *);
 
Index: uspace/drv/bus/usb/uhci/main.c
===================================================================
--- uspace/drv/bus/usb/uhci/main.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/uhci/main.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -58,5 +58,5 @@
 	.hc_add = hc_add,
 	.start = hc_start,
-	.setup_root_hub = hc_setup_virtual_root_hub,
+	.setup_root_hub = hc_setup_roothub,
 	.hc_gone = hc_gone,
 };
Index: uspace/drv/bus/usb/usbhub/port.c
===================================================================
--- uspace/drv/bus/usb/usbhub/port.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/usbhub/port.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -89,4 +89,13 @@
 }
 
+
+static usb_speed_t get_port_speed(usb_hub_port_t *port, uint32_t status)
+{
+	assert(port);
+	assert(port->hub);
+
+	return usb_port_speed(port->hub->speed, status);
+}
+
 /**
  * Routine for adding a new device.
@@ -203,5 +212,5 @@
 		// The connecting fibril do not touch speed until the port is enabled,
 		// so we do not have to lock
-		port->speed = usb_port_speed(status);
+		port->speed = get_port_speed(port, status);
 		usb_port_enabled(&port->base);
 	} else
Index: uspace/drv/bus/usb/usbhub/status.h
===================================================================
--- uspace/drv/bus/usb/usbhub/status.h	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/usbhub/status.h	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -97,18 +97,12 @@
     (uint32_usb2host(1 << (16 + USB_HUB_FEATURE_C_HUB_LOCAL_POWER)))
 
-
-/**
- * speed getter for port status
- *
- * @param status
- * @return speed of usb device (for more see usb specification)
- */
-static inline usb_speed_t usb_port_speed(usb_port_status_t status)
+static inline usb_speed_t usb_port_speed(usb_speed_t hub_speed, uint32_t status)
 {
+	if (hub_speed == USB_SPEED_SUPER)
+		return USB_SPEED_SUPER;
+	if (hub_speed == USB_SPEED_HIGH && (status & USB_HUB_PORT_STATUS_HIGH_SPEED))
+		return USB_SPEED_HIGH;
 	if ((status & USB_HUB_PORT_STATUS_LOW_SPEED) != 0)
 		return USB_SPEED_LOW;
-	if ((status & USB_HUB_PORT_STATUS_HIGH_SPEED) != 0)
-		return USB_SPEED_HIGH;
-	/* TODO: add super speed */
 	return USB_SPEED_FULL;
 }
Index: uspace/drv/bus/usb/usbhub/usbhub.c
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/usbhub/usbhub.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -116,4 +116,5 @@
 	}
 	hub_dev->usb_device = usb_dev;
+	hub_dev->speed = usb_device_get_speed(usb_dev);
 
 	fibril_mutex_initialize(&hub_dev->default_address_guard);
@@ -187,5 +188,6 @@
 	}
 
-	usb_log_info("Controlling hub '%s' (%p: %zu ports).",
+	usb_log_info("Controlling %s-speed hub '%s' (%p: %zu ports).",
+	    usb_str_speed(hub_dev->speed),
 	    usb_device_get_name(hub_dev->usb_device), hub_dev,
 	    hub_dev->port_count);
Index: uspace/drv/bus/usb/usbhub/usbhub.h
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.h	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/usbhub/usbhub.h	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -58,4 +58,6 @@
 	/** Port structures, one for each port */
 	usb_hub_port_t *ports;
+	/** Speed of the hub */
+	usb_speed_t speed;
 	/** Generic usb device data*/
 	usb_device_t *usb_device;
Index: uspace/drv/bus/usb/vhc/main.c
===================================================================
--- uspace/drv/bus/usb/vhc/main.c	(revision 60d3f359edf3beef1db0f60cb5ade137997c2a1f)
+++ uspace/drv/bus/usb/vhc/main.c	(revision 129b821fb30858c35df3ba6ff80bf8ccc51442de)
@@ -107,5 +107,5 @@
 	 * needs to be ready at this time.
 	 */
-	ret = hc_setup_virtual_root_hub(&vhc->base);
+	ret = hc_setup_virtual_root_hub(&vhc->base, USB_SPEED_HIGH);
 	if (ret != EOK) {
 		usb_log_error("Failed to init VHC root hub: %s",
