Index: uspace/drv/usbkbd/kbddev.c
===================================================================
--- uspace/drv/usbkbd/kbddev.c	(revision c156c2d0df49edf3338754d987f9771ce6097be4)
+++ uspace/drv/usbkbd/kbddev.c	(revision a694a58b32a2c94fb593f43594a4908f796db828)
@@ -128,7 +128,10 @@
         0x15, 0x00,  //   Logical Minimum (0),
         0x25, 0x01,  //   Logical Maximum (1),
+	//0x85, 0x00,  //   Report ID,
+	//0xA4,	     //   Push
         0x81, 0x02,  //   Input (Data, Variable, Absolute),   ; Modifier byte
-	0x95, 0x01,  //   Report Count (1),
-        0x75, 0x08,  //   Report Size (8),
+	//0xB4,	     //   Pop
+        0x75, 0x08,  //   Report Size (1),
+        0x95, 0x01,  //   Report Count (8),       
         0x81, 0x01,  //   Input (Constant),                   ; Reserved byte
         0x95, 0x05,  //   Report Count (5),
@@ -557,5 +560,5 @@
 	assert(kbd_dev != NULL);
 
-	usb_log_debug("Got keys from parser: %s\n", 
+	usb_log_debug("Got keys from parser (report id: %d): %s\n", modifiers, 
 	    usb_debug_str_buffer(key_codes, count, 0));
 	
@@ -608,6 +611,10 @@
 	usb_hid_report_path_t *path = usb_hid_report_path();
 	usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0);
