Index: uspace/drv/bus/usb/uhci/uhci_rh.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_rh.c	(revision 81da273b8d0e161072df3263236f8cfa1a64a898)
+++ uspace/drv/bus/usb/uhci/uhci_rh.c	(revision 2a5a7711d9d3ead04b4c659b73b132aaaddaf653)
@@ -78,5 +78,5 @@
 	instance->reset_changed[1] = false;
 	return virthub_base_init(&instance->base, name, &ops, instance,
-	    NULL, &hub_descriptor.header);
+	    NULL, &hub_descriptor.header, HUB_STATUS_CHANGE_PIPE, 2);
 }
 
@@ -376,5 +376,5 @@
 
 /** UHCI root hub request handlers */
-static usbvirt_control_request_handler_t control_transfer_handlers[] = {
+static const usbvirt_control_request_handler_t control_transfer_handlers[] = {
 	{
 		STD_REQ_IN(USB_REQUEST_RECIPIENT_DEVICE, USB_DEVREQ_GET_DESCRIPTOR),
Index: uspace/lib/usbvirt/include/usbvirt/virthub_base.h
===================================================================
--- uspace/lib/usbvirt/include/usbvirt/virthub_base.h	(revision 81da273b8d0e161072df3263236f8cfa1a64a898)
+++ uspace/lib/usbvirt/include/usbvirt/virthub_base.h	(revision 2a5a7711d9d3ead04b4c659b73b132aaaddaf653)
@@ -42,9 +42,9 @@
 enum {
 	VIRTHUB_EXTR_DESC = 3,
-	HUB_STATUS_CHANGE_PIPE = 1,
 };
 
 typedef struct {
 	usb_standard_configuration_descriptor_t config_descriptor;
+	usb_standard_endpoint_descriptor_t endpoint_descriptor;
 	usbvirt_device_configuration_extras_t extra[VIRTHUB_EXTR_DESC];
 	usbvirt_device_configuration_t configuration;
@@ -59,5 +59,6 @@
     const char *name, usbvirt_device_ops_t *ops, void *data,
     const usb_standard_device_descriptor_t *device_desc,
-    const usb_hub_descriptor_header_t *hub_desc);
+    const usb_hub_descriptor_header_t *hub_desc,
+    usb_endpoint_t ep, unsigned port_count);
 
 usb_address_t virthub_base_get_address(virthub_base_t *instance);
Index: uspace/lib/usbvirt/src/virthub_base.c
===================================================================
--- uspace/lib/usbvirt/src/virthub_base.c	(revision 81da273b8d0e161072df3263236f8cfa1a64a898)
+++ uspace/lib/usbvirt/src/virthub_base.c	(revision 2a5a7711d9d3ead04b4c659b73b132aaaddaf653)
@@ -42,6 +42,6 @@
 extern const usb_standard_device_descriptor_t virthub_device_descriptor;
 extern const usb_standard_configuration_descriptor_t virthub_configuration_descriptor_without_hub_size;
+extern const usb_standard_endpoint_descriptor_t virthub_endpoint_descriptor;
 extern const usbvirt_device_configuration_extras_t virthub_interface_descriptor_ex;
-extern const usbvirt_device_configuration_extras_t virthub_endpoint_descriptor_ex;
 
 void *virthub_get_data(usbvirt_device_t *dev)
@@ -53,16 +53,25 @@
 }
 
-int virthub_base_init(virthub_base_t *instance,
-    const char *name, usbvirt_device_ops_t *ops, void *data,
+int virthub_base_init(virthub_base_t *instance, const char *name,
+    usbvirt_device_ops_t *ops, void *data,
     const usb_standard_device_descriptor_t *device_desc,
-    const usb_hub_descriptor_header_t *hub_desc)
+    const usb_hub_descriptor_header_t *hub_desc,
+    usb_endpoint_t ep, unsigned port_count)
 {
 	assert(instance);
 	assert(hub_desc);
 	assert(name);
+	
+	if (!usb_endpoint_is_valid(ep) || (ep == USB_ENDPOINT_DEFAULT_CONTROL))
+		return EINVAL;
 
 	instance->config_descriptor =
 	    virthub_configuration_descriptor_without_hub_size;
 	instance->config_descriptor.total_length += hub_desc->length;
+
+	instance->endpoint_descriptor = virthub_endpoint_descriptor;
+	instance->endpoint_descriptor.endpoint_address = 128 | ep;
+	instance->endpoint_descriptor.max_packet_size =
+	    (1 + port_count + 7) / 8;
 
 	instance->descriptors.device =
@@ -78,5 +87,6 @@
 	instance->extra[1].data = (void *)hub_desc;
 	instance->extra[1].length = hub_desc->length;
-	instance->extra[2] = virthub_endpoint_descriptor_ex;
+	instance->extra[2].data = (void*)&instance->endpoint_descriptor;
+	instance->extra[2].length = sizeof(instance->endpoint_descriptor);
 
 	instance->device.ops = ops;
Index: uspace/lib/usbvirt/src/virthub_descriptors.c
===================================================================
--- uspace/lib/usbvirt/src/virthub_descriptors.c	(revision 81da273b8d0e161072df3263236f8cfa1a64a898)
+++ uspace/lib/usbvirt/src/virthub_descriptors.c	(revision 2a5a7711d9d3ead04b4c659b73b132aaaddaf653)
@@ -74,5 +74,5 @@
 	.length = sizeof(usb_standard_endpoint_descriptor_t),
 	.descriptor_type = USB_DESCTYPE_ENDPOINT,
-	.endpoint_address = HUB_STATUS_CHANGE_PIPE | 128,
+	.endpoint_address = 1 | 128,
 	.attributes = USB_TRANSFER_INTERRUPT,
 	.max_packet_size = 8,
@@ -101,9 +101,4 @@
 };
 
-const usbvirt_device_configuration_extras_t virthub_endpoint_descriptor_ex = {
-	.data = (uint8_t *) &virthub_endpoint_descriptor,
-	.length = sizeof(virthub_endpoint_descriptor),
-};
-
 
 /**
