diff --git a/src/sbbs3/dosxtrn/dosxtrn.c b/src/sbbs3/dosxtrn/dosxtrn.c
index d2cf8d362efc86cec9acf89a42291fc90fe22972..2155b14cfdb35b26ade0c5c8645507d3257e3bfc 100644
--- a/src/sbbs3/dosxtrn/dosxtrn.c
+++ b/src/sbbs3/dosxtrn/dosxtrn.c
@@ -61,6 +61,7 @@ str[c]=0;
 short	vdd=0;
 BYTE	node_num=0;
 int		mode=0;
+DWORD	nodata=0;
 
 void (interrupt *oldint14)();
 void (interrupt *oldint16)();
@@ -97,6 +98,10 @@ static int vdd_op(BYTE op)
 {
 	int retval;
 
+#if FALSE	/* disable yield? */
+	if(op==VDD_YIELD)
+		return(0);
+#endif
 	_asm {
 		push	bx
 		mov		ax,	vdd
@@ -155,12 +160,11 @@ WORD PortStatus()
 	if(!vdd_status.outbuf_full)		// output buffer is empty
 		status|=0x4000;				// TSRE
 
-	if(!vdd_status.inbuf_full)		// release time-slice if no input
-		vdd_op(VDD_YIELD);
-
 	return(status);
 }
 
+#define POLLS_BEFORE_YIELD	10
+
 void interrupt winNTint14(
 	unsigned _es, unsigned _ds,
 	unsigned _di, unsigned _si,
@@ -202,17 +206,23 @@ void interrupt winNTint14(
 			_asm mov buf_seg, ss;
 			vdd_buf(VDD_WRITE, 1, buf_seg, (WORD)&ch);
 			_ax = PortStatus();
+			nodata=0;
 			break;
 		case 0x02: /* read char from com port */
 			_asm mov buf_seg, ss;
 			_ax = vdd_buf(VDD_READ, 1, buf_seg, (WORD)&ch);
-			if(!_ax)
+			if(!_ax) {
 				_ax = 0x8000;	/* timed-out */
-			else
+				vdd_op(VDD_YIELD);
+			} else {
 				_ax = ch;
+				nodata=0;
+			}
 			break;
 		case 0x03:	/* request status */
 			_ax=PortStatus();
+			if(_ax==0x6088 && ++nodata>=POLLS_BEFORE_YIELD)
+				vdd_op(VDD_YIELD);
 			break;
 		case 0x04:	/* initialize */
 			_ax=0x1954;	/* magic number = success */
@@ -234,21 +244,32 @@ void interrupt winNTint14(
 			ch=_ax&0xff;
 			_asm mov buf_seg, ss;
 			_ax = vdd_buf(VDD_WRITE, 1, buf_seg, (WORD)&ch);
+			nodata=0;
 			break;
         case 0x0C:	// non-destructive read-ahead
 			vdd_getstatus(&vdd_status);
 			if(!vdd_status.inbuf_full) {
 				_ax=0xffff;	// no char available
+				vdd_op(VDD_YIELD);
 				break;
 			}
 			_asm mov buf_seg, ss;
 			_ax = vdd_buf(VDD_PEEK, 1, buf_seg, (WORD)&ch);
+			if(_ax == 0)
+				vdd_op(VDD_YIELD);
+			else
+				nodata=0;
 			break;
         case 0x18:	/* read bock */
             _ax = vdd_buf(VDD_READ, _cx, _es, _di);
+			if(_ax == 0)
+				vdd_op(VDD_YIELD);
+			else
+				nodata=0;
 			break;
         case 0x19:	/* write block */
 			_ax = vdd_buf(VDD_WRITE, _cx, _es, _di);
+			nodata=0;
 			break;
         case 0x1B:	/* driver info */
 			vdd_getstatus(&vdd_status);
@@ -257,6 +278,10 @@ void interrupt winNTint14(
 			info.outbuf_size=vdd_status.outbuf_size;
 			info.outbuf_free=info.outbuf_size-vdd_status.outbuf_full;
 
+			if(vdd_status.inbuf_full==vdd_status.outbuf_full==0 
+				&& ++nodata>=POLLS_BEFORE_YIELD)
+				vdd_op(VDD_YIELD);			
+
 			p = _MK_FP(_es,_di);
             wr=sizeof(info);
             if(wr>_cx)
@@ -288,8 +313,11 @@ void interrupt winNTint16(
 				_asm mov buf_seg, ss;
 				vdd_buf(VDD_READ, 1, buf_seg, (WORD)&ch);
 				_ax=ch;
+				nodata=0;
 				return;
-			}
+			} 
+			if(++nodata>=POLLS_BEFORE_YIELD)
+				vdd_op(VDD_YIELD);
 			break;
     	case 0x01:	// Get keyboard status
         case 0x11:	// Get enhanced keyboard status
@@ -298,8 +326,11 @@ void interrupt winNTint16(
 				vdd_buf(VDD_PEEK, 1, buf_seg, (WORD)&ch);
                 flags&=~(1<<6);	// clear zero flag
                 _ax=ch;
+				nodata=0;
 				return;
-    	    }
+			}
+			if(++nodata>=POLLS_BEFORE_YIELD)
+				vdd_op(VDD_YIELD);
 	        break;
 	}
 
@@ -320,6 +351,7 @@ void interrupt winNTint29(
 	ch=_ax&0xff;
 	_asm mov buf_seg, ss
 	vdd_buf(VDD_WRITE, 1, buf_seg, (WORD)&ch);
+	nodata=0;
 
 	_chain_intr(oldint29);
 }
@@ -346,13 +378,12 @@ int main(int argc, char **argv)
 			,"This program is for the internal use of Synchronet BBS only\n");
 		return(1);
 	}
-#if 1
+
 	strcpy(dll,argv[0]);
 	p=strrchr(dll,'\\');
 	if(p!=NULL) *(p+1)=0;
 	strcat(dll,"SBBSEXEC.DLL");
 	DllName=dll;
-#endif
 
 	if(argc>2 && !strcmp(argv[2],"NT")) {
 		NT=TRUE;