-	
-	int rc = usb_hid_parse_report(kbd_dev->parser, buffer,
+
+	uint8_t *tmp_buf = malloc((actual_size+1)*sizeof(uint8_t));
+	tmp_buf[0] = 0x00;
+	memcpy(tmp_buf+1, buffer, actual_size);
+	
+	int rc = usb_hid_parse_report(kbd_dev->parser, tmp_buf,
 	    actual_size, path, USB_HID_PATH_COMPARE_STRICT, callbacks, kbd_dev);
 
@@ -730,7 +737,7 @@
 	
 	/* Get the report descriptor and parse it. */
-	rc = usb_hid_process_report_descriptor(kbd_dev->usb_dev, 
-	    kbd_dev->parser);
-	if (rc != EOK) {
+	//rc = usb_hid_process_report_descriptor(kbd_dev->usb_dev, 
+	//    kbd_dev->parser);
+	if (true || rc != EOK) {
 		usb_log_warning("Could not process report descriptor, "
 		    "falling back to boot protocol.\n");
@@ -776,5 +783,5 @@
 	kbd_dev->output_size = 0;
 	kbd_dev->output_buffer = usb_hid_report_output(kbd_dev->parser, 
-	    &kbd_dev->output_size);
+	    &kbd_dev->output_size, 0x00);
 	if (kbd_dev->output_buffer == NULL) {
 		usb_log_warning("Error creating output report buffer.\n");
@@ -788,4 +795,5 @@
 	usb_hid_report_path_append_item(
 	    kbd_dev->led_path, USB_HIDUT_PAGE_LED, 0);
+	usb_hid_report_path_set_report_id(kbd_dev->led_path, 0x00);
 	
 	kbd_dev->led_output_size = usb_hid_report_output_size(kbd_dev->parser, 
Index: uspace/lib/usb/include/usb/classes/hidparser.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hidparser.h	(revision c156c2d0df49edf3338754d987f9771ce6097be4)
+++ uspace/lib/usb/include/usb/classes/hidparser.h	(revision a694a58b32a2c94fb593f43594a4908f796db828)
@@ -240,14 +240,4 @@
 void usb_hid_descriptor_print(usb_hid_report_parser_t *parser);
 
-/*
- * Boot protocol functions
- */
-/** */
-int usb_hid_boot_keyboard_input_report(const uint8_t *data, size_t size,
-	const usb_hid_report_in_callbacks_t *callbacks, void *arg);
-
-/** */
-int usb_hid_boot_keyboard_output_report(uint8_t leds, uint8_t *data, size_t size);
-
 
 /*
@@ -301,5 +291,5 @@
  */
 /** Allocates output report buffer*/
-uint8_t *usb_hid_report_output(usb_hid_report_parser_t *parser, size_t *size);
+uint8_t *usb_hid_report_output(usb_hid_report_parser_t *parser, size_t *size, uint8_t report_id);
 
 /** Frees output report buffer*/
Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision c156c2d0df49edf3338754d987f9771ce6097be4)
+++ uspace/lib/usb/src/hidparser.c	(revision a694a58b32a2c94fb593f43594a4908f796db828)
@@ -40,11 +40,15 @@
 #include <usb/debug.h>
 
-/** */
+/** The new report item flag. Used to determine when the item is completly
+ * configured and should be added to the report structure
+ */
 #define USB_HID_NEW_REPORT_ITEM 1
 
-/** */
-#define USB_HID_NO_ACTION		2
-
-/** */
+/** No special action after the report descriptor tag is processed should be
+ * done
+ */
+#define USB_HID_NO_ACTION	2
+
+/** Unknown tag was founded in report descriptor data*/
 #define USB_HID_UNKNOWN_TAG		-99
 
@@ -236,4 +240,7 @@
 					new_report_item->string_maximum = 0;
 
+					/* set the report id */
+					new_report_item->id = report_item->id;
+
 					/* reset usage from current usage path */
 					usb_hid_report_usage_path_t *path = list_get_instance(&usage_path->link, usb_hid_report_usage_path_t, link);
@@ -290,64 +297,4 @@
 }
 
-
-/**
- * Parse input report.
- *
- * @param data Data for report
- * @param size Size of report
- * @param callbacks Callbacks for report actions
- * @param arg Custom arguments
- *
- * @return Error code
- */
-int usb_hid_boot_keyboard_input_report(const uint8_t *data, size_t size,
-	const usb_hid_report_in_callbacks_t *callbacks, void *arg)
-{
-	int i;
-	usb_hid_report_item_t item;
-
-	/* fill item due to the boot protocol report descriptor */
-	// modifier keys are in the first byte
-	uint8_t modifiers = data[0];
-
-	item.offset = 2; /* second byte is reserved */
-	item.size = 8;
-	item.count = 6;
-	item.usage_minimum = 0;
-	item.usage_maximum = 255;
-	item.logical_minimum = 0;
-	item.logical_maximum = 255;
-
-	if (size != 8) {
-		return -1; //ERANGE;
-	}
-
-	uint8_t keys[6];
-	for (i = 0; i < item.count; i++) {
-		keys[i] = data[i + item.offset];
-	}
-
-	callbacks->keyboard(keys, 6, modifiers, arg);
-	return EOK;
-}
-
-/**
- * Makes output report for keyboard boot protocol
- *
- * @param leds
- * @param output Output report data buffer
- * @param size Size of the output buffer
- * @return Error code
- */
-int usb_hid_boot_keyboard_output_report(uint8_t leds, uint8_t *data, size_t size)
-{
-	if(size != 1){
-		return -1;
-	}
-
-	/* used only first five bits, others are only padding*/
-	*data = leds;
-	return EOK;
-}
 
 /**
@@ -859,10 +806,10 @@
 
 /**
- *
- *
- * @param parser
- * @param path
- * @param flags
- * @return
+ * Returns number of items in input report which are accessible by given usage path
+ *
+ * @param parser Opaque report descriptor structure
+ * @param path Usage path specification
+ * @param flags Usage path comparison flags
+ * @return Number of items in input report
  */
 size_t usb_hid_report_input_length(const usb_hid_report_parser_t *parser,
@@ -893,9 +840,11 @@
 
 /**
- * 
- * @param usage_path
- * @param usage_page
- * @param usage
- * @return
+ * Appends one item (couple of usage_path and usage) into the usage path
+ * structure
+ *
+ * @param usage_path Usage path structure
+ * @param usage_page Usage page constant
+ * @param usage Usage constant
+ * @return Error code
  */
 int usb_hid_report_path_append_item(usb_hid_report_path_t *usage_path, 
@@ -918,7 +867,7 @@
 
 /**
- *
- * @param usage_path
- * @return
+ * Removes last item from the usage path structure
+ * @param usage_path 
+ * @return void
  */
 void usb_hid_report_remove_last_item(usb_hid_report_path_t *usage_path)
@@ -935,7 +884,8 @@
 
 /**
+ * Nulls last item of the usage path structure.
  *
  * @param usage_path
- * @return
+ * @return void
  */
 void usb_hid_report_null_last_item(usb_hid_report_path_t *usage_path)
@@ -950,9 +900,11 @@
 
 /**
- *
- * @param usage_path
- * @param tag
- * @param data
- * @return
+ * Modifies last item of usage path structure by given usage page or usage
+ *
+ * @param usage_path Opaque usage path structure
+ * @param tag Class of currently processed tag (Usage page tag falls into Global
+ * class but Usage tag into the Local)
+ * @param data Value of the processed tag
+ * @return void
  */
 void usb_hid_report_set_last_item(usb_hid_report_path_t *usage_path, int32_t tag, int32_t data)
@@ -976,10 +928,10 @@
 
 /**
- * 
- *
- * @param report_path
- * @param path
- * @param flags
- * @return
+ * Compares two usage paths structures
+ *
+ * @param report_path usage path structure to compare
+ * @param path usage patrh structure to compare
+ * @param flags Flags determining the mode of comparison
+ * @return EOK if both paths are identical, non zero number otherwise
  */
 int usb_hid_report_compare_usage_path(usb_hid_report_path_t *report_path, 
@@ -1082,6 +1034,7 @@
 
 /**
- *
- * @return
+ * Allocates and initializes new usage path structure.
+ *
+ * @return Initialized usage path structure
  */
 usb_hid_report_path_t *usb_hid_report_path(void)
@@ -1101,6 +1054,7 @@
 
 /**
- *
- * @param path
+ * Releases given usage path structure.
+ *
+ * @param path usage path structure to release
  * @return void
  */
@@ -1116,6 +1070,6 @@
  * Clone content of given usage path to the new one
  *
- * @param usage_path
- * @return
+ * @param usage_path Usage path structure to clone
+ * @return New copy of given usage path structure
  */
 usb_hid_report_path_t *usb_hid_report_path_clone(usb_hid_report_path_t *usage_path)
@@ -1147,11 +1101,13 @@
 /*** OUTPUT API **/
 
-/** Allocates output report buffer
- *
- * @param parser
- * @param size
- * @return
- */
-uint8_t *usb_hid_report_output(usb_hid_report_parser_t *parser, size_t *size)
+/** 
+ * Allocates output report buffer for output report
+ *
+ * @param parser Report parsed structure
+ * @param size Size of returned buffer
+ * @param report_id Report id of created output report
+ * @return Returns allocated output buffer for specified output
+ */
+uint8_t *usb_hid_report_output(usb_hid_report_parser_t *parser, size_t *size, uint8_t report_id)
 {
 	if(parser == NULL) {
@@ -1165,4 +1121,18 @@
 
 	link = parser->output.prev;
+	while((link != &parser->output)){
+		last = list_get_instance(link, usb_hid_report_item_t, link);
+
+		usb_log_debug("pro id: %d, posledni %d\n", report_id, last->id);
+		if(last->id == report_id){
+			break;
+		} 
+		else {
+			link =  link->prev;
+		}
+	}
+
+	
+
 	if(link != &parser->output) {
 		last = list_get_instance(link, usb_hid_report_item_t, link);
@@ -1189,5 +1159,5 @@
  *
  * @param output Output report buffer
- * @return
+ * @return void
  */
 void usb_hid_report_output_free(uint8_t *output)
@@ -1201,8 +1171,8 @@
 /** Returns size of output for given usage path 
  *
- * @param parser
- * @param path
- * @param flags
- * @return
+ * @param parser Opaque report parser structure
+ * @param path Usage path specified which items will be thought for the output
+ * @param flags Flags of usage path structure comparison
+ * @return Number of items matching the given usage path
  */
 size_t usb_hid_report_output_size(usb_hid_report_parser_t *parser,
@@ -1232,14 +1202,14 @@
 }
 
-/** Updates the output report buffer by translated given data 
- *
- * @param parser
- * @param path
- * @param flags
- * @param buffer
- * @param size
- * @param data
- * @param data_size
- * @return
+/** Updates the output report buffer by given data 
+ *
+ * @param parser Opaque report parser structure
+ * @param path Usage path specifing which parts of output will be set
+ * @param flags Usage path structure comparison flags
+ * @param buffer Output buffer
+ * @param size Size of output buffer
+ * @param data Data buffer
+ * @param data_size Size of data buffer
+ * @return Error code
  */
 int usb_hid_report_output_translate(usb_hid_report_parser_t *parser,
@@ -1341,8 +1311,8 @@
 
 /**
- *
- * @param item
- * @param value
- * @return
+ * Translate given data for putting them into the outoput report
+ * @param item Report item structure
+ * @param value Value to translate
+ * @return ranslated value
  */
 int32_t usb_hid_translate_data_reverse(usb_hid_report_item_t *item, int value)
@@ -1389,5 +1359,11 @@
 }
 
-
+/**
+ * Sets report id in usage path structure
+ *
+ * @param path Usage path structure
+ * @param report_id Report id to set
+ * @return Error code
+ */
 int usb_hid_report_path_set_report_id(usb_hid_report_path_t *path, uint8_t report_id)
 {
@@ -1400,5 +1376,10 @@
 }
 
-
+/**
+ * Clones given report item structure and returns the new one
+ *
+ * @param item Report item structure to clone
+ * @return Clonned item
+ */
 usb_hid_report_item_t *usb_hid_report_item_clone(const usb_hid_report_item_t *item)
 {
