Index: uspace/drv/bus/usb/ehci/ehci_rh.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_rh.c	(revision 32b2a6f2ada68012ac1adeae0f0a262a7b8653d9)
+++ uspace/drv/bus/usb/ehci/ehci_rh.c	(revision cd3fa47a6891613f98a1a9cb52de0d8ccc74758a)
@@ -247,5 +247,5 @@
 
 #define BIT_VAL(val, bit)   ((val & bit) ? 1 : 0)
-#define EHCI2USB(val, bit, feat)   (BIT_VAL(val, bit) << feat)
+#define EHCI2USB(val, bit, mask)   (BIT_VAL(val, bit) ? mask : 0)
 
 /** Port status request handler.
@@ -269,20 +269,20 @@
 	const uint32_t reg = EHCI_RD(hub->registers->portsc[port]);
 	const uint32_t status = uint32_host2usb(
-	    EHCI2USB(reg, USB_PORTSC_CONNECT_FLAG, USB_HUB_FEATURE_PORT_CONNECTION) |
-	    EHCI2USB(reg, USB_PORTSC_ENABLED_FLAG, USB_HUB_FEATURE_PORT_ENABLE) |
-	    EHCI2USB(reg, USB_PORTSC_SUSPEND_FLAG, USB_HUB_FEATURE_PORT_SUSPEND) |
-	    EHCI2USB(reg, USB_PORTSC_OC_ACTIVE_FLAG, USB_HUB_FEATURE_PORT_OVER_CURRENT) |
-	    EHCI2USB(reg, USB_PORTSC_PORT_RESET_FLAG, USB_HUB_FEATURE_PORT_RESET) |
-	    EHCI2USB(reg, USB_PORTSC_PORT_POWER_FLAG, USB_HUB_FEATURE_PORT_POWER) |
+	    EHCI2USB(reg, USB_PORTSC_CONNECT_FLAG, USB_HUB_PORT_STATUS_CONNECTION) |
+	    EHCI2USB(reg, USB_PORTSC_ENABLED_FLAG, USB_HUB_PORT_STATUS_ENABLE) |
+	    EHCI2USB(reg, USB_PORTSC_SUSPEND_FLAG, USB2_HUB_PORT_STATUS_SUSPEND) |
+	    EHCI2USB(reg, USB_PORTSC_OC_ACTIVE_FLAG, USB_HUB_PORT_STATUS_OC) |
+	    EHCI2USB(reg, USB_PORTSC_PORT_RESET_FLAG, USB_HUB_PORT_STATUS_RESET) |
+	    EHCI2USB(reg, USB_PORTSC_PORT_POWER_FLAG, USB2_HUB_PORT_STATUS_POWER) |
 	    (((reg & USB_PORTSC_LINE_STATUS_MASK) == USB_PORTSC_LINE_STATUS_K) ?
-	        (1 << USB_HUB_FEATURE_PORT_LOW_SPEED) : 0) |
-	    ((reg & USB_PORTSC_PORT_OWNER_FLAG) ? 0 : (1 << USB_HUB_FEATURE_PORT_HIGH_SPEED)) |
-	    EHCI2USB(reg, USB_PORTSC_PORT_TEST_MASK, 11) |
-	    EHCI2USB(reg, USB_PORTSC_INDICATOR_MASK, 12) |
-	    EHCI2USB(reg, USB_PORTSC_CONNECT_CH_FLAG, USB_HUB_FEATURE_C_PORT_CONNECTION) |
-	    EHCI2USB(reg, USB_PORTSC_EN_CHANGE_FLAG, USB_HUB_FEATURE_C_PORT_ENABLE) |
-	    (hub->resume_flag[port] ? (1 << USB_HUB_FEATURE_C_PORT_SUSPEND) : 0) |
-	    EHCI2USB(reg, USB_PORTSC_OC_CHANGE_FLAG, USB_HUB_FEATURE_C_PORT_OVER_CURRENT) |
-	    (hub->reset_flag[port] ? (1 << USB_HUB_FEATURE_C_PORT_RESET): 0)
+	        (USB2_HUB_PORT_STATUS_LOW_SPEED) : 0) |
+	    ((reg & USB_PORTSC_PORT_OWNER_FLAG) ? 0 : USB2_HUB_PORT_STATUS_HIGH_SPEED) |
+	    EHCI2USB(reg, USB_PORTSC_PORT_TEST_MASK, USB2_HUB_PORT_STATUS_TEST) |
+	    EHCI2USB(reg, USB_PORTSC_INDICATOR_MASK, USB2_HUB_PORT_STATUS_INDICATOR) |
+	    EHCI2USB(reg, USB_PORTSC_CONNECT_CH_FLAG, USB_HUB_PORT_STATUS_C_CONNECTION) |
+	    EHCI2USB(reg, USB_PORTSC_EN_CHANGE_FLAG, USB2_HUB_PORT_STATUS_C_ENABLE) |
+	    (hub->resume_flag[port] ? USB2_HUB_PORT_STATUS_C_SUSPEND : 0) |
+	    EHCI2USB(reg, USB_PORTSC_OC_CHANGE_FLAG, USB_HUB_PORT_STATUS_C_OC) |
+	    (hub->reset_flag[port] ? USB_HUB_PORT_STATUS_C_RESET: 0)
 	);
 	/* Note feature numbers for test and indicator feature do not
@@ -385,5 +385,5 @@
 		return EOK;
 
-	case USB_HUB_FEATURE_PORT_ENABLE:         /*1*/
+	case USB2_HUB_FEATURE_PORT_ENABLE:         /*1*/
 		usb_log_debug2("RH(%p-%u): Clear port enable.", hub, port);
 		EHCI_CLR(hub->registers->portsc[port],
@@ -391,5 +391,5 @@
 		return EOK;
 
-	case USB_HUB_FEATURE_PORT_SUSPEND:        /*2*/
+	case USB2_HUB_FEATURE_PORT_SUSPEND:        /*2*/
 		usb_log_debug2("RH(%p-%u): Clear port suspend.", hub, port);
 		/* If not in suspend it's noop */
@@ -409,5 +409,5 @@
 		    USB_PORTSC_CONNECT_CH_FLAG);
 		return EOK;
