diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index bc277f55c41e1eac63f02030eea9c95a6a65d551..b44c88e80a1207b792a314abfe0dfdad7197f597 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -254,6 +254,31 @@ BYTE* telnet_expand(BYTE* inbuf, ulong inlen, BYTE* outbuf, ulong& newlen)
     return(outbuf);
 }
 
+static bool native_executable(scfg_t* cfg, const char* cmdline, long mode)
+{
+	char*	p;
+	char	str[MAX_PATH+1];
+	char	name[64];
+	char	base[64];
+	unsigned i;
+
+	if(mode&EX_NATIVE)
+		return(TRUE);
+
+    SAFECOPY(str,cmdline);				/* Set str to program name only */
+	truncstr(str," ");
+    SAFECOPY(name,getfname(str));
+	SAFECOPY(base,name);
+	if((p=getfext(base))!=NULL)
+		*p=0;
+
+    for(i=0;i<cfg->total_natvpgms;i++)
+        if(stricmp(name,cfg->natvpgm[i]->name)==0
+		|| stricmp(base,cfg->natvpgm[i]->name)==0)
+            break;
+    return(i<cfg->total_natvpgms);
+}
+
 #define XTRN_LOADABLE_MODULE								\
 	if(cmdline[0]=='*') {   /* Baja module or JavaScript */	\
 		SAFECOPY(str,cmdline+1);							\
@@ -342,7 +367,6 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 	char*	env_strings;
 	const char* p_startup_dir;
 	char	path[MAX_PATH+1];
-	char	fname[MAX_PATH+1];
     char	fullcmdline[MAX_PATH+1];
 	char	realcmdline[MAX_PATH+1];
 	char	comspec_str[MAX_PATH+1];
@@ -394,15 +418,7 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 
 	attr(cfg.color[clr_external]);		/* setup default attributes */
 
-    SAFECOPY(str,cmdline);				/* Set str to program name only */
-	truncstr(str," ");
-    SAFECOPY(fname,getfname(str));
-
-    for(i=0;i<cfg.total_natvpgms;i++)
-        if(!stricmp(fname,cfg.natvpgm[i]->name))
-            break;
-    if(i<cfg.total_natvpgms || mode&EX_NATIVE)
-        native=true;
+	native = native_executable(&cfg, cmdline, mode);
 
 	if(mode&EX_SH || strcspn(cmdline,"<>|")!=strlen(cmdline)) 
 		sprintf(comspec_str,"%s /C ", comspec);
@@ -1276,16 +1292,12 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 
 	attr(cfg.color[clr_external]);  /* setup default attributes */
 
+	native = native_executable(&cfg, cmdline, mode);
+
     SAFECOPY(str,cmdline);			/* Set fname to program name only */
 	truncstr(str," ");
     SAFECOPY(fname,getfname(str));
 
-    for(i=0;i<cfg.total_natvpgms;i++)
-        if(!stricmp(fname,cfg.natvpgm[i]->name))
-            break;
-    if(i<cfg.total_natvpgms || mode&EX_NATIVE)
-        native=true;
-
 	sprintf(fullpath,"%s%s",startup_dir,fname);
 	if(startup_dir!=NULL && cmdline[0]!='/' && cmdline[0]!='.' && fexist(fullpath))
 		sprintf(fullcmdline,"%s%s",startup_dir,cmdline);