Index: uspace/drv/ohci/iface.c
===================================================================
--- uspace/drv/ohci/iface.c	(revision 501e5df2482df5d8fad5599fc5f684cdc627c72e)
+++ uspace/drv/ohci/iface.c	(revision ba038f4c93fb491fd894bcb2d47723def2cf7c64)
@@ -245,6 +245,4 @@
 	if (ret != EOK) {
 		endpoint_destroy(ep);
-	} else {
-		usb_device_keeper_add_ep(&hc->manager, address, ep);
 	}
 	return ret;
@@ -259,9 +257,4 @@
 	usb_log_debug("Unregister endpoint %d:%d %d.\n",
 	    address, endpoint, direction);
-	endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager,
-	    address, endpoint, direction, NULL);
-	if (ep != NULL) {
-		usb_device_keeper_del_ep(&hc->manager, address, ep);
-	}
 	return usb_endpoint_manager_unregister_ep(&hc->ep_manager, address,
 	    endpoint, direction);
@@ -435,5 +428,5 @@
 	if (ret != EOK)
 		return ret;
-	usb_device_keeper_reset_if_need(&hc->manager, target, setup_data);
+	usb_endpoint_manager_reset_if_need(&hc->ep_manager, target, setup_data);
 	batch_control_write(batch);
 	ret = hc_schedule(hc, batch);
Index: uspace/drv/uhci-hcd/iface.c
===================================================================
--- uspace/drv/uhci-hcd/iface.c	(revision 501e5df2482df5d8fad5599fc5f684cdc627c72e)
+++ uspace/drv/uhci-hcd/iface.c	(revision ba038f4c93fb491fd894bcb2d47723def2cf7c64)
@@ -232,6 +232,4 @@
 	if (ret != EOK) {
 		endpoint_destroy(ep);
-	} else {
-		usb_device_keeper_add_ep(&hc->manager, address, ep);
 	}
 	return ret;
@@ -246,9 +244,4 @@
 	usb_log_debug("Unregister endpoint %d:%d %d.\n",
 	    address, endpoint, direction);
-	endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager,
-	    address, endpoint, direction, NULL);
-	if (ep != NULL) {
-		usb_device_keeper_del_ep(&hc->manager, address, ep);
-	}
 	return usb_endpoint_manager_unregister_ep(&hc->ep_manager, address,
 	    endpoint, direction);
@@ -391,5 +384,5 @@
 	if (ret != EOK)
 		return ret;
-	usb_device_keeper_reset_if_need(&hc->manager, target, setup_data);
+	usb_endpoint_manager_reset_if_need(&hc->ep_manager, target, setup_data);
 	batch_control_write(batch);
 	ret = hc_schedule(hc, batch);
Index: uspace/lib/usb/include/usb/host/device_keeper.h
===================================================================
--- uspace/lib/usb/include/usb/host/device_keeper.h	(revision 501e5df2482df5d8fad5599fc5f684cdc627c72e)
+++ uspace/lib/usb/include/usb/host/device_keeper.h	(revision ba038f4c93fb491fd894bcb2d47723def2cf7c64)
@@ -71,9 +71,4 @@
 void usb_device_keeper_init(usb_device_keeper_t *instance);
 
-void usb_device_keeper_add_ep(
-    usb_device_keeper_t *instance, usb_address_t address, endpoint_t *ep);
-void usb_device_keeper_del_ep(
-    usb_device_keeper_t *instance, usb_address_t address, endpoint_t *ep);
-
 void usb_device_keeper_reserve_default_address(
     usb_device_keeper_t *instance, usb_speed_t speed);
Index: uspace/lib/usb/include/usb/host/endpoint.h
===================================================================
--- uspace/lib/usb/include/usb/host/endpoint.h	(revision 501e5df2482df5d8fad5599fc5f684cdc627c72e)
+++ uspace/lib/usb/include/usb/host/endpoint.h	(revision ba038f4c93fb491fd894bcb2d47723def2cf7c64)
@@ -54,5 +54,4 @@
 	fibril_condvar_t avail;
 	volatile bool active;
-	link_t same_device_eps;
 } endpoint_t;
 
@@ -71,8 +70,5 @@
 void endpoint_toggle_set(endpoint_t *instance, int toggle);
 
