diff --git a/src/sbbs3/sexyz.c b/src/sbbs3/sexyz.c
index 418f491c3b2f79eccf6384e605317bded4a88624..0f406d05a4a2499d5dcc9a1b8ddfa5e78a5047a2 100644
--- a/src/sbbs3/sexyz.c
+++ b/src/sbbs3/sexyz.c
@@ -412,7 +412,9 @@ int send_byte(void* unused, uchar ch, unsigned timeout)
 		fprintf(statfp,"FLOW");
 		flows++;
 		if(WaitForEvent(outbuf_empty,timeout*1000)!=WAIT_OBJECT_0) {
-			fprintf(statfp,"\n!ERROR Waiting for output buffer to flush\n");
+			fprintf(statfp
+				,"\n!TIMEOUT waiting for output buffer to flush (%u seconds, %u bytes)\n"
+				,timeout, RingBufFull(&outbuf));
 			newline=TRUE;
 			return(-1);
 		}
@@ -592,11 +594,11 @@ BOOL is_connected(void* unused)
 	return socket_check(sock,NULL,NULL,0);
 }
 
-BOOL data_waiting(void* unused)
+BOOL data_waiting(void* unused, unsigned timeout)
 {
 	BOOL rd;
 
-	if(!socket_check(sock,&rd,NULL,0))
+	if(!socket_check(sock,&rd,NULL,timeout))
 		return(FALSE);
 	return(rd);
 }
diff --git a/src/sbbs3/zmodem.c b/src/sbbs3/zmodem.c
index 1a8e56856db2d49573f781ccb020bafab9060ac1..d5afd33f9464da9747b753ac699015b860142645 100644
--- a/src/sbbs3/zmodem.c
+++ b/src/sbbs3/zmodem.c
@@ -70,10 +70,10 @@ static BOOL is_connected(zmodem_t* zm)
 	return(TRUE);
 }
 
-int zmodem_data_waiting(zmodem_t* zm)
+int zmodem_data_waiting(zmodem_t* zm, unsigned timeout)
 {
 	if(zm->data_waiting)
-		return(zm->data_waiting(zm->cbdata));
+		return(zm->data_waiting(zm->cbdata, timeout));
 	return(FALSE);
 }
 
@@ -1421,7 +1421,8 @@ int zmodem_send_from(zmodem_t* zm, FILE* fp, ulong pos, ulong* sent)
 		 * check out that header
 		 */
 
-		while(zmodem_data_waiting(zm) && !zm->cancelled && is_connected(zm)) {
+		while(zmodem_data_waiting(zm, zm->consecutive_errors ? 1000:0) 
+			&& !zm->cancelled && is_connected(zm)) {
 			int type;
 			int c;
 			lprintf(zm,LOG_DEBUG,"Back-channel traffic detected:");
@@ -2030,7 +2031,7 @@ void zmodem_init(zmodem_t* zm, void* cbdata
 				,int	(*send_byte)(void*, uchar ch, unsigned timeout)
 				,int	(*recv_byte)(void*, unsigned timeout)
 				,BOOL	(*is_connected)(void*)
-				,BOOL	(*data_waiting)(void*))
+				,BOOL	(*data_waiting)(void*, unsigned timeout))
 {
 	memset(zm,0,sizeof(zmodem_t));
 
diff --git a/src/sbbs3/zmodem.h b/src/sbbs3/zmodem.h
index 5d6d96d4da15cfaa85e9fe9263ea1b56928d8618..953275f93ab216fcaae4c4a23ce0e7871465355f 100644
--- a/src/sbbs3/zmodem.h
+++ b/src/sbbs3/zmodem.h
@@ -272,7 +272,7 @@ typedef struct {
 	int			(*recv_byte)(void*, unsigned timeout);
 	void		(*progress)(void*, ulong current_pos);
 	BOOL		(*is_connected)(void*);
-	BOOL		(*data_waiting)(void*);
+	BOOL		(*data_waiting)(void*, unsigned timeout);
 
 } zmodem_t;
 
@@ -282,7 +282,7 @@ void		zmodem_init(zmodem_t*, void* cbdata
 						,int	(*send_byte)(void*, BYTE ch, unsigned timeout)
 						,int	(*recv_byte)(void*, unsigned timeout)
 						,BOOL	(*is_connected)(void*)
-						,BOOL	(*data_waiting)(void*)
+						,BOOL	(*data_waiting)(void*, unsigned timeout)
 						);
 char*		zmodem_ver(char *buf);
 const char* zmodem_source(void);