diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index d64bf6d9603fb2b3c39fb8f2d097f202e497c9b8..07b1a32dd8b0545c30ae31d7c02ea9eee259d798 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -455,13 +455,23 @@ static int send_byte(void* unused, uchar ch, unsigned timeout /* seconds */)
 #if defined(__BORLANDC__)
 	#pragma argsused
 #endif
+BYTE	recv_byte_buffer[BUFFER_SIZE/2];
+unsigned recv_byte_buffer_len=0;
+unsigned recv_byte_buffer_pos=0;
+
 static int recv_byte(void* unused, unsigned timeout /* seconds */)
 {
-	BYTE	ch;
+	if(recv_byte_buffer_len == 0)
+		recv_byte_buffer_len=conn_recv_upto(recv_byte_buffer, sizeof(recv_byte_buffer), timeout*1000);
+
+	if(recv_byte_buffer_len > 0) {
+		ch=recv_byte_buffer[recv_byte_buffer_pos++];
+		if(recv_byte_buffer_pos == recv_byte_buffer_len)
+			recv_byte_buffer_len=recv_byte_buffer_pos=0;
+		return ch;
+	}
 
-	if(conn_recv(&ch, sizeof(ch), timeout*1000))
-		return(ch);
-	return(-1);
+	return -1;
 }
 
 #if defined(__BORLANDC__)
@@ -469,6 +479,8 @@ static int recv_byte(void* unused, unsigned timeout /* seconds */)
 #endif
 BOOL data_waiting(void* unused, unsigned timeout)
 {
+	if(recv_byte_buffer_len)
+		return TRUE;
 	return(conn_data_waiting()!=0);
 }
 
@@ -766,14 +778,14 @@ static int guts_send_byte(void* cbdata, uchar ch, unsigned timeout)
 
 static int guts_recv_byte(void* cbdata, unsigned timeout)
 {
-	BOOL	data_waiting;
+	BOOL	data_is_waiting;
 	BYTE	ch;
 	struct GUTS_info *gi=cbdata;
 
-	if(!socket_check(gi->oob_socket, &data_waiting, NULL, timeout*1000))
+	if(!socket_check(gi->oob_socket, &data_is_waiting, NULL, timeout*1000))
 		return(-1);
 
-	if(!data_waiting)
+	if(!data_is_waiting)
 		return(-1);
 
 	if(recv(gi->oob_socket,&ch,1,0)!=1)
@@ -2091,6 +2103,7 @@ BOOL doterm(struct bbslist *bbs)
 	BYTE ooii_init2[] = "\xdb\b \xdb\b \xdb\b[\xdb\b[\xdb\b \xdb\bM\xdb\ba\xdb\bi\xdb\bn\xdb\bt\xdb\be\xdb\bn\xdb\ba\xdb\bn\xdb\bc\xdb\be\xdb\b \xdb\bC\xdb\bo\xdb\bm\xdb\bp\xdb\bl\xdb\be\xdb\bt\xdb\be\xdb\b \xdb\b]\xdb\b]\xdb\b \b\r\n\r\n\x1b[0m\x1b[2J\r\n\r\n\x1b[0;1;30mHX Force retinal scan in progress ... \x1b[0;0;30m";	/* for OOII auto-enable */
 #endif
 	int ooii_mode=0;
+	recv_byte_buffer_len=recv_byte_buffer_pos=0;
 
 	gettextinfo(&txtinfo);
 	if(bbs->conn_type == CONN_TYPE_SERIAL)
@@ -2143,7 +2156,7 @@ BOOL doterm(struct bbslist *bbs)
 		sleep=TRUE;
 		if(!term.nostatus)
 			update_status(bbs, (bbs->conn_type == CONN_TYPE_SERIAL)?bbs->bpsrate:speed, ooii_mode);
-		for(remain=conn_data_waiting() /* Hack for connection check */ + (!conn_connected()); remain; remain--) {
+		for(remain=data_waiting(NULL, 0) /* Hack for connection check */ + (!conn_connected()); remain; remain--) {
 			if(speed)
 				thischar=xp_timer();