Index: uspace/lib/usb/include/usb/classes/hidparser.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hidparser.h	(revision e259d95fc0635a7747799ccbb3eff1e4275d89df)
+++ uspace/lib/usb/include/usb/classes/hidparser.h	(revision c7a2e7ec1c726c515237c4ca2105dbd3ac1d4837)
@@ -76,5 +76,5 @@
 	int32_t size;
 	int32_t count;
-	int32_t offset;
+	size_t offset;
 
 	int32_t unit_exponent;
Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision e259d95fc0635a7747799ccbb3eff1e4275d89df)
+++ uspace/lib/usb/src/hidparser.c	(revision c7a2e7ec1c726c515237c4ca2105dbd3ac1d4837)
@@ -43,11 +43,11 @@
 
 
-int usb_hid_report_parse_tag(uint8_t tag, uint8_t class, uint8_t *data, size_t item_size,
+int usb_hid_report_parse_tag(uint8_t tag, uint8_t class, const const uint8_t *data, size_t item_size,
                              usb_hid_report_item_t *report_item);
-int usb_hid_report_parse_main_tag(uint8_t tag, uint8_t *data, size_t item_size,
+int usb_hid_report_parse_main_tag(uint8_t tag, const uint8_t *data, size_t item_size,
                              usb_hid_report_item_t *report_item);
-int usb_hid_report_parse_global_tag(uint8_t tag, uint8_t *data, size_t item_size,
+int usb_hid_report_parse_global_tag(uint8_t tag, const uint8_t *data, size_t item_size,
                              usb_hid_report_item_t *report_item);
-int usb_hid_report_parse_local_tag(uint8_t tag, uint8_t *data, size_t item_size,
+int usb_hid_report_parse_local_tag(uint8_t tag, const uint8_t *data, size_t item_size,
                              usb_hid_report_item_t *report_item);
 
@@ -55,5 +55,6 @@
 int usb_hid_report_reset_local_items();
 void usb_hid_free_report_list(link_t *head);
-int32_t usb_hid_report_tag_data_int32(uint8_t *data, size_t size);
+int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size);
+size_t usb_hid_count_item_offset(usb_hid_report_item_t * report_item, size_t offset);
 /**
  *
@@ -80,5 +81,5 @@
  */
 int usb_hid_parse_report_descriptor(usb_hid_report_parser_t *parser, 
-    const uint8_t *data, size_t size)
+    const const uint8_t *data, size_t size)
 {
 	size_t i=0;
@@ -89,4 +90,6 @@
 	usb_hid_report_item_t *report_item=0;
 	usb_hid_report_item_t *new_report_item;
+
+	size_t offset=0;
 	
 
@@ -103,6 +106,5 @@
 			class = USB_HID_ITEM_TAG_CLASS(data[i]);
 						
-			ret = usb_hid_report_parse_tag(tag,class,
-			                         (uint8_t *)(data + sizeof(uint8_t)*(i+1)),
+			ret = usb_hid_report_parse_tag(tag,class,(data + (i+1)),
 			                         item_size,report_item);
 			switch(ret){
@@ -110,4 +112,7 @@
 					// store report item to report and create the new one
 					printf("\nNEW REPORT ITEM: %X",tag);
+
+					offset = usb_hid_count_item_offset(report_item, offset);
+					report_item->offset = offset;
 					switch(tag) {
 						case USB_HID_REPORT_TAG_INPUT:
@@ -125,5 +130,5 @@
 							break;
 						default:
-						    printf("\tjump over\n");
+						    printf("\tjump over tag: %X\n", tag	q);
 						    break;
 					}
@@ -178,5 +183,5 @@
  */
 int usb_hid_parse_report(const usb_hid_report_parser_t *parser,  
-    const uint8_t *data, size_t size,
+    const const uint8_t *data, size_t size,
     const usb_hid_report_in_callbacks_t *callbacks, void *arg)
 {
@@ -210,5 +215,5 @@
  * @return Error code
  */
-int usb_hid_boot_keyboard_input_report(const uint8_t *data, size_t size,
+int usb_hid_boot_keyboard_input_report(const const uint8_t *data, size_t size,
 	const usb_hid_report_in_callbacks_t *callbacks, void *arg)
 {
@@ -268,5 +273,5 @@
  * @return Code of action to be done next
  */
-int usb_hid_report_parse_tag(uint8_t tag, uint8_t class, uint8_t *data, size_t item_size,
+int usb_hid_report_parse_tag(uint8_t tag, uint8_t class, const const uint8_t *data, size_t item_size,
                              usb_hid_report_item_t *report_item)
 {	
@@ -305,5 +310,5 @@
  */
 
-int usb_hid_report_parse_main_tag(uint8_t tag, uint8_t *data, size_t item_size,
+int usb_hid_report_parse_main_tag(uint8_t tag, const uint8_t *data, size_t item_size,
                              usb_hid_report_item_t *report_item)
 {
@@ -341,5 +346,5 @@
  */
 
-int usb_hid_report_parse_global_tag(uint8_t tag, uint8_t *data, size_t item_size,
+int usb_hid_report_parse_global_tag(uint8_t tag, const uint8_t *data, size_t item_size,
                              usb_hid_report_item_t *report_item)
 {
@@ -398,5 +403,5 @@
  * @return Error code
  */
-int usb_hid_report_parse_local_tag(uint8_t tag, uint8_t *data, size_t item_size,
+int usb_hid_report_parse_local_tag(uint8_t tag, const uint8_t *data, size_t item_size,
                              usb_hid_report_item_t *report_item)
 {
@@ -449,5 +454,5 @@
  * @return Converted int32 number
  */
-int32_t usb_hid_report_tag_data_int32(uint8_t *data, size_t size)
+int32_t usb_hid_report_tag_data_int32(const uint8_t *data, size_t size)
 {
 	unsigned int i;
@@ -563,4 +568,9 @@
 	return;
 }
+
+inline size_t usb_hid_count_item_offset(usb_hid_report_item_t * report_item, size_t offset)
+{
+	return offset += (report_item->count * report_item->size);
+}
 /**
  * @}
