Index: uspace/drv/usbhid/hid.h
===================================================================
--- uspace/drv/usbhid/hid.h	(revision 8c3c756982a7a3a0295570d78179bb77a53dc6c7)
+++ uspace/drv/usbhid/hid.h	(revision 4837092878914ac63992fa91bc05805d46ad4509)
@@ -79,4 +79,5 @@
 	uint8_t *keycodes;
 	size_t keycode_count;
+	uint8_t modifiers;
 } usb_hid_dev_kbd_t;
 
Index: uspace/drv/usbhid/main.c
===================================================================
--- uspace/drv/usbhid/main.c	(revision 8c3c756982a7a3a0295570d78179bb77a53dc6c7)
+++ uspace/drv/usbhid/main.c	(revision 4837092878914ac63992fa91bc05805d46ad4509)
@@ -248,10 +248,42 @@
 	 */
 
+static const keycode_t usb_hid_modifiers_boot_keycodes[5] = {
+	KC_NUM_LOCK,      /* USB_HID_MOD_BOOT_NUM_LOCK */
+	KC_CAPS_LOCK,     /* USB_HID_MOD_BOOT_CAPS_LOCK */
+	KC_SCROLL_LOCK,   /* USB_HID_MOD_BOOT_SCROLL_LOCK */
+	0,                /* USB_HID_MOD_BOOT_COMPOSE */
+	0                 /* USB_HID_MOD_BOOT_KANA */
+};
+
 static void usbkbd_check_modifier_changes(usb_hid_dev_kbd_t *kbd_dev,
     uint8_t modifiers)
 {
-	// ignore for now
-	// modifiers should be sent as normal keys to usbkbd_parse_scancode()!!
-	// so it would be better if I received it from report parser in that way
+	/*
+	 * TODO: why the USB keyboard has NUM_, SCROLL_ and CAPS_LOCK
+	 *       both as modifiers and as keys with their own scancodes???
+	 *
+	 * modifiers should be sent as normal keys to usbkbd_parse_scancode()!!
+	 * so maybe it would be better if I received it from report parser in 
+	 * that way
+	 */
+	
+	int i;
+	for (i = 0; i < USB_HID_MOD_BOOT_COUNT; ++i) {
+		if ((modifiers & usb_hid_modifiers_boot_consts[i]) &&
+		    !(kbd_dev->modifiers & usb_hid_modifiers_boot_consts[i])) {
+			// modifier pressed
+			if (usb_hid_modifiers_boot_keycodes[i] != 0) {
+				kbd_push_ev(KEY_PRESS, 
+				    usb_hid_modifiers_boot_keycodes[i]);
+			}
+		} else if (!(modifiers & usb_hid_modifiers_boot_consts[i]) &&
+		    (kbd_dev->modifiers & usb_hid_modifiers_boot_consts[i])) {
+			// modifier released
+			if (usb_hid_modifiers_boot_keycodes[i] != 0) {
+				kbd_push_ev(KEY_RELEASE, 
+				    usb_hid_modifiers_boot_keycodes[i]);
+			}
+		}	// no change
+	}
 }
 
@@ -262,5 +294,5 @@
 	
 	unsigned int key;
-	int i, j;
+	unsigned int i, j;
 	
 	// TODO: quite dummy right now, think of better implementation
@@ -486,5 +518,5 @@
 	kbd_dev->keycode_count = BOOTP_REPORT_SIZE;
 	kbd_dev->keycodes = (uint8_t *)calloc(
-	    kbd_dev->keycode_count * sizeof(uint8_t));
+	    kbd_dev->keycode_count, sizeof(uint8_t));
 	
 	if (kbd_dev->keycodes == NULL) {
