diff --git a/src/cioxtrn/cioxtrn.c b/src/cioxtrn/cioxtrn.c
index 91c061d31d32de91e0aa66a825b1e0f64bee15a6..e0f6b676d1e4f2fc85dade80e221b0416bf41be5 100644
--- a/src/cioxtrn/cioxtrn.c
+++ b/src/cioxtrn/cioxtrn.c
@@ -11,12 +11,89 @@ int					input_thread_running=0;
 int					output_thread_running=0;
 struct text_info ti;
 
+enum key_modifier {
+	 MOD_SHIFT
+	,MOD_CONTROL
+	,MOD_ALT
+};
+int					shift=0;
+int					alt=0;
+int					ctrl=0;
+
+/* Stolen from win32cio.c */
+struct keyvals {
+	int	VirtualKeyCode
+		,Key
+		,Shift
+		,CTRL
+		,ALT;
+};
+
+/* Get this from win32cio.c */
+extern const struct keyvals keyval[];
+
+void frobkey(int press, int release, int scan, int key, int ascii)
+{
+	INPUT_RECORD		ckey;
+	DWORD d;
+	SHORT s;
+
+	ckey.Event.KeyEvent.bKeyDown=TRUE;
+	ckey.Event.KeyEvent.dwControlKeyState=0;
+	if(alt)
+		ckey.Event.KeyEvent.dwControlKeyState |= LEFT_ALT_PRESSED;
+	if(ctrl)
+		ckey.Event.KeyEvent.dwControlKeyState |= LEFT_CTRL_PRESSED;
+	if(shift)
+		ckey.Event.KeyEvent.dwControlKeyState |= LEFT_SHIFT_PRESSED;
+	ckey.Event.KeyEvent.wRepeatCount=1;
+	ckey.Event.KeyEvent.wVirtualKeyCode=key;	/* ALT key */
+	ckey.Event.KeyEvent.wVirtualScanCode=scan;
+	ckey.Event.KeyEvent.uChar.AsciiChar=ascii;
+	d=0;
+	if(press) {
+		while(!d) {
+			if(!WriteConsoleInput(console_input, &ckey, 1, &d))
+				d=0;
+		}
+	}
+	ckey.Event.KeyEvent.bKeyDown=FALSE;
+	if(release) {
+		while(!d) {
+			if(!WriteConsoleInput(console_input, &ckey, 1, &d))
+				d=0;
+		}
+	}
+}
+
+void toggle_modifier(enum key_modifier mod)
+{
+	int *mod;
+	WORD key;
+
+	switch(mod) {
+		case MOD_SHIFT:
+			mod=&shift;
+			key=VK_SHIFT;
+			break;
+		case MOD_CONTROL:
+			mod=&ctrl;
+			key=VK_CONTROL;
+			break;
+		case MOD_ALT:
+			mod=&alt;
+			key=VK_MENU;
+			break;
+	}
+	frobkey(!(*mod), (*mod), MapVirtualKey(key, 0), key, 0);
+	*mod=!(*mod);
+}
+
 void input_thread(void *args)
 {
 	int					key;
 	INPUT_RECORD		ckey;
-	int					alt=0;
-	int					ctrl=0;
+	int i;
 	DWORD d;
 	SHORT s;
 
@@ -28,25 +105,7 @@ void input_thread(void *args)
 			if(key==0 || key == 0xff)
 				key|=getch()<<8;
 			if(key==1) {
-				if(alt==0) {
-					alt=1;
-					ckey.Event.KeyEvent.bKeyDown=TRUE;
-					ckey.Event.KeyEvent.dwControlKeyState = LEFT_ALT_PRESSED;
-				}
-				else {
-					alt=0;
-					ckey.Event.KeyEvent.bKeyDown=FALSE;
-					ckey.Event.KeyEvent.dwControlKeyState = 0;
-				}
-				ckey.Event.KeyEvent.wRepeatCount=1;
-				ckey.Event.KeyEvent.wVirtualKeyCode=VK_MENU;	/* ALT key */
-				ckey.Event.KeyEvent.wVirtualScanCode=MapVirtualKey(VK_MENU, 0);
-				ckey.Event.KeyEvent.uChar.AsciiChar=0;
-				d=0;
-				while(!d) {
-					if(!WriteConsoleInput(console_input, &ckey, 1, &d))
-						d=0;
-				}
+				toggle_modifier(MOD_ALT);
 				if(alt)
 					continue;
 			}
@@ -63,23 +122,10 @@ void input_thread(void *args)
 					if(alt==1)
 						break;
 				default:
-					ctrl=1;
-					ckey.Event.KeyEvent.bKeyDown=TRUE;
-					ckey.Event.KeyEvent.dwControlKeyState = LEFT_CTRL_PRESSED;
-					ckey.Event.KeyEvent.wRepeatCount=1;
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_CONTROL;
-					ckey.Event.KeyEvent.wVirtualScanCode=MapVirtualKey(ckey.Event.KeyEvent.wVirtualKeyCode, 0);
-					ckey.Event.KeyEvent.uChar.AsciiChar=0;
-					d=0;
-					while(!d) {
-						if(!WriteConsoleInput(console_input, &ckey, 1, &d))
-							d=0;
-					}
+					toggle_modifier(MOD_CONTROL);
 				}
 			}
 
