Index: uspace/drv/bus/usb/ehci/ehci_bus.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
+++ uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 56257bacb801bcdf1177e596773f80cf4e253e5d)
@@ -48,31 +48,13 @@
  * @param[in] toggle new value of toggle bit
  */
-static void ehci_ep_toggle_set(endpoint_t *ep, bool toggle)
+static void ehci_ep_toggle_reset(endpoint_t *ep)
 {
 	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);
+		usb_log_warning("EP(%p): Resetting toggle bit for transfer directed EP", instance);
+	qh_toggle_set(instance->qh, 0);
+	ep->toggle = 0;
 }
 
-/** 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.
@@ -166,6 +148,5 @@
 	.endpoint_register = ehci_register_ep,
 	.endpoint_unregister = ehci_unregister_ep,
-	.endpoint_set_toggle = ehci_ep_toggle_set,
-	.endpoint_get_toggle = ehci_ep_toggle_get,
+	.endpoint_toggle_reset = ehci_ep_toggle_reset,
 	.endpoint_count_bw = bandwidth_count_usb11,
 	.batch_create = ehci_create_batch,
Index: uspace/drv/bus/usb/ohci/ohci_bus.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_bus.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
+++ uspace/drv/bus/usb/ohci/ohci_bus.c	(revision 56257bacb801bcdf1177e596773f80cf4e253e5d)
@@ -43,29 +43,16 @@
 #include "hc.h"
 
-/** Callback to set toggle on ED.
+/** Callback to reset toggle on ED.
  *
  * @param[in] hcd_ep hcd endpoint structure
  * @param[in] toggle new value of toggle bit
  */
-static void ohci_ep_toggle_set(endpoint_t *ep, bool toggle)
+static void ohci_ep_toggle_reset(endpoint_t *ep)
 {
 	ohci_endpoint_t *instance = ohci_endpoint_get(ep);
 	assert(instance);
 	assert(instance->ed);
-	ep->toggle = toggle;
-	ed_toggle_set(instance->ed, toggle);
-}
-
-/** Callback to get value of toggle bit.
- *
- * @param[in] hcd_ep hcd endpoint structure
- * @return Current value of toggle bit.
- */
-static bool ohci_ep_toggle_get(endpoint_t *ep)
-{
-	ohci_endpoint_t *instance = ohci_endpoint_get(ep);
-	assert(instance);
-	assert(instance->ed);
-	return ed_toggle_get(instance->ed);
+	ep->toggle = 0;
+	ed_toggle_set(instance->ed, 0);
 }
 
@@ -166,6 +153,5 @@
 	.endpoint_unregister = ohci_unregister_ep,
 	.endpoint_count_bw = bandwidth_count_usb11,
-	.endpoint_set_toggle = ohci_ep_toggle_set,
-	.endpoint_get_toggle = ohci_ep_toggle_get,
+	.endpoint_toggle_reset = ohci_ep_toggle_reset,
 	.batch_create = ohci_create_batch,
 	.batch_destroy = ohci_destroy_batch,
Index: uspace/drv/bus/usb/uhci/uhci_batch.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
+++ uspace/drv/bus/usb/uhci/uhci_batch.c	(revision 56257bacb801bcdf1177e596773f80cf4e253e5d)
@@ -178,6 +178,5 @@
 			td_print_status(&uhci_batch->tds[i]);
 
-			endpoint_toggle_set(batch->ep,
-			    td_toggle(&uhci_batch->tds[i]));
+			batch->ep->toggle = td_toggle(&uhci_batch->tds[i]);
 			if (i > 0)
 				goto substract_ret;
@@ -195,5 +194,4 @@
 
 	fibril_mutex_lock(&batch->ep->guard);
-	usb_transfer_batch_reset_toggle(batch);
 	endpoint_deactivate_locked(batch->ep);
 	fibril_mutex_unlock(&batch->ep->guard);
