Index: uspace/drv/uhci-hcd/uhci.h
===================================================================
--- uspace/drv/uhci-hcd/uhci.h	(revision e0df6c2d7a704b8e474264f04947e3eadfc936c2)
+++ uspace/drv/uhci-hcd/uhci.h	(revision 67b6fc5853a7bb19dd26cf0e0035db90c42d1bfe)
@@ -72,5 +72,5 @@
 
 #define UHCI_FRAME_LIST_COUNT 1024
-#define UHCI_CLEANER_TIMEOUT 1000000
+#define UHCI_CLEANER_TIMEOUT 10000
 #define UHCI_DEBUGER_TIMEOUT 5000000
 
Index: uspace/drv/uhci-rhd/port.c
===================================================================
--- uspace/drv/uhci-rhd/port.c	(revision e0df6c2d7a704b8e474264f04947e3eadfc936c2)
+++ uspace/drv/uhci-rhd/port.c	(revision 67b6fc5853a7bb19dd26cf0e0035db90c42d1bfe)
@@ -33,8 +33,10 @@
  */
 #include <errno.h>
+#include <str_error.h>
 
 #include <usb/usb.h>    /* usb_address_t */
 #include <usb/usbdrv.h> /* usb_drv_*     */
 #include <usb/debug.h>
+#include <usb/recognise.h>
 
 #include "port.h"
@@ -204,7 +206,15 @@
 	assert(port->attached_device == 0);
 
-	ret = usb_drv_register_child_in_devman(port->hc_phone, port->rh,
-	  usb_address, &port->attached_device);
-
+	devman_handle_t hc_handle;
+	ret = usb_drv_find_hc(port->rh, &hc_handle);
+	if (ret != EOK) {
+		usb_log_error("Failed to get handle of host controller: %s.\n",
+		    str_error(ret));
+		uhci_port_set_enabled(port, false);
+		return ENOMEM;
+	}
+
+	ret = usb_device_register_child_in_devman(usb_address, hc_handle,
+	    port->rh, &port->attached_device);
 	if (ret != EOK) { /* something went wrong */
 		usb_log_error("Failed(%d) in usb_drv_register_child.\n", ret);
Index: uspace/drv/usbhid/main.c
===================================================================
--- uspace/drv/usbhid/main.c	(revision e0df6c2d7a704b8e474264f04947e3eadfc936c2)
+++ uspace/drv/usbhid/main.c	(revision 67b6fc5853a7bb19dd26cf0e0035db90c42d1bfe)
@@ -45,4 +45,6 @@
 #include <str_error.h>
 #include <fibril.h>
+#include <usb/debug.h>
+#include <usb/classes/classes.h>
 #include <usb/classes/hid.h>
 #include <usb/classes/hidparser.h>
@@ -61,4 +63,14 @@
 #define GUESSED_POLL_ENDPOINT 1
 
+/** Keyboard polling endpoint description for boot protocol class. */
+static usb_endpoint_description_t poll_endpoint_description = {
+	.transfer_type = USB_TRANSFER_INTERRUPT,
+	.direction = USB_DIRECTION_IN,
+	.interface_class = USB_CLASS_HID,
+	.interface_subclass = USB_HID_SUBCLASS_BOOT,
+	.interface_protocol = USB_HID_PROTOCOL_KEYBOARD,
+	.flags = 0
+};
+
 static void default_connection_handler(device_t *, ipc_callid_t, ipc_call_t *);
 static device_ops_t keyboard_ops = {
@@ -330,4 +342,31 @@
 	}
 	
+	/*
+	 * Initialize the interrupt in endpoint.
+	 */
+	usb_endpoint_mapping_t endpoint_mapping[1] = {
+		{
+			.pipe = &kbd_dev->poll_pipe,
+			.description = &poll_endpoint_description
+		}
+	};
+	rc = usb_endpoint_pipe_initialize_from_configuration(
+	    endpoint_mapping, 1,
+	    descriptors, config_desc.total_length,
+	    &kbd_dev->wire);
+	if (rc != EOK) {
+		usb_log_error("Failed to initialize poll pipe: %s.\n",
+		    str_error(rc));
+		return rc;
+	}
+	if (!endpoint_mapping[0].present) {
+		usb_log_warning("Not accepting device, " \
+		    "not boot-protocol keyboard.\n");
+		return EREFUSED;
+	}
+
+
+
+
 	kbd_dev->conf = (usb_hid_configuration_t *)calloc(1, 
 	    sizeof(usb_hid_configuration_t));
@@ -337,5 +376,5 @@
 	}
 	
