Index: uspace/drv/bus/usb/ehci/ehci_bus.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.c	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/ehci/ehci_bus.c	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -43,10 +43,11 @@
 #include "hc.h"
 
-/** Callback to set toggle on ED.
+/**
+ * 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_reset(endpoint_t *ep)
+void ehci_ep_toggle_reset(endpoint_t *ep)
 {
 	ehci_endpoint_t *instance = ehci_endpoint_get(ep);
@@ -54,5 +55,4 @@
 		usb_log_warning("EP(%p): Resetting toggle bit for transfer directed EP", instance);
 	qh_toggle_set(instance->qh, 0);
-	ep->toggle = 0;
 }
 
@@ -169,10 +169,11 @@
 	.interrupt = ehci_hc_interrupt,
 	.status = ehci_hc_status,
+
 	.endpoint_destroy = ehci_endpoint_destroy,
 	.endpoint_create = ehci_endpoint_create,
 	.endpoint_register = ehci_register_ep,
 	.endpoint_unregister = ehci_unregister_ep,
-	.endpoint_toggle_reset = ehci_ep_toggle_reset,
 	.endpoint_count_bw = bandwidth_count_usb20,
+
 	.batch_create = ehci_create_batch,
 	.batch_destroy = ehci_destroy_batch,
Index: uspace/drv/bus/usb/ehci/ehci_bus.h
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_bus.h	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/ehci/ehci_bus.h	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -68,4 +68,5 @@
 } ehci_bus_t;
 
+void ehci_ep_toggle_reset(endpoint_t *);
 void ehci_bus_prepare_ops(void);
 
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -45,4 +45,5 @@
 #include <usb/debug.h>
 #include <usb/usb.h>
+#include <usb/host/utility.h>
 
 #include "ehci_batch.h"
@@ -379,4 +380,5 @@
 				list_remove(current);
 				endpoint_del_ref(&ep->base);
+				hc_reset_toggles(&batch->base, &ehci_ep_toggle_reset);
 				usb_transfer_batch_finish(&batch->base);
 			}
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -45,4 +45,5 @@
 
 #include <usb/debug.h>
+#include <usb/host/utility.h>
 #include <usb/usb.h>
 
@@ -377,4 +378,5 @@
 				list_remove(current);
 				endpoint_del_ref(&ep->base);
+				hc_reset_toggles(&batch->base, &ohci_ep_toggle_reset);
 				usb_transfer_batch_finish(&batch->base);
 			}
Index: uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c
===================================================================
--- uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -100,9 +100,4 @@
 	OHCI_MEM32_WR(instance->td_head, pa & ED_TDHEAD_PTR_MASK);
 	OHCI_MEM32_WR(instance->td_tail, pa & ED_TDTAIL_PTR_MASK);
-
-	/* Set toggle bit */
-	if (ep->toggle)
-		OHCI_MEM32_SET(instance->td_head, ED_TDHEAD_TOGGLE_CARRY);
-
 }
 /**
Index: uspace/drv/bus/usb/ohci/ohci_bus.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_bus.c	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/ohci/ohci_bus.c	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -43,15 +43,15 @@
 #include "hc.h"
 
-/** Callback to reset 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_reset(endpoint_t *ep)
+void ohci_ep_toggle_reset(endpoint_t *ep)
 {
 	ohci_endpoint_t *instance = ohci_endpoint_get(ep);
 	assert(instance);
 	assert(instance->ed);
-	ep->toggle = 0;
 	ed_toggle_set(instance->ed, 0);
 }
@@ -179,5 +179,5 @@
 	.endpoint_unregister = ohci_unregister_ep,
 	.endpoint_count_bw = bandwidth_count_usb11,
-	.endpoint_toggle_reset = ohci_ep_toggle_reset,
+
 	.batch_create = ohci_create_batch,
 	.batch_destroy = ohci_destroy_batch,
Index: uspace/drv/bus/usb/ohci/ohci_bus.h
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_bus.h	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/ohci/ohci_bus.h	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -65,4 +65,5 @@
 
 int ohci_bus_init(ohci_bus_t *, hc_t *);
+void ohci_ep_toggle_reset(endpoint_t *);
 
 /** Get and convert assigned ohci_endpoint_t structure
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -127,4 +127,10 @@
 } hc_t;
 
+typedef struct uhci_endpoint {
+	endpoint_t base;
+
+	bool toggle;
+} uhci_endpoint_t;
+
 static inline hc_t *hcd_to_hc(hc_device_t *hcd)
 {
Index: uspace/drv/bus/usb/uhci/transfer_list.c
===================================================================
--- uspace/drv/bus/usb/uhci/transfer_list.c	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/uhci/transfer_list.c	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -41,7 +41,9 @@
 #include <usb/host/usb_transfer_batch.h>
 #include <usb/host/utils/malloc32.h>
+#include <usb/host/utility.h>
 
 #include "hw_struct/link_pointer.h"
 #include "transfer_list.h"
+#include "hc.h"
 
 /** Initialize transfer list structures.
@@ -155,4 +157,13 @@
 }
 
+/**
+ * Reset toggle on endpoint callback.
+ */
+static void uhci_reset_toggle(endpoint_t *ep)
+{
+	uhci_endpoint_t *uhci_ep = (uhci_endpoint_t *) ep;
+	uhci_ep->toggle = 0;
+}
+
 /** Add completed batches to the provided list.
  *
@@ -176,4 +187,5 @@
 			fibril_mutex_lock(&batch->base.ep->guard);
 			assert(batch->base.ep->active_batch == &batch->base);
+			hc_reset_toggles(&batch->base, &uhci_reset_toggle);
 			endpoint_deactivate_locked(batch->base.ep);
 			transfer_list_remove_batch(instance, batch);
Index: uspace/drv/bus/usb/uhci/uhci_batch.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_batch.c	(revision 69b2dfeeee479d9e4635b9c021ff6493aefd76a6)
+++ uspace/drv/bus/usb/uhci/uhci_batch.c	(revision c6f82e543978d3fafa47bd89b2e23a3d0a86cf50)
@@ -46,4 +46,5 @@
 
 #include "uhci_batch.h"
+#include "hc.h"
 #include "hw_struct/transfer_descriptor.h"
 
@@ -164,4 +165,6 @@
 	batch->transfered_size = 0;
 
+	uhci_endpoint_t *uhci_ep = (uhci_endpoint_t *) batch->ep;
+
 	for (size_t i = 0;i < uhci_batch->td_count; ++i) {
 		if (td_is_active(&uhci_batch->tds[i])) {
@@ -178,5 +181,5 @@
 			td_print_status(&uhci_batch->tds[i]);
 
-			batch->ep->toggle = td_toggle(&uhci_batch->tds[i]);
+			uhci_ep->toggle = td_toggle(&uhci_batch->tds[i]);
 			goto substract_ret;
 		}
@@ -230,5 +233,7 @@
 	const size_t mps = uhci_batch->base.ep->max_packet_size;
 
-	int toggle = uhci_batch->base.ep->toggle;
+	uhci_endpoint_t *uhci_ep = (uhci_endpoint_t *) uhci_batch->base.ep;
+
+	int toggle = uhci_ep->toggle;
 	assert(toggle == 0 || toggle == 1);
 
@@ -254,5 +259,5 @@
 	}
 	td_set_ioc(&uhci_batch->tds[td - 1]);
-	uhci_batch->base.ep->toggle = toggle;
+	uhci_ep->toggle = toggle;
 	usb_log_debug2(
 	    "Batch %p %s %s " USB_TRANSFER_BATCH_FMT " initialized.", \
