diff --git a/src/sbbs3/sexyz.c b/src/sbbs3/sexyz.c
index b5e8f044e4134f684c7e43fb3b709a371ef70ffe..ae49cc125c9d55d2e66f44715ca8a08471ff38b2 100644
--- a/src/sbbs3/sexyz.c
+++ b/src/sbbs3/sexyz.c
@@ -124,22 +124,38 @@ static BOOL winsock_startup(void)
 
 #endif
 
-/********/
-/* Code */
-/********/
 
 void newline(void)
 {
 	fprintf(statfp,"\n");
 }
 
+int lprintf(int level, char *fmt, ...)
+{
+	va_list argptr;
+	int		retval;
+	FILE*	fp=statfp;
+
+    if(level<LOG_NOTICE)
+		fp=errfp;
+
+    va_start(argptr,fmt);
+    retval = vfprintf(fp,fmt,argptr);
+    va_end(argptr);
+    return(retval);
+}
+
 /**************/
 /* Exit Point */
 /**************/
 void bail(int code)
 {
-	fprintf(statfp,"Terminating\n");
-	YIELD();
+#if !SINGLE_THREADED
+	lprintf(LOG_DEBUG,"Waiting for output buffer to empty...");
+	WaitForSingleObject(outbuf_empty,5000);
+	lprintf(LOG_DEBUG,"\n");
+#endif
+
 	terminate=TRUE;
 //	sem_post(outbuf.sem);
 //	sem_post(outbuf.highwater_sem);
@@ -1279,7 +1295,7 @@ int main(int argc, char **argv)
 
 	RingBufInit(&inbuf, IO_THREAD_BUF_SIZE);
 	RingBufInit(&outbuf, IO_THREAD_BUF_SIZE);
-	outbuf.highwater_mark=1024;
+	outbuf.highwater_mark=1100;
 	outbuf_empty=CreateEvent(NULL,FALSE,TRUE,NULL);
 
 #if 0
@@ -1480,8 +1496,6 @@ int main(int argc, char **argv)
 
 	xm.sock=sock;
 	xm.mode=&mode;
-	xm.errfp=errfp;
-	xm.statfp=statfp;
 
 	zm.sock=sock;
 	zm.mode=&mode;
diff --git a/src/sbbs3/xmodem.c b/src/sbbs3/xmodem.c
index b1e08826b9bdf239246d6b02d71b441d877b4615..11ac1e53dfc9a2568c6db1c3ae1c88d47e368ce8 100644
--- a/src/sbbs3/xmodem.c
+++ b/src/sbbs3/xmodem.c
@@ -41,7 +41,7 @@
 
 #define getcom(t)	recv_byte(xm->sock,t,*xm->mode)
 #define putcom(ch)	send_byte(xm->sock,ch,10,*xm->mode)
-#define newline()	fprintf(xm->statfp,"\n");
+#define newline()
 
 void xmodem_put_nak(xmodem_t* xm)
 {
@@ -97,15 +97,15 @@ int xmodem_get_block(xmodem_t* xm, uchar* block, BOOL hdrblock)
 				newline();
 				if(!can) {			/* must get two CANs in a row */
 					can=1;
-					fprintf(xm->statfp,"Received CAN  Expected SOH, STX, or EOT\n");
+					xm->lprintf(LOG_WARNING,"Received CAN  Expected SOH, STX, or EOT\n");
 					continue; 
 				}
-				fprintf(xm->statfp,"Cancelled remotely\n");
+				xm->lprintf(LOG_WARNING,"Cancelled remotely\n");
 				bail(-1);
 				break;
 			default:
 				newline();
-				fprintf(xm->statfp,"Received %s  Expected SOH, STX, or EOT\n",chr((uchar)i));
+				xm->lprintf(LOG_WARNING,"Received %s  Expected SOH, STX, or EOT\n",chr((uchar)i));
 			case NOINP: 	/* Nothing came in */
 				if(hdrblock || (*xm->mode)&GMODE)
 					return(-1);
@@ -129,7 +129,7 @@ int xmodem_get_block(xmodem_t* xm, uchar* block, BOOL hdrblock)
 		}
 		if(block_num!=(uchar)~i) {
 			newline();
-			fprintf(xm->statfp,"Block number error\n");
+			xm->lprintf(LOG_ERR,"Block number error\n");
 			if(hdrblock || (*xm->mode)&GMODE)
 				return(-1);
 			xmodem_put_nak(xm);
@@ -165,14 +165,14 @@ int xmodem_get_block(xmodem_t* xm, uchar* block, BOOL hdrblock)
 			if(crc==calc_crc)
 				break;
 			newline();
-			fprintf(xm->statfp,"CRC error\n"); 
+			xm->lprintf(LOG_ERR,"CRC error\n"); 
 		}
 		else	/* CHKSUM */
 		{	
 			if(chksum==calc_chksum)
 				break;
 			newline();
-			fprintf(xm->statfp,"Checksum error\n"); 
+			xm->lprintf(LOG_ERR,"Checksum error\n"); 
 		}
 
 		if((*xm->mode)&GMODE) 	/* Don't bother sending a NAK. He's not listening */
@@ -183,7 +183,7 @@ int xmodem_get_block(xmodem_t* xm, uchar* block, BOOL hdrblock)
 
 	if(errors>=MAXERRORS) {
 		newline();
-		fprintf(xm->statfp,"Too many errors\n");
+		xm->lprintf(LOG_ERR,"Too many errors\n");
 		return(-1); 
 	}
 	return(block_num);
@@ -238,7 +238,7 @@ int xmodem_get_ack(xmodem_t* xm, int tries)
 			YIELD();
 			if(getcom(0)==CAN) {
 				newline();
-				fprintf(xm->statfp,"Cancelled remotely\n");
+				xm->lprintf(LOG_WARNING,"Cancelled remotely\n");
 				xmodem_cancel(xm);
 				bail(1); 
 			}
@@ -253,7 +253,7 @@ int xmodem_get_ack(xmodem_t* xm, int tries)
 		if(i==CAN) {
 			if(can) {
 				newline();
-				fprintf(xm->statfp,"Cancelled remotely\n");
+				xm->lprintf(LOG_WARNING,"Cancelled remotely\n");
 				xmodem_cancel(xm);
 				bail(1); 
 			}
@@ -261,7 +261,7 @@ int xmodem_get_ack(xmodem_t* xm, int tries)
 		}
 		if(i!=NOINP) {
 			newline();
-			fprintf(xm->statfp,"Received %s  Expected ACK\n",chr((uchar)i));
+			xm->lprintf(LOG_WARNING,"Received %s  Expected ACK\n",chr((uchar)i));
 			if(i!=CAN)
 				return(0); 
 		} 
diff --git a/src/sbbs3/xmodem.h b/src/sbbs3/xmodem.h
index 116d78c55f8d8a446de946cbe6021070cb956368..146672862f19f9e2410673a9f41dabca1e582e58 100644
--- a/src/sbbs3/xmodem.h
+++ b/src/sbbs3/xmodem.h
@@ -46,11 +46,10 @@ typedef struct {
 
 	SOCKET		sock;	/* socket descriptor */
 	long*		mode;
-	FILE*		statfp;
-	FILE*		errfp;
 	unsigned	block_size;
 	unsigned	ack_timeout;
 	unsigned	byte_timeout;
+	int			(*lprintf)(int level, char *fmt, ...);
 
 } xmodem_t;