Index: uspace/drv/bus/usb/ehci/Makefile
===================================================================
--- uspace/drv/bus/usb/ehci/Makefile	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ehci/Makefile	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -46,5 +46,5 @@
 SOURCES = \
 	ehci_batch.c \
-	ehci_endpoint.c \
+	ehci_bus.c \
 	ehci_rh.c \
 	endpoint_list.c \
Index: uspace/drv/bus/usb/ehci/ehci_batch.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_batch.c	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ehci/ehci_batch.c	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -45,5 +45,5 @@
 
 #include "ehci_batch.h"
-#include "ehci_endpoint.h"
+#include "ehci_bus.h"
 
 /* The buffer pointer list in the qTD is long enough to support a maximum
Index: uspace/drv/bus/usb/ehci/ehci_bus.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
+++ uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2011 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup drvusbehci
+ * @{
+ */
+/** @file
+ * @brief EHCI driver
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <usb/host/utils/malloc32.h>
+#include <usb/host/bandwidth.h>
+#include <usb/debug.h>
+
+#include "ehci_bus.h"
+#include "hc.h"
+
+/** Callback to set toggle on ED.
+ *
+ * @param[in] hcd_ep hcd endpoint structure
+ * @param[in] toggle new value of toggle bit
+ */
+static void ehci_ep_toggle_set(endpoint_t *ep, bool toggle)
+{
+	ehci_endpoint_t *instance = ehci_endpoint_get(ep);
+	assert(instance);
+	assert(instance->qh);
+	ep->toggle = toggle;
+	if (qh_toggle_from_td(instance->qh))
+		usb_log_warning("EP(%p): Setting toggle bit for transfer "
+		    "directed EP", instance);
+	qh_toggle_set(instance->qh, toggle);
+}
+
+/** Callback to get value of toggle bit.
+ *
+ * @param[in] hcd_ep hcd endpoint structure
+ * @return Current value of toggle bit.
+ */
+static bool ehci_ep_toggle_get(endpoint_t *ep)
+{
+	ehci_endpoint_t *instance = ehci_endpoint_get(ep);
+	assert(instance);
+	assert(instance->qh);
+
+	if (qh_toggle_from_td(instance->qh))
+		usb_log_warning("EP(%p): Reading useless toggle bit", instance);
+	return qh_toggle_get(instance->qh);
+}
+
+/** Creates new hcd endpoint representation.
+ */
+static endpoint_t *ehci_endpoint_create(bus_t *bus)
+{
+	assert(bus);
+
+	ehci_endpoint_t *ehci_ep = malloc(sizeof(ehci_endpoint_t));
+	if (ehci_ep == NULL)
+		return NULL;
+
+	endpoint_init(&ehci_ep->base, bus);
+
+	ehci_ep->qh = malloc32(sizeof(qh_t));
+	if (ehci_ep->qh == NULL) {
+		free(ehci_ep);
+		return NULL;
+	}
+
+	link_initialize(&ehci_ep->link);
+	return EOK;
+}
+
+/** Disposes hcd endpoint structure
+ *
+ * @param[in] hcd driver using this instance.
+ * @param[in] ep endpoint structure.
+ */
+static void ehci_endpoint_destroy(endpoint_t *ep)
+{
+	assert(ep);
+	ehci_endpoint_t *instance = ehci_endpoint_get(ep);
+
+	free32(instance->qh);
+	free(instance);
+}
+
+
+static int ehci_register_ep(bus_t *bus_base, endpoint_t *ep)
+{
+	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);
+	if (err)
+		return err;
+
+	qh_init(ehci_ep->qh, ep);
+	hc_enqueue_endpoint(bus->hc, ep);
+
+	return EOK;
+}
+
+static int ehci_release_ep(bus_t *bus_base, endpoint_t *ep)
+{
+	ehci_bus_t *bus = (ehci_bus_t *) bus_base;
+	assert(bus);
+	assert(ep);
+
+	const int err = bus->parent_ops.release_endpoint(bus_base, ep);
+	if (err)
+		return err;
+
+	hc_dequeue_endpoint(bus->hc, ep);
+	return EOK;
+
+}
+
+int ehci_bus_init(ehci_bus_t *bus, hc_t *hc)
+{
+	assert(hc);
+	assert(bus);
+
+	// FIXME: Implement the USB2 bw counting.
+	usb2_bus_init(&bus->base, BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
+
+	bus_ops_t *ops = &bus->base.base.ops;
+	bus->parent_ops = *ops;
+	ops->create_endpoint = ehci_endpoint_create;
+	ops->destroy_endpoint = ehci_endpoint_destroy;
+	ops->endpoint_set_toggle = ehci_ep_toggle_set;
+	ops->endpoint_get_toggle = ehci_ep_toggle_get;
+
+	ops->register_endpoint = ehci_register_ep;
+	ops->release_endpoint = ehci_release_ep;
+
+	return EOK;
+}
+
+/**
+ * @}
+ */
Index: uspace/drv/bus/usb/ehci/ehci_bus.h
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.h	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
+++ uspace/drv/bus/usb/ehci/ehci_bus.h	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2011 Jan Vesely
+ * Copyright (c) 2017 Ondrej Hlavaty <aearsis@eideo.cz>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/** @addtogroup drvusbehci
+ * @{
+ */
+/** @file
+ * @brief EHCI driver
+ */
+#ifndef DRV_EHCI_HCD_BUS_H
+#define DRV_EHCI_HCD_BUS_H
+
+#include <assert.h>
+#include <adt/list.h>
+#include <usb/host/usb2_bus.h>
+#include <usb/host/endpoint.h>
+
+#include "hw_struct/queue_head.h"
+
+/** Connector structure linking ED to to prepared TD. */
+typedef struct ehci_endpoint {
+	/* Inheritance */
+	endpoint_t base;
+
+	/** EHCI endpoint descriptor */
+	qh_t *qh;
+	/** Linked list used by driver software */
+	link_t link;
+} ehci_endpoint_t;
+
+typedef struct hc hc_t;
+
+typedef struct {
+	usb2_bus_t base;
+	hc_t *hc;
+
+	/* Stored original ops from base, they are called in our handlers */
+	bus_ops_t parent_ops;
+} ehci_bus_t;
+
+int ehci_bus_init(ehci_bus_t *, hc_t *);
+
+/** Get and convert assigned ehci_endpoint_t structure
+ * @param[in] ep USBD endpoint structure.
+ * @return Pointer to assigned hcd endpoint structure
+ */
+static inline ehci_endpoint_t * ehci_endpoint_get(const endpoint_t *ep)
+{
+	assert(ep);
+	return (ehci_endpoint_t *) ep;
+}
+
+static inline ehci_endpoint_t * ehci_endpoint_list_instance(link_t *l)
+{
+	return list_get_instance(l, ehci_endpoint_t, link);
+}
+
+#endif
+/**
+ * @}
+ */
Index: uspace/drv/bus/usb/ehci/ehci_endpoint.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_endpoint.c	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ 	(revision )
@@ -1,126 +1,0 @@
-/*
- * Copyright (c) 2014 Jan Vesely
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/** @addtogroup drvusbehci
- * @{
- */
-/** @file
- * @brief EHCI driver
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <usb/debug.h>
-#include <usb/host/utils/malloc32.h>
-
-#include "ehci_endpoint.h"
-#include "hc.h"
-
-/** Callback to set toggle on ED.
- *
- * @param[in] hcd_ep hcd endpoint structure
- * @param[in] toggle new value of toggle bit
- */
-static void ehci_ep_toggle_set(void *ehci_ep, int toggle)
-{
-	ehci_endpoint_t *instance = ehci_ep;
-	assert(instance);
-	assert(instance->qh);
-	if (qh_toggle_from_td(instance->qh))
-		usb_log_warning("EP(%p): Setting toggle bit for transfer "
-		    "directed EP", instance);
-	qh_toggle_set(instance->qh, toggle);
-}
-
-/** Callback to get value of toggle bit.
- *
- * @param[in] hcd_ep hcd endpoint structure
- * @return Current value of toggle bit.
- */
-static int ehci_ep_toggle_get(void *ehci_ep)
-{
-	ehci_endpoint_t *instance = ehci_ep;
-	assert(instance);
-	assert(instance->qh);
-	if (qh_toggle_from_td(instance->qh))
-		usb_log_warning("EP(%p): Reading useless toggle bit", instance);
-	return qh_toggle_get(instance->qh);
-}
-
-/** Creates new hcd endpoint representation.
- *
- * @param[in] ep USBD endpoint structure
- * @return Error code.
- */
-int ehci_endpoint_init(hcd_t *hcd, endpoint_t *ep)
-{
-	assert(ep);
-	hc_t *hc = hcd_get_driver_data(hcd);
-
-	ehci_endpoint_t *ehci_ep = malloc(sizeof(ehci_endpoint_t));
-	if (ehci_ep == NULL)
-		return ENOMEM;
-
-	ehci_ep->qh = malloc32(sizeof(qh_t));
-	if (ehci_ep->qh == NULL) {
-		free(ehci_ep);
-		return ENOMEM;
-	}
-
-	usb_log_debug2("EP(%p): Creating for %p", ehci_ep, ep);
-	link_initialize(&ehci_ep->link);
-	qh_init(ehci_ep->qh, ep);
-	endpoint_set_hc_data(
-	    ep, ehci_ep, ehci_ep_toggle_get, ehci_ep_toggle_set);
-	hc_enqueue_endpoint(hc, ep);
-	return EOK;
-}
-
-/** Disposes hcd endpoint structure
- *
- * @param[in] hcd driver using this instance.
- * @param[in] ep endpoint structure.
- */
-void ehci_endpoint_fini(hcd_t *hcd, endpoint_t *ep)
-{
-	assert(hcd);
-	assert(ep);
-	hc_t *hc = hcd_get_driver_data(hcd);
-
-	ehci_endpoint_t *instance = ehci_endpoint_get(ep);
-	hc_dequeue_endpoint(hc, ep);
-	endpoint_clear_hc_data(ep);
-	usb_log_debug2("EP(%p): Destroying for %p", instance, ep);
-	if (instance) {
-		free32(instance->qh);
-		free(instance);
-	}
-}
-/**
- * @}
- */
-
Index: uspace/drv/bus/usb/ehci/ehci_endpoint.h
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_endpoint.h	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ 	(revision )
@@ -1,75 +1,0 @@
-/*
- * Copyright (c) 2011 Jan Vesely
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/** @addtogroup drvusbehci
- * @{
- */
-/** @file
- * @brief EHCI driver
- */
-#ifndef DRV_EHCI_HCD_ENDPOINT_H
-#define DRV_EHCI_HCD_ENDPOINT_H
-
-#include <assert.h>
-#include <adt/list.h>
-#include <usb/host/endpoint.h>
-#include <usb/host/hcd.h>
-
-#include "hw_struct/queue_head.h"
-#include "hw_struct/transfer_descriptor.h"
-
-/** Connector structure linking ED to to prepared TD. */
-typedef struct ehci_endpoint {
-	/** EHCI endpoint descriptor */
-	qh_t *qh;
-	/** Linked list used by driver software */
-	link_t link;
-} ehci_endpoint_t;
-
-int ehci_endpoint_init(hcd_t *hcd, endpoint_t *ep);
-void ehci_endpoint_fini(hcd_t *hcd, endpoint_t *ep);
-
-/** Get and convert assigned ehci_endpoint_t structure
- * @param[in] ep USBD endpoint structure.
- * @return Pointer to assigned hcd endpoint structure
- */
-static inline ehci_endpoint_t * ehci_endpoint_get(const endpoint_t *ep)
-{
-	assert(ep);
-	return ep->hc_data.data;
-}
-
-static inline ehci_endpoint_t * ehci_endpoint_list_instance(link_t *l)
-{
-	return list_get_instance(l, ehci_endpoint_t, link);
-}
-
-#endif
-/**
- * @}
- */
-
Index: uspace/drv/bus/usb/ehci/ehci_rh.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_rh.c	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ehci/ehci_rh.c	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -144,8 +144,5 @@
 	assert(instance);
 	assert(batch);
-	const usb_target_t target = {{
-		.address = batch->ep->address,
-		.endpoint = batch->ep->endpoint,
-	}};
+	const usb_target_t target = batch->ep->target;
 	batch->error = virthub_base_request(&instance->base, target,
 	    usb_transfer_batch_direction(batch), (void*)batch->setup_buffer,
@@ -183,8 +180,5 @@
 	    instance, batch);
 	if (batch) {
-		const usb_target_t target = {{
-			.address = batch->ep->address,
-			.endpoint = batch->ep->endpoint,
-		}};
+		const usb_target_t target = batch->ep->target;
 		batch->error = virthub_base_request(&instance->base, target,
 		    usb_transfer_batch_direction(batch),
Index: uspace/drv/bus/usb/ehci/endpoint_list.h
===================================================================
--- uspace/drv/bus/usb/ehci/endpoint_list.h	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ehci/endpoint_list.h	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -40,5 +40,5 @@
 #include <usb/host/utils/malloc32.h>
 
-#include "ehci_endpoint.h"
+#include "ehci_bus.h"
 #include "hw_struct/queue_head.h"
 
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -190,4 +190,5 @@
 	    &instance->rh, instance->caps, instance->registers, "ehci rh");
 
+	ehci_bus_init(&instance->bus, instance);
 	return EOK;
 }
@@ -214,5 +215,5 @@
 	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
 	usb_log_debug("HC(%p) enqueue EP(%d:%d:%s:%s)\n", instance,
-	    ep->address, ep->endpoint,
+	    ep->target.address, ep->target.endpoint,
 	    usb_str_transfer_type_short(ep->transfer_type),
 	    usb_str_direction(ep->direction));
@@ -238,5 +239,5 @@
 	ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
 	usb_log_debug("HC(%p) dequeue EP(%d:%d:%s:%s)\n", instance,
-	    ep->address, ep->endpoint,
+	    ep->target.address, ep->target.endpoint,
 	    usb_str_transfer_type_short(ep->transfer_type),
 	    usb_str_direction(ep->direction));
@@ -290,5 +291,5 @@
 
 	/* Check for root hub communication */
-	if (batch->ep->address == ehci_rh_get_address(&instance->rh)) {
+	if (batch->ep->target.address == ehci_rh_get_address(&instance->rh)) {
 		usb_log_debug("HC(%p): Scheduling BATCH(%p) for RH(%p)",
 		    instance, batch, &instance->rh);
Index: uspace/drv/bus/usb/ehci/hc.h
===================================================================
--- uspace/drv/bus/usb/ehci/hc.h	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ehci/hc.h	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -80,4 +80,7 @@
 	/** USB hub emulation structure */
 	ehci_rh_t rh;
+
+	/** USB bookkeeping */
+	ehci_bus_t bus;
 } hc_t;
 
Index: uspace/drv/bus/usb/ehci/hw_struct/queue_head.c
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -65,6 +65,6 @@
 	assert(ep->speed < ARRAY_SIZE(speed));
 	EHCI_MEM32_WR(instance->ep_char,
-	    QH_EP_CHAR_ADDR_SET(ep->address) |
-	    QH_EP_CHAR_EP_SET(ep->endpoint) |
+	    QH_EP_CHAR_ADDR_SET(ep->target.address) |
+	    QH_EP_CHAR_EP_SET(ep->target.endpoint) |
 	    speed[ep->speed] |
 	    QH_EP_CHAR_MAX_LENGTH_SET(ep->max_packet_size)
Index: uspace/drv/bus/usb/ehci/main.c
===================================================================
--- uspace/drv/bus/usb/ehci/main.c	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ehci/main.c	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -48,5 +48,4 @@
 #include "res.h"
 #include "hc.h"
-#include "ehci_endpoint.h"
 
 #define NAME "ehci"
@@ -67,6 +66,4 @@
 	.ops = {
 		.schedule       = ehci_hc_schedule,
-		.ep_add_hook    = ehci_endpoint_init,
-		.ep_remove_hook = ehci_endpoint_fini,
 		.irq_hook       = ehci_hc_interrupt,
 		.status_hook    = ehci_hc_status,
@@ -86,5 +83,5 @@
 	const int ret = hc_init(instance, res);
 	if (ret == EOK) {
-		hcd_set_implementation(hcd, instance, &ehci_hc_driver.ops);
+		hcd_set_implementation(hcd, instance, &ehci_hc_driver.ops, &instance->bus.base.base);
 	} else {
 		free(instance);
@@ -116,5 +113,5 @@
 
 	free(hc);
-	hcd_set_implementation(hcd, NULL, NULL);
+	hcd_set_implementation(hcd, NULL, NULL, NULL);
 }
 
Index: uspace/drv/bus/usb/ohci/ohci_bus.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_bus.c	(revision e6b91820ed239c638e2a7d99d66a324fe19e840f)
+++ uspace/drv/bus/usb/ohci/ohci_bus.c	(revision 741bcdeb7cf25de945b027110bc02ccbb1a6100e)
@@ -78,4 +78,6 @@
 	if (ohci_ep == NULL)
 		return NULL;
+
+	endpoint_init(&ohci_ep->base, bus);
 
 	ohci_ep->ed = malloc32(sizeof(ed_t));
