Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 961c29e89ffe340db91ba1cf4653315003b53f92)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision cc34f5f07a9c1f150a83050a986595ea7f21f3d5)
@@ -65,4 +65,5 @@
 {
 	assert(hcd);
+	batch_init_ohci(batch);
 	return hc_schedule(hcd->private_data, batch);
 }
@@ -147,13 +148,30 @@
 if (ret != EOK) { \
 	usb_log_error(message); \
-	hc_remove_endpoint(instance, hub_address, 0, USB_DIRECTION_BOTH); \
-	usb_device_keeper_release(&instance->manager, hub_address); \
 	return ret; \
 } else (void)0
-
-	int ret = hc_add_endpoint(instance, hub_address, 0, USB_SPEED_FULL,
-	    USB_TRANSFER_CONTROL, USB_DIRECTION_BOTH, 64, 0, 0);
-	CHECK_RET_RELEASE(ret,
-	    "Failed to add OHCI root hub endpoint 0: %s.\n", str_error(ret));
+	endpoint_t *ep =
+	    endpoint_get(hub_address, 0, USB_DIRECTION_BOTH,
+	    USB_TRANSFER_CONTROL, USB_SPEED_FULL, 64);
+	if (ep == NULL)
+		return ENOMEM;
+
+	int ret = ohci_endpoint_init(&instance->generic, ep);
+	if (ret != EOK) {
+		endpoint_destroy(ep);
+		return ret;
+	}
+
+	ret = usb_endpoint_manager_register_ep(&instance->generic.ep_manager, ep, 0);
+	if (ret != EOK) {
+		endpoint_destroy(ep);
+		return ret;
+	}
+	hc_enqueue_endpoint(instance, ep);
+
+
+//	int ret = hc_add_endpoint(instance, hub_address, 0, USB_SPEED_FULL,
+//	    USB_TRANSFER_CONTROL, USB_DIRECTION_BOTH, 64, 0, 0);
+//	CHECK_RET_RELEASE(ret,
+//	    "Failed to add OHCI root hub endpoint 0: %s.\n", str_error(ret));
 
 	ret = ddf_fun_add_match_id(hub_fun, "usb&class=hub", 100);
@@ -201,5 +219,5 @@
 
 	ret = hcd_init(&instance->generic, BANDWIDTH_AVAILABLE_USB11);
-	CHECK_RET_RETURN(ret, "Failed to initialize endpoint manager: %s.\n",
+	CHECK_RET_RETURN(ret, "Failed to initialize generic driver: %s.\n",
 	    str_error(ret));
 	instance->generic.private_data = instance;
