Index: uspace/lib/usbhost/include/usb/host/usb_endpoint_manager.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/usb_endpoint_manager.h	(revision 8a23fef1f898ea2f1207872951230522ced720b5)
+++ uspace/lib/usbhost/include/usb/host/usb_endpoint_manager.h	(revision 3cc55b47a003c937d650faaaba94e981d905fd3f)
@@ -92,6 +92,6 @@
 int usb_endpoint_manager_add_ep(usb_endpoint_manager_t *instance,
     usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,
-    usb_transfer_type_t type, usb_speed_t speed, size_t max_packet_size,
-    size_t data_size, ep_add_callback_t callback, void *arg);
+    usb_transfer_type_t type, size_t max_packet_size, size_t data_size,
+    ep_add_callback_t callback, void *arg);
 
 int usb_endpoint_manager_remove_ep(usb_endpoint_manager_t *instance,
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 8a23fef1f898ea2f1207872951230522ced720b5)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 3cc55b47a003c937d650faaaba94e981d905fd3f)
@@ -422,5 +422,5 @@
 
 	/* Add default pipe on default address */
-	ret = hcd_add_ep(hcd, 
+	ret = hcd_add_ep(hcd,
 	    default_target, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL,
 	    CTRL_PIPE_MIN_PACKET_SIZE, CTRL_PIPE_MIN_PACKET_SIZE);
Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision 8a23fef1f898ea2f1207872951230522ced720b5)
+++ uspace/lib/usbhost/src/hcd.c	(revision 3cc55b47a003c937d650faaaba94e981d905fd3f)
@@ -133,13 +133,7 @@
 {
 	assert(hcd);
-	usb_speed_t speed = USB_SPEED_MAX;
-	const int ret = usb_endpoint_manager_get_info_by_address(
-	    &hcd->ep_manager, target.address, &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);
+	    target.endpoint, dir, type, max_packet_size, size, register_helper,
+	    hcd);
 }
 
Index: uspace/lib/usbhost/src/usb_endpoint_manager.c
===================================================================
--- uspace/lib/usbhost/src/usb_endpoint_manager.c	(revision 8a23fef1f898ea2f1207872951230522ced720b5)
+++ uspace/lib/usbhost/src/usb_endpoint_manager.c	(revision 3cc55b47a003c937d650faaaba94e981d905fd3f)
@@ -286,21 +286,19 @@
 int usb_endpoint_manager_add_ep(usb_endpoint_manager_t *instance,
     usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,
-    usb_transfer_type_t type, usb_speed_t speed, size_t max_packet_size,
-    size_t data_size, ep_add_callback_t callback, void *arg)
+    usb_transfer_type_t type, size_t max_packet_size, size_t data_size,
+    ep_add_callback_t callback, void *arg)
 {
 	assert(instance);
 	if (instance->bw_count == NULL)
 		return ENOTSUP;
-	if (address < 0)
-		return EINVAL;
-
-	const size_t bw =
-	    instance->bw_count(speed, type, data_size, max_packet_size);
-
-	fibril_mutex_lock(&instance->guard);
-	/* Check for available bandwidth */
-	if (bw > instance->free_bw) {
-		fibril_mutex_unlock(&instance->guard);
-		return ENOSPC;
+	if (!usb_address_is_valid(address))
+		return EINVAL;
+
+
+	fibril_mutex_lock(&instance->guard);
+	/* Check for speed and address */
+	if (!instance->devices[address].occupied) {
+		fibril_mutex_unlock(&instance->guard);
+		return ENOENT;
 	}
 
@@ -310,4 +308,14 @@
 		fibril_mutex_unlock(&instance->guard);
 		return EEXISTS;
+	}
+
+	const usb_speed_t speed = instance->devices[address].speed;
+	const size_t bw =
+	    instance->bw_count(speed, type, data_size, max_packet_size);
+
+	/* Check for available bandwidth */
+	if (bw > instance->free_bw) {
+		fibril_mutex_unlock(&instance->guard);
+		return ENOSPC;
 	}
 
