Index: uspace/drv/bus/usb/ehci/ehci_bus.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 894f58c6a9276891cb9de8f06bba34477d4b7f50)
+++ uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 56db65dc41b80ff74d067c9103026ffe34cc8e46)
@@ -114,10 +114,12 @@
 
 
-static int ehci_register_ep(bus_t *bus_base, endpoint_t *ep)
+static int ehci_register_ep(bus_t *bus_base, endpoint_t *ep, const usb_endpoint_desc_t *desc)
 {
 	ehci_bus_t *bus = (ehci_bus_t *) bus_base;
 	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
 
-	const int err = bus->parent_ops.register_endpoint(bus_base, ep);
+	// TODO utilize desc->usb2
+
+	const int err = bus->parent_ops.register_endpoint(bus_base, ep, desc);
 	if (err)
 		return err;
Index: uspace/drv/bus/usb/ohci/ohci_bus.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_bus.c	(revision 894f58c6a9276891cb9de8f06bba34477d4b7f50)
+++ uspace/drv/bus/usb/ohci/ohci_bus.c	(revision 56db65dc41b80ff74d067c9103026ffe34cc8e46)
@@ -115,10 +115,10 @@
 
 
-static int ohci_register_ep(bus_t *bus_base, endpoint_t *ep)
+static int ohci_register_ep(bus_t *bus_base, endpoint_t *ep, const usb_endpoint_desc_t *desc)
 {
 	ohci_bus_t *bus = (ohci_bus_t *) bus_base;
 	ohci_endpoint_t *ohci_ep = ohci_endpoint_get(ep);
 
-	const int err = bus->parent_ops.register_endpoint(bus_base, ep);
+	const int err = bus->parent_ops.register_endpoint(bus_base, ep, desc);
 	if (err)
 		return err;
Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision 894f58c6a9276891cb9de8f06bba34477d4b7f50)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision 56db65dc41b80ff74d067c9103026ffe34cc8e46)
@@ -165,13 +165,30 @@
 }
 
-static int register_endpoint(bus_t *bus_base, endpoint_t *ep)
+static int register_endpoint(bus_t *bus_base, endpoint_t *ep, const usb_endpoint_desc_t *desc)
 {
 	xhci_bus_t *bus = bus_to_xhci_bus(bus_base);
 	assert(bus);
 
-	usb_log_info("Endpoint(%d:%d) registered to XHCI bus.", ep->target.address, ep->target.endpoint);
+	assert(ep->device);
+
+	/* Extract USB2-related information from endpoint_desc */
+	ep->target = (usb_target_t) {{
+		.address = ep->device->address,
+		.endpoint = desc->endpoint_no,
+	}};
+	ep->direction = desc->direction;
+	ep->transfer_type = desc->transfer_type;
+	ep->max_packet_size = desc->max_packet_size;
+	ep->packets = desc->packets;
 
 	xhci_device_t *xhci_dev = xhci_device_get(ep->device);
 	xhci_endpoint_t *xhci_ep = xhci_endpoint_get(ep);
+
+	xhci_ep->max_streams = desc->usb3.max_streams;
+	xhci_ep->max_burst = desc->usb3.max_burst;
+	// TODO add this property to usb_endpoint_desc_t and fetch it from ss companion desc
+	xhci_ep->mult = 0;
+
+	usb_log_info("Endpoint(%d:%d) registered to XHCI bus.", ep->target.address, ep->target.endpoint);
 	return xhci_device_add_endpoint(xhci_dev, xhci_ep);
 }
Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision 894f58c6a9276891cb9de8f06bba34477d4b7f50)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision 56db65dc41b80ff74d067c9103026ffe34cc8e46)
@@ -275,4 +275,6 @@
 	assert(&dev->base == ep->base.device);
 	assert(dev->base.address == ep->base.target.address);
+
+	// TODO Do not fail hard on runtime conditions
 	assert(!dev->endpoints[ep_num]);
 
@@ -285,9 +287,4 @@
 		return EOK;
 	}
-
-	// FIXME: Set these from usb_superspeed_endpoint_companion_descriptor_t:
-	ep->max_streams = 0;
-	ep->max_burst = 0;
-	ep->mult = 0;
 
 	/* Set up TRB ring / PSA. */
Index: uspace/drv/bus/usb/xhci/rh.c
===================================================================
--- uspace/drv/bus/usb/xhci/rh.c	(revision 894f58c6a9276891cb9de8f06bba34477d4b7f50)
+++ uspace/drv/bus/usb/xhci/rh.c	(revision 56db65dc41b80ff74d067c9103026ffe34cc8e46)
@@ -90,4 +90,14 @@
 }
 
+/* FIXME Are these really static? Older HCs fetch it from descriptor. */
+/* FIXME Add USB3 options, if applicable. */
+static const usb_endpoint_desc_t ep0_desc = {
+	.endpoint_no = 0,
+	.direction = USB_DIRECTION_BOTH,
+	.transfer_type = USB_TRANSFER_CONTROL,
+	.max_packet_size = CTRL_PIPE_MIN_PACKET_SIZE,
+	.packets = 1,
+};
+
 // TODO: This currently assumes the device is attached to rh directly.
 //       Also, we should consider moving a lot of functionailty to xhci bus
@@ -112,8 +122,4 @@
 
 	xhci_endpoint_t *ep0 = xhci_endpoint_get(ep0_base);
-	/* FIXME: Sync this with xhci_device_add_endpoint. */
-	ep0->max_streams = 0;
-	ep0->max_burst = 0;
-	ep0->mult = 0;
 
 	if ((err = xhci_endpoint_alloc_transfer_ds(ep0)))
@@ -144,15 +150,7 @@
 	fibril_mutex_unlock(&dev->guard);
 
-	// XXX: Going around bus, duplicating code
 	ep0_base->device = dev;
-	ep0_base->target.address = dev->address;
-	ep0_base->target.endpoint = 0;
-	ep0_base->direction = USB_DIRECTION_BOTH;
-	ep0_base->transfer_type = USB_TRANSFER_CONTROL;
-	ep0_base->max_packet_size = CTRL_PIPE_MIN_PACKET_SIZE;
-	ep0_base->packets = 1;
-	ep0_base->bandwidth = CTRL_PIPE_MIN_PACKET_SIZE;
-
-	bus_register_endpoint(&rh->hc->bus.base, ep0_base);
+
+	bus_register_endpoint(&rh->hc->bus.base, ep0_base, &ep0_desc);
 
 	if (!rh->devices[dev->port - 1]) {
