diff --git a/ctrl/dosemu1.conf b/ctrl/dosemu1.conf
new file mode 100644
index 0000000000000000000000000000000000000000..811ae914c64f82e620f87b5a64cf20fba650d27e
--- /dev/null
+++ b/ctrl/dosemu1.conf
@@ -0,0 +1,20 @@
+$_cpu = "80486"
+$_cpu_emu = "fullsim"
+$_floppy_a = ""
+$_cdrom = ""
+$_xms = (1024)
+$_ems = (1024)
+$_ems_frame = (0xe000)
+$_external_char_set = "cp437"
+$_internal_char_set = "cp437"
+$_term_updfreq = (8)
+$_layout = "us"
+$_rawkeyboard = (auto)
+$_mouse_internal = (on)
+$_mouse_dev = ""
+$_joy_device = ""
+$_lpt1 = ""
+$_lp2 = ""
+$_speaker = ""
+$_sound = (off)
+$_sb_dsp = ""
diff --git a/ctrl/sbbs.ini b/ctrl/sbbs.ini
index b83519c86805740880cea7947befd6ee790a052f..e1f4967a11017628b5d3d825ae3bd411e866ed93 100644
--- a/ctrl/sbbs.ini
+++ b/ctrl/sbbs.ini
@@ -98,8 +98,9 @@
 ; Must install install/termcap or terminfo to use the following TERM setting:
 ; ExternalTermANSI = ansi-bbs
 	ExternalTermDumb = dumb
-; To change the default dosemu/doscmd path, uncomment and set:
-;       DOSemuPath =
+; To setup the dosemu cmd path and ini:
+;DOSemuPath = /usr/bin/dosemu.bin
+;DOSemuConfPath = /etc/dosemu/dosemu.conf
 
 ; At what size to send the current output buffer regardless of timeout
 ; ie: Send output whenever there are at least this many bytes waiting.
diff --git a/install/GNUmakefile b/install/GNUmakefile
index 7b6abd6a4ce375d8e5642c4e61e1938533cfeff0..e10ce423e64b9b4aa82445d4f3296df610c4dc5a 100644
--- a/install/GNUmakefile
+++ b/install/GNUmakefile
@@ -28,7 +28,6 @@
 # NO_X = Don't include build conio library (ciolib) for X
 # NO_GTK = Don't build GTK-based sysop tools
 # X_PATH = /path/to/X (if not /usr/X11R6)
-# USE_DOSEMU = Set to 1 to enable Linux-DOSEMU support
 
 # the magic bit:
 MKFLAGS += MAKEFLAGS=
@@ -131,10 +130,6 @@ ifdef X_PATH
  MKFLAGS	+=	X_PATH=$(X_PATH)
 endif
 
-ifdef USE_DOSEMU
- MKFLAGS	+=	USE_DOSEMU=$(USE_DOSEMU)
-endif
-
 # Check for GLADE
 ifndef NO_GTK
  ifeq ($(shell pkg-config libglade-2.0 --exists && echo YES),YES)
diff --git a/src/sbbs3/CMakeLists.txt b/src/sbbs3/CMakeLists.txt
index 88947d97ea87867411fabdda0c742540e437b116..a475dc78542ba9ff94e1b5baaad1a372edd5db61 100644
--- a/src/sbbs3/CMakeLists.txt
+++ b/src/sbbs3/CMakeLists.txt
@@ -5,11 +5,6 @@ cmake_minimum_required(VERSION 2.8.11)
 INCLUDE (../build/SynchronetMacros.cmake)
 INCLUDE (CheckFunctionExists)
 
-if(UNIX)
-	set(SBBS_USE_DOSEMU FALSE
-		CACHE BOOL "Set if you intend on using dosemu on Linux"
-	)
-endif()
 set(SBBS_BUILD_JSDOCS FALSE
 	CACHE INTERNAL "DEVELOPER ONLY - Build only to run jsdocs.js (not a BBS)"
 )
