Index: uspace/drv/uhci-hcd/batch.c
===================================================================
--- uspace/drv/uhci-hcd/batch.c	(revision edb5f837027ee48cf4458639552a9ddc1d1dda80)
+++ uspace/drv/uhci-hcd/batch.c	(revision 3e379645337853455b20b13bb59d9be46d3d6aec)
@@ -49,5 +49,5 @@
 static void batch_control(batch_t *instance,
     usb_packet_id data_stage, usb_packet_id status_stage);
-static void batch_data(batch_t *instance, usb_packet_id pid);
+static void batch_data(batch_t *instance, usb_packet_id pid, device_keeper_t *keeper);
 static void batch_call_in(batch_t *instance);
 static void batch_call_out(batch_t *instance);
@@ -194,8 +194,8 @@
 }
 /*----------------------------------------------------------------------------*/
-void batch_interrupt_in(batch_t *instance)
-{
-	assert(instance);
-	batch_data(instance, USB_PID_IN);
+void batch_interrupt_in(batch_t *instance, device_keeper_t *keeper)
+{
+	assert(instance);
+	batch_data(instance, USB_PID_IN, keeper);
 	instance->next_step = batch_call_in_and_dispose;
 	usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance);
@@ -203,9 +203,9 @@
 }
 /*----------------------------------------------------------------------------*/
-void batch_interrupt_out(batch_t *instance)
+void batch_interrupt_out(batch_t *instance, device_keeper_t *keeper)
 {
 	assert(instance);
 	memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size);
-	batch_data(instance, USB_PID_OUT);
+	batch_data(instance, USB_PID_OUT, keeper);
 	instance->next_step = batch_call_out_and_dispose;
 	usb_log_debug("Batch(%p) INTERRUPT OUT initialized.\n", instance);
@@ -213,8 +213,8 @@
 }
 /*----------------------------------------------------------------------------*/
-void batch_bulk_in(batch_t *instance)
-{
-	assert(instance);
-	batch_data(instance, USB_PID_IN);
+void batch_bulk_in(batch_t *instance, device_keeper_t *keeper)
+{
+	assert(instance);
+	batch_data(instance, USB_PID_IN, keeper);
 	instance->next_step = batch_call_in_and_dispose;
 	usb_log_debug("Batch(%p) BULK IN initialized.\n", instance);
@@ -222,9 +222,9 @@
 }
 /*----------------------------------------------------------------------------*/
-void batch_bulk_out(batch_t *instance)
+void batch_bulk_out(batch_t *instance, device_keeper_t *keeper)
 {
 	assert(instance);
 	memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size);
-	batch_data(instance, USB_PID_OUT);
+	batch_data(instance, USB_PID_OUT, keeper);
 	instance->next_step = batch_call_out_and_dispose;
 	usb_log_debug("Batch(%p) BULK OUT initialized.\n", instance);
@@ -232,9 +232,10 @@
 }
 /*----------------------------------------------------------------------------*/
-static void batch_data(batch_t *instance, usb_packet_id pid)
+void batch_data(batch_t *instance, usb_packet_id pid, device_keeper_t *keeper)
 {
 	assert(instance);
 	const bool low_speed = instance->speed == USB_SPEED_LOW;
-	int toggle = 1;
+	int toggle = device_keeper_get_toggle(keeper, instance->target);
+	assert(toggle == 0 || toggle == 1);
 
 	size_t packet = 0;
@@ -245,5 +246,4 @@
 		    - remain_size;
 
-		toggle = 1 - toggle;
 
 		const size_t packet_size =
@@ -256,4 +256,5 @@
 		    &instance->tds[packet + 1]);
 
+		toggle = 1 - toggle;
 		++packet;
 		assert(packet <= instance->packets);
@@ -261,4 +262,5 @@
 		remain_size -= packet_size;
 	}
+	device_keeper_set_toggle(keeper, instance->target, toggle);
 
 	instance->tds[packet - 1].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
@@ -266,5 +268,5 @@
 }
 /*----------------------------------------------------------------------------*/
-static void batch_control(batch_t *instance,
+void batch_control(batch_t *instance,
    usb_packet_id data_stage, usb_packet_id status_stage)
 {
Index: uspace/drv/uhci-hcd/batch.h
===================================================================
--- uspace/drv/uhci-hcd/batch.h	(revision edb5f837027ee48cf4458639552a9ddc1d1dda80)
+++ uspace/drv/uhci-hcd/batch.h	(revision 3e379645337853455b20b13bb59d9be46d3d6aec)
@@ -42,4 +42,5 @@
 #include "uhci_struct/transfer_descriptor.h"
 #include "uhci_struct/queue_head.h"
+#include "utils/device_keeper.h"
 
 typedef struct batch
@@ -82,11 +83,11 @@
 void batch_control_read(batch_t *instance);
 
-void batch_interrupt_in(batch_t *instance);
+void batch_interrupt_in(batch_t *instance, device_keeper_t *keeper);
 
-void batch_interrupt_out(batch_t *instance);
+void batch_interrupt_out(batch_t *instance, device_keeper_t *keeper);
 
-void batch_bulk_in(batch_t *instance);
+void batch_bulk_in(batch_t *instance, device_keeper_t *keeper);
 
-void batch_bulk_out(batch_t *instance);
+void batch_bulk_out(batch_t *instance, device_keeper_t *keeper);
 #endif
 /**
Index: uspace/drv/uhci-hcd/iface.c
===================================================================
--- uspace/drv/uhci-hcd/iface.c	(revision edb5f837027ee48cf4458639552a9ddc1d1dda80)
+++ uspace/drv/uhci-hcd/iface.c	(revision 3e379645337853455b20b13bb59d9be46d3d6aec)
@@ -117,5 +117,5 @@
 	if (!batch)
 		return ENOMEM;
-	batch_interrupt_out(batch);
+	batch_interrupt_out(batch, &hc->device_manager);
 	return EOK;
 }
@@ -136,5 +136,5 @@
 	if (!batch)
 		return ENOMEM;
-	batch_interrupt_in(batch);
+	batch_interrupt_in(batch, &hc->device_manager);
 	return EOK;
 }
@@ -156,5 +156,5 @@
 	if (!batch)
 		return ENOMEM;
-	batch_bulk_out(batch);
+	batch_bulk_out(batch, &hc->device_manager);
 	return EOK;
 }
@@ -175,5 +175,5 @@
 	if (!batch)
 		return ENOMEM;
-	batch_bulk_in(batch);
+	batch_bulk_in(batch, &hc->device_manager);
 	return EOK;
 }
