diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index d46e00dd8e2479bded10e428b3adac8103797281..b4ab85778691aa81d097cdc78d323614e4f56de6 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -400,6 +400,7 @@ typedef enum {						/* Values for xtrn_t.event				*/
 #define XTRN_LWRCASE	(1<<17)		/* Use lowercase drop-file names		*/
 #define XTRN_SH			(1<<18)		/* Use command shell to execute			*/
 #define XTRN_PAUSE		(1<<19)		/* Force a screen pause on exit			*/
+#define XTRN_NOECHO		(1<<20)		/* Don't echo stdin to stdout			*/
 
 									/* Bits in cfg.xtrn_misc				*/
 #define XTRN_NO_MUTEX	(1<<0)		/* Do not use exec_mutex for FOSSIL VXD	*/
@@ -740,14 +741,15 @@ enum {							/* readmail and delmailidx which types		*/
 #define EX_OUTR     (1<<1)		/* Copy DOS output to remote                */
 #define EX_OUTL 	(1<<2)		/* Use _lputc() for local DOS output		*/
 #define EX_INR		(1<<3)		/* Trap int 16h keyboard input requests     */
-#define EX_WWIV 	(1<<4)		/* Expand WWIV color codes to ANSI sequence */
-#define EX_SWAP 	(1<<5)		/* Swap out for this external				*/
-#define EX_POPEN	(1<<7)		/* Leave COM port open						*/
+#define EX_WWIV 	WWIVCOLOR	/* Expand WWIV color codes to ANSI sequence */
+#define EX_SWAP 	(1<<5)		/* Swap out for this external (*legacy*)	*/
+#define EX_POPEN	(1<<7)		/* Leave COM port open	(*legacy*)			*/
 #define EX_OFFLINE	(1<<8)		/* Run this program offline					*/
 #define EX_BG		(1<<10)		/* Back-ground/detached process				*/
 #define EX_BIN		(1<<11)		/* Binary mode (no Unix LF to CRLF)			*/
-#define EX_NATIVE	(1<<14)		/* Native 32-bit application (XTRN_NATIVE)	*/
-#define EX_CHKTIME	(1<<16)		/* Check time left (XTRN_CHKTIME)			*/
+#define EX_NATIVE	XTRN_NATIVE		/* Native 32-bit application 			*/
+#define EX_CHKTIME	XTRN_CHKTIME	/* Check time left						*/
+#define EX_NOECHO	XTRN_NOECHO		/* Don't echo stdin to stdout 			*/
 
 #if defined(__unix)
 #define EX_WILDCARD	EX_SH		/* Expand wildcards using 'sh' on Unix		*/
diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index 0076954122416d0a3d7ae2848ba695b4626aa4c7..2de68550eb6f80462c788cf79af6504c6a160191 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -788,7 +788,7 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 						&& WriteFile(wrslot,bp,wr,&len,NULL)==TRUE) {
 						RingBufRead(&inbuf, NULL, len);
 						wr=len;
-						if(use_pipes) {
+						if(use_pipes && !(mode&EX_NOECHO)) {
 							/* echo */
 							RingBufWrite(&outbuf, bp, wr);
 						}
diff --git a/src/sbbs3/xtrn_sec.cpp b/src/sbbs3/xtrn_sec.cpp
index a7b0c83ec74ac82b342d7c77c30bd35f3fc32878..dcb7cbbc04ba166b968f6d88ffb022f982b75649 100644
--- a/src/sbbs3/xtrn_sec.cpp
+++ b/src/sbbs3/xtrn_sec.cpp
@@ -1678,26 +1678,15 @@ bool sbbs_t::exec_xtrn(uint xtrnnum)
 		mode|=EX_SH;
 	if(cfg.xtrn[xtrnnum]->misc&IO_INTS)
 		mode|=(EX_OUTR|EX_INR|EX_OUTL);
-	if(cfg.xtrn[xtrnnum]->misc&WWIVCOLOR)
-		mode|=EX_WWIV;
-	if(cfg.xtrn[xtrnnum]->misc&SWAP)
-		mode|=EX_SWAP;
-	if(cfg.xtrn[xtrnnum]->misc&XTRN_NATIVE)
-		mode|=EX_NATIVE;
-	if(cfg.xtrn[xtrnnum]->misc&XTRN_CHKTIME)
-		mode|=EX_CHKTIME;
-	if(cfg.xtrn[xtrnnum]->misc&MODUSERDAT) {	 /* Delete MODUSER.DAT */
+	mode|=(cfg.xtrn[xtrnnum]->misc&(XTRN_CHKTIME|XTRN_NATIVE|XTRN_NOECHO|WWIVCOLOR));
+	if(cfg.xtrn[xtrnnum]->misc&MODUSERDAT) {		/* Delete MODUSER.DAT */
 		sprintf(str,"%sMODUSER.DAT",dropdir);       /* if for some weird  */
 		remove(str); 								/* reason it's there  */
 	}
 
 	start=time(NULL);
 	external(cmdstr(cfg.xtrn[xtrnnum]->cmd,path
-#if 0	/* old way */
-		,dropdir
-#else	/* new way, as of Feb-20-2003 */
 		,cfg.xtrn[xtrnnum]->path
-#endif
 		,NULL)
 		,mode
 		,cfg.xtrn[xtrnnum]->path);