diff -uNr linux-2.6.20-hardened-r2.orig/drivers/hid/hid-input.c linux-2.6.20-hardened-r2/drivers/hid/hid-input.c
--- linux-2.6.20-hardened-r2.orig/drivers/hid/hid-input.c	2007-05-03 18:46:07.000000000 +0300
+++ linux-2.6.20-hardened-r2/drivers/hid/hid-input.c	2007-05-06 20:40:03.000000000 +0300
@@ -54,7 +54,7 @@
 	115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
 	122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
 	unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
-	unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
+	unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk,
 	unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
 	unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
 	 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
@@ -476,6 +476,7 @@
 				case 0x0e5: map_key_clear(KEY_BASSBOOST);	break;
 				case 0x0e9: map_key_clear(KEY_VOLUMEUP);	break;
 				case 0x0ea: map_key_clear(KEY_VOLUMEDOWN);	break;
+				case 0x182: map_key_clear(KEY_FAVORITES);	break;
 				case 0x183: map_key_clear(KEY_CONFIG);		break;
 				case 0x184: map_key_clear(KEY_WORDPROCESSOR);	break;
 				case 0x185: map_key_clear(KEY_EDITOR);		break;
@@ -495,6 +496,7 @@
 				case 0x19e: map_key_clear(KEY_COFFEE);		break;
 				case 0x1a6: map_key_clear(KEY_HELP);		break;
 				case 0x1a7: map_key_clear(KEY_DOCUMENTS);	break;
+				case 0x1ab: map_key_clear(KEY_SPELL);           break;
 				case 0x1bc: map_key_clear(KEY_MESSENGER);	break;
 				case 0x1bd: map_key_clear(KEY_INFO);		break;
 				case 0x201: map_key_clear(KEY_NEW);		break;
@@ -557,8 +559,23 @@
 			}
 			break;
 
-		case HID_UP_MSVENDOR:
-			goto ignore;
+                case HID_UP_MSVENDOR: /* Reported on MS Natural Ergonomic 4000 USB keyboard */ 
+  
+                        set_bit(EV_REP, input->evbit); 
+                        switch(usage->hid & HID_USAGE) { 
+                                case 0xff05: 
+                                        /* The Favourites 1-5 keys */ 
+                                        map_key_clear(KEY_FN); 
+                                        set_bit(KEY_FN_F1, input->keybit); 
+                                        set_bit(KEY_FN_F2, input->keybit); 
+                                        set_bit(KEY_FN_F3, input->keybit); 
+                                        set_bit(KEY_FN_F4, input->keybit); 
+                                        set_bit(KEY_FN_F5, input->keybit); 
+                                        break; 
+  
+                                default:    goto ignore; 
+                        } 
+                        break; 
 
 		case HID_UP_CUSTOM: /* Reported on Logitech and Powerbook USB keyboards */
 
@@ -728,6 +745,41 @@
 	if ((hid->quirks & HID_QUIRK_POWERBOOK_HAS_FN) && hidinput_pb_event(hid, input, usage, value))
 		return;
 
+        if (usage->hid == (HID_UP_MSVENDOR | 0xff05)) { 
+		unsigned int code = 0;
+  
+                switch (value) { 
+                        case 0x01: code = KEY_FN_F1;    break; 
+                        case 0x02: code = KEY_FN_F2;    break; 
+                        case 0x04: code = KEY_FN_F3;    break; 
+                        case 0x08: code = KEY_FN_F4;    break; 
+                        case 0x10: code = KEY_FN_F5;    break; 
+                        default:   code = 0;            break; 
+                } 
+                if (code) { 
+                        input_event(input, usage->type, code, 1); 
+                        input_event(input, usage->type, code, 0); 
+			return;
+                } 
+        } 
+	/*
+	 * Convert FLock's F-keys to normal F-keys
+	 * Probably this code isn't universal and will work only for:
+	 * Microsoft Natural Ergonomic Keyboard 4000 v1.0
+	 */
+	if (usage->code==138) usage->code=59;
+	if (usage->code==131) usage->code=60;
+	if (usage->code==182) usage->code=61;
+	if (usage->code==181) usage->code=62;
+	if (usage->code==134) usage->code=63;
+	if (usage->code==206) usage->code=64;
+	if (usage->code==232) usage->code=65;
+	if (usage->code==233) usage->code=66;
+	if (usage->code==231) usage->code=67;
+	if (usage->code==431) usage->code=68;
+	if (usage->code==234) usage->code=87;
+	if (usage->code==210) usage->code=88;
+ 
 	if (usage->hat_min < usage->hat_max || usage->hat_dir) {
 		int hat_dir = usage->hat_dir;
 		if (!hat_dir)
diff -uNr linux-2.6.20-hardened-r2.orig/drivers/usb/input/usbkbd.c linux-2.6.20-hardened-r2/drivers/usb/input/usbkbd.c
--- linux-2.6.20-hardened-r2.orig/drivers/usb/input/usbkbd.c	2007-05-03 18:46:07.000000000 +0300
+++ linux-2.6.20-hardened-r2/drivers/usb/input/usbkbd.c	2007-05-06 19:17:13.000000000 +0300
@@ -56,7 +56,7 @@
 	115,114,  0,  0,  0,121,  0, 89, 93,124, 92, 94, 95,  0,  0,  0,
 	122,123, 90, 91, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+	  0,  0,  0,  0,  0,  0,179,180,  0,  0,  0,  0,  0,  0,  0,  0,
 	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
diff -uNr linux-2.6.20-hardened-r2.orig/include/linux/input.h linux-2.6.20-hardened-r2/include/linux/input.h
--- linux-2.6.20-hardened-r2.orig/include/linux/input.h	2007-05-06 19:36:43.000000000 +0300
+++ linux-2.6.20-hardened-r2/include/linux/input.h	2007-05-06 19:36:58.000000000 +0300
@@ -506,6 +506,7 @@
 #define KEY_VOICEMAIL		0x1ac
 #define KEY_ADDRESSBOOK		0x1ad
 #define KEY_MESSENGER		0x1ae
+#define KEY_SPELL		0x1af
 
 #define KEY_DEL_EOL		0x1c0
 #define KEY_DEL_EOS		0x1c1
