diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index 1da5e2ca381867435b91d427475d8ba66e620040..58941e00914177fca85aa8b2cd7988e98191b594 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -29,6 +29,8 @@ from bpy.props import (StringProperty,
 
 from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear
 
+import subprocess
+import os
 
 class MESH_OT_delete_edgeloop(Operator):
     '''Delete an edge loop by merging the faces on each side to a single face loop'''
@@ -1175,6 +1177,26 @@ class WM_OT_copy_prev_settings(Operator):
 
         return {'CANCELLED'}
 
+class WM_OT_blenderplayer_start(bpy.types.Operator):
+    '''Launches the Blenderplayer with the current blendfile'''
+    bl_idname = "wm.blenderplayer_start"
+    bl_label = "Start"
+    
+    blender_bin_path = bpy.app.binary_path
+    blender_bin_dir = os.path.dirname(blender_bin_path)
+    ext = os.path.splitext(blender_bin_path)[-1]
+    player_path = os.path.join(blender_bin_dir, 'blenderplayer' + ext)
+    
+    def execute(self, context):
+        import sys
+
+        if sys.platform == 'darwin':
+            self.player_path = os.path.join(self.blender_bin_dir, '../../../blenderplayer.app/Contents/MacOS/blenderplayer')
+	
+        filepath = bpy.app.tempdir + "game.blend"
+        bpy.ops.wm.save_as_mainfile(filepath=filepath, check_existing=False, copy=True)
+        subprocess.call([self.player_path, filepath])
+        return {'FINISHED'}
 
 class WM_OT_keyconfig_test(Operator):
     "Test keyconfig for conflicts"
diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py
index db65b0ff669cb800dced57aeddae3e386a0ac81a..66b8cca786671484255e306a24a3acaa94083ea9 100644
--- a/release/scripts/startup/bl_ui/properties_game.py
+++ b/release/scripts/startup/bl_ui/properties_game.py
@@ -244,16 +244,22 @@ class RenderButtonsPanel():
         return (rd.engine in cls.COMPAT_ENGINES)
 
 
-class RENDER_PT_game(RenderButtonsPanel, Panel):
-    bl_label = "Game"
+class RENDER_PT_embedded(RenderButtonsPanel, bpy.types.Panel):
+    bl_label = "Embedded Player"
     COMPAT_ENGINES = {'BLENDER_GAME'}
-
     def draw(self, context):
         layout = self.layout
 
+        rd = context.scene.render
+
         row = layout.row()
         row.operator("view3d.game_start", text="Start")
         row.label()
+        row = layout.row()
+        row.label(text="Resolution:")
+        row = layout.row(align=True)
+        row.prop(rd, "resolution_x", slider=False, text="X")
+        row.prop(rd, "resolution_y", slider=False, text="Y")
 
 
 class RENDER_PT_game_player(RenderButtonsPanel, Panel):
@@ -264,29 +270,23 @@ class RENDER_PT_game_player(RenderButtonsPanel, Panel):
         layout = self.layout
 
         gs = context.scene.game_settings
-
-        layout.prop(gs, "show_fullscreen")
-
-        split = layout.split()
-
-        col = split.column()
-        col.label(text="Resolution:")
-        sub = col.column(align=True)
-        sub.prop(gs, "resolution_x", slider=False, text="X")
-        sub.prop(gs, "resolution_y", slider=False, text="Y")
-
-        col = split.column()
+        
+        row = layout.row()
+        row.operator("wm.blenderplayer_start", text="Start")
+        row.prop(gs, "show_fullscreen")
+        
+        row = layout.row()
+        row.label(text="Resolution:")
+        row = layout.row(align=True)
+        row.prop(gs, "resolution_x", slider=False, text="X")
+        row.prop(gs, "resolution_y", slider=False, text="Y")
+        
+        col = layout.column()
         col.label(text="Quality:")
-        sub = col.column(align=True)
-        sub.prop(gs, "depth", text="Bit Depth", slider=False)
-        sub.prop(gs, "frequency", text="FPS", slider=False)
+        col = layout.column(align=True)
+        col.prop(gs, "depth", text="Bit Depth", slider=False)
+        col.prop(gs, "frequency", text="Refresh Rate", slider=False)
 
-        # framing:
-        col = layout.column()
-        col.label(text="Framing:")
-        col.row().prop(gs, "frame_type", expand=True)
-        if gs.frame_type == 'LETTERBOX':
-            col.prop(gs, "frame_color", text="")
 
 
 class RENDER_PT_game_stereo(RenderButtonsPanel, Panel):
@@ -368,20 +368,24 @@ class RENDER_PT_game_shading(RenderButtonsPanel, Panel):
             col.prop(gs, "use_glsl_extra_textures", text="Extra Textures")
 
 
-class RENDER_PT_game_performance(RenderButtonsPanel, Panel):
-    bl_label = "Performance"
+class RENDER_PT_game_system(RenderButtonsPanel, Panel):
+    bl_label = "System"
     COMPAT_ENGINES = {'BLENDER_GAME'}
 
     def draw(self, context):
         layout = self.layout
 
         gs = context.scene.game_settings
-        col = layout.column()
-        row = col.row()
+        row = layout.row()
         row.prop(gs, "use_frame_rate")
+        row.prop(gs, "restrict_animation_updates")
+
+        row = layout.row()
         row.prop(gs, "use_display_lists")
 
-        col.prop(gs, "restrict_animation_updates")
+        row = layout.row()
+        row.label("Exit Key")
+        row.prop(gs, "exit_key", text="", event=True)
 
 
 class RENDER_PT_game_display(RenderButtonsPanel, Panel):
@@ -391,6 +395,9 @@ class RENDER_PT_game_display(RenderButtonsPanel, Panel):
     def draw(self, context):
         layout = self.layout
 
+        row = layout.row()
+        row.prop(context.scene.render, "fps", text="Animation Frame Rate", slider=False)
+
         gs = context.scene.game_settings
         flow = layout.column_flow()
         flow.prop(gs, "show_debug_properties", text="Debug Properties")
@@ -399,6 +406,12 @@ class RENDER_PT_game_display(RenderButtonsPanel, Panel):
         flow.prop(gs, "use_deprecation_warnings")
         flow.prop(gs, "show_mouse", text="Mouse Cursor")
 
+        col = layout.column()
+        col.label(text="Framing:")
+        col.row().prop(gs, "frame_type", expand=True)
+        if gs.frame_type == 'LETTERBOX':
+            col.prop(gs, "frame_color", text="")
+
 
 class SceneButtonsPanel():
     bl_space_type = 'PROPERTIES'
@@ -463,6 +476,20 @@ class SCENE_PT_game_navmesh(SceneButtonsPanel, Panel):
         row.prop(rd, "sample_dist")
         row.prop(rd, "sample_max_error")
 
+class RENDER_PT_game_sound(RenderButtonsPanel, Panel):
+    bl_label = "Sound"
+    COMPAT_ENGINES = {'BLENDER_GAME'}
+
+    def draw(self, context):
+        layout = self.layout
+
+        scene = context.scene
+
+        layout.prop(scene, "audio_distance_model")
+
+        col = layout.column(align=True)
+        col.prop(scene, "audio_doppler_speed", text="Speed")
+        col.prop(scene, "audio_doppler_factor")
 
 class WorldButtonsPanel():
     bl_space_type = 'PROPERTIES'
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index f7f67527b639f5030bd7c52a1d03233c0c93b38d..bc42b2a2a114b5c68512993f2f3947fba38311f3 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -76,15 +76,21 @@ class ParticleButtonsPanel():
 class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
     bl_label = ""
     bl_options = {'HIDE_HEADER'}
-    COMPAT_ENGINES = {'BLENDER_RENDER'}
+    # COMPAT_ENGINES = {'BLENDER_RENDER'}
 
     @classmethod
     def poll(cls, context):
         engine = context.scene.render.engine
-        return (context.particle_system or context.object or context.space_data.pin_id) and (engine in cls.COMPAT_ENGINES)
+        return (context.particle_system or context.object or context.space_data.pin_id)# and (engine in cls.COMPAT_ENGINES)
 
     def draw(self, context):
         layout = self.layout
+        
+        if context.scene.render.engine == "BLENDER_GAME":
+            layout.label("The Blender particle system is")
+            layout.label("not available for use in the")
+            layout.label("Blender Game Engine")
+            return
 
         ob = context.object
         psys = context.particle_system
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 4b4c2d2b214cde5d2bd48678b5d7e03c9e7f392f..6a8439ffaaada054f4ef2bee6743f361b97240d5 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -51,7 +51,7 @@ class RenderButtonsPanel():
     @classmethod
     def poll(cls, context):
         rd = context.scene.render
-        return (context.scene and rd.use_game_engine is False) and (rd.engine in cls.COMPAT_ENGINES)
+        return context.scene and (rd.engine in cls.COMPAT_ENGINES)
 
 
 class RENDER_PT_render(RenderButtonsPanel, Panel):
@@ -553,7 +553,7 @@ class RENDER_PT_encoding(RenderButtonsPanel, Panel):
 class RENDER_PT_bake(RenderButtonsPanel, Panel):
     bl_label = "Bake"
     bl_options = {'DEFAULT_CLOSED'}
-    COMPAT_ENGINES = {'BLENDER_RENDER'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
 
     def draw(self, context):
         layout = self.layout
diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index 05f4887a5424403a45fde839c0b9acce401b5d47..6c0d07a15c9265bee9723c2a8abab824207d7136 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -29,12 +29,12 @@ class SceneButtonsPanel():
 
     @classmethod
     def poll(cls, context):
-        return context.scene
+        rd = context.scene.render
+        return context.scene and (rd.engine in cls.COMPAT_ENGINES)
 
 
 class SCENE_PT_scene(SceneButtonsPanel, Panel):
     bl_label = "Scene"
-    COMPAT_ENGINES = {'BLENDER_RENDER'}
 
     def draw(self, context):
         layout = self.layout
@@ -75,7 +75,6 @@ class SCENE_PT_audio(SceneButtonsPanel, Panel):
 
 class SCENE_PT_unit(SceneButtonsPanel, Panel):
     bl_label = "Units"
-    COMPAT_ENGINES = {'BLENDER_RENDER'}
 
     def draw(self, context):
         layout = self.layout
@@ -192,7 +191,6 @@ class SCENE_PT_physics(SceneButtonsPanel, Panel):
 
 class SCENE_PT_simplify(SceneButtonsPanel, Panel):
     bl_label = "Simplify"
-    COMPAT_ENGINES = {'BLENDER_RENDER'}
 
     def draw_header(self, context):
         rd = context.scene.render
diff --git a/release/scripts/startup/bl_ui/space_logic.py b/release/scripts/startup/bl_ui/space_logic.py
index 1ae8095fab3475e49978c4cde32a7e382a748610..1fc58475ace5773f42e2738c0333abcd94a7acc0 100644
--- a/release/scripts/startup/bl_ui/space_logic.py
+++ b/release/scripts/startup/bl_ui/space_logic.py
@@ -70,7 +70,9 @@ class LOGIC_HT_header(Header):
         layout.template_header()
 
         if context.area.show_menus:
-            layout.menu("LOGIC_MT_view")
+            row = layout.row(align=True)
+            row.menu("LOGIC_MT_view")
+            row.menu("LOGIC_MT_logicbricks_add")
 
 
 class LOGIC_MT_view(Menu):
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 0feb56b931ffb9375a33c966c8354f4681d1f0a9..593b526d38bae9b42e75cacc93a55c95ff0b78ae 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -12723,6 +12723,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
 			for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
 				do_versions_nodetree_socket_use_flags_2_62(ntree);
 		}
+		{
+			/* Initialize BGE exit key to esc key */
+			Scene *scene;
+			for(scene= main->scene.first; scene; scene= scene->id.next) {
+				if (!scene->gm.exitkey)
+					scene->gm.exitkey = 218; // Blender key code for ESC
+			}
+		}
 	}
 
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 1b849754db84c3599d93c130ebc69fc2d46653ac..345e78d70c9c531e7a5efef7e304a1b7372bc8c3 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -576,7 +576,7 @@ typedef struct GameData {
 	short mode, matmode;
 	short occlusionRes;		/* resolution of occlusion Z buffer in pixel */
 	short physicsEngine;
-	short pad[2];
+	short exitkey, pad;
 	short ticrate, maxlogicstep, physubstep, maxphystep;
 	short obstacleSimulation, pad1;
 	float levelHeight;
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index a682c32944402246bd4d4d480ae13bbc8b919f11..9638bba3e80c3308c747061be40c3556c0914db5 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -1213,6 +1213,13 @@ static void rna_GameSettings_auto_start_set(PointerRNA *UNUSED(ptr), int value)
 		G.fileflags &= ~G_FILE_AUTOPLAY;
 }
 
