Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision 79e1abd99eedd6899d3f7ffb35c9b79040fafb5b)
+++ uspace/lib/usb/src/hidparser.c	(revision fc883bbebbcc5ec71ed6993b2fe15c97fce7dbc5)
@@ -1204,5 +1204,5 @@
 		report_item = list_get_instance(item, usb_hid_report_item_t, link);
 
-		for(i=0; i<report_item->count; i++, idx++) {
+		for(i=0; i<report_item->count; i++) {
 
 			if(idx >= data_size) {
@@ -1217,8 +1217,10 @@
 				//variable item
 				value = usb_hid_translate_data_reverse(report_item, data[idx]);
+				idx++;
 			}
 
 			if((USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) ||
 				((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) {
+					
 //				// variable item
 				offset = report_item->offset + (i * report_item->size);
@@ -1231,14 +1233,18 @@
 			}
 
-			if((offset/8) == ((offset+length)/8)) {
+			if((offset/8) == ((offset+length-1)/8)) {
 				// je to v jednom bytu
-				if(((size_t)(offset/8) >= size) || ((size_t)(offset+length)/8) >= size) {
+				if(((size_t)(offset/8) >= size) || ((size_t)(offset+length-1)/8) >= size) {
 					break; // TODO ErrorCode
 				}
 
-				value = value << (8- ((offset+length)%8));
-				value = value & (((1 << length)-1) << (8- ((offset+length)%8)));
+				size_t shift=0;
+				if(((offset+length)%8) > 0) {
+					shift = (8- ((offset+length)%8));
+				}
+
+				value = value << shift;							
+				value = value & (((1 << length)-1) << shift);
 				buffer[offset/8] = buffer[offset/8] | value;
-
 			}
 			else {
@@ -1247,11 +1253,14 @@
 				// konec prvniho
 				tmp_value = value;
-				tmp_value = tmp_value >> (8 - (offset%8));
-				tmp_value = tmp_value & ((1 << (8-(offset%8)))-1);
+				tmp_value = tmp_value >> (8 - (offset%8) - 1);
+				tmp_value = tmp_value & ((1 << (8-(offset%8)))-1);				
+
 				buffer[offset/8] = buffer[offset/8] | tmp_value;
 
 				// a ted druhej
-				value = value & (((1 << report_item->size) - ((8 - (offset%8))))-1);
-				buffer[(offset+length)/8] = buffer[(offset+length)/8] | value;
+				value = value & ((1 << (length - (8 - (offset%8))))-1);
+				value = value << (8 - (length - (8 - (offset%8))));
+				
+				buffer[(offset+length-1)/8] = buffer[(offset+length-1)/8] | value;
 			}
 
@@ -1276,6 +1285,5 @@
 	int resolution;
 
-	if((USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) ||
-		((item->usage_minimum == 0) && (item->usage_maximum == 0))) {
+	if((USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0)) {
 
 		// variable item
