Index: uspace/lib/usb/include/usb/host/batch.h
===================================================================
--- uspace/lib/usb/include/usb/host/batch.h	(revision 79c8a964862f0ce14d3cec5fc6a0af2ebf9fa793)
+++ uspace/lib/usb/include/usb/host/batch.h	(revision be7950e872211bfaca7d6762e27f7b87dec4ec02)
@@ -46,4 +46,5 @@
 	usb_transfer_type_t transfer_type;
 	usb_speed_t speed;
+	usb_direction_t direction;
 	usbhc_iface_transfer_in_callback_t callback_in;
 	usbhc_iface_transfer_out_callback_t callback_out;
Index: uspace/lib/usb/include/usb/host/device_keeper.h
===================================================================
--- uspace/lib/usb/include/usb/host/device_keeper.h	(revision 79c8a964862f0ce14d3cec5fc6a0af2ebf9fa793)
+++ uspace/lib/usb/include/usb/host/device_keeper.h	(revision be7950e872211bfaca7d6762e27f7b87dec4ec02)
@@ -44,5 +44,5 @@
 	usb_speed_t speed;
 	bool occupied;
-	uint16_t toggle_status;
+	uint16_t toggle_status[2];
 	devman_handle_t handle;
 };
@@ -63,10 +63,12 @@
 
 void device_keeper_reset_if_need(
-    device_keeper_t *instance, usb_target_t target, const unsigned char *setup_data);
+    device_keeper_t *instance, usb_target_t target,
+    const unsigned char *setup_data);
 
-int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target);
+int device_keeper_get_toggle(
+    device_keeper_t *instance, usb_target_t target, usb_direction_t direction);
 
-int device_keeper_set_toggle(
-    device_keeper_t *instance, usb_target_t target, bool toggle);
+int device_keeper_set_toggle(device_keeper_t *instance,
+    usb_target_t target, usb_direction_t direction, bool toggle);
 
 usb_address_t device_keeper_request(
Index: uspace/lib/usb/src/host/batch.c
===================================================================
--- uspace/lib/usb/src/host/batch.c	(revision 79c8a964862f0ce14d3cec5fc6a0af2ebf9fa793)
+++ uspace/lib/usb/src/host/batch.c	(revision be7950e872211bfaca7d6762e27f7b87dec4ec02)
@@ -62,4 +62,5 @@
 	instance->transfer_type = transfer_type;
 	instance->speed = speed;
+	instance->direction = USB_DIRECTION_BOTH;
 	instance->callback_in = func_in;
 	instance->callback_out = func_out;
Index: uspace/lib/usb/src/host/device_keeper.c
===================================================================
--- uspace/lib/usb/src/host/device_keeper.c	(revision 79c8a964862f0ce14d3cec5fc6a0af2ebf9fa793)
+++ uspace/lib/usb/src/host/device_keeper.c	(revision be7950e872211bfaca7d6762e27f7b87dec4ec02)
@@ -55,5 +55,6 @@
 		instance->devices[i].occupied = false;
 		instance->devices[i].handle = 0;
-		instance->devices[i].toggle_status = 0;
+		instance->devices[i].toggle_status[0] = 0;
+		instance->devices[i].toggle_status[1] = 0;
 	}
 }
@@ -118,5 +119,7 @@
 		if (((data[0] & 0xf) == 1) && ((data[2] | data[3]) == 0)) {
 			/* endpoint number is < 16, thus first byte is enough */
-			instance->devices[target.address].toggle_status &=
+			instance->devices[target.address].toggle_status[0] &=
+			    ~(1 << data[4]);
+			instance->devices[target.address].toggle_status[1] &=
 			    ~(1 << data[4]);
 		}
@@ -127,5 +130,6 @@
 		/* target must be device */
 		if ((data[0] & 0xf) == 0) {
-			instance->devices[target.address].toggle_status = 0;
+			instance->devices[target.address].toggle_status[0] = 0;
+			instance->devices[target.address].toggle_status[1] = 0;
 		}
 	break;
@@ -140,7 +144,11 @@
  * @return Error code
  */
-int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target)
-{
-	assert(instance);
+int device_keeper_get_toggle(
+    device_keeper_t *instance, usb_target_t target, usb_direction_t direction)
+{
+	assert(instance);
+	/* only control pipes are bi-directional and those do not need toggle */
+	if (direction == USB_DIRECTION_BOTH)
+		return ENOENT;
 	int ret;
 	fibril_mutex_lock(&instance->guard);
@@ -151,5 +159,5 @@
 		ret = EINVAL;
 	} else {
-		ret = (instance->devices[target.address].toggle_status
+		ret = (instance->devices[target.address].toggle_status[direction]
 		        >> target.endpoint) & 1;
 	}
@@ -165,8 +173,11 @@
  * @return Error code.
  */
-int device_keeper_set_toggle(
-    device_keeper_t *instance, usb_target_t target, bool toggle)
-{
-	assert(instance);
+int device_keeper_set_toggle(device_keeper_t *instance,
+    usb_target_t target, usb_direction_t direction, bool toggle)
+{
+	assert(instance);
+	/* only control pipes are bi-directional and those do not need toggle */
+	if (direction == USB_DIRECTION_BOTH)
+		return ENOENT;
 	int ret;
 	fibril_mutex_lock(&instance->guard);
@@ -178,7 +189,9 @@
 	} else {
 		if (toggle) {
-			instance->devices[target.address].toggle_status |= (1 << target.endpoint);
+			instance->devices[target.address].toggle_status[direction]
+			    |= (1 << target.endpoint);
 		} else {
-			instance->devices[target.address].toggle_status &= ~(1 << target.endpoint);
+			instance->devices[target.address].toggle_status[direction]
+			    &= ~(1 << target.endpoint);
 		}
 		ret = EOK;
@@ -215,5 +228,6 @@
 	instance->devices[new_address].occupied = true;
 	instance->devices[new_address].speed = speed;
-	instance->devices[new_address].toggle_status = 0;
+	instance->devices[new_address].toggle_status[0] = 0;
+	instance->devices[new_address].toggle_status[1] = 0;
 	instance->last_address = new_address;
 	fibril_mutex_unlock(&instance->guard);
