diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index e48e38bc93ddd9f60d19dc596519f334232d6b77..ac0bcfb2b41c8b6074792a1a43c589642e1a794d 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -1504,16 +1504,24 @@ void output_thread(void* arg)
 		 */
 		if(bufbot == buftop) {
 			/* Wait for something to output in the RingBuffer */
-			if(sem_trywait_block(&sbbs->outbuf.sem,1000))
-				continue;
+			if(!RingBufFull(&sbbs->outbuf)) {
+				if(sem_trywait_block(&sbbs->outbuf.sem,1000))
+					continue;
+			}
+			else
+				sem_trywait(&sbbs->outbuf.sem);
 
 			/* Check for spurious sem post... */
 			if(!RingBufFull(&sbbs->outbuf))
 				continue;
 
 			/* Wait for full buffer or drain timeout */
-			if(sbbs->outbuf.highwater_mark)
-				sem_trywait_block(&sbbs->outbuf.highwater_sem,startup->outbuf_drain_timeout);
+			if(RingBufFull(&sbbs->outbuf)<sbbs->outbuf.highwater_mark) {
+				if(sbbs->outbuf.highwater_mark)
+					sem_trywait_block(&sbbs->outbuf.highwater_sem,startup->outbuf_drain_timeout);
+			}
+			else
+				sem_trywait(&sbbs->outbuf.highwater_sem);
 
 			/*
 			 * At this point, there's something to send and,
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index e03d257fba47c89d55db89506488bc76109f844f..1769812d45ec06b6c2806c21a1fd158005da9806 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -3868,7 +3868,7 @@ void http_output_thread(void *arg)
 		if(!getsockopt(session->socket, IPPROTO_TCP, TCP_MAXSEG, &i, &sl)) {
 			/* Check for sanity... */
 			if(i>100) {
-				obuf->highwater_mark=i;
+				obuf->highwater_mark=i-12;
 				lprintf(LOG_DEBUG,"Autotuning outbuf highwater mark to %d based on MSS",i);
 				mss=obuf->highwater_mark;
 				if(mss>OUTBUF_LEN) {
@@ -3882,17 +3882,26 @@ void http_output_thread(void *arg)
 
 	thread_up(TRUE /* setuid */);
     while(session->socket!=INVALID_SOCKET && !terminate_server) {
+
         /* Wait for something to output in the RingBuffer */
-        if(sem_trywait_block(&obuf->sem,1000))
-            continue;
+        if(!RingBufFull(obuf)) {
+			if(sem_trywait_block(&obuf->sem,1000))
+	            continue;
+		}
+		else
+			sem_trywait(&obuf->sem);
 
         /* Check for spurious sem post... */
         if(!RingBufFull(obuf))
             continue;
 
         /* Wait for full buffer or drain timeout */
-        if(obuf->highwater_mark)
-            sem_trywait_block(&obuf->highwater_sem,startup->outbuf_drain_timeout);
+		if(RingBufFull(obuf)<obuf->highwater_mark) {
+	        if(obuf->highwater_mark)
+    	        sem_trywait_block(&obuf->highwater_sem,startup->outbuf_drain_timeout);
+		}
+		else
+			sem_trywait(&obuf->highwater_sem);
 
         /*
          * At this point, there's something to send and,
@@ -3902,7 +3911,7 @@ void http_output_thread(void *arg)
          */
         len=avail=RingBufFull(obuf);
 		if(avail>mss)
-			len=avail=mss;
+			len=(avail=mss);
 
 		/* 
 		 * Read the current value of write_chunked... since we wait until the