Index: uspace/lib/usb/include/usb/host/device_keeper.h
===================================================================
--- uspace/lib/usb/include/usb/host/device_keeper.h	(revision 30718cc298b13345b94a52f71b777c0e57dc3d21)
+++ uspace/lib/usb/include/usb/host/device_keeper.h	(revision da88eb826d0b2007b0b668c0f7828a8f2d9d54c8)
@@ -51,4 +51,5 @@
 	usb_speed_t speed;
 	bool occupied;
+	bool control_used;
 	uint16_t toggle_status[2];
 	devman_handle_t handle;
@@ -61,5 +62,5 @@
 	struct usb_device_info devices[USB_ADDRESS_COUNT];
 	fibril_mutex_t guard;
-	fibril_condvar_t default_address_occupied;
+	fibril_condvar_t change;
 	usb_address_t last_address;
 } usb_device_keeper_t;
@@ -97,4 +98,10 @@
     usb_address_t address);
 
+void usb_device_keeper_use_control(usb_device_keeper_t *instance,
+    usb_address_t address);
+
+void usb_device_keeper_release_control(usb_device_keeper_t *instance,
+    usb_address_t address);
+
 #endif
 /**
Index: uspace/lib/usb/src/host/device_keeper.c
===================================================================
--- uspace/lib/usb/src/host/device_keeper.c	(revision 30718cc298b13345b94a52f71b777c0e57dc3d21)
+++ uspace/lib/usb/src/host/device_keeper.c	(revision da88eb826d0b2007b0b668c0f7828a8f2d9d54c8)
@@ -49,9 +49,10 @@
 	assert(instance);
 	fibril_mutex_initialize(&instance->guard);
-	fibril_condvar_initialize(&instance->default_address_occupied);
+	fibril_condvar_initialize(&instance->change);
 	instance->last_address = 0;
 	unsigned i = 0;
 	for (; i < USB_ADDRESS_COUNT; ++i) {
 		instance->devices[i].occupied = false;
+		instance->devices[i].control_used = false;
 		instance->devices[i].handle = 0;
 		instance->devices[i].toggle_status[0] = 0;
@@ -71,6 +72,5 @@
 	fibril_mutex_lock(&instance->guard);
 	while (instance->devices[USB_ADDRESS_DEFAULT].occupied) {
-		fibril_condvar_wait(&instance->default_address_occupied,
-		    &instance->guard);
+		fibril_condvar_wait(&instance->change, &instance->guard);
 	}
 	instance->devices[USB_ADDRESS_DEFAULT].occupied = true;
@@ -90,5 +90,5 @@
 	instance->devices[USB_ADDRESS_DEFAULT].occupied = false;
 	fibril_mutex_unlock(&instance->guard);
-	fibril_condvar_signal(&instance->default_address_occupied);
+	fibril_condvar_signal(&instance->change);
 }
 /*----------------------------------------------------------------------------*/
@@ -309,5 +309,26 @@
 	return instance->devices[address].speed;
 }
-
+/*----------------------------------------------------------------------------*/
+void usb_device_keeper_use_control(usb_device_keeper_t *instance,
+    usb_address_t address)
+{
+	assert(instance);
+	fibril_mutex_lock(&instance->guard);
+	while (instance->devices[address].control_used) {
+		fibril_condvar_wait(&instance->change, &instance->guard);
+	}
+	instance->devices[address].control_used = true;
+	fibril_mutex_unlock(&instance->guard);
+}
+/*----------------------------------------------------------------------------*/
+void usb_device_keeper_release_control(usb_device_keeper_t *instance,
+    usb_address_t address)
+{
+	assert(instance);
+	fibril_mutex_lock(&instance->guard);
+	instance->devices[address].control_used = false;
+	fibril_mutex_unlock(&instance->guard);
+	fibril_condvar_signal(&instance->change);
+}
 /**
  * @}
