Index: uspace/drv/uhci-hcd/Makefile
===================================================================
--- uspace/drv/uhci-hcd/Makefile	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-hcd/Makefile	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -39,4 +39,5 @@
 	uhci.c \
 	uhci_struct/transfer_descriptor.c \
+	utils/device_keeper.c \
 	pci.c \
 	batch.c
Index: uspace/drv/uhci-hcd/batch.c
===================================================================
--- uspace/drv/uhci-hcd/batch.c	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-hcd/batch.c	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -53,5 +53,5 @@
 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target,
     usb_transfer_type_t transfer_type, size_t max_packet_size,
-    dev_speed_t speed, char *buffer, size_t size,
+    usb_speed_t speed, char *buffer, size_t size,
     char* setup_buffer, size_t setup_size,
     usbhc_iface_transfer_in_callback_t func_in,
Index: uspace/drv/uhci-hcd/batch.h
===================================================================
--- uspace/drv/uhci-hcd/batch.h	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-hcd/batch.h	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -43,13 +43,8 @@
 #include "uhci_struct/queue_head.h"
 
-typedef enum {
-	LOW_SPEED,
-	FULL_SPEED,
-} dev_speed_t;
-
 typedef struct batch
 {
 	link_t link;
-	dev_speed_t speed;
+	usb_speed_t speed;
 	usb_target_t target;
 	usb_transfer_type_t transfer_type;
@@ -76,5 +71,5 @@
 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target,
     usb_transfer_type_t transfer_type, size_t max_packet_size,
-    dev_speed_t speed, char *buffer, size_t size,
+    usb_speed_t speed, char *buffer, size_t size,
 		char *setup_buffer, size_t setup_size,
     usbhc_iface_transfer_in_callback_t func_in,
Index: uspace/drv/uhci-hcd/iface.c
===================================================================
--- uspace/drv/uhci-hcd/iface.c	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-hcd/iface.c	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -41,6 +41,5 @@
 #include "iface.h"
 #include "uhci.h"
-
-#define DEFAULT_SPEED FULL_SPEED
+#include "utils/device_keeper.h"
 
 /*----------------------------------------------------------------------------*/
@@ -50,5 +49,6 @@
 	uhci_t *hc = fun_to_uhci(fun);
 	assert(hc);
-	usb_address_keeping_reserve_default(&hc->address_manager);
+	usb_log_debug("Default address request with speed %d.\n", speed);
+	device_keeper_reserve_default(&hc->device_manager, speed);
 	return EOK;
 }
@@ -59,5 +59,6 @@
 	uhci_t *hc = fun_to_uhci(fun);
 	assert(hc);
-	usb_address_keeping_release_default(&hc->address_manager);
+	usb_log_debug("Default address release.\n");
+	device_keeper_release_default(&hc->device_manager);
 	return EOK;
 }
@@ -69,5 +70,9 @@
 	uhci_t *hc = fun_to_uhci(fun);
 	assert(hc);
-	*address = usb_address_keeping_request(&hc->address_manager);
+	assert(address);
+
+	usb_log_debug("Address request with speed %d.\n", speed);
+	*address = device_keeper_request(&hc->device_manager, speed);
+	usb_log_debug("Address request with result: %d.\n", *address);
 	if (*address <= 0)
 	  return *address;
@@ -81,5 +86,6 @@
 	uhci_t *hc = fun_to_uhci(fun);
 	assert(hc);
-	usb_address_keeping_devman_bind(&hc->address_manager, address, handle);
+	usb_log_debug("Address bind %d-%d.\n", address, handle);
+	device_keeper_bind(&hc->device_manager, address, handle);
 	return EOK;
 }
@@ -90,14 +96,17 @@
 	uhci_t *hc = fun_to_uhci(fun);
 	assert(hc);
-	usb_address_keeping_release_default(&hc->address_manager);
+	usb_log_debug("Address release %d.\n", address);
+	device_keeper_release(&hc->device_manager, address);
 	return EOK;
 }
 /*----------------------------------------------------------------------------*/
 static int interrupt_out(ddf_fun_t *fun, usb_target_t target,
-    size_t max_packet_size,
-    void *data, size_t size,
+    size_t max_packet_size, void *data, size_t size,
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	dev_speed_t speed = DEFAULT_SPEED;
+	assert(fun);
+	uhci_t *hc = fun_to_uhci(fun);
+	assert(hc);
+	usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);
 
 	batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,
@@ -114,5 +123,8 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	dev_speed_t speed = DEFAULT_SPEED;
+	assert(fun);
+	uhci_t *hc = fun_to_uhci(fun);
+	assert(hc);
+	usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);
 
 	batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,
