Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision 17bbb28d6f30060fd091fa7c83f27f5d7390d206)
+++ uspace/lib/usbhost/src/hcd.c	(revision 0816c2ed8cea6aebeafa8a2f76de2d8e87f32b26)
@@ -62,4 +62,56 @@
 	hcd->ep_remove_hook = NULL;
 }
+
+/** 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);
+}
+
+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)
+{
+	assert(hcd);
+	usb_speed_t speed = USB_SPEED_MAX;
+	const int ret = usb_device_manager_get_info_by_address(
+	    &hcd->dev_manager, target.address, NULL, &speed);
+	if (ret != EOK) {
+		return ret;
+	}
+	return usb_endpoint_manager_add_ep(&hcd->ep_manager, target.address,
+	    target.endpoint, dir, type, speed, max_packet_size, size,
+	    register_helper, hcd);
+}
+
+int hcd_remove_ep(hcd_t *hcd, usb_target_t target, usb_direction_t dir)
+{
+	assert(hcd);
+	return usb_endpoint_manager_remove_ep(&hcd->ep_manager, target.address,
+	    target.endpoint, dir, unregister_helper, hcd);
+}
+
 
 typedef struct {
Index: uspace/lib/usbhost/src/iface.c
===================================================================
--- uspace/lib/usbhost/src/iface.c	(revision 17bbb28d6f30060fd091fa7c83f27f5d7390d206)
+++ uspace/lib/usbhost/src/iface.c	(revision 0816c2ed8cea6aebeafa8a2f76de2d8e87f32b26)
@@ -42,32 +42,4 @@
 #include "ddf_helpers.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.
@@ -181,19 +153,12 @@
 	assert(hcd);
 	const size_t size = max_packet_size;
-	usb_speed_t speed = USB_SPEED_MAX;
-	const int ret = usb_device_manager_get_info_by_address(
-	    &hcd->dev_manager, address, NULL, &speed);
-	if (ret != EOK) {
-		return ret;
-	}
-
-	usb_log_debug("Register endpoint %d:%d %s-%s %s %zuB %ums.\n",
+	const usb_target_t target = {{.address = address, .endpoint = endpoint}};
+	
+	usb_log_debug("Register endpoint %d:%d %s-%s %zuB %ums.\n",
 	    address, endpoint, usb_str_transfer_type(transfer_type),
-	    usb_str_direction(direction), usb_str_speed(speed),
-	    max_packet_size, interval);
-
-	return usb_endpoint_manager_add_ep(&hcd->ep_manager, address, endpoint,
-	    direction, transfer_type, speed, max_packet_size, size,
-	    register_helper, hcd);
+	    usb_str_direction(direction), max_packet_size, interval);
+
+	return hcd_add_ep(hcd, target, direction, transfer_type,
+	    max_packet_size, size);
 }
 
@@ -212,8 +177,8 @@
 	hcd_t *hcd = dev_to_hcd(ddf_fun_get_dev(fun));
 	assert(hcd);
+	const usb_target_t target = {{.address = address, .endpoint = endpoint}};
 	usb_log_debug("Unregister endpoint %d:%d %s.\n",
 	    address, endpoint, usb_str_direction(direction));
-	return usb_endpoint_manager_remove_ep(&hcd->ep_manager, address,
-	    endpoint, direction, unregister_helper, hcd);
+	return hcd_remove_ep(hcd, target, direction);
 }
 
