diff -Nur hal-0.5.10/hald/linux/addons/addon-acpi-buttons-toshiba.c hal-0.5.10.new/hald/linux/addons/addon-acpi-buttons-toshiba.c
--- hal-0.5.10/hald/linux/addons/addon-acpi-buttons-toshiba.c	2008-01-17 20:16:27.000000000 +0900
+++ hal-0.5.10.new/hald/linux/addons/addon-acpi-buttons-toshiba.c	2008-01-17 20:20:07.000000000 +0900
@@ -5,6 +5,8 @@
  *
  *  @note	Low level routines from IAL, Copyright (C) 2004, 2005
  *		Timo Hoenig <thoenig@nouse.net>
+ *		Key mappings based on FnFX ones created by 
+ *		Michal Cihar <michal@cihar.com>.
  */
 /*
  * Licensed under the GNU General Public License Version 2
@@ -122,22 +124,263 @@
 	/* for each key */
 	while (toshiba_key_ready (&value) == TRUE) {
 		result = NULL;
-		if (value == 0x101) /* FnESC */
-			result = "mute";
-		else if (value == 0x13b) /* FnF1 */
-			result = "lock";
-		else if (value == 0x13c) /* FnF2 */
-			result = "search";
-		else if (value == 0x13d) /* FnF3 */
-			result = "suspend";
-		else if (value == 0x13e) /* FnF4 */
-			result = "hibernate";
-		else if (value == 0x140) /* FnF6 */
-			result = "brightness-down";
-		else if (value == 0x141) /* FnF7 */
-			result = "brightness-up";
-		else if (value == 0x142) /* FnF8 */
-			result = "wifi-power";
+        switch (value) {
+            case 0x101: /* Fn+Escape */
+                result = "mute";
+                break;
+            case 0x102: /* Fn+1 */
+                result = "fn+1";
+                break;
+            case 0x103: /* Fn+2 */
+                result = "fn+2";
+                break;
+            case 0x104: /* Fn+3 */
+                result = "fn+3";
+                break;
+            case 0x105: /* Fn+4 */
+                result = "fn+4";
+                break;
+            case 0x106: /* Fn+5 */
+                result = "fn+5";
+                break;
+            case 0x107: /* Fn+6 */
+                result = "fn+6";
+                break;
+            case 0x10c: /* Fn+- */
+                result = "fn+-";
+                break;
+            case 0x10d: /* Fn+= */
+                result = "fn+=";
+                break;
+            case 0x10e: /* Fn+Backspace */
+                result = "fn+backspace";
+                break;
+            case 0x10f: /* Fn+Tab */
+                result = "fn+Tab";
+                break;
+            case 0x110: /* Fn+q */
+                result = "fn+q";
+                break;
+            case 0x111: /* Fn+w */
+                result = "fn+w";
+                break;
+            case 0x112: /* Fn+e */
+                result = "fn+e";
+                break;
+            case 0x113: /* Fn+r */
+                result = "fn+r";
+                break;
+            case 0x114: /* Fn+t */
+                result = "fn+t";
+                break;
+            case 0x115: /* Fn+y */
+                result = "fn+y";
+                break;
+            case 0x11a: /* Fn+[ */
+                result = "fn+[";
+                break;
+            case 0x11b: /* Fn+] */
+                result = "fn+]";
+                break;
+            case 0x11e: /* Fn+a */
+                result = "fn+a";
+                break;
+            case 0x11f: /* Fn+s */
+                result = "fn+s";
+                break;
+            case 0x120: /* Fn+d */
+                result = "fn+d";
+                break;
+            case 0x121: /* Fn+f */
+                result = "fn+f";
+                break;
+            case 0x122: /* Fn+g */
+                result = "fn+g";
+                break;
+            case 0x123: /* Fn+h */
+                result = "fn+h";
+                break;
+            case 0x128: /* Fn+' */
+                result = "fn+'";
+                break;
+            case 0x129: /* Fn+~ */
+                result = "fn+~";
+                break;
+            case 0x12b: /* Fn+\ */
+                result = "fn+\\";
+                break;
+            case 0x12c: /* Fn+z */
+                result = "fn+z";
+                break;
+            case 0x12d: /* Fn+x */
+                result = "fn+x";
+                break;
+            case 0x12e: /* Fn+c */
+                result = "fn+c";
+                break;
+            case 0x12f: /* Fn+v */
+                result = "fn+v";
+                break;
+            case 0x130: /* Fn+b */
+                result = "fn+b";
+                break;
+            case 0x131: /* Fn+n */
+                result = "fn+n";
+                break;
+            case 0x133: /* Fn+< */
+                result = "fn+<";
+                break;
+            case 0x137: /* Fn+SysRq */
+                result = "fn+sysrq";
+                break;
+            case 0x139: /* Fn+Space */
+                result = "fn+space";
+                break;
+            case 0x13a: /* Fn+Caps Lock */
+                result = "fn+capslock";
+                break;
+            case 0x13b: /* Fn+F1 */
+                result = "lock";
+                break;
+            case 0x13c: /* Fn+F2 */
+                result = "search";
+                break;
+            case 0x13d: /* Fn+F3 */
+                result = "suspend";
+                break;
+            case 0x13e: /* Fn+F4 */
+                result = "hibernate";
+                break;
+            case 0x13f: /* Fn+F5 */
+                result = "fn+f5";
+                break;
+            case 0x140: /* Fn+F6 */
+                result = "brightness-down";
+                break;
+            case 0x141: /* Fn+F7 */
+                result = "brightness-up";
+                break;
+            case 0x142: /* Fn+F8 */
+                result = "wifi-power";
+                break;
+            case 0x143: /* Fn+F9 */
+                result = "fn+f9";
+                break;
+            case 0x147: /* Fn+Home */
+                result = "fn+home";
+                break;
+            case 0x148: /* Fn+Up */
+                result = "fn+up";
+                break;
+            case 0x149: /* Fn+Page Up */
+                result = "fn+pgup";
+                break;
+            case 0x14b: /* Fn+Left */
+                result = "fn+left";
+                break;
+            case 0x14d: /* Fn+Right */
+                result = "fn+right";
+                break;
+            case 0x14f: /* Fn+End */
+                result = "fn+dnd";
+                break;
+            case 0x150: /* Fn+Down */
+                result = "fn+down";
+                break;
+            case 0x151: /* Fn+Page Down */
+                result = "fn+pgdown";
+                break;
+            case 0x1d2: /* Fn+Ins */
+                result = "fn+ins";
+                break;
+            case 0x1d3: /* Fn+Del */
+                result = "fn+del";
+                break;
+            case 0xb25: /* Hotbutton (CD-Button) */
+                result = "cd";
+                break;
+            case 0xb27: /* Hotbutton (Digital-Button) */
+                /* TODO: Don't know how to map this one. */
+                break;
+            case 0xb30: /* Hotbutton (Stop) */
+                result = "stop";
+                break;
+            case 0xb31: /* Hotbutton (Skip Track Back) */
+                result = "previoussong";
+                break;
+            case 0xb32: /* Hotbutton (Skip Track Forward) */
+                result = "nextsong";
+                break;
+            case 0xb33: /* Hotbutton (Play/Pause) */
+                result = "playpause";
+                break;
+            case 0xb85: /* Hotbutton (TV-Button) */
+                result = "tv";
+                break;
+            case 0xb86: /* Hotbutton (E-Button) */
+                result = "www";
+                break;
+            case 0xb87: /* Hotbutton (I-Button) */
+                result = "info";
+                break;
+            case 0xd55: /* Remote (TV-Button) */
+                result = "tv";
+                break;
+            case 0xd42: /* Remote (Maximize) */
+                /* TODO: Don't know how to map this one. */
+                break;
+            case 0xd43: /* Remote (Switch) */
+                /* TODO: Don't know how to map this one. */
+                break;
+            case 0xd54: /* Remote (Mute) */
+                result = "mute";
+                break;
+            case 0xd4c: /* Remote (Menu) */
+                result = "menu";
+                break;
+            case 0xd4d: /* Remote (Mode) */
+                result = "mode";
+                break;
+            case 0xd4e: /* Remote (Play/Pause) */
+                result = "playpause";
+                break;
+            case 0xd4f: /* Remote (Stop) */
+                result = "stop";
+                break;
+            case 0xd50: /* Remote (Skip Track Back) */
+                result = "previoussong";
+                break;
+            case 0xd51: /* Remote (Rewind) */
+                result = "rewind";
+                break;
+            case 0xd52: /* Remote (Fast Forward) */
+                result = "fastforward";
+                break;
+            case 0xd53: /* Remote (Skip Track Forward) */
+                result = "nextsong";
+                break;
+            case 0x008: /* MM-1 */
+                result = "prog1";
+                break;
+            case 0x009: /* MM-2 */
+                result = "prog2";
+                break;
+            case 0x006: /* MM-E */
+                result = "www";
+                break;
+            case 0x9b2: /* MM-Play */
+                result = "playpause";
+                break;
+            case 0x9b3: /* MM-Stop */
+                result = "stop";
+                break;
+            case 0x9b1: /* MM-Prev */
+                result = "previoussong";
+                break;
+            case 0x9b4: /* MM-Next */
+                result = "nextsong";
+                break;
+        }
 
 		if (result) {
 			HAL_DEBUG (("Sending condition '%s'", result));
