diff --git a/exec/external.bat b/exec/external.bat
index a9a13c9f23082e2debf8fdb2d10f52ca0c365de6..e8224b68cec20a41f135e75632d4d855f1c85e29 100644
--- a/exec/external.bat
+++ b/exec/external.bat
@@ -1,20 +1,23 @@
-@unix -s NODEDIR
-@lredir D: linux\fs%NODEDIR% >NUL
-@lredir E: linux\fs%XTRNDIR% >NUL
-@lredir F: linux\fs%CTRLDIR% >NUL
-@lredir G: linux\fs%DATADIR% >NUL
-@lredir H: linux\fs%EXECDIR% >NUL
+@lredir D: linux\fs$NODEDIR >NUL
+@lredir E: linux\fs$XTRNDIR >NUL
+@lredir F: linux\fs$CTRLDIR >NUL
+@lredir G: linux\fs$DATADIR >NUL
+@lredir H: linux\fs$EXECDIR >NUL
 
 E:
 
-IF NOT "" == "%STARTDIR%" CD %STARTDIR%
+REM Switch to game dir, unless its not defined
+REM If not defined, go to node dir (external editors use this)
+IF "%STARTDIR%"=="" D:
+IF NOT "%STARTDIR%"=="" CD %STARTDIR%
 
 REM Optionally call emusetup.bat or put that stuff here for global (in NOEMU)
 REM Looks in startup dir, then ctrl dir
 IF EXIST EMUSETUP.BAT GOTO EMULOCAL
 IF EXIST F:\EMUSETUP.BAT GOTO EMUGLOBAL
 IF EXIST E:\DOSUTILS\NUL GOTO NOEMU
-ECHO ERROR: No emusetup.bat in E:\%STARTDIR% or F, or E:\DOSUTILS\ is missing
+IF EXIST H:\DOSUTILS\NUL GOTO NOEMU
+ECHO ERROR: No emusetup.bat in E:\%STARTDIR% or F, or DOSUTILS is missing
 GOTO EXEC
 
 :EMULOCAL
@@ -26,7 +29,7 @@ CALL F:\EMUSETUP.BAT
 GOTO EXEC
 
 :NOEMU
-@set PATH=%PATH%;E:\dosutils
+@set PATH=%PATH%;E:\dosutils;H:\dosutils
 unix -s RUNTYPE
 REM fossil driver, such as x00, bnu, or dosemu fossil.com
 rem IF "%RUNTYPE%" == "FOSSIL" @fossil.com >NUL
diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c
index 923b15564ad9e8daeb4af16a92ae6a5817f7f89c..67ab24cfa4e193c45175fa882c201872e5b884df 100644
--- a/src/sbbs3/str_util.c
+++ b/src/sbbs3/str_util.c
@@ -652,7 +652,7 @@ char* ascii_str(uchar* str)
 char* replace_named_values(const char* src	 
     ,char* buf	 
     ,size_t buflen       /* includes '\0' terminator */	 
-    ,char* escape_seq	 
+    ,const char* escape_seq	 
     ,named_string_t* string_list	 
     ,named_int_t* int_list	 
     ,BOOL case_sensitive)	 
diff --git a/src/sbbs3/str_util.h b/src/sbbs3/str_util.h
index 6eab99c95a8ed1cbfc6feadf5fb63cd9d5520ddd..e0657bfe2a17eb7a633b4bc06dca93ec012ad6f7 100644
--- a/src/sbbs3/str_util.h
+++ b/src/sbbs3/str_util.h
@@ -39,9 +39,9 @@ DLLEXPORT char *	remove_ctrl_a(const char* instr, char* outstr);
 DLLEXPORT char 		ctrl_a_to_ascii_char(char code);
 DLLEXPORT char *	truncstr(char* str, const char* set);
 DLLEXPORT char *	ascii_str(uchar* str);
-DLLEXPORT char *	replace_named_values(const char* src ,char* buf, size_t buflen,	 
-				char* escape_seq, named_string_t* string_list,	 
-				named_int_t* int_list, BOOL case_sensitive);
+DLLEXPORT char *    replace_named_values(const char* src ,char* buf, size_t buflen,	 
+                       const char* escape_seq, named_string_t* string_list,	 
+                       named_int_t* int_list, BOOL case_sensitive);
 DLLEXPORT char *	condense_whitespace(char* str);
 DLLEXPORT char		exascii_to_ascii_char(uchar ch);
 DLLEXPORT BOOL		findstr(const char *insearch, const char *fname);
@@ -73,4 +73,4 @@ DLLEXPORT char * 	get_ctrl_dir(BOOL warn);
 #ifdef __cplusplus
 }
 #endif
-#endif /* Don't add anything after this line */
+#endif /* Don't add anything after this line */
\ No newline at end of file
diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index 2a95e0c0667e1c28ce74d168f2b8d8352584c974..bfbf862a3a6fa391e77a6761648be8ca7bd31850 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -1176,7 +1176,7 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 
 #elif defined(__linux__) && defined(USE_DOSEMU)
 