@@ -236,5 +234,5 @@
 	const size_t mps = uhci_batch->base.ep->max_packet_size;
 
-	int toggle = endpoint_toggle_get(uhci_batch->base.ep);
+	int toggle = uhci_batch->base.ep->toggle;
 	assert(toggle == 0 || toggle == 1);
 
@@ -260,5 +258,5 @@
 	}
 	td_set_ioc(&uhci_batch->tds[td - 1]);
-	endpoint_toggle_set(uhci_batch->base.ep, toggle);
+	uhci_batch->base.ep->toggle = toggle;
 	usb_log_debug2(
 	    "Batch %p %s %s " USB_TRANSFER_BATCH_FMT " initialized.\n", \
Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision 56257bacb801bcdf1177e596773f80cf4e253e5d)
@@ -77,31 +77,25 @@
 		goto err_slot;
 
-	/* Temporary reference */
+	/* Bus reference */
 	endpoint_add_ref(ep0_base);
+	dev->base.endpoints[0] = ep0_base;
 
 	xhci_endpoint_t *ep0 = xhci_endpoint_get(ep0_base);
 
 	if ((err = xhci_endpoint_alloc_transfer_ds(ep0)))
-		goto err_ep;
-
-	/* Register EP0 */
-	if ((err = xhci_device_add_endpoint(dev, ep0)))
-		goto err_prepared;
+		goto err_added;
 
 	/* Address device */
 	if ((err = hc_address_device(bus->hc, dev, ep0)))
-		goto err_added;
-
-	/* Temporary reference */
-	endpoint_del_ref(ep0_base);
-	return EOK;
-
-err_added:
-	xhci_device_remove_endpoint(ep0);
+		goto err_prepared;
+
+	return EOK;
+
 err_prepared:
 	xhci_endpoint_free_transfer_ds(ep0);
-err_ep:
-	/* Temporary reference */
+err_added:
+	/* Bus reference */
 	endpoint_del_ref(ep0_base);
+	dev->base.endpoints[0] = NULL;
 err_slot:
 	hc_disable_slot(bus->hc, dev);
@@ -123,5 +117,5 @@
 		return err;
 
-	xhci_endpoint_t *ep0 = dev->endpoints[0];
+	xhci_endpoint_t *ep0 = xhci_device_get_endpoint(dev, 0);
 	assert(ep0);
 
@@ -218,6 +212,6 @@
 	/* Abort running transfers. */
 	usb_log_debug2("Aborting all active transfers to device " XHCI_DEV_FMT ".", XHCI_DEV_ARGS(*xhci_dev));
