diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c
index cd010be2ffd43689caef3448cc4094564e16e539..5a187b5ccec93553e192ab80e0c8da0837cd0c14 100644
--- a/src/syncterm/conn.c
+++ b/src/syncterm/conn.c
@@ -323,16 +323,14 @@ int conn_connect(struct bbslist *bbs)
 	return(conn_api.terminate);
 }
 
-BOOL conn_data_waiting(void)
+size_t conn_data_waiting(void)
 {
 	size_t found;
 
 	pthread_mutex_lock(&(conn_inbuf.mutex));
 	found=conn_buf_bytes(&conn_inbuf);
 	pthread_mutex_unlock(&(conn_inbuf.mutex));
-	if(found)
-		return(TRUE);
-	return(FALSE);
+	return(found);
 }
 
 int conn_close(void)
diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h
index 979ec528bebd5f408c4f9d7e68a52b0a38f37419..29ca18a27154b7b0974b40bc689b0c93b6d5d0ca 100644
--- a/src/syncterm/conn.h
+++ b/src/syncterm/conn.h
@@ -60,7 +60,7 @@ int conn_send(char *buffer, size_t buflen, unsigned int timeout);
 int conn_connect(struct bbslist *bbs);
 int conn_close(void);
 BOOL conn_connected(void);
-BOOL conn_data_waiting(void);
+size_t conn_data_waiting(void);
 void conn_binary_mode_on(void);
 void conn_binary_mode_off(void);
 
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index 816f57258f831ccb3325d452191a2f5ad6675821..2fd2febe514607261a258fc71b845224d24ebc73 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -401,7 +401,7 @@ static int recv_byte(void* unused, unsigned timeout /* seconds */)
 #endif
 BOOL data_waiting(void* unused, unsigned timeout)
 {
-	return(conn_data_waiting());
+	return(conn_data_waiting()!=0);
 }
 
 void draw_transfer_window(char* title)
@@ -1181,6 +1181,7 @@ BOOL doterm(struct bbslist *bbs)
 	int	updated=FALSE;
 	BOOL	sleep;
 	int 	emulation=CTERM_EMULATION_ANSI_BBS;
+	size_t	remain;
 
 	speed = bbs->bpsrate;
 	log_level = bbs->xfer_loglevel;
@@ -1227,7 +1228,7 @@ BOOL doterm(struct bbslist *bbs)
 
 		if(!term.nostatus)
 			update_status(bbs, speed);
-		while(conn_data_waiting() || !conn_connected()) {
+		for(remain=conn_data_waiting() /* Hack for connection check */ + (!conn_connected()); remain; remain--) {
 			if(!speed || thischar < lastchar /* Wrapped */ || thischar >= nextchar) {
 				/* Get remote input */
 				inch=recv_byte(NULL, 0);
@@ -1271,8 +1272,10 @@ BOOL doterm(struct bbslist *bbs)
 							if(inch == gutsinit[j]) {
 								gutsbuf[j]=inch;
 								gutsbuf[++j]=0;
-								if(j==sizeof(gutsinit)) /* Have full sequence */
+								if(j==sizeof(gutsinit)) { /* Have full sequence */
 									guts_transfer(bbs);
+									remain=0;
+								}
 							}
 							else {
 								gutsbuf[j++]=inch;
@@ -1366,6 +1369,7 @@ BOOL doterm(struct bbslist *bbs)
 									else
 										begin_upload(bbs, TRUE);
 									zrqbuf[0]=0;
+									remain=0;
 								}
 							}
 							else {	/* Not a real zrqinit */