diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp
index 9dafc9668e26298a0f139430d96931e73c8840c0..2f64c0f635df35e14c7acf500d7aa8321de5e93d 100644
--- a/src/sbbs3/logon.cpp
+++ b/src/sbbs3/logon.cpp
@@ -487,9 +487,9 @@ bool sbbs_t::logon()
 			errormsg(WHERE, ERR_WRITE, path, strlen(str));
 	}
 
-	if(cfg.sys_logon[0]) {				/* execute system logon event */
-		lprintf(LOG_DEBUG, "executing logon event: %s", cfg.sys_logon);
-		external(cmdstr(cfg.sys_logon,nulstr,nulstr,NULL),EX_STDOUT); /* EX_SH */
+	if(cfg.sys_logon.cmd[0] && !(cfg.sys_logon.misc & EVENT_DISABLED)) {				/* execute system logon event */
+		lprintf(LOG_DEBUG, "executing logon event: %s", cfg.sys_logon.cmd);
+		external(cmdstr(cfg.sys_logon.cmd,nulstr,nulstr,NULL), EX_STDOUT | cfg.sys_logon.misc); /* EX_SH */
 	}
 
 	if(sys_status&SS_QWKLOGON)
diff --git a/src/sbbs3/logout.cpp b/src/sbbs3/logout.cpp
index 8eb75ef990e98c91e78454d9eb03128f4d94c3e7..11e997b018795e237b6dc29aa096656c30678d92 100644
--- a/src/sbbs3/logout.cpp
+++ b/src/sbbs3/logout.cpp
@@ -74,9 +74,9 @@ void sbbs_t::logout(bool logged_in)
 			}
 
 	if(!online) {		/* NOT re-login */
-		if(cfg.sys_logout[0]) {		/* execute system logout event */
-			lprintf(LOG_DEBUG, "executing logout event: %s", cfg.sys_logout);
-			external(cmdstr(cfg.sys_logout,nulstr,nulstr,NULL),EX_OUTL|EX_OFFLINE);
+		if(cfg.sys_logout.cmd[0] && !(cfg.sys_logout.misc & EVENT_DISABLED)) {		/* execute system logout event */
+			lprintf(LOG_DEBUG, "executing logout event: %s", cfg.sys_logout.cmd);
+			external(cmdstr(cfg.sys_logout.cmd,nulstr,nulstr,NULL), EX_OUTL | EX_OFFLINE | cfg.sys_logout.misc);
 		}
 	}
 
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index d4d2f7d9ff667b8ea3032278df986e99cb4dce76..24eb7e0cb8435afde8f9e49b508b665d692c1d0f 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -3092,7 +3092,7 @@ void event_thread(void* arg)
 					sbbs->getnodedat(i,&node,1);
 					node.status=NODE_EVENT_RUNNING;
 					sbbs->putnodedat(i,&node);
-					if(sbbs->cfg.node_daily[0]) {
+					if(sbbs->cfg.node_daily.cmd[0] && !(sbbs->cfg.node_daily.misc & EVENT_DISABLED)) {
 						sbbs->cfg.node_num=i;
 						SAFECOPY(sbbs->cfg.node_dir, sbbs->cfg.node_path[i-1]);
 
@@ -3100,8 +3100,8 @@ void event_thread(void* arg)
 						sbbs->online=ON_LOCAL;
 						sbbs->console|=CON_L_ECHO;
 						sbbs->logentry("!:","Run node daily event");
-						const char* cmd = sbbs->cmdstr(sbbs->cfg.node_daily,nulstr,nulstr,NULL);
-						int result = sbbs->external(cmd, EX_OFFLINE);
+						const char* cmd = sbbs->cmdstr(sbbs->cfg.node_daily.cmd,nulstr,nulstr,NULL);
+						int result = sbbs->external(cmd, EX_OFFLINE | sbbs->cfg.node_daily.misc);
 						sbbs->lprintf(result ? LOG_ERR : LOG_INFO, "Node daily event: '%s' returned %d", cmd, result);
 						sbbs->console&=~CON_L_ECHO;
 						sbbs->online=false;
@@ -4834,19 +4834,19 @@ void sbbs_t::daily_maint(void)
 		smb_close(&smb);
 	}
 
-	if(cfg.sys_daily[0]) {
+	if(cfg.sys_daily.cmd[0] && !(cfg.sys_daily.misc & EVENT_DISABLED)) {
 		lputs(LOG_INFO, "DAILY: Running system event");
-		const char* cmd = cmdstr(cfg.sys_daily,nulstr,nulstr,NULL);
+		const char* cmd = cmdstr(cfg.sys_daily.cmd,nulstr,nulstr,NULL);
 		online = ON_LOCAL;
-		int result = external(cmd, EX_OFFLINE);
+		int result = external(cmd, EX_OFFLINE | cfg.sys_daily.misc);
 		online = false;
 		lprintf(result ? LOG_ERR : LOG_INFO, "Daily event: '%s' returned %d", cmd, result);
 	}
-	if((sys_status & SS_NEW_MONTH) && cfg.sys_monthly[0]) {
+	if((sys_status & SS_NEW_MONTH) && cfg.sys_monthly.cmd[0] && !(cfg.sys_monthly.misc & EVENT_DISABLED)) {
 		lputs(LOG_INFO, "DAILY: Running monthly event");
-		const char* cmd = cmdstr(cfg.sys_monthly,nulstr,nulstr,NULL);
+		const char* cmd = cmdstr(cfg.sys_monthly.cmd,nulstr,nulstr,NULL);
 		online = ON_LOCAL;
-		int result = external(cmd, EX_OFFLINE);
+		int result = external(cmd, EX_OFFLINE | cfg.sys_monthly.misc);
 		online = false;
 		lprintf(result ? LOG_ERR : LOG_INFO, "Monthly event: '%s' returned %d", cmd, result);
 	}
diff --git a/src/sbbs3/scfg/scfg.h b/src/sbbs3/scfg/scfg.h
index bf45bcffd6a9ec3b264f7a6f33add44975690afe..73d7089e9deb438e19ed951d8ba8edf539c3255b 100644
--- a/src/sbbs3/scfg/scfg.h
+++ b/src/sbbs3/scfg/scfg.h
@@ -171,6 +171,7 @@ void sort_subs(int grpnum);
 void sort_dirs(int libnum);
 int subs_in_group(int grpnum);
 char random_code_char(void);
+void fevent_cfg(const char* name, fevent_t* event);
 const char* io_method(uint32_t mode);
 void choose_io_method(uint32_t* misc);
 bool load_main_cfg(scfg_t*, char*, size_t);
diff --git a/src/sbbs3/scfg/scfgnode.c b/src/sbbs3/scfg/scfgnode.c
index b731abedd75a78880a4fb663e6d0114bbcdcee8d..5d09bcaec83f10e26aa943acd616a4a5aa0d7dee 100644
--- a/src/sbbs3/scfg/scfgnode.c
+++ b/src/sbbs3/scfg/scfgnode.c
@@ -197,7 +197,7 @@ void node_cfg()
 		snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Phone Number",cfg.node_phone);
 		snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Login Requirements",cfg.node_arstr);
 		snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Keep Node File Open",cfg.node_misc&NM_CLOSENODEDAB ? "No":"Yes");
-		snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Daily Event",cfg.node_daily);
+		snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Daily Event", (cfg.node_daily.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.node_daily.cmd);
 		snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Node Directory",cfg.node_path[cfg.node_num-1]);
 		snprintf(opt[i++], MAX_OPLN, "%-27.27s%s","Text Directory",cfg.text_dir);
 		opt[i][0]=0;
@@ -265,8 +265,7 @@ void node_cfg()
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
 				;
-				uifc.input(WIN_MID|WIN_SAV,0,10,"Daily Event"
-					,cfg.node_daily,sizeof(cfg.node_daily)-1,K_EDIT);
+				fevent_cfg("Daily Event", &cfg.node_daily);
 				break;
 			case __COUNTER__:
 				uifc.helpbuf = node_path_help;
diff --git a/src/sbbs3/scfg/scfgxtrn.c b/src/sbbs3/scfg/scfgxtrn.c
index 198a3a28173377c21b5539a894829134fe3f1116..0503a9261376daf2565c724d60c9e686730d2674 100644
--- a/src/sbbs3/scfg/scfgxtrn.c
+++ b/src/sbbs3/scfg/scfgxtrn.c
@@ -319,6 +319,36 @@ void xprogs_cfg()
 	}
 }
 
+void fevent_cfg(const char* name, fevent_t* event)
+{
+	static int dflt;
+	int i;
+
+	while(1) {
+		i=0;
+		snprintf(opt[i++],MAX_OPLN,"%-15s%s","Enabled", (event->misc & EVENT_DISABLED) ? "No" : "Yes");
+		snprintf(opt[i++],MAX_OPLN,"%-15s%s","Native", (event->misc & XTRN_NATIVE) ? "Yes" : "No");
+		snprintf(opt[i++],MAX_OPLN,"%-15s%s","Command Line", event->cmd);
+		opt[i][0]=0;
+		switch(uifc.list(WIN_ACT|WIN_SAV|WIN_RHT,0,0,0,&dflt,0,name,opt)) {
+			case -1:
+				return;
+			case 0:
+				event->misc ^= EVENT_DISABLED;
+				uifc.changes = TRUE;
+				break;
+			case 1:
+				event->misc ^= XTRN_NATIVE;
+				uifc.changes = TRUE;
+				break;
+			case 2:
+				uifc.input(WIN_MID|WIN_SAV,0,0,"Command"
+					,event->cmd, sizeof event->cmd - 1,K_EDIT);
+				break;
+		}
+	}
+}
+
 void fevents_cfg()
 {
 	static int event_dflt;
@@ -326,10 +356,10 @@ void fevents_cfg()
 
 	while(1) {
 		i=0;
-		snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Logon Event",cfg.sys_logon);
-		snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Logout Event",cfg.sys_logout);
-		snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Daily Event",cfg.sys_daily);
-		snprintf(opt[i++],MAX_OPLN,"%-32.32s%s","Monthly Event",cfg.sys_monthly);
+		snprintf(opt[i++],MAX_OPLN,"%-12s%s","Logon", (cfg.sys_logon.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_logon.cmd);
+		snprintf(opt[i++],MAX_OPLN,"%-12s%s","Logout", (cfg.sys_logout.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_logout.cmd);
+		snprintf(opt[i++],MAX_OPLN,"%-12s%s","Daily", (cfg.sys_daily.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_daily.cmd);
+		snprintf(opt[i++],MAX_OPLN,"%-12s%s","Monthly", (cfg.sys_monthly.misc & EVENT_DISABLED) ? "<DISABLED>" : cfg.sys_monthly.cmd);
 		opt[i][0]=0;
 		uifc.helpbuf=
 			"`External Events:`\n"
@@ -337,7 +367,7 @@ void fevents_cfg()
 			"From this menu, you can configure the logon and logout events, and the\n"
 			"system daily and monthly (off-line) events.\n"
 		;
-		switch(uifc.list(WIN_ACT|WIN_SAV|WIN_CHE|WIN_BOT|WIN_RHT,0,0,60,&event_dflt,0
+		switch(uifc.list(WIN_ACT|WIN_SAV|WIN_CHE|WIN_BOT|WIN_RHT,0,0,0,&event_dflt,0
 			,"Fixed Events",opt)) {
 			case -1:
 				return;
@@ -355,8 +385,7 @@ void fevents_cfg()
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
 				;
-				uifc.input(WIN_MID|WIN_SAV,0,0,"Logon Event"
-					,cfg.sys_logon,sizeof(cfg.sys_logon)-1,K_EDIT);
+				fevent_cfg("Logon Event", &cfg.sys_logon);
 				break;
 			case 1:
 				uifc.helpbuf=
@@ -371,8 +400,7 @@ void fevents_cfg()
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
 				;
-				uifc.input(WIN_MID|WIN_SAV,0,0,"Logout Event"
-					,cfg.sys_logout,sizeof(cfg.sys_logout)-1,K_EDIT);
+				fevent_cfg("Logout Event", &cfg.sys_logout);
 				break;
 			case 2:
 				uifc.helpbuf=
@@ -383,9 +411,7 @@ void fevents_cfg()
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
 				;
-				uifc.input(WIN_MID|WIN_SAV,0,0,"Daily Event"
-					,cfg.sys_daily,sizeof(cfg.sys_daily)-1,K_EDIT);
-
+				fevent_cfg("Daily Event", &cfg.sys_daily);
 				break;
 			case 3:
 				uifc.helpbuf=
@@ -395,9 +421,7 @@ void fevents_cfg()
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
 				;
-				uifc.input(WIN_MID|WIN_SAV,0,0,"Monthly Event"
-					,cfg.sys_monthly,sizeof(cfg.sys_monthly)-1,K_EDIT);
-
+				fevent_cfg("Monthly Event", &cfg.sys_monthly);
 				break;
 		}
 	}
diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h
index 2c757e5ed223ff44857f18703df3540e5206fa26..a603f4a28cabde502b6160cd9cbed8f89f103862 100644
--- a/src/sbbs3/scfgdefs.h
+++ b/src/sbbs3/scfgdefs.h
@@ -311,6 +311,11 @@ typedef struct {							/* Generic Timed Event */
 
 } event_t;
 
+typedef struct {							// Fixed event
+	char			cmd[LEN_CMD + 1];
+	uint32_t		misc;					// Settings flags
+} fevent_t;
+
 typedef struct {							/* QWK Network Hub */
 	char		id[LEN_QWKID+1],			/* System ID of Hub */
 				call[LEN_CMD+1],			/* Call-out command line to execute */
@@ -465,10 +470,10 @@ typedef struct
 	enum date_fmt	sys_date_fmt;
 	char			sys_date_sep;
 	bool			sys_date_verbal;
-	char 			sys_monthly[LEN_CMD+1];	   /* Monthly event */
-	char 			sys_daily[LEN_CMD+1];	   /* Daily event */
-	char 			sys_logon[LEN_CMD+1];	   /* Logon event */
-	char 			sys_logout[LEN_CMD+1];	   /* Logoff event */
+	fevent_t		sys_monthly;		/* Monthly event */
+	fevent_t 		sys_daily;			/* Daily event */
+	fevent_t 		sys_logon;			/* Logon event */
+	fevent_t 		sys_logout;			/* Logout event */
 	uint8_t			min_pwlen;
 	uint16_t		sys_pwdays; 		/* Max days between password change */
 	uint16_t		sys_deldays;		/* Days to keep deleted users */
@@ -488,7 +493,7 @@ typedef struct
 	int32_t			xtrn_misc;			/* External Programs Misc Settings */
 	uint16_t		filename_maxlen;	/* Maximum filename length */
 
-	char			node_daily[LEN_CMD+1];	/* Name of node's daily event */
+	fevent_t		node_daily;			/* Node's daily event */
 	uint32_t		node_misc;			/* Misc bits for node setup */
 	bool			spinning_pause_prompt;
 	uint16_t		valuser;			/* User validation mail goes to */
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index 03453d7763b9e89e039e19cc73fb6a60f5f29bc6..fc704fbbf37f0e309bf163935dbcf93f420424cb 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -55,7 +55,8 @@ bool read_node_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 	fclose(fp);
 
 	SAFECOPY(cfg->node_phone, iniGetString(ini, ROOT_SECTION, "phone", "", value));
-	SAFECOPY(cfg->node_daily, iniGetString(ini, ROOT_SECTION, "daily", "", value));
+	SAFECOPY(cfg->node_daily.cmd, iniGetString(ini, ROOT_SECTION, "daily", "", value));
+	cfg->node_daily.misc = iniGetUInteger(ini, ROOT_SECTION, "daily_settings", 0);
 	SAFECOPY(cfg->text_dir, iniGetString(ini, ROOT_SECTION, "text_dir", "../text/", value));
 	SAFECOPY(cfg->temp_dir, iniGetString(ini, ROOT_SECTION, "temp_dir", "temp", value));
 	SAFECOPY(cfg->node_arstr, iniGetString(ini, ROOT_SECTION, "ars", "", value));
@@ -136,10 +137,14 @@ bool read_main_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 	cfg->errlevel = (uchar)iniGetUInteger(ini, ROOT_SECTION, "errlevel", LOG_CRIT);
 
 	// fixed events
-	SAFECOPY(cfg->sys_logon, iniGetString(ini, "logon_event", "cmd", "", value));
-	SAFECOPY(cfg->sys_logout, iniGetString(ini, "logout_event", "cmd", "", value));
-	SAFECOPY(cfg->sys_daily, iniGetString(ini, "daily_event", "cmd", "", value));
-	SAFECOPY(cfg->sys_monthly, iniGetString(ini, "monthly_event", "cmd", "", value));
+	SAFECOPY(cfg->sys_logon.cmd, iniGetString(ini, "logon_event", "cmd", "", value));
+	cfg->sys_logon.misc = iniGetUInt32(ini, "logon_event", "settings", 0);
+	SAFECOPY(cfg->sys_logout.cmd, iniGetString(ini, "logout_event", "cmd", "", value));
+	cfg->sys_logout.misc = iniGetUInt32(ini, "logout_event", "settings", 0);
+	SAFECOPY(cfg->sys_daily.cmd, iniGetString(ini, "daily_event", "cmd", "", value));
+	cfg->sys_daily.misc = iniGetUInt32(ini, "daily_event", "settings", 0);
+	SAFECOPY(cfg->sys_monthly.cmd, iniGetString(ini, "monthly_event", "cmd", "", value));
+	cfg->sys_monthly.misc = iniGetUInt32(ini, "monthly_event", "settings", 0);
 
 	named_str_list_t** sections = iniParseSections(ini);
 
diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c
index 963545354dd537c6f6466f0b01fc9e8c80e9706b..64cd44c3299d1f828bd1735d2b28859b31093882 100644
--- a/src/sbbs3/scfgsave.c
+++ b/src/sbbs3/scfgsave.c
@@ -80,7 +80,8 @@ bool write_node_cfg(scfg_t* cfg)
 
 	str_list_t ini = strListInit();
 	iniSetString(&ini, ROOT_SECTION, "phone", cfg->node_phone, NULL);
-	iniSetString(&ini, ROOT_SECTION, "daily", cfg->node_daily, NULL);
+	iniSetString(&ini, ROOT_SECTION, "daily", cfg->node_daily.cmd, NULL);
+	iniSetHexInt(&ini, ROOT_SECTION, "daily_settings", cfg->node_daily.misc, NULL);
 	iniSetString(&ini, ROOT_SECTION, "text_dir", cfg->text_dir, NULL);
 	iniSetString(&ini, ROOT_SECTION, "temp_dir", cfg->temp_dir, NULL);
 	iniSetString(&ini, ROOT_SECTION, "ars", cfg->node_arstr, NULL);
@@ -201,10 +202,14 @@ bool write_main_cfg(scfg_t* cfg)
 		iniSetString(&ini, name, "gender_options", cfg->new_genders, &ini_style);
 	}
 
-	iniSetString(&ini, "logon_event", "cmd", cfg->sys_logon, &ini_style);
-	iniSetString(&ini, "logout_event", "cmd", cfg->sys_logout, &ini_style);
-	iniSetString(&ini, "daily_event", "cmd", cfg->sys_daily, &ini_style);
-	iniSetString(&ini, "monthly_event", "cmd", cfg->sys_monthly, &ini_style);
+	iniSetString(&ini, "logon_event", "cmd", cfg->sys_logon.cmd, &ini_style);
+	iniSetHexInt(&ini, "logon_event", "settings", cfg->sys_logon.misc, &ini_style);
+	iniSetString(&ini, "logout_event", "cmd", cfg->sys_logout.cmd, &ini_style);
+	iniSetHexInt(&ini, "logout_event", "settings", cfg->sys_logout.misc, &ini_style);
+	iniSetString(&ini, "daily_event", "cmd", cfg->sys_daily.cmd, &ini_style);
+	iniSetHexInt(&ini, "daily_event", "settings", cfg->sys_daily.misc, &ini_style);
+	iniSetString(&ini, "monthly_event", "cmd", cfg->sys_monthly.cmd, &ini_style);
+	iniSetHexInt(&ini, "monthly_event", "settings", cfg->sys_monthly.misc, &ini_style);
 
 	{
 		const char* name = "expired";