diff --git a/src/sbbs3/getkey.cpp b/src/sbbs3/getkey.cpp
index 3bfdbfd212706bdbebedba7f6ee9ff3f558d1205..17324676df70c74efad4c7db2fd787f1930222a8 100644
--- a/src/sbbs3/getkey.cpp
+++ b/src/sbbs3/getkey.cpp
@@ -538,5 +538,11 @@ void sbbs_t::pause()
 /****************************************************************************/
 void sbbs_t::ungetkey(char ch)
 {
+#if 0	/* this way breaks ansi_getxy() */
 	RingBufWrite(&inbuf,(uchar*)&ch,sizeof(uchar));
+#else
+	keybuf[keybuftop++]=ch;   
+	if(keybuftop==KEY_BUFSIZE)   
+		keybuftop=0; 
+#endif
 }
diff --git a/src/sbbs3/inkey.cpp b/src/sbbs3/inkey.cpp
index e29d8c0c9c6db804d9179036ad1ddf6eca478de7..39b3dd5b2b28527aed3ca32c67611c69fc2efc3b 100644
--- a/src/sbbs3/inkey.cpp
+++ b/src/sbbs3/inkey.cpp
@@ -49,7 +49,13 @@ char sbbs_t::inkey(long mode, unsigned long timeout)
 {
 	uchar	ch=0;
 
-	ch=incom(timeout);
+	if(keybuftop!=keybufbot) {   
+		ch=keybuf[keybufbot++];   
+		if(keybufbot==KEY_BUFSIZE)   
+			keybufbot=0;   
+	} else 
+		ch=incom(timeout);
+
 	if(ch==0) {
 		// moved here from getkey() on AUG-29-2001
 		if(sys_status&SS_SYSPAGE) 
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 5f3b4875ad1502bc05e62fb531667fe673c21660..7581e227cfd51c47112562f98629fe353c7af27f 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -2340,6 +2340,7 @@ sbbs_t::sbbs_t(ushort node_num, DWORD addr, char* name, SOCKET sd,
 	timeleft = 60*10;	/* just incase this is being used for calling gettimeleft() */
 	uselect_total = 0;
 	lbuflen = 0;
+	keybufbot=keybuftop=0;	/* initialize [unget]keybuf pointers */
 	connection="Telnet";
 
 	ZERO_VAR(telnet_local_option);
@@ -2349,7 +2350,7 @@ sbbs_t::sbbs_t(ushort node_num, DWORD addr, char* name, SOCKET sd,
 	telnet_mode=0;
 	telnet_last_rxch=0;
 
-	sys_status=lncntr=tos=criterrs=lbuflen=slcnt=0L;
+	sys_status=lncntr=tos=criterrs=slcnt=0L;
 	curatr=LIGHTGRAY;
 	attr_sp=0;	/* attribute stack pointer */
 	errorlevel=0;
@@ -3215,6 +3216,7 @@ void sbbs_t::reset_logon_vars(void)
     slcnt=0;
     altul=0;
     timeleft_warn=0;
+	keybufbot=keybuftop=0;
     logon_uls=logon_ulb=logon_dls=logon_dlb=0;
     logon_posts=logon_emails=logon_fbacks=0;
     batdn_total=batup_total=0;
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 7bdadbb9e45360a99c92a74ff555e1aed9f89cb4..d2e832ce567d11567f2b6889187ffb9ac9ae8980 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -255,6 +255,8 @@ public:
 	char 	*text[TOTAL_TEXT];			/* Text from ctrl\text.dat */
 	char 	*text_sav[TOTAL_TEXT];		/* Text from ctrl\text.dat */
 	char 	dszlog[127];	/* DSZLOG enviornment variable */
+    int     keybuftop,keybufbot;    /* Keyboard input buffer pointers (for ungetkey) */
+	char    keybuf[KEY_BUFSIZE];    /* Keyboard input buffer */ 
 	char *	connection;		/* Connection Description */
 	ulong	cur_rate;		/* Current Connection (DCE) Rate */
 	ulong	cur_cps;		/* Current Average Transfer CPS */