-	for (size_t i = 0; i < ARRAY_SIZE(xhci_dev->endpoints); ++i) {
-		xhci_endpoint_t *ep = xhci_dev->endpoints[i];
+	for (usb_endpoint_t i = 0; i < USB_ENDPOINT_MAX; ++i) {
+		xhci_endpoint_t *ep = xhci_device_get_endpoint(xhci_dev, i);
 		if (!ep)
 			continue;
@@ -244,11 +238,11 @@
 
 	/* Unregister remaining endpoints, freeing memory. */
-	for (unsigned i = 0; i < ARRAY_SIZE(xhci_dev->endpoints); ++i) {
-		if (!xhci_dev->endpoints[i])
+	for (usb_endpoint_t i = 0; i < USB_ENDPOINT_MAX; ++i) {
+		if (!dev->endpoints[i])
 			continue;
 
-		if ((err = endpoint_unregister(&xhci_dev->endpoints[i]->base))) {
+		if ((err = endpoint_unregister(dev->endpoints[i]))) {
 			usb_log_warning("Failed to unregister endpoint " XHCI_EP_FMT ": %s",
-			    XHCI_EP_ARGS(*xhci_dev->endpoints[i]), str_error(err));
+			    XHCI_EP_ARGS(*xhci_device_get_endpoint(xhci_dev, i)), str_error(err));
 		}
 	}
@@ -332,15 +326,10 @@
 
 	/* We will need the endpoint array later for DS deallocation. */
-	xhci_endpoint_t *endpoints[ARRAY_SIZE(dev->endpoints)];
-	memcpy(endpoints, dev->endpoints, sizeof(dev->endpoints));
-
-	/* Remove all endpoints except zero. */
-	for (unsigned i = 1; i < ARRAY_SIZE(endpoints); ++i) {
-		if (!endpoints[i])
-			continue;
-
+	endpoint_t *endpoints[USB_ENDPOINT_MAX];
+	memcpy(endpoints, dev->base.endpoints, sizeof(endpoints));
+
+	for (usb_endpoint_t i = 1; i < USB_ENDPOINT_MAX; ++i) {
 		/* FIXME: Asserting here that the endpoint is not active. If not, EBUSY? */
-
-		xhci_device_remove_endpoint(endpoints[i]);
+		dev->base.endpoints[i] = NULL;
 	}
 
@@ -356,8 +345,8 @@
 			continue;
 
-		xhci_endpoint_free_transfer_ds(endpoints[i]);
-	}
-
-	/* FIXME: What happens to unregistered endpoints now? Destroy them? */
+		xhci_endpoint_free_transfer_ds(xhci_endpoint_get(endpoints[i]));
+		/* Bus reference */
+		endpoint_del_ref(endpoints[i]);
+	}
 
 	return EOK;
@@ -397,7 +386,4 @@
 		return err;
 
-	if ((err = xhci_device_add_endpoint(dev, ep)))
-		goto err_prepared;
-
 	usb_log_info("Endpoint " XHCI_EP_FMT " registered to XHCI bus.", XHCI_EP_ARGS(*ep));
 
@@ -406,10 +392,8 @@
 
 	if ((err = hc_add_endpoint(bus->hc, dev->slot_id, xhci_endpoint_index(ep), &ep_ctx)))
-		goto err_added;
-
-	return EOK;
-
-err_added:
-	xhci_device_remove_endpoint(ep);
+		goto err_prepared;
+
+	return EOK;
+
 err_prepared:
 	xhci_endpoint_free_transfer_ds(ep);
@@ -425,6 +409,4 @@
 
 	usb_log_info("Endpoint " XHCI_EP_FMT " unregistered from XHCI bus.", XHCI_EP_ARGS(*ep));
-
-	xhci_device_remove_endpoint(ep);
 
 	/* If device slot is still available, drop the endpoint. */
@@ -444,33 +426,4 @@
 }
 
-static endpoint_t* device_find_endpoint(device_t *dev_base, usb_target_t target, usb_direction_t direction)
-{
-	xhci_device_t *dev = xhci_device_get(dev_base);
-
-	xhci_endpoint_t *ep = xhci_device_get_endpoint(dev, target.endpoint);
-	if (!ep)
-		return NULL;
-
-	return &ep->base;
-}
-
-static int reset_toggle(bus_t *bus_base, usb_target_t target, toggle_reset_mode_t mode)
-{
-	// TODO: Implement me!
-	return ENOTSUP;
-}
-
-/* Endpoint ops, optional (have generic fallback) */
-static bool endpoint_get_toggle(endpoint_t *ep)
-{
-	// TODO: Implement me!
-	return ENOTSUP;
-}
-
-static void endpoint_set_toggle(endpoint_t *ep, bool toggle)
-{
-	// TODO: Implement me!
-}
-
 static int reserve_default_address(bus_t *bus_base, usb_speed_t speed)
 {
@@ -510,5 +463,4 @@
 	BIND_OP(reserve_default_address)
 	BIND_OP(release_default_address)
-	BIND_OP(reset_toggle)
 
 	BIND_OP(device_enumerate)
@@ -516,5 +468,4 @@
 	BIND_OP(device_online)
 	BIND_OP(device_offline)
-	BIND_OP(device_find_endpoint)
 
 	BIND_OP(endpoint_create)
@@ -522,6 +473,4 @@
 	BIND_OP(endpoint_register)
 	BIND_OP(endpoint_unregister)
-	BIND_OP(endpoint_get_toggle)
-	BIND_OP(endpoint_set_toggle)
 
 	BIND_OP(batch_create)
Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision 56257bacb801bcdf1177e596773f80cf4e253e5d)
@@ -469,47 +469,4 @@
 }
 
