diff --git a/src/console.c b/src/console.c
index 52f16ed467bf70d2608e0109973bc3e1a695c500..a51ff61f7c6033af6d5f3ab2773eb4deebb2cce4 100644
--- a/src/console.c
+++ b/src/console.c
@@ -783,7 +783,7 @@ boolean CON_Responder(event_t *ev)
 		// check other keys only if console prompt is active
 		if (!consoleready && key < NUMINPUTS) // metzgermeister: boundary check!!
 		{
-			if (bindtable[key])
+			if (bindtable[key] && ev->type == ev_keydown) // ev_textinput crashes the game. Why?
 			{
 				COM_BufAddText(bindtable[key]);
 				COM_BufAddText("\n");
diff --git a/src/g_input.c b/src/g_input.c
index ca41cdb52ecd933d5dde353b4beb4ea593fe206c..27862e0c5177c26f378f14cf93b36bc6c951aba1 100644
--- a/src/g_input.c
+++ b/src/g_input.c
@@ -40,7 +40,7 @@ INT32 mouse2x, mouse2y, mlook2y;
 INT32 joyxmove[JOYAXISSET], joyymove[JOYAXISSET], joy2xmove[JOYAXISSET], joy2ymove[JOYAXISSET];
 
 // current state of the keys: true if pushed
-UINT8 gamekeydown[NUMINPUTS];
+INT32 gamekeydown[NUMINPUTS];
 
 // two key codes (or virtual key) per game control
 INT32 gamecontrol[num_gamecontrols][2];
@@ -117,7 +117,7 @@ void G_MapEventsToControls(event_t *ev)
 	switch (ev->type)
 	{
 		case ev_keydown:
-			if (ev->data1 < NUMINPUTS)
+			if (ev->data1 < NUMINPUTS || (ev->data1 & KEY_XTMASK))
 				gamekeydown[ev->data1] = 1;
 #ifdef PARANOIA
 			else
@@ -129,7 +129,7 @@ void G_MapEventsToControls(event_t *ev)
 			break;
 
 		case ev_keyup:
-			if (ev->data1 < NUMINPUTS)
+			if (ev->data1 < NUMINPUTS || (ev->data1 & KEY_XTMASK))
 				gamekeydown[ev->data1] = 0;
 #ifdef PARANOIA
 			else
@@ -638,9 +638,9 @@ const char *G_KeynumToString(INT32 keynum)
 	UINT32 j;
 
 	// return a string with the ascii char if displayable
-	if (keynum > ' ' && keynum <= 'z' && keynum != KEY_CONSOLE)
+	if (keynum > ' ' && keynum <= 0xFF && keynum != KEY_CONSOLE)
 	{
-		keynamestr[0] = (char)keynum;
+		keynamestr[0] = (UINT8)keynum;
 		keynamestr[1] = '\0';
 		return keynamestr;
 	}
@@ -657,10 +657,12 @@ const char *G_KeynumToString(INT32 keynum)
 
 INT32 G_KeyStringtoNum(const char *keystr)
 {
+	const UINT8 *keystr_u = (const UINT8 *)keystr;
 	UINT32 j;
 
-	if (!keystr[1] && keystr[0] > ' ' && keystr[0] <= 'z')
-		return keystr[0];
+	// You can put � as your strafe left key but the game won't recognize it
+	if (!keystr_u[1] && keystr_u[0] > ' ' && keystr_u[0] <= 0xFF)
+		return (UINT8)keystr[0];
 
 	if (!strncmp(keystr, "KEY", 3) && keystr[3] >= '0' && keystr[3] <= '9')
 		return atoi(&keystr[3]);
diff --git a/src/g_input.h b/src/g_input.h
index d089332c5355305ce5b350ed0ab5fc9d72a0302d..398d0428c47feec824999e48de0b88c58efbf891 100644
--- a/src/g_input.h
+++ b/src/g_input.h
@@ -20,7 +20,7 @@
 
 // number of total 'button' inputs, include keyboard keys, plus virtual
 // keys (mousebuttons and joybuttons becomes keys)
-#define NUMKEYS 256
+#define NUMKEYS 0x200 // Needs to be at least a single bit higher KEY_XTMASK!!!!
 
 #define MOUSEBUTTONS 8
 #define JOYBUTTONS   32 // 32 buttons
@@ -123,7 +123,7 @@ extern INT32 mouse2x, mouse2y, mlook2y;
 extern INT32 joyxmove[JOYAXISSET], joyymove[JOYAXISSET], joy2xmove[JOYAXISSET], joy2ymove[JOYAXISSET];
 
 // current state of the keys: true if pushed
-extern UINT8 gamekeydown[NUMINPUTS];
+extern INT32 gamekeydown[NUMINPUTS];
 
 // two key codes (or virtual key) per game control
 extern INT32 gamecontrol[num_gamecontrols][2];
diff --git a/src/keys.h b/src/keys.h
index b4a6a7a309f62c068c7985457160285eb285c5d2..426f55f24f28f47547aa1f3e1e2093e708363524 100644
--- a/src/keys.h
+++ b/src/keys.h
@@ -16,7 +16,7 @@
 // Lactozilla: Well, this is embarrassing
 // Those key codes conflict with even Latin-1 Supplement
 // At least events are 32-bits, so I can use 0x100
-// Which is one bit higher than 0x80
+#define KEY_XTMASK (0x100)
 
 #define KEY_NULL      0 // null key, triggers nothing
 #define KEY_BACKSPACE 8
@@ -28,66 +28,66 @@
 #define KEY_EQUALS   61
 
 // Num lock and scroll lock
-#define KEY_NUMLOCK    (0x100+1)
-#define KEY_SCROLLLOCK (0x100+2)
+#define KEY_NUMLOCK    (KEY_XTMASK+1)
+#define KEY_SCROLLLOCK (KEY_XTMASK+2)
 
 // Keypad
-#define KEY_KEYPAD7  (0x100+3)
-#define KEY_KEYPAD8  (0x100+4)
-#define KEY_KEYPAD9  (0x100+5)
-#define KEY_MINUSPAD (0x100+6)
-#define KEY_KEYPAD4  (0x100+7)
-#define KEY_KEYPAD5  (0x100+8)
-#define KEY_KEYPAD6  (0x100+9)
-#define KEY_PLUSPAD  (0x100+10)
-#define KEY_KEYPAD1  (0x100+11)
-#define KEY_KEYPAD2  (0x100+12)
-#define KEY_KEYPAD3  (0x100+13)
-#define KEY_KEYPAD0  (0x100+14)
-#define KEY_KPADDEL  (0x100+15)
+#define KEY_KEYPAD7  (KEY_XTMASK+3)
+#define KEY_KEYPAD8  (KEY_XTMASK+4)
+#define KEY_KEYPAD9  (KEY_XTMASK+5)
+#define KEY_MINUSPAD (KEY_XTMASK+6)
+#define KEY_KEYPAD4  (KEY_XTMASK+7)
+#define KEY_KEYPAD5  (KEY_XTMASK+8)
+#define KEY_KEYPAD6  (KEY_XTMASK+9)
+#define KEY_PLUSPAD  (KEY_XTMASK+10)
+#define KEY_KEYPAD1  (KEY_XTMASK+11)
+#define KEY_KEYPAD2  (KEY_XTMASK+12)
+#define KEY_KEYPAD3  (KEY_XTMASK+13)
+#define KEY_KEYPAD0  (KEY_XTMASK+14)
+#define KEY_KPADDEL  (KEY_XTMASK+15)
 
 // Bill Gates keys
-#define KEY_LEFTWIN  (0x100+16)
-#define KEY_RIGHTWIN (0x100+17)
-#define KEY_MENU     (0x100+18) // Context Menu
+#define KEY_LEFTWIN  (KEY_XTMASK+16)
+#define KEY_RIGHTWIN (KEY_XTMASK+17)
+#define KEY_MENU     (KEY_XTMASK+18) // Context Menu
 
-#define KEY_KPADSLASH  (0x100+19)
-#define KEY_HOME       (0x100+20)
-#define KEY_UPARROW    (0x100+21)
-#define KEY_PGUP       (0x100+22)
-#define KEY_LEFTARROW  (0x100+23)
-#define KEY_RIGHTARROW (0x100+24)
-#define KEY_END        (0x100+25)
-#define KEY_DOWNARROW  (0x100+26)
-#define KEY_PGDN       (0x100+27)
-#define KEY_INS        (0x100+28)
-#define KEY_DEL        (0x100+29)
+#define KEY_KPADSLASH  (KEY_XTMASK+19)
+#define KEY_HOME       (KEY_XTMASK+20)
+#define KEY_UPARROW    (KEY_XTMASK+21)
+#define KEY_PGUP       (KEY_XTMASK+22)
+#define KEY_LEFTARROW  (KEY_XTMASK+23)
+#define KEY_RIGHTARROW (KEY_XTMASK+24)
+#define KEY_END        (KEY_XTMASK+25)
+#define KEY_DOWNARROW  (KEY_XTMASK+26)
+#define KEY_PGDN       (KEY_XTMASK+27)
+#define KEY_INS        (KEY_XTMASK+28)
+#define KEY_DEL        (KEY_XTMASK+29)
 
 // Function keys
-#define KEY_F1  (0x100+30)
-#define KEY_F2  (0x100+31)
-#define KEY_F3  (0x100+32)
-#define KEY_F4  (0x100+33)
-#define KEY_F5  (0x100+34)
-#define KEY_F6  (0x100+35)
-#define KEY_F7  (0x100+36)
-#define KEY_F8  (0x100+37)
-#define KEY_F9  (0x100+38)
-#define KEY_F10 (0x100+39)
-#define KEY_F11 (0x100+40)
-#define KEY_F12 (0x100+41)
+#define KEY_F1  (KEY_XTMASK+30)
+#define KEY_F2  (KEY_XTMASK+31)
+#define KEY_F3  (KEY_XTMASK+32)
+#define KEY_F4  (KEY_XTMASK+33)
+#define KEY_F5  (KEY_XTMASK+34)
+#define KEY_F6  (KEY_XTMASK+35)
+#define KEY_F7  (KEY_XTMASK+36)
+#define KEY_F8  (KEY_XTMASK+37)
+#define KEY_F9  (KEY_XTMASK+38)
+#define KEY_F10 (KEY_XTMASK+39)
+#define KEY_F11 (KEY_XTMASK+40)
+#define KEY_F12 (KEY_XTMASK+41)
 
-#define KEY_CAPSLOCK (0x100+42)
-#define KEY_CONSOLE KEY_MENU // (0x100+43)
-#define KEY_PAUSE (0x100+44)
-#define KEY_PRTSC (0x100+45)
+#define KEY_CAPSLOCK (KEY_XTMASK+42)
+#define KEY_CONSOLE KEY_MENU // (KEY_XTMASK+43)
+#define KEY_PAUSE (KEY_XTMASK+44)
+#define KEY_PRTSC (KEY_XTMASK+45)
 
-// these ones must be non-extended scancodes (rctrl, rshift, lalt)
-#define KEY_LSHIFT (0x100+46)
-#define KEY_RSHIFT (0x100+47)
-#define KEY_LCTRL  (0x100+48)
-#define KEY_RCTRL  (0x100+49)
-#define KEY_LALT   (0x100+50)
-#define KEY_RALT   (0x100+51)
+// Modifiers
+#define KEY_LSHIFT (KEY_XTMASK+46)
+#define KEY_RSHIFT (KEY_XTMASK+47)
+#define KEY_LCTRL  (KEY_XTMASK+48)
+#define KEY_RCTRL  (KEY_XTMASK+49)
+#define KEY_LALT   (KEY_XTMASK+50)
+#define KEY_RALT   (KEY_XTMASK+51)
 
 #endif
diff --git a/src/m_misc.c b/src/m_misc.c
index d973833857a339c4aa61589348aa473c959c0d3d..5f5196ab406b9c63b645ef62e8cb85a06d55935c 100644
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -1579,7 +1579,7 @@ boolean M_ScreenshotResponder(event_t *ev)
 
 	ch = ev->data1;
 
-	if (ch >= KEY_MOUSE1 && menuactive) // If it's not a keyboard key, then don't allow it in the menus!
+	if (ch >= NUMKEYS && menuactive) // If it's not a keyboard key, then don't allow it in the menus!
 		return false;
 
 	if (ch == KEY_F8 || ch == gamecontrol[gc_screenshot][0] || ch == gamecontrol[gc_screenshot][1]) // remappable F8