Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -128,5 +128,5 @@
 
 	const usb_address_t hub_address =
-	    device_keeper_get_free_address(
+	    usb_device_manager_get_free_address(
 	        &instance->generic.dev_manager, USB_SPEED_FULL);
 	if (hub_address <= 0) {
@@ -136,5 +136,5 @@
 	}
 	instance->rh.address = hub_address;
-	usb_device_keeper_bind(
+	usb_device_manager_bind(
 	    &instance->generic.dev_manager, hub_address, hub_fun->handle);
 
@@ -144,5 +144,5 @@
 	usb_endpoint_manager_unregister_ep( \
 	    &instance->generic.ep_manager, hub_address, 0, USB_DIRECTION_BOTH);\
-	usb_device_keeper_release( \
+	usb_device_manager_release( \
 	    &instance->generic.dev_manager, hub_address); \
 	return ret; \
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -41,6 +41,4 @@
 
 #include <usb/usb.h>
-#include <usb/host/device_keeper.h>
-#include <usb/host/usb_endpoint_manager.h>
 #include <usb/host/hcd.h>
 
Index: uspace/drv/bus/usb/ohci/ohci.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci.c	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/drv/bus/usb/ohci/ohci.c	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -86,8 +86,8 @@
 {
 	assert(fun);
-	usb_device_keeper_t *manager =
+	usb_device_manager_t *manager =
 	    &dev_to_ohci(fun->dev)->hc.generic.dev_manager;
 
-	const usb_address_t addr = usb_device_keeper_find(manager, handle);
+	const usb_address_t addr = usb_device_manager_find(manager, handle);
 	if (addr < 0) {
 		return addr;
Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -99,6 +99,7 @@
 {
 	assert(fun);
-	usb_device_keeper_t *manager = &dev_to_uhci(fun->dev)->hc.generic.dev_manager;
-	usb_address_t addr = usb_device_keeper_find(manager, handle);
+	usb_device_manager_t *manager =
+	    &dev_to_uhci(fun->dev)->hc.generic.dev_manager;
+	const usb_address_t addr = usb_device_manager_find(manager, handle);
 
 	if (addr < 0) {
Index: uspace/drv/bus/usb/vhc/connhost.c
===================================================================
--- uspace/drv/bus/usb/vhc/connhost.c	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/drv/bus/usb/vhc/connhost.c	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -62,6 +62,6 @@
 	VHC_DATA(vhc, fun);
 
-	usb_address_t addr = device_keeper_get_free_address(&vhc->dev_keeper,
-	    USB_SPEED_HIGH);
+	usb_address_t addr = usb_device_manager_get_free_address(
+	    &vhc->dev_manager, USB_SPEED_HIGH);
 	if (addr < 0) {
 		return addr;
@@ -88,5 +88,5 @@
 	usb_log_debug("Binding handle %" PRIun " to address %d.\n",
 	    handle, address);
-	usb_device_keeper_bind(&vhc->dev_keeper, address, handle);
+	usb_device_manager_bind(&vhc->dev_manager, address, handle);
 
 	return EOK;
@@ -105,5 +105,5 @@
 	VHC_DATA(vhc, fun);
 	bool found =
-	    usb_device_keeper_find_by_address(&vhc->dev_keeper, address, handle);
+	    usb_device_manager_find_by_address(&vhc->dev_manager, address, handle);
 	return found ? EOK : ENOENT;
 }
@@ -119,5 +119,5 @@
 	VHC_DATA(vhc, fun);
 	usb_log_debug("Releasing address %d...\n", address);
-	usb_device_keeper_release(&vhc->dev_keeper, address);
+	usb_device_manager_release(&vhc->dev_manager, address);
 
 	return ENOTSUP;
@@ -514,5 +514,5 @@
 
 	usb_log_debug("tell_address_rh(handle=%" PRIun ")\n", handle);
-	usb_address_t addr = usb_device_keeper_find(&vhc->dev_keeper, handle);
+	usb_address_t addr = usb_device_manager_find(&vhc->dev_manager, handle);
 	if (addr < 0) {
 		return addr;
Index: uspace/drv/bus/usb/vhc/main.c
===================================================================
--- uspace/drv/bus/usb/vhc/main.c	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/drv/bus/usb/vhc/main.c	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -80,5 +80,5 @@
 		return rc;
 	}
-	usb_device_keeper_init(&data->dev_keeper);
+	usb_device_manager_init(&data->dev_manager);
 
 	ddf_fun_t *hc = ddf_fun_create(dev, fun_exposed, "hc");
Index: uspace/drv/bus/usb/vhc/vhcd.h
===================================================================
--- uspace/drv/bus/usb/vhc/vhcd.h	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/drv/bus/usb/vhc/vhcd.h	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -39,5 +39,5 @@
 #include <usbvirt/device.h>
 #include <usb/host/usb_endpoint_manager.h>
-#include <usb/host/device_keeper.h>
+#include <usb/host/usb_device_manager.h>
 #include <usbhc_iface.h>
 #include <async.h>
@@ -60,5 +60,5 @@
 	fibril_mutex_t guard;
 	usb_endpoint_manager_t ep_manager;
-	usb_device_keeper_t dev_keeper;
+	usb_device_manager_t dev_manager;
 	usbvirt_device_t *hub;
 	ddf_fun_t *hc_fun;
Index: uspace/lib/usbhost/Makefile
===================================================================
--- uspace/lib/usbhost/Makefile	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/lib/usbhost/Makefile	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -35,7 +35,7 @@
 
 SOURCES = \
-	src/device_keeper.c \
 	src/endpoint.c \
 	src/iface.c \
+	src/usb_device_manager.c \
 	src/usb_endpoint_manager.c \
 	src/usb_transfer_batch.c
Index: pace/lib/usbhost/include/usb/host/device_keeper.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/device_keeper.h	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ 	(revision )
@@ -1,90 +1,0 @@
-/*
- * Copyright (c) 2011 Jan Vesely
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup libusbhost
- * @{
- */
-/** @file
- * Device keeper structure and functions.
- *
- * Typical USB host controller needs to keep track of various settings for
- * each device that is connected to it.
- * State of toggle bit, device speed etc. etc.
- * This structure shall simplify the management.
- */
-#ifndef LIBUSBHOST_HOST_DEVICE_KEEPER_H
-#define LIBUSBHOST_HOST_DEVICE_KEEPER_H
-
-#include <adt/list.h>
-#include <devman.h>
-#include <fibril_synch.h>
-#include <usb/usb.h>
-#include <usb/host/endpoint.h>
-
-/** Number of USB address for array dimensions. */
-#define USB_ADDRESS_COUNT (USB11_ADDRESS_MAX + 1)
-
-/** Information about attached USB device. */
-struct usb_device_info {
-	usb_speed_t speed;
-	bool occupied;
-	devman_handle_t handle;
-};
-
-/** Host controller device keeper.
- * You shall not access members directly but only using functions below.
- */
-typedef struct {
-	struct usb_device_info devices[USB_ADDRESS_COUNT];
-	fibril_mutex_t guard;
-	usb_address_t last_address;
-} usb_device_keeper_t;
-
-void usb_device_keeper_init(usb_device_keeper_t *instance);
-
-usb_address_t device_keeper_get_free_address(usb_device_keeper_t *instance,
-    usb_speed_t speed);
-
-void usb_device_keeper_bind(usb_device_keeper_t *instance,
-    usb_address_t address, devman_handle_t handle);
-
-void usb_device_keeper_release(usb_device_keeper_t *instance,
-    usb_address_t address);
-
-usb_address_t usb_device_keeper_find(usb_device_keeper_t *instance,
-    devman_handle_t handle);
-
-bool usb_device_keeper_find_by_address(usb_device_keeper_t *instance,
-    usb_address_t address, devman_handle_t *handle);
-
-usb_speed_t usb_device_keeper_get_speed(usb_device_keeper_t *instance,
-    usb_address_t address);
-#endif
-/**
- * @}
- */
Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -37,5 +37,5 @@
 
 #include <assert.h>
-#include <usb/host/device_keeper.h>
+#include <usb/host/usb_device_manager.h>
 #include <usb/host/usb_endpoint_manager.h>
 #include <usb/host/usb_transfer_batch.h>
@@ -45,5 +45,5 @@
 
 struct hcd {
-	usb_device_keeper_t dev_manager;
+	usb_device_manager_t dev_manager;
 	usb_endpoint_manager_t ep_manager;
 	void *private_data;
@@ -57,5 +57,5 @@
 {
 	assert(hcd);
-	usb_device_keeper_init(&hcd->dev_manager);
+	usb_device_manager_init(&hcd->dev_manager);
 	return usb_endpoint_manager_init(&hcd->ep_manager, bandwidth, bw_count);
 }
Index: uspace/lib/usbhost/include/usb/host/usb_device_manager.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/usb_device_manager.h	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
+++ uspace/lib/usbhost/include/usb/host/usb_device_manager.h	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2011 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/** @addtogroup libusbhost
+ * @{
+ */
+/** @file
+ * Device manager structure and functions.
+ *
+ * Typical USB host controller needs to keep track of various settings for
+ * each device that is connected to it.
+ * State of toggle bit, device speed etc. etc.
+ * This structure shall simplify the management.
+ */
+#ifndef LIBUSBHOST_HOST_USB_DEVICE_MANAGER_H
+#define LIBUSBHOST_HOST_USB_DEVICE_MANAGER_H
+
+#include <adt/list.h>
+#include <devman.h>
+#include <fibril_synch.h>
+#include <usb/usb.h>
+#include <usb/host/endpoint.h>
+
+/** Number of USB address for array dimensions. */
+#define USB_ADDRESS_COUNT (USB11_ADDRESS_MAX + 1)
+
+/** Information about attached USB device. */
+struct usb_device_info {
+	usb_speed_t speed;
+	bool occupied;
+	devman_handle_t handle;
+};
+
+/** Host controller device manager.
+ * You shall not access members directly but only using functions below.
+ */
+typedef struct {
+	struct usb_device_info devices[USB_ADDRESS_COUNT];
+	fibril_mutex_t guard;
+	usb_address_t last_address;
+} usb_device_manager_t;
+
+void usb_device_manager_init(usb_device_manager_t *instance);
+
+usb_address_t usb_device_manager_get_free_address(
+    usb_device_manager_t *instance, usb_speed_t speed);
+
+void usb_device_manager_bind(usb_device_manager_t *instance,
+    usb_address_t address, devman_handle_t handle);
+
+void usb_device_manager_release(usb_device_manager_t *instance,
+    usb_address_t address);
+
+usb_address_t usb_device_manager_find(usb_device_manager_t *instance,
+    devman_handle_t handle);
+
+bool usb_device_manager_find_by_address(usb_device_manager_t *instance,
+    usb_address_t address, devman_handle_t *handle);
+
+usb_speed_t usb_device_manager_get_speed(usb_device_manager_t *instance,
+    usb_address_t address);
+#endif
+/**
+ * @}
+ */
Index: pace/lib/usbhost/src/device_keeper.c
===================================================================
--- uspace/lib/usbhost/src/device_keeper.c	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ 	(revision )
@@ -1,208 +1,0 @@
-/*
- * Copyright (c) 2011 Jan Vesely
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup libusbhost
- * @{
- */
-/** @file
- * Device keeper structure and functions (implementation).
- */
-#include <assert.h>
-#include <errno.h>
-#include <usb/debug.h>
-#include <usb/host/device_keeper.h>
-
-/*----------------------------------------------------------------------------*/
-/** Initialize device keeper structure.
- *
- * @param[in] instance Memory place to initialize.
- *
- * Set all values to false/0.
- */
-void usb_device_keeper_init(usb_device_keeper_t *instance)
-{
-	assert(instance);
-	unsigned i = 0;
-	for (; i < USB_ADDRESS_COUNT; ++i) {
-		instance->devices[i].occupied = false;
-		instance->devices[i].handle = 0;
-		instance->devices[i].speed = USB_SPEED_MAX;
-	}
-	// TODO: is this hack enough?
-	// (it is needed to allow smooth registration at default address)
-	instance->devices[0].occupied = true;
-	instance->last_address = 0;
-	fibril_mutex_initialize(&instance->guard);
-}
-/*----------------------------------------------------------------------------*/
-/** Get a free USB address
- *
- * @param[in] instance Device keeper structure to use.
- * @param[in] speed Speed of the device requiring address.
- * @return Free address, or error code.
- */
-usb_address_t device_keeper_get_free_address(
-    usb_device_keeper_t *instance, usb_speed_t speed)
-{
-	assert(instance);
-	fibril_mutex_lock(&instance->guard);
-
-	usb_address_t new_address = instance->last_address;
-	do {
-		++new_address;
-		if (new_address > USB11_ADDRESS_MAX)
-			new_address = 1;
-		if (new_address == instance->last_address) {
-			fibril_mutex_unlock(&instance->guard);
-			return ENOSPC;
-		}
-	} while (instance->devices[new_address].occupied);
-
-	assert(new_address != USB_ADDRESS_DEFAULT);
-	assert(instance->devices[new_address].occupied == false);
-
-	instance->devices[new_address].occupied = true;
-	instance->devices[new_address].speed = speed;
-	instance->last_address = new_address;
-
-	fibril_mutex_unlock(&instance->guard);
-	return new_address;
-}
-/*----------------------------------------------------------------------------*/
-/** Bind USB address to devman handle.
- *
- * @param[in] instance Device keeper structure to use.
- * @param[in] address Device address
- * @param[in] handle Devman handle of the device.
- */
-void usb_device_keeper_bind(usb_device_keeper_t *instance,
-    usb_address_t address, devman_handle_t handle)
-{
-	assert(instance);
-	fibril_mutex_lock(&instance->guard);
-
-	assert(address > 0);
-	assert(address <= USB11_ADDRESS_MAX);
-	assert(instance->devices[address].occupied);
-
-	instance->devices[address].handle = handle;
-	fibril_mutex_unlock(&instance->guard);
-}
-/*----------------------------------------------------------------------------*/
-/** Release used USB address.
- *
- * @param[in] instance Device keeper structure to use.
- * @param[in] address Device address
- */
-void usb_device_keeper_release(
-    usb_device_keeper_t *instance, usb_address_t address)
-{
-	assert(instance);
-	assert(address > 0);
-	assert(address <= USB11_ADDRESS_MAX);
-
-	fibril_mutex_lock(&instance->guard);
-	assert(instance->devices[address].occupied);
-
-	instance->devices[address].occupied = false;
-	fibril_mutex_unlock(&instance->guard);
-}
-/*----------------------------------------------------------------------------*/
-/** Find USB address associated with the device
- *
- * @param[in] instance Device keeper structure to use.
- * @param[in] handle Devman handle of the device seeking its address.
- * @return USB Address, or error code.
- */
-usb_address_t usb_device_keeper_find(
-    usb_device_keeper_t *instance, devman_handle_t handle)
-{
-	assert(instance);
-	fibril_mutex_lock(&instance->guard);
-	usb_address_t address = 1;
-	while (address <= USB11_ADDRESS_MAX) {
-		if (instance->devices[address].handle == handle) {
-			assert(instance->devices[address].occupied);
-			fibril_mutex_unlock(&instance->guard);
-			return address;
-		}
-		++address;
-	}
-	fibril_mutex_unlock(&instance->guard);
-	return ENOENT;
-}
-
-/** Find devman handle assigned to USB address.
- * Intentionally refuse to find handle of default address.
- *
- * @param[in] instance Device keeper structure to use.
- * @param[in] address Address the caller wants to find.
- * @param[out] handle Where to store found handle.
- * @return Whether such address is currently occupied.
- */
-bool usb_device_keeper_find_by_address(usb_device_keeper_t *instance,
-    usb_address_t address, devman_handle_t *handle)
-{
-	assert(instance);
-	fibril_mutex_lock(&instance->guard);
-	if ((address <= 0) || (address >= USB_ADDRESS_COUNT)) {
-		fibril_mutex_unlock(&instance->guard);
-		return false;
-	}
-	if (!instance->devices[address].occupied) {
-		fibril_mutex_unlock(&instance->guard);
-		return false;
-	}
-
-	if (handle != NULL) {
-		*handle = instance->devices[address].handle;
-	}
-
-	fibril_mutex_unlock(&instance->guard);
-	return true;
-}
-
-/*----------------------------------------------------------------------------*/
-/** Get speed associated with the address
- *
- * @param[in] instance Device keeper structure to use.
- * @param[in] address Address of the device.
- * @return USB speed.
- */
-usb_speed_t usb_device_keeper_get_speed(
-    usb_device_keeper_t *instance, usb_address_t address)
-{
-	assert(instance);
-	assert(address >= 0);
-	assert(address <= USB11_ADDRESS_MAX);
-
-	return instance->devices[address].speed;
-}
-/**
- * @}
- */
Index: uspace/lib/usbhost/src/iface.c
===================================================================
--- uspace/lib/usbhost/src/iface.c	(revision f58ef61d1eb8228798d5216b18e8d5bab331b6f3)
+++ uspace/lib/usbhost/src/iface.c	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -107,5 +107,6 @@
 
 	usb_log_debug("Address request speed: %s.\n", usb_str_speed(speed));
-	*address = device_keeper_get_free_address(&hcd->dev_manager, speed);
+	*address =
+	    usb_device_manager_get_free_address(&hcd->dev_manager, speed);
 	usb_log_debug("Address request with result: %d.\n", *address);
 	if (*address <= 0)
@@ -129,5 +130,5 @@
 
 	usb_log_debug("Address bind %d-%" PRIun ".\n", address, handle);
-	usb_device_keeper_bind(&hcd->dev_manager, address, handle);
+	usb_device_manager_bind(&hcd->dev_manager, address, handle);
 	return EOK;
 }
@@ -147,5 +148,5 @@
 	assert(hcd);
 	const bool found =
-	    usb_device_keeper_find_by_address(&hcd->dev_manager, address, handle);
+	    usb_device_manager_find_by_address(&hcd->dev_manager, address, handle);
 	return found ? EOK : ENOENT;
 }
@@ -163,5 +164,5 @@
 	assert(hcd);
 	usb_log_debug("Address release %d.\n", address);
-	usb_device_keeper_release(&hcd->dev_manager, address);
+	usb_device_manager_release(&hcd->dev_manager, address);
 	return EOK;
 }
@@ -180,5 +181,5 @@
 	 * thus it does not provide speed info. */
 	const usb_speed_t speed = (address == 0) ? ep_speed :
-	    usb_device_keeper_get_speed(&hcd->dev_manager, address);
+	    usb_device_manager_get_speed(&hcd->dev_manager, address);
 
 	usb_log_debug("Register endpoint %d:%d %s-%s %s %zuB %ums.\n",
Index: uspace/lib/usbhost/src/usb_device_manager.c
===================================================================
--- uspace/lib/usbhost/src/usb_device_manager.c	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
+++ uspace/lib/usbhost/src/usb_device_manager.c	(revision 8b54fe65a364c1a1e5c214a700fc8d1bf4aed3e5)
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2011 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libusbhost
+ * @{
+ */
+/** @file
+ * Device manager structure and functions (implementation).
+ */
+#include <assert.h>
+#include <errno.h>
+#include <usb/debug.h>
+#include <usb/host/usb_device_manager.h>
+
+/*----------------------------------------------------------------------------*/
+/** Initialize device manager structure.
+ *
+ * @param[in] instance Memory place to initialize.
+ *
+ * Set all values to false/0.
+ */
+void usb_device_manager_init(usb_device_manager_t *instance)
+{
+	assert(instance);
+	unsigned i = 0;
+	for (; i < USB_ADDRESS_COUNT; ++i) {
+		instance->devices[i].occupied = false;
+		instance->devices[i].handle = 0;
+		instance->devices[i].speed = USB_SPEED_MAX;
+	}
+	// TODO: is this hack enough?
+	// (it is needed to allow smooth registration at default address)
+	instance->devices[0].occupied = true;
+	instance->last_address = 0;
+	fibril_mutex_initialize(&instance->guard);
+}
+/*----------------------------------------------------------------------------*/
+/** Get a free USB address
+ *
+ * @param[in] instance Device manager structure to use.
+ * @param[in] speed Speed of the device requiring address.
+ * @return Free address, or error code.
+ */
+usb_address_t usb_device_manager_get_free_address(
+    usb_device_manager_t *instance, usb_speed_t speed)
+{
+	assert(instance);
+	fibril_mutex_lock(&instance->guard);
+
+	usb_address_t new_address = instance->last_address;
+	do {
+		++new_address;
+		if (new_address > USB11_ADDRESS_MAX)
+			new_address = 1;
+		if (new_address == instance->last_address) {
+			fibril_mutex_unlock(&instance->guard);
+			return ENOSPC;
+		}
+	} while (instance->devices[new_address].occupied);
+
+	assert(new_address != USB_ADDRESS_DEFAULT);
+	assert(instance->devices[new_address].occupied == false);
+
+	instance->devices[new_address].occupied = true;
+	instance->devices[new_address].speed = speed;
+	instance->last_address = new_address;
+
+	fibril_mutex_unlock(&instance->guard);
+	return new_address;
+}
+/*----------------------------------------------------------------------------*/
+/** Bind USB address to devman handle.
+ *
+ * @param[in] instance Device manager structure to use.
+ * @param[in] address Device address
+ * @param[in] handle Devman handle of the device.
+ */
+void usb_device_manager_bind(usb_device_manager_t *instance,
+    usb_address_t address, devman_handle_t handle)
+{
+	assert(instance);
+	fibril_mutex_lock(&instance->guard);
+
+	assert(address > 0);
+	assert(address <= USB11_ADDRESS_MAX);
+	assert(instance->devices[address].occupied);
+
+	instance->devices[address].handle = handle;
+	fibril_mutex_unlock(&instance->guard);
+}
+/*----------------------------------------------------------------------------*/
+/** Release used USB address.
+ *
+ * @param[in] instance Device manager structure to use.
+ * @param[in] address Device address
+ */
+void usb_device_manager_release(
+    usb_device_manager_t *instance, usb_address_t address)
+{
+	assert(instance);
+	assert(address > 0);
+	assert(address <= USB11_ADDRESS_MAX);
+
+	fibril_mutex_lock(&instance->guard);
+	assert(instance->devices[address].occupied);
+
+	instance->devices[address].occupied = false;
+	fibril_mutex_unlock(&instance->guard);
+}
+/*----------------------------------------------------------------------------*/
+/** Find USB address associated with the device
+ *
+ * @param[in] instance Device manager structure to use.
+ * @param[in] handle Devman handle of the device seeking its address.
+ * @return USB Address, or error code.
+ */
+usb_address_t usb_device_manager_find(
+    usb_device_manager_t *instance, devman_handle_t handle)
+{
+	assert(instance);
+	fibril_mutex_lock(&instance->guard);
+	usb_address_t address = 1;
+	while (address <= USB11_ADDRESS_MAX) {
+		if (instance->devices[address].handle == handle) {
+			assert(instance->devices[address].occupied);
+			fibril_mutex_unlock(&instance->guard);
+			return address;
+		}
+		++address;
+	}
+	fibril_mutex_unlock(&instance->guard);
+	return ENOENT;
+}
+
+/** Find devman handle assigned to USB address.
+ * Intentionally refuse to find handle of default address.
+ *
+ * @param[in] instance Device manager structure to use.
+ * @param[in] address Address the caller wants to find.
+ * @param[out] handle Where to store found handle.
+ * @return Whether such address is currently occupied.
+ */
+bool usb_device_manager_find_by_address(usb_device_manager_t *instance,
+    usb_address_t address, devman_handle_t *handle)
+{
+	assert(instance);
+	fibril_mutex_lock(&instance->guard);
+	if ((address <= 0) || (address >= USB_ADDRESS_COUNT)) {
+		fibril_mutex_unlock(&instance->guard);
+		return false;
+	}
+	if (!instance->devices[address].occupied) {
+		fibril_mutex_unlock(&instance->guard);
+		return false;
+	}
+
+	if (handle != NULL) {
+		*handle = instance->devices[address].handle;
+	}
+
+	fibril_mutex_unlock(&instance->guard);
+	return true;
+}
+
+/*----------------------------------------------------------------------------*/
+/** Get speed associated with the address
+ *
+ * @param[in] instance Device manager structure to use.
+ * @param[in] address Address of the device.
+ * @return USB speed.
+ */
+usb_speed_t usb_device_manager_get_speed(
+    usb_device_manager_t *instance, usb_address_t address)
+{
+	assert(instance);
+	assert(address >= 0);
+	assert(address <= USB11_ADDRESS_MAX);
+
+	return instance->devices[address].speed;
+}
+/**
+ * @}
+ */
