diff --git a/src/sbbs3/scfg/scfg.c b/src/sbbs3/scfg/scfg.c
index eab1541de7ba0fbe6fa40265ff6e234e22441776..54e6e186afc442af6f9c236987ab8a9134c9f994 100644
--- a/src/sbbs3/scfg/scfg.c
+++ b/src/sbbs3/scfg/scfg.c
@@ -170,6 +170,22 @@ void sort_dirs(int libnum)
 	}
 }
 
+void toggle_flag(const char* title, uint* misc, uint flag, bool invert, const char* help)
+{
+	int k = ((*misc) & flag) == invert;
+	if(help != NULL)
+		uifc.helpbuf = (char*)help;
+	k = uifc.list(WIN_MID|WIN_SAV, 0, 0, 0, &k, 0, title, uifcYesNoOpts);
+	if((k == invert) && ((*misc) & flag) == 0) {
+		*misc |= flag;
+		uifc.changes = TRUE;
+	}
+	else if((k == !invert) && ((*misc) & flag) != 0) {
+		*misc &= ~flag;
+		uifc.changes = TRUE;
+	}
+}
+
 void wizard_msg(int page, int total, const char* text)
 {
 	uifc.showbuf(WIN_HLP|WIN_DYN|WIN_L2R, 2, 2, 76, 20, "Setup Wizard", text, NULL, NULL);
diff --git a/src/sbbs3/scfg/scfg.h b/src/sbbs3/scfg/scfg.h
index 73d7089e9deb438e19ed951d8ba8edf539c3255b..91463ba641c1015d16d707d98380397fac818ad6 100644
--- a/src/sbbs3/scfg/scfg.h
+++ b/src/sbbs3/scfg/scfg.h
@@ -171,9 +171,10 @@ 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);
+void fevent_cfg(const char* name, fevent_t* event, const char* help);
 const char* io_method(uint32_t mode);
 void choose_io_method(uint32_t* misc);
+void toggle_flag(const char* title, uint* misc, uint flag, bool invert, const char* help);
 bool load_main_cfg(scfg_t*, char*, size_t);
 bool load_node_cfg(scfg_t*, char*, size_t);
 bool load_msgs_cfg(scfg_t*, char*, size_t);
diff --git a/src/sbbs3/scfg/scfgnode.c b/src/sbbs3/scfg/scfgnode.c
index 5d09bcaec83f10e26aa943acd616a4a5aa0d7dee..31776c90f24007cdef24bcf2611214dfa760269b 100644
--- a/src/sbbs3/scfg/scfgnode.c
+++ b/src/sbbs3/scfg/scfgnode.c
@@ -254,7 +254,7 @@ void node_cfg()
 				}
 				break;
 			case __COUNTER__:
-				uifc.helpbuf=
+				fevent_cfg("Daily Event", &cfg.node_daily,
 					"`Daily Event:`\n"
 					"\n"
 					"If you have an event that this node's terminal server should run every\n"
@@ -264,8 +264,7 @@ void node_cfg()
 					"are required, use a batch file or shell script.\n"
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
-				;
-				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 bb2f32fd79a51cc355feb541ee1f0435e7d7eb6a..b52d950bb7f59dc567ce3caf0397a0a574175399 100644
--- a/src/sbbs3/scfg/scfgxtrn.c
+++ b/src/sbbs3/scfg/scfgxtrn.c
@@ -320,7 +320,7 @@ void xprogs_cfg()
 	}
 }
 
