diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index f9e3147c9b8f93fe532474898e1607cf6f118464..f9309fb74238b3b80b901051c2ac9056cf6d2a2c 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -413,8 +413,8 @@ int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
         startup_info.dwFlags|=STARTF_USESHOWWINDOW;
     }
 
-	/* temporary */
 	if(native) {
+		/* temporary */
 		FILE* fp;
 		sprintf(fname,"%sDOOR32.SYS",cfg.node_dir);
 		fp=fopen(fname,"wb");
@@ -430,6 +430,8 @@ int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
 			,useron.misc&ANSI ? 1 : 0
 			,cfg.node_num);
 		fclose(fp);
+
+		/* not temporary */
 		SuspendThread(input_thread);
 	}
 
@@ -722,7 +724,9 @@ int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
 int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
 {
 	char	str[256];
+	char	fname[128];
 	char*	p;
+    bool	native=false;			// DOS program by default
 		
 	if(cmdline[0]=='*') {   /* Baja module */
 		sprintf(str,"%.*s",sizeof(str)-1,cmdline+1);
@@ -733,9 +737,50 @@ int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
 		return(exec_bin(str,&main_csi)); 
 	}
 
-	bprintf("\r\nExternal programs are not yet supported in Synchronet for Linux\r\n");
+	attr(cfg.color[clr_external]);        /* setup default attributes */
+
+    strcpy(str,cmdline);		/* Set str to program name only */
+    p=strchr(str,SP);
+    if(p) *p=0;
+    strcpy(fname,str);
+
+    p=strrchr(fname,'/');
+    if(!p) p=strrchr(fname,'\\');
+    if(!p) p=strchr(fname,':');
+    if(!p) p=fname;
+    else   p++;
+
+    for(i=0;i<cfg.total_natvpgms;i++)
+        if(!stricmp(p,cfg.natvpgm[i]->name))
+            break;
+    if(i<cfg.total_natvpgms || mode&EX_NATIVE)
+        native=true;
+
+	if(!native) {
+		bprintf("\r\nExternal DOS programs are not yet supported in Synchronet for Linux\r\n");
+		return(-1);
+	}
+
+ 	if(native) { // Native (32-bit) external
+
+		// Current environment passed to child process
+		sprintf(dszlog,"DSZLOG=%sPROTOCOL.LOG",cfg.node_dir);
+		if(putenv(dszlog)) 		/* Makes the DSZ LOG active */
+        	errormsg(WHERE,ERR_WRITE,"environment",0);
+		sprintf(sbbsnode,"SBBSNODE=%s",cfg.node_dir);
+		putenv(sbbsnode);		/* create environment var to contain node num */
+		sprintf(sbbsnnum,"SBBSNNUM=%d",cfg.node_num);
+		putenv(sbbsnnum);	   /* create environment var to contain node num */
+
+	} else {
+		/* setup DOSemu env here */
+	}
+
+	if(startup_dir!=NULL && startup_dir[0])
+		chdir(startup_dir);
+
+	system(cmdline);	/* This is going to be a lot of work for me... :-) */
 
-//	system(cmdline);	This is going to be a lot of work for me... :-)
 	return(0);
 }