Index: uspace/srv/kbd/ctl/pc.c
===================================================================
--- uspace/srv/kbd/ctl/pc.c	(revision 90e3d6a4d64226b489eac123eae27df8c803ecc8)
+++ uspace/srv/kbd/ctl/pc.c	(revision 12b679611efd5018a62a6d30b097bd4d7c89fe9c)
@@ -136,4 +136,6 @@
 	[0x58] = KC_F12,
 
+	[0x46] = KC_SCROLL_LOCK,
+
 	[0x1c] = KC_ENTER,
 
@@ -160,5 +162,7 @@
 
 	[0x37] = KC_PRTSCR,
+
 	[0x52] = KC_INSERT,
+	[0x47] = KC_HOME,
 	[0x49] = KC_PAGE_UP,
 
Index: uspace/srv/kbd/generic/kbd.c
===================================================================
--- uspace/srv/kbd/generic/kbd.c	(revision 90e3d6a4d64226b489eac123eae27df8c803ecc8)
+++ uspace/srv/kbd/generic/kbd.c	(revision 12b679611efd5018a62a6d30b097bd4d7c89fe9c)
@@ -64,4 +64,7 @@
 static unsigned mods = KM_NUM_LOCK;
 
+/** Currently pressed lock keys. We track these to tackle autorepeat. */
+static unsigned lock_keys;
+
 void kbd_push_scancode(int scancode)
 {
@@ -99,6 +102,17 @@
 	}
 
-	if (mod_mask != 0 && type == KE_PRESS)
-		mods = mods ^ mod_mask;
+	if (mod_mask != 0) {
+		if (type == KE_PRESS) {
+			/*
+			 * Only change lock state on transition from released
+			 * to pressed. This prevents autorepeat from messing
+			 * up the lock state.
+			 */
+			mods = mods ^ (mod_mask & ~lock_keys);
+			lock_keys = lock_keys | mod_mask;
+		} else {
+			lock_keys = lock_keys & ~mod_mask;
+		}
+	}
 
 	printf("type: %d\n", type);