diff --git a/src/sbbs3/GNUmakefile b/src/sbbs3/GNUmakefile
index b5446d7b7580efefb4df80e7601df0765e8ba507..6a7f6b068ae32e9b6563c16e78d44055276e309c 100644
--- a/src/sbbs3/GNUmakefile
+++ b/src/sbbs3/GNUmakefile
@@ -11,8 +11,6 @@
 # Optional build targets: dlls, utils, mono, all (default)				#
 #########################################################################
 
-# $Id: GNUmakefile,v 1.248 2020/04/03 19:54:31 rswindell Exp $
-
 PWD	:=	$(shell pwd)
 SRC_ROOT	?=	${PWD}/..
 include $(SRC_ROOT)/build/Common.gmake
@@ -43,10 +41,6 @@ ifdef PREFIX
  CFLAGS += -DPREFIX=$(PREFIX)
 endif
 
-ifdef USE_DOSEMU
- CFLAGS += -DUSE_DOSEMU
-endif
-
 ifdef DONT_BLAME_SYNCHRONET
  CFLAGS += -DDONT_BLAME_SYNCHRONET
 endif
diff --git a/src/sbbs3/chk_ar.cpp b/src/sbbs3/chk_ar.cpp
index 88842c7a03ebd0af0f770366c6e0fb9f95976f7e..3cf9510822736f3c42a5f4da163e0a2cbe77fdfe 100644
--- a/src/sbbs3/chk_ar.cpp
+++ b/src/sbbs3/chk_ar.cpp
@@ -223,7 +223,7 @@ bool sbbs_t::ar_exp(const uchar **ptrptr, user_t* user, client_t* client)
 				result=_not;
 				if(startup->options&BBS_OPT_NO_DOS)
 					break;
-				#if defined(_WIN32) || (defined(__linux__) && defined(USE_DOSEMU)) || defined(__FreeBSD__)
+				#if defined(_WIN32) || defined(__linux__) || defined(__FreeBSD__)
 					result=!_not;
 				#endif
 				break;
diff --git a/src/sbbs3/install/sbbsinst.c b/src/sbbs3/install/sbbsinst.c
index 60fa9a9d79c35b0b52cb925bf207e1d1f2575331..9cdb03536f38491bcf04a58d8c3177c81c8bbd0d 100644
--- a/src/sbbs3/install/sbbsinst.c
+++ b/src/sbbs3/install/sbbsinst.c
@@ -121,9 +121,6 @@ struct {
 	struct utsname	name;	
 	char	sbbsuser[9];		/* Historical UName limit of 8 chars */
 	char	sbbsgroup[17];		/* Can't find historical limit for group names */
-#ifdef __linux__
-	BOOL	use_dosemu;
-#endif
 } params; /* Build parameters */
 
 #define MAKEFILE "/tmp/SBBSmakefile"
@@ -230,9 +227,6 @@ int main(int argc, char **argv)
 		SAFECOPY(params.sbbsuser,p);
 	if((p=getenv("GROUP"))!=NULL)
 		SAFECOPY(params.sbbsgroup,p);
-#ifdef __linux__
-	params.use_dosemu=FALSE;
-#endif
 
 	sscanf("$Revision: 1.100 $", "%*s %s", revision);
 	umask(077);
@@ -380,9 +374,7 @@ int main(int argc, char **argv)
 		sprintf(mopt[i++],"%-27.27s%s","Make Command-line",params.make_cmdline);
 		sprintf(mopt[i++],"%-27.27s%s","File Owner",params.sbbsuser);
 		sprintf(mopt[i++],"%-27.27s%s","File Group",params.sbbsgroup);
-#ifdef __linux__
-		sprintf(mopt[i++],"%-27.27s%s","Integrate DOSEmu support",params.use_dosemu?"Yes":"No");
-#endif
+
 		sprintf(mopt[i++],"%-27.27s","Start Installation...");
 		mopt[i][0]=0;
 
@@ -488,26 +480,8 @@ int main(int argc, char **argv)
 								"\n";
 				uifc.input(WIN_MID,0,0,"",params.sbbsgroup,32,K_EDIT);
 				break;
