Index: uspace/drv/usbhid/main.c
===================================================================
--- uspace/drv/usbhid/main.c	(revision 54e682f911d433bfe8b69d2f98e0ab668bc90bf2)
+++ uspace/drv/usbhid/main.c	(revision 0475e13dcf24f22f75e60d82e225e7356ebb5c23)
@@ -162,6 +162,6 @@
 static int active_layout = 0;
 
-static void usbkbd_req_set_report(usb_hid_dev_kbd_t *kbd_dev, uint8_t *buffer,
-    size_t buf_size)
+static void usbkbd_req_set_report(usb_hid_dev_kbd_t *kbd_dev, uint16_t iface,
+    usb_hid_report_type_t type, uint8_t *buffer, size_t buf_size)
 {
 	int rc, sess_rc;
@@ -175,9 +175,41 @@
 
 	usb_log_debug("Sending Set_Report request to the device.\n");
-	// TODO: determine what interface to use!! (now set to 1)
+	
 	rc = usb_control_request_set(&kbd_dev->ctrl_pipe, 
 	    USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 
-	    USB_HIDREQ_SET_REPORT, USB_HID_REPORT_TYPE_OUTPUT,
-	    1, buffer, buf_size);
+	    USB_HIDREQ_SET_REPORT, type, iface, buffer, buf_size);
+
+	sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe);
+
+	if (rc != EOK) {
+		usb_log_warning("Error sending output report to the keyboard: "
+		    "%s.\n", str_error(rc));
+		return;
+	}
+
+	if (sess_rc != EOK) {
+		usb_log_warning("Error closing session: %s.\n",
+		    str_error(sess_rc));
+		return;
+	}
+}
+
+static void usbkbd_req_set_protocol(usb_hid_dev_kbd_t *kbd_dev, uint16_t iface,
+    usb_hid_protocol_t protocol)
+{
+	int rc, sess_rc;
+	
+	sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe);
+	if (sess_rc != EOK) {
+		usb_log_warning("Failed to start a session: %s.\n",
+		    str_error(sess_rc));
+		return;
+	}
+
+	usb_log_debug("Sending Set_Protocol request to the device.\n");
+	
+	rc = usb_control_request_set(&kbd_dev->ctrl_pipe, 
+	    USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 
+	    USB_HIDREQ_SET_PROTOCOL, protocol, iface, NULL, 0);
 
 	sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe);
@@ -225,5 +257,7 @@
 	}
 	
-	usbkbd_req_set_report(kbd_dev, buffer, BUFFER_SIZE);
+	// TODO: determine what interface to use!! (now set to 1)
+	usbkbd_req_set_report(kbd_dev, 1, USB_HID_REPORT_TYPE_OUTPUT, buffer, 
+	    BUFFER_SIZE);
 }
 
@@ -565,7 +599,4 @@
 	}
 
-
-
-
 	kbd_dev->conf = (usb_hid_configuration_t *)calloc(1, 
 	    sizeof(usb_hid_configuration_t));
@@ -671,4 +702,7 @@
 	usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe);
 	
+	// set boot protocol
+	usbkbd_req_set_protocol(kbd_dev, 1, USB_HID_PROTOCOL_BOOT);
+	
 	return kbd_dev;
 
@@ -760,8 +794,30 @@
 		return -1;
 	}
-
-	ddf_dev_t *dev = (ddf_dev_t *)arg;
-
-	// initialize device (get and process descriptors, get address, etc.)
+	
+	usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)arg;
+
+	usbkbd_poll_keyboard(kbd_dev);
+
+	return EOK;
+}
+
+static int usbkbd_add_device(ddf_dev_t *dev)
+{
+	/*
+	 * Create default function.
+	 */
+	// FIXME - check for errors
+	ddf_fun_t *kbd_fun = ddf_fun_create(dev, fun_exposed, "keyboard");
+	assert(kbd_fun != NULL);
+	kbd_fun->ops = &keyboard_ops;
+
+	int rc = ddf_fun_bind(kbd_fun);
+	assert(rc == EOK);
+	rc = ddf_fun_add_to_class(kbd_fun, "keyboard");
+	assert(rc == EOK);
+	
+	/* 
+	 * Initialize device (get and process descriptors, get address, etc.)
+	 */
 	usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev);
 	if (kbd_dev == NULL) {
@@ -770,47 +826,8 @@
 	}
 
-	usbkbd_poll_keyboard(kbd_dev);
-
-	return EOK;
-}
-
-static int usbkbd_add_device(ddf_dev_t *dev)
-{
-	/* For now, fail immediately. */
-	//return ENOTSUP;
-
-	/*
-	 * When everything is okay, connect to "our" HC.
-	 *
-	 * Not supported yet, skip..
-	 */
-//	int phone = usb_drv_hc_connect_auto(dev, 0);
-//	if (phone < 0) {
-//		/*
-//		 * Connecting to HC failed, roll-back and announce
-//		 * failure.
-//		 */
-//		return phone;
-//	}
-
-//	dev->parent_phone = phone;
-
-	/*
-	 * Create default function.
-	 */
-	// FIXME - check for errors
-	ddf_fun_t *kbd_fun = ddf_fun_create(dev, fun_exposed, "keyboard");
-	assert(kbd_fun != NULL);
-	kbd_fun->ops = &keyboard_ops;
-
-	int rc = ddf_fun_bind(kbd_fun);
-	assert(rc == EOK);
-	rc = ddf_fun_add_to_class(kbd_fun, "keyboard");
-	assert(rc == EOK);
-
 	/*
 	 * Create new fibril for handling this keyboard
 	 */
-	fid_t fid = fibril_create(usbkbd_fibril_device, dev);
+	fid_t fid = fibril_create(usbkbd_fibril_device, kbd_dev);
 	if (fid == 0) {
 		usb_log_error("Failed to start fibril for HID device\n");
Index: uspace/lib/usb/include/usb/classes/hid.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hid.h	(revision 54e682f911d433bfe8b69d2f98e0ab668bc90bf2)
+++ uspace/lib/usb/include/usb/classes/hid.h	(revision 0475e13dcf24f22f75e60d82e225e7356ebb5c23)
@@ -57,4 +57,9 @@
 } usb_hid_report_type_t;
 
+typedef enum {
+	USB_HID_PROTOCOL_BOOT = 0,
+	USB_HID_PROTOCOL_REPORT = 1
+} usb_hid_protocol_t;
+
 /** USB/HID subclass constants. */
 typedef enum {
@@ -68,5 +73,5 @@
 	USB_HID_PROTOCOL_KEYBOARD = 1,
 	USB_HID_PROTOCOL_MOUSE = 2
-} usb_hid_protocol_t;
+} usb_hid_iface_protocol_t;
 
 /** Part of standard USB HID descriptor specifying one class descriptor.
