Index: uspace/lib/usbhost/src/iface.c
===================================================================
--- uspace/lib/usbhost/src/iface.c	(revision db2cb04d30489049d84db8ab1d20c969b36ac3a4)
+++ uspace/lib/usbhost/src/iface.c	(revision 42679089e62747f5e00b53db2cc50e13781157a1)
@@ -147,7 +147,6 @@
 	hcd_t *hcd = fun_to_hcd(fun);
 	assert(hcd);
-	const bool found =
-	    usb_device_manager_find_by_address(&hcd->dev_manager, address, handle);
-	return found ? EOK : ENOENT;
+	return usb_device_manager_get_info_by_address(
+	    &hcd->dev_manager, address, handle, NULL);
 }
 /*----------------------------------------------------------------------------*/
@@ -180,6 +179,9 @@
 	/* Default address is not bound or registered,
 	 * thus it does not provide speed info. */
-	const usb_speed_t speed = (address == 0) ? ep_speed :
-	    usb_device_manager_get_speed(&hcd->dev_manager, address);
+	usb_speed_t speed = ep_speed;
+	/* NOTE The function will return EINVAL and won't
+	 * touch speed variable for default address */
+	usb_device_manager_get_info_by_address(
+	    &hcd->dev_manager, address, NULL, &speed);
 
 	usb_log_debug("Register endpoint %d:%d %s-%s %s %zuB %ums.\n",
@@ -192,15 +194,15 @@
 	if (!ep)
 		return ENOMEM;
-	int ret = EOK;
 
 	if (hcd->ep_add_hook) {
-		ret = hcd->ep_add_hook(hcd, ep);
-	}
-	if (ret != EOK) {
-		endpoint_destroy(ep);
-		return ret;
-	}
-
-	ret = usb_endpoint_manager_register_ep(&hcd->ep_manager, ep, size);
+		const int ret = hcd->ep_add_hook(hcd, ep);
+		if (ret != EOK) {
+			endpoint_destroy(ep);
+			return ret;
+		}
+	}
+
+	const int ret =
+	    usb_endpoint_manager_register_ep(&hcd->ep_manager, ep, size);
 	if (ret != EOK) {
 		endpoint_destroy(ep);
Index: uspace/lib/usbhost/src/usb_device_manager.c
===================================================================
--- uspace/lib/usbhost/src/usb_device_manager.c	(revision db2cb04d30489049d84db8ab1d20c969b36ac3a4)
+++ uspace/lib/usbhost/src/usb_device_manager.c	(revision 42679089e62747f5e00b53db2cc50e13781157a1)
@@ -38,5 +38,4 @@
 #include <usb/host/usb_device_manager.h>
 
-/*----------------------------------------------------------------------------*/
 /** Initialize device manager structure.
  *
@@ -77,5 +76,6 @@
 		++new_address;
 		if (new_address > USB11_ADDRESS_MAX)
-			new_address = 1;
+			new_address = 1; // NOTE it should be safe to put 0 here
+			                 // TODO Use mod
 		if (new_address == instance->last_address) {
 			fibril_mutex_unlock(&instance->guard);
@@ -86,4 +86,5 @@
 	assert(new_address != USB_ADDRESS_DEFAULT);
 	assert(instance->devices[new_address].occupied == false);
+	assert(instance->devices[new_address].handle == 0);
 
 	instance->devices[new_address].occupied = true;
@@ -131,4 +132,5 @@
 
 	instance->devices[address].occupied = false;
+	instance->devices[address].handle = 0;
 	fibril_mutex_unlock(&instance->guard);
 }
@@ -140,5 +142,5 @@
  * @return USB Address, or error code.
  */
-usb_address_t usb_device_manager_find(
+usb_address_t usb_device_manager_find_address(
     usb_device_manager_t *instance, devman_handle_t handle)
 {
@@ -157,25 +159,26 @@
 	return ENOENT;
 }
-
-/** Find devman handle assigned to USB address.
- * Intentionally refuse to find handle of default address.
+/*----------------------------------------------------------------------------*/
+/** Find devman handle and speed assigned to USB address.
+ * Intentionally refuse to work on 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.
+ * @param[out] speed Assigned speed.
+ * @return Error code.
  */
-bool usb_device_manager_find_by_address(usb_device_manager_t *instance,
-    usb_address_t address, devman_handle_t *handle)
+int usb_device_manager_get_info_by_address(usb_device_manager_t *instance,
+    usb_address_t address, devman_handle_t *handle, usb_speed_t *speed)
 {
 	assert(instance);
+	if ((address <= 0) || (address >= USB_ADDRESS_COUNT)) {
+		return EINVAL;
+	}
+
 	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;
+		return ENOENT;
 	}
 
@@ -183,24 +186,10 @@
 		*handle = instance->devices[address].handle;
 	}
+	if (speed != NULL) {
+		*speed = instance->devices[address].speed;
+	}
 
 	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;
+	return EOK;
 }
 /**
