Index: uspace/drv/uhci-hcd/utils/device_keeper.c
===================================================================
--- uspace/drv/uhci-hcd/utils/device_keeper.c	(revision 40a5d40dcbcbedcbd434dd13acde0004d1bc729e)
+++ uspace/drv/uhci-hcd/utils/device_keeper.c	(revision edb5f837027ee48cf4458639552a9ddc1d1dda80)
@@ -49,4 +49,5 @@
 		instance->devices[i].occupied = false;
 		instance->devices[i].handle = 0;
+		instance->devices[i].toggle_status = 0;
 	}
 }
@@ -75,4 +76,42 @@
 }
 /*----------------------------------------------------------------------------*/
+int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target)
+{
+	assert(instance);
+	int ret;
+	fibril_mutex_lock(&instance->guard);
+	if (target.endpoint > 15 || target.endpoint < 0
+	    || target.address >= USB_ADDRESS_COUNT || target.address < 0
+	    || !instance->devices[target.address].occupied) {
+		ret = EINVAL;
+	} else {
+		ret = (instance->devices[target.address].toggle_status >> target.endpoint) & 1;
+	}
+	fibril_mutex_unlock(&instance->guard);
+	return ret;
+}
+/*----------------------------------------------------------------------------*/
+int device_keeper_set_toggle(
+    device_keeper_t *instance, usb_target_t target, bool toggle)
+{
+	assert(instance);
+	int ret;
+	fibril_mutex_lock(&instance->guard);
+	if (target.endpoint > 15 || target.endpoint < 0
+	    || target.address >= USB_ADDRESS_COUNT || target.address < 0
+	    || !instance->devices[target.address].occupied) {
+		ret = EINVAL;
+	} else {
+		if (toggle) {
+			instance->devices[target.address].toggle_status |= (1 << target.endpoint);
+		} else {
+			instance->devices[target.address].toggle_status &= ~(1 << target.endpoint);
+		}
+		ret = EOK;
+	}
+	fibril_mutex_unlock(&instance->guard);
+	return ret;
+}
+/*----------------------------------------------------------------------------*/
 usb_address_t device_keeper_request(
     device_keeper_t *instance, usb_speed_t speed)
@@ -96,4 +135,5 @@
 	instance->devices[new_address].occupied = true;
 	instance->devices[new_address].speed = speed;
+	instance->devices[new_address].toggle_status = 0;
 	instance->last_address = new_address;
 	fibril_mutex_unlock(&instance->guard);
Index: uspace/drv/uhci-hcd/utils/device_keeper.h
===================================================================
--- uspace/drv/uhci-hcd/utils/device_keeper.h	(revision 40a5d40dcbcbedcbd434dd13acde0004d1bc729e)
+++ uspace/drv/uhci-hcd/utils/device_keeper.h	(revision edb5f837027ee48cf4458639552a9ddc1d1dda80)
@@ -44,4 +44,5 @@
 	usb_speed_t speed;
 	bool occupied;
+	uint16_t toggle_status;
 	devman_handle_t handle;
 };
@@ -55,13 +56,22 @@
 
 void device_keeper_init(device_keeper_t *instance);
+
 void device_keeper_reserve_default(
     device_keeper_t *instance, usb_speed_t speed);
+
 void device_keeper_release_default(device_keeper_t *instance);
+
+int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target);
+
+int device_keeper_set_toggle(device_keeper_t *instance, usb_target_t target, bool toggle);
 
 usb_address_t device_keeper_request(
     device_keeper_t *instance, usb_speed_t speed);
+
 void device_keeper_bind(
     device_keeper_t *instance, usb_address_t address, devman_handle_t handle);
+
 void device_keeper_release(device_keeper_t *instance, usb_address_t address);
+
 usb_address_t device_keeper_find(
     device_keeper_t *instance, devman_handle_t handle);