-void fevent_cfg(const char* name, fevent_t* event)
+void fevent_cfg(const char* name, fevent_t* event, const char* help)
 {
 	static int dflt;
 	int i;
@@ -332,6 +332,7 @@ void fevent_cfg(const char* name, fevent_t* event)
 		snprintf(opt[i++],MAX_OPLN,"%-27s%s",use_shell_opt, (event->misc & EX_SH) ? "Yes" : "No");
 		snprintf(opt[i++],MAX_OPLN,"%-27s%s","Command Line", event->cmd);
 		opt[i][0]=0;
+		uifc.helpbuf = (char*)help;
 		switch(uifc.list(WIN_ACT|WIN_SAV|WIN_RHT,0,0,0,&dflt,0,name,opt)) {
 			case -1:
 				return;
@@ -340,12 +341,10 @@ void fevent_cfg(const char* name, fevent_t* event)
 				uifc.changes = TRUE;
 				break;
 			case 1:
-				event->misc ^= EX_NATIVE;
-				uifc.changes = TRUE;
+				toggle_flag(native_opt, &event->misc, EX_NATIVE, native_help, false);
 				break;
 			case 2:
-				event->misc ^= EX_SH;
-				uifc.changes = TRUE;
+				toggle_flag(use_shell_prompt, &event->misc, EX_SH, use_shell_help, false);
 				break;
 			case 3:
 				uifc.input(WIN_MID|WIN_SAV,0,0,"Command"
@@ -378,7 +377,7 @@ void fevents_cfg()
 			case -1:
 				return;
 			case 0:
-				uifc.helpbuf=
+				fevent_cfg("Logon Event", &cfg.sys_logon,
 					"`Logon Event:`\n"
 					"\n"
 					"This is the command line for a program that will execute during the\n"
@@ -390,11 +389,10 @@ void fevents_cfg()
 					"program configured to run as a logon event.\n"
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
-				;
-				fevent_cfg("Logon Event", &cfg.sys_logon);
+					);
 				break;
 			case 1:
-				uifc.helpbuf=
+				fevent_cfg("Logout Event", &cfg.sys_logout,
 					"`Logout Event:`\n"
 					"\n"
 					"This is the command line for a program that will execute during the\n"
@@ -405,29 +403,26 @@ void fevents_cfg()
 					"event.\n"
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
-				;
-				fevent_cfg("Logout Event", &cfg.sys_logout);
+					);
 				break;
 			case 2:
-				uifc.helpbuf=
+				fevent_cfg("Daily Event", &cfg.sys_daily,
 					"`Daily Event:`\n"
 					"\n"
 					"This is the command line for a program that will run after the first\n"
 					"user that logs on after midnight, logs off (regardless of what node).\n"
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
-				;
-				fevent_cfg("Daily Event", &cfg.sys_daily);
+					);
 				break;
 			case 3:
-				uifc.helpbuf=
+				fevent_cfg("Monthly Event", &cfg.sys_monthly,
 					"`Monthly Event:`\n"
 					"\n"
 					"Enter a command line for a program that will run once each new month.\n"
 					SCFG_CMDLINE_PREFIX_HELP
 					SCFG_CMDLINE_SPEC_HELP
-				;
-				fevent_cfg("Monthly Event", &cfg.sys_monthly);
+					);
 				break;
 		}
 	}
@@ -626,19 +621,11 @@ void tevents_cfg()
 					break;
 
 				case 3:
-					k=(cfg.event[i]->misc&EVENT_DISABLED) ? 1:0;
-					uifc.helpbuf=
+					toggle_flag("Event Enabled", &cfg.event[i]->misc, EVENT_DISABLED, true,
 						"`Timed Event Enabled:`\n"
 						"\n"
 						"If you want disable this event from executing, set this option to ~No~.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,"Event Enabled",uifcYesNoOpts);
-					if((k==0 && cfg.event[i]->misc&EVENT_DISABLED)
-						|| (k==1 && !(cfg.event[i]->misc&EVENT_DISABLED))) {
-						cfg.event[i]->misc^=EVENT_DISABLED;
-						uifc.changes=1;
-					}
+						);
 					break;
 
 				case 4:
@@ -789,112 +776,49 @@ void tevents_cfg()
 						}
 					break;
 				case 9:
-					k=(cfg.event[i]->misc&EVENT_EXCL) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Exclusive Execution", &cfg.event[i]->misc, EVENT_EXCL, false,
 						"`Exclusive Event Execution:`\n"
 						"\n"
 						"If this event must be run exclusively (all nodes inactive), set this\n"
 						"option to `Yes`.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Exclusive Execution"
-						,uifcYesNoOpts);
-					if(!k && !(cfg.event[i]->misc&EVENT_EXCL)) {
-						cfg.event[i]->misc|=EVENT_EXCL;
-						uifc.changes=1;
-					}
-					else if(k==1 && cfg.event[i]->misc&EVENT_EXCL) {
-						cfg.event[i]->misc&=~EVENT_EXCL;
-						uifc.changes=1;
-					}
+						);
 					break;
 				case 10:
-					k=(cfg.event[i]->misc&EVENT_FORCE) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Force Users Off-line for Event"
+						,&cfg.event[i]->misc, EVENT_FORCE, false,
 						"`Force Users Off-line for Event:`\n"
 						"\n"
 						"If you want to have your users' on-line time reduced so the event can\n"
 						"execute precisely on time, set this option to `Yes`.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,"Force Users Off-line for Event",uifcYesNoOpts);