-void endpoint_toggle_reset(link_t *ep);
-
-void endpoint_toggle_reset_filtered(link_t *ep, usb_endpoint_t epn);
-
+void endpoint_toggle_reset_filtered(endpoint_t *instance, usb_target_t target);
 #endif
 /**
Index: uspace/lib/usb/include/usb/host/usb_endpoint_manager.h
===================================================================
--- uspace/lib/usb/include/usb/host/usb_endpoint_manager.h	(revision 501e5df2482df5d8fad5599fc5f684cdc627c72e)
+++ uspace/lib/usb/include/usb/host/usb_endpoint_manager.h	(revision ba038f4c93fb491fd894bcb2d47723def2cf7c64)
@@ -78,4 +78,6 @@
     size_t *bw);
 
+void usb_endpoint_manager_reset_if_need(
+    usb_endpoint_manager_t *instance, usb_target_t target, const uint8_t *data);
 #endif
 /**
Index: uspace/lib/usb/src/host/device_keeper.c
===================================================================
--- uspace/lib/usb/src/host/device_keeper.c	(revision 501e5df2482df5d8fad5599fc5f684cdc627c72e)
+++ uspace/lib/usb/src/host/device_keeper.c	(revision ba038f4c93fb491fd894bcb2d47723def2cf7c64)
@@ -54,33 +54,10 @@
 	for (; i < USB_ADDRESS_COUNT; ++i) {
 		instance->devices[i].occupied = false;
-		instance->devices[i].control_used = 0;
 		instance->devices[i].handle = 0;
 		instance->devices[i].speed = USB_SPEED_MAX;
-		list_initialize(&instance->devices[i].endpoints);
 	}
 	// TODO: is this hack enough?
 	// (it is needed to allow smooth registration at default address)
 	instance->devices[0].occupied = true;
-}
-/*----------------------------------------------------------------------------*/
-void usb_device_keeper_add_ep(
-    usb_device_keeper_t *instance, usb_address_t address, endpoint_t *ep)
-{
-	assert(instance);
-	fibril_mutex_lock(&instance->guard);
-	assert(instance->devices[address].occupied);
-	list_append(&ep->same_device_eps, &instance->devices[address].endpoints);
-	fibril_mutex_unlock(&instance->guard);
-}
-/*----------------------------------------------------------------------------*/
-void usb_device_keeper_del_ep(
-    usb_device_keeper_t *instance, usb_address_t address, endpoint_t *ep)
-{
-	assert(instance);
-	fibril_mutex_lock(&instance->guard);
-	assert(instance->devices[address].occupied);
-	list_remove(&ep->same_device_eps);
-	list_initialize(&ep->same_device_eps);
-	fibril_mutex_unlock(&instance->guard);
 }
 /*----------------------------------------------------------------------------*/
@@ -117,60 +94,4 @@
 }
 /*----------------------------------------------------------------------------*/
-/** Check setup packet data for signs of toggle reset.
- *
- * @param[in] instance Device keeper structure to use.
- * @param[in] target Device to receive setup packet.
- * @param[in] data Setup packet data.
- *
- * Really ugly one.
- */
-void usb_device_keeper_reset_if_need(
-    usb_device_keeper_t *instance, usb_target_t target, const uint8_t *data)
-{
-	assert(instance);
-	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) {
-		fibril_mutex_unlock(&instance->guard);
-		usb_log_error("Invalid data when checking for toggle reset.\n");
-		return;
-	}
-
-	switch (data[1])
-	{
-	case 0x01: /*clear feature*/
-		/* recipient is endpoint, value is zero (ENDPOINT_STALL) */
-		if (((data[0] & 0xf) == 1) && ((data[2] | data[3]) == 0)) {
-			link_t *current =
-			    instance->devices[target.address].endpoints.next;
-			while (current !=
-			   &instance->devices[target.address].endpoints)
-			{
-			/* endpoint number is < 16, thus first byte is enough */
-				endpoint_toggle_reset_filtered(
-				    current, data[4]);
-				current = current->next;
-			}
-		}
-	break;
-
-	case 0x9: /* set configuration */
-	case 0x11: /* set interface */
-		/* target must be device */
-		if ((data[0] & 0xf) == 0) {
-			link_t *current =
-			    instance->devices[target.address].endpoints.next;
-			while (current !=
-			   &instance->devices[target.address].endpoints)
-			{
-				endpoint_toggle_reset(current);
-				current = current->next;
-			}
-		}
-	break;
-	}
-	fibril_mutex_unlock(&instance->guard);
-}
 /*----------------------------------------------------------------------------*/
 /** Get a free USB address
Index: uspace/lib/usb/src/host/endpoint.c
===================================================================
--- uspace/lib/usb/src/host/endpoint.c	(revision 501e5df2482df5d8fad5599fc5f684cdc627c72e)
+++ uspace/lib/usb/src/host/endpoint.c	(revision ba038f4c93fb491fd894bcb2d47723def2cf7c64)
@@ -53,5 +53,4 @@
 	fibril_mutex_initialize(&instance->guard);
 	fibril_condvar_initialize(&instance->avail);
-	link_initialize(&instance->same_device_eps);
 	return EOK;
 }
@@ -61,5 +60,4 @@
 	assert(instance);
 	assert(!instance->active);
-	list_remove(&instance->same_device_eps);
 	free(instance);
 }
@@ -97,18 +95,9 @@
 }
 /*----------------------------------------------------------------------------*/