-		/* dosemu integration  --  Ryan Underwood, <nemesis @ icequake.net> */
+		/* dosemu integration  --  originally by Ryan Underwood, <nemesis @ icequake.net> */
 
 		FILE *dosemubatfp;
 		FILE *externalbatfp;
@@ -1265,7 +1265,6 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 				 * error out. */
 				SAFECOPY(str,"/etc/dosemu/dosemu.conf");
 				if (!fexist(str)) {
-
 					SAFECOPY(str,"/etc/dosemu.conf");
 					if (!fexist(str)) {
 						errormsg(WHERE,ERR_READ,str,0);
@@ -1296,44 +1295,45 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		fprintf(dosemubatfp,"SET PCBNODE=%d\r\n",cfg.node_num);
 		fprintf(dosemubatfp,"SET PCBDRIVE=%s\r\n",nodedrive);
 		fprintf(dosemubatfp,"SET PCBDIR=\\\r\n");
-		fprintf(dosemubatfp,"SET XTRNDIR=%s\r\n",xtrndir_dos);
-		fprintf(dosemubatfp,"SET CTRLDIR=%s\r\n",ctrldir_dos);
-		fprintf(dosemubatfp,"SET DATADIR=%s\r\n",datadir_dos);
-		fprintf(dosemubatfp,"SET EXECDIR=%s\r\n",execdir_dos);
-		fprintf(dosemubatfp,"SET NODEDIR=%s\r\n",nodedir_dos);
 
-		const char* gamedir = "";
+		char gamedir[MAX_PATH+1];
 		if(startup_dir!=NULL && startup_dir[0]) {
 			SAFECOPY(str, startup_dir);
 			*lastchar(str) = 0;
-			gamedir = getfname(str);
+			SAFECOPY(gamedir, getfname(str));
 		}
+ 
 		if(*gamedir == 0) {
 			lprintf(LOG_ERR, "No startup directory configured for DOS command-line: %s", cmdline);
 			return -1;
 		}
-		if (startup_dir[0]) {
-			fprintf(dosemubatfp,"SET STARTDIR=%s\r\n",gamedir);
+
+        /* external editors use node dir so unset this */
+		if (startup_dir == cfg.node_dir) {
+		    SAFECOPY(gamedir, "");
 		}
 		
+		fprintf(dosemubatfp,"SET STARTDIR=%s\r\n",gamedir);
+
 		/* now append exec/external.bat (which is editable) to this 
 		 generated file */
 		SAFEPRINTF(str,"%sexternal.bat",startup_dir);
-		if (!fexist(str)) {
+
+		if ((startup_dir == cfg.node_dir) || !fexist(str)) {
 			SAFEPRINTF(str,"%sexternal.bat",cfg.exec_dir);
 			if (!fexist(str)) {
 				errormsg(WHERE,ERR_READ,str,0);
 				return(-1);
 			} 
-			else SAFECOPY(externalbatsrc, str); /* ctrl dir */
 		}
-		else SAFECOPY(externalbatsrc, str); /* startup dir/door dir */
+
+        SAFECOPY(externalbatsrc, str); 
 
 		if (!(externalbatfp=fopen(externalbatsrc,"r"))) {
 			errormsg(WHERE,ERR_OPEN,externalbatsrc,0);
 			return(-1);
-		}		 
-		
+		} 
+
 		/* append the command line to the batch file */
 		SAFECOPY(tok,cmdline);
 		truncstr(tok," ");
@@ -1344,14 +1344,11 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		} else {
 			SAFECOPY(cmdlinebatch, cmdline);
 		}
-		
-		char nodenum[5];
-		SAFEPRINTF(nodenum, "%3u", cfg.node_num);
+
 		named_string_t externalbat_replacements[] = {
 			{(char*)"CMDLINE",cmdlinebatch },
 			{(char*)"DSZLOG",(char*)nodedrive },
 			{(char*)"SBBSNODE",(char*)nodedrive },
-			{(char*)"SBBSNNUM",nodenum },
 			{(char*)"SBBSCTRL",(char*)ctrldrive },
 			{(char*)"SBBSDATA",(char*)datadrive },
 			{(char*)"SBBSEXEC",(char*)execdrive },
@@ -1360,18 +1357,23 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 			{(char*)"DATADIR",datadir_dos },
 			{(char*)"EXECDIR",execdir_dos },
 			{(char*)"NODEDIR",nodedir_dos },
+			{(char*)"STARTDIR",(char*)gamedir },
 			{NULL, NULL }
 		};
-					 
+
+		named_int_t externalbat_int_replacements[] = {
+		    {(char*)"SBBSNNUM", cfg.node_num },
+		};
+
 		while(!feof(externalbatfp)) {
 			if (fgets(buf, sizeof(buf), externalbatfp)!=NULL) {
-				replace_named_values(buf, bufout, sizeof(bufout), (char*)"$", externalbat_replacements, NULL, FALSE);
+				replace_named_values(buf, bufout, sizeof(bufout), "$", externalbat_replacements, 
+				externalbat_int_replacements, FALSE);
 				fprintf(dosemubatfp,"%s",bufout);
 			}
 		}
 
 		fclose(externalbatfp);
-	  
 
 		/* Check the "Stdio Interception" flag from scfg for this door.  If it's
 		 * enabled, we enable doorway mode.  Else, it's vmodem for us, unless
@@ -1432,57 +1434,46 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		/*
 		 * Get the global emu launch command
 		 */
-		str[0] = '\0';
-		 
 		 /* look for file in startup dir */
 		SAFEPRINTF(str,"%sdosemulaunch.ini",startup_dir);
 		if (!fexist(str)) {
-			str[0] = '\0';
-		}
-		 
-		/* look for file in ctrl dir */        
-		if (str[0] == '\0') {            
-			SAFEPRINTF(str,"%sdosemulaunch.ini",cfg.exec_dir);
+	    	/* look for file in ctrl dir */        
+    		SAFEPRINTF(str,"%sdosemulaunch.ini",cfg.exec_dir);
 			if (!fexist(str)) {
-				str[0] = '\0';
+                errormsg(WHERE,ERR_OPEN,"dosemulaunch.ini", 0);
+                return(-1);
 			}
 		}
 		
 		/* if file found, then open and process it */
-		if (str[0] != '\0') {
-			if ((de_launch_inifp=iniOpenFile(str, false))==NULL) {
-				errormsg(WHERE,ERR_OPEN,str, 0);
-				return(-1);
-			}         
-			de_launch_ini = iniReadFile(de_launch_inifp);
-			iniCloseFile(de_launch_inifp);
-			SAFECOPY(de_launch_cmd, "");
-			iniGetString(de_launch_ini, ROOT_SECTION, "cmd", nulstr, de_launch_cmd);
-			if (virtualconf[0] == '\0') {
-				iniGetString(de_launch_ini, "stdio", "cmd", de_launch_cmd, de_launch_cmd);
-			}
-            iniFreeStringList(de_launch_ini);
-
-			named_string_t de_launch_ini_replacements[] = 
-			{
-				 {(char*)"TERM", dosterm}, 
-				 {(char*)"CTRLDIR", cfg.ctrl_dir},
-				 {(char*)"NODEDIR", cfg.node_dir},
-				 {(char*)"DOSEMUBIN", dosemubinloc},
-				 {(char*)"VIRTUALCONF", virtualconf},
-				 {(char*)"DOSEMUCONF", dosemuconf},
-				 {(char*)"EXTBAT", externalbat},
-				 {(char*)"EXTLOG", log_external},
-				 {NULL, NULL}
-			};
-			replace_named_values(de_launch_cmd, fullcmdline, sizeof(fullcmdline), (char*)"$", 
-			de_launch_ini_replacements, NULL, FALSE);
-		}
-		else {
-			errormsg(WHERE,ERR_OPEN,"dosemulaunch.ini", 0);
-			return(-1);
-		}
-	   
+        if ((de_launch_inifp=iniOpenFile(str, false))==NULL) {
+            errormsg(WHERE,ERR_OPEN,str, 0);
+            return(-1);
+        }         
+        de_launch_ini = iniReadFile(de_launch_inifp);
+        iniCloseFile(de_launch_inifp);
+        SAFECOPY(de_launch_cmd, "");
+        iniGetString(de_launch_ini, ROOT_SECTION, "cmd", nulstr, de_launch_cmd);
+        if (virtualconf[0] == '\0') {
+            iniGetString(de_launch_ini, "stdio", "cmd", de_launch_cmd, de_launch_cmd);
+        }
+        iniFreeStringList(de_launch_ini);
+
+        named_string_t de_launch_ini_replacements[] = 
+        {
+             {(char*)"TERM", dosterm}, 
+             {(char*)"CTRLDIR", cfg.ctrl_dir},
+             {(char*)"NODEDIR", cfg.node_dir},
+             {(char*)"DOSEMUBIN", dosemubinloc},
+             {(char*)"VIRTUALCONF", virtualconf},
+             {(char*)"DOSEMUCONF", dosemuconf},
+             {(char*)"EXTBAT", externalbat},
+             {(char*)"EXTLOG", log_external},
+             {NULL, NULL}
+        };
+        replace_named_values(de_launch_cmd, fullcmdline, sizeof(fullcmdline), (char*)"$", 
+        de_launch_ini_replacements, NULL, FALSE);
+
 		/* Drum roll. */      
 		fprintf(dosemubatfp,"REM For debugging: %s\r\n",fullcmdline);
 		fclose(dosemubatfp);