-					if(!k && !(cfg.event[i]->misc&EVENT_FORCE)) {
-						cfg.event[i]->misc|=EVENT_FORCE;
-						uifc.changes=1;
-					}
-					else if(k==1 && (cfg.event[i]->misc&EVENT_FORCE)) {
-						cfg.event[i]->misc&=~EVENT_FORCE;
-						uifc.changes=1;
-					}
+						);
 					break;
 
 				case 11:
-					k=(cfg.event[i]->misc&EX_NATIVE) ? 0:1;
-					uifc.helpbuf=native_help;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,native_opt,uifcYesNoOpts);
-					if(!k && !(cfg.event[i]->misc&EX_NATIVE)) {
-						cfg.event[i]->misc|=EX_NATIVE;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.event[i]->misc&EX_NATIVE)) {
-						cfg.event[i]->misc&=~EX_NATIVE;
-						uifc.changes=TRUE;
-					}
+					toggle_flag(native_opt, &cfg.event[i]->misc, XTRN_NATIVE, false, native_help);
 					break;
 
 				case 12:
-					k=(cfg.event[i]->misc&XTRN_SH) ? 0:1;
-					uifc.helpbuf = use_shell_help;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,use_shell_prompt, uifcYesNoOpts);
-					if(!k && !(cfg.event[i]->misc&XTRN_SH)) {
-						cfg.event[i]->misc|=XTRN_SH;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.event[i]->misc&XTRN_SH)) {
-						cfg.event[i]->misc&=~XTRN_SH;
-						uifc.changes=TRUE;
-					}
+					toggle_flag(use_shell_prompt, &cfg.event[i]->misc, XTRN_SH, false, use_shell_help);
 					break;
 
 				case 13:
-					k=(cfg.event[i]->misc&EX_BG) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Background (Asynchronous) Execution"
+						,&cfg.event[i]->misc, EX_BG, false,
 						"`Execute Event in Background (Asynchronously):`\n"
 						"\n"
 						"If you would like this event to run simultaneously with other events,\n"
 						"set this option to `Yes`. Exclusive events will not run in the background.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,"Background (Asynchronous) Execution",uifcYesNoOpts);
-					if(!k && !(cfg.event[i]->misc&EX_BG)) {
-						cfg.event[i]->misc|=EX_BG;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.event[i]->misc&EX_BG)) {
-						cfg.event[i]->misc&=~EX_BG;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 
 				case 14:
-					k=(cfg.event[i]->misc&EVENT_INIT) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Always Run After (re-)Initialization"
+						,&cfg.event[i]->misc, EVENT_INIT, false,
 						"`Always Run After (re-)Initialization:`\n"
 						"\n"
 						"If you want this event to always run after the BBS is initialized or\n"
 						"re-initialized, set this option to ~Yes~.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,"Always Run After (re-)Initialization",uifcYesNoOpts);
-					if(!k && !(cfg.event[i]->misc&EVENT_INIT)) {
-						cfg.event[i]->misc|=EVENT_INIT;
-						uifc.changes=1;
-					}
-					else if(k==1 && (cfg.event[i]->misc&EVENT_INIT)) {
-						cfg.event[i]->misc&=~EVENT_INIT;
-						uifc.changes=1;
-					}
+						);
 					break;
 
 				case 15:
@@ -1354,74 +1278,31 @@ void xtrn_cfg(int section)
 					getar(str,cfg.xtrn[i]->run_arstr);
 					break;
 				case __COUNTER__:
-					k=(cfg.xtrn[i]->misc&MULTIUSER) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Supports Multiple Users", &cfg.xtrn[i]->misc, MULTIUSER, false,
 						"`Supports Multiple Users:`\n"
 						"\n"
 						"If this online program supports multiple simultaneous users (nodes),\n"
 						"set this option to `Yes`.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Supports Multiple Users"