-	case USB_HUB_FEATURE_C_PORT_ENABLE:       /*17*/
+	case USB2_HUB_FEATURE_C_PORT_ENABLE:       /*17*/
 		usb_log_debug2("RH(%p-%u): Clear port enable change.",
 		    hub, port);
@@ -421,5 +421,5 @@
 		    USB_PORTSC_OC_CHANGE_FLAG);
 		return EOK;
-	case USB_HUB_FEATURE_C_PORT_SUSPEND:      /*18*/
+	case USB2_HUB_FEATURE_C_PORT_SUSPEND:      /*18*/
 		usb_log_debug2("RH(%p-%u): Clear port suspend change.",
 		    hub, port);
@@ -456,10 +456,10 @@
 	const unsigned feature = uint16_usb2host(setup_packet->value);
 	switch (feature) {
-	case USB_HUB_FEATURE_PORT_ENABLE:  /*1*/
+	case USB2_HUB_FEATURE_PORT_ENABLE:  /*1*/
 		usb_log_debug2("RH(%p-%u): Set port enable.", hub, port);
 		EHCI_SET(hub->registers->portsc[port],
 		    USB_PORTSC_ENABLED_FLAG);
 		return EOK;
-	case USB_HUB_FEATURE_PORT_SUSPEND: /*2*/
+	case USB2_HUB_FEATURE_PORT_SUSPEND: /*2*/
 		usb_log_debug2("RH(%p-%u): Set port suspend.", hub, port);
 		EHCI_SET(hub->registers->portsc[port],
Index: uspace/drv/bus/usb/ohci/ohci_rh.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_rh.c	(revision 32b2a6f2ada68012ac1adeae0f0a262a7b8653d9)
+++ uspace/drv/bus/usb/ohci/ohci_rh.c	(revision cd3fa47a6891613f98a1a9cb52de0d8ccc74758a)
@@ -340,10 +340,10 @@
 		}
 
-	case USB_HUB_FEATURE_PORT_ENABLE:         /*1*/
+	case USB2_HUB_FEATURE_PORT_ENABLE:         /*1*/
 		OHCI_WR(hub->registers->rh_port_status[port],
 		    RHPS_CLEAR_PORT_ENABLE);
 		return EOK;
 
-	case USB_HUB_FEATURE_PORT_SUSPEND:        /*2*/
+	case USB2_HUB_FEATURE_PORT_SUSPEND:        /*2*/
 		OHCI_WR(hub->registers->rh_port_status[port],
 		    RHPS_CLEAR_PORT_SUSPEND);
@@ -351,6 +351,6 @@
 
 	case USB_HUB_FEATURE_C_PORT_CONNECTION:   /*16*/
-	case USB_HUB_FEATURE_C_PORT_ENABLE:       /*17*/
-	case USB_HUB_FEATURE_C_PORT_SUSPEND:      /*18*/
+	case USB2_HUB_FEATURE_C_PORT_ENABLE:       /*17*/
+	case USB2_HUB_FEATURE_C_PORT_SUSPEND:      /*18*/
 	case USB_HUB_FEATURE_C_PORT_OVER_CURRENT: /*19*/
 	case USB_HUB_FEATURE_C_PORT_RESET:        /*20*/
@@ -401,6 +401,6 @@
 		/* Fall through, for per port power */
 		/* Fallthrough */
-	case USB_HUB_FEATURE_PORT_ENABLE:  /*1*/
-	case USB_HUB_FEATURE_PORT_SUSPEND: /*2*/
+	case USB2_HUB_FEATURE_PORT_ENABLE:  /*1*/
+	case USB2_HUB_FEATURE_PORT_SUSPEND: /*2*/
 	case USB_HUB_FEATURE_PORT_RESET:   /*4*/
 		usb_log_debug2("Setting port POWER, ENABLE, SUSPEND or RESET "
Index: uspace/drv/bus/usb/uhci/uhci_rh.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_rh.c	(revision 32b2a6f2ada68012ac1adeae0f0a262a7b8653d9)
+++ uspace/drv/bus/usb/uhci/uhci_rh.c	(revision cd3fa47a6891613f98a1a9cb52de0d8ccc74758a)
@@ -210,6 +210,6 @@
 #define BIT_VAL(val, bit) \
 	((val & bit) ? 1 : 0)
-#define UHCI2USB(val, bit, feat) \
-	(BIT_VAL(val, bit) << feat)
+#define UHCI2USB(val, bit, mask) \
+	(BIT_VAL(val, bit) ? (mask) : 0)
 
 /** Port status request handler.
@@ -236,14 +236,14 @@
 	const uint16_t val = pio_read_16(hub->ports[port]);
 	const uint32_t status = uint32_host2usb(
-	    UHCI2USB(val, STATUS_CONNECTED, USB_HUB_FEATURE_PORT_CONNECTION) |
-	    UHCI2USB(val, STATUS_ENABLED, USB_HUB_FEATURE_PORT_ENABLE) |
-	    UHCI2USB(val, STATUS_SUSPEND, USB_HUB_FEATURE_PORT_SUSPEND) |
-	    UHCI2USB(val, STATUS_IN_RESET, USB_HUB_FEATURE_PORT_RESET) |
-	    UHCI2USB(val, STATUS_ALWAYS_ONE, USB_HUB_FEATURE_PORT_POWER) |
-	    UHCI2USB(val, STATUS_LOW_SPEED, USB_HUB_FEATURE_PORT_LOW_SPEED) |
-	    UHCI2USB(val, STATUS_CONNECTED_CHANGED, USB_HUB_FEATURE_C_PORT_CONNECTION) |
-	    UHCI2USB(val, STATUS_ENABLED_CHANGED, USB_HUB_FEATURE_C_PORT_ENABLE) |
-//	    UHCI2USB(val, STATUS_SUSPEND, USB_HUB_FEATURE_C_PORT_SUSPEND) |
-	    ((hub->reset_changed[port] ? 1 : 0) << USB_HUB_FEATURE_C_PORT_RESET)
+	    UHCI2USB(val, STATUS_CONNECTED, USB_HUB_PORT_STATUS_CONNECTION) |
+	    UHCI2USB(val, STATUS_ENABLED, USB_HUB_PORT_STATUS_ENABLE) |
+	    UHCI2USB(val, STATUS_SUSPEND, USB2_HUB_PORT_STATUS_SUSPEND) |
+	    UHCI2USB(val, STATUS_IN_RESET, USB_HUB_PORT_STATUS_RESET) |
+	    UHCI2USB(val, STATUS_ALWAYS_ONE, USB2_HUB_PORT_STATUS_POWER) |
+	    UHCI2USB(val, STATUS_LOW_SPEED, USB2_HUB_PORT_STATUS_LOW_SPEED) |
+	    UHCI2USB(val, STATUS_CONNECTED_CHANGED, USB_HUB_PORT_STATUS_C_CONNECTION) |
+	    UHCI2USB(val, STATUS_ENABLED_CHANGED, USB2_HUB_PORT_STATUS_C_ENABLE) |
+//	    UHCI2USB(val, STATUS_SUSPEND, USB2_HUB_PORT_STATUS_C_SUSPEND) |
+	    (hub->reset_changed[port] ?  USB_HUB_PORT_STATUS_C_RESET : 0)
 	);
 	RH_DEBUG(hub, port, "Port status %" PRIx32 " (source %" PRIx16
@@ -274,10 +274,10 @@
 	const uint16_t val = status & (~STATUS_WC_BITS);
 	switch (feature) {
-	case USB_HUB_FEATURE_PORT_ENABLE:
+	case USB2_HUB_FEATURE_PORT_ENABLE:
 		RH_DEBUG(hub, port, "Clear port enable (status %"
 		    PRIx16 ")", status);
 		pio_write_16(hub->ports[port], val & ~STATUS_ENABLED);
 		break;
-	case USB_HUB_FEATURE_PORT_SUSPEND:
+	case USB2_HUB_FEATURE_PORT_SUSPEND:
 		RH_DEBUG(hub, port, "Clear port suspend (status %"
 		    PRIx16 ")", status);
@@ -302,10 +302,10 @@
 		hub->reset_changed[port] = false;
 		break;
-	case USB_HUB_FEATURE_C_PORT_ENABLE:
+	case USB2_HUB_FEATURE_C_PORT_ENABLE:
 		RH_DEBUG(hub, port, "Clear port enable change (status %"
 		    PRIx16 ")", status);
 		pio_write_16(hub->ports[port], status | STATUS_ENABLED_CHANGED);
 		break;
-	case USB_HUB_FEATURE_C_PORT_SUSPEND:
+	case USB2_HUB_FEATURE_C_PORT_SUSPEND:
 		RH_DEBUG(hub, port, "Clear port suspend change (status %"
 		    PRIx16 ")", status);
@@ -354,5 +354,5 @@
 		    ")", pio_read_16(hub->ports[port]));
 		break;
-	case USB_HUB_FEATURE_PORT_SUSPEND:
+	case USB2_HUB_FEATURE_PORT_SUSPEND:
 		RH_DEBUG(hub, port, "Set port suspend (status %" PRIx16
 		    ")", status);
@@ -368,6 +368,6 @@
 		break;
 	case USB_HUB_FEATURE_C_PORT_CONNECTION:
-	case USB_HUB_FEATURE_C_PORT_ENABLE:
-	case USB_HUB_FEATURE_C_PORT_SUSPEND:
+	case USB2_HUB_FEATURE_C_PORT_ENABLE:
+	case USB2_HUB_FEATURE_C_PORT_SUSPEND:
 	case USB_HUB_FEATURE_C_PORT_OVER_CURRENT:
 		RH_DEBUG(hub, port, "Set port change flag (status %" PRIx16
Index: uspace/drv/bus/usb/usbhub/port.c
===================================================================
--- uspace/drv/bus/usb/usbhub/port.c	(revision 32b2a6f2ada68012ac1adeae0f0a262a7b8653d9)
+++ uspace/drv/bus/usb/usbhub/port.c	(revision cd3fa47a6891613f98a1a9cb52de0d8ccc74758a)
@@ -145,6 +145,7 @@
 	if ((err = usbhc_device_enumerate(exch, port->port_number, port->speed))) {
 		port_log(error, port, "Failed to enumerate device: %s", str_error(err));
-		/* Disable the port */
-		usb_hub_clear_port_feature(port->hub, port->port_number, USB_HUB_FEATURE_PORT_ENABLE);
+		/* Disable the port in USB 2 (impossible in USB3) */
+		if (port->speed <= USB_SPEED_HIGH)
+			usb_hub_clear_port_feature(port->hub, port->port_number, USB2_HUB_FEATURE_PORT_ENABLE);
 		goto out_address;
 	}
@@ -173,5 +174,5 @@
 static void port_changed_enabled(usb_hub_port_t *port, usb_port_status_t status)
 {
-	const bool enabled = !!(status & USB_HUB_PORT_STATUS_ENABLED);
+	const bool enabled = !!(status & USB_HUB_PORT_STATUS_ENABLE);
 	if (enabled) {
 		port_log(warning, port, "Port unexpectedly changed to enabled.");
@@ -179,9 +180,4 @@
 		usb_port_disabled(&port->base, &remove_device);
 	}
-}
-
-static void port_changed_suspend(usb_hub_port_t *port, usb_port_status_t status)
-{
-	port_log(error, port, "Port unexpectedly suspend. Weird, we do not support suspending!");
 }
 
@@ -207,5 +203,5 @@
 static void port_changed_reset(usb_hub_port_t *port, usb_port_status_t status)
 {
-	const bool enabled = !!(status & USB_HUB_PORT_STATUS_ENABLED);
+	const bool enabled = !!(status & USB_HUB_PORT_STATUS_ENABLE);
 
 	if (enabled) {
@@ -220,12 +216,19 @@
 typedef void (*change_handler_t)(usb_hub_port_t *, usb_port_status_t);
 
-static const change_handler_t port_change_handlers [] = {
-	[USB_HUB_FEATURE_C_PORT_CONNECTION] = &port_changed_connection,
-	[USB_HUB_FEATURE_C_PORT_ENABLE] = &port_changed_enabled,
-	[USB_HUB_FEATURE_C_PORT_SUSPEND] = &port_changed_suspend,
-	[USB_HUB_FEATURE_C_PORT_OVER_CURRENT] = &port_changed_overcurrent,
-	[USB_HUB_FEATURE_C_PORT_RESET] = &port_changed_reset,
-	[sizeof(usb_port_status_t) * 8] = NULL,
-};
+static void check_port_change(usb_hub_port_t *port, usb_port_status_t *status,
+    change_handler_t handler, usb_port_status_t mask, usb_hub_class_feature_t feature)
+{
+	if ((*status & mask) == 0)
+		return;
+
+	/* Clear the change so it won't come again */
+	usb_hub_clear_port_feature(port->hub, port->port_number, feature);
+
+	if (handler)
+		handler(port, *status);
+
+	/* Mark the change as resolved */
+	*status &= ~mask;
+}
 
 /**
@@ -248,24 +251,22 @@
 	}
 
-	if (port->hub->speed == USB_SPEED_SUPER)
-		/* Link state change is not a change we shall clear, nor we care about it */
-		status &= ~(1 << USB_HUB_FEATURE_C_PORT_LINK_STATE);
-
-	for (uint32_t feature = 16; feature < sizeof(usb_port_status_t) * 8; ++feature) {
-		uint32_t mask = 1 << feature;
-
-		if ((status & mask) == 0)
-			continue;
-
-		/* Clear the change so it won't come again */
-		usb_hub_clear_port_feature(port->hub, port->port_number, feature);
-
-		if (!port_change_handlers[feature])
-			continue;
-
-		/* ACK this change */
-		status &= ~mask;
-
-		port_change_handlers[feature](port, status);
+	check_port_change(port, &status, &port_changed_connection,
+	    USB_HUB_PORT_STATUS_C_CONNECTION, USB_HUB_FEATURE_C_PORT_CONNECTION);
+
+	check_port_change(port, &status, &port_changed_overcurrent,
+	    USB_HUB_PORT_STATUS_C_OC, USB_HUB_FEATURE_C_PORT_OVER_CURRENT);
+
+	check_port_change(port, &status, &port_changed_reset,
+	    USB_HUB_PORT_STATUS_C_RESET, USB_HUB_FEATURE_C_PORT_RESET);
+
+	if (port->hub->speed <= USB_SPEED_HIGH) {
+		check_port_change(port, &status, &port_changed_enabled,
+		    USB2_HUB_PORT_STATUS_C_ENABLE, USB2_HUB_FEATURE_C_PORT_ENABLE);
+	} else {
+		check_port_change(port, &status, &port_changed_reset,
+		    USB3_HUB_PORT_STATUS_C_BH_RESET, USB3_HUB_FEATURE_C_BH_PORT_RESET);
+
+		check_port_change(port, &status, NULL,
+		    USB3_HUB_PORT_STATUS_C_LINK_STATE, USB3_HUB_FEATURE_C_PORT_LINK_STATE);
 	}
 
Index: uspace/drv/bus/usb/usbhub/status.h
===================================================================
--- uspace/drv/bus/usb/usbhub/status.h	(revision 32b2a6f2ada68012ac1adeae0f0a262a7b8653d9)
+++ uspace/drv/bus/usb/usbhub/status.h	(revision cd3fa47a6891613f98a1a9cb52de0d8ccc74758a)
@@ -38,46 +38,4 @@
 
 /**
- * structure holding port status and changes flags.
- * should not be accessed directly, use supplied getter/setter methods.
- *
- * For more information refer to tables 11-15 and 11-16 in
- * "Universal Serial Bus Specification Revision 1.1" pages 274 and 277
- * (290 and 293 in pdf)
- *
- */
-typedef uint32_t usb_port_status_t;
-#define USB_HUB_PORT_STATUS_CONNECTION \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_PORT_CONNECTION)))
-#define USB_HUB_PORT_STATUS_ENABLED \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_PORT_ENABLE)))
-#define USB_HUB_PORT_STATUS_SUSPEND \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_PORT_SUSPEND)))
-#define USB_HUB_PORT_STATUS_OC \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_PORT_OVER_CURRENT)))
-#define USB_HUB_PORT_STATUS_RESET \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_PORT_RESET)))
-#define USB_HUB_PORT_STATUS_POWER \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_PORT_POWER)))
-#define USB_HUB_PORT_STATUS_LOW_SPEED \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_PORT_LOW_SPEED)))
-#define USB_HUB_PORT_STATUS_HIGH_SPEED \
-    (uint32_usb2host(1 << 10))
-#define USB_HUB_PORT_STATUS_TEST_MODE \
-    (uint32_usb2host(1 << 11))
-#define USB_HUB_PORT_INDICATOR_CONTROL \
-    (uint32_usb2host(1 << 12))
-
-#define USB_HUB_PORT_C_STATUS_CONNECTION \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_C_PORT_CONNECTION)))
-#define USB_HUB_PORT_C_STATUS_ENABLED \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_C_PORT_ENABLE)))
-#define USB_HUB_PORT_C_STATUS_SUSPEND \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_C_PORT_SUSPEND)))
-#define USB_HUB_PORT_C_STATUS_OC \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_C_PORT_OVER_CURRENT)))
-#define USB_HUB_PORT_C_STATUS_RESET \
-    (uint32_usb2host(1 << (USB_HUB_FEATURE_C_PORT_RESET)))
-
-/**
  * structure holding hub status and changes flags.
  *
@@ -101,7 +59,7 @@
 	if (hub_speed == USB_SPEED_SUPER)
 		return USB_SPEED_SUPER;
-	if (hub_speed == USB_SPEED_HIGH && (status & USB_HUB_PORT_STATUS_HIGH_SPEED))
+	if (hub_speed == USB_SPEED_HIGH && (status & USB2_HUB_PORT_STATUS_HIGH_SPEED))
 		return USB_SPEED_HIGH;
-	if ((status & USB_HUB_PORT_STATUS_LOW_SPEED) != 0)
+	if ((status & USB2_HUB_PORT_STATUS_LOW_SPEED) != 0)
 		return USB_SPEED_LOW;
 	return USB_SPEED_FULL;
Index: uspace/drv/bus/usb/vhc/hub/virthubops.c
===================================================================
--- uspace/drv/bus/usb/vhc/hub/virthubops.c	(revision 32b2a6f2ada68012ac1adeae0f0a262a7b8653d9)
+++ uspace/drv/bus/usb/vhc/hub/virthubops.c	(revision cd3fa47a6891613f98a1a9cb52de0d8ccc74758a)
@@ -137,5 +137,5 @@
 
 	switch (feature) {
-		case USB_HUB_FEATURE_PORT_ENABLE:
+		case USB2_HUB_FEATURE_PORT_ENABLE:
 			if ((port_state != HUB_PORT_STATE_NOT_CONFIGURED)
 			    && (port_state != HUB_PORT_STATE_POWERED_OFF)) {
@@ -145,5 +145,5 @@
 			break;
 
-		case USB_HUB_FEATURE_PORT_SUSPEND:
+		case USB2_HUB_FEATURE_PORT_SUSPEND:
 			if (port_state != HUB_PORT_STATE_SUSPENDED) {
 				rc = EOK;
@@ -166,10 +166,10 @@
 			break;
 
-		case USB_HUB_FEATURE_C_PORT_ENABLE:
+		case USB2_HUB_FEATURE_C_PORT_ENABLE:
 			hub_clear_port_status_change(hub, port, HUB_STATUS_C_PORT_ENABLE);
 			rc = EOK;
 			break;
 
-		case USB_HUB_FEATURE_C_PORT_SUSPEND:
+		case USB2_HUB_FEATURE_C_PORT_SUSPEND:
 			hub_clear_port_status_change(hub, port, HUB_STATUS_C_PORT_SUSPEND);
 			rc = EOK;
@@ -317,5 +317,5 @@
 			break;
 
-		case USB_HUB_FEATURE_PORT_SUSPEND:
+		case USB2_HUB_FEATURE_PORT_SUSPEND:
 			if (port_state == HUB_PORT_STATE_ENABLED) {
 				hub_set_port_state(hub, port, HUB_PORT_STATE_SUSPENDED);
Index: uspace/lib/usb/include/usb/classes/hub.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hub.h	(revision 32b2a6f2ada68012ac1adeae0f0a262a7b8653d9)
+++ uspace/lib/usb/include/usb/classes/hub.h	(revision cd3fa47a6891613f98a1a9cb52de0d8ccc74758a)
@@ -48,22 +48,58 @@
 	USB_HUB_FEATURE_HUB_OVER_CURRENT = 1,
 	USB_HUB_FEATURE_PORT_CONNECTION = 0,
-	USB_HUB_FEATURE_PORT_ENABLE = 1,
-	USB_HUB_FEATURE_PORT_SUSPEND = 2,
+	USB2_HUB_FEATURE_PORT_ENABLE = 1,
+	USB2_HUB_FEATURE_PORT_SUSPEND = 2,
 	USB_HUB_FEATURE_PORT_OVER_CURRENT = 3,
 	USB_HUB_FEATURE_PORT_RESET = 4,
+	USB3_HUB_FEATURE_PORT_LINK_STATE = 5,
 	USB_HUB_FEATURE_PORT_POWER = 8,
-	USB_HUB_FEATURE_PORT_LOW_SPEED = 9,
-	USB_HUB_FEATURE_PORT_HIGH_SPEED = 10,
+	USB2_HUB_FEATURE_PORT_LOW_SPEED = 9,
 	USB_HUB_FEATURE_C_PORT_CONNECTION = 16,
-	USB_HUB_FEATURE_C_PORT_ENABLE = 17,
-	USB_HUB_FEATURE_C_PORT_SUSPEND = 18,
+	USB2_HUB_FEATURE_C_PORT_ENABLE = 17,
+	USB2_HUB_FEATURE_C_PORT_SUSPEND = 18,
 	USB_HUB_FEATURE_C_PORT_OVER_CURRENT = 19,
 	USB_HUB_FEATURE_C_PORT_RESET = 20,
-	USB_HUB_FEATURE_C_PORT_LINK_STATE = 22,
-	USB_HUB_FEATURE_PORT_TEST = 21,
-	USB_HUB_FEATURE_PORT_INDICATOR = 22
+	USB2_HUB_FEATURE_PORT_TEST = 21,
+	USB2_HUB_FEATURE_PORT_INDICATOR = 22,
+	USB3_HUB_FEATURE_C_PORT_LINK_STATE = 25,
+	USB3_HUB_FEATURE_BH_PORT_RESET = 28,
+	USB3_HUB_FEATURE_C_BH_PORT_RESET = 29,
 	/* USB_HUB_FEATURE_ = , */
 } usb_hub_class_feature_t;
 
+/**
+ * Dword holding port status and changes flags.
+ *
+ * For more information refer to tables 11-15 and 11-16 in
+ * "Universal Serial Bus Specification Revision 1.1" pages 274 and 277
+ * (290 and 293 in pdf)
+ *
+ * Beware that definition of bits changed between USB 2 and 3,
+ * so some fields are prefixed with USB2 or USB3 instead.
+ */
+typedef uint32_t usb_port_status_t;
+
+#define USB_HUB_PORT_STATUS_BIT(bit)  (uint32_usb2host(1 << (bit)))
+#define USB_HUB_PORT_STATUS_CONNECTION		USB_HUB_PORT_STATUS_BIT(0)
+#define USB_HUB_PORT_STATUS_ENABLE		USB_HUB_PORT_STATUS_BIT(1)
+#define USB2_HUB_PORT_STATUS_SUSPEND		USB_HUB_PORT_STATUS_BIT(2)
+#define USB_HUB_PORT_STATUS_OC			USB_HUB_PORT_STATUS_BIT(3)
+#define USB_HUB_PORT_STATUS_RESET		USB_HUB_PORT_STATUS_BIT(4)
+
+#define USB2_HUB_PORT_STATUS_POWER		USB_HUB_PORT_STATUS_BIT(8)
+#define USB2_HUB_PORT_STATUS_LOW_SPEED		USB_HUB_PORT_STATUS_BIT(9)
+#define USB3_HUB_PORT_STATUS_POWER		USB_HUB_PORT_STATUS_BIT(9)
+#define USB2_HUB_PORT_STATUS_HIGH_SPEED		USB_HUB_PORT_STATUS_BIT(10)
+#define USB2_HUB_PORT_STATUS_TEST		USB_HUB_PORT_STATUS_BIT(11)
+#define USB2_HUB_PORT_STATUS_INDICATOR		USB_HUB_PORT_STATUS_BIT(12)
+
+#define USB_HUB_PORT_STATUS_C_CONNECTION	USB_HUB_PORT_STATUS_BIT(16)
+#define USB2_HUB_PORT_STATUS_C_ENABLE		USB_HUB_PORT_STATUS_BIT(17)
+#define USB2_HUB_PORT_STATUS_C_SUSPEND		USB_HUB_PORT_STATUS_BIT(18)
+#define USB_HUB_PORT_STATUS_C_OC		USB_HUB_PORT_STATUS_BIT(19)
+#define USB_HUB_PORT_STATUS_C_RESET		USB_HUB_PORT_STATUS_BIT(20)
+#define USB3_HUB_PORT_STATUS_C_BH_RESET		USB_HUB_PORT_STATUS_BIT(21)
+#define USB3_HUB_PORT_STATUS_C_LINK_STATE	USB_HUB_PORT_STATUS_BIT(22)
+#define USB3_HUB_PORT_STATUS_C_CONFIG_ERROR	USB_HUB_PORT_STATUS_BIT(23)
 
 /** Header of standard hub descriptor without the "variadic" part. */
