diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index 7c4a2b4e4472cd16e154773513446e786580c9ae..45fdbca9b9e1be4d620b16a0ba4fbf448add528c 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -849,6 +849,12 @@ enum {							/* readmail and delmailidx which types		*/
 #define EX_WILDCARD	0
 #endif
 
+#define DOSEMU_NODE_DRIVE	"D:"
+#define DOSEMU_XTRN_DRIVE	"E:"	// Parent of xtrn's startup-dir
+#define DOSEMU_CTRL_DRIVE	"F:"
+#define DOSEMU_DATA_DRIVE	"G:"
+#define DOSEMU_EXEC_DRIVE	"H:"
+
 								/* telnet_gate() mode bits					*/
 #define TG_ECHO			(1<<0)	/* Turn on telnet echo						*/
 #define TG_CRLF			(1<<1)	/* Expand sole CR to CRLF					*/
diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index 9c8b6dee3cd574deb3d865016d92b508396a6f6f..2f3bf34b3c2caf68850afb5bf425239f27a6a94a 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -1216,11 +1216,11 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		/* Default locations that can be overridden by
 		 * the sysop in emusetup.bat */
 
-		const char nodedrive[] = "D:";
-		const char xtrndrive[] = "E:";
-		const char ctrldrive[] = "F:";
-		const char datadrive[] = "G:";
-		const char execdrive[] = "H:";
+		const char nodedrive[] = DOSEMU_NODE_DRIVE;
+		const char xtrndrive[] = DOSEMU_XTRN_DRIVE;
+		const char ctrldrive[] = DOSEMU_CTRL_DRIVE;
+		const char datadrive[] = DOSEMU_DATA_DRIVE;
+		const char execdrive[] = DOSEMU_EXEC_DRIVE;
 
 		SAFECOPY(str,startup_dir);
 		if(*(p=lastchar(str))=='/')		/* kill trailing slash */
diff --git a/src/sbbs3/xtrn_sec.cpp b/src/sbbs3/xtrn_sec.cpp
index 9f74380983e6b649176e7f39b350547f059ee2d0..859cba0ba7d3234faebf61bb8ab0bf4b07f3eaa4 100644
--- a/src/sbbs3/xtrn_sec.cpp
+++ b/src/sbbs3/xtrn_sec.cpp
@@ -193,10 +193,10 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, ulong tl
 		GetShortPathName(cfg.temp_dir,temp_dir,sizeof(temp_dir));
 #elif defined(__linux__) && defined(USE_DOSEMU)
 		/* These drive mappings must match the Linux/DOSEMU patch in xtrn.cpp: */
-		SAFECOPY(node_dir, "D:");
-		SAFECOPY(ctrl_dir, "F:");
-		SAFECOPY(data_dir, "G:");
-		SAFECOPY(exec_dir, "H:");
+		SAFECOPY(node_dir, DOSEMU_NODE_DRIVE);
+		SAFECOPY(ctrl_dir, DOSEMU_CTRL_DRIVE);
+		SAFECOPY(data_dir, DOSEMU_DATA_DRIVE);
+		SAFECOPY(exec_dir, DOSEMU_EXEC_DRIVE);
 #endif
 	}
 
@@ -1606,17 +1606,33 @@ bool sbbs_t::exec_xtrn(uint xtrnnum)
 		removecase(str);							/* reason it's there  */
 	}
 
+	char drop_file[MAX_PATH + 1];
+	char startup_dir[MAX_PATH + 1];
+#if defined(__linux__) && defined(USE_DOSEMU)
+	if(!(cfg.xtrn[xtrnnum]->misc & XTRN_NATIVE)) {
+		SAFEPRINTF(startup_dir, "%s\\%s", DOSEMU_XTRN_DRIVE, getdirname(cfg.xtrn[xtrnnum]->path));
+		backslash(startup_dir);
+		if(cfg.xtrn[xtrnnum]->misc & STARTUPDIR)
+			SAFEPRINTF(drop_file, "%s%s", startup_dir, getfname(path));
+		else
+			SAFEPRINTF(drop_file, "%s\\%s", DOSEMU_NODE_DRIVE, getfname(path));
+	}
+	else
+#endif
+	{
+		SAFECOPY(startup_dir, cfg.xtrn[xtrnnum]->path);
+		SAFECOPY(drop_file, path);
+	}
+
 	start=time(NULL);
-	external(cmdstr(cfg.xtrn[xtrnnum]->cmd,path
-		,cfg.xtrn[xtrnnum]->path
-		,NULL)
+	external(cmdstr(cfg.xtrn[xtrnnum]->cmd, drop_file, startup_dir, NULL)
 		,mode
 		,cfg.xtrn[xtrnnum]->path);
 	end=time(NULL);
 	if(cfg.xtrn[xtrnnum]->misc&FREETIME)
 		starttime+=end-start;
 	if(cfg.xtrn[xtrnnum]->clean[0]) {
-		external(cmdstr(cfg.xtrn[xtrnnum]->clean,path,nulstr,NULL)
+		external(cmdstr(cfg.xtrn[xtrnnum]->clean, drop_file, startup_dir, NULL)
 			,mode&~(EX_STDIN|EX_CONIO), cfg.xtrn[xtrnnum]->path); 
 	}
 	/* Re-open the logfile */