Index: uspace/lib/usb/include/usb/classes/hidparser.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hidparser.h	(revision 966acedea361193a3281881799f3c0e6984cc329)
+++ uspace/lib/usb/include/usb/classes/hidparser.h	(revision ec6bee4b4529a3716d58500f7312856a0f174883)
@@ -88,4 +88,5 @@
 	/** */	
 	int depth;	
+	uint8_t report_id;
 	
 	/** */	
@@ -155,4 +156,7 @@
 	/** */	
 	link_t feature;
+	
+	int use_report_id;
+	
 } usb_hid_report_parser_t;	
 
@@ -166,5 +170,5 @@
 	 * @param arg Custom argument.
 	 */
-	void (*keyboard)(const uint8_t *key_codes, size_t count, const uint8_t modifiers, void *arg);
+	void (*keyboard)(const uint8_t *key_codes, size_t count, const uint8_t report_id, void *arg);
 } usb_hid_report_in_callbacks_t;
 
@@ -269,4 +273,7 @@
 
 /** */
+int usb_hid_report_path_set_report_id(usb_hid_report_path_t *usage_path, uint8_t report_id);
+
+/** */
 int usb_hid_report_path_append_item(usb_hid_report_path_t *usage_path, int32_t usage_page, int32_t usage);
 
Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision 966acedea361193a3281881799f3c0e6984cc329)
+++ uspace/lib/usb/src/hidparser.c	(revision ec6bee4b4529a3716d58500f7312856a0f174883)
@@ -106,4 +106,5 @@
     list_initialize(&(parser->feature));
 
+	parser->use_report_id = 0;
     return EOK;   
 }
@@ -186,4 +187,8 @@
 					tmp_usage_path = NULL;
 
+					usb_hid_report_path_set_report_id(report_item->usage_path, report_item->id);	
+					if(report_item->id != 0){
+						parser->use_report_id = 1;
+					}
 					
 					switch(tag) {
@@ -647,4 +652,6 @@
 	}
 
+	parser->use_report_id = 0;
+
 	usb_hid_free_report_list(&parser->input);
 	usb_hid_free_report_list(&parser->output);
@@ -676,4 +683,5 @@
 	size_t i=0;
 	size_t j=0;
+	uint8_t report_id = 0;
 
 	if(parser == NULL) {
@@ -686,4 +694,9 @@
 	if(!(keys = malloc(sizeof(uint8_t) * key_count))){
 		return ENOMEM;
+	}
+
+	if(parser->use_report_id != 0) {
+		report_id = data[0];
+		usb_hid_report_path_set_report_id(path, report_id);
 	}
 
@@ -693,4 +706,5 @@
 
 		item = list_get_instance(list_item, usb_hid_report_item_t, link);
+
 		if(!USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) && 
 		   (usb_hid_report_compare_usage_path(item->usage_path, path, flags) == EOK)) {
@@ -715,5 +729,5 @@
 	}
 
-	callbacks->keyboard(keys, key_count, 0, arg);
+	callbacks->keyboard(keys, key_count, report_id, arg);
 	   
 	free(keys);	
@@ -739,5 +753,5 @@
 	int32_t mask;
 	const uint8_t *foo;
-	
+
 	// now only common numbers llowed
 	if(item->size > 32) {
@@ -758,5 +772,10 @@
 		(usb_pow(10,(item->unit_exponent))));
 	}
+
 	offset = item->offset + (j * item->size);
+	if(item->id != 0) {
+		offset += 8;
+		usb_log_debug("MOVED OFFSET BY 1Byte, REPORT_ID(%d)\n", item->id);
+	}
 	
 	// FIXME
@@ -942,4 +961,8 @@
 
 	int only_page;
+
+	if(report_path->report_id != path->report_id) {
+		return 1;
+	}
 
 	if(path->depth == 0){
@@ -1038,4 +1061,5 @@
 	else {
 		path->depth = 0;
+		path->report_id = 0;
 		list_initialize(&path->link);
 		return path;
@@ -1155,5 +1179,5 @@
 		return 0;
 	}
-	
+
 	item = parser->output.next;
 	while(&parser->output != item) {
@@ -1195,7 +1219,13 @@
 	int length;
 	int32_t tmp_value;
+	size_t offset_prefix = 0;
 	
 	if(parser == NULL) {
 		return EINVAL;
+	}
+
+	if(parser->use_report_id != 0) {
+		buffer[0] = path->report_id;
+		offset_prefix = 8;
 	}
 
@@ -1218,5 +1248,5 @@
 //				// variable item
 				value = usb_hid_translate_data_reverse(report_item, data[idx++]);
-				offset = report_item->offset + (i * report_item->size);
+				offset = report_item->offset + (i * report_item->size) + offset_prefix;
 				length = report_item->size;
 			}
@@ -1224,5 +1254,5 @@
 				//bitmap
 				value += usb_hid_translate_data_reverse(report_item, data[idx++]);
-				offset = report_item->offset;
+				offset = report_item->offset + offset_prefix;
 				length = report_item->size * report_item->count;
 			}
@@ -1323,4 +1353,14 @@
 
 
+int usb_hid_report_path_set_report_id(usb_hid_report_path_t *path, uint8_t report_id)
+{
+	if(path == NULL){
+		return EINVAL;
+	}
+
+	path->report_id = report_id;
+	return EOK;
+}
+
 /**
  * @}