-#ifdef __linux__
-			case 11:
-				strcpy(opt[0],"Yes");
-				strcpy(opt[1],"No");
-				opt[2][0]=0;
-				i=params.use_dosemu?0:1;
-				uifc.helpbuf=	"`Include DOSEmu Support`\n"
-								"\nToDo: Add help.";
-				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-					,"Integrate DOSEmu support into Synchronet?",opt);
-				if(!i)
-					params.use_dosemu=TRUE;
-				else if(i==1)
-					params.use_dosemu=FALSE;
-				i=0;
-				break;
-			case 12:
-#else
+
 			case 11:
-#endif
 				install_sbbs(distlist[dist],distlist[dist]->type==LOCAL_FILE?NULL:distlist[dist]->servers[server]);
 				bail(0);
 				break;
@@ -754,11 +728,6 @@ void install_sbbs(dist_t *dist,struct server_ent_t *server)  {
 		sprintf(sbbsgroup,"SBBSGROUP=%s",params.sbbsgroup);
 		putenv(sbbsgroup);
 	}
-#ifdef __linux__
-	if(params.use_dosemu==TRUE) {
-		putenv("USE_DOSEMU=1");
-	}
-#endif
 
 	if(params.usebcc)
 		putenv("bcc=1");
diff --git a/src/sbbs3/sbbs_ini.c b/src/sbbs3/sbbs_ini.c
index 0454ec9566fd1b7d286fcf3a209b98636ca787f8..f42808d34ee226f9c6725e3e6f40707f6d5e693f 100644
--- a/src/sbbs3/sbbs_ini.c
+++ b/src/sbbs3/sbbs_ini.c
@@ -251,6 +251,7 @@ void sbbs_read_ini(
 	const char*	section;
 	const char* default_term_ansi;
 	const char*	default_dosemu_path;
+	const char*	default_dosemuconf_path;
 	char		value[INI_MAX_VALUE_LEN];
 	str_list_t	list;
 	global_startup_t global_buf;
@@ -366,10 +367,14 @@ void sbbs_read_ini(
 		default_dosemu_path="/usr/local/bin/doscmd";
 	#else
 		default_dosemu_path="/usr/bin/dosemu.bin";
+		default_dosemuconf_path="";
 	#endif
 
+		bbs->usedosemu=iniGetBool(list,section,"UseDOSemu",TRUE);
 		SAFECOPY(bbs->dosemu_path
 			,iniGetString(list,section,"DOSemuPath",default_dosemu_path,value));
+		SAFECOPY(bbs->dosemuconf_path
+			,iniGetString(list,section,"DOSemuConfPath",default_dosemuconf_path,value));			
 
 		SAFECOPY(bbs->answer_sound
 			,iniGetString(list,section,strAnswerSound,nulstr,value));
@@ -839,7 +844,10 @@ BOOL sbbs_write_ini(
 			break;
 		if(!iniSetString(lp,section,"DOSemuPath",bbs->dosemu_path,&style))
 			break;
-
+		if(!iniSetString(lp,section,"DOSemuConfPath",bbs->dosemuconf_path,&style))
+			break;
+		if(!iniSetBool(lp,section,"UseDOSemu",bbs->usedosemu,&style))
+			break;
 		if(!iniSetString(lp,section,strAnswerSound,bbs->answer_sound,&style))
 			break;
 		if(!iniSetString(lp,section,strHangupSound,bbs->hangup_sound,&style))
diff --git a/src/sbbs3/startup.h b/src/sbbs3/startup.h
index ad869edfe8adf0e48dceca8fe219877d4ef4c1db..e4febaaa63fdb9c4628f96c14908248804de37dc 100644
--- a/src/sbbs3/startup.h
+++ b/src/sbbs3/startup.h
@@ -113,12 +113,14 @@ typedef struct {
 	/* Paths */
     char    ctrl_dir[128];
     char	dosemu_path[128];
+    char    dosemuconf_path[128];
     char	temp_dir[128];
 	char	answer_sound[128];
 	char	hangup_sound[128];
 	char	ini_fname[128];
 
 	/* Miscellaneous */
+	BOOL    usedosemu;
 	char	xtrn_term_ansi[32];		/* external ANSI terminal type (e.g. "ansi-bbs") */
 	char	xtrn_term_dumb[32];		/* external dumb terminal type (e.g. "dumb") */
 	char	host_name[128];
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 1ffd3cd7cab783f7b5c538a18605fa5d1b835b16..883b5d7c1e6cb965f4116173f19f7ad8371264a3 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -1725,7 +1725,7 @@ static BOOL ar_exp(scfg_t* cfg, uchar **ptrptr, user_t* user, client_t* client)
 				#endif
 				break;
 			case AR_DOS:
-				#if defined(_WIN32) || (defined(__linux__) && defined(USE_DOSEMU)) || defined(__FreeBSD__)
+				#if defined(_WIN32) || defined(__linux__) || defined(__FreeBSD__)
 					result=!not;
 				#else
 					result=not;
diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index bb057f967ee020f2fb597b1e84f47755353f96f8..eb044325be403221e6c64e43d8e2b5c1e0cbf84a 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -1174,7 +1174,7 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		SAFECOPY(str,fullcmdline);
 		sprintf(fullcmdline,"%s -F %s",startup->dosemu_path,str);
 
-#elif defined(__linux__) && defined(USE_DOSEMU)
+#elif defined(__linux__)
 
 		/* dosemu integration  --  originally by Ryan Underwood, <nemesis @ icequake.net> */
 
@@ -1250,6 +1250,27 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		p=lastchar(nodedir_dos);
 		if (*p=='\\') *p=0;
 
+		/* must have sbbs.ini bbs useDOSemu=1 (or empty), cannot be =0 */
+		if (!startup->usedosemu) {
+			lprintf((mode&EX_OFFLINE) ? LOG_ERR : LOG_WARNING, "DOSEMU disabled, program not run");
+			bprintf("Sorry, DOSEMU is not supported on this node.\r\n");
+			return -1;
+		}
+
+		/* must have sbbs.ini bbs DOSemuPath set to valid path */
+		SAFECOPY(dosemubinloc,(cmdstr(startup->dosemu_path,nulstr,nulstr,tok)));
+		if (dosemubinloc[0] == '\0') {
+			lprintf((mode&EX_OFFLINE) ? LOG_ERR : LOG_WARNING, "DOSEMU invalid DOSEmuPath, program not run");
+			bprintf("Sorry, DOSEMU is not supported on this node.\r\n");
+			return -1;
+		}
+
+		if (!fexist(dosemubinloc)) {
+			lprintf((mode&EX_OFFLINE) ? LOG_ERR : LOG_WARNING, "DOSEMU not found: %s", dosemubinloc);
+			bprintf("Sorry, DOSEMU is not supported on this node.\r\n");
+			return -1;
+		}
+
 		/* check for existence of a dosemu.conf in the door directory.
 		 * It is a good idea to be able to use separate configs for each
 		 * door. 
@@ -1258,9 +1279,8 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		 */
 		sprintf(str,"%sdosemu.conf",startup_dir);
 		if (!fexist(str)) {
-			/* If we can't find it in the door dir, look for a global one
-			 * in the ctrl dir. */
-			sprintf(str,"%sdosemu.conf",cfg.ctrl_dir);
+			/* If we can't find it in the door dir, look for the configured one */
+			SAFECOPY(str,(cmdstr(startup->dosemuconf_path,nulstr,nulstr,tok)));
 			if (!fexist(str)) {
 				/* If we couldn't find either, try for the system one, then
 				 * error out. */
@@ -1396,18 +1416,6 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 
 		mode |= EX_STDIO;
 
-		/* See if we have the dosemu link in the door's dir.  If so, use the dosemu
-		 * that it points to as our command to execute.  If not, use DOSemuPath.
-		 */
-
-		sprintf(str,"%sdosemu.bin",startup_dir);
-		if (!fexist(str)) {
-			SAFECOPY(dosemubinloc,(cmdstr(startup->dosemu_path,nulstr,nulstr,tok)));
-		}
-		else {
-			SAFECOPY(dosemubinloc,str);
-		}
-
 		/* Attempt to keep dosemu from prompting for a disclaimer. */
 
 		sprintf(str, "%s/.dosemu", cfg.ctrl_dir);
@@ -1928,7 +1936,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     strncat(cmd,ultoa((ulong)cur_cps*10,str,10), avail);
                     break;
                 case 'F':   /* File path */
-#if defined(__linux__) && defined(USE_DOSEMU)
+#if defined(__linux__)
 					if(!native && strncmp(fpath, cfg.node_dir, strlen(cfg.node_dir)) == 0) {
 						strncat(cmd, DOSEMU_NODE_DIR, avail);
 						strncat(cmd, fpath + strlen(cfg.node_dir), avail);
@@ -1938,7 +1946,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
 						strncat(cmd,QUOTED_STRING(instr[i],fpath,str,sizeof(str)), avail);
                     break;
                 case 'G':   /* Temp directory */
-#if defined(__linux__) && defined(USE_DOSEMU)
+#if defined(__linux__)
 					if(!native)
 						strncat(cmd, DOSEMU_TEMP_DIR, avail);
 					else
@@ -1952,7 +1960,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     strncat(cmd,cid, avail);
                     break;
                 case 'J':
-#if defined(__linux__) && defined(USE_DOSEMU)
+#if defined(__linux__)
 					if(!native)
 						strncat(cmd, DOSEMU_DATA_DIR, avail);
 					else
@@ -1960,7 +1968,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
 						strncat(cmd,cfg.data_dir, avail);
                     break;
                 case 'K':
-#if defined(__linux__) && defined(USE_DOSEMU)
+#if defined(__linux__)
 					if(!native)
 						strncat(cmd, DOSEMU_CTRL_DIR, avail);
 					else
@@ -1974,7 +1982,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     strncat(cmd,ultoa(useron.min,str,10), avail);
                     break;
                 case 'N':   /* Node Directory (same as SBBSNODE environment var) */
-#if defined(__linux__) && defined(USE_DOSEMU)
+#if defined(__linux__)
 					if(!native)
 						strncat(cmd, DOSEMU_NODE_DIR, avail);
 					else
@@ -2019,7 +2027,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     strncat(cmd,comspec, avail);
                     break;
                 case 'Z':
-#if defined(__linux__) && defined(USE_DOSEMU)
+#if defined(__linux__)
 					if(!native)
 						strncat(cmd, DOSEMU_TEXT_DIR, avail);
 					else
@@ -2037,7 +2045,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
 #endif
 					break;
                 case '!':   /* EXEC Directory */
-#if defined(__linux__) && defined(USE_DOSEMU)
+#if defined(__linux__)
 					if(!native)
 						strncat(cmd, DOSEMU_EXEC_DIR, avail);
 					else
diff --git a/src/sbbs3/xtrn_sec.cpp b/src/sbbs3/xtrn_sec.cpp
index 33cc509d4d54b3b5fb4738cfd54fb188850c44c8..60afb07da64bd285cc9eafbc6b26c1674dd03d5d 100644
--- a/src/sbbs3/xtrn_sec.cpp
+++ b/src/sbbs3/xtrn_sec.cpp
@@ -1594,7 +1594,7 @@ bool sbbs_t::exec_xtrn(uint xtrnnum)
 
 	char drop_file[MAX_PATH + 1];
 	char startup_dir[MAX_PATH + 1];
-#if defined(__linux__) && defined(USE_DOSEMU)
+#if defined(__linux__)
 	if(cfg.xtrn[xtrnnum]->cmd[0] != '?' && cfg.xtrn[xtrnnum]->cmd[0] != '*'	&& !(cfg.xtrn[xtrnnum]->misc & XTRN_NATIVE)) {
 		SAFEPRINTF2(startup_dir, "%s\\%s", DOSEMU_XTRN_DRIVE, getdirname(cfg.xtrn[xtrnnum]->path));
 		backslash(startup_dir);