-						,uifcYesNoOpts);
-					if(!k && !(cfg.xtrn[i]->misc&MULTIUSER)) {
-						cfg.xtrn[i]->misc|=MULTIUSER;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xtrn[i]->misc&MULTIUSER)) {
-						cfg.xtrn[i]->misc&=~MULTIUSER;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 				case __COUNTER__:
 					choose_io_method(&cfg.xtrn[i]->misc);
 					break;
 				case __COUNTER__:
-					k=(cfg.xtrn[i]->misc&XTRN_NATIVE) ? 0:1;
-					uifc.helpbuf=native_help;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,native_opt,uifcYesNoOpts);
-					if(!k && !(cfg.xtrn[i]->misc&XTRN_NATIVE)) {
-						cfg.xtrn[i]->misc|=XTRN_NATIVE;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xtrn[i]->misc&XTRN_NATIVE)) {
-						cfg.xtrn[i]->misc&=~XTRN_NATIVE;
-						uifc.changes=TRUE;
-					}
+					toggle_flag(native_opt, &cfg.xtrn[i]->misc, XTRN_NATIVE, false, native_help);
 					break;
 				case __COUNTER__:
-					k=(cfg.xtrn[i]->misc&XTRN_SH) ? 0:1;
-					uifc.helpbuf = use_shell_help;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,use_shell_prompt,uifcYesNoOpts);
-					if(!k && !(cfg.xtrn[i]->misc&XTRN_SH)) {
-						cfg.xtrn[i]->misc|=XTRN_SH;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xtrn[i]->misc&XTRN_SH)) {
-						cfg.xtrn[i]->misc&=~XTRN_SH;
-						uifc.changes=TRUE;
-					}
+					toggle_flag(use_shell_prompt, &cfg.xtrn[i]->misc, XTRN_SH, false, use_shell_help);
 					break;
 				case __COUNTER__:
-					k=(cfg.xtrn[i]->misc&MODUSERDAT) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Program Can Modify User Data"
+						,&cfg.xtrn[i]->misc, MODUSERDAT, false,
 						"`Program Can Modify User Data:`\n"
 						"\n"
 						"If this online programs recognizes the Synchronet MODUSER.DAT format\n"
 						"or the RBBS/QuickBBS EXITINFO.BBS format and you want it to be able to\n"
 						"modify the data of users who run the program, set this option to `Yes`.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,"Program Can Modify User Data",uifcYesNoOpts);
-					if(!k && !(cfg.xtrn[i]->misc&MODUSERDAT)) {
-						cfg.xtrn[i]->misc|=MODUSERDAT;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xtrn[i]->misc&MODUSERDAT)) {
-						cfg.xtrn[i]->misc&=~MODUSERDAT;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 				case __COUNTER__:
 					k=0;
@@ -1457,29 +1338,17 @@ void xtrn_cfg(int section)
 						}
 						break;
 					}
-					k=(cfg.xtrn[i]->misc&EVENTONLY) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Execute as Event Only"
+						,&cfg.xtrn[i]->misc, EVENTONLY, false,
 						"`Execute Online Program as Event Only:`\n"
 						"\n"
 						"If you would like this online program to execute as an event only\n"
 						"(not available to users on the online program menu), set this option\n"
 						"to `Yes`.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k
