Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision 625582027915794d9d32a84c757e9dedce77173a)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision 25251bb053fa524ed4b8076c0a1430bfca92c892)
@@ -266,5 +266,5 @@
 
 	usb_log_info("Endpoint(%d:%d) registered to XHCI bus.", ep->device->address, ep->endpoint);
-	return xhci_device_add_endpoint(xhci_dev, xhci_ep);
+	return xhci_device_add_endpoint(bus->hc, xhci_dev, xhci_ep);
 }
 
@@ -278,5 +278,5 @@
 	xhci_device_t *xhci_dev = xhci_device_get(ep->device);
 	xhci_endpoint_t *xhci_ep = xhci_endpoint_get(ep);
-	const int res = xhci_device_remove_endpoint(xhci_dev, xhci_ep);
+	const int res = xhci_device_remove_endpoint(bus->hc, xhci_dev, xhci_ep);
 	if (res != EOK)
 		return res;
@@ -396,4 +396,5 @@
 		return ENOMEM;
 
+	bus->hc = hc;
 	bus->base.ops = xhci_bus_ops;
 	bus->default_address_speed = USB_SPEED_MAX;
Index: uspace/drv/bus/usb/xhci/bus.h
===================================================================
--- uspace/drv/bus/usb/xhci/bus.h	(revision 625582027915794d9d32a84c757e9dedce77173a)
+++ uspace/drv/bus/usb/xhci/bus.h	(revision 25251bb053fa524ed4b8076c0a1430bfca92c892)
@@ -48,4 +48,6 @@
 	bus_t base;		/**< Inheritance. Keep this first. */
 
+	xhci_hc_t *hc;				/**< Pointer to managing HC (to issue commands) */
+
 	xhci_device_t **devices_by_slot;	/**< Devices by Slot ID */
 
Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision 625582027915794d9d32a84c757e9dedce77173a)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision 25251bb053fa524ed4b8076c0a1430bfca92c892)
@@ -269,5 +269,5 @@
 }
 
-int xhci_device_add_endpoint(xhci_device_t *dev, xhci_endpoint_t *ep)
+int xhci_device_add_endpoint(xhci_hc_t *hc, xhci_device_t *dev, xhci_endpoint_t *ep)
 {
 	assert(dev);
@@ -299,8 +299,8 @@
 	xhci_setup_endpoint_context(ep, &ep_ctx);
 
-	return hc_add_endpoint(dev->hc, dev->slot_id, xhci_endpoint_index(ep), &ep_ctx);
-}
-
-int xhci_device_remove_endpoint(xhci_device_t *dev, xhci_endpoint_t *ep)
+	return hc_add_endpoint(hc, dev->slot_id, xhci_endpoint_index(ep), &ep_ctx);
+}
+
+int xhci_device_remove_endpoint(xhci_hc_t *hc, xhci_device_t *dev, xhci_endpoint_t *ep)
 {
 	assert(&dev->base == ep->base.device);
@@ -320,5 +320,5 @@
 
 	/* Drop the endpoint. */
-	if ((err = hc_drop_endpoint(dev->hc, dev->slot_id, xhci_endpoint_index(ep)))) {
+	if ((err = hc_drop_endpoint(hc, dev->slot_id, xhci_endpoint_index(ep)))) {
 		goto err;
 	}
Index: uspace/drv/bus/usb/xhci/endpoint.h
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.h	(revision 625582027915794d9d32a84c757e9dedce77173a)
+++ uspace/drv/bus/usb/xhci/endpoint.h	(revision 25251bb053fa524ed4b8076c0a1430bfca92c892)
@@ -117,7 +117,4 @@
 	uint8_t active_endpoint_count;
 
-	/** Need HC to schedule commands from bus callbacks. TODO: Move this elsewhere. */
-	xhci_hc_t *hc;
-
 	/** Flag indicating whether the device is USB3 (it's USB2 otherwise). */
 	bool usb3;
@@ -137,6 +134,6 @@
 void xhci_setup_endpoint_context(xhci_endpoint_t *, xhci_ep_ctx_t *);
 
-int xhci_device_add_endpoint(xhci_device_t *, xhci_endpoint_t *);
-int xhci_device_remove_endpoint(xhci_device_t *, xhci_endpoint_t *);
+int xhci_device_add_endpoint(xhci_hc_t *, xhci_device_t *, xhci_endpoint_t *);
+int xhci_device_remove_endpoint(xhci_hc_t *, xhci_device_t *, xhci_endpoint_t *);
 xhci_endpoint_t * xhci_device_get_endpoint(xhci_device_t *, usb_endpoint_t);
 
Index: uspace/drv/bus/usb/xhci/rh.c
===================================================================
--- uspace/drv/bus/usb/xhci/rh.c	(revision 625582027915794d9d32a84c757e9dedce77173a)
+++ uspace/drv/bus/usb/xhci/rh.c	(revision 25251bb053fa524ed4b8076c0a1430bfca92c892)
@@ -102,5 +102,4 @@
 	const xhci_port_speed_t *port_speed = xhci_rh_get_port_speed(rh, port_id);
 	xhci_device_t *xhci_dev = xhci_device_get(dev);
-	xhci_dev->hc = rh->hc;
 	xhci_dev->usb3 = port_speed->major == 3;
 	xhci_dev->rh_port = port_id;
@@ -363,5 +362,5 @@
 }
 
-static inline int get_hub_available_bandwidth(xhci_device_t* dev, uint8_t speed, xhci_port_bandwidth_ctx_t *ctx) {
+static inline int get_hub_available_bandwidth(xhci_hc_t *hc, xhci_device_t* dev, uint8_t speed, xhci_port_bandwidth_ctx_t *ctx) {
 	// TODO: find a correct place for this function + API
 	// We need speed, because a root hub device has both USB 2 and USB 3 speeds
@@ -383,5 +382,5 @@
 
 	int err;
-	if ((err = xhci_cmd_sync(dev->hc, &cmd))) {
+	if ((err = xhci_cmd_sync(hc, &cmd))) {
 		goto end;
 	}