@@ -129,5 +141,8 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	dev_speed_t speed = DEFAULT_SPEED;
+	assert(fun);
+	uhci_t *hc = fun_to_uhci(fun);
+	assert(hc);
+	usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);
 
 	batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,
@@ -145,5 +160,8 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	dev_speed_t speed = DEFAULT_SPEED;
+	assert(fun);
+	uhci_t *hc = fun_to_uhci(fun);
+	assert(hc);
+	usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);
 
 	batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,
Index: uspace/drv/uhci-hcd/main.c
===================================================================
--- uspace/drv/uhci-hcd/main.c	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-hcd/main.c	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -82,5 +82,4 @@
 	usb_log_info("uhci_add_device() called\n");
 
-
 	uintptr_t io_reg_base = 0;
 	size_t io_reg_size = 0;
@@ -96,6 +95,6 @@
 	io_reg_size = 32;
 
-//	ret = pci_enable_interrupts(device);
-//	CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);
+	ret = pci_enable_interrupts(device);
+	CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);
 
 	uhci_t *uhci_hc = malloc(sizeof(uhci_t));
Index: uspace/drv/uhci-hcd/root_hub.c
===================================================================
--- uspace/drv/uhci-hcd/root_hub.c	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-hcd/root_hub.c	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -64,5 +64,5 @@
 	assert(hc);
 
-	usb_address_t addr = usb_address_keeping_find(&hc->address_manager,
+	usb_address_t addr = device_keeper_find(&hc->device_manager,
 	    handle);
 	if (addr < 0) {
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -69,5 +69,7 @@
 	assert(hc);
 
-	usb_address_t addr = usb_address_keeping_find(&hc->address_manager,
+//	usb_address_t addr = usb_address_keeping_find(&hc->address_manager,
+//	    handle);
+	usb_address_t addr = device_keeper_find(&hc->device_manager,
 	    handle);
 	if (addr < 0) {
@@ -141,5 +143,5 @@
 
 	instance->cleaner = fibril_create(uhci_interrupt_emulator, instance);
-	fibril_add_ready(instance->cleaner);
+//	fibril_add_ready(instance->cleaner);
 
 	instance->debug_checker = fibril_create(uhci_debug_checker, instance);
@@ -161,6 +163,6 @@
 
 	/* enable all interrupts, but resume interrupt */
-//	pio_write_16(&instance->registers->usbintr,
-//		  UHCI_INTR_CRC | UHCI_INTR_COMPLETE | UHCI_INTR_SHORT_PACKET);
+	pio_write_16(&instance->registers->usbintr,
+		  UHCI_INTR_CRC | UHCI_INTR_COMPLETE | UHCI_INTR_SHORT_PACKET);
 
 	/* Start the hc with large(64B) packet FSBR */
@@ -207,6 +209,6 @@
 
 	/* init address keeper(libusb) */
-	usb_address_keeping_init(&instance->address_manager, USB11_ADDRESS_MAX);
-	usb_log_debug("Initialized address manager.\n");
+	device_keeper_init(&instance->device_manager);
+	usb_log_debug("Initialized device manager.\n");
 
 	return EOK;
@@ -259,5 +261,5 @@
 	assert(instance);
 	assert(batch);
-	const int low_speed = (batch->speed == LOW_SPEED);
+	const int low_speed = (batch->speed == USB_SPEED_LOW);
 	if (!allowed_usb_packet(
 	    low_speed, batch->transfer_type, batch->max_packet_size)) {
Index: uspace/drv/uhci-hcd/uhci.h
===================================================================
--- uspace/drv/uhci-hcd/uhci.h	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-hcd/uhci.h	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -41,9 +41,9 @@
 #include <ddi.h>
 
-#include <usb/addrkeep.h>
 #include <usbhc_iface.h>
 
+#include "batch.h"
 #include "transfer_list.h"
-#include "batch.h"
+#include "utils/device_keeper.h"
 
 typedef struct uhci_regs {
@@ -82,5 +82,6 @@
 
 typedef struct uhci {
-	usb_address_keeping_t address_manager;
+	device_keeper_t device_manager;
+
 	volatile regs_t *registers;
 
Index: uspace/drv/uhci-rhd/main.c
===================================================================
--- uspace/drv/uhci-rhd/main.c	(revision 5f183dc4838c34c9d629c1c31e7eac82fd19c5e3)
+++ uspace/drv/uhci-rhd/main.c	(revision 1a93bb00af7ce2226c00707e4276eb0f46ce41a2)
@@ -116,5 +116,5 @@
 int main(int argc, char *argv[])
 {
-	usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
+	usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
 	return ddf_driver_main(&uhci_rh_driver);
 }