-void endpoint_toggle_reset(link_t *ep)
+void endpoint_toggle_reset_filtered(endpoint_t *instance, usb_target_t target)
 {
-	endpoint_t *instance =
-	    list_get_instance(ep, endpoint_t, same_device_eps);
 	assert(instance);
-	instance->toggle = 0;
-}
-/*----------------------------------------------------------------------------*/
-void endpoint_toggle_reset_filtered(link_t *ep, usb_endpoint_t epn)
-{
-	endpoint_t *instance =
-	    list_get_instance(ep, endpoint_t, same_device_eps);
-	assert(instance);
-	if (instance->endpoint == epn)
+	if (instance->address == target.address &&
+	    instance->endpoint == target.endpoint)
 		instance->toggle = 0;
 }
Index: uspace/lib/usb/src/host/usb_endpoint_manager.c
===================================================================
--- uspace/lib/usb/src/host/usb_endpoint_manager.c	(revision 501e5df2482df5d8fad5599fc5f684cdc627c72e)
+++ uspace/lib/usb/src/host/usb_endpoint_manager.c	(revision ba038f4c93fb491fd894bcb2d47723def2cf7c64)
@@ -31,4 +31,5 @@
 #include <errno.h>
 
+#include <usb/debug.h>
 #include <usb/host/usb_endpoint_manager.h>
 
@@ -80,4 +81,12 @@
 	endpoint_destroy(node->ep);
 	free(node);
+}
+/*----------------------------------------------------------------------------*/
+static void node_toggle_reset_filtered(link_t *item, void *arg)
+{
+	assert(item);
+	node_t *node = hash_table_get_instance(item, node_t, link);
+	usb_target_t *target = arg;
+	endpoint_toggle_reset_filtered(node->ep, *target);
 }
 /*----------------------------------------------------------------------------*/
@@ -230,2 +239,50 @@
 	return node->ep;
 }
+/*----------------------------------------------------------------------------*/
+/** Check setup packet data for signs of toggle reset.
+ *
+ * @param[in] instance Device keeper structure to use.
+ * @param[in] target Device to receive setup packet.
+ * @param[in] data Setup packet data.
+ *
+ * Really ugly one.
+ */
+void usb_endpoint_manager_reset_if_need(
+    usb_endpoint_manager_t *instance, usb_target_t target, const uint8_t *data)
+{
+	assert(instance);
+	if (target.endpoint > 15 || target.endpoint < 0
+	    || target.address >= USB11_ADDRESS_MAX || target.address < 0) {
+		usb_log_error("Invalid data when checking for toggle reset.\n");
+		return;
+	}
+
+	switch (data[1])
+	{
+	case 0x01: /*clear feature*/
+		/* recipient is endpoint, value is zero (ENDPOINT_STALL) */
+		if (((data[0] & 0xf) == 1) && ((data[2] | data[3]) == 0)) {
+			/* endpoint number is < 16, thus first byte is enough */
+			usb_target_t reset_target =
+			    { .address = target.address, data[4] };
+			fibril_mutex_lock(&instance->guard);
+			hash_table_apply(&instance->ep_table,
+			    node_toggle_reset_filtered, &reset_target);
+			fibril_mutex_unlock(&instance->guard);
+		}
+	break;
+
+	case 0x9: /* set configuration */
+	case 0x11: /* set interface */
+		/* target must be device */
+		if ((data[0] & 0xf) == 0) {
+			usb_target_t reset_target =
+			    { .address = target.address, 0 };
+			fibril_mutex_lock(&instance->guard);
+			hash_table_apply(&instance->ep_table,
+			    node_toggle_reset_filtered, &reset_target);
+			fibril_mutex_unlock(&instance->guard);
+		}
+	break;
+	}
+}
