diff --git a/src/sbbs3/getkey.cpp b/src/sbbs3/getkey.cpp
index fc86c1ab5267df77d23c359970f2a183d65ce393..c4c385bc8de31cb0a54d276e891dedee3ea81d01 100644
--- a/src/sbbs3/getkey.cpp
+++ b/src/sbbs3/getkey.cpp
@@ -562,13 +562,21 @@ void sbbs_t::pause()
 /****************************************************************************/
 /* Puts a character into the input buffer                                   */
 /****************************************************************************/
-void sbbs_t::ungetkey(char ch)
+void sbbs_t::ungetkey(char ch, bool insert)
 {
 #if 0	/* this way breaks ansi_getxy() */
 	RingBufWrite(&inbuf,(uchar*)&ch,sizeof(uchar));
 #else
-	keybuf[keybuftop++]=ch;   
-	if(keybuftop==KEY_BUFSIZE)   
-		keybuftop=0; 
+	if(insert) {
+		if(keybufbot == 0)
+			keybufbot = KEY_BUFSIZE - 1;
+		else
+			keybufbot--;
+		keybuf[keybufbot] = ch;
+	} else {
+		keybuf[keybuftop++]=ch;
+		if(keybuftop==KEY_BUFSIZE)
+			keybuftop=0;
+	}
 #endif
 }
diff --git a/src/sbbs3/inkey.cpp b/src/sbbs3/inkey.cpp
index 44d319ac30180058f971f6b7a80003defb5ad359..90e2ee63d06b09f80d87357f26d34e86d6aded03 100644
--- a/src/sbbs3/inkey.cpp
+++ b/src/sbbs3/inkey.cpp
@@ -306,7 +306,7 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 				return(ESC);
 			ch=i;
 			if(ch!='[') {
-				ungetkey(ch);
+				ungetkey(ch, /* insert: */true);
 				return(ESC); 
 			}
 			i=j=0;
@@ -363,10 +363,10 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 							}
 							break;
 					}
-					ungetkey('[');
-					for(j=0;j<i;j++)
-						ungetkey(str[j]);
-					ungetkey(ch);
+					ungetkey(ch, /* insert: */true);
+					for(j = i; j > 0; j--)
+						ungetkey(str[j - 1], /* insert: */true);
+					ungetkey('[', /* insert: */true);
 					return(ESC); 
 				}
 				if(ch=='R') {       /* cursor position report */
@@ -386,9 +386,9 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 				str[i++]=ch; 
 			}
 
-			ungetkey('[');
-			for(j=0;j<i;j++)
-				ungetkey(str[j]);
+			for(j = i; j > 0; j--)
+				ungetkey(str[j - 1], /* insert: */true);
+			ungetkey('[', /* insert: */true);
 			return(ESC); 
 	}
 	return(ch);
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 569c5632d6f4ff7ceedfb24064af60e3c3b189a0..929b937d91dc9848130eab74ab320a01483a8b78 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -784,7 +784,7 @@ public:
 	/* getkey.cpp */
 	char	getkey(long mode); 		/* Waits for a key hit local or remote  */
 	long	getkeys(const char *str, ulong max, long mode = K_UPPER);
-	void	ungetkey(char ch);		/* Places 'ch' into the input buffer    */
+	void	ungetkey(char ch, bool insert = false);		/* Places 'ch' into the input buffer    */
 	char	question[MAX_TEXTDAT_ITEM_LEN+1];
 	bool	yesno(const char *str, long mode = 0);
 	bool	noyes(const char *str, long mode = 0);