Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision 3afb7580ffb5859d718216a15a79100e3ab8aa0a)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision 1a025171dce783accd2bf90e64bd6ee89ca65990)
@@ -50,6 +50,6 @@
 
 	int (*schedule)(hcd_t *, usb_transfer_batch_t *);
-	void * (*batch_private_ctor)(usb_transfer_batch_t *);
-	void (*batch_private_dtor)(void *);
+	int (*batch_init_hook)(usb_transfer_batch_t *);
+	int (*ep_add_hook)(endpoint_t *);
 };
 /*----------------------------------------------------------------------------*/
Index: uspace/lib/usbhost/include/usb/host/usb_endpoint_manager.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/usb_endpoint_manager.h	(revision 3afb7580ffb5859d718216a15a79100e3ab8aa0a)
+++ uspace/lib/usbhost/include/usb/host/usb_endpoint_manager.h	(revision 1a025171dce783accd2bf90e64bd6ee89ca65990)
@@ -77,4 +77,5 @@
     usb_endpoint_manager_t *instance, usb_target_t target, const uint8_t *data);
 
+/** Wrapper combining allocation and insertion */
 static inline int usb_endpoint_manager_add_ep(usb_endpoint_manager_t *instance,
     usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,
Index: uspace/lib/usbhost/src/iface.c
===================================================================
--- uspace/lib/usbhost/src/iface.c	(revision 3afb7580ffb5859d718216a15a79100e3ab8aa0a)
+++ uspace/lib/usbhost/src/iface.c	(revision 1a025171dce783accd2bf90e64bd6ee89ca65990)
@@ -78,12 +78,12 @@
 	}
 
+	/* No private data and no private data_dtor, these should be set by
+	 * batch_init_hook*/
 	usb_transfer_batch_init(batch, ep, data, NULL, size, setup_data,
-	    setup_size, in, out, arg, fun, NULL, hcd->batch_private_dtor);
-	if (hcd->batch_private_ctor) {
-		batch->private_data = hcd->batch_private_ctor(batch);
-		if (!batch->private_data) {
-			ret = ENOMEM;
+	    setup_size, in, out, arg, fun, NULL, NULL);
+	if (hcd->batch_init_hook) {
+		ret = hcd->batch_init_hook(batch);
+		if (ret != EOK)
 			goto out;
-		}
 	} else {
 		usb_log_warning("Missing batch_private_data constructor!\n");
@@ -199,6 +199,22 @@
 	    max_packet_size, interval);
 
-	return usb_endpoint_manager_add_ep(&hcd->ep_manager, address, endpoint,
-	    direction, transfer_type, speed, max_packet_size, size);
+	endpoint_t *ep = endpoint_get(
+	    address, endpoint, direction, transfer_type, speed, max_packet_size);
+	if (!ep)
+		return ENOMEM;
+	int ret = EOK;
+	if (hcd->ep_add_hook) {
+		ret = hcd->ep_add_hook(ep);
+	}
+	if (ret != EOK) {
+		endpoint_destroy(ep);
+		return ret;
+	}
+
+	ret = usb_endpoint_manager_register_ep(&hcd->ep_manager, ep, size);
+	if (ret != EOK) {
+		endpoint_destroy(ep);
+	}
+	return ret;
 }
 /*----------------------------------------------------------------------------*/