-/** Add a new XHCI endpoint to a device. The device must be online unless
- * the added endpoint is number 0.
- * @param[in] dev XHCI device, to which to add the endpoint
- * @param[in] ep XHCI endpoint to add.
- *
- * @return Error code.
- */
-int xhci_device_add_endpoint(xhci_device_t *dev, xhci_endpoint_t *ep)
-{
-	assert(dev);
-	assert(ep);
-
-	/* Offline devices don't create new endpoints other than EP0. */
-	if (!dev->base.online && ep->base.endpoint > 0) {
-		return EAGAIN;
-	}
-
-	const usb_endpoint_t ep_num = ep->base.endpoint;
-
-	if (dev->endpoints[ep_num])
-		return EEXIST;
-
-	/* Device reference */
-	endpoint_add_ref(&ep->base);
-	ep->base.device = &dev->base;
-	dev->endpoints[ep_num] = ep;
-
-	return EOK;
-}
-
-/** Remove XHCI endpoint from a device.
- * @param[in] ep XHCI endpoint to remove.
- */
-void xhci_device_remove_endpoint(xhci_endpoint_t *ep)
-{
-	assert(ep);
-	xhci_device_t *dev = xhci_device_get(ep->base.device);
-
-	assert(dev->endpoints[ep->base.endpoint]);
-	dev->endpoints[ep->base.endpoint] = NULL;
-	ep->base.device = NULL;
-}
-
 /** Retrieve XHCI endpoint from a device by the endpoint number.
  * @param[in] dev XHCI device to query.
@@ -520,5 +477,5 @@
 xhci_endpoint_t *xhci_device_get_endpoint(xhci_device_t *dev, usb_endpoint_t ep)
 {
-	return dev->endpoints[ep];
+	return xhci_endpoint_get(dev->base.endpoints[ep]);
 }
 
Index: uspace/drv/bus/usb/xhci/endpoint.h
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.h	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
+++ uspace/drv/bus/usb/xhci/endpoint.h	(revision 56257bacb801bcdf1177e596773f80cf4e253e5d)
@@ -139,7 +139,4 @@
 	dma_buffer_t dev_ctx;
 
-	/** All endpoints of the device. Dropped ones are NULL */
-	xhci_endpoint_t *endpoints[XHCI_EP_COUNT];
-
 	/** Flag indicating whether the device is USB3 (it's USB2 otherwise). */
 	bool usb3;
@@ -161,6 +158,4 @@
 void xhci_setup_endpoint_context(xhci_endpoint_t *, xhci_ep_ctx_t *);
 
-int xhci_device_add_endpoint(xhci_device_t *, xhci_endpoint_t *);
-void xhci_device_remove_endpoint(xhci_endpoint_t *);
 xhci_endpoint_t * xhci_device_get_endpoint(xhci_device_t *, usb_endpoint_t);
 
Index: uspace/drv/bus/usb/xhci/transfers.c
===================================================================
--- uspace/drv/bus/usb/xhci/transfers.c	(revision 9efad54470c08d7d51f40a9febdaa103916aec6f)
+++ uspace/drv/bus/usb/xhci/transfers.c	(revision 56257bacb801bcdf1177e596773f80cf4e253e5d)
@@ -513,5 +513,4 @@
 	}
 
-	usb_transfer_batch_reset_toggle(batch);
 	endpoint_deactivate_locked(&ep->base);
 	fibril_mutex_unlock(&ep->base.guard);
