Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision 0816c2ed8cea6aebeafa8a2f76de2d8e87f32b26)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision b4c1c9511e52b564723e7255714f5d117f3a9678)
@@ -82,4 +82,15 @@
 }
 
+usb_address_t hcd_request_address(hcd_t *hcd, usb_speed_t speed);
+
+int hcd_release_address(hcd_t *hcd, usb_address_t address);
+
+int hcd_reserve_default_address(hcd_t *hcd, usb_speed_t speed);
+
+static inline int hcd_release_default_address(hcd_t *hcd, usb_address_t address)
+{
+	return hcd_release_address(hcd, USB_ADDRESS_DEFAULT);
+}
+
 int hcd_add_ep(hcd_t *hcd, usb_target_t target, usb_direction_t dir,
     usb_transfer_type_t type, size_t max_packet_size, size_t size);
Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision 0816c2ed8cea6aebeafa8a2f76de2d8e87f32b26)
+++ uspace/lib/usbhost/src/hcd.c	(revision b4c1c9511e52b564723e7255714f5d117f3a9678)
@@ -40,5 +40,46 @@
 #include <usb/request.h>
 
-#include <usb/host/hcd.h>
+#include "hcd.h"
+
+/** Calls ep_add_hook upon endpoint registration.
+ * @param ep Endpoint to be registered.
+ * @param arg hcd_t in disguise.
+ * @return Error code.
+ */
+static int register_helper(endpoint_t *ep, void *arg)
+{
+	hcd_t *hcd = arg;
+	assert(ep);
+	assert(hcd);
+	if (hcd->ep_add_hook)
+		return hcd->ep_add_hook(hcd, ep);
+	return EOK;
+}
+
+/** Calls ep_remove_hook upon endpoint removal.
+ * @param ep Endpoint to be unregistered.
+ * @param arg hcd_t in disguise.
+ */
+static void unregister_helper(endpoint_t *ep, void *arg)
+{
+	hcd_t *hcd = arg;
+	assert(ep);
+	assert(hcd);
+	if (hcd->ep_remove_hook)
+		hcd->ep_remove_hook(hcd, ep);
+}
+
+/** Calls ep_remove_hook upon endpoint removal. Prints warning.
+ *  * @param ep Endpoint to be unregistered.
+ *   * @param arg hcd_t in disguise.
+ *    */
+static void unregister_helper_warn(endpoint_t *ep, void *arg)
+{
+        assert(ep);
+        usb_log_warning("Endpoint %d:%d %s was left behind, removing.\n",
+            ep->address, ep->endpoint, usb_str_direction(ep->direction));
+	unregister_helper(ep, arg);
+}
+
 
 /** Initialize hcd_t structure.
@@ -63,31 +104,30 @@
 }
 
-/** Calls ep_add_hook upon endpoint registration.
- * @param ep Endpoint to be registered.
- * @param arg hcd_t in disguise.
- * @return Error code.
- */
-static int register_helper(endpoint_t *ep, void *arg)
-{
-	hcd_t *hcd = arg;
-	assert(ep);
-	assert(hcd);
-	if (hcd->ep_add_hook)
-		return hcd->ep_add_hook(hcd, ep);
+usb_address_t hcd_request_address(hcd_t *hcd, usb_speed_t speed)
+{
+	assert(hcd);
+	usb_address_t address = 0;
+	const int ret = usb_device_manager_request_address(
+	    &hcd->dev_manager, &address, false, speed);
+	if (ret != EOK)
+		return ret;
+	return address;
+}
+
+int hcd_release_address(hcd_t *hcd, usb_address_t address)
+{
+	assert(hcd);
+	usb_endpoint_manager_remove_address(&hcd->ep_manager, address,
+	    unregister_helper_warn, hcd);
+	usb_device_manager_release_address(&hcd->dev_manager, address);
 	return EOK;
 }
 
-
-/** Calls ep_remove_hook upon endpoint removal.
- * @param ep Endpoint to be unregistered.
- * @param arg hcd_t in disguise.
- */
-static void unregister_helper(endpoint_t *ep, void *arg)
-{
-	hcd_t *hcd = arg;
-	assert(ep);
-	assert(hcd);
-	if (hcd->ep_remove_hook)
-		hcd->ep_remove_hook(hcd, ep);
+int hcd_reserve_default_address(hcd_t *hcd, usb_speed_t speed)
+{
+	assert(hcd);
+	usb_address_t address = 0;
+	return usb_device_manager_request_address(
+	    &hcd->dev_manager, &address, true, speed);
 }
 
Index: uspace/lib/usbhost/src/iface.c
===================================================================
--- uspace/lib/usbhost/src/iface.c	(revision 0816c2ed8cea6aebeafa8a2f76de2d8e87f32b26)
+++ uspace/lib/usbhost/src/iface.c	(revision b4c1c9511e52b564723e7255714f5d117f3a9678)
@@ -42,19 +42,4 @@
 #include "ddf_helpers.h"
 
-/** Calls ep_remove_hook upon endpoint removal. Prints warning.
- * @param ep Endpoint to be unregistered.
- * @param arg hcd_t in disguise.
- */
-static void unregister_helper_warn(endpoint_t *ep, void *arg)
-{
-	hcd_t *hcd = arg;
-	assert(ep);
-	assert(hcd);
-	usb_log_warning("Endpoint %d:%d %s was left behind, removing.\n",
-	    ep->address, ep->endpoint, usb_str_direction(ep->direction));
-	if (hcd->ep_remove_hook)
-		hcd->ep_remove_hook(hcd, ep);
-}
-
 /** Request address interface function.
  *
@@ -73,5 +58,4 @@
 	assert(hcd);
 	assert(address);
-
 	usb_log_debug("Address request: speed: %s, address: %d, strict: %s.\n",
 	    usb_str_speed(speed), *address, strict ? "YES" : "NO");
@@ -126,10 +110,6 @@
 	assert(fun);
 	hcd_t *hcd = dev_to_hcd(ddf_fun_get_dev(fun));
-	assert(hcd);
 	usb_log_debug("Address release %d.\n", address);
-	usb_endpoint_manager_remove_address(&hcd->ep_manager, address,
-	    unregister_helper_warn, hcd);
-	usb_device_manager_release_address(&hcd->dev_manager, address);
-	return EOK;
+	return hcd_release_address(hcd, address);
 }
 
@@ -197,6 +177,7 @@
     void *arg)
 {
-	return hcd_send_batch(dev_to_hcd(ddf_fun_get_dev(fun)), target, USB_DIRECTION_IN,
-	    data, size, setup_data, callback, NULL, arg, "READ");
+	return hcd_send_batch(dev_to_hcd(ddf_fun_get_dev(fun)), target,
+	    USB_DIRECTION_IN, data, size, setup_data, callback, NULL, arg,
+	    "READ");
 }
 