-	rc = usbkbd_parse_descriptors(descriptors, transferred, kbd_dev->conf);
+	/*rc = usbkbd_parse_descriptors(descriptors, transferred, kbd_dev->conf);
 	free(descriptors);
 	if (rc != EOK) {
@@ -344,5 +383,5 @@
 	}
 
-	// get and report descriptors
+	// get and report descriptors*/
 	rc = usbkbd_get_report_descriptor(kbd_dev);
 	if (rc != EOK) {
@@ -361,5 +400,5 @@
      *    as the endpoint for polling
 	 */
-	
+
 	return EOK;
 }
@@ -396,12 +435,4 @@
 	if (rc != EOK) {
 		printf("Failed to initialize default control pipe: %s.\n",
-		    str_error(rc));
-		goto error_leave;
-	}
-
-	rc = usb_endpoint_pipe_initialize(&kbd_dev->poll_pipe, &kbd_dev->wire,
-	    GUESSED_POLL_ENDPOINT, USB_TRANSFER_INTERRUPT, USB_DIRECTION_IN);
-	if (rc != EOK) {
-		printf("Failed to initialize interrupt in pipe: %s.\n",
 		    str_error(rc));
 		goto error_leave;
@@ -418,6 +449,9 @@
 	usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe);
 	//usb_request_set_configuration(&kbd_dev->ctrl_pipe, 1);
-	usbkbd_process_descriptors(kbd_dev);
+	rc = usbkbd_process_descriptors(kbd_dev);
 	usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe);
+	if (rc != EOK) {
+		goto error_leave;
+	}
 
 	return kbd_dev;
@@ -577,4 +611,5 @@
 int main(int argc, char *argv[])
 {
+	usb_log_enable(USB_LOG_LEVEL_INFO, "usbhid");
 	return driver_main(&kbd_driver);
 }
Index: uspace/drv/usbhub/usbhub.c
===================================================================
--- uspace/drv/usbhub/usbhub.c	(revision e0df6c2d7a704b8e474264f04947e3eadfc936c2)
+++ uspace/drv/usbhub/usbhub.c	(revision 67b6fc5853a7bb19dd26cf0e0035db90c42d1bfe)
@@ -36,8 +36,10 @@
 #include <bool.h>
 #include <errno.h>
+#include <str_error.h>
 
 #include <usb_iface.h>
 #include <usb/usbdrv.h>
 #include <usb/descriptor.h>
+#include <usb/recognise.h>
 #include <usb/devreq.h>
 #include <usb/classes/hub.h>
@@ -317,7 +319,15 @@
 	}
 
+	devman_handle_t hc_handle;
+	opResult = usb_drv_find_hc(hub->device, &hc_handle);
+	if (opResult != EOK) {
+		usb_log_error("Failed to get handle of host controller: %s.\n",
+		    str_error(opResult));
+		return;
+	}
+
 	devman_handle_t child_handle;
-	opResult = usb_drv_register_child_in_devman(hc, hub->device,
-            new_device_address, &child_handle);
+        opResult = usb_device_register_child_in_devman(new_device_address,
+            hc_handle, hub->device, &child_handle);
 	if (opResult != EOK) {
 		dprintf(USB_LOG_LEVEL_ERROR, "could not start driver for new device");
Index: uspace/drv/vhc/hub.c
===================================================================
--- uspace/drv/vhc/hub.c	(revision e0df6c2d7a704b8e474264f04947e3eadfc936c2)
+++ uspace/drv/vhc/hub.c	(revision 67b6fc5853a7bb19dd26cf0e0035db90c42d1bfe)
@@ -41,4 +41,5 @@
 #include <driver.h>
 #include <usb/usbdrv.h>
+#include <usb/recognise.h>
 
 #include "hub.h"
@@ -93,5 +94,7 @@
 
 	devman_handle_t hub_handle;
-	usb_drv_register_child_in_devman(hc, hc_dev, hub_address, &hub_handle);
+	usb_device_register_child_in_devman(hub_address, hc_dev->handle,
+	    hc_dev, &hub_handle);
+	//usb_drv_register_child_in_devman(hc, hc_dev, hub_address, &hub_handle);
 	usb_drv_bind_address(hc, hub_address, hub_handle);
 