-						,0,"Execute as Event Only"
-						,uifcYesNoOpts);
-					if(!k && !(cfg.xtrn[i]->misc&EVENTONLY)) {
-						cfg.xtrn[i]->misc|=EVENTONLY;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xtrn[i]->misc&EVENTONLY)) {
-						cfg.xtrn[i]->misc&=~EVENTONLY;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 				case __COUNTER__:
-					k=(cfg.xtrn[i]->misc&XTRN_PAUSE) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Pause After Execution", &cfg.xtrn[i]->misc, XTRN_PAUSE, false,
 						"`Pause Screen After Execution:`\n"
 						"\n"
 						"Set this option to ~Yes~ if you would like an automatic screen pause\n"
@@ -1488,18 +1357,11 @@ void xtrn_cfg(int section)
 						"This can be useful if the program displays information just before\n"
 						"exiting or you want to debug a program with a program not running\n"
 						"correctly.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,"Pause After Execution",uifcYesNoOpts);
-					if((!k && !(cfg.xtrn[i]->misc&XTRN_PAUSE))
-						|| (k && (cfg.xtrn[i]->misc&XTRN_PAUSE))) {
-						cfg.xtrn[i]->misc^=XTRN_PAUSE;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 				case __COUNTER__:
-					k=(cfg.xtrn[i]->misc&XTRN_NODISPLAY) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Disable Local Screen Display"
+						,&cfg.xtrn[i]->misc, XTRN_NODISPLAY, false,
 						"`Disable Local Screen Display:`\n"
 						"\n"
 						"Set this option to `Yes` if you wish to prevent this program from\n"
@@ -1508,14 +1370,7 @@ void xtrn_cfg(int section)
 						"This will disable 'Screen' output in the `DOOR.SYS` and `PCBOARD.SYS` drop\n"
 						"files and on Windows, stop the creation of a new console window when\n"
 						"executing this program."
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,"Disable Local Screen Display", uifcYesNoOpts);
-					if((!k && !(cfg.xtrn[i]->misc & XTRN_NODISPLAY))
-						|| (k && (cfg.xtrn[i]->misc & XTRN_NODISPLAY))) {
-						cfg.xtrn[i]->misc ^= XTRN_NODISPLAY;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 				case __COUNTER__:
 					k=0;
@@ -1707,43 +1562,23 @@ void xtrn_cfg(int section)
 								cfg.xtrn[i]->maxtime=atoi(str);
 								break;
 							case 2:
-								k=(cfg.xtrn[i]->misc&FREETIME) ? 0:1;
-								uifc.helpbuf=
+								toggle_flag("Suspended (Free) Time"
+									,&cfg.xtrn[i]->misc, FREETIME, false,
 									"`Suspended (Free) Time:`\n"
 									"\n"
 									"If you want the user's time online to be suspended while running this\n"
 									"online program (e.g. Free Time), set this option to `Yes`.\n"
-								;
-								k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-									,"Suspended (Free) Time",uifcYesNoOpts);
-								if(!k && !(cfg.xtrn[i]->misc&FREETIME)) {
-									cfg.xtrn[i]->misc|=FREETIME;
-									uifc.changes=TRUE;
-								}
-								else if(k==1 && (cfg.xtrn[i]->misc&FREETIME)) {
-									cfg.xtrn[i]->misc&=~FREETIME;
-									uifc.changes=TRUE;
-								}
+									);
 								break;
 							case 3:
-								k=(cfg.xtrn[i]->misc&XTRN_CHKTIME) ? 0:1;
-								uifc.helpbuf=
+								toggle_flag("Monitor Time Left"
+									,&cfg.xtrn[i]->misc, XTRN_CHKTIME, false,
 									"`Monitor Time Left:`\n"
 									"\n"
 									"If you want Synchronet to monitor the user's time left online while this\n"
 									"program runs (and disconnect the user if their time runs out), set this\n"
 									"option to `Yes`.\n"
-								;
-								k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-									,"Monitor Time Left",uifcYesNoOpts);
-								if(!k && !(cfg.xtrn[i]->misc&XTRN_CHKTIME)) {
-									cfg.xtrn[i]->misc|=XTRN_CHKTIME;
-									uifc.changes=TRUE;
-								}
-								else if(k==1 && (cfg.xtrn[i]->misc&XTRN_CHKTIME)) {
-									cfg.xtrn[i]->misc&=~XTRN_CHKTIME;
-									uifc.changes=TRUE;
-								}
+									);
 								break;
 							case 4:
 								if(cfg.xtrn[i]->max_inactivity < 1)
@@ -2012,35 +1847,14 @@ void xedit_cfg()
 					choose_io_method(&cfg.xedit[i]->misc);
 					break;
 				case 5:
-					k=(cfg.xedit[i]->misc&XTRN_NATIVE) ? 0:1;
-					uifc.helpbuf=native_help;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,native_opt,uifcYesNoOpts);
-					if(!k && !(cfg.xedit[i]->misc&XTRN_NATIVE)) {
-						cfg.xedit[i]->misc|=XTRN_NATIVE;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xedit[i]->misc&XTRN_NATIVE)) {
-						cfg.xedit[i]->misc&=~XTRN_NATIVE;
-						uifc.changes=TRUE;
-					}
+					toggle_flag(native_opt, &cfg.xedit[i]->misc, XTRN_NATIVE, false, native_help);
 					break;
 				case 6:
-					k=(cfg.xedit[i]->misc&XTRN_SH) ? 0:1;
-					uifc.helpbuf = use_shell_help;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,use_shell_prompt, uifcYesNoOpts);
-					if(!k && !(cfg.xedit[i]->misc&XTRN_SH)) {
-						cfg.xedit[i]->misc|=XTRN_SH;
-						uifc.changes=TRUE;
-					} else if(k==1 && (cfg.xedit[i]->misc&XTRN_SH)) {
-						cfg.xedit[i]->misc&=~XTRN_SH;
-						uifc.changes=TRUE;
-					}
+					toggle_flag(use_shell_prompt, &cfg.xedit[i]->misc, XTRN_SH, false, use_shell_help);
 					break;
 				case 7:
