Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision 70a71e55226a76c58f46ae9fc4a352346904d6f6)
+++ uspace/lib/usb/src/hidparser.c	(revision bda06a36c8a366a66b634a94ff0d515cced58872)
@@ -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;
+}
+
 /**
  * @}