+static void rna_GameSettings_exit_key_set(PointerRNA *ptr, int value)
+{
+	GameData *gm = (GameData*)ptr->data;
+
+	if(ISKEYBOARD(value))
+		gm->exitkey=value;
+}
 
 static TimeMarker *rna_TimeLine_add(Scene *scene, const char name[])
 {
@@ -2103,6 +2110,13 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
 	RNA_def_property_range(prop, 8, 32);
 	RNA_def_property_ui_text(prop, "Bits", "Display bit depth of full screen display");
 	RNA_def_property_update(prop, NC_SCENE, NULL);
+
+	prop= RNA_def_property(srna, "exit_key", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_sdna(prop, NULL, "exitkey");
+	RNA_def_property_enum_items(prop, event_type_items);
+	RNA_def_property_enum_funcs(prop, NULL, "rna_GameSettings_exit_key_set", NULL);
+	RNA_def_property_ui_text(prop, "Exit Key",  "Sets the key that exits the Game Engine");
+	RNA_def_property_update(prop, NC_SCENE, NULL);
 	
 	// Do we need it here ? (since we already have it in World
 	prop= RNA_def_property(srna, "frequency", PROP_INT, PROP_NONE);
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 360a082b03b302e470aaaa4f7b457634410477a4..445f2b8f0ba8f6ef1d9558fa8195fa42d7b18e20 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -241,6 +241,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
 		ketsjiengine->SetUseFixedTime(usefixed);
 		ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
 		ketsjiengine->SetRestrictAnimationFPS(restrictAnimFPS);
+		KX_KetsjiEngine::SetExitKey(ConvertKeyCode(startscene->gm.exitkey));
 
 		//set the global settings (carried over if restart/load new files)
 		ketsjiengine->SetGlobalSettings(&gs);
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
index 1c91f498d32d390f65a31788f1e8c1115489ece6..93bf133635d26cd298fc7457f74603ee5b8dbc1b 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
@@ -41,6 +41,7 @@
 #include "wm_event_types.h"
 #include "WM_types.h"
 #include "SCA_IInputDevice.h"
+#include "BL_BlenderDataConversion.h"
 
 #ifdef WITH_CXX_GUARDEDALLOC
 #include "MEM_guardedalloc.h"
@@ -51,172 +52,9 @@
 */
 class BL_BlenderInputDevice : public SCA_IInputDevice
 {
-	// this map is Blender specific: a conversion between blender and ketsji enums
-	std::map<int,KX_EnumInputs> m_reverseKeyTranslateTable;
 public:
 	BL_BlenderInputDevice()
 	{
-
-		/* The reverse table. In order to not confuse ourselves, we      */
-		/* immediately convert all events that come in to KX codes.      */
-		m_reverseKeyTranslateTable[LEFTMOUSE			] =	KX_LEFTMOUSE;
-		m_reverseKeyTranslateTable[MIDDLEMOUSE			] =	KX_MIDDLEMOUSE;
-		m_reverseKeyTranslateTable[RIGHTMOUSE			] =	KX_RIGHTMOUSE;
-		m_reverseKeyTranslateTable[WHEELUPMOUSE			] =	KX_WHEELUPMOUSE;
-		m_reverseKeyTranslateTable[WHEELDOWNMOUSE		] =	KX_WHEELDOWNMOUSE;
-		m_reverseKeyTranslateTable[MOUSEX			] =	KX_MOUSEX;
-		m_reverseKeyTranslateTable[MOUSEY			] =	KX_MOUSEY;
-
-		// TIMERS
-
-		m_reverseKeyTranslateTable[TIMER0                           ] =	KX_TIMER0;
-		m_reverseKeyTranslateTable[TIMER1                           ] =	KX_TIMER1;
-		m_reverseKeyTranslateTable[TIMER2                           ] = KX_TIMER2;
-
-		// SYSTEM
-#if 0
-		/* **** XXX **** */
-		m_reverseKeyTranslateTable[KEYBD                            ] = KX_KEYBD;
-		m_reverseKeyTranslateTable[RAWKEYBD                         ] = KX_RAWKEYBD;
-		m_reverseKeyTranslateTable[REDRAW                           ] = KX_REDRAW;
-		m_reverseKeyTranslateTable[INPUTCHANGE                      ] = KX_INPUTCHANGE;
-		m_reverseKeyTranslateTable[QFULL                            ] = KX_QFULL;
-		m_reverseKeyTranslateTable[WINFREEZE                        ] = KX_WINFREEZE;
-		m_reverseKeyTranslateTable[WINTHAW                          ] = KX_WINTHAW;
-		m_reverseKeyTranslateTable[WINCLOSE                         ] = KX_WINCLOSE;
-		m_reverseKeyTranslateTable[WINQUIT                          ] = KX_WINQUIT;
-		m_reverseKeyTranslateTable[Q_FIRSTTIME                      ] = KX_Q_FIRSTTIME;
-		/* **** XXX **** */
-#endif
-		// standard keyboard
-
-		m_reverseKeyTranslateTable[AKEY                             ] = KX_AKEY;
-		m_reverseKeyTranslateTable[BKEY                             ] = KX_BKEY;
-		m_reverseKeyTranslateTable[CKEY                             ] = KX_CKEY;
-		m_reverseKeyTranslateTable[DKEY                             ] = KX_DKEY;
-		m_reverseKeyTranslateTable[EKEY                             ] = KX_EKEY;
-		m_reverseKeyTranslateTable[FKEY                             ] = KX_FKEY;
-		m_reverseKeyTranslateTable[GKEY                             ] = KX_GKEY;
-		//XXX clean up
-#ifdef WIN32
-#define HKEY	'h'
-#endif
-		m_reverseKeyTranslateTable[HKEY                             ] = KX_HKEY;
-		//XXX clean up
-#ifdef WIN32
-#undef HKEY
-#endif
-		m_reverseKeyTranslateTable[IKEY                             ] = KX_IKEY;
-		m_reverseKeyTranslateTable[JKEY                             ] = KX_JKEY;
-		m_reverseKeyTranslateTable[KKEY                             ] = KX_KKEY;
-		m_reverseKeyTranslateTable[LKEY                             ] = KX_LKEY;
-		m_reverseKeyTranslateTable[MKEY                             ] = KX_MKEY;
-		m_reverseKeyTranslateTable[NKEY                             ] = KX_NKEY;
-		m_reverseKeyTranslateTable[OKEY                             ] = KX_OKEY;
-		m_reverseKeyTranslateTable[PKEY                             ] = KX_PKEY;
-		m_reverseKeyTranslateTable[QKEY                             ] = KX_QKEY;
-		m_reverseKeyTranslateTable[RKEY                             ] = KX_RKEY;
-		m_reverseKeyTranslateTable[SKEY                             ] = KX_SKEY;
-		m_reverseKeyTranslateTable[TKEY                             ] =	KX_TKEY;
-		m_reverseKeyTranslateTable[UKEY                             ] = KX_UKEY;
-		m_reverseKeyTranslateTable[VKEY                             ] = KX_VKEY;
-		m_reverseKeyTranslateTable[WKEY                             ] = KX_WKEY;
-		m_reverseKeyTranslateTable[XKEY                             ] = KX_XKEY;
-		m_reverseKeyTranslateTable[YKEY                             ] = KX_YKEY;
-		m_reverseKeyTranslateTable[ZKEY                             ] = KX_ZKEY;
-
-		m_reverseKeyTranslateTable[ZEROKEY		                ] = KX_ZEROKEY;
-		m_reverseKeyTranslateTable[ONEKEY		                ] = KX_ONEKEY;
-		m_reverseKeyTranslateTable[TWOKEY		                ] = KX_TWOKEY;
-		m_reverseKeyTranslateTable[THREEKEY                     ] = KX_THREEKEY;
-		m_reverseKeyTranslateTable[FOURKEY		                ] = KX_FOURKEY;
-		m_reverseKeyTranslateTable[FIVEKEY		                ] = KX_FIVEKEY;
-		m_reverseKeyTranslateTable[SIXKEY		                ] = KX_SIXKEY;
-		m_reverseKeyTranslateTable[SEVENKEY                         ] = KX_SEVENKEY;
-		m_reverseKeyTranslateTable[EIGHTKEY                         ] = KX_EIGHTKEY;
-		m_reverseKeyTranslateTable[NINEKEY		                ] = KX_NINEKEY;
-
-		m_reverseKeyTranslateTable[CAPSLOCKKEY                      ] = KX_CAPSLOCKKEY;
-
-		m_reverseKeyTranslateTable[LEFTCTRLKEY	                ] = KX_LEFTCTRLKEY;
-		m_reverseKeyTranslateTable[LEFTALTKEY 		        ] = KX_LEFTALTKEY;
-		m_reverseKeyTranslateTable[RIGHTALTKEY 	                ] = KX_RIGHTALTKEY;
-		m_reverseKeyTranslateTable[RIGHTCTRLKEY 	                ] = KX_RIGHTCTRLKEY;
-		m_reverseKeyTranslateTable[RIGHTSHIFTKEY	                ] = KX_RIGHTSHIFTKEY;
-		m_reverseKeyTranslateTable[LEFTSHIFTKEY                     ] = KX_LEFTSHIFTKEY;
-
-		m_reverseKeyTranslateTable[ESCKEY                           ] = KX_ESCKEY;
-		m_reverseKeyTranslateTable[TABKEY                           ] = KX_TABKEY;
-		m_reverseKeyTranslateTable[RETKEY                           ] = KX_RETKEY;
-		m_reverseKeyTranslateTable[SPACEKEY                         ] = KX_SPACEKEY;
-		m_reverseKeyTranslateTable[LINEFEEDKEY		        ] = KX_LINEFEEDKEY;
-		m_reverseKeyTranslateTable[BACKSPACEKEY                     ] = KX_BACKSPACEKEY;
-		m_reverseKeyTranslateTable[DELKEY                           ] = KX_DELKEY;
-		m_reverseKeyTranslateTable[SEMICOLONKEY                     ] = KX_SEMICOLONKEY;
-		m_reverseKeyTranslateTable[PERIODKEY		        ] = KX_PERIODKEY;
-		m_reverseKeyTranslateTable[COMMAKEY		                ] = KX_COMMAKEY;
-		m_reverseKeyTranslateTable[QUOTEKEY		                ] = KX_QUOTEKEY;
-		m_reverseKeyTranslateTable[ACCENTGRAVEKEY	                ] = KX_ACCENTGRAVEKEY;
-		m_reverseKeyTranslateTable[MINUSKEY		                ] = KX_MINUSKEY;
-		m_reverseKeyTranslateTable[SLASHKEY		                ] = KX_SLASHKEY;
-		m_reverseKeyTranslateTable[BACKSLASHKEY                     ] = KX_BACKSLASHKEY;
-		m_reverseKeyTranslateTable[EQUALKEY		                ] = KX_EQUALKEY;
-		m_reverseKeyTranslateTable[LEFTBRACKETKEY	                ] = KX_LEFTBRACKETKEY;
-		m_reverseKeyTranslateTable[RIGHTBRACKETKEY	                ] = KX_RIGHTBRACKETKEY;
-
-		m_reverseKeyTranslateTable[LEFTARROWKEY                     ] = KX_LEFTARROWKEY;
-		m_reverseKeyTranslateTable[DOWNARROWKEY                     ] = KX_DOWNARROWKEY;
-		m_reverseKeyTranslateTable[RIGHTARROWKEY	                ] = KX_RIGHTARROWKEY;
-		m_reverseKeyTranslateTable[UPARROWKEY		        ] = KX_UPARROWKEY;
-
-		m_reverseKeyTranslateTable[PAD2	                        ] = KX_PAD2;
-		m_reverseKeyTranslateTable[PAD4	                        ] = KX_PAD4;
-		m_reverseKeyTranslateTable[PAD6	                        ] = KX_PAD6;
-		m_reverseKeyTranslateTable[PAD8	                        ] = KX_PAD8;
-
-		m_reverseKeyTranslateTable[PAD1	                        ] = KX_PAD1;
-		m_reverseKeyTranslateTable[PAD3	                        ] = KX_PAD3;
-		m_reverseKeyTranslateTable[PAD5	                        ] = KX_PAD5;
-		m_reverseKeyTranslateTable[PAD7	                        ] = KX_PAD7;
-		m_reverseKeyTranslateTable[PAD9	                        ] = KX_PAD9;
-
-		m_reverseKeyTranslateTable[PADPERIOD                        ] = KX_PADPERIOD;
-		m_reverseKeyTranslateTable[PADSLASHKEY                    ] = KX_PADSLASHKEY;
-		m_reverseKeyTranslateTable[PADASTERKEY                      ] = KX_PADASTERKEY;
-
-
-		m_reverseKeyTranslateTable[PAD0	                        ] = KX_PAD0;
-		m_reverseKeyTranslateTable[PADMINUS                         ] = KX_PADMINUS;
-		m_reverseKeyTranslateTable[PADENTER                         ] = KX_PADENTER;
-		m_reverseKeyTranslateTable[PADPLUSKEY                       ] = KX_PADPLUSKEY;
-
-
-		m_reverseKeyTranslateTable[F1KEY                            ] = KX_F1KEY;
-		m_reverseKeyTranslateTable[F2KEY                            ] = KX_F2KEY;
-		m_reverseKeyTranslateTable[F3KEY                            ] = KX_F3KEY;
-		m_reverseKeyTranslateTable[F4KEY                            ] = KX_F4KEY;
-		m_reverseKeyTranslateTable[F5KEY                            ] = KX_F5KEY;
-		m_reverseKeyTranslateTable[F6KEY                            ] = KX_F6KEY;
-		m_reverseKeyTranslateTable[F7KEY                            ] = KX_F7KEY;
-		m_reverseKeyTranslateTable[F8KEY                            ] = KX_F8KEY;
-		m_reverseKeyTranslateTable[F9KEY                            ] = KX_F9KEY;
-		m_reverseKeyTranslateTable[F10KEY                           ] = KX_F10KEY;
-		m_reverseKeyTranslateTable[F11KEY      ] = KX_F11KEY;
-		m_reverseKeyTranslateTable[F12KEY      ] = KX_F12KEY;
-		m_reverseKeyTranslateTable[F13KEY      ] = KX_F13KEY;
-		m_reverseKeyTranslateTable[F14KEY      ] = KX_F14KEY;
-		m_reverseKeyTranslateTable[F15KEY      ] = KX_F15KEY;
-		m_reverseKeyTranslateTable[F16KEY      ] = KX_F16KEY;
-		m_reverseKeyTranslateTable[F17KEY      ] = KX_F17KEY;
-		m_reverseKeyTranslateTable[F18KEY      ] = KX_F18KEY;
-		m_reverseKeyTranslateTable[F19KEY      ] = KX_F19KEY;
-
-		m_reverseKeyTranslateTable[PAUSEKEY    ] = KX_PAUSEKEY;
-		m_reverseKeyTranslateTable[INSERTKEY   ] = KX_INSERTKEY;
-		m_reverseKeyTranslateTable[HOMEKEY     ] = KX_HOMEKEY;
-		m_reverseKeyTranslateTable[PAGEUPKEY   ] = KX_PAGEUPKEY;
-		m_reverseKeyTranslateTable[PAGEDOWNKEY ] = KX_PAGEDOWNKEY;
-		m_reverseKeyTranslateTable[ENDKEY      ] = KX_ENDKEY;
 	}
 
 	virtual ~BL_BlenderInputDevice()
@@ -225,7 +63,7 @@ public:
 	}
 
 	KX_EnumInputs ToNative(unsigned short incode) {
-		return m_reverseKeyTranslateTable[incode];
+		 return ConvertKeyCode(incode);
 	}
 
 	virtual bool	IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode)=0;
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
index a6712c531fb8e420c9b0471f7856e41859d06c26..54c60096812c33387051117ad1950ceb2e45b2d6 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
@@ -36,6 +36,7 @@
 #endif 
 
 #include "KX_BlenderKeyboardDevice.h"
+#include "KX_KetsjiEngine.h"
 
 KX_BlenderKeyboardDevice::KX_BlenderKeyboardDevice()
 	: m_hookesc(false)
@@ -106,7 +107,7 @@ bool	KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode,short v
 
 		if (val == KM_PRESS)
 		{
-			if (kxevent == KX_ESCKEY && val != 0 && !m_hookesc)
+			if (kxevent == KX_KetsjiEngine::GetExitKey() && val != 0 && !m_hookesc)
 				result = true;
 			if (kxevent == KX_PAUSEKEY && val && (IsPressed(KX_LEFTCTRLKEY) || IsPressed(KX_RIGHTCTRLKEY)))
 				result = true;
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
index 63a01db2fe0959b6d0024d5477f7f4691aeb165d..3039e69efcdd36894bf50e9173100e91155616c8 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
@@ -50,6 +50,8 @@ public:
 	virtual bool	ConvertBlenderEvent(unsigned short incode,short val);
 	virtual void	NextFrame();
 	virtual void	HookEscape();
+private:
+	short		m_exit_key;
 
 
 #ifdef WITH_CXX_GUARDEDALLOC
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 57611d65e146a7c0f167bff18692105f83df8f6e..ff4b9ba9c963507de5b02c536cb8f2fc50cd464f 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -197,6 +197,180 @@ extern "C" {
 
 static bool default_light_mode = 0;
 
+static std::map<int, SCA_IInputDevice::KX_EnumInputs> create_translate_table()
+{
+	std::map<int, SCA_IInputDevice::KX_EnumInputs> m;
+		
+	/* The reverse table. In order to not confuse ourselves, we      */
+	/* immediately convert all events that come in to KX codes.      */
+	m[LEFTMOUSE			] =	SCA_IInputDevice::KX_LEFTMOUSE;
+	m[MIDDLEMOUSE		] =	SCA_IInputDevice::KX_MIDDLEMOUSE;
+	m[RIGHTMOUSE		] =	SCA_IInputDevice::KX_RIGHTMOUSE;
+	m[WHEELUPMOUSE		] =	SCA_IInputDevice::KX_WHEELUPMOUSE;
+	m[WHEELDOWNMOUSE	] =	SCA_IInputDevice::KX_WHEELDOWNMOUSE;
+	m[MOUSEX			] = SCA_IInputDevice::KX_MOUSEX;
+	m[MOUSEY			] =	SCA_IInputDevice::KX_MOUSEY;
+		
+	// TIMERS                                                                                                  
+		
+	m[TIMER0			] = SCA_IInputDevice::KX_TIMER0;                  
+	m[TIMER1			] = SCA_IInputDevice::KX_TIMER1;                  
+	m[TIMER2			] = SCA_IInputDevice::KX_TIMER2;                  
+		
+	// SYSTEM                                                                                                  
+		
+#if 0			
+	/* **** XXX **** */
+	m[KEYBD				] = SCA_IInputDevice::KX_KEYBD;                  
+	m[RAWKEYBD			] = SCA_IInputDevice::KX_RAWKEYBD;                  
+	m[REDRAW			] = SCA_IInputDevice::KX_REDRAW;                  
+	m[INPUTCHANGE		] = SCA_IInputDevice::KX_INPUTCHANGE;                  
+	m[QFULL				] = SCA_IInputDevice::KX_QFULL;                  
+	m[WINFREEZE			] = SCA_IInputDevice::KX_WINFREEZE;                  
+	m[WINTHAW			] = SCA_IInputDevice::KX_WINTHAW;                  
+	m[WINCLOSE			] = SCA_IInputDevice::KX_WINCLOSE;                  
+	m[WINQUIT			] = SCA_IInputDevice::KX_WINQUIT;                  
+	m[Q_FIRSTTIME		] = SCA_IInputDevice::KX_Q_FIRSTTIME;                  
+	/* **** XXX **** */
+#endif	
+		
+	// standard keyboard                                                                                       
+		
+	m[AKEY				] = SCA_IInputDevice::KX_AKEY;                  
+	m[BKEY				] = SCA_IInputDevice::KX_BKEY;                  
+	m[CKEY				] = SCA_IInputDevice::KX_CKEY;                  
+	m[DKEY				] = SCA_IInputDevice::KX_DKEY;                  
+	m[EKEY				] = SCA_IInputDevice::KX_EKEY;                  
+	m[FKEY				] = SCA_IInputDevice::KX_FKEY;                  
+	m[GKEY				] = SCA_IInputDevice::KX_GKEY;                  
+
+//XXX clean up
+#ifdef WIN32
+#define HKEY	'h'
+#endif
+	m[HKEY				] = SCA_IInputDevice::KX_HKEY;                  
+//XXX clean up
+#ifdef WIN32
+#undef HKEY
+#endif
+
+	m[IKEY				] = SCA_IInputDevice::KX_IKEY;                  
+	m[JKEY				] = SCA_IInputDevice::KX_JKEY;                  
+	m[KKEY				] = SCA_IInputDevice::KX_KKEY;                  
+	m[LKEY				] = SCA_IInputDevice::KX_LKEY;                  
+	m[MKEY				] = SCA_IInputDevice::KX_MKEY;                  
+	m[NKEY				] = SCA_IInputDevice::KX_NKEY;                  
+	m[OKEY				] = SCA_IInputDevice::KX_OKEY;                  
+	m[PKEY				] = SCA_IInputDevice::KX_PKEY;                  
+	m[QKEY				] = SCA_IInputDevice::KX_QKEY;                  
+	m[RKEY				] = SCA_IInputDevice::KX_RKEY;                  
+	m[SKEY				] = SCA_IInputDevice::KX_SKEY;                  
+	m[TKEY				] = SCA_IInputDevice::KX_TKEY;                  
+	m[UKEY				] = SCA_IInputDevice::KX_UKEY;                  
+	m[VKEY				] = SCA_IInputDevice::KX_VKEY;                  
+	m[WKEY				] = SCA_IInputDevice::KX_WKEY;                  
+	m[XKEY				] = SCA_IInputDevice::KX_XKEY;                  
+	m[YKEY				] = SCA_IInputDevice::KX_YKEY;                  
+	m[ZKEY				] = SCA_IInputDevice::KX_ZKEY;                  
+		
+	m[ZEROKEY			] = SCA_IInputDevice::KX_ZEROKEY;                  
+	m[ONEKEY			] = SCA_IInputDevice::KX_ONEKEY;                  
+	m[TWOKEY			] = SCA_IInputDevice::KX_TWOKEY;                  
+	m[THREEKEY			] = SCA_IInputDevice::KX_THREEKEY;                  
+	m[FOURKEY			] = SCA_IInputDevice::KX_FOURKEY;                  
+	m[FIVEKEY			] = SCA_IInputDevice::KX_FIVEKEY;                  
+	m[SIXKEY			] = SCA_IInputDevice::KX_SIXKEY;                  
+	m[SEVENKEY			] = SCA_IInputDevice::KX_SEVENKEY;                  
+	m[EIGHTKEY			] = SCA_IInputDevice::KX_EIGHTKEY;                  
+	m[NINEKEY			] = SCA_IInputDevice::KX_NINEKEY;                  
+		
+	m[CAPSLOCKKEY		] = SCA_IInputDevice::KX_CAPSLOCKKEY;                  
+		
+	m[LEFTCTRLKEY		] = SCA_IInputDevice::KX_LEFTCTRLKEY;                  
+	m[LEFTALTKEY		] = SCA_IInputDevice::KX_LEFTALTKEY;                  
+	m[RIGHTALTKEY		] = SCA_IInputDevice::KX_RIGHTALTKEY;                  
+	m[RIGHTCTRLKEY		] = SCA_IInputDevice::KX_RIGHTCTRLKEY;                  
+	m[RIGHTSHIFTKEY		] = SCA_IInputDevice::KX_RIGHTSHIFTKEY;                  
+	m[LEFTSHIFTKEY		] = SCA_IInputDevice::KX_LEFTSHIFTKEY;                  
+		
+	m[ESCKEY			] = SCA_IInputDevice::KX_ESCKEY;                  
+	m[TABKEY			] = SCA_IInputDevice::KX_TABKEY;                  
+	m[RETKEY			] = SCA_IInputDevice::KX_RETKEY;                  
+	m[SPACEKEY			] = SCA_IInputDevice::KX_SPACEKEY;                  
+	m[LINEFEEDKEY		] = SCA_IInputDevice::KX_LINEFEEDKEY;                  
+	m[BACKSPACEKEY		] = SCA_IInputDevice::KX_BACKSPACEKEY;                  
+	m[DELKEY			] = SCA_IInputDevice::KX_DELKEY;                  
+	m[SEMICOLONKEY		] = SCA_IInputDevice::KX_SEMICOLONKEY;                  
+	m[PERIODKEY			] = SCA_IInputDevice::KX_PERIODKEY;                  
+	m[COMMAKEY			] = SCA_IInputDevice::KX_COMMAKEY;                  
+	m[QUOTEKEY			] = SCA_IInputDevice::KX_QUOTEKEY;                  
+	m[ACCENTGRAVEKEY	] = SCA_IInputDevice::KX_ACCENTGRAVEKEY;                  
+	m[MINUSKEY			] = SCA_IInputDevice::KX_MINUSKEY;                  
+	m[SLASHKEY			] = SCA_IInputDevice::KX_SLASHKEY;                  
+	m[BACKSLASHKEY		] = SCA_IInputDevice::KX_BACKSLASHKEY;                  
+	m[EQUALKEY			] = SCA_IInputDevice::KX_EQUALKEY;                  
+	m[LEFTBRACKETKEY	] = SCA_IInputDevice::KX_LEFTBRACKETKEY;                  
+	m[RIGHTBRACKETKEY	] = SCA_IInputDevice::KX_RIGHTBRACKETKEY;                  
+		
+	m[LEFTARROWKEY		] = SCA_IInputDevice::KX_LEFTARROWKEY;                  
+	m[DOWNARROWKEY		] = SCA_IInputDevice::KX_DOWNARROWKEY;                  
+	m[RIGHTARROWKEY		] = SCA_IInputDevice::KX_RIGHTARROWKEY;                  
+	m[UPARROWKEY		] = SCA_IInputDevice::KX_UPARROWKEY;                  
+		
+	m[PAD2				] = SCA_IInputDevice::KX_PAD2;                  
+	m[PAD4				] = SCA_IInputDevice::KX_PAD4;                  
+	m[PAD6				] = SCA_IInputDevice::KX_PAD6;                  
+	m[PAD8				] = SCA_IInputDevice::KX_PAD8;                  
+		
+	m[PAD1				] = SCA_IInputDevice::KX_PAD1;                  
+	m[PAD3				] = SCA_IInputDevice::KX_PAD3;                  
+	m[PAD5				] = SCA_IInputDevice::KX_PAD5;                  
+	m[PAD7				] = SCA_IInputDevice::KX_PAD7;                  
+	m[PAD9				] = SCA_IInputDevice::KX_PAD9;                  
+		
+	m[PADPERIOD			] = SCA_IInputDevice::KX_PADPERIOD;                  
+	m[PADSLASHKEY		] = SCA_IInputDevice::KX_PADSLASHKEY;                  
+	m[PADASTERKEY		] = SCA_IInputDevice::KX_PADASTERKEY;                  
+		
+	m[PAD0				] = SCA_IInputDevice::KX_PAD0;                  
+	m[PADMINUS			] = SCA_IInputDevice::KX_PADMINUS;                  
+	m[PADENTER			] = SCA_IInputDevice::KX_PADENTER;                  
+	m[PADPLUSKEY		] = SCA_IInputDevice::KX_PADPLUSKEY;                  
+		
+		
+	m[F1KEY				] = SCA_IInputDevice::KX_F1KEY;                  
+	m[F2KEY				] = SCA_IInputDevice::KX_F2KEY;                  
+	m[F3KEY				] = SCA_IInputDevice::KX_F3KEY;                  
+	m[F4KEY				] = SCA_IInputDevice::KX_F4KEY;                  
+	m[F5KEY				] = SCA_IInputDevice::KX_F5KEY;                  
+	m[F6KEY				] = SCA_IInputDevice::KX_F6KEY;                  
+	m[F7KEY				] = SCA_IInputDevice::KX_F7KEY;                  
+	m[F8KEY				] = SCA_IInputDevice::KX_F8KEY;                  
+	m[F9KEY				] = SCA_IInputDevice::KX_F9KEY;                  
+	m[F10KEY			] = SCA_IInputDevice::KX_F10KEY;                  
+	m[F11KEY			] = SCA_IInputDevice::KX_F11KEY;                  
+	m[F12KEY			] = SCA_IInputDevice::KX_F12KEY;
+	m[F13KEY			] = SCA_IInputDevice::KX_F13KEY;
+	m[F14KEY			] = SCA_IInputDevice::KX_F14KEY;
+	m[F15KEY			] = SCA_IInputDevice::KX_F15KEY;
+	m[F16KEY			] = SCA_IInputDevice::KX_F16KEY;
+	m[F17KEY			] = SCA_IInputDevice::KX_F17KEY;
+	m[F18KEY			] = SCA_IInputDevice::KX_F18KEY;
+	m[F19KEY			] = SCA_IInputDevice::KX_F19KEY;
+		
+		
+	m[PAUSEKEY			] = SCA_IInputDevice::KX_PAUSEKEY;                  
+	m[INSERTKEY			] = SCA_IInputDevice::KX_INSERTKEY;                  
+	m[HOMEKEY			] = SCA_IInputDevice::KX_HOMEKEY;                  
+	m[PAGEUPKEY			] = SCA_IInputDevice::KX_PAGEUPKEY;                  
+	m[PAGEDOWNKEY		] = SCA_IInputDevice::KX_PAGEDOWNKEY;                  
+	m[ENDKEY			] = SCA_IInputDevice::KX_ENDKEY;
+
+	return m;
+}
+
+static std::map<int, SCA_IInputDevice::KX_EnumInputs> gReverseKeyTranslateTable = create_translate_table();
+
 static unsigned int KX_rgbaint2uint_new(unsigned int icol)
 {
 	union
@@ -2854,3 +3028,8 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
 	RAS_BucketManager *bucketmanager = kxscene->GetBucketManager();
 	bucketmanager->OptimizeBuckets(distance);
 }
+
+SCA_IInputDevice::KX_EnumInputs ConvertKeyCode(int key_code)
+{
+	return gReverseKeyTranslateTable[key_code];
+}
\ No newline at end of file
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.h b/source/gameengine/Converter/BL_BlenderDataConversion.h
index 2ae7fee1798209bf73a2951dfedc2fbb8428a60a..6da3ac90aef5ff9312822af15ae298321362b5a8 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.h
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.h
@@ -36,6 +36,7 @@
 #include "STR_String.h"
 #include "KX_Python.h"
 #include "KX_PhysicsEngineEnums.h"
+#include "SCA_IInputDevice.h"
 
 class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class KX_Scene* scene, class KX_BlenderSceneConverter *converter);
 
@@ -49,5 +50,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
 							  bool alwaysUseExpandFraming
 							  );
 
+SCA_IInputDevice::KX_EnumInputs ConvertKeyCode(int key_code);
+
 #endif // __BLENDER_CONVERT
 
diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp
index b7aee8ec92404d3de288080e5db0c9690bd890b8..9391d12a3ce22c693f3276461aaab31ae6300200 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.cpp
+++ b/source/gameengine/Converter/KX_ConvertSensors.cpp
@@ -86,10 +86,7 @@ probably misplaced */
 
 #include "KX_KetsjiEngine.h"
 #include "KX_BlenderSceneConverter.h"
-
-// this map is Blender specific: a conversion between blender and ketsji enums
-std::map<int,SCA_IInputDevice::KX_EnumInputs> gReverseKeyTranslateTable;
-
+#include "BL_BlenderDataConversion.h"
 
 void BL_ConvertSensors(struct Object* blenderobject,
 					   class KX_GameObject* gameobj,
@@ -102,177 +99,6 @@ void BL_ConvertSensors(struct Object* blenderobject,
 					   KX_BlenderSceneConverter* converter
 					   )
 {
-	static bool reverseTableConverted = false;	
-	
-	if (!reverseTableConverted)
-	{
-		reverseTableConverted = true;
-		
-		/* The reverse table. In order to not confuse ourselves, we      */
-		/* immediately convert all events that come in to KX codes.      */
-		gReverseKeyTranslateTable[LEFTMOUSE			] =	SCA_IInputDevice::KX_LEFTMOUSE;
-		gReverseKeyTranslateTable[MIDDLEMOUSE		] =	SCA_IInputDevice::KX_MIDDLEMOUSE;
-		gReverseKeyTranslateTable[RIGHTMOUSE		] =	SCA_IInputDevice::KX_RIGHTMOUSE;
-		gReverseKeyTranslateTable[WHEELUPMOUSE		] =	SCA_IInputDevice::KX_WHEELUPMOUSE;
-		gReverseKeyTranslateTable[WHEELDOWNMOUSE	] =	SCA_IInputDevice::KX_WHEELDOWNMOUSE;
-		gReverseKeyTranslateTable[MOUSEX			] = SCA_IInputDevice::KX_MOUSEX;
-		gReverseKeyTranslateTable[MOUSEY			] =	SCA_IInputDevice::KX_MOUSEY;
-		
-		// TIMERS                                                                                                  
-		
-		gReverseKeyTranslateTable[TIMER0			] = SCA_IInputDevice::KX_TIMER0;                  
-		gReverseKeyTranslateTable[TIMER1			] = SCA_IInputDevice::KX_TIMER1;                  
-		gReverseKeyTranslateTable[TIMER2			] = SCA_IInputDevice::KX_TIMER2;                  
-		
-		// SYSTEM                                                                                                  
-		
-#if 0			
-		/* **** XXX **** */
-		gReverseKeyTranslateTable[KEYBD				] = SCA_IInputDevice::KX_KEYBD;                  
-		gReverseKeyTranslateTable[RAWKEYBD			] = SCA_IInputDevice::KX_RAWKEYBD;                  
-		gReverseKeyTranslateTable[REDRAW			] = SCA_IInputDevice::KX_REDRAW;                  
-		gReverseKeyTranslateTable[INPUTCHANGE		] = SCA_IInputDevice::KX_INPUTCHANGE;                  
-		gReverseKeyTranslateTable[QFULL				] = SCA_IInputDevice::KX_QFULL;                  
-		gReverseKeyTranslateTable[WINFREEZE			] = SCA_IInputDevice::KX_WINFREEZE;                  
-		gReverseKeyTranslateTable[WINTHAW			] = SCA_IInputDevice::KX_WINTHAW;                  
-		gReverseKeyTranslateTable[WINCLOSE			] = SCA_IInputDevice::KX_WINCLOSE;                  
-		gReverseKeyTranslateTable[WINQUIT			] = SCA_IInputDevice::KX_WINQUIT;                  
-		gReverseKeyTranslateTable[Q_FIRSTTIME		] = SCA_IInputDevice::KX_Q_FIRSTTIME;                  
-		/* **** XXX **** */
-#endif	
-		
-		// standard keyboard                                                                                       
-		
-		gReverseKeyTranslateTable[AKEY				] = SCA_IInputDevice::KX_AKEY;                  
-		gReverseKeyTranslateTable[BKEY				] = SCA_IInputDevice::KX_BKEY;                  
-		gReverseKeyTranslateTable[CKEY				] = SCA_IInputDevice::KX_CKEY;                  
-		gReverseKeyTranslateTable[DKEY				] = SCA_IInputDevice::KX_DKEY;                  
-		gReverseKeyTranslateTable[EKEY				] = SCA_IInputDevice::KX_EKEY;                  
-		gReverseKeyTranslateTable[FKEY				] = SCA_IInputDevice::KX_FKEY;                  
-		gReverseKeyTranslateTable[GKEY				] = SCA_IInputDevice::KX_GKEY;                  
-
-//XXX clean up
-#ifdef WIN32
-#define HKEY	'h'
-#endif
-		gReverseKeyTranslateTable[HKEY				] = SCA_IInputDevice::KX_HKEY;                  
-//XXX clean up
-#ifdef WIN32
-#undef HKEY
-#endif
-
-		gReverseKeyTranslateTable[IKEY				] = SCA_IInputDevice::KX_IKEY;                  
-		gReverseKeyTranslateTable[JKEY				] = SCA_IInputDevice::KX_JKEY;                  
-		gReverseKeyTranslateTable[KKEY				] = SCA_IInputDevice::KX_KKEY;                  
-		gReverseKeyTranslateTable[LKEY				] = SCA_IInputDevice::KX_LKEY;                  
-		gReverseKeyTranslateTable[MKEY				] = SCA_IInputDevice::KX_MKEY;                  
-		gReverseKeyTranslateTable[NKEY				] = SCA_IInputDevice::KX_NKEY;                  
-		gReverseKeyTranslateTable[OKEY				] = SCA_IInputDevice::KX_OKEY;                  
-		gReverseKeyTranslateTable[PKEY				] = SCA_IInputDevice::KX_PKEY;                  
-		gReverseKeyTranslateTable[QKEY				] = SCA_IInputDevice::KX_QKEY;                  
-		gReverseKeyTranslateTable[RKEY				] = SCA_IInputDevice::KX_RKEY;                  
-		gReverseKeyTranslateTable[SKEY				] = SCA_IInputDevice::KX_SKEY;                  
-		gReverseKeyTranslateTable[TKEY				] = SCA_IInputDevice::KX_TKEY;                  
-		gReverseKeyTranslateTable[UKEY				] = SCA_IInputDevice::KX_UKEY;                  
-		gReverseKeyTranslateTable[VKEY				] = SCA_IInputDevice::KX_VKEY;                  
-		gReverseKeyTranslateTable[WKEY				] = SCA_IInputDevice::KX_WKEY;                  
-		gReverseKeyTranslateTable[XKEY				] = SCA_IInputDevice::KX_XKEY;                  
-		gReverseKeyTranslateTable[YKEY				] = SCA_IInputDevice::KX_YKEY;                  
-		gReverseKeyTranslateTable[ZKEY				] = SCA_IInputDevice::KX_ZKEY;                  
-		
-		gReverseKeyTranslateTable[ZEROKEY			] = SCA_IInputDevice::KX_ZEROKEY;                  
-		gReverseKeyTranslateTable[ONEKEY			] = SCA_IInputDevice::KX_ONEKEY;                  
-		gReverseKeyTranslateTable[TWOKEY			] = SCA_IInputDevice::KX_TWOKEY;                  
-		gReverseKeyTranslateTable[THREEKEY			] = SCA_IInputDevice::KX_THREEKEY;                  
-		gReverseKeyTranslateTable[FOURKEY			] = SCA_IInputDevice::KX_FOURKEY;                  
-		gReverseKeyTranslateTable[FIVEKEY			] = SCA_IInputDevice::KX_FIVEKEY;                  
-		gReverseKeyTranslateTable[SIXKEY			] = SCA_IInputDevice::KX_SIXKEY;                  
-		gReverseKeyTranslateTable[SEVENKEY			] = SCA_IInputDevice::KX_SEVENKEY;                  
-		gReverseKeyTranslateTable[EIGHTKEY			] = SCA_IInputDevice::KX_EIGHTKEY;                  
-		gReverseKeyTranslateTable[NINEKEY			] = SCA_IInputDevice::KX_NINEKEY;                  
-		
-		gReverseKeyTranslateTable[CAPSLOCKKEY		] = SCA_IInputDevice::KX_CAPSLOCKKEY;                  
-		
-		gReverseKeyTranslateTable[LEFTCTRLKEY		] = SCA_IInputDevice::KX_LEFTCTRLKEY;                  
-		gReverseKeyTranslateTable[LEFTALTKEY		] = SCA_IInputDevice::KX_LEFTALTKEY;                  
-		gReverseKeyTranslateTable[RIGHTALTKEY		] = SCA_IInputDevice::KX_RIGHTALTKEY;                  
-		gReverseKeyTranslateTable[RIGHTCTRLKEY		] = SCA_IInputDevice::KX_RIGHTCTRLKEY;                  
-		gReverseKeyTranslateTable[RIGHTSHIFTKEY		] = SCA_IInputDevice::KX_RIGHTSHIFTKEY;                  
-		gReverseKeyTranslateTable[LEFTSHIFTKEY		] = SCA_IInputDevice::KX_LEFTSHIFTKEY;                  
-		
-		gReverseKeyTranslateTable[ESCKEY			] = SCA_IInputDevice::KX_ESCKEY;                  
-		gReverseKeyTranslateTable[TABKEY			] = SCA_IInputDevice::KX_TABKEY;                  
-		gReverseKeyTranslateTable[RETKEY			] = SCA_IInputDevice::KX_RETKEY;                  
-		gReverseKeyTranslateTable[SPACEKEY			] = SCA_IInputDevice::KX_SPACEKEY;                  
-		gReverseKeyTranslateTable[LINEFEEDKEY		] = SCA_IInputDevice::KX_LINEFEEDKEY;                  
-		gReverseKeyTranslateTable[BACKSPACEKEY		] = SCA_IInputDevice::KX_BACKSPACEKEY;                  
-		gReverseKeyTranslateTable[DELKEY			] = SCA_IInputDevice::KX_DELKEY;                  
-		gReverseKeyTranslateTable[SEMICOLONKEY		] = SCA_IInputDevice::KX_SEMICOLONKEY;                  
-		gReverseKeyTranslateTable[PERIODKEY			] = SCA_IInputDevice::KX_PERIODKEY;                  
-		gReverseKeyTranslateTable[COMMAKEY			] = SCA_IInputDevice::KX_COMMAKEY;                  
-		gReverseKeyTranslateTable[QUOTEKEY			] = SCA_IInputDevice::KX_QUOTEKEY;                  
-		gReverseKeyTranslateTable[ACCENTGRAVEKEY	] = SCA_IInputDevice::KX_ACCENTGRAVEKEY;                  
-		gReverseKeyTranslateTable[MINUSKEY			] = SCA_IInputDevice::KX_MINUSKEY;                  
-		gReverseKeyTranslateTable[SLASHKEY			] = SCA_IInputDevice::KX_SLASHKEY;                  
-		gReverseKeyTranslateTable[BACKSLASHKEY		] = SCA_IInputDevice::KX_BACKSLASHKEY;                  
-		gReverseKeyTranslateTable[EQUALKEY			] = SCA_IInputDevice::KX_EQUALKEY;                  
-		gReverseKeyTranslateTable[LEFTBRACKETKEY	] = SCA_IInputDevice::KX_LEFTBRACKETKEY;                  
-		gReverseKeyTranslateTable[RIGHTBRACKETKEY	] = SCA_IInputDevice::KX_RIGHTBRACKETKEY;                  
-		
-		gReverseKeyTranslateTable[LEFTARROWKEY		] = SCA_IInputDevice::KX_LEFTARROWKEY;                  
-		gReverseKeyTranslateTable[DOWNARROWKEY		] = SCA_IInputDevice::KX_DOWNARROWKEY;                  
-		gReverseKeyTranslateTable[RIGHTARROWKEY		] = SCA_IInputDevice::KX_RIGHTARROWKEY;                  
-		gReverseKeyTranslateTable[UPARROWKEY		] = SCA_IInputDevice::KX_UPARROWKEY;                  
-		
-		gReverseKeyTranslateTable[PAD2				] = SCA_IInputDevice::KX_PAD2;                  
-		gReverseKeyTranslateTable[PAD4				] = SCA_IInputDevice::KX_PAD4;                  
-		gReverseKeyTranslateTable[PAD6				] = SCA_IInputDevice::KX_PAD6;                  
-		gReverseKeyTranslateTable[PAD8				] = SCA_IInputDevice::KX_PAD8;                  
-		
-		gReverseKeyTranslateTable[PAD1				] = SCA_IInputDevice::KX_PAD1;                  
-		gReverseKeyTranslateTable[PAD3				] = SCA_IInputDevice::KX_PAD3;                  
-		gReverseKeyTranslateTable[PAD5				] = SCA_IInputDevice::KX_PAD5;                  
-		gReverseKeyTranslateTable[PAD7				] = SCA_IInputDevice::KX_PAD7;                  
-		gReverseKeyTranslateTable[PAD9				] = SCA_IInputDevice::KX_PAD9;                  
-		
-		gReverseKeyTranslateTable[PADPERIOD			] = SCA_IInputDevice::KX_PADPERIOD;                  
-		gReverseKeyTranslateTable[PADSLASHKEY		] = SCA_IInputDevice::KX_PADSLASHKEY;                  
-		gReverseKeyTranslateTable[PADASTERKEY		] = SCA_IInputDevice::KX_PADASTERKEY;                  
-		
-		gReverseKeyTranslateTable[PAD0				] = SCA_IInputDevice::KX_PAD0;                  
-		gReverseKeyTranslateTable[PADMINUS			] = SCA_IInputDevice::KX_PADMINUS;                  
-		gReverseKeyTranslateTable[PADENTER			] = SCA_IInputDevice::KX_PADENTER;                  
-		gReverseKeyTranslateTable[PADPLUSKEY		] = SCA_IInputDevice::KX_PADPLUSKEY;                  
-		
-		
-		gReverseKeyTranslateTable[F1KEY				] = SCA_IInputDevice::KX_F1KEY;                  
-		gReverseKeyTranslateTable[F2KEY				] = SCA_IInputDevice::KX_F2KEY;                  
-		gReverseKeyTranslateTable[F3KEY				] = SCA_IInputDevice::KX_F3KEY;                  
-		gReverseKeyTranslateTable[F4KEY				] = SCA_IInputDevice::KX_F4KEY;                  
-		gReverseKeyTranslateTable[F5KEY				] = SCA_IInputDevice::KX_F5KEY;                  
-		gReverseKeyTranslateTable[F6KEY				] = SCA_IInputDevice::KX_F6KEY;                  
-		gReverseKeyTranslateTable[F7KEY				] = SCA_IInputDevice::KX_F7KEY;                  
-		gReverseKeyTranslateTable[F8KEY				] = SCA_IInputDevice::KX_F8KEY;                  
-		gReverseKeyTranslateTable[F9KEY				] = SCA_IInputDevice::KX_F9KEY;                  
-		gReverseKeyTranslateTable[F10KEY			] = SCA_IInputDevice::KX_F10KEY;                  
-		gReverseKeyTranslateTable[F11KEY			] = SCA_IInputDevice::KX_F11KEY;                  
-		gReverseKeyTranslateTable[F12KEY			] = SCA_IInputDevice::KX_F12KEY;
-		gReverseKeyTranslateTable[F13KEY			] = SCA_IInputDevice::KX_F13KEY;
-		gReverseKeyTranslateTable[F14KEY			] = SCA_IInputDevice::KX_F14KEY;
-		gReverseKeyTranslateTable[F15KEY			] = SCA_IInputDevice::KX_F15KEY;
-		gReverseKeyTranslateTable[F16KEY			] = SCA_IInputDevice::KX_F16KEY;
-		gReverseKeyTranslateTable[F17KEY			] = SCA_IInputDevice::KX_F17KEY;
-		gReverseKeyTranslateTable[F18KEY			] = SCA_IInputDevice::KX_F18KEY;
-		gReverseKeyTranslateTable[F19KEY			] = SCA_IInputDevice::KX_F19KEY;
-		
-		
-		gReverseKeyTranslateTable[PAUSEKEY			] = SCA_IInputDevice::KX_PAUSEKEY;                  
-		gReverseKeyTranslateTable[INSERTKEY			] = SCA_IInputDevice::KX_INSERTKEY;                  
-		gReverseKeyTranslateTable[HOMEKEY			] = SCA_IInputDevice::KX_HOMEKEY;                  
-		gReverseKeyTranslateTable[PAGEUPKEY			] = SCA_IInputDevice::KX_PAGEUPKEY;                  
-		gReverseKeyTranslateTable[PAGEDOWNKEY		] = SCA_IInputDevice::KX_PAGEDOWNKEY;                  
-		gReverseKeyTranslateTable[ENDKEY			] = SCA_IInputDevice::KX_ENDKEY;
-	}
 
 	int executePriority = 0;
 	int uniqueint = 0;
@@ -470,9 +296,9 @@ void BL_ConvertSensors(struct Object* blenderobject,
 				if (eventmgr)
 				{
 					gamesensor = new SCA_KeyboardSensor(eventmgr,
-						gReverseKeyTranslateTable[blenderkeybdsensor->key],
-						gReverseKeyTranslateTable[blenderkeybdsensor->qual],
-						gReverseKeyTranslateTable[blenderkeybdsensor->qual2],
+						ConvertKeyCode(blenderkeybdsensor->key),
+						ConvertKeyCode(blenderkeybdsensor->qual),
+						ConvertKeyCode(blenderkeybdsensor->qual2),
 						(blenderkeybdsensor->type == SENS_ALL_KEYS),
 						blenderkeybdsensor->targetName,
 						blenderkeybdsensor->toggleName,
diff --git a/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h b/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
index 5b267c92908780790d1e9e8dd8856e0fec20b108..3d88dc467b066791aa5d99b988b695ebd92276c1 100644
--- a/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
+++ b/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
@@ -57,6 +57,7 @@ protected:
 	 * System dependent keyboard codes are stored as ints.
 	 */
 	std::map<int, KX_EnumInputs> m_reverseKeyTranslateTable;
+	short	m_exitkey;
 
 public:
 	bool m_hookesc;
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index 7490e18782473b5b8bbad396d671d88828979cd3..f9403c9725a93697a4aa507007ea32b23342bc83 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -40,6 +40,7 @@
 #include "GPU_extensions.h"
 
 #include "GPG_Application.h"
+#include "BL_BlenderDataConversion.h"
 
 #include <iostream>
 #include <MT_assert.h>
@@ -626,6 +627,8 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
 		m_ketsjiengine->SetRasterizer(m_rasterizer);
 
 		m_ketsjiengine->SetTimingDisplay(frameRate, false, false);
+
+		KX_KetsjiEngine::SetExitKey(ConvertKeyCode(gm->exitkey));
 #ifdef WITH_PYTHON
 		CValue::SetDeprecationWarnings(nodepwarnings);
 #else
@@ -908,12 +911,10 @@ bool GPG_Application::handleKey(GHOST_IEvent* event, bool isDown)
 	{
 		GHOST_TEventDataPtr eventData = ((GHOST_IEvent*)event)->getData();
 		GHOST_TEventKeyData* keyData = static_cast<GHOST_TEventKeyData*>(eventData);
-		//no need for this test
-		//if (fSystem->getFullScreen()) {
-			if (keyData->key == GHOST_kKeyEsc && !m_keyboard->m_hookesc && !m_isEmbedded) {
-				m_exitRequested = KX_EXIT_REQUEST_OUTSIDE;
-			}
-		//}
+
+		if (m_keyboard->ToNative(keyData->key) == KX_KetsjiEngine::GetExitKey() && !m_keyboard->m_hookesc && !m_isEmbedded) {
+			m_exitRequested = KX_EXIT_REQUEST_OUTSIDE;
+		}
 		m_keyboard->ConvertEvent(keyData->key, isDown);
 		handled = true;
 	}
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.h b/source/gameengine/GamePlayer/ghost/GPG_Application.h
index a8a976f9dd2b1af906324c83da945e05cf7e1dd5..37625dc8998b99f7213bcc841c2bd3b988361057 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.h
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.h
@@ -103,6 +103,7 @@ protected:
 	 * Shuts the game engine down.
 	 */
 	void exitEngine(void);
+	short					m_exitkey;
 
 	/* The game data */
 	STR_String				m_startSceneName;
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index a9be588e6b2e0df9b96413391ab2857fd0fec240..29727dc04da8863d1447797d489f7d8f70002b21 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -110,6 +110,7 @@ double KX_KetsjiEngine::m_suspendedtime = 0.0;
 double KX_KetsjiEngine::m_suspendeddelta = 0.0;
 double KX_KetsjiEngine::m_average_framerate = 0.0;
 bool   KX_KetsjiEngine::m_restrict_anim_fps = false;
+short  KX_KetsjiEngine::m_exitkey = 130; //ESC Key
 
 
 /**
@@ -1857,6 +1858,16 @@ double KX_KetsjiEngine::GetAverageFrameRate()
 	return m_average_framerate;
 }
 
+void KX_KetsjiEngine::SetExitKey(short key)
+{
+	m_exitkey = key;
+}
+
+short KX_KetsjiEngine::GetExitKey()
+{
+	return m_exitkey;
+}
+
 void KX_KetsjiEngine::SetTimingDisplay(bool frameRate, bool profile, bool properties)
 {
 	m_show_framerate = frameRate;
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index 5a02da07e4324ffdccd9ba62b1601ec893f4d41f..96b737b686df4b34a18e0af142fd001204d925f6 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -124,6 +124,8 @@ private:
 	static double			m_suspendedtime;
 	static double			m_suspendeddelta;
 
+	static short			m_exitkey; /* Key used to exit the BGE */
+
 	int					m_exitcode;
 	STR_String			m_exitstring;
 		/**
@@ -352,6 +354,10 @@ public:
 	 */
 	static double GetAverageFrameRate();
 
+	static void SetExitKey(short key);
+
+	static short GetExitKey();
+
 	/**
 	 * Activates or deactivates timing information display.
 	 * @param frameRate		Display for frame rate on or off.
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 29871c2b3cd53378e6a020fc89deb4d969681fd3..9a2c0cb89b149655bcd83b487c9ae0d804163ca8 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -419,6 +419,20 @@ static PyObject* gPyGetLogicTicRate(PyObject*)
 	return PyFloat_FromDouble(KX_KetsjiEngine::GetTicRate());
 }
 
+static PyObject* gPySetExitKey(PyObject*, PyObject* args)
+{
+	short exitkey;
+	if (!PyArg_ParseTuple(args, "h:setExitKey", &exitkey))
+		return NULL;
+	KX_KetsjiEngine::SetExitKey(exitkey);
+	Py_RETURN_NONE;
+}
+
+static PyObject* gPyGetExitKey(PyObject*)
+{
+	return PyLong_FromSsize_t(KX_KetsjiEngine::GetExitKey());
+}
+
 static PyObject* gPySetMaxLogicFrame(PyObject*, PyObject* args)
 {
 	int frame;
@@ -812,6 +826,8 @@ static struct PyMethodDef game_methods[] = {
 	{"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (const char *)"Sets the logic tic rate"},
 	{"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (const char *)"Gets the physics tic rate"},
 	{"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (const char *)"Sets the physics tic rate"},
+	{"getExitKey", (PyCFunction) gPyGetExitKey, METH_NOARGS, (const char *)"Gets the key used to exit the game engine"},
+	{"setExitKey", (PyCFunction) gPySetExitKey, METH_VARARGS, (const char *)"Sets the key used to exit the game engine"},
 	{"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},
 	{"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (const char *)"Gets a list of blend files in the same directory as the current blend file"},
 	{"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (const char *)"Prints GL Extension Info"},