-					k=(cfg.xedit[i]->misc&SAVECOLUMNS) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Record Terminal Width"
+						,&cfg.xedit[i]->misc, SAVECOLUMNS, false,
 						"`Record Terminal Width:`\n"
 						"\n"
 						"When set to `Yes`, Synchronet will store the current terminal width\n"
@@ -2050,22 +1864,7 @@ void xedit_cfg()
 						"\n"
 						"If this editor correctly detects and supports terminal widths `other`\n"
 						"`than 80 columns`, set this option to `Yes`."
-					;
-					switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-						,"Record Terminal Width",uifcYesNoOpts)) {
-						case 0:
-							if(!(cfg.xedit[i]->misc&SAVECOLUMNS)) {
-								cfg.xedit[i]->misc |= SAVECOLUMNS;
-								uifc.changes = TRUE;
-							}
-							break;
-						case 1:
-							if(cfg.xedit[i]->misc&SAVECOLUMNS) {
-								cfg.xedit[i]->misc &= ~SAVECOLUMNS;
-								uifc.changes = TRUE;
-							}
-							break;
-					}
+						);
 					break;
 				case 8:
 					k=(cfg.xedit[i]->misc&QUOTEWRAP) ? 0:1;
@@ -2181,23 +1980,13 @@ void xedit_cfg()
 					goto lowercase_filename;
 					break;
 				case 11:
-					k=(cfg.xedit[i]->misc&EXPANDLF) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Expand LF to CRLF"
+						,&cfg.xedit[i]->misc, EXPANDLF, false,
 						"`Expand Line Feeds to Carriage Return/Line Feed Pairs:`\n"
 						"\n"
 						"If this message editor saves new lines as a single line feed character\n"
 						"instead of a carriage return/line feed pair, set this option to `Yes`.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Expand LF to CRLF"
-						,uifcYesNoOpts);
-					if(!k && !(cfg.xedit[i]->misc&EXPANDLF)) {
-						cfg.xedit[i]->misc|=EXPANDLF;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xedit[i]->misc&EXPANDLF)) {
-						cfg.xedit[i]->misc&=~EXPANDLF;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 				case 12:
 					if(cfg.xedit[i]->misc & XTRN_UTF8)
@@ -2232,45 +2021,23 @@ void xedit_cfg()
 					}
 					break;
 				case 13:
-					k=(cfg.xedit[i]->misc&STRIPKLUDGE) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Strip FidoNet Kludge Lines"
+						,&cfg.xedit[i]->misc, STRIPKLUDGE, false,
 						"`Strip FidoNet Kludge Lines From Messages:`\n"
 						"\n"
 						"If this message editor adds FidoNet Kludge lines to the message text,\n"
 						"set this option to `Yes` to strip those lines from the message.\n"
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-                		,"Strip FidoNet Kludge Lines"
-						,uifcYesNoOpts);
-					if(!k && !(cfg.xedit[i]->misc&STRIPKLUDGE)) {
-						cfg.xedit[i]->misc|=STRIPKLUDGE;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xedit[i]->misc&STRIPKLUDGE)) {
-						cfg.xedit[i]->misc&=~STRIPKLUDGE;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 				case 14:
-					k=(cfg.xedit[i]->misc&XTRN_UTF8) ? 0:1;
-					uifc.helpbuf=
+					toggle_flag("Support UTF-8 Encoding"
+						,&cfg.xedit[i]->misc, XTRN_UTF8, false,
 						"`Support UTF-8 Encoding:`\n"
 						"\n"
 						"If this editor can handle UTF-8 encoded message text and header fields\n"
 						"and can detect and support UTF-8 terminal input and output, set this\n"
 						"option to `Yes`."
-					;
-					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-                		,"Support UTF-8 Encoding"
-						,uifcYesNoOpts);
-					if(!k && !(cfg.xedit[i]->misc&XTRN_UTF8)) {
-						cfg.xedit[i]->misc ^= XTRN_UTF8;
-						uifc.changes=TRUE;
-					}
-					else if(k==1 && (cfg.xedit[i]->misc&XTRN_UTF8)) {
-						cfg.xedit[i]->misc ^= XTRN_UTF8;
-						uifc.changes=TRUE;
-					}
+						);
 					break;
 				case 15:
 					k=0;