-			ckey.Event.KeyEvent.bKeyDown=TRUE;
-			ckey.Event.KeyEvent.wRepeatCount=1;
 			if(key < 256) {
 				s=VkKeyScan(key);
 
@@ -87,139 +133,65 @@ void input_thread(void *args)
 				if(s==-1)
 					continue;
 
-				ckey.Event.KeyEvent.wVirtualKeyCode = s&0xff;
-				ckey.Event.KeyEvent.dwControlKeyState=0;
-				if(s&0x0100)
-					ckey.Event.KeyEvent.dwControlKeyState |= SHIFT_PRESSED;
-				if(s&0x0200)
-					ckey.Event.KeyEvent.dwControlKeyState |= LEFT_CTRL_PRESSED;
-				if(s&0x0400)
-					ckey.Event.KeyEvent.dwControlKeyState |= LEFT_ALT_PRESSED;
-
-				ckey.Event.KeyEvent.wVirtualScanCode=MapVirtualKey(s & 0xff, 0);
-				ckey.Event.KeyEvent.uChar.AsciiChar=key;
+				/* Make the mod states match up... */
+				/* Wish I had a ^^ operator */
+				if((s & 0x0100 == 0x0100) != (shift != 0))
+					toggle_modifier(MOD_SHIFT);
+				if((s & 0x0200 == 0x0200) != (ctrl != 0))
+					toggle_modifier(MOD_CONTROL);
+				if((s & 0x0400 == 0x0400) != (alt != 0))
+					toggle_modifier(MOD_ALT);
+
+				frobkey(TRUE, TRUE, MapVirtualKey(s & 0xff, 0), s&0xff, key);
 			}
 			else {
-				ckey.Event.KeyEvent.dwControlKeyState=0;
-				ckey.Event.KeyEvent.uChar.AsciiChar=0;
-				switch(key) {
-				case CIO_KEY_HOME:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_HOME;
-					break;
-				case CIO_KEY_UP:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_UP;
-					break;
-				case CIO_KEY_END:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_END;
-					break;
-				case CIO_KEY_DOWN:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_DOWN;
-					break;
-				case CIO_KEY_IC:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_INSERT;
-					break;
-				case CIO_KEY_DC:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_DELETE;
-					break;
-				case CIO_KEY_LEFT:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_LEFT;
-					break;
-				case CIO_KEY_RIGHT:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_RIGHT;
-					break;
-				case CIO_KEY_PPAGE:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_PRIOR;
-					break;
-				case CIO_KEY_NPAGE:
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_NEXT;
-					break;
-				case CIO_KEY_F(1):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F1;
-					break;
-				case CIO_KEY_F(2):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F2;
-					break;
-				case CIO_KEY_F(3):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F3;
-					break;
-				case CIO_KEY_F(4):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F4;
-					break;
-				case CIO_KEY_F(5):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F5;
-					break;
-				case CIO_KEY_F(6):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F6;
-					break;
-				case CIO_KEY_F(7):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F7;
-					break;
-				case CIO_KEY_F(8):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F8;
-					break;
-				case CIO_KEY_F(9):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F9;
-					break;
-				case CIO_KEY_F(10):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F10;
-					break;
-				case CIO_KEY_F(11):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F11;
-					break;
-				case CIO_KEY_F(12):
-					ckey.Event.KeyEvent.wVirtualKeyCode=VK_F12;
-					break;
-				default:
-					continue;
+				/* Check if CTRL or ALT are "pressed" */
+				for(i=0;keyval[i].Key;i++) {
+					if(keyval[i].Key==key)
+						break;
+					if(keyval[i].Shift==key)
+						/* Release the CTRL key */
+						if(ctrl)
+							toggle_modifier(MOD_CONTROL);
+						/* Release the ALT key */
+						if(alt)
+							toggle_modifier(MOD_ALT);
+						/* Press the shift key */
+						if(!shift)
+							toggle_modifier(MOD_SHIFT);
+						break;
+					if(keyval[i].CTRL==key) {
+						/* Release the shift key */
+						if(shift)
+							toggle_modifier(MOD_SHIFT);
+						/* Release the ALT key */
+						if(alt)
+							toggle_modifier(MOD_ALT);
+						/* Press the CTRL key */
+						if(!ctrl)
+							toggle_modifier(MOD_CONTROL);
+						break;
+					}
+					if(keyval[i].ALT==key) {
+						/* Release the shift key */
+						if(shift)
+							toggle_modifier(MOD_SHIFT);
+						/* Release the CTRL key */
+						if(ctrl)
+							toggle_modifier(MOD_CONTROL);
+						/* Press the ALT key */
+						if(!alt)
+							toggle_modifier(MOD_ALT);
+					}
 				}
-				ckey.Event.KeyEvent.wRepeatCount=1;
-				ckey.Event.KeyEvent.wVirtualScanCode=MapVirtualKey(ckey.Event.KeyEvent.wVirtualKeyCode, 0);
-				ckey.Event.KeyEvent.uChar.AsciiChar=0;
-				ckey.Event.KeyEvent.dwControlKeyState=0;
+				frobkey(TRUE, TRUE, MapVirtualKey(key>>8, 1), key>>8, 0);
 			}
 			if(alt)
-				ckey.Event.KeyEvent.dwControlKeyState |= LEFT_ALT_PRESSED;
-
-			ckey.EventType=KEY_EVENT;
-			d=0;
-			while(!d) {
-				if(!WriteConsoleInput(console_input, &ckey, 1, &d))
-					d=0;
-			}
-			ckey.Event.KeyEvent.bKeyDown=FALSE;
-			d=0;
-			while(!d) {
-				if(!WriteConsoleInput(console_input, &ckey, 1, &d))
-					d=0;
-			}
-			if(alt) {
-				ckey.Event.KeyEvent.bKeyDown=FALSE;
-				ckey.Event.KeyEvent.wRepeatCount=1;
-				ckey.Event.KeyEvent.wVirtualKeyCode=VK_MENU;	/* ALT key */
-				ckey.Event.KeyEvent.wVirtualScanCode=MapVirtualKey(VK_MENU, 0);
-				ckey.Event.KeyEvent.uChar.AsciiChar=0;
-				ckey.Event.KeyEvent.dwControlKeyState = LEFT_ALT_PRESSED;
-				d=0;
-				while(!d) {
-					if(!WriteConsoleInput(console_input, &ckey, 1, &d))
-						d=0;
-				}
-				alt=0;
-			}
-			if(ctrl) {
-				ckey.Event.KeyEvent.bKeyDown=FALSE;
-				ckey.Event.KeyEvent.wRepeatCount=1;
-				ckey.Event.KeyEvent.wVirtualKeyCode=VK_CONTROL;
-				ckey.Event.KeyEvent.wVirtualScanCode=MapVirtualKey(ckey.Event.KeyEvent.wVirtualKeyCode, 0);
-				ckey.Event.KeyEvent.uChar.AsciiChar=0;
-				ckey.Event.KeyEvent.dwControlKeyState = LEFT_CTRL_PRESSED;
-				d=0;
-				while(!d) {
-					if(!WriteConsoleInput(console_input, &ckey, 1, &d))
-						d=0;
-				}
-				alt=0;
-			}
+				toggle_modifier(MOD_ALT);
+			if(ctrl)
+				toggle_modifier(MOD_CONTROL);
+			if(shift)
+				toggle_modifier(MOD_SHIFT);
 		}
 		else
 			SLEEP(1);