Index: uspace/drv/usbkbd/kbddev.c
===================================================================
--- uspace/drv/usbkbd/kbddev.c	(revision ad7bb42268707f9005f3e38681264d2e82c2ee16)
+++ uspace/drv/usbkbd/kbddev.c	(revision 70a71e55226a76c58f46ae9fc4a352346904d6f6)
@@ -276,8 +276,14 @@
 //		leds |= USB_HID_LED_NUM_LOCK;
 	}
+	else {
+	    kbd_dev->led_data[i++] = 0;
+	}
 	
 	if ((kbd_dev->mods & KM_CAPS_LOCK) && (i < kbd_dev->led_output_size)) {
 		kbd_dev->led_data[i++] = USB_HID_LED_CAPS_LOCK;
 //		leds |= USB_HID_LED_CAPS_LOCK;
+	}
+	else {
+	    kbd_dev->led_data[i++] = 0;
 	}
 	
@@ -286,4 +292,7 @@
 		kbd_dev->led_data[i++] = USB_HID_LED_SCROLL_LOCK;
 //		leds |= USB_HID_LED_SCROLL_LOCK;
+	}
+	else {
+	    kbd_dev->led_data[i++] = 0;
 	}
 	
Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision ad7bb42268707f9005f3e38681264d2e82c2ee16)
+++ uspace/lib/usb/src/hidparser.c	(revision 70a71e55226a76c58f46ae9fc4a352346904d6f6)
@@ -1200,4 +1200,7 @@
 	}
 
+	usb_log_debug("OUTPUT BUFFER: %s\n", usb_debug_str_buffer(buffer,size, 0));
+	usb_log_debug("OUTPUT DATA[0]: %d, DATA[1]: %d, DATA[2]: %d\n", data[0], data[1], data[2]);
+
 	item = parser->output.next;	
 	while(item != &parser->output) {
@@ -1208,14 +1211,4 @@
 			if(idx >= data_size) {
 				break;
-			}
-
-			// translate data
-			if(USB_HID_ITEM_FLAG_CONSTANT(report_item->item_flags)) {
-				value = report_item->logical_minimum;
-			}
-			else {
-				//variable item
-				value = usb_hid_translate_data_reverse(report_item, data[idx]);
-				idx++;
 			}
 
@@ -1224,4 +1217,5 @@
 					
 //				// variable item
+				value = usb_hid_translate_data_reverse(report_item, data[idx++]);
 				offset = report_item->offset + (i * report_item->size);
 				length = report_item->size;
@@ -1229,4 +1223,5 @@
 			else {
 				//bitmap
+				value += usb_hid_translate_data_reverse(report_item, data[idx++]);
 				offset = report_item->offset;
 				length = report_item->size * report_item->count;
@@ -1243,5 +1238,8 @@
 				value = value << shift;							
 				value = value & (((1 << length)-1) << shift);
-				buffer[offset/8] = buffer[offset/8] | value;
+				
+				uint8_t mask = 0;
+				mask = 0xff - (((1 << length) - 1) << shift);
+				buffer[offset/8] = (buffer[offset/8] & mask) | value;
 			}
 			else {
@@ -1253,5 +1251,7 @@
 				tmp_value = tmp_value << (offset%8);
 
-				buffer[offset/8] = buffer[offset/8] | tmp_value;
+				uint8_t mask = 0;
+				mask = ~(((1 << (8-(offset%8)))-1) << (offset%8));
+				buffer[offset/8] = (buffer[offset/8] & mask) | tmp_value;
 
 				// a ted druhej -- hornich length-x bitu
@@ -1259,5 +1259,6 @@
 				value = value & ((1 << (length - (8 - (offset % 8)))) - 1);
 				
-				buffer[(offset+length-1)/8] = buffer[(offset+length-1)/8] | value;
+				mask = ((1 << (length - (8 - (offset % 8)))) - 1);
+				buffer[(offset+length-1)/8] = (buffer[(offset+length-1)/8] & mask) | value;
 			}
 
@@ -1267,4 +1268,5 @@
 	}
 
+	usb_log_debug("OUTPUT BUFFER: %s\n", usb_debug_str_buffer(buffer,size, 0));
 
 	return EOK;
@@ -1281,4 +1283,8 @@
 	int ret=0;
 	int resolution;
+
+	if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags)) {
+		ret = item->logical_minimum;
+	}
 
 	if((USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0)) {
