diff --git a/src/sbbs3/sbbsexec.c b/src/sbbs3/sbbsexec.c
index c5c70177f92f16431f9087b609eba06189b7f781..c0bcd5188dff51666dfce455217713d4cfef8fb5 100644
--- a/src/sbbs3/sbbsexec.c
+++ b/src/sbbs3/sbbsexec.c
@@ -49,7 +49,7 @@
 #define INI_FILENAME			"sbbsexec.ini"
 #define RINGBUF_SIZE_IN			10000
 #define DEFAULT_MAX_MSG_SIZE	4000
-#define LINEAR_RX_BUFLEN		5000
+#define LINEAR_RX_BUFLEN		10000
 
 /* UART Parameters and virtual registers */
 WORD uart_io_base				= UART_COM1_IO_BASE;	/* COM1 */
@@ -218,11 +218,21 @@ void _cdecl input_thread(void* arg)
 	char	buf[LINEAR_RX_BUFLEN];
 	int		count;
 
+	lprintf(LOG_DEBUG,"input_thread: started");
 	while(1) {
-		count=0;
-		if(!ReadFile(rdslot,buf,sizeof(buf),&count,NULL)) {
-			if(GetLastError()==ERROR_HANDLE_EOF)	/* closed by VDD_CLOSE */
+		count=RingBufFree(&rdbuf);
+		if(count<1) {
+			lprintf(LOG_WARNING,"input_thread: input buffer full!");
+			YIELD();
+			continue;
+		}
+		if(count>sizeof(buf))
+			count=sizeof(buf);
+		if(!ReadFile(rdslot,buf,count,&count,NULL)) {
+			if(GetLastError()==ERROR_HANDLE_EOF) {	/* closed by VDD_CLOSE */
+				lprintf(LOG_INFO,"input_thread: ReadFile returned EOF");
 				break;
+			}
 			lprintf(LOG_ERR,"!input_thread: ReadFile Error %d (size=%d)"
 				,GetLastError(),count);
 			continue;
@@ -240,6 +250,7 @@ void _cdecl input_thread(void* arg)
 			assert_interrupt(UART_IER_RX_DATA); /* assert rx data interrupt */
 		}
 	}
+	lprintf(LOG_DEBUG,"input_thread: terminated");
 }
 
 unsigned vdd_read(BYTE* p, unsigned count)
@@ -481,7 +492,7 @@ __declspec(dllexport) void __cdecl VDDDispatch(void)
 
 			sprintf(str,"\\\\.\\mailslot\\sbbsexec\\wr%d",node_num);
 			rdslot=CreateMailslot(str
-				,LINEAR_RX_BUFLEN		/* Max message size (0=any) */
+				,0 //LINEAR_RX_BUFLEN		/* Max message size (0=any) */
 				,MAILSLOT_WAIT_FOREVER 	/* Read timeout */
 				,NULL);
 			if(rdslot==INVALID_HANDLE_VALUE) {
@@ -557,7 +568,7 @@ __declspec(dllexport) void __cdecl VDDDispatch(void)
 				_beginthread(interrupt_thread, 0, NULL);
 			}
 
-			lprintf(LOG_DEBUG,"VDD_OPEN: Opened successfully");
+			lprintf(LOG_DEBUG,"VDD_OPEN: Opened successfully (wrslot=%p)", wrslot);
 
 			_beginthread(input_thread, 0, NULL);
 
@@ -645,7 +656,9 @@ __declspec(dllexport) void __cdecl VDDDispatch(void)
 			status = (vdd_status_t*) GetVDMPointer((ULONG)((getES() << 16)|getDI())
 				,count,FALSE); 
 
+			status->inbuf_size=RINGBUF_SIZE_IN;
 			status->inbuf_full=RingBufFull(&rdbuf);
+			msgs=0;
 
 			/* OUTBUF FULL/SIZE */
 			if(!GetMailslotInfo(
@@ -655,9 +668,16 @@ __declspec(dllexport) void __cdecl VDDDispatch(void)
 				&msgs,					/* address of number of messages  */
  				NULL					/* address of read time-out  */
 				)) {
+				lprintf(LOG_ERR,"!VDD_STATUS: GetMailSlotInfo(%p) failed, error %u (msgs=%u, inbuf_full=%u, inbuf_size=%u)"
+					,wrslot
+					,GetLastError(), msgs, status->inbuf_full, status->inbuf_size);
 				status->outbuf_full=0;
 				status->outbuf_size=DEFAULT_MAX_MSG_SIZE;
-			}
+			} else
+				lprintf(LOG_DEBUG,"VDD_STATUS: MailSlot maxmsgsize=%u, nextmsgsize=%u, msgs=%u"
+					,status->outbuf_size
+					,status->outbuf_full
+					,msgs);
 			if(status->outbuf_full==MAILSLOT_NO_MESSAGE)
 				status->outbuf_full=0;
 			status->outbuf_full*=msgs;