diff --git a/src/sbbs3/scfg/scfgchat.c b/src/sbbs3/scfg/scfgchat.c
index 52cf427051424b93bda34801f5141fb0b7ed806c..75e05562dcfc57255491fa3acd0896767e053304 100644
--- a/src/sbbs3/scfg/scfgchat.c
+++ b/src/sbbs3/scfg/scfgchat.c
@@ -42,158 +42,158 @@ void page_cfg()
 	uint u;
 	static page_t savpage;
 
-while(1) {
-	for(i=0;i<cfg.total_pages && i<MAX_OPTS;i++)
-		sprintf(opt[i],"%-40.40s %-.20s",cfg.page[i]->cmd,cfg.page[i]->arstr);
-	opt[i][0]=0;
-	j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT;
-	if(cfg.total_pages)
-		j|=WIN_DEL|WIN_COPY|WIN_CUT;
-	if(cfg.total_pages<MAX_OPTS)
-		j|=WIN_INS|WIN_INSACT|WIN_XTR;
-	if(savpage.cmd[0])
-		j|=WIN_PASTE;
-	uifc.helpbuf=
-		"`External Sysop Chat Pagers:`\n"
-		"\n"
-		"This is a list of the configured external sysop chat pagers.\n"
-		"\n"
-		"To add a pager, select the desired location and hit ~ INS ~.\n"
-		"\n"
-		"To delete a pager, select it and hit ~ DEL ~.\n"
-		"\n"
-		"To configure a pager, select it and hit ~ ENTER ~.\n"
-	;
-	i=uifc.list(j,0,0,45,&dflt,&bar,"External Sysop Chat Pagers",opt);
-	if((signed)i==-1)
-		return;
-	int msk = i & MSK_ON;
-	i &= MSK_OFF;
-	if (msk == MSK_INS) {
-		sprintf(str,"%%!tone +chatpage.ton");
+	while(1) {
+		for(i=0;i<cfg.total_pages && i<MAX_OPTS;i++)
+			sprintf(opt[i],"%-40.40s %-.20s",cfg.page[i]->cmd,cfg.page[i]->arstr);
+		opt[i][0]=0;
+		j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT;
+		if(cfg.total_pages)
+			j|=WIN_DEL|WIN_COPY|WIN_CUT;
+		if(cfg.total_pages<MAX_OPTS)
+			j|=WIN_INS|WIN_INSACT|WIN_XTR;
+		if(savpage.cmd[0])
+			j|=WIN_PASTE;
 		uifc.helpbuf=
-			"`External Chat Pager Command Line:`\n"
+			"`External Sysop Chat Pagers:`\n"
+			"\n"
+			"This is a list of the configured external sysop chat pagers.\n"
+			"\n"
+			"To add a pager, select the desired location and hit ~ INS ~.\n"
 			"\n"
-			"This is the command line to execute for this external chat pager.\n"
+			"To delete a pager, select it and hit ~ DEL ~.\n"
+			"\n"
+			"To configure a pager, select it and hit ~ ENTER ~.\n"
 		;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Command Line",str,50
-			,K_EDIT)<1)
-            continue;
-		if((cfg.page=(page_t **)realloc(cfg.page,sizeof(page_t *)*(cfg.total_pages+1)))
-            ==NULL) {
-            errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_pages+1);
-			cfg.total_pages=0;
-			bail(1);
-            continue; 
+		i=uifc.list(j,0,0,45,&dflt,&bar,"External Sysop Chat Pagers",opt);
+		if((signed)i==-1)
+			return;
+		int msk = i & MSK_ON;
+		i &= MSK_OFF;
+		if (msk == MSK_INS) {
+			sprintf(str,"%%!tone +chatpage.ton");
+			uifc.helpbuf=
+				"`External Chat Pager Command Line:`\n"
+				"\n"
+				"This is the command line to execute for this external chat pager.\n"
+			;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Command Line",str,50
+				,K_EDIT)<1)
+				continue;
+			if((cfg.page=(page_t **)realloc(cfg.page,sizeof(page_t *)*(cfg.total_pages+1)))
+				==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_pages+1);
+				cfg.total_pages=0;
+				bail(1);
+				continue; 
+			}
+			if(cfg.total_pages)
+				for(u=cfg.total_pages;u>i;u--)
+					cfg.page[u]=cfg.page[u-1];
+			if((cfg.page[i]=(page_t *)malloc(sizeof(page_t)))==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(page_t));
+				continue; 
+			}
+			memset((page_t *)cfg.page[i],0,sizeof(page_t));
+			strcpy(cfg.page[i]->cmd,str);
+			cfg.total_pages++;
+			uifc.changes=1;
+			continue; 
 		}
-		if(cfg.total_pages)
-			for(u=cfg.total_pages;u>i;u--)
-				cfg.page[u]=cfg.page[u-1];
-		if((cfg.page[i]=(page_t *)malloc(sizeof(page_t)))==NULL) {
-			errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(page_t));
+		if (msk == MSK_DEL || msk == MSK_CUT) {
+			if(msk == MSK_CUT)
+				savpage = *cfg.page[i];
+			free(cfg.page[i]);
+			cfg.total_pages--;
+			for(j=i;j<cfg.total_pages;j++)
+				cfg.page[j]=cfg.page[j+1];
+			uifc.changes=1;
 			continue; 
 		}
-		memset((page_t *)cfg.page[i],0,sizeof(page_t));
-		strcpy(cfg.page[i]->cmd,str);
-		cfg.total_pages++;
-		uifc.changes=1;
-		continue; 
-	}
-	if (msk == MSK_DEL || msk == MSK_CUT) {
-		if(msk == MSK_CUT)
-			savpage = *cfg.page[i];
-		free(cfg.page[i]);
-		cfg.total_pages--;
-		for(j=i;j<cfg.total_pages;j++)
-			cfg.page[j]=cfg.page[j+1];
-		uifc.changes=1;
-		continue; 
-	}
-	if (msk == MSK_COPY) {
-		savpage=*cfg.page[i];
-		continue; 
-	}
-	if (msk == MSK_PASTE) {
-		*cfg.page[i]=savpage;
-		uifc.changes=1;
-        continue; 
-	}
-	if (msk != 0)
-		continue;
-	j=0;
-	done=0;
-	while(!done) {
-		k=0;
-		sprintf(opt[k++],"%-27.27s%.40s","Command Line",cfg.page[i]->cmd);
-		sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.page[i]->arstr);
-		sprintf(opt[k++],"%-27.27s%s","Intercept I/O"
-			,(cfg.page[i]->misc&XTRN_STDIO) ? "Standard"
-				:cfg.page[i]->misc&XTRN_CONIO ? "Console":"No");
-		opt[k][0]=0;
-		sprintf(str,"Sysop Chat Pager #%d",i+1);
-		switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0,str,opt)) {
-			case -1:
-				done=1;
-				break;
-			case 0:
-				uifc.helpbuf=
-					"`External Chat Pager Command Line:`\n"
-					"\n"
-					"This is the command line to execute for this external chat pager.\n"
-				;
-				strcpy(str,cfg.page[i]->cmd);
-				if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Command Line"
-					,cfg.page[i]->cmd,sizeof(cfg.page[i]->cmd)-1,K_EDIT))
-					strcpy(cfg.page[i]->cmd,str);
-				break;
-			case 1:
-				getar(str,cfg.page[i]->arstr);
-				break;
-			case 2:
-				switch(cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) {
-					case XTRN_STDIO:
-						k=0;
-						break;
-					case XTRN_CONIO:
-						k=1;
-						break;
-					default:
-						k=2;
-				}
-				strcpy(opt[0],"Standard");
-				strcpy(opt[1],"Console");
-				strcpy(opt[2],"No");
-				opt[3][0]=0;
-				uifc.helpbuf=
-					"`Intercept I/O:`\n"
-					"\n"
-					"If you wish the screen output and keyboard input to be intercepted\n"
-					"when running this chat pager, set this option to either `Standard` or ~Console~.\n"
-				;
-				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O"
-					,opt)) {
+		if (msk == MSK_COPY) {
+			savpage=*cfg.page[i];
+			continue; 
+		}
+		if (msk == MSK_PASTE) {
+			*cfg.page[i]=savpage;
+			uifc.changes=1;
+			continue; 
+		}
+		if (msk != 0)
+			continue;
+		j=0;
+		done=0;
+		while(!done) {
+			k=0;
+			sprintf(opt[k++],"%-27.27s%.40s","Command Line",cfg.page[i]->cmd);
+			sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.page[i]->arstr);
+			sprintf(opt[k++],"%-27.27s%s","Intercept I/O"
+				,(cfg.page[i]->misc&XTRN_STDIO) ? "Standard"
+					:cfg.page[i]->misc&XTRN_CONIO ? "Console":"No");
+			opt[k][0]=0;
+			sprintf(str,"Sysop Chat Pager #%d",i+1);
+			switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0,str,opt)) {
+				case -1:
+					done=1;
+					break;
 				case 0:
-					if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != XTRN_STDIO) {
-						cfg.page[i]->misc|=XTRN_STDIO;
-						cfg.page[i]->misc&=~XTRN_CONIO;
-						uifc.changes=1; 
-					}
+					uifc.helpbuf=
+						"`External Chat Pager Command Line:`\n"
+						"\n"
+						"This is the command line to execute for this external chat pager.\n"
+					;
+					strcpy(str,cfg.page[i]->cmd);
+					if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Command Line"
+						,cfg.page[i]->cmd,sizeof(cfg.page[i]->cmd)-1,K_EDIT))
+						strcpy(cfg.page[i]->cmd,str);
 					break;
 				case 1:
-					if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != XTRN_CONIO) {
-						cfg.page[i]->misc|=XTRN_CONIO;
-						cfg.page[i]->misc&=~XTRN_STDIO;
-						uifc.changes=1; 
-					}
+					getar(str,cfg.page[i]->arstr);
 					break;
 				case 2:
-					if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != 0) {
-						cfg.page[i]->misc&=~(XTRN_STDIO|XTRN_CONIO);
-						uifc.changes=1; 
+					switch(cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) {
+						case XTRN_STDIO:
+							k=0;
+							break;
+						case XTRN_CONIO:
+							k=1;
+							break;
+						default:
+							k=2;
+					}
+					strcpy(opt[0],"Standard");
+					strcpy(opt[1],"Console");
+					strcpy(opt[2],"No");
+					opt[3][0]=0;
+					uifc.helpbuf=
+						"`Intercept I/O:`\n"
+						"\n"
+						"If you wish the screen output and keyboard input to be intercepted\n"
+						"when running this chat pager, set this option to either `Standard` or ~Console~.\n"
+					;
+					switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O"
+						,opt)) {
+					case 0:
+						if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != XTRN_STDIO) {
+							cfg.page[i]->misc|=XTRN_STDIO;
+							cfg.page[i]->misc&=~XTRN_CONIO;
+							uifc.changes=1; 
+						}
+						break;
+					case 1:
+						if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != XTRN_CONIO) {
+							cfg.page[i]->misc|=XTRN_CONIO;
+							cfg.page[i]->misc&=~XTRN_STDIO;
+							uifc.changes=1; 
+						}
+						break;
+					case 2:
+						if((cfg.page[i]->misc&(XTRN_STDIO|XTRN_CONIO)) != 0) {
+							cfg.page[i]->misc&=~(XTRN_STDIO|XTRN_CONIO);
+							uifc.changes=1; 
+						}
+						break;
 					}
 					break;
-				}
-                break;
 			} 
 		} 
 	}
@@ -207,255 +207,255 @@ void chan_cfg()
 	uint i,u;
 	static chan_t savchan;
 
-while(1) {
-	for(i=0;i<cfg.total_chans && i<MAX_OPTS;i++)
-		sprintf(opt[i],"%-25s",cfg.chan[i]->name);
-	opt[i][0]=0;
-	j=WIN_ACT|WIN_SAV|WIN_BOT|WIN_RHT;
-	if(cfg.total_chans)
-		j|=WIN_DEL|WIN_COPY|WIN_CUT;
-	if(cfg.total_chans<MAX_OPTS)
-		j|=WIN_INS|WIN_INSACT|WIN_XTR;
-	if(savchan.name[0])
-		j|=WIN_PASTE;
-	uifc.helpbuf=
-		"`Multinode Chat Channels:`\n"
-		"\n"
-		"This is a list of the configured multinode chat channels.\n"
-		"\n"
-		"To add a channel, select the desired location with the arrow keys and\n"
-		"hit ~ INS ~.\n"
-		"\n"
-		"To delete a channel, select it with the arrow keys and hit ~ DEL ~.\n"
-		"\n"
-		"To configure a channel, select it with the arrow keys and hit ~ ENTER ~.\n"
-	;
-	i=uifc.list(j,0,0,45,&chan_dflt,&chan_bar,"Multinode Chat Channels",opt);
-	if((signed)i==-1)
-		return;
-	int msk = i & MSK_ON;
-	i &= MSK_OFF;
-	if (msk == MSK_INS) {
-		strcpy(str,"Open");
+	while(1) {
+		for(i=0;i<cfg.total_chans && i<MAX_OPTS;i++)
+			sprintf(opt[i],"%-25s",cfg.chan[i]->name);
+		opt[i][0]=0;
+		j=WIN_ACT|WIN_SAV|WIN_BOT|WIN_RHT;
+		if(cfg.total_chans)
+			j|=WIN_DEL|WIN_COPY|WIN_CUT;
+		if(cfg.total_chans<MAX_OPTS)
+			j|=WIN_INS|WIN_INSACT|WIN_XTR;
+		if(savchan.name[0])
+			j|=WIN_PASTE;
 		uifc.helpbuf=
-			"`Channel Name:`\n"
+			"`Multinode Chat Channels:`\n"
 			"\n"
-			"This is the name or description of the chat channel.\n"
-		;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Channel Name",str,25
-			,K_EDIT)<1)
-            continue;
-		SAFECOPY(code,str);
-		prep_code(code,/* prefix: */NULL);
-		uifc.helpbuf=
-			"`Chat Channel Internal Code:`\n"
+			"This is a list of the configured multinode chat channels.\n"
+			"\n"
+			"To add a channel, select the desired location with the arrow keys and\n"
+			"hit ~ INS ~.\n"
 			"\n"
-			"Every chat channel must have its own unique code for Synchronet to refer\n"
-			"to it internally. This code is usually an abbreviation of the chat\n"
-			"channel name.\n"
+			"To delete a channel, select it with the arrow keys and hit ~ DEL ~.\n"
+			"\n"
+			"To configure a channel, select it with the arrow keys and hit ~ ENTER ~.\n"
 		;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code"
-			,code,LEN_CODE,K_EDIT|K_UPPER)<1)
-			continue;
-		if(!code_ok(code)) {
-			uifc.helpbuf=invalid_code;
-			uifc.msg("Invalid Code");
-			uifc.helpbuf=0;
-            continue; 
+		i=uifc.list(j,0,0,45,&chan_dflt,&chan_bar,"Multinode Chat Channels",opt);
+		if((signed)i==-1)
+			return;
+		int msk = i & MSK_ON;
+		i &= MSK_OFF;
+		if (msk == MSK_INS) {
+			strcpy(str,"Open");
+			uifc.helpbuf=
+				"`Channel Name:`\n"
+				"\n"
+				"This is the name or description of the chat channel.\n"
+			;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Channel Name",str,25
+				,K_EDIT)<1)
+				continue;
+			SAFECOPY(code,str);
+			prep_code(code,/* prefix: */NULL);
+			uifc.helpbuf=
+				"`Chat Channel Internal Code:`\n"
+				"\n"
+				"Every chat channel must have its own unique code for Synchronet to refer\n"
+				"to it internally. This code is usually an abbreviation of the chat\n"
+				"channel name.\n"
+			;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code"
+				,code,LEN_CODE,K_EDIT|K_UPPER)<1)
+				continue;
+			if(!code_ok(code)) {
+				uifc.helpbuf=invalid_code;
+				uifc.msg("Invalid Code");
+				uifc.helpbuf=0;
+				continue; 
+			}
+			if((cfg.chan=(chan_t **)realloc(cfg.chan,sizeof(chan_t *)*(cfg.total_chans+1)))
+				==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chans+1);
+				cfg.total_chans=0;
+				bail(1);
+				continue; 
+			}
+			if(cfg.total_chans)
+				for(u=cfg.total_chans;u>i;u--)
+					cfg.chan[u]=cfg.chan[u-1];
+			if((cfg.chan[i]=(chan_t *)malloc(sizeof(chan_t)))==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chan_t));
+				continue; 
+			}
+			memset((chan_t *)cfg.chan[i],0,sizeof(chan_t));
+			strcpy(cfg.chan[i]->name,str);
+			strcpy(cfg.chan[i]->code,code);
+			cfg.total_chans++;
+			uifc.changes=1;
+			continue; 
 		}
-		if((cfg.chan=(chan_t **)realloc(cfg.chan,sizeof(chan_t *)*(cfg.total_chans+1)))
-            ==NULL) {
-            errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chans+1);
-			cfg.total_chans=0;
-			bail(1);
-            continue; 
+		if (msk == MSK_DEL || msk == MSK_CUT) {
+			if(msk == MSK_CUT)
+				savchan = *cfg.chan[i];
+			free(cfg.chan[i]);
+			cfg.total_chans--;
+			for(j=i;j<cfg.total_chans;j++)
+				cfg.chan[j]=cfg.chan[j+1];
+			uifc.changes=1;
+			continue; 
 		}
-		if(cfg.total_chans)
-			for(u=cfg.total_chans;u>i;u--)
-				cfg.chan[u]=cfg.chan[u-1];
-		if((cfg.chan[i]=(chan_t *)malloc(sizeof(chan_t)))==NULL) {
-			errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chan_t));
+		if (msk == MSK_COPY) {
+			savchan=*cfg.chan[i];
 			continue; 
 		}
-		memset((chan_t *)cfg.chan[i],0,sizeof(chan_t));
-		strcpy(cfg.chan[i]->name,str);
-		strcpy(cfg.chan[i]->code,code);
-		cfg.total_chans++;
-		uifc.changes=1;
-		continue; 
-	}
-	if (msk == MSK_DEL || msk == MSK_CUT) {
-		if(msk == MSK_CUT)
-			savchan = *cfg.chan[i];
-		free(cfg.chan[i]);
-		cfg.total_chans--;
-		for(j=i;j<cfg.total_chans;j++)
-			cfg.chan[j]=cfg.chan[j+1];
-		uifc.changes=1;
-		continue; 
-	}
-	if (msk == MSK_COPY) {
-		savchan=*cfg.chan[i];
-		continue; 
-	}
-	if (msk == MSK_PASTE) {
-		*cfg.chan[i]=savchan;
-		uifc.changes=1;
-        continue; 
-	}
-	if (msk != 0)
-		continue;
-    j=0;
-	done=0;
-	while(!done) {
-		k=0;
-		sprintf(opt[k++],"%-27.27s%s","Name",cfg.chan[i]->name);
-		sprintf(opt[k++],"%-27.27s%s","Internal Code",cfg.chan[i]->code);
-		sprintf(opt[k++],"%-27.27s%"PRIu32,"Cost in Credits",cfg.chan[i]->cost);
-		sprintf(opt[k++],"%-27.27s%.40s","Access Requirements"
-			,cfg.chan[i]->arstr);
-		sprintf(opt[k++],"%-27.27s%s","Password Protection"
-			,cfg.chan[i]->misc&CHAN_PW ? "Yes" : "No");
-		sprintf(opt[k++],"%-27.27s%s","Guru Joins When Empty"
-			,cfg.chan[i]->misc&CHAN_GURU ? "Yes" : "No");
-		sprintf(opt[k++],"%-27.27s%s","Channel Guru"
-			,cfg.chan[i]->guru<cfg.total_gurus ? cfg.guru[cfg.chan[i]->guru]->name : "");
-        sprintf(opt[k++],"%-27.27s%s","Channel Action Set"
-            ,cfg.actset[cfg.chan[i]->actset]->name);
-		opt[k][0]=0;
-		uifc.helpbuf=
-			"`Chat Channel Configuration:`\n"
-			"\n"
-			"This menu is for configuring the selected chat channel.\n"
-		;
-		sprintf(str,"%s Chat Channel",cfg.chan[i]->name);
-		switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str,opt)) {
-			case -1:
-				done=1;
-				break;
-			case 0:
-				uifc.helpbuf=
-					"`Chat Channel Name:`\n"
-					"\n"
-					"This is the name or description of the chat channel.\n"
-				;
-				strcpy(str,cfg.chan[i]->name);
-				if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Channel Name"
-					,cfg.chan[i]->name,sizeof(cfg.chan[i]->name)-1,K_EDIT))
-					strcpy(cfg.chan[i]->name,str);
-				break;
-			case 1:
-				uifc.helpbuf=
-					"`Chat Channel Internal Code:`\n"
-					"\n"
-					"Every chat channel must have its own unique code for Synchronet to refer\n"
-					"to it internally. This code is usually an abbreviation of the chat\n"
-					"channel name.\n"
-				;
-				strcpy(str,cfg.chan[i]->code);
-				if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Internal Code"
-					,str,LEN_CODE,K_UPPER|K_EDIT))
+		if (msk == MSK_PASTE) {
+			*cfg.chan[i]=savchan;
+			uifc.changes=1;
+			continue; 
+		}
+		if (msk != 0)
+			continue;
+		j=0;
+		done=0;
+		while(!done) {
+			k=0;
+			sprintf(opt[k++],"%-27.27s%s","Name",cfg.chan[i]->name);
+			sprintf(opt[k++],"%-27.27s%s","Internal Code",cfg.chan[i]->code);
+			sprintf(opt[k++],"%-27.27s%"PRIu32,"Cost in Credits",cfg.chan[i]->cost);
+			sprintf(opt[k++],"%-27.27s%.40s","Access Requirements"
+				,cfg.chan[i]->arstr);
+			sprintf(opt[k++],"%-27.27s%s","Password Protection"
+				,cfg.chan[i]->misc&CHAN_PW ? "Yes" : "No");
+			sprintf(opt[k++],"%-27.27s%s","Guru Joins When Empty"
+				,cfg.chan[i]->misc&CHAN_GURU ? "Yes" : "No");
+			sprintf(opt[k++],"%-27.27s%s","Channel Guru"
+				,cfg.chan[i]->guru<cfg.total_gurus ? cfg.guru[cfg.chan[i]->guru]->name : "");
+			sprintf(opt[k++],"%-27.27s%s","Channel Action Set"
+				,cfg.actset[cfg.chan[i]->actset]->name);
+			opt[k][0]=0;
+			uifc.helpbuf=
+				"`Chat Channel Configuration:`\n"
+				"\n"
+				"This menu is for configuring the selected chat channel.\n"
+			;
+			sprintf(str,"%s Chat Channel",cfg.chan[i]->name);
+			switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str,opt)) {
+				case -1:
+					done=1;
+					break;
+				case 0:
+					uifc.helpbuf=
+						"`Chat Channel Name:`\n"
+						"\n"
+						"This is the name or description of the chat channel.\n"
+					;
+					strcpy(str,cfg.chan[i]->name);
+					if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Channel Name"
+						,cfg.chan[i]->name,sizeof(cfg.chan[i]->name)-1,K_EDIT))
+						strcpy(cfg.chan[i]->name,str);
+					break;
+				case 1:
+					uifc.helpbuf=
+						"`Chat Channel Internal Code:`\n"
+						"\n"
+						"Every chat channel must have its own unique code for Synchronet to refer\n"
+						"to it internally. This code is usually an abbreviation of the chat\n"
+						"channel name.\n"
+					;
+					strcpy(str,cfg.chan[i]->code);
+					if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Internal Code"
+						,str,LEN_CODE,K_UPPER|K_EDIT))
+						break;
+					if(code_ok(str))
+						strcpy(cfg.chan[i]->code,str);
+					else {
+						uifc.helpbuf=invalid_code;
+						uifc.msg("Invalid Code");
+						uifc.helpbuf=0; 
+					}
+					break;
+				case 2:
+					ultoa(cfg.chan[i]->cost,str,10);
+					uifc.helpbuf=
+						"`Chat Channel Cost to Join:`\n"
+						"\n"
+						"If you want users to be charged credits to join this chat channel, set\n"
+						"this value to the number of credits to charge. If you want this channel\n"
+						"to be free, set this value to `0`.\n"
+					;
+					uifc.input(WIN_MID|WIN_SAV,0,0,"Cost to Join (in Credits)"
+						,str,10,K_EDIT|K_NUMBER);
+					cfg.chan[i]->cost=atol(str);
+					break;
+				case 3:
+					sprintf(str,"%s Chat Channel",cfg.chan[i]->name);
+					getar(str,cfg.chan[i]->arstr);
 					break;
-				if(code_ok(str))
-					strcpy(cfg.chan[i]->code,str);
-				else {
-					uifc.helpbuf=invalid_code;
-					uifc.msg("Invalid Code");
-                    uifc.helpbuf=0; 
-				}
-                break;
-			case 2:
-				ultoa(cfg.chan[i]->cost,str,10);
-                uifc.helpbuf=
-	                "`Chat Channel Cost to Join:`\n"
-	                "\n"
-	                "If you want users to be charged credits to join this chat channel, set\n"
-	                "this value to the number of credits to charge. If you want this channel\n"
-	                "to be free, set this value to `0`.\n"
-                ;
-				uifc.input(WIN_MID|WIN_SAV,0,0,"Cost to Join (in Credits)"
-                    ,str,10,K_EDIT|K_NUMBER);
-				cfg.chan[i]->cost=atol(str);
-                break;
-			case 3:
-				sprintf(str,"%s Chat Channel",cfg.chan[i]->name);
-				getar(str,cfg.chan[i]->arstr);
-				break;
-			case 4:
-				k=1;
-				uifc.helpbuf=
-					"`Allow Channel to be Password Protected:`\n"
-					"\n"
-					"If you want to allow the first user to join this channel to password\n"
-					"protect it, set this option to `Yes`.\n"
-				;
-				k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-					,"Allow Channel to be Password Protected"
-					,uifcYesNoOpts);
-				if(!k && !(cfg.chan[i]->misc&CHAN_PW)) {
-					cfg.chan[i]->misc|=CHAN_PW;
-					uifc.changes=1; 
-				}
-				else if(k==1 && cfg.chan[i]->misc&CHAN_PW) {
-					cfg.chan[i]->misc&=~CHAN_PW;
-					uifc.changes=1; 
-				}
-				break;
-			case 5:
-				k=1;
-				uifc.helpbuf=
-					"`Guru Joins This Channel When Empty:`\n"
-					"\n"
-					"If you want the system guru to join this chat channel when there is\n"
-					"only one user, set this option to `Yes`.\n"
-				;
-				k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
-					,"Guru Joins This Channel When Empty"
-					,uifcYesNoOpts);
-				if(!k && !(cfg.chan[i]->misc&CHAN_GURU)) {
-					cfg.chan[i]->misc|=CHAN_GURU;
-					uifc.changes=1; 
-				}
-				else if(k==1 && cfg.chan[i]->misc&CHAN_GURU) {
-					cfg.chan[i]->misc&=~CHAN_GURU;
-					uifc.changes=1; 
-				}
-				break;
-			case 6:
-uifc.helpbuf=
-	"`Channel Guru:`\n"
-	"\n"
-	"This is a list of available chat Gurus.  Select the one that you wish\n"
-	"to have available in this channel.\n"
-;
-				k=0;
-				for(j=0;j<cfg.total_gurus && j<MAX_OPTS;j++)
-					sprintf(opt[j],"%-25s",cfg.guru[j]->name);
-				opt[j][0]=0;
-				k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0
-					,"Available Chat Gurus",opt);
-				if(k==-1)
+				case 4:
+					k=1;
+					uifc.helpbuf=
+						"`Allow Channel to be Password Protected:`\n"
+						"\n"
+						"If you want to allow the first user to join this channel to password\n"
+						"protect it, set this option to `Yes`.\n"
+					;
+					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
+						,"Allow Channel to be Password Protected"
+						,uifcYesNoOpts);
+					if(!k && !(cfg.chan[i]->misc&CHAN_PW)) {
+						cfg.chan[i]->misc|=CHAN_PW;
+						uifc.changes=1; 
+					}
+					else if(k==1 && cfg.chan[i]->misc&CHAN_PW) {
+						cfg.chan[i]->misc&=~CHAN_PW;
+						uifc.changes=1; 
+					}
 					break;
-				cfg.chan[i]->guru=k;
-				break;
-			case 7:
-uifc.helpbuf=
-	"`Channel Action Set:`\n"
-	"\n"
-	"This is a list of available chat action sets.  Select the one that you\n"
-	"wish to have available in this channel.\n"
-;
-				k=0;
-				for(j=0;j<cfg.total_actsets && j<MAX_OPTS;j++)
-					sprintf(opt[j],"%-25s",cfg.actset[j]->name);
-				opt[j][0]=0;
-				k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0
-					,"Available Chat Action Sets",opt);
-				if(k==-1)
+				case 5:
+					k=1;
+					uifc.helpbuf=
+						"`Guru Joins This Channel When Empty:`\n"
+						"\n"
+						"If you want the system guru to join this chat channel when there is\n"
+						"only one user, set this option to `Yes`.\n"
+					;
+					k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
+						,"Guru Joins This Channel When Empty"
+						,uifcYesNoOpts);
+					if(!k && !(cfg.chan[i]->misc&CHAN_GURU)) {
+						cfg.chan[i]->misc|=CHAN_GURU;
+						uifc.changes=1; 
+					}
+					else if(k==1 && cfg.chan[i]->misc&CHAN_GURU) {
+						cfg.chan[i]->misc&=~CHAN_GURU;
+						uifc.changes=1; 
+					}
+					break;
+				case 6:
+	uifc.helpbuf=
+		"`Channel Guru:`\n"
+		"\n"
+		"This is a list of available chat Gurus.  Select the one that you wish\n"
+		"to have available in this channel.\n"
+	;
+					k=0;
+					for(j=0;j<cfg.total_gurus && j<MAX_OPTS;j++)
+						sprintf(opt[j],"%-25s",cfg.guru[j]->name);
+					opt[j][0]=0;
+					k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0
+						,"Available Chat Gurus",opt);
+					if(k==-1)
+						break;
+					cfg.chan[i]->guru=k;
 					break;
-				uifc.changes=1;
-				cfg.chan[i]->actset=k;
-				break; 
+				case 7:
+	uifc.helpbuf=
+		"`Channel Action Set:`\n"
+		"\n"
+		"This is a list of available chat action sets.  Select the one that you\n"
+		"wish to have available in this channel.\n"
+	;
+					k=0;
+					for(j=0;j<cfg.total_actsets && j<MAX_OPTS;j++)
+						sprintf(opt[j],"%-25s",cfg.actset[j]->name);
+					opt[j][0]=0;
+					k=uifc.list(WIN_SAV|WIN_RHT,0,0,25,&j,0
+						,"Available Chat Action Sets",opt);
+					if(k==-1)
+						break;
+					uifc.changes=1;
+					cfg.chan[i]->actset=k;
+					break; 
 			} 
 		} 
 	}
@@ -469,128 +469,128 @@ void chatact_cfg(uint setnum)
 	uint i,n,chatnum[MAX_OPTS+1];
 	static chatact_t savchatact;
 
-while(1) {
-	for(i=0,j=0;i<cfg.total_chatacts && j<MAX_OPTS;i++)
-		if(cfg.chatact[i]->actset==setnum) {
-			sprintf(opt[j],"%-*.*s %s",LEN_CHATACTCMD,LEN_CHATACTCMD
-				,cfg.chatact[i]->cmd,cfg.chatact[i]->out);
-			chatnum[j++]=i; 
+	while(1) {
+		for(i=0,j=0;i<cfg.total_chatacts && j<MAX_OPTS;i++)
+			if(cfg.chatact[i]->actset==setnum) {
+				sprintf(opt[j],"%-*.*s %s",LEN_CHATACTCMD,LEN_CHATACTCMD
+					,cfg.chatact[i]->cmd,cfg.chatact[i]->out);
+				chatnum[j++]=i; 
+			}
+		chatnum[j]=cfg.total_chatacts;
+		opt[j][0]=0;
+		i=WIN_ACT|WIN_SAV;
+		if(j)
+			i|=WIN_DEL|WIN_COPY|WIN_CUT;
+		if(j<MAX_OPTS)
+			i|=WIN_INS|WIN_INSACT|WIN_XTR;
+		if(savchatact.cmd[0])
+			i|=WIN_PASTE;
+		uifc.helpbuf=
+			"`Multinode Chat Actions:`\n"
+			"\n"
+			"This is a list of the configured multinode chat actions.  The users can\n"
+			"use these actions in multinode chat by turning on action commands with\n"
+			"the `/A` command in multinode chat.  Then if a line is typed which\n"
+			"begins with a valid `action command` and has a user name, chat handle,\n"
+			"or node number following, the output string will be displayed replacing\n"
+			"the `%s` symbols with the sending user's name and the receiving user's\n"
+			"name (in that order).\n"
+			"\n"
+			"To add an action, select the desired location with the arrow keys and\n"
+			"hit ~ INS ~.\n"
+			"\n"
+			"To delete an action, select it with the arrow keys and hit ~ DEL ~.\n"
+			"\n"
+			"To configure an action, select it with the arrow keys and hit ~ ENTER ~.\n"
+		;
+		sprintf(str,"%s Chat Actions",cfg.actset[setnum]->name);
+		i=uifc.list(i,0,0,70,&chatact_dflt,&chatact_bar,str,opt);
+		if((signed)i==-1)
+			return;
+		int msk = i & MSK_ON;
+		i &= MSK_OFF;
+		if (msk == MSK_INS) {
+			uifc.helpbuf=
+				"`Chat Action Command:`\n"
+				"\n"
+				"This is the command word (normally a verb) to trigger the action output.\n"
+			;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Action Command",cmd,LEN_CHATACTCMD
+				,K_UPPER)<1)
+				continue;
+			uifc.helpbuf=
+				"`Chat Action Output String:`\n"
+				"\n"
+				"This is the output string displayed with this action output.\n"
+			;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"",out,LEN_CHATACTOUT
+				,K_MSG)<1)
+				continue;
+			if((cfg.chatact=(chatact_t **)realloc(cfg.chatact
+				,sizeof(chatact_t *)*(cfg.total_chatacts+1)))==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chatacts+1);
+				cfg.total_chatacts=0;
+				bail(1);
+				continue; 
+			}
+			if(j)
+				for(n=cfg.total_chatacts;n>chatnum[i];n--)
+					cfg.chatact[n]=cfg.chatact[n-1];
+			if((cfg.chatact[chatnum[i]]=(chatact_t *)malloc(sizeof(chatact_t)))==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chatact_t));
+				continue; 
+			}
+			memset((chatact_t *)cfg.chatact[chatnum[i]],0,sizeof(chatact_t));
+			strcpy(cfg.chatact[chatnum[i]]->cmd,cmd);
+			strcpy(cfg.chatact[chatnum[i]]->out,out);
+			cfg.chatact[chatnum[i]]->actset=setnum;
+			cfg.total_chatacts++;
+			uifc.changes=1;
+			continue; 
 		}
-	chatnum[j]=cfg.total_chatacts;
-	opt[j][0]=0;
-	i=WIN_ACT|WIN_SAV;
-	if(j)
-		i|=WIN_DEL|WIN_COPY|WIN_CUT;
-	if(j<MAX_OPTS)
-		i|=WIN_INS|WIN_INSACT|WIN_XTR;
-	if(savchatact.cmd[0])
-		i|=WIN_PASTE;
-	uifc.helpbuf=
-		"`Multinode Chat Actions:`\n"
-		"\n"
-		"This is a list of the configured multinode chat actions.  The users can\n"
-		"use these actions in multinode chat by turning on action commands with\n"
-		"the `/A` command in multinode chat.  Then if a line is typed which\n"
-		"begins with a valid `action command` and has a user name, chat handle,\n"
-		"or node number following, the output string will be displayed replacing\n"
-		"the `%s` symbols with the sending user's name and the receiving user's\n"
-		"name (in that order).\n"
-		"\n"
-		"To add an action, select the desired location with the arrow keys and\n"
-		"hit ~ INS ~.\n"
-		"\n"
-		"To delete an action, select it with the arrow keys and hit ~ DEL ~.\n"
-		"\n"
-		"To configure an action, select it with the arrow keys and hit ~ ENTER ~.\n"
-	;
-	sprintf(str,"%s Chat Actions",cfg.actset[setnum]->name);
-	i=uifc.list(i,0,0,70,&chatact_dflt,&chatact_bar,str,opt);
-	if((signed)i==-1)
-		return;
-	int msk = i & MSK_ON;
-	i &= MSK_OFF;
-	if (msk == MSK_INS) {
+		if (msk == MSK_DEL || msk == MSK_CUT) {
+			if(msk == MSK_CUT)
+				savchatact = *cfg.chatact[chatnum[i]];
+			free(cfg.chatact[chatnum[i]]);
+			cfg.total_chatacts--;
+			for(j=chatnum[i];j<cfg.total_chatacts && j<MAX_OPTS;j++)
+				cfg.chatact[j]=cfg.chatact[j+1];
+			uifc.changes=1;
+			continue; 
+		}
+		if (msk == MSK_COPY) {
+			savchatact=*cfg.chatact[chatnum[i]];
+			continue; 
+		}
+		if (msk == MSK_PASTE) {
+			*cfg.chatact[chatnum[i]]=savchatact;
+			cfg.chatact[chatnum[i]]->actset=setnum;
+			uifc.changes=1;
+			continue; 
+		}
+		if (msk != 0)
+			continue;
 		uifc.helpbuf=
 			"`Chat Action Command:`\n"
 			"\n"
-			"This is the command word (normally a verb) to trigger the action output.\n"
+			"This is the command that triggers this chat action.\n"
 		;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Action Command",cmd,LEN_CHATACTCMD
-			,K_UPPER)<1)
-            continue;
+		strcpy(str,cfg.chatact[chatnum[i]]->cmd);
+		if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Action Command"
+			,cfg.chatact[chatnum[i]]->cmd,LEN_CHATACTCMD,K_EDIT|K_UPPER)) {
+			strcpy(cfg.chatact[chatnum[i]]->cmd,str);
+			continue; 
+		}
 		uifc.helpbuf=
 			"`Chat Action Output String:`\n"
 			"\n"
-			"This is the output string displayed with this action output.\n"
+			"This is the output string that results from this chat action.\n"
 		;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"",out,LEN_CHATACTOUT
-			,K_MSG)<1)
-            continue;
-		if((cfg.chatact=(chatact_t **)realloc(cfg.chatact
-            ,sizeof(chatact_t *)*(cfg.total_chatacts+1)))==NULL) {
-            errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_chatacts+1);
-			cfg.total_chatacts=0;
-			bail(1);
-            continue; 
-		}
-		if(j)
-			for(n=cfg.total_chatacts;n>chatnum[i];n--)
-				cfg.chatact[n]=cfg.chatact[n-1];
-		if((cfg.chatact[chatnum[i]]=(chatact_t *)malloc(sizeof(chatact_t)))==NULL) {
-			errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chatact_t));
-			continue; 
-		}
-		memset((chatact_t *)cfg.chatact[chatnum[i]],0,sizeof(chatact_t));
-		strcpy(cfg.chatact[chatnum[i]]->cmd,cmd);
-		strcpy(cfg.chatact[chatnum[i]]->out,out);
-		cfg.chatact[chatnum[i]]->actset=setnum;
-		cfg.total_chatacts++;
-		uifc.changes=1;
-		continue; 
-	}
-	if (msk == MSK_DEL || msk == MSK_CUT) {
-		if(msk == MSK_CUT)
-			savchatact = *cfg.chatact[chatnum[i]];
-		free(cfg.chatact[chatnum[i]]);
-		cfg.total_chatacts--;
-		for(j=chatnum[i];j<cfg.total_chatacts && j<MAX_OPTS;j++)
-			cfg.chatact[j]=cfg.chatact[j+1];
-		uifc.changes=1;
-		continue; 
+		strcpy(str,cfg.chatact[chatnum[i]]->out);
+		if(!uifc.input(WIN_MID|WIN_SAV,0,10,""
+			,cfg.chatact[chatnum[i]]->out,LEN_CHATACTOUT,K_EDIT|K_MSG))
+			strcpy(cfg.chatact[chatnum[i]]->out,str); 
 	}
-	if (msk == MSK_COPY) {
-		savchatact=*cfg.chatact[chatnum[i]];
-		continue; 
-	}
-	if (msk == MSK_PASTE) {
-		*cfg.chatact[chatnum[i]]=savchatact;
-		cfg.chatact[chatnum[i]]->actset=setnum;
-		uifc.changes=1;
-        continue; 
-	}
-	if (msk != 0)
-		continue;
-	uifc.helpbuf=
-		"`Chat Action Command:`\n"
-		"\n"
-		"This is the command that triggers this chat action.\n"
-	;
-	strcpy(str,cfg.chatact[chatnum[i]]->cmd);
-	if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Chat Action Command"
-		,cfg.chatact[chatnum[i]]->cmd,LEN_CHATACTCMD,K_EDIT|K_UPPER)) {
-		strcpy(cfg.chatact[chatnum[i]]->cmd,str);
-		continue; 
-	}
-	uifc.helpbuf=
-		"`Chat Action Output String:`\n"
-		"\n"
-		"This is the output string that results from this chat action.\n"
-	;
-	strcpy(str,cfg.chatact[chatnum[i]]->out);
-	if(!uifc.input(WIN_MID|WIN_SAV,0,10,""
-		,cfg.chatact[chatnum[i]]->out,LEN_CHATACTOUT,K_EDIT|K_MSG))
-		strcpy(cfg.chatact[chatnum[i]]->out,str); 
-}
 }
 
 void guru_cfg()
@@ -601,153 +601,153 @@ void guru_cfg()
 	uint i,u;
 	static guru_t savguru;
 
-while(1) {
-	for(i=0;i<cfg.total_gurus && i<MAX_OPTS;i++)
-		sprintf(opt[i],"%-25s",cfg.guru[i]->name);
-	opt[i][0]=0;
-	j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT;
-	if(cfg.total_gurus)
-		j|=WIN_DEL|WIN_COPY|WIN_CUT;
-	if(cfg.total_gurus<MAX_OPTS)
-		j|=WIN_INS|WIN_INSACT|WIN_XTR;
-	if(savguru.name[0])
-		j|=WIN_PASTE;
-	uifc.helpbuf=
-		"`Gurus:`\n"
-		"\n"
-		"This is a list of the configured Gurus.\n"
-		"\n"
-		"To add a Guru, select the desired location with the arrow keys and\n"
-		"hit ~ INS ~.\n"
-		"\n"
-		"To delete a Guru, select it with the arrow keys and hit ~ DEL ~.\n"
-		"\n"
-		"To configure a Guru, select it with the arrow keys and hit ~ ENTER ~.\n"
-	;
-	i=uifc.list(j,0,0,45,&guru_dflt,&guru_bar,"Artificial Gurus",opt);
-	if((signed)i==-1)
-		return;
-	int msk = i & MSK_ON;
-	i &= MSK_OFF;
-	if (msk == MSK_INS) {
+	while(1) {
+		for(i=0;i<cfg.total_gurus && i<MAX_OPTS;i++)
+			sprintf(opt[i],"%-25s",cfg.guru[i]->name);
+		opt[i][0]=0;
+		j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT;
+		if(cfg.total_gurus)
+			j|=WIN_DEL|WIN_COPY|WIN_CUT;
+		if(cfg.total_gurus<MAX_OPTS)
+			j|=WIN_INS|WIN_INSACT|WIN_XTR;
+		if(savguru.name[0])
+			j|=WIN_PASTE;
 		uifc.helpbuf=
-			"`Guru Name:`\n"
+			"`Gurus:`\n"
 			"\n"
-			"This is the name of the selected Guru.\n"
-		;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Name",str,25
-			,0)<1)
-            continue;
-		SAFECOPY(code,str);
-		prep_code(code,/* prefix: */NULL);
-		uifc.helpbuf=
-			"`Guru Internal Code:`\n"
+			"This is a list of the configured Gurus.\n"
+			"\n"
+			"To add a Guru, select the desired location with the arrow keys and\n"
+			"hit ~ INS ~.\n"
 			"\n"
-			"Every Guru must have its own unique code for Synchronet to refer to\n"
-			"it internally. This code is usually an abbreviation of the Guru name.\n"
+			"To delete a Guru, select it with the arrow keys and hit ~ DEL ~.\n"
+			"\n"
+			"To configure a Guru, select it with the arrow keys and hit ~ ENTER ~.\n"
 		;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code"
-			,code,LEN_CODE,K_EDIT|K_UPPER)<1)
-			continue;
-		if(!code_ok(code)) {
-			uifc.helpbuf=invalid_code;
-			uifc.msg("Invalid Code");
-			uifc.helpbuf=0;
-            continue; 
+		i=uifc.list(j,0,0,45,&guru_dflt,&guru_bar,"Artificial Gurus",opt);
+		if((signed)i==-1)
+			return;
+		int msk = i & MSK_ON;
+		i &= MSK_OFF;
+		if (msk == MSK_INS) {
+			uifc.helpbuf=
+				"`Guru Name:`\n"
+				"\n"
+				"This is the name of the selected Guru.\n"
+			;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Name",str,25
+				,0)<1)
+				continue;
+			SAFECOPY(code,str);
+			prep_code(code,/* prefix: */NULL);
+			uifc.helpbuf=
+				"`Guru Internal Code:`\n"
+				"\n"
+				"Every Guru must have its own unique code for Synchronet to refer to\n"
+				"it internally. This code is usually an abbreviation of the Guru name.\n"
+			;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Internal Code"
+				,code,LEN_CODE,K_EDIT|K_UPPER)<1)
+				continue;
+			if(!code_ok(code)) {
+				uifc.helpbuf=invalid_code;
+				uifc.msg("Invalid Code");
+				uifc.helpbuf=0;
+				continue; 
+			}
+			if((cfg.guru=(guru_t **)realloc(cfg.guru,sizeof(guru_t *)*(cfg.total_gurus+1)))
+				==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_gurus+1);
+				cfg.total_gurus=0;
+				bail(1);
+				continue; 
+			}
+			if(cfg.total_gurus)
+				for(u=cfg.total_gurus;u>i;u--)
+					cfg.guru[u]=cfg.guru[u-1];
+			if((cfg.guru[i]=(guru_t *)malloc(sizeof(guru_t)))==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(guru_t));
+				continue; 
+			}
+			memset((guru_t *)cfg.guru[i],0,sizeof(guru_t));
+			strcpy(cfg.guru[i]->name,str);
+			strcpy(cfg.guru[i]->code,code);
+			cfg.total_gurus++;
+			uifc.changes=1;
+			continue; 
 		}
-		if((cfg.guru=(guru_t **)realloc(cfg.guru,sizeof(guru_t *)*(cfg.total_gurus+1)))
-            ==NULL) {
-			errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_gurus+1);
-			cfg.total_gurus=0;
-			bail(1);
-            continue; 
+		if (msk == MSK_DEL || msk == MSK_CUT) {
+			if(msk == MSK_CUT)
+				savguru = *cfg.guru[i];
+			free(cfg.guru[i]);
+			cfg.total_gurus--;
+			for(j=i;j<cfg.total_gurus;j++)
+				cfg.guru[j]=cfg.guru[j+1];
+			uifc.changes=1;
+			continue; 
 		}
-		if(cfg.total_gurus)
-			for(u=cfg.total_gurus;u>i;u--)
-				cfg.guru[u]=cfg.guru[u-1];
-		if((cfg.guru[i]=(guru_t *)malloc(sizeof(guru_t)))==NULL) {
-			errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(guru_t));
+		if (msk == MSK_COPY) {
+			savguru=*cfg.guru[i];
 			continue; 
 		}
-		memset((guru_t *)cfg.guru[i],0,sizeof(guru_t));
-		strcpy(cfg.guru[i]->name,str);
-		strcpy(cfg.guru[i]->code,code);
-		cfg.total_gurus++;
-		uifc.changes=1;
-		continue; 
-	}
-	if (msk == MSK_DEL || msk == MSK_CUT) {
-		if(msk == MSK_CUT)
-			savguru = *cfg.guru[i];
-		free(cfg.guru[i]);
-		cfg.total_gurus--;
-		for(j=i;j<cfg.total_gurus;j++)
-			cfg.guru[j]=cfg.guru[j+1];
-		uifc.changes=1;
-		continue; 
-	}
-	if (msk == MSK_COPY) {
-		savguru=*cfg.guru[i];
-		continue; 
-	}
-	if (msk == MSK_PASTE) {
-		*cfg.guru[i]=savguru;
-		uifc.changes=1;
-        continue; 
-	}
-	if (msk != 0)
-		continue;
-    j=0;
-	done=0;
-	while(!done) {
-		k=0;
-		sprintf(opt[k++],"%-27.27s%s","Guru Name",cfg.guru[i]->name);
-		sprintf(opt[k++],"%-27.27s%s","Guru Internal Code",cfg.guru[i]->code);
-		sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.guru[i]->arstr);
-		opt[k][0]=0;
-		uifc.helpbuf=
-			"`Guru Configuration:`\n"
-			"\n"
-			"This menu is for configuring the selected Guru.\n"
-		;
-		switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,cfg.guru[i]->name
-			,opt)) {
-			case -1:
-				done=1;
-				break;
-			case 0:
-				uifc.helpbuf=
-					"`Guru Name:`\n"
-					"\n"
-					"This is the name of the selected Guru.\n"
-				;
-				strcpy(str,cfg.guru[i]->name);
-				if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Guru Name"
-					,cfg.guru[i]->name,sizeof(cfg.guru[i]->name)-1,K_EDIT))
-					strcpy(cfg.guru[i]->name,str);
-				break;
-			case 1:
-uifc.helpbuf=
-	"`Guru Internal Code:`\n"
-	"\n"
-	"Every Guru must have its own unique code for Synchronet to refer to\n"
-	"it internally. This code is usually an abbreviation of the Guru name.\n"
-;
-				strcpy(str,cfg.guru[i]->code);
-				if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Internal Code"
-					,str,LEN_CODE,K_EDIT|K_UPPER))
+		if (msk == MSK_PASTE) {
+			*cfg.guru[i]=savguru;
+			uifc.changes=1;
+			continue; 
+		}
+		if (msk != 0)
+			continue;
+		j=0;
+		done=0;
+		while(!done) {
+			k=0;
+			sprintf(opt[k++],"%-27.27s%s","Guru Name",cfg.guru[i]->name);
+			sprintf(opt[k++],"%-27.27s%s","Guru Internal Code",cfg.guru[i]->code);
+			sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",cfg.guru[i]->arstr);
+			opt[k][0]=0;
+			uifc.helpbuf=
+				"`Guru Configuration:`\n"
+				"\n"
+				"This menu is for configuring the selected Guru.\n"
+			;
+			switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,cfg.guru[i]->name
+				,opt)) {
+				case -1:
+					done=1;
+					break;
+				case 0:
+					uifc.helpbuf=
+						"`Guru Name:`\n"
+						"\n"
+						"This is the name of the selected Guru.\n"
+					;
+					strcpy(str,cfg.guru[i]->name);
+					if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Guru Name"
+						,cfg.guru[i]->name,sizeof(cfg.guru[i]->name)-1,K_EDIT))
+						strcpy(cfg.guru[i]->name,str);
+					break;
+				case 1:
+	uifc.helpbuf=
+		"`Guru Internal Code:`\n"
+		"\n"
+		"Every Guru must have its own unique code for Synchronet to refer to\n"
+		"it internally. This code is usually an abbreviation of the Guru name.\n"
+	;
+					strcpy(str,cfg.guru[i]->code);
+					if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Guru Internal Code"
+						,str,LEN_CODE,K_EDIT|K_UPPER))
+						break;
+					if(code_ok(str))
+						strcpy(cfg.guru[i]->code,str);
+					else {
+						uifc.helpbuf=invalid_code;
+						uifc.msg("Invalid Code");
+						uifc.helpbuf=0; 
+					}
 					break;
-				if(code_ok(str))
-					strcpy(cfg.guru[i]->code,str);
-				else {
-					uifc.helpbuf=invalid_code;
-					uifc.msg("Invalid Code");
-                    uifc.helpbuf=0; 
-				}
-				break;
-			case 2:
-				getar(cfg.guru[i]->name,cfg.guru[i]->arstr);
-				break; 
+				case 2:
+					getar(cfg.guru[i]->name,cfg.guru[i]->arstr);
+					break; 
 			} 
 		} 
 	}
@@ -761,118 +761,118 @@ void actsets_cfg()
     uint i,u;
     static actset_t savactset;
 
-while(1) {
-	for(i=0;i<cfg.total_actsets && i<MAX_OPTS;i++)
-		sprintf(opt[i],"%-25s",cfg.actset[i]->name);
-	opt[i][0]=0;
-	j=WIN_ACT|WIN_RHT|WIN_BOT|WIN_SAV;
-    if(cfg.total_actsets)
-        j|=WIN_DEL|WIN_COPY|WIN_CUT;
-	if(cfg.total_actsets<MAX_OPTS)
-        j|=WIN_INS|WIN_INSACT|WIN_XTR;
-    if(savactset.name[0])
-        j|=WIN_PASTE;
-    uifc.helpbuf=
-	    "`Chat Action Sets:`\n"
-	    "\n"
-	    "This is a list of the configured action sets.\n"
-	    "\n"
-	    "To add an action set, select the desired location with the arrow keys and\n"
-	    "hit ~ INS ~.\n"
-	    "\n"
-	    "To delete an action set, select it with the arrow keys and hit ~ DEL ~.\n"
-	    "\n"
-	    "To configure an action set, select it with the arrow keys and hit\n"
-	    "~ ENTER ~.\n"
-    ;
-	i=uifc.list(j,0,0,45,&actset_dflt,&actset_bar,"Chat Action Sets",opt);
-	if((signed)i==-1)
-		return;
-	int msk = i & MSK_ON;
-	i &= MSK_OFF;
-	if (msk == MSK_INS) {
-        uifc.helpbuf=
-	        "`Chat Action Set Name:`\n"
-	        "\n"
-	        "This is the name of the selected chat action set.\n"
-        ;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Action Set Name",str,25
-			,0)<1)
-            continue;
-        if((cfg.actset=(actset_t **)realloc(cfg.actset,sizeof(actset_t *)*(cfg.total_actsets+1)))
-            ==NULL) {
-            errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_actsets+1);
-			cfg.total_actsets=0;
-			bail(1);
-            continue; 
+	while(1) {
+		for(i=0;i<cfg.total_actsets && i<MAX_OPTS;i++)
+			sprintf(opt[i],"%-25s",cfg.actset[i]->name);
+		opt[i][0]=0;
+		j=WIN_ACT|WIN_RHT|WIN_BOT|WIN_SAV;
+		if(cfg.total_actsets)
+			j|=WIN_DEL|WIN_COPY|WIN_CUT;
+		if(cfg.total_actsets<MAX_OPTS)
+			j|=WIN_INS|WIN_INSACT|WIN_XTR;
+		if(savactset.name[0])
+			j|=WIN_PASTE;
+		uifc.helpbuf=
+			"`Chat Action Sets:`\n"
+			"\n"
+			"This is a list of the configured action sets.\n"
+			"\n"
+			"To add an action set, select the desired location with the arrow keys and\n"
+			"hit ~ INS ~.\n"
+			"\n"
+			"To delete an action set, select it with the arrow keys and hit ~ DEL ~.\n"
+			"\n"
+			"To configure an action set, select it with the arrow keys and hit\n"
+			"~ ENTER ~.\n"
+		;
+		i=uifc.list(j,0,0,45,&actset_dflt,&actset_bar,"Chat Action Sets",opt);
+		if((signed)i==-1)
+			return;
+		int msk = i & MSK_ON;
+		i &= MSK_OFF;
+		if (msk == MSK_INS) {
+			uifc.helpbuf=
+				"`Chat Action Set Name:`\n"
+				"\n"
+				"This is the name of the selected chat action set.\n"
+			;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Chat Action Set Name",str,25
+				,0)<1)
+				continue;
+			if((cfg.actset=(actset_t **)realloc(cfg.actset,sizeof(actset_t *)*(cfg.total_actsets+1)))
+				==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_actsets+1);
+				cfg.total_actsets=0;
+				bail(1);
+				continue; 
+			}
+			if(cfg.total_actsets)
+				for(u=cfg.total_actsets;u>i;u--)
+					cfg.actset[u]=cfg.actset[u-1];
+			if((cfg.actset[i]=(actset_t *)malloc(sizeof(actset_t)))==NULL) {
+				errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(actset_t));
+				continue; 
+			}
+			memset((actset_t *)cfg.actset[i],0,sizeof(actset_t));
+			strcpy(cfg.actset[i]->name,str);
+			cfg.total_actsets++;
+			uifc.changes=1;
+			continue; 
 		}
-        if(cfg.total_actsets)
-            for(u=cfg.total_actsets;u>i;u--)
-                cfg.actset[u]=cfg.actset[u-1];
-        if((cfg.actset[i]=(actset_t *)malloc(sizeof(actset_t)))==NULL) {
-            errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(actset_t));
-            continue; 
+		if (msk == MSK_DEL || msk == MSK_CUT) {
+			if(msk == MSK_CUT)
+				savactset = *cfg.actset[i];
+			free(cfg.actset[i]);
+			cfg.total_actsets--;
+			for(j=i;j<cfg.total_actsets;j++)
+				cfg.actset[j]=cfg.actset[j+1];
+			uifc.changes=1;
+			continue; 
 		}
-		memset((actset_t *)cfg.actset[i],0,sizeof(actset_t));
-        strcpy(cfg.actset[i]->name,str);
-        cfg.total_actsets++;
-        uifc.changes=1;
-        continue; 
-	}
-	if (msk == MSK_DEL || msk == MSK_CUT) {
-		if(msk == MSK_CUT)
-			savactset = *cfg.actset[i];
-        free(cfg.actset[i]);
-        cfg.total_actsets--;
-        for(j=i;j<cfg.total_actsets;j++)
-            cfg.actset[j]=cfg.actset[j+1];
-        uifc.changes=1;
-        continue; 
-	}
-	if (msk == MSK_COPY) {
-        savactset=*cfg.actset[i];
-        continue; 
-	}
-	if (msk == MSK_PASTE) {
-        *cfg.actset[i]=savactset;
-        uifc.changes=1;
-        continue; 
-	}
-	if (msk != 0)
-		continue;
+		if (msk == MSK_COPY) {
+			savactset=*cfg.actset[i];
+			continue; 
+		}
+		if (msk == MSK_PASTE) {
+			*cfg.actset[i]=savactset;
+			uifc.changes=1;
+			continue; 
+		}
+		if (msk != 0)
+			continue;
 
-    j=0;
-    done=0;
-    while(!done) {
-        k=0;
-        sprintf(opt[k++],"%-27.27s%s","Action Set Name",cfg.actset[i]->name);
-        sprintf(opt[k++],"%-27.27s","Configure Chat Actions...");
-		opt[k][0]=0;
-        uifc.helpbuf=
-	        "`Chat Action Set Configuration:`\n"
-	        "\n"
-	        "This menu is for configuring the selected chat action set.\n"
-        ;
-		sprintf(str,"%s Chat Action Set",cfg.actset[i]->name);
-		switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str
-            ,opt)) {
-            case -1:
-                done=1;
-                break;
-            case 0:
-                uifc.helpbuf=
-	                "`Chat Action Set Name:`\n"
-	                "\n"
-	                "This is the name of the selected action set.\n"
-                ;
-                strcpy(str,cfg.actset[i]->name);
-				if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Action Set Name"
-                    ,cfg.actset[i]->name,sizeof(cfg.actset[i]->name)-1,K_EDIT))
-                    strcpy(cfg.actset[i]->name,str);
-                break;
-            case 1:
-                chatact_cfg(i);
-                break; 
+		j=0;
+		done=0;
+		while(!done) {
+			k=0;
+			sprintf(opt[k++],"%-27.27s%s","Action Set Name",cfg.actset[i]->name);
+			sprintf(opt[k++],"%-27.27s","Configure Chat Actions...");
+			opt[k][0]=0;
+			uifc.helpbuf=
+				"`Chat Action Set Configuration:`\n"
+				"\n"
+				"This menu is for configuring the selected chat action set.\n"
+			;
+			sprintf(str,"%s Chat Action Set",cfg.actset[i]->name);
+			switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str
+				,opt)) {
+				case -1:
+					done=1;
+					break;
+				case 0:
+					uifc.helpbuf=
+						"`Chat Action Set Name:`\n"
+						"\n"
+						"This is the name of the selected action set.\n"
+					;
+					strcpy(str,cfg.actset[i]->name);
+					if(!uifc.input(WIN_MID|WIN_SAV,0,10,"Action Set Name"
+						,cfg.actset[i]->name,sizeof(cfg.actset[i]->name)-1,K_EDIT))
+						strcpy(cfg.actset[i]->name,str);
+					break;
+				case 1:
+					chatact_cfg(i);
+					break; 
 			} 
 		} 
 	}
diff --git a/src/sbbs3/scfg/scfgnet.c b/src/sbbs3/scfg/scfgnet.c
index c39fa55fc02966b0591e107a4bbedc5e8da5d6a0..6a59a732178bf2f1f67aa76573be624fb29be113 100644
--- a/src/sbbs3/scfg/scfgnet.c
+++ b/src/sbbs3/scfg/scfgnet.c
@@ -162,759 +162,759 @@ void net_cfg()
 	char	str[81],done;
 	int 	i,j,k,l;
 
-while(1) {
-	i=0;
-	strcpy(opt[i++],"Internet E-mail");
-	strcpy(opt[i++],"QWK Packet Networks");
-	strcpy(opt[i++],"FidoNet EchoMail and NetMail");
-	strcpy(opt[i++],"PostLink Networks");
-	opt[i][0]=0;
-	uifc.helpbuf=
-		"`Configure Networks:`\n"
-		"\n"
-		"This is the network configuration menu. Select the type of network\n"
-		"technology that you want to configure.\n"
-	;
-	i=uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&net_dflt,0,"Networks",opt);
-	if(i==1) {	/* QWK net stuff */
-		done=0;
-		while(!done) {
-			i=0;
-			strcpy(opt[i++],"Network Hubs...");
-			strcpy(opt[i++],"Default Tagline");
-			opt[i][0]=0;
-			uifc.helpbuf=
-				"`QWK Packet Networks:`\n"
-				"\n"
-				"From this menu you can configure the default tagline to use for\n"
-				"outgoing messages on QWK networked sub-boards, or you can select\n"
-				"`Network Hubs...` to add, delete, or configure QWK hubs that your system\n"
-				"calls to exchange packets with.\n"
-			;
-			i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&qnet_dflt,0
-				,"QWK Packet Networks",opt);
-			switch(i) {
-				case -1:	/* ESC */
-					done=1;
-					break;
-				case 1:
-					uifc.helpbuf=
-						"`QWK Network Default Tagline:`\n"
-						"\n"
-						"This is the default tagline to use for outgoing messages on QWK\n"
-						"networked sub-boards. This default can be overridden on a per sub-board\n"
-						"basis with the sub-board configuration `Network Options...`.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,nulstr
-						,cfg.qnet_tagline,sizeof(cfg.qnet_tagline)-1,K_MSG|K_EDIT);
-					break;
-				case 0:
-					while(1) {
-						for(i=0;i<cfg.total_qhubs && i<MAX_OPTS;i++)
-							sprintf(opt[i],"%-8.8s",cfg.qhub[i]->id);
-						opt[i][0]=0;
-						i=WIN_ACT|WIN_RHT|WIN_SAV;
-						if(cfg.total_qhubs<MAX_OPTS)
-							i|=WIN_INS|WIN_INSACT|WIN_XTR;
-						if(cfg.total_qhubs)
-							i|=WIN_DEL;
+	while(1) {
+		i=0;
+		strcpy(opt[i++],"Internet E-mail");
+		strcpy(opt[i++],"QWK Packet Networks");
+		strcpy(opt[i++],"FidoNet EchoMail and NetMail");
+		strcpy(opt[i++],"PostLink Networks");
+		opt[i][0]=0;
+		uifc.helpbuf=
+			"`Configure Networks:`\n"
+			"\n"
+			"This is the network configuration menu. Select the type of network\n"
+			"technology that you want to configure.\n"
+		;
+		i=uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&net_dflt,0,"Networks",opt);
+		if(i==1) {	/* QWK net stuff */
+			done=0;
+			while(!done) {
+				i=0;
+				strcpy(opt[i++],"Network Hubs...");
+				strcpy(opt[i++],"Default Tagline");
+				opt[i][0]=0;
+				uifc.helpbuf=
+					"`QWK Packet Networks:`\n"
+					"\n"
+					"From this menu you can configure the default tagline to use for\n"
+					"outgoing messages on QWK networked sub-boards, or you can select\n"
+					"`Network Hubs...` to add, delete, or configure QWK hubs that your system\n"
+					"calls to exchange packets with.\n"
+				;
+				i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&qnet_dflt,0
+					,"QWK Packet Networks",opt);
+				switch(i) {
+					case -1:	/* ESC */
+						done=1;
+						break;
+					case 1:
 						uifc.helpbuf=
-							"`QWK Network Hubs:`\n"
-							"\n"
-							"This is a list of QWK network hubs that your system calls to exchange\n"
-							"packets with.\n"
-							"\n"
-							"To add a hub, select the desired location with the arrow keys and hit\n"
-							"~ INS ~.\n"
-							"\n"
-							"To delete a hub, select it and hit ~ DEL ~.\n"
+							"`QWK Network Default Tagline:`\n"
 							"\n"
-							"To configure a hub, select it and hit ~ ENTER ~.\n"
+							"This is the default tagline to use for outgoing messages on QWK\n"
+							"networked sub-boards. This default can be overridden on a per sub-board\n"
+							"basis with the sub-board configuration `Network Options...`.\n"
 						;
-						i=uifc.list(i,0,0,0,&qhub_dflt,0
-							,"QWK Network Hubs",opt);
-						if(i==-1)
-							break;
-						int msk = i & MSK_ON;
-						i &= MSK_OFF;
-						if (msk == MSK_INS) {
+						uifc.input(WIN_MID|WIN_SAV,0,0,nulstr
+							,cfg.qnet_tagline,sizeof(cfg.qnet_tagline)-1,K_MSG|K_EDIT);
+						break;
+					case 0:
+						while(1) {
+							for(i=0;i<cfg.total_qhubs && i<MAX_OPTS;i++)
+								sprintf(opt[i],"%-8.8s",cfg.qhub[i]->id);
+							opt[i][0]=0;
+							i=WIN_ACT|WIN_RHT|WIN_SAV;
+							if(cfg.total_qhubs<MAX_OPTS)
+								i|=WIN_INS|WIN_INSACT|WIN_XTR;
+							if(cfg.total_qhubs)
+								i|=WIN_DEL;
 							uifc.helpbuf=
-								"`QWK Network Hub System ID:`\n"
+								"`QWK Network Hubs:`\n"
+								"\n"
+								"This is a list of QWK network hubs that your system calls to exchange\n"
+								"packets with.\n"
 								"\n"
-								"This is the QWK System ID of this hub. It is used for incoming and\n"
-								"outgoing network packets and must be accurate.\n"
+								"To add a hub, select the desired location with the arrow keys and hit\n"
+								"~ INS ~.\n"
+								"\n"
+								"To delete a hub, select it and hit ~ DEL ~.\n"
+								"\n"
+								"To configure a hub, select it and hit ~ ENTER ~.\n"
 							;
-							if(uifc.input(WIN_MID|WIN_SAV,0,0
-								,"System ID",str,LEN_QWKID,K_UPPER)<1)
-								continue;
-							if(!new_qhub(i))
-								continue;
-							SAFECOPY(cfg.qhub[i]->id,str);
-							SAFECOPY(cfg.qhub[i]->pack,"%@zip -jD %f %s");
-							SAFECOPY(cfg.qhub[i]->unpack,"%@unzip -Coj %f %s -d %g");
-							SAFECOPY(cfg.qhub[i]->call,"*qnet-ftp %s hub.address YOURPASS");
-							cfg.qhub[i]->node=1;
-							cfg.qhub[i]->days=(uchar)0xff; /* all days */
-							uifc.changes=1;
-							continue; 
-						}
-						if (msk == MSK_DEL) {
-							free(cfg.qhub[i]->mode);
-							free(cfg.qhub[i]->conf);
-							free(cfg.qhub[i]->sub);
-							free(cfg.qhub[i]);
-							cfg.total_qhubs--;
-							while(i<cfg.total_qhubs) {
-								cfg.qhub[i]=cfg.qhub[i+1];
-								i++; 
+							i=uifc.list(i,0,0,0,&qhub_dflt,0
+								,"QWK Network Hubs",opt);
+							if(i==-1)
+								break;
+							int msk = i & MSK_ON;
+							i &= MSK_OFF;
+							if (msk == MSK_INS) {
+								uifc.helpbuf=
+									"`QWK Network Hub System ID:`\n"
+									"\n"
+									"This is the QWK System ID of this hub. It is used for incoming and\n"
+									"outgoing network packets and must be accurate.\n"
+								;
+								if(uifc.input(WIN_MID|WIN_SAV,0,0
+									,"System ID",str,LEN_QWKID,K_UPPER)<1)
+									continue;
+								if(!new_qhub(i))
+									continue;
+								SAFECOPY(cfg.qhub[i]->id,str);
+								SAFECOPY(cfg.qhub[i]->pack,"%@zip -jD %f %s");
+								SAFECOPY(cfg.qhub[i]->unpack,"%@unzip -Coj %f %s -d %g");
+								SAFECOPY(cfg.qhub[i]->call,"*qnet-ftp %s hub.address YOURPASS");
+								cfg.qhub[i]->node=1;
+								cfg.qhub[i]->days=(uchar)0xff; /* all days */
+								uifc.changes=1;
+								continue; 
 							}
-							uifc.changes=1;
-							continue; 
+							if (msk == MSK_DEL) {
+								free(cfg.qhub[i]->mode);
+								free(cfg.qhub[i]->conf);
+								free(cfg.qhub[i]->sub);
+								free(cfg.qhub[i]);
+								cfg.total_qhubs--;
+								while(i<cfg.total_qhubs) {
+									cfg.qhub[i]=cfg.qhub[i+1];
+									i++; 
+								}
+								uifc.changes=1;
+								continue; 
+							}
+							qhub_edit(i); 
 						}
-						qhub_edit(i); 
-					}
-					break; 
+						break; 
+				} 
 			} 
-		} 
-	}
-
-	else if(i==2) { 	/* FidoNet Stuff */
-		done=0;
-		while(!done) {
-			i=0;
-			sprintf(opt[i++],"%-27.27s%s"
-				,"System Addresses",cfg.total_faddrs
-                	? smb_faddrtoa(&cfg.faddr[0],tmp) : nulstr);
-			sprintf(opt[i++],"%-27.27s%s"
-				,"Default Outbound Address"
-				,cfg.dflt_faddr.zone
-                	? smb_faddrtoa(&cfg.dflt_faddr,tmp) : "No");
-			sprintf(opt[i++],"%-27.27s"
-				,"Default Origin Line");
-			sprintf(opt[i++],"%-27.27s%.40s"
-				,"NetMail Semaphore",cfg.netmail_sem);
-			sprintf(opt[i++],"%-27.27s%.40s"
-				,"EchoMail Semaphore",cfg.echomail_sem);
-			sprintf(opt[i++],"%-27.27s%.40s"
-				,"NetMail Directory",cfg.netmail_dir);
-			sprintf(opt[i++],"%-27.27s%s"
-				,"Allow Sending of NetMail"
-				,cfg.netmail_misc&NMAIL_ALLOW ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%s"
-				,"Allow File Attachments"
-				,cfg.netmail_misc&NMAIL_FILE ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%s"
-				,"Send NetMail Using Alias"
-				,cfg.netmail_misc&NMAIL_ALIAS ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%s"
-				,"NetMail Defaults to Crash"
-				,cfg.netmail_misc&NMAIL_CRASH ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%s"
-				,"NetMail Defaults to Direct"
-				,cfg.netmail_misc&NMAIL_DIRECT ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%s"
-				,"NetMail Defaults to Hold"
-				,cfg.netmail_misc&NMAIL_HOLD ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%s"
-				,"Kill NetMail After Sent"
-				,cfg.netmail_misc&NMAIL_KILL ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%"PRIu32
-				,"Cost to Send NetMail",cfg.netmail_cost);
-			opt[i][0]=0;
-			uifc.helpbuf=
-				"`FidoNet EchoMail and NetMail:`\n"
-				"\n"
-				"This menu contains configuration options that pertain specifically to\n"
-				"networking E-mail (NetMail) and sub-boards (EchoMail) through networks\n"
-				"using FidoNet technology.\n"
-			;
-			i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&fnet_dflt,0
-				,"FidoNet EchoMail and NetMail",opt);
-			switch(i) {
-				case -1:	/* ESC */
-					done=1;
-					break;
-				case 0:
-					uifc.helpbuf=
-						"`System FidoNet Addresses:`\n"
-						"\n"
-						"This is the FidoNet address of this system used to receive NetMail.\n"
-						"The Main address is also used as the default address for sub-boards.\n"
-						"Format: `Zone:Net/Node[.Point]`\n"
-					;
-					k=l=0;
-					while(1) {
-						for(i=0;i<cfg.total_faddrs && i<MAX_OPTS;i++) {
-							if(i==0)
-								strcpy(str,"Main");
-							else
-								sprintf(str,"AKA %u",i);
-							sprintf(opt[i],"%-8.8s %-16s"
-								,str,smb_faddrtoa(&cfg.faddr[i],tmp)); 
-						}
-						opt[i][0]=0;
-						j=WIN_RHT|WIN_SAV|WIN_ACT|WIN_INSACT;
-						if(cfg.total_faddrs<MAX_OPTS)
-							j|=WIN_INS|WIN_XTR;
-						if(cfg.total_faddrs)
-							j|=WIN_DEL;
-						i=uifc.list(j,0,0,0,&k,&l
-							,"System Addresses",opt);
-						if(i==-1)
-							break;
-						int msk = i & MSK_ON;
-						i &= MSK_OFF;
-						if (msk == MSK_INS) {
-							if(!cfg.total_faddrs)
-								strcpy(str,"1:1/0");
-							else
-								smb_faddrtoa(&cfg.faddr[0],str);
-							if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Address"
-								,str,25,K_EDIT|K_UPPER))
-								continue;
+		}
 
-							if((cfg.faddr=(faddr_t *)realloc(cfg.faddr
-                                ,sizeof(faddr_t)*(cfg.total_faddrs+1)))==NULL) {
-                                errormsg(WHERE,ERR_ALLOC,nulstr
-                                    ,sizeof(faddr_t)*cfg.total_faddrs+1);
-								cfg.total_faddrs=0;
-								bail(1);
-                                continue; 
+		else if(i==2) { 	/* FidoNet Stuff */
+			done=0;
+			while(!done) {
+				i=0;
+				sprintf(opt[i++],"%-27.27s%s"
+					,"System Addresses",cfg.total_faddrs
+                		? smb_faddrtoa(&cfg.faddr[0],tmp) : nulstr);
+				sprintf(opt[i++],"%-27.27s%s"
+					,"Default Outbound Address"
+					,cfg.dflt_faddr.zone
+                		? smb_faddrtoa(&cfg.dflt_faddr,tmp) : "No");
+				sprintf(opt[i++],"%-27.27s"
+					,"Default Origin Line");
+				sprintf(opt[i++],"%-27.27s%.40s"
+					,"NetMail Semaphore",cfg.netmail_sem);
+				sprintf(opt[i++],"%-27.27s%.40s"
+					,"EchoMail Semaphore",cfg.echomail_sem);
+				sprintf(opt[i++],"%-27.27s%.40s"
+					,"NetMail Directory",cfg.netmail_dir);
+				sprintf(opt[i++],"%-27.27s%s"
+					,"Allow Sending of NetMail"
+					,cfg.netmail_misc&NMAIL_ALLOW ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%s"
+					,"Allow File Attachments"
+					,cfg.netmail_misc&NMAIL_FILE ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%s"
+					,"Send NetMail Using Alias"
+					,cfg.netmail_misc&NMAIL_ALIAS ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%s"
+					,"NetMail Defaults to Crash"
+					,cfg.netmail_misc&NMAIL_CRASH ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%s"
+					,"NetMail Defaults to Direct"
+					,cfg.netmail_misc&NMAIL_DIRECT ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%s"
+					,"NetMail Defaults to Hold"
+					,cfg.netmail_misc&NMAIL_HOLD ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%s"
+					,"Kill NetMail After Sent"
+					,cfg.netmail_misc&NMAIL_KILL ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%"PRIu32
+					,"Cost to Send NetMail",cfg.netmail_cost);
+				opt[i][0]=0;
+				uifc.helpbuf=
+					"`FidoNet EchoMail and NetMail:`\n"
+					"\n"
+					"This menu contains configuration options that pertain specifically to\n"
+					"networking E-mail (NetMail) and sub-boards (EchoMail) through networks\n"
+					"using FidoNet technology.\n"
+				;
+				i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&fnet_dflt,0
+					,"FidoNet EchoMail and NetMail",opt);
+				switch(i) {
+					case -1:	/* ESC */
+						done=1;
+						break;
+					case 0:
+						uifc.helpbuf=
+							"`System FidoNet Addresses:`\n"
+							"\n"
+							"This is the FidoNet address of this system used to receive NetMail.\n"
+							"The Main address is also used as the default address for sub-boards.\n"
+							"Format: `Zone:Net/Node[.Point]`\n"
+						;
+						k=l=0;
+						while(1) {
+							for(i=0;i<cfg.total_faddrs && i<MAX_OPTS;i++) {
+								if(i==0)
+									strcpy(str,"Main");
+								else
+									sprintf(str,"AKA %u",i);
+								sprintf(opt[i],"%-8.8s %-16s"
+									,str,smb_faddrtoa(&cfg.faddr[i],tmp)); 
 							}
+							opt[i][0]=0;
+							j=WIN_RHT|WIN_SAV|WIN_ACT|WIN_INSACT;
+							if(cfg.total_faddrs<MAX_OPTS)
+								j|=WIN_INS|WIN_XTR;
+							if(cfg.total_faddrs)
+								j|=WIN_DEL;
+							i=uifc.list(j,0,0,0,&k,&l
+								,"System Addresses",opt);
+							if(i==-1)
+								break;
+							int msk = i & MSK_ON;
+							i &= MSK_OFF;
+							if (msk == MSK_INS) {
+								if(!cfg.total_faddrs)
+									strcpy(str,"1:1/0");
+								else
+									smb_faddrtoa(&cfg.faddr[0],str);
+								if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Address"
+									,str,25,K_EDIT|K_UPPER))
+									continue;
 
-							for(j=cfg.total_faddrs;j>i;j--)
-                                cfg.faddr[j]=cfg.faddr[j-1];
+								if((cfg.faddr=(faddr_t *)realloc(cfg.faddr
+									,sizeof(faddr_t)*(cfg.total_faddrs+1)))==NULL) {
+									errormsg(WHERE,ERR_ALLOC,nulstr
+										,sizeof(faddr_t)*cfg.total_faddrs+1);
+									cfg.total_faddrs=0;
+									bail(1);
+									continue; 
+								}
 
-							cfg.faddr[i]=atofaddr(str);
-							cfg.total_faddrs++;
+								for(j=cfg.total_faddrs;j>i;j--)
+									cfg.faddr[j]=cfg.faddr[j-1];
+
+								cfg.faddr[i]=atofaddr(str);
+								cfg.total_faddrs++;
+								uifc.changes=1;
+								continue; 
+							}
+							if (msk == MSK_DEL) {
+								cfg.total_faddrs--;
+								while(i<cfg.total_faddrs) {
+									cfg.faddr[i]=cfg.faddr[i+1];
+									i++; 
+								}
+								uifc.changes=1;
+								continue; 
+							}
+							smb_faddrtoa(&cfg.faddr[i],str);
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Address"
+								,str,25,K_EDIT);
+							cfg.faddr[i]=atofaddr(str); 
+						}
+						break;
+					case 1:
+						i=0;
+						uifc.helpbuf=
+							"`Use Default Outbound NetMail Address:`\n"
+							"\n"
+							"If you would like to have a default FidoNet address adding to outbound\n"
+							"NetMail mail messages that do not have an address specified, select\n"
+							"`Yes`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"Use Default Outbound NetMail Address",uifcYesNoOpts);
+						if(i==1) {
+							if(cfg.dflt_faddr.zone)
+								uifc.changes=1;
+							cfg.dflt_faddr.zone=0;
+							break; 
+						}
+						if(i==-1)
+							break;
+						if(!cfg.dflt_faddr.zone) {
+							cfg.dflt_faddr.zone=1;
+							uifc.changes=1; 
+						}
+						smb_faddrtoa(&cfg.dflt_faddr,str);
+						uifc.helpbuf=
+							"`Default Outbound FidoNet NetMail Address:`\n"
+							"\n"
+							"If you would like to automatically add a FidoNet address to outbound\n"
+							"NetMail that does not have an address specified, set this option\n"
+							"to that address. This is useful for Fido/UUCP gateway mail.\n"
+							"Format: `Zone:Net/Node[.Point]`\n"
+						;
+						if(uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Address"
+							,str,25,K_EDIT)) {
+							cfg.dflt_faddr=atofaddr(str);
+							uifc.changes=1; 
+						}
+						break;
+					case 2:
+						uifc.helpbuf=
+							"`Default Origin Line:`\n"
+							"\n"
+							"This is the default origin line used for sub-boards networked via\n"
+							"EchoMail. This origin line can be overridden on a per sub-board basis\n"
+							"with the sub-board configuration `Network Options...`.\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0,"* Origin"
+							,cfg.origline,sizeof(cfg.origline)-1,K_EDIT);
+						break;
+					case 3:
+						uifc.helpbuf=
+							"`NetMail Semaphore File:`\n"
+							"\n"
+							"This is a filename that will be used as a semaphore (signal) to your\n"
+							"FidoNet front-end that new NetMail has been created and the messages\n"
+							"should be re-scanned.\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail Semaphore"
+							,cfg.netmail_sem,sizeof(cfg.netmail_sem)-1,K_EDIT);
+						break;
+					case 4:
+						uifc.helpbuf=
+							"`EchoMail Semaphore File:`\n"
+							"\n"
+							"This is a filename that will be used as a semaphore (signal) to your\n"
+							"FidoNet front-end that new EchoMail has been created and the messages\n"
+							"should be re-scanned.\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0,"EchoMail Semaphore"
+							,cfg.echomail_sem,sizeof(cfg.echomail_sem)-1,K_EDIT);
+						break;
+					case 5:
+						uifc.helpbuf=
+							"`NetMail Directory:`\n"
+							"\n"
+							"This is the directory where FidoNet NetMail will be imported from\n"
+							"and exported to (in FTS-1, *.MSG format).\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail"
+							,cfg.netmail_dir,sizeof(cfg.netmail_dir)-1,K_EDIT);
+						break;
+					case 6:
+						i=0;
+						uifc.helpbuf=
+							"`Allow Users to Send NetMail:`\n"
+							"\n"
+							"If you are on a FidoNet style network and want your users to be allowed\n"
+							"to send FidoNet NetMail, set this option to `Yes`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"Allow Users to Send NetMail",uifcYesNoOpts);
+						if(!i && !(cfg.netmail_misc&NMAIL_ALLOW)) {
 							uifc.changes=1;
-							continue; 
+							cfg.netmail_misc|=NMAIL_ALLOW; 
 						}
-						if (msk == MSK_DEL) {
-							cfg.total_faddrs--;
-							while(i<cfg.total_faddrs) {
-								cfg.faddr[i]=cfg.faddr[i+1];
-								i++; 
-							}
+						else if(i==1 && cfg.netmail_misc&NMAIL_ALLOW) {
 							uifc.changes=1;
-							continue; 
+							cfg.netmail_misc&=~NMAIL_ALLOW; 
 						}
-						smb_faddrtoa(&cfg.faddr[i],str);
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Address"
-							,str,25,K_EDIT);
-						cfg.faddr[i]=atofaddr(str); 
-					}
-                    break;
-				case 1:
-					i=0;
-					uifc.helpbuf=
-						"`Use Default Outbound NetMail Address:`\n"
-						"\n"
-						"If you would like to have a default FidoNet address adding to outbound\n"
-						"NetMail mail messages that do not have an address specified, select\n"
-						"`Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"Use Default Outbound NetMail Address",uifcYesNoOpts);
-					if(i==1) {
-						if(cfg.dflt_faddr.zone)
+						break;
+					case 7:
+						i=0;
+						uifc.helpbuf=
+							"`Allow Users to Send NetMail File Attachments:`\n"
+							"\n"
+							"If you are on a FidoNet style network and want your users to be allowed\n"
+							"to send NetMail file attachments, set this option to `Yes`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"Allow Users to Send NetMail File Attachments",uifcYesNoOpts);
+						if(!i && !(cfg.netmail_misc&NMAIL_FILE)) {
 							uifc.changes=1;
-						cfg.dflt_faddr.zone=0;
-						break; 
-					}
-					if(i==-1)
+							cfg.netmail_misc|=NMAIL_FILE; 
+						}
+						else if(i==1 && cfg.netmail_misc&NMAIL_FILE) {
+							uifc.changes=1;
+							cfg.netmail_misc&=~NMAIL_FILE; 
+						}
 						break;
-					if(!cfg.dflt_faddr.zone) {
-						cfg.dflt_faddr.zone=1;
-						uifc.changes=1; 
-					}
-					smb_faddrtoa(&cfg.dflt_faddr,str);
-					uifc.helpbuf=
-						"`Default Outbound FidoNet NetMail Address:`\n"
-						"\n"
-						"If you would like to automatically add a FidoNet address to outbound\n"
-						"NetMail that does not have an address specified, set this option\n"
-						"to that address. This is useful for Fido/UUCP gateway mail.\n"
-						"Format: `Zone:Net/Node[.Point]`\n"
-					;
-					if(uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Address"
-						,str,25,K_EDIT)) {
-						cfg.dflt_faddr=atofaddr(str);
-						uifc.changes=1; 
-					}
-                    break;
-				case 2:
-					uifc.helpbuf=
-						"`Default Origin Line:`\n"
-						"\n"
-						"This is the default origin line used for sub-boards networked via\n"
-						"EchoMail. This origin line can be overridden on a per sub-board basis\n"
-						"with the sub-board configuration `Network Options...`.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,"* Origin"
-						,cfg.origline,sizeof(cfg.origline)-1,K_EDIT);
-                    break;
-				case 3:
-					uifc.helpbuf=
-						"`NetMail Semaphore File:`\n"
-						"\n"
-						"This is a filename that will be used as a semaphore (signal) to your\n"
-						"FidoNet front-end that new NetMail has been created and the messages\n"
-						"should be re-scanned.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail Semaphore"
-						,cfg.netmail_sem,sizeof(cfg.netmail_sem)-1,K_EDIT);
-                    break;
-				case 4:
-					uifc.helpbuf=
-						"`EchoMail Semaphore File:`\n"
-						"\n"
-						"This is a filename that will be used as a semaphore (signal) to your\n"
-						"FidoNet front-end that new EchoMail has been created and the messages\n"
-						"should be re-scanned.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,"EchoMail Semaphore"
-						,cfg.echomail_sem,sizeof(cfg.echomail_sem)-1,K_EDIT);
-                    break;
-				case 5:
-					uifc.helpbuf=
-						"`NetMail Directory:`\n"
-						"\n"
-						"This is the directory where FidoNet NetMail will be imported from\n"
-						"and exported to (in FTS-1, *.MSG format).\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,"NetMail"
-						,cfg.netmail_dir,sizeof(cfg.netmail_dir)-1,K_EDIT);
-                    break;
-				case 6:
-					i=0;
-					uifc.helpbuf=
-						"`Allow Users to Send NetMail:`\n"
-						"\n"
-						"If you are on a FidoNet style network and want your users to be allowed\n"
-						"to send FidoNet NetMail, set this option to `Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"Allow Users to Send NetMail",uifcYesNoOpts);
-					if(!i && !(cfg.netmail_misc&NMAIL_ALLOW)) {
-						uifc.changes=1;
-						cfg.netmail_misc|=NMAIL_ALLOW; 
-					}
-					else if(i==1 && cfg.netmail_misc&NMAIL_ALLOW) {
-						uifc.changes=1;
-						cfg.netmail_misc&=~NMAIL_ALLOW; 
-					}
-					break;
-				case 7:
-					i=0;
-					uifc.helpbuf=
-						"`Allow Users to Send NetMail File Attachments:`\n"
-						"\n"
-						"If you are on a FidoNet style network and want your users to be allowed\n"
-						"to send NetMail file attachments, set this option to `Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"Allow Users to Send NetMail File Attachments",uifcYesNoOpts);
-					if(!i && !(cfg.netmail_misc&NMAIL_FILE)) {
-						uifc.changes=1;
-						cfg.netmail_misc|=NMAIL_FILE; 
-					}
-					else if(i==1 && cfg.netmail_misc&NMAIL_FILE) {
-						uifc.changes=1;
-						cfg.netmail_misc&=~NMAIL_FILE; 
-					}
-                    break;
-				case 8:
-					i=1;
-					uifc.helpbuf=
-						"`Use Aliases in NetMail:`\n"
-						"\n"
-						"If you allow aliases on your system and wish users to have their NetMail\n"
-						"contain their alias as the `From User`, set this option to `Yes`. If you\n"
-						"want all NetMail to be sent using users' real names, set this option to\n"
-						"`No`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"Use Aliases in NetMail",uifcYesNoOpts);
-					if(!i && !(cfg.netmail_misc&NMAIL_ALIAS)) {
-						uifc.changes=1;
-						cfg.netmail_misc|=NMAIL_ALIAS; 
-					}
-					else if(i==1 && cfg.netmail_misc&NMAIL_ALIAS) {
-						uifc.changes=1;
-						cfg.netmail_misc&=~NMAIL_ALIAS; 
-					}
-                    break;
-				case 9:
-					i=1;
-					uifc.helpbuf=
-						"`NetMail Defaults to Crash Status:`\n"
-						"\n"
-						"If you want all NetMail to default to crash (send immediately) status,\n"
-						"set this option to `Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"NetMail Defaults to Crash Status",uifcYesNoOpts);
-					if(!i && !(cfg.netmail_misc&NMAIL_CRASH)) {
-						uifc.changes=1;
-						cfg.netmail_misc|=NMAIL_CRASH; 
-					}
-					else if(i==1 && cfg.netmail_misc&NMAIL_CRASH) {
-						uifc.changes=1;
-						cfg.netmail_misc&=~NMAIL_CRASH; 
-					}
-                    break;
-				case 10:
-					i=1;
-					uifc.helpbuf=
-						"`NetMail Defaults to Direct Status:`\n"
-						"\n"
-						"If you want all NetMail to default to direct (send directly) status,\n"
-						"set this option to `Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"NetMail Defaults to Direct Status",uifcYesNoOpts);
-					if(!i && !(cfg.netmail_misc&NMAIL_DIRECT)) {
-						uifc.changes=1;
-						cfg.netmail_misc|=NMAIL_DIRECT; 
-					}
-					else if(i==1 && cfg.netmail_misc&NMAIL_DIRECT) {
-						uifc.changes=1;
-						cfg.netmail_misc&=~NMAIL_DIRECT; 
-					}
-                    break;
-				case 11:
-					i=1;
-					uifc.helpbuf=
-						"`NetMail Defaults to Hold Status:`\n"
-						"\n"
-						"If you want all NetMail to default to hold status, set this option to\n"
-						"`Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"NetMail Defaults to Hold Status",uifcYesNoOpts);
-					if(!i && !(cfg.netmail_misc&NMAIL_HOLD)) {
-						uifc.changes=1;
-						cfg.netmail_misc|=NMAIL_HOLD; 
-					}
-					else if(i==1 && cfg.netmail_misc&NMAIL_HOLD) {
-						uifc.changes=1;
-						cfg.netmail_misc&=~NMAIL_HOLD; 
-					}
-                    break;
-				case 12:
-					i=0;
-					uifc.helpbuf=
-						"`Kill NetMail After it is Sent:`\n"
-						"\n"
-						"If you want NetMail messages to be deleted after they are successfully\n"
-						"sent, set this option to `Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"Kill NetMail After it is Sent",uifcYesNoOpts);
-					if(!i && !(cfg.netmail_misc&NMAIL_KILL)) {
-						uifc.changes=1;
-						cfg.netmail_misc|=NMAIL_KILL; 
-					}
-					else if(i==1 && cfg.netmail_misc&NMAIL_KILL) {
-						uifc.changes=1;
-						cfg.netmail_misc&=~NMAIL_KILL; 
-					}
-                    break;
-				case 13:
-					ultoa(cfg.netmail_cost,str,10);
-					uifc.helpbuf=
-						"`Cost in Credits to Send NetMail:`\n"
-						"\n"
-						"This is the number of credits it will cost your users to send NetMail.\n"
-						"If you want the sending of NetMail to be free, set this value to `0`.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0
-						,"Cost in Credits to Send NetMail"
-						,str,10,K_EDIT|K_NUMBER);
-					cfg.netmail_cost=atol(str);
-					break; 
-			} 
-		} 
-	}
-	else if(i==3) {
-		done=0;
-		while(!done) {
-			i=0;
-			strcpy(opt[i++],"Network Hubs...");
-			sprintf(opt[i++],"%-20.20s%-12s","Site Name",cfg.sys_psname);
-			sprintf(opt[i++],"%-20.20s%-"PRIu32,"Site Number",cfg.sys_psnum);
-			opt[i][0]=0;
-			uifc.helpbuf=
-				"`PostLink Networks:`\n"
-				"\n"
-				"From this menu you can configure PostLink or PCRelay Networks.\n"
-			;
-			i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&pnet_dflt,0
-				,"PostLink Networks",opt);
-			switch(i) {
-				case -1:	/* ESC */
-					done=1;
-					break;
-				case 1:
-					uifc.helpbuf=
-						"`PostLink Site Name:`\n"
-						"\n"
-						"If your system is networked via PostLink or PCRelay, this should be the\n"
-						"Site Name for your BBS.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,"Site Name"
-						,cfg.sys_psname,sizeof(cfg.sys_psname)-1,K_UPPER|K_EDIT);
-					break;
-				case 2:
-					uifc.helpbuf=
-						"`PostLink Site Number:`\n"
-						"\n"
-						"If your system is networked via PostLink or PCRelay, this should be the\n"
-						"Site Number for your BBS.\n"
-					;
-					ultoa(cfg.sys_psnum,str,10);
-					uifc.input(WIN_MID|WIN_SAV,0,0,"Site Number"
-						,str,10,K_NUMBER|K_EDIT);
-					cfg.sys_psnum=atol(str);
-                    break;
-				case 0:
-					while(1) {
-						for(i=0;i<cfg.total_phubs && i<MAX_OPTS;i++)
-							sprintf(opt[i],"%-10.10s",cfg.phub[i]->name);
-						opt[i][0]=0;
-						i=WIN_ACT|WIN_RHT|WIN_SAV;
-						if(cfg.total_phubs<MAX_OPTS)
-							i|=WIN_INS|WIN_INSACT|WIN_XTR;
-						if(cfg.total_phubs)
-							i|=WIN_DEL;
+					case 8:
+						i=1;
 						uifc.helpbuf=
-							"`PostLink Network Hubs:`\n"
+							"`Use Aliases in NetMail:`\n"
 							"\n"
-							"This is a list of PostLink and/or PCRelay network hubs that your system\n"
-							"calls to exchange packets with.\n"
+							"If you allow aliases on your system and wish users to have their NetMail\n"
+							"contain their alias as the `From User`, set this option to `Yes`. If you\n"
+							"want all NetMail to be sent using users' real names, set this option to\n"
+							"`No`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"Use Aliases in NetMail",uifcYesNoOpts);
+						if(!i && !(cfg.netmail_misc&NMAIL_ALIAS)) {
+							uifc.changes=1;
+							cfg.netmail_misc|=NMAIL_ALIAS; 
+						}
+						else if(i==1 && cfg.netmail_misc&NMAIL_ALIAS) {
+							uifc.changes=1;
+							cfg.netmail_misc&=~NMAIL_ALIAS; 
+						}
+						break;
+					case 9:
+						i=1;
+						uifc.helpbuf=
+							"`NetMail Defaults to Crash Status:`\n"
 							"\n"
-							"To add a hub, select the desired location with the arrow keys and hit\n"
-							"~ INS ~.\n"
+							"If you want all NetMail to default to crash (send immediately) status,\n"
+							"set this option to `Yes`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"NetMail Defaults to Crash Status",uifcYesNoOpts);
+						if(!i && !(cfg.netmail_misc&NMAIL_CRASH)) {
+							uifc.changes=1;
+							cfg.netmail_misc|=NMAIL_CRASH; 
+						}
+						else if(i==1 && cfg.netmail_misc&NMAIL_CRASH) {
+							uifc.changes=1;
+							cfg.netmail_misc&=~NMAIL_CRASH; 
+						}
+						break;
+					case 10:
+						i=1;
+						uifc.helpbuf=
+							"`NetMail Defaults to Direct Status:`\n"
 							"\n"
-							"To delete a hub, select it and hit ~ DEL ~.\n"
+							"If you want all NetMail to default to direct (send directly) status,\n"
+							"set this option to `Yes`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"NetMail Defaults to Direct Status",uifcYesNoOpts);
+						if(!i && !(cfg.netmail_misc&NMAIL_DIRECT)) {
+							uifc.changes=1;
+							cfg.netmail_misc|=NMAIL_DIRECT; 
+						}
+						else if(i==1 && cfg.netmail_misc&NMAIL_DIRECT) {
+							uifc.changes=1;
+							cfg.netmail_misc&=~NMAIL_DIRECT; 
+						}
+						break;
+					case 11:
+						i=1;
+						uifc.helpbuf=
+							"`NetMail Defaults to Hold Status:`\n"
 							"\n"
-							"To configure a hub, select it and hit ~ ENTER ~.\n"
+							"If you want all NetMail to default to hold status, set this option to\n"
+							"`Yes`.\n"
 						;
-						i=uifc.list(i,0,0,0,&phub_dflt,0
-							,"PostLink Hubs",opt);
-						if(i==-1)
-							break;
-						int msk = i & MSK_ON;
-						i &= MSK_OFF;
-						if (msk == MSK_INS) {
-							if((cfg.phub=(phub_t **)realloc(cfg.phub
-                                ,sizeof(phub_t *)*(cfg.total_phubs+1)))==NULL) {
-                                errormsg(WHERE,ERR_ALLOC,nulstr
-                                    ,sizeof(phub_t *)*(cfg.total_phubs+1));
-								cfg.total_phubs=0;
-								bail(1);
-                                continue; 
-							}
-
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"NetMail Defaults to Hold Status",uifcYesNoOpts);
+						if(!i && !(cfg.netmail_misc&NMAIL_HOLD)) {
+							uifc.changes=1;
+							cfg.netmail_misc|=NMAIL_HOLD; 
+						}
+						else if(i==1 && cfg.netmail_misc&NMAIL_HOLD) {
+							uifc.changes=1;
+							cfg.netmail_misc&=~NMAIL_HOLD; 
+						}
+						break;
+					case 12:
+						i=0;
+						uifc.helpbuf=
+							"`Kill NetMail After it is Sent:`\n"
+							"\n"
+							"If you want NetMail messages to be deleted after they are successfully\n"
+							"sent, set this option to `Yes`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"Kill NetMail After it is Sent",uifcYesNoOpts);
+						if(!i && !(cfg.netmail_misc&NMAIL_KILL)) {
+							uifc.changes=1;
+							cfg.netmail_misc|=NMAIL_KILL; 
+						}
+						else if(i==1 && cfg.netmail_misc&NMAIL_KILL) {
+							uifc.changes=1;
+							cfg.netmail_misc&=~NMAIL_KILL; 
+						}
+						break;
+					case 13:
+						ultoa(cfg.netmail_cost,str,10);
+						uifc.helpbuf=
+							"`Cost in Credits to Send NetMail:`\n"
+							"\n"
+							"This is the number of credits it will cost your users to send NetMail.\n"
+							"If you want the sending of NetMail to be free, set this value to `0`.\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0
+							,"Cost in Credits to Send NetMail"
+							,str,10,K_EDIT|K_NUMBER);
+						cfg.netmail_cost=atol(str);
+						break; 
+				} 
+			} 
+		}
+		else if(i==3) {
+			done=0;
+			while(!done) {
+				i=0;
+				strcpy(opt[i++],"Network Hubs...");
+				sprintf(opt[i++],"%-20.20s%-12s","Site Name",cfg.sys_psname);
+				sprintf(opt[i++],"%-20.20s%-"PRIu32,"Site Number",cfg.sys_psnum);
+				opt[i][0]=0;
+				uifc.helpbuf=
+					"`PostLink Networks:`\n"
+					"\n"
+					"From this menu you can configure PostLink or PCRelay Networks.\n"
+				;
+				i=uifc.list(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&pnet_dflt,0
+					,"PostLink Networks",opt);
+				switch(i) {
+					case -1:	/* ESC */
+						done=1;
+						break;
+					case 1:
+						uifc.helpbuf=
+							"`PostLink Site Name:`\n"
+							"\n"
+							"If your system is networked via PostLink or PCRelay, this should be the\n"
+							"Site Name for your BBS.\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0,"Site Name"
+							,cfg.sys_psname,sizeof(cfg.sys_psname)-1,K_UPPER|K_EDIT);
+						break;
+					case 2:
+						uifc.helpbuf=
+							"`PostLink Site Number:`\n"
+							"\n"
+							"If your system is networked via PostLink or PCRelay, this should be the\n"
+							"Site Number for your BBS.\n"
+						;
+						ultoa(cfg.sys_psnum,str,10);
+						uifc.input(WIN_MID|WIN_SAV,0,0,"Site Number"
+							,str,10,K_NUMBER|K_EDIT);
+						cfg.sys_psnum=atol(str);
+						break;
+					case 0:
+						while(1) {
+							for(i=0;i<cfg.total_phubs && i<MAX_OPTS;i++)
+								sprintf(opt[i],"%-10.10s",cfg.phub[i]->name);
+							opt[i][0]=0;
+							i=WIN_ACT|WIN_RHT|WIN_SAV;
+							if(cfg.total_phubs<MAX_OPTS)
+								i|=WIN_INS|WIN_INSACT|WIN_XTR;
+							if(cfg.total_phubs)
+								i|=WIN_DEL;
 							uifc.helpbuf=
-								"`Network Hub Site Name:`\n"
+								"`PostLink Network Hubs:`\n"
+								"\n"
+								"This is a list of PostLink and/or PCRelay network hubs that your system\n"
+								"calls to exchange packets with.\n"
 								"\n"
-								"This is the Site Name of this hub. It is used for only for reference.\n"
+								"To add a hub, select the desired location with the arrow keys and hit\n"
+								"~ INS ~.\n"
+								"\n"
+								"To delete a hub, select it and hit ~ DEL ~.\n"
+								"\n"
+								"To configure a hub, select it and hit ~ ENTER ~.\n"
 							;
-							if(uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Site Name",str,10,K_UPPER)<1)
-								continue;
+							i=uifc.list(i,0,0,0,&phub_dflt,0
+								,"PostLink Hubs",opt);
+							if(i==-1)
+								break;
+							int msk = i & MSK_ON;
+							i &= MSK_OFF;
+							if (msk == MSK_INS) {
+								if((cfg.phub=(phub_t **)realloc(cfg.phub
+									,sizeof(phub_t *)*(cfg.total_phubs+1)))==NULL) {
+									errormsg(WHERE,ERR_ALLOC,nulstr
+										,sizeof(phub_t *)*(cfg.total_phubs+1));
+									cfg.total_phubs=0;
+									bail(1);
+									continue; 
+								}
 
-							for(j=cfg.total_phubs;j>i;j--)
-                                cfg.phub[j]=cfg.phub[j-1];
+								uifc.helpbuf=
+									"`Network Hub Site Name:`\n"
+									"\n"
+									"This is the Site Name of this hub. It is used for only for reference.\n"
+								;
+								if(uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Site Name",str,10,K_UPPER)<1)
+									continue;
 
-							if((cfg.phub[i]=(phub_t *)malloc(sizeof(phub_t)))
-								==NULL) {
-								errormsg(WHERE,ERR_ALLOC,nulstr
-									,sizeof(phub_t));
+								for(j=cfg.total_phubs;j>i;j--)
+									cfg.phub[j]=cfg.phub[j-1];
+
+								if((cfg.phub[i]=(phub_t *)malloc(sizeof(phub_t)))
+									==NULL) {
+									errormsg(WHERE,ERR_ALLOC,nulstr
+										,sizeof(phub_t));
+									continue; 
+								}
+								memset(cfg.phub[i],0,sizeof(phub_t));
+								strcpy(cfg.phub[i]->name,str);
+								strcpy(cfg.phub[i]->call,"%!pnet");
+								cfg.phub[i]->node=1;
+								cfg.phub[i]->days=(uchar)0xff; /* all days */
+								cfg.total_phubs++;
+								uifc.changes=1;
+								continue; 
+							}
+							if (msk == MSK_DEL) {
+								free(cfg.phub[i]);
+								cfg.total_phubs--;
+								while(i<cfg.total_phubs) {
+									cfg.phub[i]=cfg.phub[i+1];
+									i++; 
+								}
+								uifc.changes=1;
 								continue; 
 							}
-							memset(cfg.phub[i],0,sizeof(phub_t));
-							strcpy(cfg.phub[i]->name,str);
-							strcpy(cfg.phub[i]->call,"%!pnet");
-							cfg.phub[i]->node=1;
-							cfg.phub[i]->days=(uchar)0xff; /* all days */
-							cfg.total_phubs++;
+							phub_edit(i); 
+						}
+						break; 
+				} 
+			} 
+		}
+
+		else if(i==0) { 	/* Internet E-mail */
+			done=0;
+			while(!done) {
+				i=0;
+				sprintf(opt[i++],"%-27.27s%s"
+					,"System Address",cfg.sys_inetaddr);
+				sprintf(opt[i++],"%-27.27s%.40s"
+					,"Inbound E-mail Semaphore",cfg.smtpmail_sem);
+				sprintf(opt[i++],"%-27.27s%.40s"
+					,"Outbound E-mail Semaphore",cfg.inetmail_sem);
+				sprintf(opt[i++],"%-27.27s%s"
+					,"Allow Sending of E-mail"
+					,cfg.inetmail_misc&NMAIL_ALLOW ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%s"
+					,"Allow File Attachments"
+					,cfg.inetmail_misc&NMAIL_FILE ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%s"
+					,"Send E-mail Using Alias"
+					,cfg.inetmail_misc&NMAIL_ALIAS ? "Yes":"No");
+				sprintf(opt[i++],"%-27.27s%"PRIu32
+					,"Cost to Send E-mail",cfg.inetmail_cost);
+				opt[i][0]=0;
+				uifc.helpbuf=
+					"`Internet E-mail:`\n"
+					"\n"
+					"This menu contains configuration options that pertain specifically to\n"
+					"Internet E-mail.\n"
+				;
+				i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&inet_dflt,0
+					,"Internet E-mail",opt);
+				switch(i) {
+					case -1:	/* ESC */
+						done=1;
+						break;
+					case 0:
+						uifc.helpbuf=
+							"`Sytem Internet Address:`\n"
+							"\n"
+							"Enter your system's Internet address (hostname or IP address) here\n"
+							"(e.g. `joesbbs.com`).\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0,""
+							,cfg.sys_inetaddr,sizeof(cfg.sys_inetaddr)-1,K_EDIT);
+						break;
+					case 1:
+						uifc.helpbuf=
+							"`Inbound Internet E-mail Semaphore File:`\n"
+							"\n"
+							"This is a filename that will be used as a semaphore (signal) to any\n"
+							"external Internet e-mail processors that new mail has been received\n"
+							"and the message base should be re-scanned.\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound Semaphore"
+							,cfg.smtpmail_sem,sizeof(cfg.smtpmail_sem)-1,K_EDIT);
+						break;
+					case 2:
+						uifc.helpbuf=
+							"`Outbound Internet E-mail Semaphore File:`\n"
+							"\n"
+							"This is a filename that will be used as a semaphore (signal) to any\n"
+							"external Internet gateways (if supported) that new mail has been created\n"
+							"and the message base should be re-scanned.\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Semaphore"
+							,cfg.inetmail_sem,sizeof(cfg.inetmail_sem)-1,K_EDIT);
+						break;
+					case 3:
+						i=0;
+						uifc.helpbuf=
+							"`Allow Users to Send Internet E-mail:`\n"
+							"\n"
+							"If you want your users to be allowed to send Internet E-mail, set this\n"
+							"option to `Yes`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"Allow Users to Send E-mail",uifcYesNoOpts);
+						if(!i && !(cfg.inetmail_misc&NMAIL_ALLOW)) {
 							uifc.changes=1;
-							continue; 
+							cfg.inetmail_misc|=NMAIL_ALLOW; 
 						}
-						if (msk == MSK_DEL) {
-							free(cfg.phub[i]);
-							cfg.total_phubs--;
-							while(i<cfg.total_phubs) {
-								cfg.phub[i]=cfg.phub[i+1];
-								i++; 
-							}
+						else if(i==1 && cfg.inetmail_misc&NMAIL_ALLOW) {
+							uifc.changes=1;
+							cfg.inetmail_misc&=~NMAIL_ALLOW; 
+						}
+						break;
+					case 4:
+						i=0;
+						uifc.helpbuf=
+							"`Allow Users to Send Internet E-mail File Attachments:`\n"
+							"\n"
+							"If you want your users to be allowed to send Internet E-mail with file\n"
+							"attachments, set this option to `Yes`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"Allow Users to Send E-mail with File Attachments",uifcYesNoOpts);
+						if(!i && !(cfg.inetmail_misc&NMAIL_FILE)) {
+							uifc.changes=1;
+							cfg.inetmail_misc|=NMAIL_FILE; 
+						}
+						else if(i==1 && cfg.inetmail_misc&NMAIL_FILE) {
+							uifc.changes=1;
+							cfg.inetmail_misc&=~NMAIL_FILE; 
+						}
+						break;
+					case 5:
+						i=1;
+						uifc.helpbuf=
+							"`Use Aliases in Internet E-mail:`\n"
+							"\n"
+							"If you allow aliases on your system and wish users to have their\n"
+							"Internet E-mail contain their alias as the `From User`, set this option to\n"
+							"`Yes`. If you want all E-mail to be sent using users' real names, set this\n"
+							"option to `No`.\n"
+						;
+						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+							,"Use Aliases in Internet E-mail",uifcYesNoOpts);
+						if(!i && !(cfg.inetmail_misc&NMAIL_ALIAS)) {
 							uifc.changes=1;
-							continue; 
+							cfg.inetmail_misc|=NMAIL_ALIAS; 
 						}
-						phub_edit(i); 
-					}
-                    break; 
+						else if(i==1 && cfg.inetmail_misc&NMAIL_ALIAS) {
+							uifc.changes=1;
+							cfg.inetmail_misc&=~NMAIL_ALIAS; 
+						}
+						break;
+					case 6:
+						ultoa(cfg.inetmail_cost,str,10);
+						uifc.helpbuf=
+							"`Cost in Credits to Send Internet E-mail:`\n"
+							"\n"
+							"This is the number of credits it will cost your users to send Internet\n"
+							"E-mail. If you want the sending of Internet E-mail to be free, set this\n"
+							"value to `0`.\n"
+						;
+						uifc.input(WIN_MID|WIN_SAV,0,0
+							,"Cost in Credits to Send Internet E-mail"
+							,str,10,K_EDIT|K_NUMBER);
+						cfg.inetmail_cost=atol(str);
+						break; 
+				} 
 			} 
-		} 
-	}
+		}
 
-	else if(i==0) { 	/* Internet E-mail */
-		done=0;
-		while(!done) {
-			i=0;
-			sprintf(opt[i++],"%-27.27s%s"
-				,"System Address",cfg.sys_inetaddr);
-			sprintf(opt[i++],"%-27.27s%.40s"
-				,"Inbound E-mail Semaphore",cfg.smtpmail_sem);
-			sprintf(opt[i++],"%-27.27s%.40s"
-				,"Outbound E-mail Semaphore",cfg.inetmail_sem);
-			sprintf(opt[i++],"%-27.27s%s"
-				,"Allow Sending of E-mail"
-				,cfg.inetmail_misc&NMAIL_ALLOW ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%s"
-				,"Allow File Attachments"
-				,cfg.inetmail_misc&NMAIL_FILE ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%s"
-				,"Send E-mail Using Alias"
-				,cfg.inetmail_misc&NMAIL_ALIAS ? "Yes":"No");
-			sprintf(opt[i++],"%-27.27s%"PRIu32
-				,"Cost to Send E-mail",cfg.inetmail_cost);
-			opt[i][0]=0;
-			uifc.helpbuf=
-				"`Internet E-mail:`\n"
-				"\n"
-				"This menu contains configuration options that pertain specifically to\n"
-				"Internet E-mail.\n"
-			;
-			i=uifc.list(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&inet_dflt,0
-				,"Internet E-mail",opt);
-			switch(i) {
-				case -1:	/* ESC */
-					done=1;
-					break;
-				case 0:
-					uifc.helpbuf=
-						"`Sytem Internet Address:`\n"
-						"\n"
-						"Enter your system's Internet address (hostname or IP address) here\n"
-						"(e.g. `joesbbs.com`).\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,""
-						,cfg.sys_inetaddr,sizeof(cfg.sys_inetaddr)-1,K_EDIT);
-                    break;
-				case 1:
-					uifc.helpbuf=
-						"`Inbound Internet E-mail Semaphore File:`\n"
-						"\n"
-						"This is a filename that will be used as a semaphore (signal) to any\n"
-						"external Internet e-mail processors that new mail has been received\n"
-						"and the message base should be re-scanned.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound Semaphore"
-						,cfg.smtpmail_sem,sizeof(cfg.smtpmail_sem)-1,K_EDIT);
-                    break;
-				case 2:
-					uifc.helpbuf=
-						"`Outbound Internet E-mail Semaphore File:`\n"
-						"\n"
-						"This is a filename that will be used as a semaphore (signal) to any\n"
-						"external Internet gateways (if supported) that new mail has been created\n"
-						"and the message base should be re-scanned.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Semaphore"
-						,cfg.inetmail_sem,sizeof(cfg.inetmail_sem)-1,K_EDIT);
-                    break;
-				case 3:
-					i=0;
-					uifc.helpbuf=
-						"`Allow Users to Send Internet E-mail:`\n"
-						"\n"
-						"If you want your users to be allowed to send Internet E-mail, set this\n"
-						"option to `Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"Allow Users to Send E-mail",uifcYesNoOpts);
-					if(!i && !(cfg.inetmail_misc&NMAIL_ALLOW)) {
-						uifc.changes=1;
-						cfg.inetmail_misc|=NMAIL_ALLOW; 
-					}
-					else if(i==1 && cfg.inetmail_misc&NMAIL_ALLOW) {
-						uifc.changes=1;
-						cfg.inetmail_misc&=~NMAIL_ALLOW; 
-					}
-					break;
-				case 4:
-					i=0;
-					uifc.helpbuf=
-						"`Allow Users to Send Internet E-mail File Attachments:`\n"
-						"\n"
-						"If you want your users to be allowed to send Internet E-mail with file\n"
-						"attachments, set this option to `Yes`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"Allow Users to Send E-mail with File Attachments",uifcYesNoOpts);
-					if(!i && !(cfg.inetmail_misc&NMAIL_FILE)) {
-						uifc.changes=1;
-						cfg.inetmail_misc|=NMAIL_FILE; 
-					}
-					else if(i==1 && cfg.inetmail_misc&NMAIL_FILE) {
-						uifc.changes=1;
-						cfg.inetmail_misc&=~NMAIL_FILE; 
-					}
-                    break;
-				case 5:
-					i=1;
-					uifc.helpbuf=
-						"`Use Aliases in Internet E-mail:`\n"
-						"\n"
-						"If you allow aliases on your system and wish users to have their\n"
-						"Internet E-mail contain their alias as the `From User`, set this option to\n"
-						"`Yes`. If you want all E-mail to be sent using users' real names, set this\n"
-						"option to `No`.\n"
-					;
-					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-						,"Use Aliases in Internet E-mail",uifcYesNoOpts);
-					if(!i && !(cfg.inetmail_misc&NMAIL_ALIAS)) {
-						uifc.changes=1;
-						cfg.inetmail_misc|=NMAIL_ALIAS; 
-					}
-					else if(i==1 && cfg.inetmail_misc&NMAIL_ALIAS) {
-						uifc.changes=1;
-						cfg.inetmail_misc&=~NMAIL_ALIAS; 
-					}
-					break;
-				case 6:
-					ultoa(cfg.inetmail_cost,str,10);
-					uifc.helpbuf=
-						"`Cost in Credits to Send Internet E-mail:`\n"
-						"\n"
-						"This is the number of credits it will cost your users to send Internet\n"
-						"E-mail. If you want the sending of Internet E-mail to be free, set this\n"
-						"value to `0`.\n"
-					;
-					uifc.input(WIN_MID|WIN_SAV,0,0
-						,"Cost in Credits to Send Internet E-mail"
-						,str,10,K_EDIT|K_NUMBER);
-					cfg.inetmail_cost=atol(str);
-					break; 
-			} 
-		} 
+		else { /* ESC */
+			i=save_changes(WIN_MID|WIN_SAV);
+			if(i==-1)
+				continue;
+			if(!i) {
+				write_msgs_cfg(&cfg,backup_level);
+				refresh_cfg(&cfg);
+			}
+			break;
+		}
 	}
-
-	else { /* ESC */
-		i=save_changes(WIN_MID|WIN_SAV);
-		if(i==-1)
-			continue;
-		if(!i) {
-			write_msgs_cfg(&cfg,backup_level);
-            refresh_cfg(&cfg);
-        }
-		break;
-        }
-    }
 }
 
 void qhub_edit(int num)
@@ -923,238 +923,238 @@ void qhub_edit(int num)
 	char *p,done=0,str[256];
 	int i,j;
 
-while(!done) {
-	i=0;
-	sprintf(opt[i++],"%-27.27s%s","Hub System ID",cfg.qhub[num]->id);
-	sprintf(opt[i++],"%-27.27s%.40s","Pack Command Line",cfg.qhub[num]->pack);
-	sprintf(opt[i++],"%-27.27s%.40s","Unpack Command Line",cfg.qhub[num]->unpack);
-	sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.qhub[num]->call);
-	sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.qhub[num]->node);
-	sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.qhub[num]->days));
-	if(cfg.qhub[num]->freq) {
-		sprintf(str,"%u times a day",1440/cfg.qhub[num]->freq);
-		sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); 
-	}
-	else {
-		sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60,cfg.qhub[num]->time%60);
-		sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); 
-	}
-	sprintf(opt[i++],"%-27.27s%s","Include Kludge Lines", cfg.qhub[num]->misc&QHUB_NOKLUDGES ? "No":"Yes");
-	sprintf(opt[i++],"%-27.27s%s","Include VOTING.DAT File", cfg.qhub[num]->misc&QHUB_NOVOTING ? "No":"Yes");
-	sprintf(opt[i++],"%-27.27s%s","Include HEADERS.DAT File", cfg.qhub[num]->misc&QHUB_NOHEADERS ? "No":"Yes");
-	sprintf(opt[i++],"%-27.27s%s","Extended (QWKE) Packets", cfg.qhub[num]->misc&QHUB_EXT ? "Yes":"No");
-	sprintf(opt[i++],"%-27.27s%s","Exported Ctrl-A Codes"
-		,cfg.qhub[num]->misc&QHUB_EXPCTLA ? "Expand" : cfg.qhub[num]->misc&QHUB_RETCTLA ? "Leave in" : "Strip");
-	strcpy(opt[i++],"Import Conferences...");
-	strcpy(opt[i++],"Networked Sub-boards...");
-	opt[i][0]=0;
-	sprintf(str,"%s QWK Network Hub",cfg.qhub[num]->id);
-	uifc.helpbuf=
-		"`QWK Network Hub Configuration:`\n"
-		"\n"
-		"This menu allows you to configure options specific to this QWKnet hub.\n"
-		"\n"
-		"The `Hub System ID` must match the QWK System ID of this network hub.\n"
-		"\n"
-		"The `Pack` and `Unpack Command Lines` are used for creating and extracting\n"
-		"REP (reply) and QWK message packets (files, usually in PKZIP format).\n"
-		"\n"
-		"The `Call-out Command Line` is executed when your system attempts a packet\n"
-		"exchange with the QWKnet hub (e.g. executes a script).\n"
-		"\n"
-		"`Kludge Lines` (e.g. @TZ, @VIA, @MSGID, @REPLY) provide information not\n"
-		"available in standard QWK message headers, but are superfluous when the\n"
-		"HEADERS.DAT file is supported and used.\n"
-		"\n"
-		"The `VOTING.DAT` file is the distributed QWKnet voting system supported\n"
-		"in Synchronet v3.17 and later\n"
-		"\n"
-		"The `HEADERS.DAT` file provides all the same information that can be\n"
-		"found in Kludge Lines and also addresses the 25-character QWK field\n"
-		"length limits. HEADERS.DAT is supported in Synchronet v3.15 and later.\n"
-		"\n"
-		"`Extended (QWKE) Packets` are not normally used in QWK Networking.\n"
-		"Setting this to `Yes` enables some QWKE-specific Kludge Lines that are\n"
-		"superfluous when the HEADERS.DAT file is supported and used.\n"
-		"\n"
-		"`Exported Ctrl-A Codes` determines how Synchronet attribute/color\n"
-		"codes in messages are exported into the QWK network packets. This\n"
-		"may be set to `Leave in` (retain), `Expand` (to ANSI), or `Strip` (remove).\n"
-		"This setting is used for QWKnet NetMail messages and may over-ride the\n"
-		"equivalent setting for each sub-board.\n"
-		"\n"
-		"`Import Conferences...` allows you to import a QWK `control.dat` file which\n"
-		"can both create new sub-boards in a target message group of your choice\n"
-		"and set the `Networked Sub-boards` with QWK conference numbers correlating\n"
-		"with the hub system.\n"
-		"\n"
-		"`Networked Sub-boards...` allows you to manually add, remove, or modify\n"
-		"local sub-board associations with conferences on this QWK network hub.\n"
-	;
-	switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&qhub_dflt,0
-		,str,opt)) {
-		case -1:
-			done=1;
-			break;
-		case 0:
-			uifc.helpbuf=
-				"`QWK Network Hub System ID:`\n"
-				"\n"
-				"This is the QWK System ID of this hub. It is used for incoming and\n"
-				"outgoing network packets and must be accurate.\n"
-			;
-			strcpy(str,cfg.qhub[num]->id);	/* save */
-			if(!uifc.input(WIN_MID|WIN_SAV,0,0,"QWK Network Hub System ID"
-				,cfg.qhub[num]->id,LEN_QWKID,K_UPPER|K_EDIT))
-				strcpy(cfg.qhub[num]->id,str);
-			break;
-		case 1:
-			uifc.helpbuf=
-				"`REP Packet Creation Command:`\n"
-				"\n"
-				"This is the command line to use to create (compress) REP packets for\n"
-				"this QWK network hub.\n"
-			;
-			uifc.input(WIN_MID|WIN_SAV,0,0,""
-				,cfg.qhub[num]->pack,sizeof(cfg.qhub[num]->pack)-1,K_EDIT);
-			break;
-		case 2:
-			uifc.helpbuf=
-				"`QWK Packet Extraction Command:`\n"
-				"\n"
-				"This is the command line to use to extract (decompress) QWK packets from\n"
-				"this QWK network hub.\n"
-			;
-			uifc.input(WIN_MID|WIN_SAV,0,0,""
-				,cfg.qhub[num]->unpack,sizeof(cfg.qhub[num]->unpack)-1,K_EDIT);
-			break;
-		case 3:
-			uifc.helpbuf=
-				"`QWK Network Hub Call-out Command Line:`\n"
-				"\n"
-				"This is the command line to use to initiate a call-out to this QWK\n"
-				"network hub.\n"
-			;
-			uifc.input(WIN_MID|WIN_SAV,0,0,""
-				,cfg.qhub[num]->call,sizeof(cfg.qhub[num]->call)-1,K_EDIT);
-			break;
-		case 4:
-			sprintf(str,"%u",cfg.qhub[num]->node);
-			uifc.helpbuf=
-				"`Node to Perform Call-out:`\n"
-				"\n"
-				"This is the number of the node to perform the call-out for this QWK\n"
-				"network hub.\n"
-			;
-			uifc.input(WIN_MID|WIN_SAV,0,0
-				,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER);
-			cfg.qhub[num]->node=atoi(str);
-			break;
-		case 5:
-			j=0;
-			while(1) {
-				for(i=0;i<7;i++)
-					sprintf(opt[i],"%s        %s"
-						,wday[i],(cfg.qhub[num]->days&(1<<i)) ? "Yes":"No");
-				opt[i][0]=0;
+	while(!done) {
+		i=0;
+		sprintf(opt[i++],"%-27.27s%s","Hub System ID",cfg.qhub[num]->id);
+		sprintf(opt[i++],"%-27.27s%.40s","Pack Command Line",cfg.qhub[num]->pack);
+		sprintf(opt[i++],"%-27.27s%.40s","Unpack Command Line",cfg.qhub[num]->unpack);
+		sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.qhub[num]->call);
+		sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.qhub[num]->node);
+		sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.qhub[num]->days));
+		if(cfg.qhub[num]->freq) {
+			sprintf(str,"%u times a day",1440/cfg.qhub[num]->freq);
+			sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); 
+		}
+		else {
+			sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60,cfg.qhub[num]->time%60);
+			sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); 
+		}
+		sprintf(opt[i++],"%-27.27s%s","Include Kludge Lines", cfg.qhub[num]->misc&QHUB_NOKLUDGES ? "No":"Yes");
+		sprintf(opt[i++],"%-27.27s%s","Include VOTING.DAT File", cfg.qhub[num]->misc&QHUB_NOVOTING ? "No":"Yes");
+		sprintf(opt[i++],"%-27.27s%s","Include HEADERS.DAT File", cfg.qhub[num]->misc&QHUB_NOHEADERS ? "No":"Yes");
+		sprintf(opt[i++],"%-27.27s%s","Extended (QWKE) Packets", cfg.qhub[num]->misc&QHUB_EXT ? "Yes":"No");
+		sprintf(opt[i++],"%-27.27s%s","Exported Ctrl-A Codes"
+			,cfg.qhub[num]->misc&QHUB_EXPCTLA ? "Expand" : cfg.qhub[num]->misc&QHUB_RETCTLA ? "Leave in" : "Strip");
+		strcpy(opt[i++],"Import Conferences...");
+		strcpy(opt[i++],"Networked Sub-boards...");
+		opt[i][0]=0;
+		sprintf(str,"%s QWK Network Hub",cfg.qhub[num]->id);
+		uifc.helpbuf=
+			"`QWK Network Hub Configuration:`\n"
+			"\n"
+			"This menu allows you to configure options specific to this QWKnet hub.\n"
+			"\n"
+			"The `Hub System ID` must match the QWK System ID of this network hub.\n"
+			"\n"
+			"The `Pack` and `Unpack Command Lines` are used for creating and extracting\n"
+			"REP (reply) and QWK message packets (files, usually in PKZIP format).\n"
+			"\n"
+			"The `Call-out Command Line` is executed when your system attempts a packet\n"
+			"exchange with the QWKnet hub (e.g. executes a script).\n"
+			"\n"
+			"`Kludge Lines` (e.g. @TZ, @VIA, @MSGID, @REPLY) provide information not\n"
+			"available in standard QWK message headers, but are superfluous when the\n"
+			"HEADERS.DAT file is supported and used.\n"
+			"\n"
+			"The `VOTING.DAT` file is the distributed QWKnet voting system supported\n"
+			"in Synchronet v3.17 and later\n"
+			"\n"
+			"The `HEADERS.DAT` file provides all the same information that can be\n"
+			"found in Kludge Lines and also addresses the 25-character QWK field\n"
+			"length limits. HEADERS.DAT is supported in Synchronet v3.15 and later.\n"
+			"\n"
+			"`Extended (QWKE) Packets` are not normally used in QWK Networking.\n"
+			"Setting this to `Yes` enables some QWKE-specific Kludge Lines that are\n"
+			"superfluous when the HEADERS.DAT file is supported and used.\n"
+			"\n"
+			"`Exported Ctrl-A Codes` determines how Synchronet attribute/color\n"
+			"codes in messages are exported into the QWK network packets. This\n"
+			"may be set to `Leave in` (retain), `Expand` (to ANSI), or `Strip` (remove).\n"
+			"This setting is used for QWKnet NetMail messages and may over-ride the\n"
+			"equivalent setting for each sub-board.\n"
+			"\n"
+			"`Import Conferences...` allows you to import a QWK `control.dat` file which\n"
+			"can both create new sub-boards in a target message group of your choice\n"
+			"and set the `Networked Sub-boards` with QWK conference numbers correlating\n"
+			"with the hub system.\n"
+			"\n"
+			"`Networked Sub-boards...` allows you to manually add, remove, or modify\n"
+			"local sub-board associations with conferences on this QWK network hub.\n"
+		;
+		switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&qhub_dflt,0
+			,str,opt)) {
+			case -1:
+				done=1;
+				break;
+			case 0:
 				uifc.helpbuf=
-					"`Days to Perform Call-out:`\n"
+					"`QWK Network Hub System ID:`\n"
 					"\n"
-					"These are the days that a call-out will be performed for this QWK\n"
-					"network hub.\n"
+					"This is the QWK System ID of this hub. It is used for incoming and\n"
+					"outgoing network packets and must be accurate.\n"
 				;
-				i=uifc.list(WIN_MID,0,0,0,&j,0
-					,"Days to Perform Call-out",opt);
-				if(i==-1)
-					break;
-				cfg.qhub[num]->days^=(1<<i);
-				uifc.changes=1; 
-			}
-			break;
-		case 6:
-			i=1;
-			uifc.helpbuf=
-				"`Perform Call-out at a Specific Time:`\n"
-				"\n"
-				"If you want the system call this QWK network hub at a specific time,\n"
-				"set this option to `Yes`. If you want the system to call this network\n"
-				"hub more than once a day at predetermined intervals, set this option to\n"
-				"`No`.\n"
-			;
-			i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-				,"Perform Call-out at a Specific Time",uifcYesNoOpts);
-			if(i==0) {
-				sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60
-					,cfg.qhub[num]->time%60);
+				strcpy(str,cfg.qhub[num]->id);	/* save */
+				if(!uifc.input(WIN_MID|WIN_SAV,0,0,"QWK Network Hub System ID"
+					,cfg.qhub[num]->id,LEN_QWKID,K_UPPER|K_EDIT))
+					strcpy(cfg.qhub[num]->id,str);
+				break;
+			case 1:
 				uifc.helpbuf=
-					"`Time to Perform Call-out:`\n"
+					"`REP Packet Creation Command:`\n"
 					"\n"
-					"This is the time (in 24 hour HH:MM format) to perform the call-out to\n"
+					"This is the command line to use to create (compress) REP packets for\n"
 					"this QWK network hub.\n"
 				;
-				if(uifc.input(WIN_MID|WIN_SAV,0,0
-					,"Time to Perform Call-out (HH:MM)"
-					,str,5,K_UPPER|K_EDIT)>0) {
-					cfg.qhub[num]->freq=0;
-					cfg.qhub[num]->time=atoi(str)*60;
-					if((p=strchr(str,':'))!=NULL)
-						cfg.qhub[num]->time+=atoi(p+1); 
-				} 
-			}
-			else if(i==1) {
-				sprintf(str,"%u",cfg.qhub[num]->freq
-					&& cfg.qhub[num]->freq<=1440 ? 1440/cfg.qhub[num]->freq : 0);
+				uifc.input(WIN_MID|WIN_SAV,0,0,""
+					,cfg.qhub[num]->pack,sizeof(cfg.qhub[num]->pack)-1,K_EDIT);
+				break;
+			case 2:
 				uifc.helpbuf=
-					"`Number of Call-outs Per Day:`\n"
+					"`QWK Packet Extraction Command:`\n"
 					"\n"
-					"This is the maximum number of times the system will perform a call-out\n"
-					"per day to this QWK network hub. This value is actually converted by\n"
-					"Synchronet into minutes between call-outs and when the BBS is idle\n"
-					"and this number of minutes since the last call-out is reached, it will\n"
-					"perform a call-out.\n"
+					"This is the command line to use to extract (decompress) QWK packets from\n"
+					"this QWK network hub.\n"
 				;
-				if(uifc.input(WIN_MID|WIN_SAV,0,0
-					,"Number of Call-outs Per Day"
-					,str,4,K_NUMBER|K_EDIT)>0) {
-					cfg.qhub[num]->time=0;
-					i=atoi(str);
-					if(i && i<=1440)
-						cfg.qhub[num]->freq=1440/i;
-					else
-						cfg.qhub[num]->freq=0; 
-				} 
-			}
-			break;
-		case 7:
-			cfg.qhub[num]->misc^=QHUB_NOKLUDGES;
-			uifc.changes=1;
-			break;
-		case 8:
-			cfg.qhub[num]->misc^=QHUB_NOVOTING;
-			uifc.changes=1;
-			break;
-		case 9:
-			cfg.qhub[num]->misc^=QHUB_NOHEADERS;
-			uifc.changes=1;
-			break;
-		case 10:
-			cfg.qhub[num]->misc^=QHUB_EXT;
-			uifc.changes=1;
-			break;
-		case 11:
-			i = cfg.qhub[num]->misc&QHUB_CTRL_A;
-			i++;
-			if(i == QHUB_CTRL_A) i = 0;
-			cfg.qhub[num]->misc &= ~QHUB_CTRL_A;
-			cfg.qhub[num]->misc |= i;
-			uifc.changes=1;
-			break;
-		case 12:
-			import_qwk_conferences(num);
-			break;
-		case 13:
-			qhub_sub_edit(num);
-			break; 
+				uifc.input(WIN_MID|WIN_SAV,0,0,""
+					,cfg.qhub[num]->unpack,sizeof(cfg.qhub[num]->unpack)-1,K_EDIT);
+				break;
+			case 3:
+				uifc.helpbuf=
+					"`QWK Network Hub Call-out Command Line:`\n"
+					"\n"
+					"This is the command line to use to initiate a call-out to this QWK\n"
+					"network hub.\n"
+				;
+				uifc.input(WIN_MID|WIN_SAV,0,0,""
+					,cfg.qhub[num]->call,sizeof(cfg.qhub[num]->call)-1,K_EDIT);
+				break;
+			case 4:
+				sprintf(str,"%u",cfg.qhub[num]->node);
+				uifc.helpbuf=
+					"`Node to Perform Call-out:`\n"
+					"\n"
+					"This is the number of the node to perform the call-out for this QWK\n"
+					"network hub.\n"
+				;
+				uifc.input(WIN_MID|WIN_SAV,0,0
+					,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER);
+				cfg.qhub[num]->node=atoi(str);
+				break;
+			case 5:
+				j=0;
+				while(1) {
+					for(i=0;i<7;i++)
+						sprintf(opt[i],"%s        %s"
+							,wday[i],(cfg.qhub[num]->days&(1<<i)) ? "Yes":"No");
+					opt[i][0]=0;
+					uifc.helpbuf=
+						"`Days to Perform Call-out:`\n"
+						"\n"
+						"These are the days that a call-out will be performed for this QWK\n"
+						"network hub.\n"
+					;
+					i=uifc.list(WIN_MID,0,0,0,&j,0
+						,"Days to Perform Call-out",opt);
+					if(i==-1)
+						break;
+					cfg.qhub[num]->days^=(1<<i);
+					uifc.changes=1; 
+				}
+				break;
+			case 6:
+				i=1;
+				uifc.helpbuf=
+					"`Perform Call-out at a Specific Time:`\n"
+					"\n"
+					"If you want the system call this QWK network hub at a specific time,\n"
+					"set this option to `Yes`. If you want the system to call this network\n"
+					"hub more than once a day at predetermined intervals, set this option to\n"
+					"`No`.\n"
+				;
+				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+					,"Perform Call-out at a Specific Time",uifcYesNoOpts);
+				if(i==0) {
+					sprintf(str,"%2.2u:%2.2u",cfg.qhub[num]->time/60
+						,cfg.qhub[num]->time%60);
+					uifc.helpbuf=
+						"`Time to Perform Call-out:`\n"
+						"\n"
+						"This is the time (in 24 hour HH:MM format) to perform the call-out to\n"
+						"this QWK network hub.\n"
+					;
+					if(uifc.input(WIN_MID|WIN_SAV,0,0
+						,"Time to Perform Call-out (HH:MM)"
+						,str,5,K_UPPER|K_EDIT)>0) {
+						cfg.qhub[num]->freq=0;
+						cfg.qhub[num]->time=atoi(str)*60;
+						if((p=strchr(str,':'))!=NULL)
+							cfg.qhub[num]->time+=atoi(p+1); 
+					} 
+				}
+				else if(i==1) {
+					sprintf(str,"%u",cfg.qhub[num]->freq
+						&& cfg.qhub[num]->freq<=1440 ? 1440/cfg.qhub[num]->freq : 0);
+					uifc.helpbuf=
+						"`Number of Call-outs Per Day:`\n"
+						"\n"
+						"This is the maximum number of times the system will perform a call-out\n"
+						"per day to this QWK network hub. This value is actually converted by\n"
+						"Synchronet into minutes between call-outs and when the BBS is idle\n"
+						"and this number of minutes since the last call-out is reached, it will\n"
+						"perform a call-out.\n"
+					;
+					if(uifc.input(WIN_MID|WIN_SAV,0,0
+						,"Number of Call-outs Per Day"
+						,str,4,K_NUMBER|K_EDIT)>0) {
+						cfg.qhub[num]->time=0;
+						i=atoi(str);
+						if(i && i<=1440)
+							cfg.qhub[num]->freq=1440/i;
+						else
+							cfg.qhub[num]->freq=0; 
+					} 
+				}
+				break;
+			case 7:
+				cfg.qhub[num]->misc^=QHUB_NOKLUDGES;
+				uifc.changes=1;
+				break;
+			case 8:
+				cfg.qhub[num]->misc^=QHUB_NOVOTING;
+				uifc.changes=1;
+				break;
+			case 9:
+				cfg.qhub[num]->misc^=QHUB_NOHEADERS;
+				uifc.changes=1;
+				break;
+			case 10:
+				cfg.qhub[num]->misc^=QHUB_EXT;
+				uifc.changes=1;
+				break;
+			case 11:
+				i = cfg.qhub[num]->misc&QHUB_CTRL_A;
+				i++;
+				if(i == QHUB_CTRL_A) i = 0;
+				cfg.qhub[num]->misc &= ~QHUB_CTRL_A;
+				cfg.qhub[num]->misc |= i;
+				uifc.changes=1;
+				break;
+			case 12:
+				import_qwk_conferences(num);
+				break;
+			case 13:
+				qhub_sub_edit(num);
+				break; 
 		} 
 	}
 }
@@ -1190,141 +1190,141 @@ void qhub_sub_edit(uint num)
 		"this option to `Strip out`.\n"
 		;
 
-k=0;
-while(1) {
-	unsigned opts = 0;
-	for(j=0;j<cfg.qhub[num]->subs;j++) {
-		if(cfg.qhub[num]->sub[j] == NULL)
-			continue;
-		sprintf(opt[opts++],"%-5u %-*.*s %-*.*s"
-			,cfg.qhub[num]->conf[j]
-			,LEN_GSNAME,LEN_GSNAME
-			,cfg.grp[cfg.qhub[num]->sub[j]->grp]->sname
-			,LEN_SSNAME,LEN_SSNAME
-			,cfg.qhub[num]->sub[j]->sname);
-	}
-	opt[opts][0]=0;
-	int mode =WIN_BOT|WIN_SAV|WIN_ACT;
-	if(cfg.qhub[num]->subs<MAX_OPTS)
-		mode |= WIN_INS|WIN_INSACT|WIN_XTR;
-	if(cfg.qhub[num]->subs)
-		mode |= WIN_DEL;
-	uifc.helpbuf=
-		"`QWK Networked Sub-boards:`\n"
-		"\n"
-		"This is a list of the sub-boards that are networked with this QWK\n"
-		"network hub.\n"
-		"\n"
-		"To add a sub-board, select the desired location and hit ~ INS ~.\n"
-		"\n"
-		"To remove a sub-board, select it and hit ~ DEL ~.\n"
-		"\n"
-		"To configure a sub-board for this QWK network hub, select it and hit\n"
-		"~ ENTER ~.\n"
-	;
-	j=uifc.list(mode,0,0,0,&k,&bar
-		,"Networked Sub-boards",opt);
-	if(j==-1)
-		break;
-	if((j&MSK_ON)==MSK_INS) {
-		j&=MSK_OFF;
-		if((l=getsub())==-1)
-			continue;
-		uifc.helpbuf=qwk_conf_num_help;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0
-			,"Conference Number on Hub"
-			,str,5,K_NUMBER)<1)
-			continue;
-		strcpy(opt[0],"Strip out");
-		strcpy(opt[1],"Leave in");
-		strcpy(opt[2],"Expand to ANSI");
-		opt[3][0]=0;
-		m=0;
-		uifc.helpbuf=qwk_ctrl_a_help;
-		if((m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0
-			,"Ctrl-A Codes",opt))==-1)
-			continue;
-		if(!new_qhub_sub(cfg.qhub[num], j, cfg.sub[l], atoi(str)))
-			continue;
-		if(!m)
-			cfg.qhub[num]->mode[j]=QHUB_STRIP;
-		else if(m==1)
-			cfg.qhub[num]->mode[j]=QHUB_RETCTLA;
-		else
-			cfg.qhub[num]->mode[j]=QHUB_EXPCTLA;
-		uifc.changes=1;
-		continue; 
-	}
-	if((j&MSK_ON)==MSK_DEL) {
-		j&=MSK_OFF;
-		cfg.qhub[num]->subs--;
-		while(j<cfg.qhub[num]->subs) {
-			cfg.qhub[num]->sub[j]=cfg.qhub[num]->sub[j+1];
-			cfg.qhub[num]->mode[j]=cfg.qhub[num]->mode[j+1];
-			cfg.qhub[num]->conf[j]=cfg.qhub[num]->conf[j+1];
-			j++; 
-		}
-		uifc.changes=1;
-		continue; 
-	}
-	l=0;
+	k=0;
 	while(1) {
-		n=0;
-		sprintf(opt[n++],"%-22.22s%.*s %.*s"
-			,"Sub-board"
-			,LEN_GSNAME
-			,cfg.grp[cfg.qhub[num]->sub[j]->grp]->sname
-			,LEN_SSNAME
-			,cfg.qhub[num]->sub[j]->sname);
-		sprintf(opt[n++],"%-22.22s%u"
-			,"Conference Number",cfg.qhub[num]->conf[j]);
-		sprintf(opt[n++],"%-22.22s%s"
-			,"Ctrl-A Codes",cfg.qhub[num]->mode[j]==QHUB_STRIP ?
-			"Strip out" : cfg.qhub[num]->mode[j]==QHUB_RETCTLA ?
-			"Leave in" : "Expand to ANSI");
-		opt[n][0]=0;
+		unsigned opts = 0;
+		for(j=0;j<cfg.qhub[num]->subs;j++) {
+			if(cfg.qhub[num]->sub[j] == NULL)
+				continue;
+			sprintf(opt[opts++],"%-5u %-*.*s %-*.*s"
+				,cfg.qhub[num]->conf[j]
+				,LEN_GSNAME,LEN_GSNAME
+				,cfg.grp[cfg.qhub[num]->sub[j]->grp]->sname
+				,LEN_SSNAME,LEN_SSNAME
+				,cfg.qhub[num]->sub[j]->sname);
+		}
+		opt[opts][0]=0;
+		int mode =WIN_BOT|WIN_SAV|WIN_ACT;
+		if(cfg.qhub[num]->subs<MAX_OPTS)
+			mode |= WIN_INS|WIN_INSACT|WIN_XTR;
+		if(cfg.qhub[num]->subs)
+			mode |= WIN_DEL;
 		uifc.helpbuf=
-			"`QWK Networked Sub-board:`\n"
+			"`QWK Networked Sub-boards:`\n"
+			"\n"
+			"This is a list of the sub-boards that are networked with this QWK\n"
+			"network hub.\n"
 			"\n"
-			"You are configuring the options for this sub-board for this QWK network\n"
-			"hub.\n"
+			"To add a sub-board, select the desired location and hit ~ INS ~.\n"
+			"\n"
+			"To remove a sub-board, select it and hit ~ DEL ~.\n"
+			"\n"
+			"To configure a sub-board for this QWK network hub, select it and hit\n"
+			"~ ENTER ~.\n"
 		;
-		l=uifc.list(WIN_MID|WIN_SAV|WIN_ACT,0,0,
-			22+LEN_GSNAME+LEN_SSNAME,&l,0
-			,"Networked Sub-board",opt);
-		if(l==-1)
+		j=uifc.list(mode,0,0,0,&k,&bar
+			,"Networked Sub-boards",opt);
+		if(j==-1)
 			break;
-		if(!l) {
-			m=getsub();
-			if(m!=-1) {
-				cfg.qhub[num]->sub[j]=cfg.sub[m];
-				uifc.changes=1; 
-			} 
-		}
-		else if(l==1) {
+		if((j&MSK_ON)==MSK_INS) {
+			j&=MSK_OFF;
+			if((l=getsub())==-1)
+				continue;
 			uifc.helpbuf=qwk_conf_num_help;
-			sprintf(str, "%u", cfg.qhub[num]->conf[j]);
 			if(uifc.input(WIN_MID|WIN_SAV,0,0
 				,"Conference Number on Hub"
-				,str,5,K_NUMBER|K_EDIT) > 0)
-				cfg.qhub[num]->conf[j] = atoi(str); 
-		}
-		else if(l==2) {
+				,str,5,K_NUMBER)<1)
+				continue;
 			strcpy(opt[0],"Strip out");
 			strcpy(opt[1],"Leave in");
 			strcpy(opt[2],"Expand to ANSI");
 			opt[3][0]=0;
 			m=0;
-			uifc.helpbuf = qwk_ctrl_a_help;
-			m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0
-				,"Ctrl-A Codes",opt);
-			uifc.changes=1;
+			uifc.helpbuf=qwk_ctrl_a_help;
+			if((m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0
+				,"Ctrl-A Codes",opt))==-1)
+				continue;
+			if(!new_qhub_sub(cfg.qhub[num], j, cfg.sub[l], atoi(str)))
+				continue;
 			if(!m)
 				cfg.qhub[num]->mode[j]=QHUB_STRIP;
 			else if(m==1)
 				cfg.qhub[num]->mode[j]=QHUB_RETCTLA;
-			else if(m==2)
-				cfg.qhub[num]->mode[j]=QHUB_EXPCTLA; 
+			else
+				cfg.qhub[num]->mode[j]=QHUB_EXPCTLA;
+			uifc.changes=1;
+			continue; 
+		}
+		if((j&MSK_ON)==MSK_DEL) {
+			j&=MSK_OFF;
+			cfg.qhub[num]->subs--;
+			while(j<cfg.qhub[num]->subs) {
+				cfg.qhub[num]->sub[j]=cfg.qhub[num]->sub[j+1];
+				cfg.qhub[num]->mode[j]=cfg.qhub[num]->mode[j+1];
+				cfg.qhub[num]->conf[j]=cfg.qhub[num]->conf[j+1];
+				j++; 
+			}
+			uifc.changes=1;
+			continue; 
+		}
+		l=0;
+		while(1) {
+			n=0;
+			sprintf(opt[n++],"%-22.22s%.*s %.*s"
+				,"Sub-board"
+				,LEN_GSNAME
+				,cfg.grp[cfg.qhub[num]->sub[j]->grp]->sname
+				,LEN_SSNAME
+				,cfg.qhub[num]->sub[j]->sname);
+			sprintf(opt[n++],"%-22.22s%u"
+				,"Conference Number",cfg.qhub[num]->conf[j]);
+			sprintf(opt[n++],"%-22.22s%s"
+				,"Ctrl-A Codes",cfg.qhub[num]->mode[j]==QHUB_STRIP ?
+				"Strip out" : cfg.qhub[num]->mode[j]==QHUB_RETCTLA ?
+				"Leave in" : "Expand to ANSI");
+			opt[n][0]=0;
+			uifc.helpbuf=
+				"`QWK Networked Sub-board:`\n"
+				"\n"
+				"You are configuring the options for this sub-board for this QWK network\n"
+				"hub.\n"
+			;
+			l=uifc.list(WIN_MID|WIN_SAV|WIN_ACT,0,0,
+				22+LEN_GSNAME+LEN_SSNAME,&l,0
+				,"Networked Sub-board",opt);
+			if(l==-1)
+				break;
+			if(!l) {
+				m=getsub();
+				if(m!=-1) {
+					cfg.qhub[num]->sub[j]=cfg.sub[m];
+					uifc.changes=1; 
+				} 
+			}
+			else if(l==1) {
+				uifc.helpbuf=qwk_conf_num_help;
+				sprintf(str, "%u", cfg.qhub[num]->conf[j]);
+				if(uifc.input(WIN_MID|WIN_SAV,0,0
+					,"Conference Number on Hub"
+					,str,5,K_NUMBER|K_EDIT) > 0)
+					cfg.qhub[num]->conf[j] = atoi(str); 
+			}
+			else if(l==2) {
+				strcpy(opt[0],"Strip out");
+				strcpy(opt[1],"Leave in");
+				strcpy(opt[2],"Expand to ANSI");
+				opt[3][0]=0;
+				m=0;
+				uifc.helpbuf = qwk_ctrl_a_help;
+				m=uifc.list(WIN_MID|WIN_SAV,0,0,0,&m,0
+					,"Ctrl-A Codes",opt);
+				uifc.changes=1;
+				if(!m)
+					cfg.qhub[num]->mode[j]=QHUB_STRIP;
+				else if(m==1)
+					cfg.qhub[num]->mode[j]=QHUB_RETCTLA;
+				else if(m==2)
+					cfg.qhub[num]->mode[j]=QHUB_EXPCTLA; 
 			} 
 		} 
 	}
@@ -1388,140 +1388,140 @@ void phub_edit(int num)
 	char *p,done=0,str[256];
 	int i,j;
 
-while(!done) {
-	i=0;
-	sprintf(opt[i++],"%-27.27s%s","Hub Site Name",cfg.phub[num]->name);
-	sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.phub[num]->call);
-	sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.phub[num]->node);
-	sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.phub[num]->days));
-	if(cfg.phub[num]->freq) {
-		sprintf(str,"%u times a day",1440/cfg.phub[num]->freq);
-		sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); 
-	}
-	else {
-		sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60
-			,cfg.phub[num]->time%60);
-		sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); 
-	}
-	opt[i][0]=0;
-	sprintf(str,"%s Network Hub",cfg.phub[num]->name);
-	uifc.helpbuf=
-		"`PostLink Network Hub Configuration:`\n"
-		"\n"
-		"This menu allows you to configure options specific to this network hub.\n"
-	;
-	switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&phub_dflt,0
-		,str,opt)) {
-		case -1:
-			done=1;
-			break;
-		case 0:
-			uifc.helpbuf=
-				"`Network Hub Site Name:`\n"
-				"\n"
-				"This is the Site Name of this hub. It is used for only for reference.\n"
-			;
-			strcpy(str,cfg.phub[num]->name);	/* save */
-			if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Hub Site Name"
-				,cfg.phub[num]->name,sizeof(cfg.phub[num]->name)-1,K_UPPER|K_EDIT))
-				strcpy(cfg.phub[num]->name,str);	/* restore */
-			break;
-		case 1:
-			uifc.helpbuf=
-				"`Network Hub Call-out Command Line:`\n"
-				"\n"
-				"This is the command line to use to initiate a call-out to this network\n"
-				"hub.\n"
-			;
-			uifc.input(WIN_MID|WIN_SAV,0,0,"Call-out Command"
-				,cfg.phub[num]->call,sizeof(cfg.phub[num]->call)-1,K_EDIT);
-			break;
-		case 2:
-			sprintf(str,"%u",cfg.phub[num]->node);
-			uifc.helpbuf=
-				"`Node to Perform Call-out:`\n"
-				"\n"
-				"This is the number of the node to perform the call-out for this network\n"
-				"hub.\n"
-			;
-			uifc.input(WIN_MID|WIN_SAV,0,0
-				,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER);
-			cfg.phub[num]->node=atoi(str);
-			break;
-		case 3:
-			j=0;
-			while(1) {
-				for(i=0;i<7;i++)
-					sprintf(opt[i],"%s        %s"
-						,wday[i],(cfg.phub[num]->days&(1<<i)) ? "Yes":"No");
-				opt[i][0]=0;
+	while(!done) {
+		i=0;
+		sprintf(opt[i++],"%-27.27s%s","Hub Site Name",cfg.phub[num]->name);
+		sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",cfg.phub[num]->call);
+		sprintf(opt[i++],"%-27.27s%u","Call-out Node",cfg.phub[num]->node);
+		sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(cfg.phub[num]->days));
+		if(cfg.phub[num]->freq) {
+			sprintf(str,"%u times a day",1440/cfg.phub[num]->freq);
+			sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); 
+		}
+		else {
+			sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60
+				,cfg.phub[num]->time%60);
+			sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); 
+		}
+		opt[i][0]=0;
+		sprintf(str,"%s Network Hub",cfg.phub[num]->name);
+		uifc.helpbuf=
+			"`PostLink Network Hub Configuration:`\n"
+			"\n"
+			"This menu allows you to configure options specific to this network hub.\n"
+		;
+		switch(uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&phub_dflt,0
+			,str,opt)) {
+			case -1:
+				done=1;
+				break;
+			case 0:
 				uifc.helpbuf=
-					"`Days to Perform Call-out:`\n"
+					"`Network Hub Site Name:`\n"
 					"\n"
-					"These are the days that a call-out will be performed for this network\n"
+					"This is the Site Name of this hub. It is used for only for reference.\n"
+				;
+				strcpy(str,cfg.phub[num]->name);	/* save */
+				if(!uifc.input(WIN_MID|WIN_SAV,0,0,"Hub Site Name"
+					,cfg.phub[num]->name,sizeof(cfg.phub[num]->name)-1,K_UPPER|K_EDIT))
+					strcpy(cfg.phub[num]->name,str);	/* restore */
+				break;
+			case 1:
+				uifc.helpbuf=
+					"`Network Hub Call-out Command Line:`\n"
+					"\n"
+					"This is the command line to use to initiate a call-out to this network\n"
 					"hub.\n"
 				;
-				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
-					,"Days to Perform Call-out",opt);
-				if(i==-1)
-					break;
-				cfg.phub[num]->days^=(1<<i);
-				uifc.changes=1; 
-			}
-			break;
-		case 4:
-			i=1;
-			uifc.helpbuf=
-				"`Perform Call-out at a Specific Time:`\n"
-				"\n"
-				"If you want the system call this network hub at a specific time, set\n"
-				"this option to `Yes`. If you want the system to call this hub more than\n"
-				"once a day at predetermined intervals, set this option to `No`.\n"
-			;
-			i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-				,"Perform Call-out at a Specific Time",uifcYesNoOpts);
-			if(i==0) {
-				sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60
-					,cfg.phub[num]->time%60);
+				uifc.input(WIN_MID|WIN_SAV,0,0,"Call-out Command"
+					,cfg.phub[num]->call,sizeof(cfg.phub[num]->call)-1,K_EDIT);
+				break;
+			case 2:
+				sprintf(str,"%u",cfg.phub[num]->node);
 				uifc.helpbuf=
-					"`Time to Perform Call-out:`\n"
+					"`Node to Perform Call-out:`\n"
 					"\n"
-					"This is the time (in 24 hour HH:MM format) to perform the call-out to\n"
-					"this network hub.\n"
+					"This is the number of the node to perform the call-out for this network\n"
+					"hub.\n"
 				;
-				if(uifc.input(WIN_MID|WIN_SAV,0,0
-					,"Time to Perform Call-out (HH:MM)"
-					,str,5,K_UPPER|K_EDIT)>0) {
-					cfg.phub[num]->freq=0;
-					cfg.phub[num]->time=atoi(str)*60;
-					if((p=strchr(str,':'))!=NULL)
-						cfg.phub[num]->time+=atoi(p+1); 
-				} 
-			}
-			else if(i==1) {
-				sprintf(str,"%u",cfg.phub[num]->freq
-					&& cfg.phub[num]->freq<=1440 ? 1440/cfg.phub[num]->freq : 0);
+				uifc.input(WIN_MID|WIN_SAV,0,0
+					,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER);
+				cfg.phub[num]->node=atoi(str);
+				break;
+			case 3:
+				j=0;
+				while(1) {
+					for(i=0;i<7;i++)
+						sprintf(opt[i],"%s        %s"
+							,wday[i],(cfg.phub[num]->days&(1<<i)) ? "Yes":"No");
+					opt[i][0]=0;
+					uifc.helpbuf=
+						"`Days to Perform Call-out:`\n"
+						"\n"
+						"These are the days that a call-out will be performed for this network\n"
+						"hub.\n"
+					;
+					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
+						,"Days to Perform Call-out",opt);
+					if(i==-1)
+						break;
+					cfg.phub[num]->days^=(1<<i);
+					uifc.changes=1; 
+				}
+				break;
+			case 4:
+				i=1;
 				uifc.helpbuf=
-					"`Number of Call-outs Per Day:`\n"
+					"`Perform Call-out at a Specific Time:`\n"
 					"\n"
-					"This is the maximum number of times the system will perform a call-out\n"
-					"per day to this network hub. This value is actually converted by\n"
-					"Synchronet into minutes between call-outs and when the BBS is idle\n"
-					"and this number of minutes since the last call-out is reached, it will\n"
-					"perform a call-out.\n"
+					"If you want the system call this network hub at a specific time, set\n"
+					"this option to `Yes`. If you want the system to call this hub more than\n"
+					"once a day at predetermined intervals, set this option to `No`.\n"
 				;
-				if(uifc.input(WIN_MID|WIN_SAV,0,0
-					,"Number of Call-outs Per Day"
-					,str,4,K_NUMBER|K_EDIT)>0) {
-					cfg.phub[num]->time=0;
-					i=atoi(str);
-					if(i && i<=1440)
-						cfg.phub[num]->freq=1440/i;
-					else
-						cfg.phub[num]->freq=0; 
-				} 
-			}
-			break; 
+				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+					,"Perform Call-out at a Specific Time",uifcYesNoOpts);
+				if(i==0) {
+					sprintf(str,"%2.2u:%2.2u",cfg.phub[num]->time/60
+						,cfg.phub[num]->time%60);
+					uifc.helpbuf=
+						"`Time to Perform Call-out:`\n"
+						"\n"
+						"This is the time (in 24 hour HH:MM format) to perform the call-out to\n"
+						"this network hub.\n"
+					;
+					if(uifc.input(WIN_MID|WIN_SAV,0,0
+						,"Time to Perform Call-out (HH:MM)"
+						,str,5,K_UPPER|K_EDIT)>0) {
+						cfg.phub[num]->freq=0;
+						cfg.phub[num]->time=atoi(str)*60;
+						if((p=strchr(str,':'))!=NULL)
+							cfg.phub[num]->time+=atoi(p+1); 
+					} 
+				}
+				else if(i==1) {
+					sprintf(str,"%u",cfg.phub[num]->freq
+						&& cfg.phub[num]->freq<=1440 ? 1440/cfg.phub[num]->freq : 0);
+					uifc.helpbuf=
+						"`Number of Call-outs Per Day:`\n"
+						"\n"
+						"This is the maximum number of times the system will perform a call-out\n"
+						"per day to this network hub. This value is actually converted by\n"
+						"Synchronet into minutes between call-outs and when the BBS is idle\n"
+						"and this number of minutes since the last call-out is reached, it will\n"
+						"perform a call-out.\n"
+					;
+					if(uifc.input(WIN_MID|WIN_SAV,0,0
+						,"Number of Call-outs Per Day"
+						,str,4,K_NUMBER|K_EDIT)>0) {
+						cfg.phub[num]->time=0;
+						i=atoi(str);
+						if(i && i<=1440)
+							cfg.phub[num]->freq=1440/i;
+						else
+							cfg.phub[num]->freq=0; 
+					} 
+				}
+				break; 
 		} 
 	}
 }
diff --git a/src/sbbs3/scfg/scfgsub.c b/src/sbbs3/scfg/scfgsub.c
index 7ebf6ed576aaec27083f911754ed99a0b6177c38..9ef25b44645e1e651c92e6cd5ba4f726213ea0a8 100644
--- a/src/sbbs3/scfg/scfgsub.c
+++ b/src/sbbs3/scfg/scfgsub.c
@@ -147,1297 +147,1297 @@ void sub_cfg(uint grpnum)
 		"these values with caution."
 		;
 
-while(1) {
-	if(uifc.changes && cfg.grp[grpnum]->sort)
-		sort_subs(grpnum);
-	int maxlen = 0;
-	for(i=0,j=0;i<cfg.total_subs && j<MAX_OPTS;i++)
-        if(cfg.sub[i]->grp==grpnum) {
-			subnum[j]=i;
-			int len = 0;
-			opt[j][0] = 0;
-			if(cfg.sub[subnum[0]]->qwkconf)
-				len += sprintf(opt[j], "%-5u ", cfg.sub[i]->qwkconf);
-			char* name = cfg.sub[i]->lname;
-			int name_len = LEN_SLNAME;
-			switch(cfg.grp[grpnum]->sort) {
-				case AREA_SORT_SNAME:
-					name = cfg.sub[i]->sname;
-					name_len = LEN_SSNAME;
-					break;
-				case AREA_SORT_CODE:
-					name = cfg.sub[i]->code_suffix;
-					name_len = LEN_CODE;
-					break;
-				default:	/* Defeat stupid GCC warning */
-					break;
+	while(1) {
+		if(uifc.changes && cfg.grp[grpnum]->sort)
+			sort_subs(grpnum);
+		int maxlen = 0;
+		for(i=0,j=0;i<cfg.total_subs && j<MAX_OPTS;i++)
+			if(cfg.sub[i]->grp==grpnum) {
+				subnum[j]=i;
+				int len = 0;
+				opt[j][0] = 0;
+				if(cfg.sub[subnum[0]]->qwkconf)
+					len += sprintf(opt[j], "%-5u ", cfg.sub[i]->qwkconf);
+				char* name = cfg.sub[i]->lname;
+				int name_len = LEN_SLNAME;
+				switch(cfg.grp[grpnum]->sort) {
+					case AREA_SORT_SNAME:
+						name = cfg.sub[i]->sname;
+						name_len = LEN_SSNAME;
+						break;
+					case AREA_SORT_CODE:
+						name = cfg.sub[i]->code_suffix;
+						name_len = LEN_CODE;
+						break;
+					default:	/* Defeat stupid GCC warning */
+						break;
+				}
+				sprintf(str, "%-*s %c", name_len, name, cfg.sub[i]->misc&SUB_TEMPLATE ? '*' : ' ');
+				truncsp(str);
+				len += sprintf(opt[j] + strlen(opt[j]), "%s", str);
+				if(len > maxlen)
+					maxlen = len;
+				j++; 
 			}
-			sprintf(str, "%-*s %c", name_len, name, cfg.sub[i]->misc&SUB_TEMPLATE ? '*' : ' ');
-			truncsp(str);
-			len += sprintf(opt[j] + strlen(opt[j]), "%s", str);
-			if(len > maxlen)
-				maxlen = len;
-			j++; 
-		}
-	subnum[j]=cfg.total_subs;
-	opt[j][0]=0;
-	sprintf(str,"%s Sub-boards (%u)",cfg.grp[grpnum]->sname, j);
-	int mode = WIN_SAV|WIN_ACT|WIN_RHT;
-	if(j)
-		mode |= WIN_DEL|WIN_COPY|WIN_CUT|WIN_DELACT;
-	if(j<MAX_OPTS)
-		mode |= WIN_INS|WIN_XTR|WIN_PASTEXTR|WIN_INSACT;
-	if(savsub.sname[0])
-		mode |= WIN_PASTE;
-	uifc.helpbuf=
-		"`Message Sub-boards:`\n"
-		"\n"
-		"This is a list of message sub-boards that have been configured for the\n"
-		"selected message group.\n"
-		"\n"
-		"The `template` sub-board, if one exists, will be denoted with an asterisk.\n"
-		"Normally, only one template sub-board should exist per message group.\n"
-		"\n"
-		"To add a sub-board, select the desired position with the arrow keys and\n"
-		"hit ~ INS ~.\n"
-		"\n"
-		"To delete a sub-board, select it with the arrow keys and hit ~ DEL ~.\n"
-		"\n"
-		"To configure a sub-board, select it with the arrow keys and hit ~ ENTER ~.\n"
-	;
-	i = uifc.list(mode, 0, 0, maxlen+5, &dflt, &bar, str, opt);
-	if((signed)i==-1)
-		return;
-	int msk = i & MSK_ON;
-	i &= MSK_OFF;
-	if((int)i > j)
-		continue;
-	if(msk==MSK_INS) {
-		strcpy(str,"General");
-		uifc.helpbuf=sub_long_name_help;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Long Name",str,LEN_SLNAME
-			,K_EDIT)<1)
-			continue;
-		sprintf(str2,"%.*s",LEN_SSNAME,str);
-		uifc.helpbuf=sub_short_name_help;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Short Name",str2,LEN_SSNAME
-			,K_EDIT)<1)
-			continue;
-#if 0
-		sprintf(str3,"%.10s",str2);
+		subnum[j]=cfg.total_subs;
+		opt[j][0]=0;
+		sprintf(str,"%s Sub-boards (%u)",cfg.grp[grpnum]->sname, j);
+		int mode = WIN_SAV|WIN_ACT|WIN_RHT;
+		if(j)
+			mode |= WIN_DEL|WIN_COPY|WIN_CUT|WIN_DELACT;
+		if(j<MAX_OPTS)
+			mode |= WIN_INS|WIN_XTR|WIN_PASTEXTR|WIN_INSACT;
+		if(savsub.sname[0])
+			mode |= WIN_PASTE;
 		uifc.helpbuf=
-			"`Sub-board QWK Name:`\n"
+			"`Message Sub-boards:`\n"
 			"\n"
-			"This is the name of the sub-board used for QWK off-line readers.\n"
+			"This is a list of message sub-boards that have been configured for the\n"
+			"selected message group.\n"
+			"\n"
+			"The `template` sub-board, if one exists, will be denoted with an asterisk.\n"
+			"Normally, only one template sub-board should exist per message group.\n"
+			"\n"
+			"To add a sub-board, select the desired position with the arrow keys and\n"
+			"hit ~ INS ~.\n"
+			"\n"
+			"To delete a sub-board, select it with the arrow keys and hit ~ DEL ~.\n"
+			"\n"
+			"To configure a sub-board, select it with the arrow keys and hit ~ ENTER ~.\n"
 		;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board QWK Name",str3,10
-            ,K_EDIT)<1)
-            continue;
-#endif
-		SAFECOPY(code,str2);
-		prep_code(code,/* prefix: */NULL);
-		uifc.helpbuf=sub_code_help;
-		if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Internal Code Suffix",code,LEN_CODE
-			,K_EDIT|K_UPPER)<1)
-			continue;
-		if(!code_ok(code)) {
-			uifc.helpbuf=invalid_code;
-			uifc.msg("Invalid Code");
-			uifc.helpbuf=0;
-			continue; 
-		}
-
-		if (!new_sub(subnum[i], grpnum))
+		i = uifc.list(mode, 0, 0, maxlen+5, &dflt, &bar, str, opt);
+		if((signed)i==-1)
+			return;
+		int msk = i & MSK_ON;
+		i &= MSK_OFF;
+		if((int)i > j)
 			continue;
-
-		SAFECOPY(cfg.sub[subnum[i]]->code_suffix,code);
-		SAFECOPY(cfg.sub[subnum[i]]->lname,str);
-		SAFECOPY(cfg.sub[subnum[i]]->sname,str2);
-		SAFECOPY(cfg.sub[subnum[i]]->qwkname,code);
-		if(strchr(str,'.') && strchr(str,' ')==NULL)
-			SAFECOPY(cfg.sub[subnum[i]]->newsgroup,str);
-		uifc.changes = TRUE;
-		continue; 
-	}
-	if(msk == MSK_DEL || msk == MSK_CUT) {
-		if (msk == MSK_DEL) {
+		if(msk==MSK_INS) {
+			strcpy(str,"General");
+			uifc.helpbuf=sub_long_name_help;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Long Name",str,LEN_SLNAME
+				,K_EDIT)<1)
+				continue;
+			sprintf(str2,"%.*s",LEN_SSNAME,str);
+			uifc.helpbuf=sub_short_name_help;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Short Name",str2,LEN_SSNAME
+				,K_EDIT)<1)
+				continue;
+	#if 0
+			sprintf(str3,"%.10s",str2);
 			uifc.helpbuf=
-				"`Delete Data in Sub-board:`\n"
+				"`Sub-board QWK Name:`\n"
 				"\n"
-				"If you want to delete all the messages for this sub-board, select `Yes`.\n"
+				"This is the name of the sub-board used for QWK off-line readers.\n"
 			;
-			j=1;
-			SAFEPRINTF2(str,"%s%s.*"
-				,cfg.grp[cfg.sub[subnum[i]]->grp]->code_prefix
-				,cfg.sub[subnum[i]]->code_suffix);
-			strlwr(str);
-			if(!cfg.sub[subnum[i]]->data_dir[0])
-				SAFEPRINTF(data_dir,"%ssubs/",cfg.data_dir);
-			else
-				SAFECOPY(data_dir,cfg.sub[subnum[i]]->data_dir);
-
-			SAFEPRINTF2(path,"%s%s",data_dir,str);
-			if(fexist(path)) {
-				SAFEPRINTF(str2,"Delete %s",path);
-				j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
-					,str2,uifcYesNoOpts);
-				if(j==-1)
-					continue;
-				if(j==0) {
-						delfiles(data_dir,str);
-						clearptrs(subnum[i]); 
-				}
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board QWK Name",str3,10
+				,K_EDIT)<1)
+				continue;
+	#endif
+			SAFECOPY(code,str2);
+			prep_code(code,/* prefix: */NULL);
+			uifc.helpbuf=sub_code_help;
+			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Internal Code Suffix",code,LEN_CODE
+				,K_EDIT|K_UPPER)<1)
+				continue;
+			if(!code_ok(code)) {
+				uifc.helpbuf=invalid_code;
+				uifc.msg("Invalid Code");
+				uifc.helpbuf=0;
+				continue; 
 			}
-		}
-		if(msk == MSK_CUT)
-			savsub = *cfg.sub[subnum[i]];
-		free(cfg.sub[subnum[i]]);
-		cfg.total_subs--;
-		for(j=subnum[i];j<cfg.total_subs;j++)
-			cfg.sub[j]=cfg.sub[j+1];
-		for(q=0;q<cfg.total_qhubs;q++)
-			for(s=0;s<cfg.qhub[q]->subs;s++) {
-				if(cfg.qhub[q]->sub[s] == cfg.sub[subnum[i]])
-					cfg.qhub[q]->sub[s] = NULL;
-			}
-		uifc.changes = TRUE;
-		continue; 
-	}
-	if(msk==MSK_COPY) {
-		savsub=*cfg.sub[subnum[i]];
-		continue; 
-	}
-	if(msk == MSK_PASTE) {
-		if (!new_sub(subnum[i], grpnum))
-			continue;
-		ptridx=cfg.sub[subnum[i]]->ptridx;
-		*cfg.sub[subnum[i]]=savsub;
-		cfg.sub[subnum[i]]->ptridx=ptridx;
-		cfg.sub[subnum[i]]->grp=grpnum;
-		uifc.changes = TRUE;
-        continue; 
-	}
-#if 0
-	if(msk == MSK_SORT) {
-		sort_min = subnum[i];
-		sort_group = grpnum;
-		qsort(cfg.sub, cfg.total_subs, sizeof(sub_t*), sub_compare);
-		last_sort_field = sort_field;
-		sort_field++;
-		if(sort_field >= SORT_NONE)
-			sort_field = 0;
-		uifc.changes = TRUE;
-		continue;
-	}
-#endif
-	i=subnum[i];
-	j=0;
-	done=0;
-	while(!done) {
-		n=0;
-		sprintf(opt[n++],"%-27.27s%s","Long Name",cfg.sub[i]->lname);
-		sprintf(opt[n++],"%-27.27s%s","Short Name",cfg.sub[i]->sname);
-		sprintf(opt[n++],"%-27.27s%s","QWK Name",cfg.sub[i]->qwkname);
-		sprintf(opt[n++],"%-27.27s%s%s","Internal Code"
-			,cfg.grp[cfg.sub[i]->grp]->code_prefix, cfg.sub[i]->code_suffix);
-		sprintf(opt[n++],"%-27.27s%s","Newsgroup Name",cfg.sub[i]->newsgroup);
-		sprintf(opt[n++],"%-27.27s%.40s","Access Requirements"
-			,cfg.sub[i]->arstr);
-		sprintf(opt[n++],"%-27.27s%.40s","Reading Requirements"
-            ,cfg.sub[i]->read_arstr);
-		sprintf(opt[n++],"%-27.27s%.40s","Posting Requirements"
-			,cfg.sub[i]->post_arstr);
-		sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements"
-			,cfg.sub[i]->op_arstr);
-		sprintf(opt[n++],"%-27.27s%.40s","Moderated Posting User"
-			,cfg.sub[i]->mod_arstr);
-		if(cfg.sub[i]->maxmsgs)
-			sprintf(str, "%"PRIu32, cfg.sub[i]->maxmsgs);
-		else
-			strcpy(str, "Unlimited");
-		sprintf(opt[n++],"%-27.27s%s","Maximum Messages", str);
-		if(cfg.sub[i]->maxage)
-            sprintf(str,"Enabled (%u days old)",cfg.sub[i]->maxage);
-        else
-            strcpy(str,"Disabled");
-		sprintf(opt[n++],"%-27.27s%s","Purge by Age",str);
-		if(cfg.sub[i]->maxcrcs)
-			sprintf(str,"Enabled (%"PRIu32" message CRCs)",cfg.sub[i]->maxcrcs);
-		else
-			strcpy(str,"Disabled");
-		sprintf(opt[n++],"%-27.27s%s","Duplicate Checking",str);
 
-		strcpy(opt[n++],"Toggle Options...");
-		strcpy(opt[n++],"Network Options...");
-		strcpy(opt[n++],"Advanced Options...");
-		opt[n][0]=0;
-		sprintf(str,"%s Sub-board", cfg.sub[i]->sname);
-		uifc.helpbuf=
-			"`Sub-board Configuration:`\n"
-			"\n"
-			"This menu allows you to configure the individual selected sub-board.\n"
-			"Options with a trailing `...` provide a sub-menu of more options.\n"
-		;
-		switch(uifc.list(WIN_ACT|WIN_SAV|WIN_BOT|WIN_L2R
-			,0,0,60,&opt_dflt,0,str,opt)) {
-			case -1:
-				done=1;
-				break;
-			case 0:
-				uifc.helpbuf=sub_long_name_help;
-				SAFECOPY(str,cfg.sub[i]->lname);	/* save */
-				if(uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Listings"
-					,cfg.sub[i]->lname,LEN_SLNAME,K_EDIT) == 0)
-					SAFECOPY(cfg.sub[i]->lname,str);	/* restore */
-				break;
-			case 1:
-				uifc.helpbuf=sub_short_name_help;
-				uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts"
-					,cfg.sub[i]->sname,LEN_SSNAME,K_EDIT);
-				break;
-			case 2:
+			if (!new_sub(subnum[i], grpnum))
+				continue;
+
+			SAFECOPY(cfg.sub[subnum[i]]->code_suffix,code);
+			SAFECOPY(cfg.sub[subnum[i]]->lname,str);
+			SAFECOPY(cfg.sub[subnum[i]]->sname,str2);
+			SAFECOPY(cfg.sub[subnum[i]]->qwkname,code);
+			if(strchr(str,'.') && strchr(str,' ')==NULL)
+				SAFECOPY(cfg.sub[subnum[i]]->newsgroup,str);
+			uifc.changes = TRUE;
+			continue; 
+		}
+		if(msk == MSK_DEL || msk == MSK_CUT) {
+			if (msk == MSK_DEL) {
 				uifc.helpbuf=
-					"`Sub-board QWK Name:`\n"
+					"`Delete Data in Sub-board:`\n"
 					"\n"
-					"This is the name of the sub-board used for QWK off-line readers.\n"
+					"If you want to delete all the messages for this sub-board, select `Yes`.\n"
 				;
-				uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for QWK Packets"
-					,cfg.sub[i]->qwkname,10,K_EDIT);
-                break;
-			case 3:
-                uifc.helpbuf=sub_code_help;
-                SAFECOPY(str,cfg.sub[i]->code_suffix);
-                uifc.input(WIN_MID|WIN_SAV,0,17,"Internal Code Suffix (unique)"
-                    ,str,LEN_CODE,K_EDIT|K_UPPER);
-                if(code_ok(str))
-                    SAFECOPY(cfg.sub[i]->code_suffix,str);
-                else {
-                    uifc.helpbuf=invalid_code;
-                    uifc.msg("Invalid Code");
-                    uifc.helpbuf=0; 
+				j=1;
+				SAFEPRINTF2(str,"%s%s.*"
+					,cfg.grp[cfg.sub[subnum[i]]->grp]->code_prefix
+					,cfg.sub[subnum[i]]->code_suffix);
+				strlwr(str);
+				if(!cfg.sub[subnum[i]]->data_dir[0])
+					SAFEPRINTF(data_dir,"%ssubs/",cfg.data_dir);
+				else
+					SAFECOPY(data_dir,cfg.sub[subnum[i]]->data_dir);
+
+				SAFEPRINTF2(path,"%s%s",data_dir,str);
+				if(fexist(path)) {
+					SAFEPRINTF(str2,"Delete %s",path);
+					j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
+						,str2,uifcYesNoOpts);
+					if(j==-1)
+						continue;
+					if(j==0) {
+							delfiles(data_dir,str);
+							clearptrs(subnum[i]); 
+					}
 				}
-                break;
-			case 4:
-				uifc.helpbuf=
-					"Newsgroup Name:\n"
-					"\n"
-					"This is the name of the sub-board used for newsgroup readers. If no name\n"
-					"is configured here, a name will be automatically generated from the\n"
-					"Sub-board's Short Name and message group's Short Name.\n"
-				;
-				uifc.input(WIN_MID|WIN_SAV,0,17,""
-					,cfg.sub[i]->newsgroup,sizeof(cfg.sub[i]->newsgroup)-1,K_EDIT);
-                break;
-			case 5:
-				sprintf(str,"%s Access",cfg.sub[i]->sname);
-				getar(str,cfg.sub[i]->arstr);
-				break;
-			case 6:
-				sprintf(str,"%s Reading",cfg.sub[i]->sname);
-				getar(str,cfg.sub[i]->read_arstr);
-                break;
-			case 7:
-				sprintf(str,"%s Posting",cfg.sub[i]->sname);
-				getar(str,cfg.sub[i]->post_arstr);
-                break;
-			case 8:
-				sprintf(str,"%s Operator",cfg.sub[i]->sname);
-				getar(str,cfg.sub[i]->op_arstr);
-                break;
-			case 9:
-				sprintf(str,"%s Moderated Posting User",cfg.sub[i]->sname);
-				getar(str,cfg.sub[i]->mod_arstr);
-                break;
-			case 10:
-				sprintf(str,"%"PRIu32,cfg.sub[i]->maxmsgs);
-                uifc.helpbuf=
-	                "`Maximum Number of Messages:`\n"
-	                "\n"
-	                "This value is the maximum number of messages that will be kept in the\n"
-	                "sub-board. It is possible for newly-posted or imported messages to\n"
-					"exceed this maximum (it is `not` an immediately imposed limit).\n"
-					"\n"
-					"Older messages that exceed this maximum count are purged using `smbutil`,\n"
-					"typically run as a timed event (e.g. `MSGMAINT`).\n"
-					"\n"
-					"A value of `0` means no maximum number of stored messages will be\n"
-					"imposed during message-base maintenance."
-                ;
-                uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of Messages"
-                    ,str,9,K_EDIT|K_NUMBER);
-                cfg.sub[i]->maxmsgs=atoi(str);
-                cfg.sub[i]->misc|=SUB_HDRMOD;
-				break;
-			case 11:
-				sprintf(str,"%u",cfg.sub[i]->maxage);
-                uifc.helpbuf=
-	                "`Maximum Age of Messages:`\n"
-	                "\n"
-	                "This value is the maximum number of days that messages will be kept in\n"
-	                "the sub-board.\n"
-					"\n"
-					"Message age is calculated from the date and time of message import/post\n"
-					"and not necessarily the date/time the message was originally written.\n"
-					"\n"
-					"Old messages are purged using `smbutil`, typically run as a timed\n"
-					"event (e.g. `MSGMAINT`).\n"
-					"\n"
-					"A value of `0` means no maximum age of stored messages will be\n"
-					"imposed during message-base maintenance."
-                ;
-                uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Age of Messages (in days)"
-                    ,str,5,K_EDIT|K_NUMBER);
-                cfg.sub[i]->maxage=atoi(str);
-                cfg.sub[i]->misc|=SUB_HDRMOD;
-				break;
-			case 12:
-				sprintf(str,"%"PRIu32,cfg.sub[i]->maxcrcs);
-				uifc.helpbuf=
-					"`Maximum Number of CRCs:`\n"
-					"\n"
-					"This value is the maximum number of CRCs that will be kept in the\n"
-					"sub-board for duplicate message checking. Once this maximum number of\n"
-					"CRCs is reached, the oldest CRCs will be automatically purged.\n"
-					"\n"
-					"A value of `0` means no CRCs (or other hashes) of message body text\n"
-					"or meta-data will be saved (i.e. for purposes of duplicate message\n"
-					"detection and rejection)."
-				;
-				uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of CRCs"
-					,str,9,K_EDIT|K_NUMBER);
-				cfg.sub[i]->maxcrcs=atol(str);
-				cfg.sub[i]->misc|=SUB_HDRMOD;
-                break;
-			case 13:
-				while(1) {
-					n=0;
-					sprintf(opt[n++],"%-27.27s%s","Allow Private Posts"
-						,cfg.sub[i]->misc&SUB_PRIV ? cfg.sub[i]->misc&SUB_PONLY
-						? "Only":"Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Allow Anonymous Posts"
-						,cfg.sub[i]->misc&SUB_ANON ? cfg.sub[i]->misc&SUB_AONLY
-						? "Only":"Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Post Using Real Names"
-						,cfg.sub[i]->misc&SUB_NAME ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Users Can Edit Posts"
-						,cfg.sub[i]->misc&SUB_EDIT ? cfg.sub[i]->misc&SUB_EDITLAST 
-						? "Last" : "Yes" : "No");
-					sprintf(opt[n++],"%-27.27s%s","Users Can Delete Posts"
-						,cfg.sub[i]->misc&SUB_DEL ? cfg.sub[i]->misc&SUB_DELLAST
-						? "Last" : "Yes" : "No");
-					sprintf(opt[n++],"%-27.27s%s","Default On for New Scan"
-						,cfg.sub[i]->misc&SUB_NSDEF ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Forced On for New Scan"
-						,cfg.sub[i]->misc&SUB_FORCED ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Default On for Your Scan"
-						,cfg.sub[i]->misc&SUB_SSDEF ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Public 'To' User"
-						,cfg.sub[i]->misc&SUB_TOUSER ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Allow Message Voting"
-						,cfg.sub[i]->misc&SUB_NOVOTING ? "No":"Yes");
-					sprintf(opt[n++],"%-27.27s%s","Allow Message Quoting"
-						,cfg.sub[i]->misc&SUB_QUOTE ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Suppress User Signatures"
-						,cfg.sub[i]->misc&SUB_NOUSERSIG ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Permanent Operator Msgs"
-						,cfg.sub[i]->misc&SUB_SYSPERM ? "Yes":"No");
-#if 0 /* this is not actually implemented (yet?) */
-					sprintf(opt[n++],"%-27.27s%s","Kill Read Messages"
-						,cfg.sub[i]->misc&SUB_KILL ? "Yes"
-						: (cfg.sub[i]->misc&SUB_KILLP ? "Pvt" : "No"));
-#endif
-					sprintf(opt[n++],"%-27.27s%s","Compress Messages (LZH)"
-						,cfg.sub[i]->misc&SUB_LZH ? "Yes" : "No");
-					sprintf(opt[n++],"%-27.27s%s","Template for New Subs"
-						,cfg.sub[i]->misc&SUB_TEMPLATE ? "Yes" : "No");
+			}
+			if(msk == MSK_CUT)
+				savsub = *cfg.sub[subnum[i]];
+			free(cfg.sub[subnum[i]]);
+			cfg.total_subs--;
+			for(j=subnum[i];j<cfg.total_subs;j++)
+				cfg.sub[j]=cfg.sub[j+1];
+			for(q=0;q<cfg.total_qhubs;q++)
+				for(s=0;s<cfg.qhub[q]->subs;s++) {
+					if(cfg.qhub[q]->sub[s] == cfg.sub[subnum[i]])
+						cfg.qhub[q]->sub[s] = NULL;
+				}
+			uifc.changes = TRUE;
+			continue; 
+		}
+		if(msk==MSK_COPY) {
+			savsub=*cfg.sub[subnum[i]];
+			continue; 
+		}
+		if(msk == MSK_PASTE) {
+			if (!new_sub(subnum[i], grpnum))
+				continue;
+			ptridx=cfg.sub[subnum[i]]->ptridx;
+			*cfg.sub[subnum[i]]=savsub;
+			cfg.sub[subnum[i]]->ptridx=ptridx;
+			cfg.sub[subnum[i]]->grp=grpnum;
+			uifc.changes = TRUE;
+			continue; 
+		}
+	#if 0
+		if(msk == MSK_SORT) {
+			sort_min = subnum[i];
+			sort_group = grpnum;
+			qsort(cfg.sub, cfg.total_subs, sizeof(sub_t*), sub_compare);
+			last_sort_field = sort_field;
+			sort_field++;
+			if(sort_field >= SORT_NONE)
+				sort_field = 0;
+			uifc.changes = TRUE;
+			continue;
+		}
+	#endif
+		i=subnum[i];
+		j=0;
+		done=0;
+		while(!done) {
+			n=0;
+			sprintf(opt[n++],"%-27.27s%s","Long Name",cfg.sub[i]->lname);
+			sprintf(opt[n++],"%-27.27s%s","Short Name",cfg.sub[i]->sname);
+			sprintf(opt[n++],"%-27.27s%s","QWK Name",cfg.sub[i]->qwkname);
+			sprintf(opt[n++],"%-27.27s%s%s","Internal Code"
+				,cfg.grp[cfg.sub[i]->grp]->code_prefix, cfg.sub[i]->code_suffix);
+			sprintf(opt[n++],"%-27.27s%s","Newsgroup Name",cfg.sub[i]->newsgroup);
+			sprintf(opt[n++],"%-27.27s%.40s","Access Requirements"
+				,cfg.sub[i]->arstr);
+			sprintf(opt[n++],"%-27.27s%.40s","Reading Requirements"
+				,cfg.sub[i]->read_arstr);
+			sprintf(opt[n++],"%-27.27s%.40s","Posting Requirements"
+				,cfg.sub[i]->post_arstr);
+			sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements"
+				,cfg.sub[i]->op_arstr);
+			sprintf(opt[n++],"%-27.27s%.40s","Moderated Posting User"
+				,cfg.sub[i]->mod_arstr);
+			if(cfg.sub[i]->maxmsgs)
+				sprintf(str, "%"PRIu32, cfg.sub[i]->maxmsgs);
+			else
+				strcpy(str, "Unlimited");
+			sprintf(opt[n++],"%-27.27s%s","Maximum Messages", str);
+			if(cfg.sub[i]->maxage)
+				sprintf(str,"Enabled (%u days old)",cfg.sub[i]->maxage);
+			else
+				strcpy(str,"Disabled");
+			sprintf(opt[n++],"%-27.27s%s","Purge by Age",str);
+			if(cfg.sub[i]->maxcrcs)
+				sprintf(str,"Enabled (%"PRIu32" message CRCs)",cfg.sub[i]->maxcrcs);
+			else
+				strcpy(str,"Disabled");
+			sprintf(opt[n++],"%-27.27s%s","Duplicate Checking",str);
 
-					opt[n][0]=0;
+			strcpy(opt[n++],"Toggle Options...");
+			strcpy(opt[n++],"Network Options...");
+			strcpy(opt[n++],"Advanced Options...");
+			opt[n][0]=0;
+			sprintf(str,"%s Sub-board", cfg.sub[i]->sname);
+			uifc.helpbuf=
+				"`Sub-board Configuration:`\n"
+				"\n"
+				"This menu allows you to configure the individual selected sub-board.\n"
+				"Options with a trailing `...` provide a sub-menu of more options.\n"
+			;
+			switch(uifc.list(WIN_ACT|WIN_SAV|WIN_BOT|WIN_L2R
+				,0,0,60,&opt_dflt,0,str,opt)) {
+				case -1:
+					done=1;
+					break;
+				case 0:
+					uifc.helpbuf=sub_long_name_help;
+					SAFECOPY(str,cfg.sub[i]->lname);	/* save */
+					if(uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Listings"
+						,cfg.sub[i]->lname,LEN_SLNAME,K_EDIT) == 0)
+						SAFECOPY(cfg.sub[i]->lname,str);	/* restore */
+					break;
+				case 1:
+					uifc.helpbuf=sub_short_name_help;
+					uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts"
+						,cfg.sub[i]->sname,LEN_SSNAME,K_EDIT);
+					break;
+				case 2:
 					uifc.helpbuf=
-						"`Sub-board Toggle Options:`\n"
+						"`Sub-board QWK Name:`\n"
 						"\n"
-						"This menu allows you to toggle certain options for the selected\n"
-						"sub-board between two or more settings, such as `Yes` and `No`.\n"
+						"This is the name of the sub-board used for QWK off-line readers.\n"
 					;
-					n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt,0
-						,"Toggle Options",opt);
-					if(n==-1)
-						break;
-					switch(n) {
-						case 0:
-							if(cfg.sub[i]->misc&SUB_PONLY)
-								n=2;
-							else 
-								n=(cfg.sub[i]->misc&SUB_PRIV) ? 0:1;
-							strcpy(opt[0],"Yes");
-							strcpy(opt[1],"No");
-							strcpy(opt[2],"Only");
-							opt[3][0]=0;
-							uifc.helpbuf=
-								"`Allow Private Posts on Sub-board:`\n"
-								"\n"
-								"If you want users to be able to post private messages to other users\n"
-								"on this sub-board, set this value to `Yes`. Usually, E-mail is the\n"
-								"preferred method of private communication. If you want users to be able\n"
-								"to post private messages only on this sub-board, select `Only`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Allow Private Posts",opt);
-							if(n==-1)
-								break;
-							if(!n && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY))
-								!=SUB_PRIV) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_PONLY;
-								cfg.sub[i]->misc|=SUB_PRIV;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_PRIV) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_PRIV;
-								break; 
-							}
-							if(n==2 && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY))
-								!=(SUB_PRIV|SUB_PONLY)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=(SUB_PRIV|SUB_PONLY); 
-							}
-							break;
-						case 1:
-							if(cfg.sub[i]->misc&SUB_AONLY)
-								n=2;
-							else 
-								n=(cfg.sub[i]->misc&SUB_ANON) ? 0:1;
-							strcpy(opt[0],"Yes");
-							strcpy(opt[1],"No");
-							strcpy(opt[2],"Only");
-							opt[3][0]=0;
-							uifc.helpbuf=
-								"`Allow Anonymous Posts on Sub-board:`\n"
-								"\n"
-								"If you want users with the `A` exemption to be able to post anonymously on\n"
-								"this sub-board, select `Yes`. If you want all posts on this sub-board to be\n"
-								"forced anonymous, select `Only`. If you do not want anonymous posts allowed\n"
-								"on this sub-board at all, select `No`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Allow Anonymous Posts",opt);
-							if(n==-1)
-								break;
-							if(!n && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY))
-								!=SUB_ANON) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_AONLY;
-								cfg.sub[i]->misc|=SUB_ANON;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~(SUB_ANON|SUB_AONLY);
-								break; 
-							}
-							if(n==2 && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY))
-								!=(SUB_ANON|SUB_AONLY)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=(SUB_ANON|SUB_AONLY); 
-							}
-                            break;
-						case 2:
-							n=(cfg.sub[i]->misc&SUB_NAME) ? 0:1;
-							uifc.helpbuf=
-								"`User Real Names in Posts on Sub-board:`\n"
-								"\n"
-								"If you allow aliases on your system, you can have messages on this\n"
-								"sub-board automatically use the real name of the posting user by setting\n"
-								"this option to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Use Real Names in Posts",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_NAME)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_NAME;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_NAME) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_NAME; 
-							}
-							break;
-						case 3:
-							if(cfg.sub[i]->misc&SUB_EDITLAST)
-								n=2;
-							else
-								n=(cfg.sub[i]->misc&SUB_EDIT) ? 0:1;
-							strcpy(opt[0],"Yes");
-							strcpy(opt[1],"No");
-							strcpy(opt[2],"Last Post Only");
-							opt[3][0]=0;
-							uifc.helpbuf=
-								"`Users Can Edit Posts on Sub-board:`\n"
-								"\n"
-								"If you wish to allow users to edit their messages after they have been\n"
-								"posted, this option to `Yes`. If you wish to allow users to edit only the\n"
-								"last message on a message base, set this option to `Last Post Only`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Users Can Edit Messages",opt);
-							if(n==-1)
-                                break;
-							if(n==0 /* yes */
-								&& (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST))
-								!=SUB_EDIT
-								) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_EDIT;
-								cfg.sub[i]->misc&=~SUB_EDITLAST;
-								break; 
-							}
-							if(n==1 /* no */
-								&& cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST)
-								) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~(SUB_EDIT|SUB_EDITLAST);
-								break;
-							}
-							if(n==2 /* last only */
-								&& (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST))
-								!=(SUB_EDIT|SUB_EDITLAST)
-								) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=(SUB_EDIT|SUB_EDITLAST);
-								break;
-							}
-                            break;
-						case 4:
-							if(cfg.sub[i]->misc&SUB_DELLAST)
-								n=2;
-							else 
-								n=(cfg.sub[i]->misc&SUB_DEL) ? 0:1;
-
-							strcpy(opt[0],"Yes");
-							strcpy(opt[1],"No");
-							strcpy(opt[2],"Last Post Only");
-							opt[3][0]=0;
-							uifc.helpbuf=
-								"`Users Can Delete Posts on Sub-board:`\n"
-								"\n"
-								"If you want users to be able to delete any of their own posts on this\n"
-								"sub-board, set this option to `Yes`. If you want to allow users the\n"
-								"ability to delete their message only if it is the last message on the\n"
-								"sub-board, select `Last Post Only`. If you want to disallow users from\n"
-								"deleting any of their posts, set this option to `No`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Users Can Delete Posts",opt);
-							if(n==-1)
-								break;
-							if(!n && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST))
-								!=SUB_DEL) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_DELLAST;
-								cfg.sub[i]->misc|=SUB_DEL;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_DEL) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_DEL;
-								break; 
-							}
-							if(n==2 && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST))
-								!=(SUB_DEL|SUB_DELLAST)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=(SUB_DEL|SUB_DELLAST); 
-							}
-                            break;
-						case 5:
-							n=(cfg.sub[i]->misc&SUB_NSDEF) ? 0:1;
-							uifc.helpbuf=
-								"`Default On for New Scan:`\n"
-								"\n"
-								"If you want this sub-board to be included in all user new message scans\n"
-								"by default, set this option to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Default On for New Scan",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_NSDEF)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_NSDEF;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_NSDEF) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_NSDEF; 
-							}
-                            break;
-						case 6:
-							n=(cfg.sub[i]->misc&SUB_FORCED) ? 0:1;
-							uifc.helpbuf=
-								"`Forced On for New Scan:`\n"
-								"\n"
-								"If you want this sub-board to be included in all user new message scans\n"
-								"even if the user has removed it from their new scan configuration, set\n"
-								"this option to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Forced New Scan",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_FORCED)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_FORCED;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_FORCED) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_FORCED; 
-							}
-                            break;
-						case 7:
-							n=(cfg.sub[i]->misc&SUB_SSDEF) ? 0:1;
-							uifc.helpbuf=
-								"`Default On for Your Scan:`\n"
-								"\n"
-								"If you want this sub-board to be included in all user personal message\n"
-								"scans by default, set this option to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Default On for Your Scan",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_SSDEF)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_SSDEF;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_SSDEF) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_SSDEF; 
-							}
-                            break;
-						case 8:
-							n=(cfg.sub[i]->misc&SUB_TOUSER) ? 0:1;
-							uifc.helpbuf=
-								"`Prompt for 'To' User on Public Posts:`\n"
-								"\n"
-								"If you want all posts on this sub-board to be prompted for a 'To' user,\n"
-								"set this option to `Yes`. This is a useful option for sub-boards that\n"
-								"are on a network that does not allow private posts.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Prompt for 'To' User on Public Posts",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_TOUSER)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_TOUSER;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_TOUSER) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_TOUSER; 
-							}
-							break;
-						case 9:
-							n=(cfg.sub[i]->misc&SUB_NOVOTING) ? 1:0;
-							uifc.helpbuf=
-								"`Allow Message Voting:`\n"
-								"\n"
-								"If you want users to be allowed to Up-Vote or Down-Vote messages on this\n"
-								"sub-board, set this option to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Allow Message Voting",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && (cfg.sub[i]->misc&SUB_NOVOTING)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc ^= SUB_NOVOTING;
-								break; 
-							}
-							if(n==1 && !(cfg.sub[i]->misc&SUB_NOVOTING)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc ^= SUB_NOVOTING; 
-							}
-                            break;
-						case 10:
-							n=(cfg.sub[i]->misc&SUB_QUOTE) ? 0:1;
-							uifc.helpbuf=
-								"`Allow Message Quoting:`\n"
-								"\n"
-								"If you want users to be allowed to quote messages on this sub-board, set\n"
-								"this option to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Allow Message Quoting",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_QUOTE)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_QUOTE;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_QUOTE) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_QUOTE; 
-							}
-                            break;
-						case 11:
-							n=(cfg.sub[i]->misc&SUB_NOUSERSIG) ? 0:1;
-							uifc.helpbuf=
-								"Suppress User Signatures:\n"
-								"\n"
-								"If you do not wish to have user signatures automatically appended to\n"
-								"messages posted in this sub-board, set this option to Yes.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Suppress User Signatures",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_NOUSERSIG)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_NOUSERSIG;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_NOUSERSIG) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_NOUSERSIG; 
-							}
-                            break;
-						case 12:
-							n=(cfg.sub[i]->misc&SUB_SYSPERM) ? 0:1;
-							uifc.helpbuf=
-								"`Operator Messages Automatically Permanent:`\n"
-								"\n"
-								"If you want messages posted by `System` and `Sub-board Operators` to be\n"
-								"automatically permanent (non-purgeable) for this sub-board, set this\n"
-								"option to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Permanent Operator Messages",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_SYSPERM)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_SYSPERM;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_SYSPERM) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_SYSPERM; 
-							}
-                            break;
-#if 0 /* This is not actually implemented (yet?) */
-						case 12:
-							if(cfg.sub[i]->misc&SUB_KILLP)
-								n=2;
-							else
-								n=(cfg.sub[i]->misc&SUB_KILL) ? 0:1;
-							strcpy(opt[0],"Yes");
-							strcpy(opt[1],"No");
-							strcpy(opt[2],"Private");
-							opt[3][0]=0;
-							uifc.helpbuf=
-								"`Kill Read Messages Automatically:`\n"
-								"\n"
-								"If you want messages that have been read by the intended recipient to\n"
-								"be automatically deleted by `SMBUTIL`, set this option to `Yes` or\n"
-								"`Private` if you want only private messages to be automatically deleted.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Kill Read Messages",opt);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_KILL)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_KILL;
-								cfg.sub[i]->misc&=~SUB_KILLP;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&(SUB_KILL|SUB_KILLP)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~(SUB_KILL|SUB_KILLP); 
-							}
-							if(n==2 && !(cfg.sub[i]->misc&SUB_KILLP)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_KILLP;
-								cfg.sub[i]->misc&=~SUB_KILL;
-                                break; 
-							}
-                            break;
-#endif
-						case 13:
-							n=(cfg.sub[i]->misc&SUB_LZH) ? 0:1;
-							uifc.helpbuf=
-								"`Compress Messages with LZH Encoding:`\n"
-								"\n"
-								"If you want all messages in this sub-board to be automatically\n"
-								"compressed via `LZH` (Lempel/Ziv/Huffman algorithm used in LHarc, LHA,\n"
-								"and other popular compression and archive programs), this option to `Yes`.\n"
-								"\n"
-								"Compression will slow down the reading and writing of messages slightly,\n"
-								"but the storage space saved can be as much as `50 percent`.\n"
-								"\n"
-								"Before setting this option to `Yes`, make sure that all of the SMB\n"
-								"compatible mail programs you use support the `LZH` translation.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Compress Messages (LZH)",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_LZH)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_LZH;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_LZH) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_LZH; 
-							}
-                            break;
-						case 14:
-							n=(cfg.sub[i]->misc&SUB_TEMPLATE) ? 0:1;
-							uifc.helpbuf=
-								"`Use this Sub-board as a Template for New Subs:`\n"
-								"\n"
-								"If you want this sub-board's options / settings to be used as the\n"
-								"template for newly-created or cloned sub-boards in this message group,\n"
-								"set this option to `Yes`.\n"
-								"\n"
-								"If multiple sub-boards have this option enabled, only the first will be\n"
-								"used as the template."
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Use this Sub-board as a Template for New Subs",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_TEMPLATE)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_TEMPLATE;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_TEMPLATE) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_TEMPLATE; 
-							}
-                            break;
-						} 
+					uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for QWK Packets"
+						,cfg.sub[i]->qwkname,10,K_EDIT);
+					break;
+				case 3:
+					uifc.helpbuf=sub_code_help;
+					SAFECOPY(str,cfg.sub[i]->code_suffix);
+					uifc.input(WIN_MID|WIN_SAV,0,17,"Internal Code Suffix (unique)"
+						,str,LEN_CODE,K_EDIT|K_UPPER);
+					if(code_ok(str))
+						SAFECOPY(cfg.sub[i]->code_suffix,str);
+					else {
+						uifc.helpbuf=invalid_code;
+						uifc.msg("Invalid Code");
+						uifc.helpbuf=0; 
 					}
-				break;
-			case 14:
-				while(1) {
-					n=0;
-					sprintf(opt[n++],"%-27.27s%s","Append Tag/Origin Line"
-						,cfg.sub[i]->misc&SUB_NOTAG ? "No":"Yes");
-					sprintf(opt[n++],"%-27.27s%s","Export ASCII Only"
-						,cfg.sub[i]->misc&SUB_ASCII ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","Gate Between Net Types"
-						,cfg.sub[i]->misc&SUB_GATE ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","QWK Networked"
-						,cfg.sub[i]->misc&SUB_QNET ? "Yes":"No");
-					sprintf(opt[n++],"QWK Tagline");
-					sprintf(opt[n++],"%-27.27s%s","Internet (UUCP/NNTP)"
-						,cfg.sub[i]->misc&SUB_INET ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","PostLink or PCRelay"
-                        ,cfg.sub[i]->misc&SUB_PNET ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","FidoNet EchoMail"
-						,cfg.sub[i]->misc&SUB_FIDO ? "Yes":"No");
-					sprintf(opt[n++],"%-27.27s%s","FidoNet Address"
-                        ,smb_faddrtoa(&cfg.sub[i]->faddr,tmp));
-					sprintf(opt[n++],"EchoMail Origin Line");
-					opt[n][0]=0;
+					break;
+				case 4:
 					uifc.helpbuf=
-						"`Sub-board Network Options:`\n"
+						"Newsgroup Name:\n"
 						"\n"
-						"This menu contains options for the selected sub-board that pertain\n"
-						"specifically to message networking.\n"
+						"This is the name of the sub-board used for newsgroup readers. If no name\n"
+						"is configured here, a name will be automatically generated from the\n"
+						"Sub-board's Short Name and message group's Short Name.\n"
 					;
-					n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&net_dflt,0
-						,"Network Options",opt);
-					if(n==-1)
-						break;
-                    switch(n) {
-						case 0:
-							n=0;
-							uifc.helpbuf=
-								"`Append Tag/Origin Line to Posts:`\n"
-								"\n"
-								"If you want to disable the automatic addition of a network tagline or\n"
-								"origin line to the bottom of outgoing networked posts from this\n"
-								"sub-board, set this option to `No`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Append Tag/Origin Line to Posts",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && cfg.sub[i]->misc&SUB_NOTAG) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_NOTAG;
-								break; 
-							}
-							if(n==1 && !(cfg.sub[i]->misc&SUB_NOTAG)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_NOTAG; 
-							}
-                            break;
-						case 1:
-							n=0;
-							uifc.helpbuf=
-								"`Export ASCII Characters Only:`\n"
-								"\n"
-								"If the network that this sub-board is echoed on does not allow extended\n"
-								"ASCII (>127) or control codes (<20, not including CR), set this option\n"
-								"to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Export ASCII Characters Only",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(n && cfg.sub[i]->misc&SUB_ASCII) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_ASCII;
-								break; 
-							}
-							if(!n && !(cfg.sub[i]->misc&SUB_ASCII)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_ASCII; 
-							}
-                            break;
-						case 2:
-							n=1;
-							uifc.helpbuf=
-								"`Gate Between Net Types:`\n"
-								"\n"
-								"If this sub-board is networked using more than one network technology,\n"
-								"and you want messages to be `gated` between the networks, set this\n"
-								"option to `Yes`.\n"
-								"\n"
-								"If this option is set to `No`, messages imported from one network type\n"
-								"will `not` be exported to another network type. This is the default and\n"
-								"should be used unless you have `specific` permission from both networks\n"
-								"to gate this sub-board. Incorrectly gated sub-boards can cause duplicate\n"
-								"messages loops and cross-posted messages.\n"
-								"\n"
-								"This option does not affect the exporting of messages created on your\n"
-								"BBS.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Gate Between Net Types",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_GATE)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_GATE;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_GATE) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_GATE; 
-							}
-                            break;
-						case 3:
-							n=1;
-							uifc.helpbuf=
-								"`Sub-board Networked via QWK Packets:`\n"
-								"\n"
-								"If this sub-board is networked with other BBSs via QWK packets, this\n"
-								"option should be set to `Yes`. With this option set to `Yes`, titles of\n"
-								"posts on this sub-board will be limited to the QWK packet limitation of\n"
-								"25 characters. It also allows the `N`etwork restriction to function\n"
-								"properly.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Networked via QWK Packets",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_QNET)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_QNET;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_QNET) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_QNET; 
-							}
-                            break;
-						case 4:
-							uifc.helpbuf=
-								"`Sub-board QWK Network Tagline:`\n"
-								"\n"
-								"If you want to use a different QWK tagline than the configured default\n"
-								"tagline in the `Networks` configuration, you should enter that tagline\n"
-								"here. If this option is left blank, the default tagline is used.\n"
-							;
-							uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->tagline
-								,sizeof(cfg.sub[i]->tagline)-1,K_MSG|K_EDIT);
-							break;
-						case 5:
-							n=1;
-							uifc.helpbuf=
-								"`Sub-board Networked via Internet:`\n"
-								"\n"
-								"If this sub-board is networked to the Internet via UUCP or NNTP, this\n"
-								"option should be set to `Yes`.\n"
-								"\n"
-								"It will allow the `N`etwork user restriction to function properly.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Networked via Internet",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_INET)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_INET;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_INET) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_INET; 
-							}
-                            break;
-						case 6:
-                            n=1;
-                            uifc.helpbuf=
-	                            "`Sub-board Networked via PostLink or PCRelay:`\n"
-	                            "\n"
-	                            "If this sub-board is networked with other BBSs via PostLink or PCRelay,\n"
-	                            "this option should be set to `Yes`. With this option set to `Yes`,\n"
-	                            "titles of posts on this sub-board will be limited to the UTI\n"
-	                            "specification limitation of 25 characters. It also allows the `N`etwork\n"
-	                            "restriction to function properly.\n"
-                            ;
-                            n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-                                ,"Networked via PostLink or PCRelay",uifcYesNoOpts);
-                            if(n==-1)
-                                break;
-                            if(!n && !(cfg.sub[i]->misc&SUB_PNET)) {
-                                uifc.changes = TRUE;
-                                cfg.sub[i]->misc|=SUB_PNET;
-                                break; 
-							}
-                            if(n==1 && cfg.sub[i]->misc&SUB_PNET) {
-                                uifc.changes = TRUE;
-                                cfg.sub[i]->misc&=~SUB_PNET; 
-							}
-                            break;
-						case 7:
-							n=1;
-							uifc.helpbuf=
-								"`Sub-board Networked via FidoNet EchoMail:`\n"
-								"\n"
-								"If this sub-board is part of a FidoNet EchoMail conference, set this\n"
-								"option to `Yes`.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Networked via FidoNet EchoMail",uifcYesNoOpts);
-							if(n==-1)
-                                break;
-							if(!n && !(cfg.sub[i]->misc&SUB_FIDO)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_FIDO;
-								break; 
-							}
-							if(n==1 && cfg.sub[i]->misc&SUB_FIDO) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~SUB_FIDO; 
-							}
-                            break;
-						case 8:
-							smb_faddrtoa(&cfg.sub[i]->faddr,str);
-							uifc.helpbuf=
-								"`Sub-board FidoNet Address:`\n"
-								"\n"
-								"If this sub-board is part of a FidoNet EchoMail conference, this is\n"
-								"the address used for this sub-board. Format: `Zone:Net/Node[.Point]`\n"
-							;
-							uifc.input(WIN_MID|WIN_SAV,0,0,"FidoNet Address"
-								,str,25,K_EDIT);
-							cfg.sub[i]->faddr=atofaddr(str);
-							break;
-						case 9:
-							uifc.helpbuf=
-								"`Sub-board FidoNet Origin Line:`\n"
-								"\n"
-								"If this sub-board is part of a FidoNet EchoMail conference and you\n"
-								"want to use an origin line other than the default origin line in the\n"
-								"`Networks` configuration, set this value to the desired origin line.\n"
-								"\n"
-								"If this option is blank, the default origin line is used.\n"
-							;
-							uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->origline
-								,sizeof(cfg.sub[i]->origline)-1,K_EDIT);
-                            break;
-					} 
-				}
-				break;
-			case 15:
-				while(1) {
-					n=0;
-					if(cfg.sub[i]->qwkconf)
-						sprintf(str,"Static (%u)",cfg.sub[i]->qwkconf);
-					else
-						strcpy(str,"Dynamic");
-					sprintf(opt[n++],"%-27.27s%s","QWK Conference Number"
-						,str);
-					sprintf(opt[n++],"%-27.27s%s","Storage Method"
-						,cfg.sub[i]->misc&SUB_HYPER ? "Hyper Allocation"
-						: cfg.sub[i]->misc&SUB_FAST ? "Fast Allocation"
-						: "Self-packing");
-					if(!cfg.sub[i]->data_dir[0])
-						sprintf(str,"%ssubs/",cfg.data_dir);
-					else
-						strcpy(str,cfg.sub[i]->data_dir);
-					sprintf(opt[n++],"%-27.27s%.40s","Storage Directory",str);
-					sprintf(opt[n++],"%-27.27s%.40s","Semaphore File",cfg.sub[i]->post_sem);
-					sprintf(opt[n++],"%-27.27s%u","Pointer File Index",cfg.sub[i]->ptridx);
-					sprintf(opt[n++],"%-27.27sNow %u / Was %u","Sub-board Index", i, cfg.sub[i]->subnum);
-					opt[n][0]=0;
+					uifc.input(WIN_MID|WIN_SAV,0,17,""
+						,cfg.sub[i]->newsgroup,sizeof(cfg.sub[i]->newsgroup)-1,K_EDIT);
+					break;
+				case 5:
+					sprintf(str,"%s Access",cfg.sub[i]->sname);
+					getar(str,cfg.sub[i]->arstr);
+					break;
+				case 6:
+					sprintf(str,"%s Reading",cfg.sub[i]->sname);
+					getar(str,cfg.sub[i]->read_arstr);
+					break;
+				case 7:
+					sprintf(str,"%s Posting",cfg.sub[i]->sname);
+					getar(str,cfg.sub[i]->post_arstr);
+					break;
+				case 8:
+					sprintf(str,"%s Operator",cfg.sub[i]->sname);
+					getar(str,cfg.sub[i]->op_arstr);
+					break;
+				case 9:
+					sprintf(str,"%s Moderated Posting User",cfg.sub[i]->sname);
+					getar(str,cfg.sub[i]->mod_arstr);
+					break;
+				case 10:
+					sprintf(str,"%"PRIu32,cfg.sub[i]->maxmsgs);
 					uifc.helpbuf=
-						"`Sub-board Advanced Options:`\n"
+						"`Maximum Number of Messages:`\n"
+						"\n"
+						"This value is the maximum number of messages that will be kept in the\n"
+						"sub-board. It is possible for newly-posted or imported messages to\n"
+						"exceed this maximum (it is `not` an immediately imposed limit).\n"
+						"\n"
+						"Older messages that exceed this maximum count are purged using `smbutil`,\n"
+						"typically run as a timed event (e.g. `MSGMAINT`).\n"
 						"\n"
-						"This menu contains options for the selected sub-board that are advanced\n"
-						"in nature.\n"
+						"A value of `0` means no maximum number of stored messages will be\n"
+						"imposed during message-base maintenance."
 					;
-					n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&adv_dflt,0
-						,"Advanced Options",opt);
-					if(n==-1)
-						break;
-                    switch(n) {
-                        case 0:
-							uifc.helpbuf=
-								"`Sub-board QWK Conference Number:`\n"
-								"\n"
-								"If you wish to have the QWK conference number for this sub-board\n"
-								"automatically generated by Synchronet (based on the group number\n"
-								"and sub-board number for the user), set this option to `Dynamic`.\n"
-								"\n"
-								"If you wish to have the same QWK conference number for this sub-board\n"
-								"regardless of which user access it, set this option to `Static`\n"
-								"by entering the conference number you want to use.\n"
-							;
-							if(cfg.sub[i]->qwkconf)
-								sprintf(str,"%u",cfg.sub[i]->qwkconf);
-							else
-								str[0]=0;
-							if(uifc.input(WIN_MID|WIN_SAV,0,17
-								,"QWK Conference Number (0=Dynamic)"
-								,str,5,K_EDIT|K_NUMBER)>=0)
-								cfg.sub[i]->qwkconf=atoi(str);
+					uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of Messages"
+						,str,9,K_EDIT|K_NUMBER);
+					cfg.sub[i]->maxmsgs=atoi(str);
+					cfg.sub[i]->misc|=SUB_HDRMOD;
+					break;
+				case 11:
+					sprintf(str,"%u",cfg.sub[i]->maxage);
+					uifc.helpbuf=
+						"`Maximum Age of Messages:`\n"
+						"\n"
+						"This value is the maximum number of days that messages will be kept in\n"
+						"the sub-board.\n"
+						"\n"
+						"Message age is calculated from the date and time of message import/post\n"
+						"and not necessarily the date/time the message was originally written.\n"
+						"\n"
+						"Old messages are purged using `smbutil`, typically run as a timed\n"
+						"event (e.g. `MSGMAINT`).\n"
+						"\n"
+						"A value of `0` means no maximum age of stored messages will be\n"
+						"imposed during message-base maintenance."
+					;
+					uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Age of Messages (in days)"
+						,str,5,K_EDIT|K_NUMBER);
+					cfg.sub[i]->maxage=atoi(str);
+					cfg.sub[i]->misc|=SUB_HDRMOD;
+					break;
+				case 12:
+					sprintf(str,"%"PRIu32,cfg.sub[i]->maxcrcs);
+					uifc.helpbuf=
+						"`Maximum Number of CRCs:`\n"
+						"\n"
+						"This value is the maximum number of CRCs that will be kept in the\n"
+						"sub-board for duplicate message checking. Once this maximum number of\n"
+						"CRCs is reached, the oldest CRCs will be automatically purged.\n"
+						"\n"
+						"A value of `0` means no CRCs (or other hashes) of message body text\n"
+						"or meta-data will be saved (i.e. for purposes of duplicate message\n"
+						"detection and rejection)."
+					;
+					uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of CRCs"
+						,str,9,K_EDIT|K_NUMBER);
+					cfg.sub[i]->maxcrcs=atol(str);
+					cfg.sub[i]->misc|=SUB_HDRMOD;
+					break;
+				case 13:
+					while(1) {
+						n=0;
+						sprintf(opt[n++],"%-27.27s%s","Allow Private Posts"
+							,cfg.sub[i]->misc&SUB_PRIV ? cfg.sub[i]->misc&SUB_PONLY
+							? "Only":"Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Allow Anonymous Posts"
+							,cfg.sub[i]->misc&SUB_ANON ? cfg.sub[i]->misc&SUB_AONLY
+							? "Only":"Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Post Using Real Names"
+							,cfg.sub[i]->misc&SUB_NAME ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Users Can Edit Posts"
+							,cfg.sub[i]->misc&SUB_EDIT ? cfg.sub[i]->misc&SUB_EDITLAST 
+							? "Last" : "Yes" : "No");
+						sprintf(opt[n++],"%-27.27s%s","Users Can Delete Posts"
+							,cfg.sub[i]->misc&SUB_DEL ? cfg.sub[i]->misc&SUB_DELLAST
+							? "Last" : "Yes" : "No");
+						sprintf(opt[n++],"%-27.27s%s","Default On for New Scan"
+							,cfg.sub[i]->misc&SUB_NSDEF ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Forced On for New Scan"
+							,cfg.sub[i]->misc&SUB_FORCED ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Default On for Your Scan"
+							,cfg.sub[i]->misc&SUB_SSDEF ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Public 'To' User"
+							,cfg.sub[i]->misc&SUB_TOUSER ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Allow Message Voting"
+							,cfg.sub[i]->misc&SUB_NOVOTING ? "No":"Yes");
+						sprintf(opt[n++],"%-27.27s%s","Allow Message Quoting"
+							,cfg.sub[i]->misc&SUB_QUOTE ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Suppress User Signatures"
+							,cfg.sub[i]->misc&SUB_NOUSERSIG ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Permanent Operator Msgs"
+							,cfg.sub[i]->misc&SUB_SYSPERM ? "Yes":"No");
+	#if 0 /* this is not actually implemented (yet?) */
+						sprintf(opt[n++],"%-27.27s%s","Kill Read Messages"
+							,cfg.sub[i]->misc&SUB_KILL ? "Yes"
+							: (cfg.sub[i]->misc&SUB_KILLP ? "Pvt" : "No"));
+	#endif
+						sprintf(opt[n++],"%-27.27s%s","Compress Messages (LZH)"
+							,cfg.sub[i]->misc&SUB_LZH ? "Yes" : "No");
+						sprintf(opt[n++],"%-27.27s%s","Template for New Subs"
+							,cfg.sub[i]->misc&SUB_TEMPLATE ? "Yes" : "No");
+
+						opt[n][0]=0;
+						uifc.helpbuf=
+							"`Sub-board Toggle Options:`\n"
+							"\n"
+							"This menu allows you to toggle certain options for the selected\n"
+							"sub-board between two or more settings, such as `Yes` and `No`.\n"
+						;
+						n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt,0
+							,"Toggle Options",opt);
+						if(n==-1)
 							break;
-						case 1:
-							n=0;
-							strcpy(opt[0],"Hyper Allocation");
-							strcpy(opt[1],"Fast Allocation");
-							strcpy(opt[2],"Self-packing");
-							opt[3][0]=0;
-							uifc.helpbuf=
-								"`Self-Packing` is the slowest storage method because it conserves disk\n"
-								"  space as it imports messages by using deleted message header and data\n"
-								"  blocks for new messages automatically. If you use this storage method,\n"
-								"  you will not need to run `smbutil p` on this message base unless you\n"
-								"  accumilate a large number of deleted message blocks and wish to free\n"
-								"  that disk space. You can switch from self-packing to fast allocation\n"
-								"  storage method and back again as you wish.\n"
-								"`Fast Allocation` is faster than self-packing because it does not search\n"
-								"  for deleted message blocks for new messages. It automatically places\n"
-								"  all new message blocks at the end of the header and data files. If you\n"
-								"  use this storage method, you will need to run `smbutil p` on this\n"
-								"  message base periodically or it will continually use up disk space.\n"
-								"`Hyper Allocation` is the fastest storage method because it does not\n"
-								"  maintain allocation files at all. Once a message base is setup to use\n"
-								"  this storage method, it should not be changed without first deleting\n"
-								"  the message base data files in your `data/subs` directory for this\n"
-								"  sub-board. You must use `smbutil p` as with the fast allocation method.\n"
-							;
-							n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
-								,"Storage Method",opt);
-							if(n==-1)
+						switch(n) {
+							case 0:
+								if(cfg.sub[i]->misc&SUB_PONLY)
+									n=2;
+								else 
+									n=(cfg.sub[i]->misc&SUB_PRIV) ? 0:1;
+								strcpy(opt[0],"Yes");
+								strcpy(opt[1],"No");
+								strcpy(opt[2],"Only");
+								opt[3][0]=0;
+								uifc.helpbuf=
+									"`Allow Private Posts on Sub-board:`\n"
+									"\n"
+									"If you want users to be able to post private messages to other users\n"
+									"on this sub-board, set this value to `Yes`. Usually, E-mail is the\n"
+									"preferred method of private communication. If you want users to be able\n"
+									"to post private messages only on this sub-board, select `Only`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Allow Private Posts",opt);
+								if(n==-1)
+									break;
+								if(!n && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY))
+									!=SUB_PRIV) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_PONLY;
+									cfg.sub[i]->misc|=SUB_PRIV;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_PRIV) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_PRIV;
+									break; 
+								}
+								if(n==2 && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY))
+									!=(SUB_PRIV|SUB_PONLY)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=(SUB_PRIV|SUB_PONLY); 
+								}
 								break;
-							if(!n && !(cfg.sub[i]->misc&SUB_HYPER)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_HYPER;
-								cfg.sub[i]->misc&=~SUB_FAST;
-								cfg.sub[i]->misc|=SUB_HDRMOD;
-								break; 
-							}
-							if(!n)
+							case 1:
+								if(cfg.sub[i]->misc&SUB_AONLY)
+									n=2;
+								else 
+									n=(cfg.sub[i]->misc&SUB_ANON) ? 0:1;
+								strcpy(opt[0],"Yes");
+								strcpy(opt[1],"No");
+								strcpy(opt[2],"Only");
+								opt[3][0]=0;
+								uifc.helpbuf=
+									"`Allow Anonymous Posts on Sub-board:`\n"
+									"\n"
+									"If you want users with the `A` exemption to be able to post anonymously on\n"
+									"this sub-board, select `Yes`. If you want all posts on this sub-board to be\n"
+									"forced anonymous, select `Only`. If you do not want anonymous posts allowed\n"
+									"on this sub-board at all, select `No`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Allow Anonymous Posts",opt);
+								if(n==-1)
+									break;
+								if(!n && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY))
+									!=SUB_ANON) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_AONLY;
+									cfg.sub[i]->misc|=SUB_ANON;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~(SUB_ANON|SUB_AONLY);
+									break; 
+								}
+								if(n==2 && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY))
+									!=(SUB_ANON|SUB_AONLY)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=(SUB_ANON|SUB_AONLY); 
+								}
+								break;
+							case 2:
+								n=(cfg.sub[i]->misc&SUB_NAME) ? 0:1;
+								uifc.helpbuf=
+									"`User Real Names in Posts on Sub-board:`\n"
+									"\n"
+									"If you allow aliases on your system, you can have messages on this\n"
+									"sub-board automatically use the real name of the posting user by setting\n"
+									"this option to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Use Real Names in Posts",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_NAME)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_NAME;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_NAME) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_NAME; 
+								}
+								break;
+							case 3:
+								if(cfg.sub[i]->misc&SUB_EDITLAST)
+									n=2;
+								else
+									n=(cfg.sub[i]->misc&SUB_EDIT) ? 0:1;
+								strcpy(opt[0],"Yes");
+								strcpy(opt[1],"No");
+								strcpy(opt[2],"Last Post Only");
+								opt[3][0]=0;
+								uifc.helpbuf=
+									"`Users Can Edit Posts on Sub-board:`\n"
+									"\n"
+									"If you wish to allow users to edit their messages after they have been\n"
+									"posted, this option to `Yes`. If you wish to allow users to edit only the\n"
+									"last message on a message base, set this option to `Last Post Only`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Users Can Edit Messages",opt);
+								if(n==-1)
+									break;
+								if(n==0 /* yes */
+									&& (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST))
+									!=SUB_EDIT
+									) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_EDIT;
+									cfg.sub[i]->misc&=~SUB_EDITLAST;
+									break; 
+								}
+								if(n==1 /* no */
+									&& cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST)
+									) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~(SUB_EDIT|SUB_EDITLAST);
+									break;
+								}
+								if(n==2 /* last only */
+									&& (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST))
+									!=(SUB_EDIT|SUB_EDITLAST)
+									) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=(SUB_EDIT|SUB_EDITLAST);
+									break;
+								}
 								break;
-							if(cfg.sub[i]->misc&SUB_HYPER) {	/* Switching from hyper */
+							case 4:
+								if(cfg.sub[i]->misc&SUB_DELLAST)
+									n=2;
+								else 
+									n=(cfg.sub[i]->misc&SUB_DEL) ? 0:1;
+
 								strcpy(opt[0],"Yes");
-								strcpy(opt[1],"No, I want to use Hyper Allocation");
-								opt[2][0]=0;
-								m=0;
-								if(uifc.list(WIN_SAV|WIN_MID,0,0,0,&m,0
-									,"Delete all messages in this sub-board?",opt)!=0)
+								strcpy(opt[1],"No");
+								strcpy(opt[2],"Last Post Only");
+								opt[3][0]=0;
+								uifc.helpbuf=
+									"`Users Can Delete Posts on Sub-board:`\n"
+									"\n"
+									"If you want users to be able to delete any of their own posts on this\n"
+									"sub-board, set this option to `Yes`. If you want to allow users the\n"
+									"ability to delete their message only if it is the last message on the\n"
+									"sub-board, select `Last Post Only`. If you want to disallow users from\n"
+									"deleting any of their posts, set this option to `No`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Users Can Delete Posts",opt);
+								if(n==-1)
+									break;
+								if(!n && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST))
+									!=SUB_DEL) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_DELLAST;
+									cfg.sub[i]->misc|=SUB_DEL;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_DEL) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_DEL;
+									break; 
+								}
+								if(n==2 && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST))
+									!=(SUB_DEL|SUB_DELLAST)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=(SUB_DEL|SUB_DELLAST); 
+								}
+								break;
+							case 5:
+								n=(cfg.sub[i]->misc&SUB_NSDEF) ? 0:1;
+								uifc.helpbuf=
+									"`Default On for New Scan:`\n"
+									"\n"
+									"If you want this sub-board to be included in all user new message scans\n"
+									"by default, set this option to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Default On for New Scan",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_NSDEF)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_NSDEF;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_NSDEF) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_NSDEF; 
+								}
+								break;
+							case 6:
+								n=(cfg.sub[i]->misc&SUB_FORCED) ? 0:1;
+								uifc.helpbuf=
+									"`Forced On for New Scan:`\n"
+									"\n"
+									"If you want this sub-board to be included in all user new message scans\n"
+									"even if the user has removed it from their new scan configuration, set\n"
+									"this option to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Forced New Scan",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_FORCED)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_FORCED;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_FORCED) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_FORCED; 
+								}
+								break;
+							case 7:
+								n=(cfg.sub[i]->misc&SUB_SSDEF) ? 0:1;
+								uifc.helpbuf=
+									"`Default On for Your Scan:`\n"
+									"\n"
+									"If you want this sub-board to be included in all user personal message\n"
+									"scans by default, set this option to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Default On for Your Scan",uifcYesNoOpts);
+								if(n==-1)
 									break;
-								if(cfg.sub[i]->data_dir[0])
-									sprintf(str,"%s",cfg.sub[i]->data_dir);
+								if(!n && !(cfg.sub[i]->misc&SUB_SSDEF)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_SSDEF;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_SSDEF) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_SSDEF; 
+								}
+								break;
+							case 8:
+								n=(cfg.sub[i]->misc&SUB_TOUSER) ? 0:1;
+								uifc.helpbuf=
+									"`Prompt for 'To' User on Public Posts:`\n"
+									"\n"
+									"If you want all posts on this sub-board to be prompted for a 'To' user,\n"
+									"set this option to `Yes`. This is a useful option for sub-boards that\n"
+									"are on a network that does not allow private posts.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Prompt for 'To' User on Public Posts",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_TOUSER)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_TOUSER;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_TOUSER) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_TOUSER; 
+								}
+								break;
+							case 9:
+								n=(cfg.sub[i]->misc&SUB_NOVOTING) ? 1:0;
+								uifc.helpbuf=
+									"`Allow Message Voting:`\n"
+									"\n"
+									"If you want users to be allowed to Up-Vote or Down-Vote messages on this\n"
+									"sub-board, set this option to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Allow Message Voting",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && (cfg.sub[i]->misc&SUB_NOVOTING)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc ^= SUB_NOVOTING;
+									break; 
+								}
+								if(n==1 && !(cfg.sub[i]->misc&SUB_NOVOTING)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc ^= SUB_NOVOTING; 
+								}
+								break;
+							case 10:
+								n=(cfg.sub[i]->misc&SUB_QUOTE) ? 0:1;
+								uifc.helpbuf=
+									"`Allow Message Quoting:`\n"
+									"\n"
+									"If you want users to be allowed to quote messages on this sub-board, set\n"
+									"this option to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Allow Message Quoting",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_QUOTE)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_QUOTE;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_QUOTE) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_QUOTE; 
+								}
+								break;
+							case 11:
+								n=(cfg.sub[i]->misc&SUB_NOUSERSIG) ? 0:1;
+								uifc.helpbuf=
+									"Suppress User Signatures:\n"
+									"\n"
+									"If you do not wish to have user signatures automatically appended to\n"
+									"messages posted in this sub-board, set this option to Yes.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Suppress User Signatures",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_NOUSERSIG)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_NOUSERSIG;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_NOUSERSIG) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_NOUSERSIG; 
+								}
+								break;
+							case 12:
+								n=(cfg.sub[i]->misc&SUB_SYSPERM) ? 0:1;
+								uifc.helpbuf=
+									"`Operator Messages Automatically Permanent:`\n"
+									"\n"
+									"If you want messages posted by `System` and `Sub-board Operators` to be\n"
+									"automatically permanent (non-purgeable) for this sub-board, set this\n"
+									"option to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Permanent Operator Messages",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_SYSPERM)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_SYSPERM;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_SYSPERM) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_SYSPERM; 
+								}
+								break;
+	#if 0 /* This is not actually implemented (yet?) */
+							case 12:
+								if(cfg.sub[i]->misc&SUB_KILLP)
+									n=2;
+								else
+									n=(cfg.sub[i]->misc&SUB_KILL) ? 0:1;
+								strcpy(opt[0],"Yes");
+								strcpy(opt[1],"No");
+								strcpy(opt[2],"Private");
+								opt[3][0]=0;
+								uifc.helpbuf=
+									"`Kill Read Messages Automatically:`\n"
+									"\n"
+									"If you want messages that have been read by the intended recipient to\n"
+									"be automatically deleted by `SMBUTIL`, set this option to `Yes` or\n"
+									"`Private` if you want only private messages to be automatically deleted.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Kill Read Messages",opt);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_KILL)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_KILL;
+									cfg.sub[i]->misc&=~SUB_KILLP;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&(SUB_KILL|SUB_KILLP)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~(SUB_KILL|SUB_KILLP); 
+								}
+								if(n==2 && !(cfg.sub[i]->misc&SUB_KILLP)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_KILLP;
+									cfg.sub[i]->misc&=~SUB_KILL;
+									break; 
+								}
+								break;
+	#endif
+							case 13:
+								n=(cfg.sub[i]->misc&SUB_LZH) ? 0:1;
+								uifc.helpbuf=
+									"`Compress Messages with LZH Encoding:`\n"
+									"\n"
+									"If you want all messages in this sub-board to be automatically\n"
+									"compressed via `LZH` (Lempel/Ziv/Huffman algorithm used in LHarc, LHA,\n"
+									"and other popular compression and archive programs), this option to `Yes`.\n"
+									"\n"
+									"Compression will slow down the reading and writing of messages slightly,\n"
+									"but the storage space saved can be as much as `50 percent`.\n"
+									"\n"
+									"Before setting this option to `Yes`, make sure that all of the SMB\n"
+									"compatible mail programs you use support the `LZH` translation.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Compress Messages (LZH)",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_LZH)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_LZH;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_LZH) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_LZH; 
+								}
+								break;
+							case 14:
+								n=(cfg.sub[i]->misc&SUB_TEMPLATE) ? 0:1;
+								uifc.helpbuf=
+									"`Use this Sub-board as a Template for New Subs:`\n"
+									"\n"
+									"If you want this sub-board's options / settings to be used as the\n"
+									"template for newly-created or cloned sub-boards in this message group,\n"
+									"set this option to `Yes`.\n"
+									"\n"
+									"If multiple sub-boards have this option enabled, only the first will be\n"
+									"used as the template."
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Use this Sub-board as a Template for New Subs",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_TEMPLATE)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_TEMPLATE;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_TEMPLATE) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_TEMPLATE; 
+								}
+								break;
+							} 
+						}
+					break;
+				case 14:
+					while(1) {
+						n=0;
+						sprintf(opt[n++],"%-27.27s%s","Append Tag/Origin Line"
+							,cfg.sub[i]->misc&SUB_NOTAG ? "No":"Yes");
+						sprintf(opt[n++],"%-27.27s%s","Export ASCII Only"
+							,cfg.sub[i]->misc&SUB_ASCII ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","Gate Between Net Types"
+							,cfg.sub[i]->misc&SUB_GATE ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","QWK Networked"
+							,cfg.sub[i]->misc&SUB_QNET ? "Yes":"No");
+						sprintf(opt[n++],"QWK Tagline");
+						sprintf(opt[n++],"%-27.27s%s","Internet (UUCP/NNTP)"
+							,cfg.sub[i]->misc&SUB_INET ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","PostLink or PCRelay"
+							,cfg.sub[i]->misc&SUB_PNET ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","FidoNet EchoMail"
+							,cfg.sub[i]->misc&SUB_FIDO ? "Yes":"No");
+						sprintf(opt[n++],"%-27.27s%s","FidoNet Address"
+							,smb_faddrtoa(&cfg.sub[i]->faddr,tmp));
+						sprintf(opt[n++],"EchoMail Origin Line");
+						opt[n][0]=0;
+						uifc.helpbuf=
+							"`Sub-board Network Options:`\n"
+							"\n"
+							"This menu contains options for the selected sub-board that pertain\n"
+							"specifically to message networking.\n"
+						;
+						n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&net_dflt,0
+							,"Network Options",opt);
+						if(n==-1)
+							break;
+						switch(n) {
+							case 0:
+								n=0;
+								uifc.helpbuf=
+									"`Append Tag/Origin Line to Posts:`\n"
+									"\n"
+									"If you want to disable the automatic addition of a network tagline or\n"
+									"origin line to the bottom of outgoing networked posts from this\n"
+									"sub-board, set this option to `No`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Append Tag/Origin Line to Posts",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && cfg.sub[i]->misc&SUB_NOTAG) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_NOTAG;
+									break; 
+								}
+								if(n==1 && !(cfg.sub[i]->misc&SUB_NOTAG)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_NOTAG; 
+								}
+								break;
+							case 1:
+								n=0;
+								uifc.helpbuf=
+									"`Export ASCII Characters Only:`\n"
+									"\n"
+									"If the network that this sub-board is echoed on does not allow extended\n"
+									"ASCII (>127) or control codes (<20, not including CR), set this option\n"
+									"to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Export ASCII Characters Only",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(n && cfg.sub[i]->misc&SUB_ASCII) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_ASCII;
+									break; 
+								}
+								if(!n && !(cfg.sub[i]->misc&SUB_ASCII)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_ASCII; 
+								}
+								break;
+							case 2:
+								n=1;
+								uifc.helpbuf=
+									"`Gate Between Net Types:`\n"
+									"\n"
+									"If this sub-board is networked using more than one network technology,\n"
+									"and you want messages to be `gated` between the networks, set this\n"
+									"option to `Yes`.\n"
+									"\n"
+									"If this option is set to `No`, messages imported from one network type\n"
+									"will `not` be exported to another network type. This is the default and\n"
+									"should be used unless you have `specific` permission from both networks\n"
+									"to gate this sub-board. Incorrectly gated sub-boards can cause duplicate\n"
+									"messages loops and cross-posted messages.\n"
+									"\n"
+									"This option does not affect the exporting of messages created on your\n"
+									"BBS.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Gate Between Net Types",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_GATE)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_GATE;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_GATE) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_GATE; 
+								}
+								break;
+							case 3:
+								n=1;
+								uifc.helpbuf=
+									"`Sub-board Networked via QWK Packets:`\n"
+									"\n"
+									"If this sub-board is networked with other BBSs via QWK packets, this\n"
+									"option should be set to `Yes`. With this option set to `Yes`, titles of\n"
+									"posts on this sub-board will be limited to the QWK packet limitation of\n"
+									"25 characters. It also allows the `N`etwork restriction to function\n"
+									"properly.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Networked via QWK Packets",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_QNET)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_QNET;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_QNET) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_QNET; 
+								}
+								break;
+							case 4:
+								uifc.helpbuf=
+									"`Sub-board QWK Network Tagline:`\n"
+									"\n"
+									"If you want to use a different QWK tagline than the configured default\n"
+									"tagline in the `Networks` configuration, you should enter that tagline\n"
+									"here. If this option is left blank, the default tagline is used.\n"
+								;
+								uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->tagline
+									,sizeof(cfg.sub[i]->tagline)-1,K_MSG|K_EDIT);
+								break;
+							case 5:
+								n=1;
+								uifc.helpbuf=
+									"`Sub-board Networked via Internet:`\n"
+									"\n"
+									"If this sub-board is networked to the Internet via UUCP or NNTP, this\n"
+									"option should be set to `Yes`.\n"
+									"\n"
+									"It will allow the `N`etwork user restriction to function properly.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Networked via Internet",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_INET)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_INET;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_INET) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_INET; 
+								}
+								break;
+							case 6:
+								n=1;
+								uifc.helpbuf=
+									"`Sub-board Networked via PostLink or PCRelay:`\n"
+									"\n"
+									"If this sub-board is networked with other BBSs via PostLink or PCRelay,\n"
+									"this option should be set to `Yes`. With this option set to `Yes`,\n"
+									"titles of posts on this sub-board will be limited to the UTI\n"
+									"specification limitation of 25 characters. It also allows the `N`etwork\n"
+									"restriction to function properly.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Networked via PostLink or PCRelay",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_PNET)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_PNET;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_PNET) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_PNET; 
+								}
+								break;
+							case 7:
+								n=1;
+								uifc.helpbuf=
+									"`Sub-board Networked via FidoNet EchoMail:`\n"
+									"\n"
+									"If this sub-board is part of a FidoNet EchoMail conference, set this\n"
+									"option to `Yes`.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Networked via FidoNet EchoMail",uifcYesNoOpts);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_FIDO)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_FIDO;
+									break; 
+								}
+								if(n==1 && cfg.sub[i]->misc&SUB_FIDO) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~SUB_FIDO; 
+								}
+								break;
+							case 8:
+								smb_faddrtoa(&cfg.sub[i]->faddr,str);
+								uifc.helpbuf=
+									"`Sub-board FidoNet Address:`\n"
+									"\n"
+									"If this sub-board is part of a FidoNet EchoMail conference, this is\n"
+									"the address used for this sub-board. Format: `Zone:Net/Node[.Point]`\n"
+								;
+								uifc.input(WIN_MID|WIN_SAV,0,0,"FidoNet Address"
+									,str,25,K_EDIT);
+								cfg.sub[i]->faddr=atofaddr(str);
+								break;
+							case 9:
+								uifc.helpbuf=
+									"`Sub-board FidoNet Origin Line:`\n"
+									"\n"
+									"If this sub-board is part of a FidoNet EchoMail conference and you\n"
+									"want to use an origin line other than the default origin line in the\n"
+									"`Networks` configuration, set this value to the desired origin line.\n"
+									"\n"
+									"If this option is blank, the default origin line is used.\n"
+								;
+								uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->origline
+									,sizeof(cfg.sub[i]->origline)-1,K_EDIT);
+								break;
+						} 
+					}
+					break;
+				case 15:
+					while(1) {
+						n=0;
+						if(cfg.sub[i]->qwkconf)
+							sprintf(str,"Static (%u)",cfg.sub[i]->qwkconf);
+						else
+							strcpy(str,"Dynamic");
+						sprintf(opt[n++],"%-27.27s%s","QWK Conference Number"
+							,str);
+						sprintf(opt[n++],"%-27.27s%s","Storage Method"
+							,cfg.sub[i]->misc&SUB_HYPER ? "Hyper Allocation"
+							: cfg.sub[i]->misc&SUB_FAST ? "Fast Allocation"
+							: "Self-packing");
+						if(!cfg.sub[i]->data_dir[0])
+							sprintf(str,"%ssubs/",cfg.data_dir);
+						else
+							strcpy(str,cfg.sub[i]->data_dir);
+						sprintf(opt[n++],"%-27.27s%.40s","Storage Directory",str);
+						sprintf(opt[n++],"%-27.27s%.40s","Semaphore File",cfg.sub[i]->post_sem);
+						sprintf(opt[n++],"%-27.27s%u","Pointer File Index",cfg.sub[i]->ptridx);
+						sprintf(opt[n++],"%-27.27sNow %u / Was %u","Sub-board Index", i, cfg.sub[i]->subnum);
+						opt[n][0]=0;
+						uifc.helpbuf=
+							"`Sub-board Advanced Options:`\n"
+							"\n"
+							"This menu contains options for the selected sub-board that are advanced\n"
+							"in nature.\n"
+						;
+						n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&adv_dflt,0
+							,"Advanced Options",opt);
+						if(n==-1)
+							break;
+						switch(n) {
+							case 0:
+								uifc.helpbuf=
+									"`Sub-board QWK Conference Number:`\n"
+									"\n"
+									"If you wish to have the QWK conference number for this sub-board\n"
+									"automatically generated by Synchronet (based on the group number\n"
+									"and sub-board number for the user), set this option to `Dynamic`.\n"
+									"\n"
+									"If you wish to have the same QWK conference number for this sub-board\n"
+									"regardless of which user access it, set this option to `Static`\n"
+									"by entering the conference number you want to use.\n"
+								;
+								if(cfg.sub[i]->qwkconf)
+									sprintf(str,"%u",cfg.sub[i]->qwkconf);
 								else
-									sprintf(str,"%ssubs/",cfg.data_dir);
-								sprintf(str2,"%s%s.*"
-									,cfg.grp[cfg.sub[i]->grp]->code_prefix
-									,cfg.sub[i]->code_suffix);
-								strlwr(str2);
-								delfiles(str,str2); 
-							}
+									str[0]=0;
+								if(uifc.input(WIN_MID|WIN_SAV,0,17
+									,"QWK Conference Number (0=Dynamic)"
+									,str,5,K_EDIT|K_NUMBER)>=0)
+									cfg.sub[i]->qwkconf=atoi(str);
+								break;
+							case 1:
+								n=0;
+								strcpy(opt[0],"Hyper Allocation");
+								strcpy(opt[1],"Fast Allocation");
+								strcpy(opt[2],"Self-packing");
+								opt[3][0]=0;
+								uifc.helpbuf=
+									"`Self-Packing` is the slowest storage method because it conserves disk\n"
+									"  space as it imports messages by using deleted message header and data\n"
+									"  blocks for new messages automatically. If you use this storage method,\n"
+									"  you will not need to run `smbutil p` on this message base unless you\n"
+									"  accumilate a large number of deleted message blocks and wish to free\n"
+									"  that disk space. You can switch from self-packing to fast allocation\n"
+									"  storage method and back again as you wish.\n"
+									"`Fast Allocation` is faster than self-packing because it does not search\n"
+									"  for deleted message blocks for new messages. It automatically places\n"
+									"  all new message blocks at the end of the header and data files. If you\n"
+									"  use this storage method, you will need to run `smbutil p` on this\n"
+									"  message base periodically or it will continually use up disk space.\n"
+									"`Hyper Allocation` is the fastest storage method because it does not\n"
+									"  maintain allocation files at all. Once a message base is setup to use\n"
+									"  this storage method, it should not be changed without first deleting\n"
+									"  the message base data files in your `data/subs` directory for this\n"
+									"  sub-board. You must use `smbutil p` as with the fast allocation method.\n"
+								;
+								n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0
+									,"Storage Method",opt);
+								if(n==-1)
+									break;
+								if(!n && !(cfg.sub[i]->misc&SUB_HYPER)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_HYPER;
+									cfg.sub[i]->misc&=~SUB_FAST;
+									cfg.sub[i]->misc|=SUB_HDRMOD;
+									break; 
+								}
+								if(!n)
+									break;
+								if(cfg.sub[i]->misc&SUB_HYPER) {	/* Switching from hyper */
+									strcpy(opt[0],"Yes");
+									strcpy(opt[1],"No, I want to use Hyper Allocation");
+									opt[2][0]=0;
+									m=0;
+									if(uifc.list(WIN_SAV|WIN_MID,0,0,0,&m,0
+										,"Delete all messages in this sub-board?",opt)!=0)
+										break;
+									if(cfg.sub[i]->data_dir[0])
+										sprintf(str,"%s",cfg.sub[i]->data_dir);
+									else
+										sprintf(str,"%ssubs/",cfg.data_dir);
+									sprintf(str2,"%s%s.*"
+										,cfg.grp[cfg.sub[i]->grp]->code_prefix
+										,cfg.sub[i]->code_suffix);
+									strlwr(str2);
+									delfiles(str,str2); 
+								}
 
-							if(cfg.sub[i]->misc&SUB_HYPER)
-								cfg.sub[i]->misc|=SUB_HDRMOD;
-							if(n==1 && !(cfg.sub[i]->misc&SUB_FAST)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc|=SUB_FAST;
-								cfg.sub[i]->misc&=~SUB_HYPER;
+								if(cfg.sub[i]->misc&SUB_HYPER)
+									cfg.sub[i]->misc|=SUB_HDRMOD;
+								if(n==1 && !(cfg.sub[i]->misc&SUB_FAST)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc|=SUB_FAST;
+									cfg.sub[i]->misc&=~SUB_HYPER;
+									break; 
+								}
+								if(n==2 && cfg.sub[i]->misc&(SUB_FAST|SUB_HYPER)) {
+									uifc.changes = TRUE;
+									cfg.sub[i]->misc&=~(SUB_FAST|SUB_HYPER);
+									break; 
+								}
+								break;
+							case 2:
+								uifc.helpbuf=
+									"`Sub-board Storage Directory:`\n"
+									"\n"
+									"Use this if you wish to place the data directory for this sub-board on\n"
+									"another drive or in another directory besides the default setting.\n"
+								;
+								uifc.input(WIN_MID|WIN_SAV,0,17,"Directory"
+									,cfg.sub[i]->data_dir,sizeof(cfg.sub[i]->data_dir)-1,K_EDIT);
 								break; 
-							}
-							if(n==2 && cfg.sub[i]->misc&(SUB_FAST|SUB_HYPER)) {
-								uifc.changes = TRUE;
-								cfg.sub[i]->misc&=~(SUB_FAST|SUB_HYPER);
+							case 3:
+								uifc.helpbuf=
+									"`Sub-board Semaphore File:`\n"
+									"\n"
+									"This is a filename that will be created as a semaphore (signal) to an\n"
+									"external program or event whenever a message is posted in this sub-board.\n"
+								;
+								uifc.input(WIN_MID|WIN_SAV,0,17,"Semaphore File"
+									,cfg.sub[i]->post_sem,sizeof(cfg.sub[i]->post_sem)-1,K_EDIT);
 								break; 
-							}
-							break;
-						case 2:
-							uifc.helpbuf=
-								"`Sub-board Storage Directory:`\n"
-								"\n"
-								"Use this if you wish to place the data directory for this sub-board on\n"
-								"another drive or in another directory besides the default setting.\n"
-							;
-							uifc.input(WIN_MID|WIN_SAV,0,17,"Directory"
-								,cfg.sub[i]->data_dir,sizeof(cfg.sub[i]->data_dir)-1,K_EDIT);
-							break; 
-						case 3:
-							uifc.helpbuf=
-								"`Sub-board Semaphore File:`\n"
-								"\n"
-								"This is a filename that will be created as a semaphore (signal) to an\n"
-								"external program or event whenever a message is posted in this sub-board.\n"
-							;
-							uifc.input(WIN_MID|WIN_SAV,0,17,"Semaphore File"
-								,cfg.sub[i]->post_sem,sizeof(cfg.sub[i]->post_sem)-1,K_EDIT);
-							break; 
-						case 4:
-							uifc.helpbuf=
-								"`Sub-board Pointer Index:`\n"
-								"\n"
-								"You should normally have no reason to modify this value. If you get\n"
-								"crossed-up or duplicate ptridx values, then you may want to adjust\n"
-								"this value, but do so with great care and trepidation.\n"
-							;
-							sprintf(str,"%u",cfg.sub[i]->ptridx);
-							if(uifc.input(WIN_MID|WIN_SAV,0,17
-								,"Pointer File Index (Danger!)"
-								,str,5,K_EDIT|K_NUMBER)>=0)
-								cfg.sub[i]->ptridx=atoi(str);
-							break;
-						case 5:
-							uifc.msg("This value cannot be changed.");
-							break;
+							case 4:
+								uifc.helpbuf=
+									"`Sub-board Pointer Index:`\n"
+									"\n"
+									"You should normally have no reason to modify this value. If you get\n"
+									"crossed-up or duplicate ptridx values, then you may want to adjust\n"
+									"this value, but do so with great care and trepidation.\n"
+								;
+								sprintf(str,"%u",cfg.sub[i]->ptridx);
+								if(uifc.input(WIN_MID|WIN_SAV,0,17
+									,"Pointer File Index (Danger!)"
+									,str,5,K_EDIT|K_NUMBER)>=0)
+									cfg.sub[i]->ptridx=atoi(str);
+								break;
+							case 5:
+								uifc.msg("This value cannot be changed.");
+								break;
 
-					} 
-				}
-				break;
+						} 
+					}
+					break;
 			} 
 		} 
 	}
diff --git a/src/sbbs3/scfg/scfgsys.c b/src/sbbs3/scfg/scfgsys.c
index f3b5f808f8d7d1979cc46a7d3266c0168f09f0f3..59a825cadaf6227e756c982d151e26bb4300bf86 100644
--- a/src/sbbs3/scfg/scfgsys.c
+++ b/src/sbbs3/scfg/scfgsys.c
@@ -76,2044 +76,2043 @@ void sys_cfg(void)
 	char str[81],done=0;
 	int i,j,k,dflt,bar;
 
-while(1) {
-	i=0;
-	sprintf(opt[i++],"%-33.33s%s","BBS Name",cfg.sys_name);
-	sprintf(opt[i++],"%-33.33s%s","Location",cfg.sys_location);
-	sprintf(opt[i++],"%-33.33s%s %s","Local Time Zone"
-		,smb_zonestr(cfg.sys_timezone,NULL)
-		,SMB_TZ_HAS_DST(cfg.sys_timezone) && cfg.sys_misc&SM_AUTO_DST ? "(Auto-DST)" : "");
-	sprintf(opt[i++],"%-33.33s%s","Operator",cfg.sys_op);
-	sprintf(opt[i++],"%-33.33s%s","Password","**********");
+	while(1) {
+		i=0;
+		sprintf(opt[i++],"%-33.33s%s","BBS Name",cfg.sys_name);
+		sprintf(opt[i++],"%-33.33s%s","Location",cfg.sys_location);
+		sprintf(opt[i++],"%-33.33s%s %s","Local Time Zone"
+			,smb_zonestr(cfg.sys_timezone,NULL)
+			,SMB_TZ_HAS_DST(cfg.sys_timezone) && cfg.sys_misc&SM_AUTO_DST ? "(Auto-DST)" : "");
+		sprintf(opt[i++],"%-33.33s%s","Operator",cfg.sys_op);
+		sprintf(opt[i++],"%-33.33s%s","Password","**********");
 
-	sprintf(str,"%s Password"
-		,cfg.sys_misc&SM_PWEDIT && cfg.sys_pwdays ? "Users Must Change"
-		: cfg.sys_pwdays ? "Users Get New Random" : "Users Can Change");
-	if(cfg.sys_pwdays)
-		sprintf(tmp,"Every %u Days",cfg.sys_pwdays);
-	else if(cfg.sys_misc&SM_PWEDIT)
-		strcpy(tmp,"Yes");
-	else
-		strcpy(tmp,"No");
-	sprintf(opt[i++],"%-33.33s%s",str,tmp);
+		sprintf(str,"%s Password"
+			,cfg.sys_misc&SM_PWEDIT && cfg.sys_pwdays ? "Users Must Change"
+			: cfg.sys_pwdays ? "Users Get New Random" : "Users Can Change");
+		if(cfg.sys_pwdays)
+			sprintf(tmp,"Every %u Days",cfg.sys_pwdays);
+		else if(cfg.sys_misc&SM_PWEDIT)
+			strcpy(tmp,"Yes");
+		else
+			strcpy(tmp,"No");
+		sprintf(opt[i++],"%-33.33s%s",str,tmp);
 
-	sprintf(opt[i++],"%-33.33s%u","Days to Preserve Deleted Users"
-		,cfg.sys_deldays);
-	sprintf(opt[i++],"%-33.33s%s","Maximum Days of Inactivity"
-		,cfg.sys_autodel ? ultoa(cfg.sys_autodel,tmp,10) : "Unlimited");
-    sprintf(opt[i++],"%-33.33s%s","New User Password",cfg.new_pass);
+		sprintf(opt[i++],"%-33.33s%u","Days to Preserve Deleted Users"
+			,cfg.sys_deldays);
+		sprintf(opt[i++],"%-33.33s%s","Maximum Days of Inactivity"
+			,cfg.sys_autodel ? ultoa(cfg.sys_autodel,tmp,10) : "Unlimited");
+		sprintf(opt[i++],"%-33.33s%s","New User Password",cfg.new_pass);
 
-	strcpy(opt[i++],"Toggle Options...");
-	strcpy(opt[i++],"New User Values...");
-	strcpy(opt[i++],"Advanced Options...");
-	strcpy(opt[i++],"Loadable Modules...");
-	strcpy(opt[i++],"Security Level Values...");
-	strcpy(opt[i++],"Expired Account Values...");
-	strcpy(opt[i++],"Quick-Validation Values...");
-	opt[i][0]=0;
-	uifc.helpbuf=
-		"`System Configuration:`\n"
-		"\n"
-		"This menu contains options and sub-menus of options that affect the\n"
-		"entire BBS system and the Synchronet Terminal Server in particular.\n"
-	;
-	switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&sys_dflt,0
-		,"System Configuration",opt)) {
-		case -1:
-			i=save_changes(WIN_MID);
-			if(i==-1)
+		strcpy(opt[i++],"Toggle Options...");
+		strcpy(opt[i++],"New User Values...");
+		strcpy(opt[i++],"Advanced Options...");
+		strcpy(opt[i++],"Loadable Modules...");
+		strcpy(opt[i++],"Security Level Values...");
+		strcpy(opt[i++],"Expired Account Values...");
+		strcpy(opt[i++],"Quick-Validation Values...");
+		opt[i][0]=0;
+		uifc.helpbuf=
+			"`System Configuration:`\n"
+			"\n"
+			"This menu contains options and sub-menus of options that affect the\n"
+			"entire BBS system and the Synchronet Terminal Server in particular.\n"
+		;
+		switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&sys_dflt,0
+			,"System Configuration",opt)) {
+			case -1:
+				i=save_changes(WIN_MID);
+				if(i==-1)
+					break;
+				if(!i) {
+					cfg.new_install=new_install;
+					write_main_cfg(&cfg,backup_level);
+					refresh_cfg(&cfg);
+				}
+				return;
+			case 0:
+				uifc.helpbuf=
+					"`BBS Name:`\n"
+					"\n"
+					"This is the name of the BBS.\n"
+				;
+				uifc.input(WIN_MID,0,0,"BBS Name",cfg.sys_name,sizeof(cfg.sys_name)-1,K_EDIT);
 				break;
-			if(!i) {
-				cfg.new_install=new_install;
-				write_main_cfg(&cfg,backup_level);
-                refresh_cfg(&cfg);
-            }
-			return;
-		case 0:
-			uifc.helpbuf=
-				"`BBS Name:`\n"
-				"\n"
-				"This is the name of the BBS.\n"
-			;
-			uifc.input(WIN_MID,0,0,"BBS Name",cfg.sys_name,sizeof(cfg.sys_name)-1,K_EDIT);
-			break;
-		case 1:
-			uifc.helpbuf=
-				"`System Location:`\n"
-				"\n"
-				"This is the location of the BBS. The format is flexible, but it is\n"
-				"suggested you use the `City, State` format for clarity.\n"
-			;
-			uifc.input(WIN_MID,0,0,"Location",cfg.sys_location,sizeof(cfg.sys_location)-1,K_EDIT);
-            break;
-		case 2:
-			strcpy(opt[0],"Yes");
-			strcpy(opt[1],"No");
-			opt[2][0]=0;
-			i=0;
-			uifc.helpbuf=
-				"`United States Time Zone:`\n"
-				"\n"
-				"If your local time zone is the United States, select `Yes`.\n"
-			;
-
-			i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-				,"United States Time Zone",opt);
-			if(i==-1)
+			case 1:
+				uifc.helpbuf=
+					"`System Location:`\n"
+					"\n"
+					"This is the location of the BBS. The format is flexible, but it is\n"
+					"suggested you use the `City, State` format for clarity.\n"
+				;
+				uifc.input(WIN_MID,0,0,"Location",cfg.sys_location,sizeof(cfg.sys_location)-1,K_EDIT);
 				break;
-			if(i==0) {
-				strcpy(opt[i++],"Atlantic");
-				strcpy(opt[i++],"Eastern");
-				strcpy(opt[i++],"Central");
-				strcpy(opt[i++],"Mountain");
-				strcpy(opt[i++],"Pacific");
-				strcpy(opt[i++],"Yukon");
-				strcpy(opt[i++],"Hawaii/Alaska");
-				strcpy(opt[i++],"Bering");
-				opt[i][0]=0;
+			case 2:
+				strcpy(opt[0],"Yes");
+				strcpy(opt[1],"No");
+				opt[2][0]=0;
 				i=0;
 				uifc.helpbuf=
-					"`U.S. Time Zone:`\n"
+					"`United States Time Zone:`\n"
 					"\n"
-					"Choose the region which most closely reflects your local U.S. time zone.\n"
+					"If your local time zone is the United States, select `Yes`.\n"
 				;
+
 				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-					,"U.S. Time Zone",opt);
+					,"United States Time Zone",opt);
 				if(i==-1)
 					break;
-				uifc.changes=1;
-				switch(i) {
-					case 0:
-						cfg.sys_timezone=AST;
-						break;
-					case 1:
-						cfg.sys_timezone=EST;
-						break;
-					case 2:
-						cfg.sys_timezone=CST;
-                        break;
-					case 3:
-						cfg.sys_timezone=MST;
-                        break;
-					case 4:
-						cfg.sys_timezone=PST;
-                        break;
-					case 5:
-						cfg.sys_timezone=YST;
-                        break;
-					case 6:
-						cfg.sys_timezone=HST;
-                        break;
-					case 7:
-						cfg.sys_timezone=BST;
-						break; 
-				}
-				configure_dst();
-				break; 
-			}
-			i=0;
-			strcpy(opt[i++],"Midway");
-			strcpy(opt[i++],"Vancouver");
-			strcpy(opt[i++],"Edmonton");
-			strcpy(opt[i++],"Winnipeg");
-			strcpy(opt[i++],"Bogota");
-			strcpy(opt[i++],"Caracas");
-			strcpy(opt[i++],"Rio de Janeiro");
-			strcpy(opt[i++],"Fernando de Noronha");
-			strcpy(opt[i++],"Azores");
-			strcpy(opt[i++],"Western Europe (WET)");
-			strcpy(opt[i++],"Central Europe (CET)");
-			strcpy(opt[i++],"Eastern Europe (EET)");
-			strcpy(opt[i++],"Moscow");
-			strcpy(opt[i++],"Dubai");
-			strcpy(opt[i++],"Kabul");
-			strcpy(opt[i++],"Karachi");
-			strcpy(opt[i++],"Bombay");
-			strcpy(opt[i++],"Kathmandu");
-			strcpy(opt[i++],"Dhaka");
-			strcpy(opt[i++],"Bangkok");
-			strcpy(opt[i++],"Hong Kong");
-			strcpy(opt[i++],"Tokyo");
-			strcpy(opt[i++],"Sydney");
-			strcpy(opt[i++],"Noumea");
-			strcpy(opt[i++],"Wellington");
-			strcpy(opt[i++],"Other...");
-			opt[i][0]=0;
-			i=0;
-			uifc.helpbuf=
-				"`Non-U.S. Time Zone:`\n"
-				"\n"
-				"Choose the region which most closely reflects your local time zone.\n"
-				"\n"
-				"Choose `Other...` if a region representing your local time zone is\n"
-				"not listed (you will be able to set the UTC offset manually)."
-			;
-			i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-				,"None-U.S. Time Zone",opt);
-			if(i==-1)
-				break;
-			uifc.changes=1;
-			switch(i) {
-				case 0:
-					cfg.sys_timezone=MID;
-					break;
-				case 1:
-					cfg.sys_timezone=VAN;
-					break;
-				case 2:
-					cfg.sys_timezone=EDM;
-					break;
-				case 3:
-					cfg.sys_timezone=WIN;
-					break;
-				case 4:
-					cfg.sys_timezone=BOG;
-					break;
-				case 5:
-					cfg.sys_timezone=CAR;
-					break;
-				case 6:
-					cfg.sys_timezone=RIO;
-					break;
-				case 7:
-					cfg.sys_timezone=FER;
-					break;
-				case 8:
-					cfg.sys_timezone=AZO;
-                    break;
-				case 9:
-					cfg.sys_timezone=WET;
-					configure_dst();
-                    break;
-				case 10:
-					cfg.sys_timezone=CET;
-					configure_dst();
-                    break;
-				case 11:
-					cfg.sys_timezone=EET;
-					configure_dst();
-                    break;
-				case 12:
-					cfg.sys_timezone=MOS;
-                    break;
-				case 13:
-					cfg.sys_timezone=DUB;
-                    break;
-				case 14:
-					cfg.sys_timezone=KAB;
-                    break;
-				case 15:
-					cfg.sys_timezone=KAR;
-                    break;
-				case 16:
-					cfg.sys_timezone=BOM;
-                    break;
-				case 17:
-					cfg.sys_timezone=KAT;
-                    break;
-				case 18:
-					cfg.sys_timezone=DHA;
-                    break;
-				case 19:
-					cfg.sys_timezone=BAN;
-                    break;
-				case 20:
-					cfg.sys_timezone=HON;
-                    break;
-				case 21:
-					cfg.sys_timezone=TOK;
-                    break;
-				case 22:
-					cfg.sys_timezone=SYD;
-                    break;
-				case 23:
-					cfg.sys_timezone=NOU;
-                    break;
-				case 24:
-					cfg.sys_timezone=WEL;
-                    break;
-				default:
-					if(cfg.sys_timezone>720 || cfg.sys_timezone<-720)
-						cfg.sys_timezone=0;
-					if(cfg.sys_timezone==0)
-						str[0]=0;
-					else
-						sprintf(str,"%02d:%02d"
-							,cfg.sys_timezone/60,cfg.sys_timezone<0
-							? (-cfg.sys_timezone)%60 : cfg.sys_timezone%60);
+				if(i==0) {
+					strcpy(opt[i++],"Atlantic");
+					strcpy(opt[i++],"Eastern");
+					strcpy(opt[i++],"Central");
+					strcpy(opt[i++],"Mountain");
+					strcpy(opt[i++],"Pacific");
+					strcpy(opt[i++],"Yukon");
+					strcpy(opt[i++],"Hawaii/Alaska");
+					strcpy(opt[i++],"Bering");
+					opt[i][0]=0;
+					i=0;
 					uifc.helpbuf=
-						"`Time Zone Offset:`\n"
+						"`U.S. Time Zone:`\n"
 						"\n"
-						"Enter your local time zone offset from Universal Time (UTC/GMT)\n"
-						"in `HH:MM` format.\n"
+						"Choose the region which most closely reflects your local U.S. time zone.\n"
 					;
-					uifc.input(WIN_MID|WIN_SAV,0,0
-						,"Time (HH:MM) East (+) or West (-) of Universal "
-							"Time"
-						,str,6,K_EDIT|K_UPPER);
-					cfg.sys_timezone=atoi(str)*60;
-					char *p=strchr(str,':');
-					if(p) {
-						if(cfg.sys_timezone<0)
-							cfg.sys_timezone-=atoi(p+1);
-						else
-							cfg.sys_timezone+=atoi(p+1); 
-					}
-                    break;
-			}
-            break;
-		case 3:
-			uifc.helpbuf=
-				"`System Operator:`\n"
-				"\n"
-				"This is the name or alias of the system operator. This does not have to\n"
-				"be the same as user #1. This field is used for informational purposes\n"
-				"only.\n"
-			;
-			uifc.input(WIN_MID,0,0,"System Operator",cfg.sys_op,sizeof(cfg.sys_op)-1,K_EDIT);
-			break;
-		case 4:
-			uifc.helpbuf=
-				"`System Password:`\n"
-				"\n"
-				"This is an extra security password required for sysop logon and certain\n"
-				"sysop functions. This password should be something not easily guessed\n"
-				"and should be kept absolutely confidential. This password must be\n"
-				"entered at the Terminal Server `SY:` prompt.\n"
-			;
-			uifc.input(WIN_MID,0,0,"System Password",cfg.sys_pass,sizeof(cfg.sys_pass)-1,K_EDIT|K_UPPER);
-			break;
-		case 5:
-			strcpy(opt[0],"Yes");
-			strcpy(opt[1],"No");
-			opt[2][0]=0;
-			i=1;
-			uifc.helpbuf=
-				"`Allow Users to Change Their Password:`\n"
-				"\n"
-				"If you want the users of your system to have the option of changing\n"
-				"their password to a string of their choice, set this option to `Yes`.\n"
-				"For the highest level of security, set this option to `No.`\n"
-			;
-			i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-				,"Allow Users to Change Their Password",opt);
-			if(!i && !(cfg.sys_misc&SM_PWEDIT)) {
-				cfg.sys_misc|=SM_PWEDIT;
-				uifc.changes=1; 
-			}
-			else if(i==1 && cfg.sys_misc&SM_PWEDIT) {
-                cfg.sys_misc&=~SM_PWEDIT;
-                uifc.changes=1; 
-			}
-			i=0;
-			uifc.helpbuf=
-				"`Force Periodic Password uifc.changes:`\n"
-				"\n"
-				"If you want your users to be forced to change their passwords\n"
-				"periodically, select `Yes`.\n"
-			;
-			i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-				,"Force Periodic Password Changes",opt);
-			if(!i) {
-				ultoa(cfg.sys_pwdays,str,10);
-			uifc.helpbuf=
-				"`Maximum Days Between Password uifc.changes:`\n"
-				"\n"
-				"Enter the maximum number of days allowed between password uifc.changes.\n"
-				"If a user has not voluntarily changed his or her password in this\n"
-				"many days, he or she will be forced to change their password upon\n"
-				"logon.\n"
-			;
-				uifc.input(WIN_MID,0,0,"Maximum Days Between Password Changes"
-					,str,5,K_NUMBER|K_EDIT);
-				cfg.sys_pwdays=atoi(str); 
-			}
-			else if(i==1 && cfg.sys_pwdays) {
-				cfg.sys_pwdays=0;
-				uifc.changes=1; 
-			}
-			
-			break;
-		case 6:
-			sprintf(str,"%u",cfg.sys_deldays);
-			uifc.helpbuf=
-				"`Days Since Last Logon to Preserve Deleted Users:`\n"
-				"\n"
-				"Deleted user slots can be `undeleted` until the slot is written over\n"
-				"by a new user. If you want deleted user slots to be preserved for period\n"
-				"of time since their last logon, set this value to the number of days to\n"
-				"keep new users from taking over a deleted user's slot.\n"
-			;
-			uifc.input(WIN_MID,0,0,"Days Since Last Logon to Preserve Deleted Users"
-				,str,5,K_EDIT|K_NUMBER);
-			cfg.sys_deldays=atoi(str);
-			break;
-		case 7:
-			sprintf(str,"%u",cfg.sys_autodel);
-			uifc.helpbuf=
-				"`Maximum Days of Inactivity Before Auto-Deletion:`\n"
-				"\n"
-				"If you want users that haven't logged on in certain period of time to\n"
-				"be automatically deleted, set this value to the maximum number of days\n"
-				"of inactivity before the user is deleted. Setting this value to `0`\n"
-				"disables this feature.\n"
-				"\n"
-				"Users with the `P` exemption will not be deleted due to inactivity.\n"
-			;
-			uifc.input(WIN_MID,0,0,"Maximum Days of Inactivity Before Auto-Deletion"
-				,str,5,K_EDIT|K_NUMBER);
-			cfg.sys_autodel=atoi(str);
-            break;
-		case 8:
-			uifc.helpbuf=
-				"`New User Password:`\n"
-				"\n"
-				"If you want callers to only be able to logon as `New` if they know a\n"
-				"certain password, enter that password here. If you want any caller to\n"
-				"be able to logon as New, leave this option blank.\n"
-			;
-			uifc.input(WIN_MID,0,0,"New User Password",cfg.new_pass,sizeof(cfg.new_pass)-1
-				,K_EDIT|K_UPPER);
-			break;
-		case 9:    /* Toggle Options */
-            done=0;
-            while(!done) {
-                i=0;
-				sprintf(opt[i++],"%-33.33s%s","Allow Aliases"
-					,cfg.uq&UQ_ALIASES ? "Yes" : "No");
-				sprintf(opt[i++],"%-33.33s%s","Allow Time Banking"
-					,cfg.sys_misc&SM_TIMEBANK ? "Yes" : "No");
-				sprintf(opt[i++],"%-33.33s%s","Allow Credit Conversions"
-					,cfg.sys_misc&SM_NOCDTCVT ? "No" : "Yes");
-				sprintf(opt[i++],"%-33.33s%s","Allow Sysop Logins"
-					,cfg.sys_misc&SM_R_SYSOP ? "Yes" : "No");
-				sprintf(opt[i++],"%-33.33s%s","Display/Log Passwords Locally"
-					,cfg.sys_misc&SM_ECHO_PW ? "Yes" : "No");
-				sprintf(opt[i++],"%-33.33s%s","Short Sysop Page"
-					,cfg.sys_misc&SM_SHRTPAGE ? "Yes" : "No");
-                sprintf(opt[i++],"%-33.33s%s","Include Sysop in Statistics"
-                    ,cfg.sys_misc&SM_SYSSTAT ? "Yes" : "No");
-                sprintf(opt[i++],"%-33.33s%s","Closed to New Users"
-                    ,cfg.sys_misc&SM_CLOSED ? "Yes" : "No");
-                sprintf(opt[i++],"%-33.33s%s","Use Location in User Lists"
-					,cfg.sys_misc&SM_LISTLOC ? "Yes" : "No");
-				sprintf(opt[i++],"%-33.33s%s","Military (24 hour) Time Format"
-					,cfg.sys_misc&SM_MILITARY ? "Yes" : "No");
-				sprintf(opt[i++],"%-33.33s%s","European Date Format (DD/MM/YY)"
-					,cfg.sys_misc&SM_EURODATE ? "Yes" : "No");
-				sprintf(opt[i++],"%-33.33s%s","User Expires When Out-of-time"
-					,cfg.sys_misc&SM_TIME_EXP ? "Yes" : "No");
-				sprintf(opt[i++],"%-33.33s%s","Display Sys Info During Logon"
-					,cfg.sys_misc&SM_NOSYSINFO ? "No" : "Yes");
-				sprintf(opt[i++],"%-33.33s%s","Display Node List During Logon"
-					,cfg.sys_misc&SM_NONODELIST ? "No" : "Yes");
-				opt[i][0]=0;
-				uifc.helpbuf=
-					"`System Toggle Options:`\n"
-					"\n"
-					"This is a menu of system related options that can be toggled between\n"
-					"two or more states, such as `Yes` and `No`.\n"
-				;
-				switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,41,&tog_dflt,0
-                    ,"Toggle Options",opt)) {
-                    case -1:
-                        done=1;
-                        break;
-					case 0:
-						strcpy(opt[0],"Yes");
-						strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.uq&UQ_ALIASES ? 0:1;
-						uifc.helpbuf=
-							"`Allow Users to Use Aliases:`\n"
-							"\n"
-							"If you want the users of your system to be allowed to be known by a\n"
-							"false name, handle, or alias, set this option to `Yes`. If you want all\n"
-							"users on your system to be known only by their real names, select `No`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Allow Users to Use Aliases",opt);
-						if(!i && !(cfg.uq&UQ_ALIASES)) {
-							cfg.uq|=UQ_ALIASES;
-							uifc.changes=1; 
-						}
-						else if(i==1 && cfg.uq&UQ_ALIASES) {
-							cfg.uq&=~UQ_ALIASES;
-							uifc.changes=1; 
-						}
-						break;
-					case 1:
-						strcpy(opt[0],"Yes");
-						strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_TIMEBANK ? 0:1;
-						uifc.helpbuf=
-							"`Allow Time Banking:`\n"
-							"\n"
-							"If you want the users of your system to be allowed to be deposit\n"
-							"any extra time they may have left during a call into their minute bank,\n"
-							"set this option to `Yes`. If this option is set to `No`, then the only\n"
-							"way a user may get minutes in their minute bank is to purchase them\n"
-							"with credits.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Allow Users to Depost Time in Minute Bank",opt);
-						if(!i && !(cfg.sys_misc&SM_TIMEBANK)) {
-							cfg.sys_misc|=SM_TIMEBANK;
-							uifc.changes=1; 
-						}
-						else if(i==1 && cfg.sys_misc&SM_TIMEBANK) {
-							cfg.sys_misc&=~SM_TIMEBANK;
-							uifc.changes=1; 
-						}
-                        break;
-					case 2:
-						strcpy(opt[0],"Yes");
-						strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_NOCDTCVT ? 1:0;
-						uifc.helpbuf=
-							"`Allow Credits to be Converted into Minutes:`\n"
-							"\n"
-							"If you want the users of your system to be allowed to be convert\n"
-							"any credits they may have into minutes for their minute bank,\n"
-							"set this option to `Yes`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Allow Users to Convert Credits into Minutes"
-							,opt);
-						if(!i && cfg.sys_misc&SM_NOCDTCVT) {
-							cfg.sys_misc&=~SM_NOCDTCVT;
-							uifc.changes=1; 
-						}
-						else if(i==1 && !(cfg.sys_misc&SM_NOCDTCVT)) {
-							cfg.sys_misc|=SM_NOCDTCVT;
-							uifc.changes=1; 
-						}
-                        break;
-					case 3:
-						strcpy(opt[0],"Yes");
-						strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_R_SYSOP ? 0:1;
-						uifc.helpbuf=
-							"`Allow Sysop Logins:`\n"
-							"\n"
-							"If you want to be able to login with sysop access, set this option to `Yes`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Allow Sysop Logins",opt);
-						if(!i && !(cfg.sys_misc&SM_R_SYSOP)) {
-							cfg.sys_misc|=SM_R_SYSOP;
-							uifc.changes=1; 
-						}
-						else if(i==1 && cfg.sys_misc&SM_R_SYSOP) {
-							cfg.sys_misc&=~SM_R_SYSOP;
-							uifc.changes=1; 
-						}
-                        break;
-					case 4:
-						strcpy(opt[0],"Yes");
-						strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_ECHO_PW ? 0:1;
-						uifc.helpbuf=
-							"`Display/Log Passwords Locally:`\n"
-							"\n"
-							"If you want to passwords to be displayed locally and/or logged to disk\n"
-							"(e.g. when there's a failed login attempt), set this option to `Yes`.\n"
-							"\n"
-							"For elevated security, set this option to `No`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Display/Log Passwords Locally",opt);
-						if(!i && !(cfg.sys_misc&SM_ECHO_PW)) {
-							cfg.sys_misc|=SM_ECHO_PW;
-							uifc.changes=1; 
-						}
-						else if(i==1 && cfg.sys_misc&SM_ECHO_PW) {
-							cfg.sys_misc&=~SM_ECHO_PW;
-							uifc.changes=1; 
-						}
-                        break;
-					case 5:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-                        i=cfg.sys_misc&SM_SHRTPAGE ? 0:1;
-						uifc.helpbuf=
-							"`Short Sysop Page:`\n"
-							"\n"
-							"If you would like the sysop page to be a short series of beeps rather\n"
-							"than continuous random tones, set this option to `Yes`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Short Sysop Page"
-							,opt);
-						if(i==1 && cfg.sys_misc&SM_SHRTPAGE) {
-							cfg.sys_misc&=~SM_SHRTPAGE;
-                            uifc.changes=1; 
-						}
-						else if(!i && !(cfg.sys_misc&SM_SHRTPAGE)) {
-							cfg.sys_misc|=SM_SHRTPAGE;
-                            uifc.changes=1; 
-						}
+					i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+						,"U.S. Time Zone",opt);
+					if(i==-1)
 						break;
-					case 6:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-                        i=cfg.sys_misc&SM_SYSSTAT ? 0:1;
-						uifc.helpbuf=
-							"`Include Sysop Activity in System Statistics:`\n"
-							"\n"
-							"If you want sysops to be included in the statistical data of the BBS,\n"
-							"set this option to `Yes`. The suggested setting for this option is\n"
-							"`No` so that statistical data will only reflect user usage and not\n"
-							"include sysop maintenance activity.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Include Sysop Activity in System Statistics"
-							,opt);
-                        if(!i && !(cfg.sys_misc&SM_SYSSTAT)) {
-                            cfg.sys_misc|=SM_SYSSTAT;
-                            uifc.changes=1; 
-						}
-                        else if(i==1 && cfg.sys_misc&SM_SYSSTAT) {
-                            cfg.sys_misc&=~SM_SYSSTAT;
-                            uifc.changes=1; 
-						}
-                        break;
-					case 7:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-                        i=cfg.sys_misc&SM_CLOSED ? 0:1;
-						uifc.helpbuf=
-							"`Closed to New Users:`\n"
-							"\n"
-							"If you want callers to be able to logon as `New`, set this option to `No`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Closed to New Users",opt);
-                        if(!i && !(cfg.sys_misc&SM_CLOSED)) {
-                            cfg.sys_misc|=SM_CLOSED;
-                            uifc.changes=1; 
-						}
-                        else if(i==1 && cfg.sys_misc&SM_CLOSED) {
-                            cfg.sys_misc&=~SM_CLOSED;
-                            uifc.changes=1; 
-						}
-                        break;
-					case 8:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-                        i=cfg.sys_misc&SM_LISTLOC ? 0:1;
-						uifc.helpbuf=
-							"`User Location in User Lists:`\n"
-							"\n"
-							"If you want user locations (city, state) displayed in the user lists,\n"
-							"set this option to `Yes`. If this option is set to `No`, the user notes\n"
-							"(if they exist) are displayed in the user lists.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-                            ,"User Location (Instead of Note) in User Lists"
-                            ,opt);
-						if(!i && !(cfg.sys_misc&SM_LISTLOC)) {
-							cfg.sys_misc|=SM_LISTLOC;
-                            uifc.changes=1; 
-						}
-						else if(i==1 && cfg.sys_misc&SM_LISTLOC) {
-							cfg.sys_misc&=~SM_LISTLOC;
-                            uifc.changes=1; 
-						}
-                        break;
-					case 9:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_MILITARY ? 0:1;
-						uifc.helpbuf=
-							"`Military:`\n"
-							"\n"
-							"If you would like the time-of-day to be displayed and entered in 24 hour\n"
-							"format always, set this option to `Yes`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Use Military Time Format",opt);
-						if(!i && !(cfg.sys_misc&SM_MILITARY)) {
-							cfg.sys_misc|=SM_MILITARY;
-                            uifc.changes=1; 
-						}
-						else if(i==1 && cfg.sys_misc&SM_MILITARY) {
-							cfg.sys_misc&=~SM_MILITARY;
-                            uifc.changes=1; 
-						}
-                        break;
-					case 10:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_EURODATE ? 0:1;
-						uifc.helpbuf=
-							"`European Date Format:`\n"
-							"\n"
-							"If you would like dates to be displayed and entered in `DD/MM/YY` format\n"
-							"instead of `MM/DD/YY` format, set this option to `Yes`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"European Date Format",opt);
-						if(!i && !(cfg.sys_misc&SM_EURODATE)) {
-							cfg.sys_misc|=SM_EURODATE;
-                            uifc.changes=1; 
-						}
-						else if(i==1 && cfg.sys_misc&SM_EURODATE) {
-							cfg.sys_misc&=~SM_EURODATE;
-                            uifc.changes=1; 
-						}
-                        break;
-					case 11:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_TIME_EXP ? 0:1;
-						uifc.helpbuf=
-							"`User Expires When Out-of-time:`\n"
-							"\n"
-							"If you want users to be set to `Expired User Values` if they run out of\n"
-							"time online, then set this option to `Yes`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"User Expires When Out-of-time",opt);
-						if(!i && !(cfg.sys_misc&SM_TIME_EXP)) {
-							cfg.sys_misc|=SM_TIME_EXP;
-                            uifc.changes=1; 
-						}
-						else if(i==1 && cfg.sys_misc&SM_TIME_EXP) {
-							cfg.sys_misc&=~SM_TIME_EXP;
-                            uifc.changes=1; 
-						}
-                        break;
-					case 12:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_NOSYSINFO ? 1:0;
-						uifc.helpbuf=
-							"`Display System Information During Logon:`\n"
-							"\n"
-							"If you want system information displayed during logon, set this option\n"
-							"to `Yes`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Display System Information During Logon",opt);
-						if(!i && cfg.sys_misc&SM_NOSYSINFO) {
-							cfg.sys_misc&=~SM_NOSYSINFO;
-                            uifc.changes=1; 
-						}
-						else if(i==1 && !(cfg.sys_misc&SM_NOSYSINFO)) {
-							cfg.sys_misc|=SM_NOSYSINFO;
-                            uifc.changes=1; 
-						}
-                        break;
-					case 13:
-                        strcpy(opt[0],"Yes");
-                        strcpy(opt[1],"No");
-						opt[2][0]=0;
-						i=cfg.sys_misc&SM_NONODELIST ? 1:0;
-						uifc.helpbuf=
-							"`Display Active Node List During Logon:`\n"
-							"\n"
-							"If you want the active nodes displayed during logon, set this option\n"
-							"to `Yes`.\n"
-						;
-						i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-							,"Display Active Node List During Logon",opt);
-						if(!i && cfg.sys_misc&SM_NONODELIST) {
-							cfg.sys_misc&=~SM_NONODELIST;
-                            uifc.changes=1; 
-						}
-						else if(i==1 && !(cfg.sys_misc&SM_NONODELIST)) {
-							cfg.sys_misc|=SM_NONODELIST;
-                            uifc.changes=1; 
-						}
-                        break;
-					} 
+					uifc.changes=1;
+					switch(i) {
+						case 0:
+							cfg.sys_timezone=AST;
+							break;
+						case 1:
+							cfg.sys_timezone=EST;
+							break;
+						case 2:
+							cfg.sys_timezone=CST;
+							break;
+						case 3:
+							cfg.sys_timezone=MST;
+							break;
+						case 4:
+							cfg.sys_timezone=PST;
+							break;
+						case 5:
+							cfg.sys_timezone=YST;
+							break;
+						case 6:
+							cfg.sys_timezone=HST;
+							break;
+						case 7:
+							cfg.sys_timezone=BST;
+							break; 
+					}
+					configure_dst();
+					break; 
 				}
-            break;
-		case 10:    /* New User Values */
-			done=0;
-			while(!done) {
 				i=0;
-				sprintf(opt[i++],"%-27.27s%u","Level",cfg.new_level);
-				sprintf(opt[i++],"%-27.27s%s","Flag Set #1"
-					,ltoaf(cfg.new_flags1,str));
-				sprintf(opt[i++],"%-27.27s%s","Flag Set #2"
-					,ltoaf(cfg.new_flags2,str));
-				sprintf(opt[i++],"%-27.27s%s","Flag Set #3"
-					,ltoaf(cfg.new_flags3,str));
-				sprintf(opt[i++],"%-27.27s%s","Flag Set #4"
-					,ltoaf(cfg.new_flags4,str));
-				sprintf(opt[i++],"%-27.27s%s","Exemptions"
-					,ltoaf(cfg.new_exempt,str));
-				sprintf(opt[i++],"%-27.27s%s","Restrictions"
-					,ltoaf(cfg.new_rest,str));
-				sprintf(opt[i++],"%-27.27s%s","Expiration Days"
-					,ultoa(cfg.new_expire,str,10));
-
-				ultoac(cfg.new_cdt,str);
-				sprintf(opt[i++],"%-27.27s%s","Credits",str);
-				ultoac(cfg.new_min,str);
-				sprintf(opt[i++],"%-27.27s%s","Minutes",str);
-				sprintf(opt[i++],"%-27.27s%s","Editor"
-					,cfg.new_xedit);
-				sprintf(opt[i++],"%-27.27s%s","Command Shell"
-					,cfg.shell[cfg.new_shell]->code);
-				if(cfg.new_prot!=' ')
-                    sprintf(str,"%c",cfg.new_prot);
-                else
-                    strcpy(str,"None");
-				sprintf(opt[i++],"%-27.27s%s","Download Protocol",str);
-				sprintf(opt[i++],"%-27.27s%hu","Days of New Messages", cfg.new_msgscan_init);
-				strcpy(opt[i++],"Default Toggles...");
-				strcpy(opt[i++],"Question Toggles...");
+				strcpy(opt[i++],"Midway");
+				strcpy(opt[i++],"Vancouver");
+				strcpy(opt[i++],"Edmonton");
+				strcpy(opt[i++],"Winnipeg");
+				strcpy(opt[i++],"Bogota");
+				strcpy(opt[i++],"Caracas");
+				strcpy(opt[i++],"Rio de Janeiro");
+				strcpy(opt[i++],"Fernando de Noronha");
+				strcpy(opt[i++],"Azores");
+				strcpy(opt[i++],"Western Europe (WET)");
+				strcpy(opt[i++],"Central Europe (CET)");
+				strcpy(opt[i++],"Eastern Europe (EET)");
+				strcpy(opt[i++],"Moscow");
+				strcpy(opt[i++],"Dubai");
+				strcpy(opt[i++],"Kabul");
+				strcpy(opt[i++],"Karachi");
+				strcpy(opt[i++],"Bombay");
+				strcpy(opt[i++],"Kathmandu");
+				strcpy(opt[i++],"Dhaka");
+				strcpy(opt[i++],"Bangkok");
+				strcpy(opt[i++],"Hong Kong");
+				strcpy(opt[i++],"Tokyo");
+				strcpy(opt[i++],"Sydney");
+				strcpy(opt[i++],"Noumea");
+				strcpy(opt[i++],"Wellington");
+				strcpy(opt[i++],"Other...");
 				opt[i][0]=0;
+				i=0;
 				uifc.helpbuf=
-					"`New User Values:`\n"
+					"`Non-U.S. Time Zone:`\n"
+					"\n"
+					"Choose the region which most closely reflects your local time zone.\n"
 					"\n"
-					"This menu allows you to determine the default settings for new users.\n"
+					"Choose `Other...` if a region representing your local time zone is\n"
+					"not listed (you will be able to set the UTC offset manually)."
 				;
-				switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&new_dflt,0
-					,"New User Values",opt)) {
-					case -1:
-						done=1;
-						break;
+				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+					,"None-U.S. Time Zone",opt);
+				if(i==-1)
+					break;
+				uifc.changes=1;
+				switch(i) {
 					case 0:
-						ultoa(cfg.new_level,str,10);
-						uifc.helpbuf=
-							"`New User Security Level:`\n"
-							"\n"
-							"This is the security level automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level"
-							,str,2,K_EDIT|K_NUMBER);
-						cfg.new_level=atoi(str);
+						cfg.sys_timezone=MID;
 						break;
 					case 1:
-						truncsp(ltoaf(cfg.new_flags1,str));
-						uifc.helpbuf=
-							"`New User Security Flags:`\n"
-							"\n"
-							"These are the security flags automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #1"
-							,str,26,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.new_flags1=aftol(str);
+						cfg.sys_timezone=VAN;
 						break;
 					case 2:
-						truncsp(ltoaf(cfg.new_flags2,str));
-						uifc.helpbuf=
-							"`New User Security Flags:`\n"
-							"\n"
-							"These are the security flags automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #2"
-							,str,26,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.new_flags2=aftol(str);
-                        break;
+						cfg.sys_timezone=EDM;
+						break;
 					case 3:
-						truncsp(ltoaf(cfg.new_flags3,str));
-						uifc.helpbuf=
-							"`New User Security Flags:`\n"
-							"\n"
-							"These are the security flags automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #3"
-							,str,26,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.new_flags3=aftol(str);
-                        break;
+						cfg.sys_timezone=WIN;
+						break;
 					case 4:
-						truncsp(ltoaf(cfg.new_flags4,str));
-						uifc.helpbuf=
-							"`New User Security Flags:`\n"
-							"\n"
-							"These are the security flags automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #4"
-							,str,26,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.new_flags4=aftol(str);
-                        break;
+						cfg.sys_timezone=BOG;
+						break;
 					case 5:
-						truncsp(ltoaf(cfg.new_exempt,str));
-						uifc.helpbuf=
-							"`New User Exemption Flags:`\n"
-							"\n"
-							"These are the exemptions that are automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26
-							,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.new_exempt=aftol(str);
+						cfg.sys_timezone=CAR;
 						break;
 					case 6:
-						truncsp(ltoaf(cfg.new_rest,str));
-						uifc.helpbuf=
-							"`New User Restriction Flags:`\n"
-							"\n"
-							"These are the restrictions that are automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26
-							,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.new_rest=aftol(str);
+						cfg.sys_timezone=RIO;
 						break;
 					case 7:
-						ultoa(cfg.new_expire,str,10);
-						uifc.helpbuf=
-							"`New User Expiration Days:`\n"
-							"\n"
-							"If you wish new users to have an automatic expiration date, set this\n"
-							"value to the number of days before the user will expire. To disable\n"
-							"New User expiration, set this value to `0`.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Expiration Days",str,4
-							,K_EDIT|K_NUMBER);
-						cfg.new_expire=atoi(str);
+						cfg.sys_timezone=FER;
 						break;
 					case 8:
-						ultoa(cfg.new_cdt,str,10);
-						uifc.helpbuf=
-							"`New User Credits:`\n"
-							"\n"
-							"This is the amount of credits that are automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Credits",str,10
-							,K_EDIT|K_NUMBER);
-						cfg.new_cdt=atol(str);
-                        break;
+						cfg.sys_timezone=AZO;
+						break;
 					case 9:
-						ultoa(cfg.new_min,str,10);
-						uifc.helpbuf=
-							"`New User Minutes:`\n"
-							"\n"
-							"This is the number of extra minutes automatically given to new users.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Minutes (Time Credit)"
-							,str,10,K_EDIT|K_NUMBER);
-						cfg.new_min=atol(str);
+						cfg.sys_timezone=WET;
+						configure_dst();
 						break;
 					case 10:
-						if(!cfg.total_xedits) {
-							uifc.msg("No External Editors Configured");
-							break; 
-						}
-						strcpy(opt[0],"Internal");
-						for(i=1;i<=cfg.total_xedits;i++)
-							strcpy(opt[i],cfg.xedit[i-1]->code);
-						opt[i][0]=0;
-						i=0;
-						uifc.helpbuf=
-							"`New User Editor:`\n"
-							"\n"
-							"You can use this option to select the default editor for new users.\n"
-						;
-						i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0,"Editors",opt);
-						if(i==-1)
-							break;
-						uifc.changes=1;
-						if(i && i<=cfg.total_xedits)
-							sprintf(cfg.new_xedit,"%-.8s",cfg.xedit[i-1]->code);
-						else
-							cfg.new_xedit[0]=0;
+						cfg.sys_timezone=CET;
+						configure_dst();
 						break;
 					case 11:
-						for(i=0;i<cfg.total_shells && i<MAX_OPTS;i++)
-							sprintf(opt[i],"%-.8s",cfg.shell[i]->code);
-						opt[i][0]=0;
-						i=0;
-						uifc.helpbuf=
-							"`New User Command Shell:`\n"
-							"\n"
-							"You can use this option to select the default command shell for new\n"
-							"users.\n"
-						;
-						i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0
-							,"Command Shells",opt);
-						if(i==-1)
-							break;
-						cfg.new_shell=i;
-						uifc.changes=1;
+						cfg.sys_timezone=EET;
+						configure_dst();
 						break;
 					case 12:
-						uifc.helpbuf=
-							"`New User Default Download Protocol:`\n"
-							"\n"
-							"This option allows you to set the default download protocol of new users\n"
-							"(protocol command key or `BLANK` for no default).\n"
-						;
-						sprintf(str,"%c",cfg.new_prot);
-						uifc.input(WIN_SAV|WIN_MID,0,0
-							,"Default Download Protocol (SPACE=Disabled)"
-							,str,1,K_EDIT|K_UPPER);
-						cfg.new_prot=str[0];
-						if(cfg.new_prot<' ')
-							cfg.new_prot=' ';
-                        break;
+						cfg.sys_timezone=MOS;
+						break;
 					case 13:
-						uifc.helpbuf=
-							"`New User Days of New Messages:`\n"
-							"\n"
-							"This option allows you to set the number of days worth of messages\n"
-							"which will be included in the new user's first `new message scan`.\n"
-							"\n"
-							"The value `0` means there will be `no` new messages for the new user.\n"
-						;
-						sprintf(str,"%hu",cfg.new_msgscan_init);
-						uifc.input(WIN_SAV|WIN_MID,0,0
-							,"Days of New Messages for New User's first new message scan"
-							,str,4,K_EDIT|K_NUMBER);
-						cfg.new_msgscan_init=atoi(str);
-                        break;
+						cfg.sys_timezone=DUB;
+						break;
 					case 14:
-						uifc.helpbuf=
-							"`New User Default Toggle Options:`\n"
-							"\n"
-							"This menu contains the default state of new user toggle options. All new\n"
-							"users on your system will have their defaults set according to the\n"
-							"settings on this menu. The user can then change them to his or her\n"
-							"liking.\n"
-							"\n"
-							"See the Synchronet User Manual for more information on the individual\n"
-							"options available.\n"
-						;
-						j=0;
-						k=0;
-                        while(1) {
-                            i=0;
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Expert Menu Mode"
-								,cfg.new_misc&EXPERT ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Screen Pause"
-								,cfg.new_misc&UPAUSE ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Spinning Cursor"
-								,cfg.new_misc&SPIN ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Clear Screen"
-								,cfg.new_misc&CLRSCRN ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Ask For New Scan"
-								,cfg.new_misc&ASK_NSCAN ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Ask For Your Msg Scan"
-								,cfg.new_misc&ASK_SSCAN ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Automatic New File Scan"
-								,cfg.new_misc&ANFSCAN ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Remember Current Sub-board"
-								,cfg.new_misc&CURSUB ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Batch Download File Flag"
-								,cfg.new_misc&BATCHFLAG ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Extended File Descriptions"
-								,cfg.new_misc&EXTDESC ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Hot Keys"
-								,cfg.new_misc&COLDKEYS ? "No":"Yes");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Auto Hang-up After Xfer"
-								,cfg.new_misc&AUTOHANG ? "Yes":"No");
-							opt[i][0]=0;
-							j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,&k
-								,"Default Toggle Options",opt);
-                            if(j==-1)
-                                break;
-                            uifc.changes=1;
-                            switch(j) {
-                                case 0:
-									cfg.new_misc^=EXPERT;
-                                    break;
-								case 1:
-									cfg.new_misc^=UPAUSE;
-									break;
-								case 2:
-									cfg.new_misc^=SPIN;
-									break;
-								case 3:
-									cfg.new_misc^=CLRSCRN;
-									break;
-								case 4:
-									cfg.new_misc^=ASK_NSCAN;
-									break;
-								case 5:
-									cfg.new_misc^=ASK_SSCAN;
-                                    break;
-								case 6:
-									cfg.new_misc^=ANFSCAN;
-									break;
-								case 7:
-									cfg.new_misc^=CURSUB;
-									break;
-								case 8:
-									cfg.new_misc^=BATCHFLAG;
-									break;
-								case 9:
-									cfg.new_misc^=EXTDESC;
-                                    break;
-								case 10:
-									cfg.new_misc^=COLDKEYS;
-                                    break;
-								case 11:
-									cfg.new_misc^=AUTOHANG;
-                                    break;
-									
-							} 
-						}
+						cfg.sys_timezone=KAB;
 						break;
 					case 15:
+						cfg.sys_timezone=KAR;
+						break;
+					case 16:
+						cfg.sys_timezone=BOM;
+						break;
+					case 17:
+						cfg.sys_timezone=KAT;
+						break;
+					case 18:
+						cfg.sys_timezone=DHA;
+						break;
+					case 19:
+						cfg.sys_timezone=BAN;
+						break;
+					case 20:
+						cfg.sys_timezone=HON;
+						break;
+					case 21:
+						cfg.sys_timezone=TOK;
+						break;
+					case 22:
+						cfg.sys_timezone=SYD;
+						break;
+					case 23:
+						cfg.sys_timezone=NOU;
+						break;
+					case 24:
+						cfg.sys_timezone=WEL;
+						break;
+					default:
+						if(cfg.sys_timezone>720 || cfg.sys_timezone<-720)
+							cfg.sys_timezone=0;
+						if(cfg.sys_timezone==0)
+							str[0]=0;
+						else
+							sprintf(str,"%02d:%02d"
+								,cfg.sys_timezone/60,cfg.sys_timezone<0
+								? (-cfg.sys_timezone)%60 : cfg.sys_timezone%60);
 						uifc.helpbuf=
-							"`New User Question Toggle Options:`\n"
+							"`Time Zone Offset:`\n"
 							"\n"
-							"This menu allows you to decide which questions will be asked of a new\n"
-							"user.\n"
-						;
-						j=0;
-						k=0;
-                        while(1) {
-                            i=0;
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Real Name"
-								,cfg.uq&UQ_REALNAME ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Force Unique Real Name"
-								,cfg.uq&UQ_DUPREAL ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Force Upper/Lower Case"
-								,cfg.uq&UQ_NOUPRLWR ? "No":"Yes");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Company Name"
-								,cfg.uq&UQ_COMPANY ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Chat Handle / Call Sign"
-								,cfg.uq&UQ_HANDLE ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Force Unique Handle / Call Sign"
-								,cfg.uq&UQ_DUPHAND ? "Yes":"No");
-                            sprintf(opt[i++],"%-27.27s %-3.3s"
-                                ,"E-mail/NetMail Address"
-                                ,cfg.uq&UQ_NONETMAIL ? "No":"Yes");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Sex (Gender)"
-								,cfg.uq&UQ_SEX ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Birthday"
-								,cfg.uq&UQ_BIRTH ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Address and Zip Code"
-								,cfg.uq&UQ_ADDRESS ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Location"
-								,cfg.uq&UQ_LOCATION ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Require Comma in Location"
-								,cfg.uq&UQ_NOCOMMAS ? "No":"Yes");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Phone Number"
-								,cfg.uq&UQ_PHONE ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Allow EX-ASCII in Answers"
-								,cfg.uq&UQ_NOEXASC ? "No":"Yes");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"External Editor"
-								,cfg.uq&UQ_XEDIT ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Command Shell"
-								,cfg.uq&UQ_CMDSHELL ? "Yes":"No");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Default Settings"
-								,cfg.uq&UQ_NODEF ? "No":"Yes");
-							sprintf(opt[i++],"%-27.27s %-3.3s"
-								,"Color Terminal"
-								,cfg.uq&UQ_COLORTERM ? "Yes":"No");
-							opt[i][0]=0;
-							j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,&k
-								,"New User Questions",opt);
-                            if(j==-1)
-                                break;
-                            uifc.changes=1;
-                            switch(j) {
-                                case 0:
-									cfg.uq^=UQ_REALNAME;
-                                    break;
-								case 1:
-									cfg.uq^=UQ_DUPREAL;
-									break;
-								case 2:
-									cfg.uq^=UQ_NOUPRLWR;
-									break;
-								case 3:
-									cfg.uq^=UQ_COMPANY;
-                                    break;
-								case 4:
-									cfg.uq^=UQ_HANDLE;
-                                    break;
-								case 5:
-									cfg.uq^=UQ_DUPHAND;
-									break;
-                                case 6:
-                                    cfg.uq^=UQ_NONETMAIL;
-                                    break;
-								case 7:
-									cfg.uq^=UQ_SEX;
-									break;
-								case 8:
-									cfg.uq^=UQ_BIRTH;
-									break;
-								case 9:
-									cfg.uq^=UQ_ADDRESS;
-									break;
-								case 10:
-									cfg.uq^=UQ_LOCATION;
-									break;
-								case 11:
-									cfg.uq^=UQ_NOCOMMAS;
-									break;
-								case 12:
-									cfg.uq^=UQ_PHONE;
-									break;
-								case 13:
-									cfg.uq^=UQ_NOEXASC;
-									break;
-								case 14:
-									cfg.uq^=UQ_XEDIT;
-                                    break;
-								case 15:
-									cfg.uq^=UQ_CMDSHELL;
-                                    break;
-								case 16:
-									cfg.uq^=UQ_NODEF;
-                                    break;
-								case 17:
-									cfg.uq^=UQ_COLORTERM;
-									break;
-							} 
-						}
-					break; 
-				} 
-			}
-			break;
-		case 11:	/* Advanced Options */
-			done=0;
-			while(!done) {
-				i=0;
-				sprintf(opt[i++],"%-27.27s%s","New User Magic Word",cfg.new_magic);
-				sprintf(opt[i++],"%-27.27s%.40s","Data Directory"
-					,cfg.data_dir);
-				sprintf(opt[i++],"%-27.27s%.40s","Logs Directory"
-					,cfg.logs_dir);
-				sprintf(opt[i++],"%-27.27s%.40s","Exec Directory"
-					,cfg.exec_dir);
-				sprintf(opt[i++],"%-27.27s%.40s","Mods Directory"
-					,cfg.mods_dir);
-				sprintf(opt[i++],"%-27.27s%s","Input SIF Questionnaire"
-					,cfg.new_sif);
-				sprintf(opt[i++],"%-27.27s%s","Output SIF Questionnaire"
-					,cfg.new_sof);
-				ultoac(cfg.cdt_per_dollar,str);
-				sprintf(opt[i++],"%-27.27s%s","Credits Per Dollar",str);
-				sprintf(opt[i++],"%-27.27s%u","Minutes Per 100k Credits"
-					,cfg.cdt_min_value);
-				sprintf(opt[i++],"%-27.27s%s","Maximum Number of Minutes"
-					,cfg.max_minutes ? ultoa(cfg.max_minutes,tmp,10) : "Unlimited");
-				sprintf(opt[i++],"%-27.27s%u","Warning Days Till Expire"
-					,cfg.sys_exp_warn);
-				sprintf(opt[i++],"%-27.27s%u","Last Displayable Node"
-					,cfg.sys_lastnode);
-				sprintf(opt[i++],"%-27.27s%s","Phone Number Format"
-					,cfg.sys_phonefmt);
-				sprintf(opt[i++],"%-27.27s%.40s","Sysop Chat Override"
-					,cfg.sys_chat_arstr);
-				if(cfg.user_backup_level)
-					sprintf(str,"%hu",cfg.user_backup_level);
-				else
-					strcpy(str,"None");
-				sprintf(opt[i++],"%-27.27s%s","User Database Backups",str);
-				if(cfg.mail_backup_level)
-					sprintf(str,"%hu",cfg.mail_backup_level);
-				else
-					strcpy(str,"None");
-				sprintf(opt[i++],"%-27.27s%s","Mail Database Backups",str);
-				sprintf(opt[i++],"%-27.27s%"PRIX32,"Control Key Pass-through"
-					,cfg.ctrlkey_passthru);
-				opt[i][0]=0;
-				uifc.helpbuf=
-					"`System Advanced Options:`\n"
-					"\n"
-					"Care should be taken when modifying any of the options listed here.\n"
-				;
-				switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&adv_dflt,0
-					,"Advanced Options",opt)) {
-					case -1:
-						done=1;
-                        break;
-
-					case 0:
-						uifc.helpbuf=
-							"`New User Magic Word:`\n"
-							"\n"
-							"If this field has a value, it is assumed the sysop has placed some\n"
-							"reference to this `magic word` in `text/newuser.msg` and new users\n"
-							"will be prompted for the magic word after they enter their password.\n"
-							"If they do not enter it correctly, it is assumed they didn't read the\n"
-							"new user information displayed to them and they are disconnected.\n"
-							"\n"
-							"Think of it as a password to guarantee that new users read the text\n"
-							"displayed to them.\n"
-						;
-						uifc.input(WIN_MID,0,0,"New User Magic Word",cfg.new_magic,sizeof(cfg.new_magic)-1
-							,K_EDIT|K_UPPER);
-						break;
-					case 1:
-						uifc.helpbuf=
-							"`Data File Directory:`\n"
-							"\n"
-							"The Synchronet data directory contains almost all the data for your BBS.\n"
-							"This directory must be located where `ALL` nodes can access it and\n"
-							"`MUST NOT` be placed on a RAM disk or other volatile media.\n"
-							"\n"
-							"This option allows you to change the location of your data directory.\n"
-						;
-						strcpy(str,cfg.data_dir);
-						if(uifc.input(WIN_MID|WIN_SAV,0,9,"Data Directory"
-							,str,sizeof(cfg.data_dir)-1,K_EDIT)>0) {
-							backslash(str);
-							SAFECOPY(cfg.data_dir,str); 
-						}
-                        break;
-					case 2:
-						uifc.helpbuf=
-							"`Log File Directory:`\n"
-							"\n"
-							"Log files will be stored in this directory.\n"
-						;
-						strcpy(str,cfg.logs_dir);
-						if(uifc.input(WIN_MID|WIN_SAV,0,9,"Logs Directory"
-							,str,sizeof(cfg.logs_dir)-1,K_EDIT)>0) {
-							backslash(str);
-							SAFECOPY(cfg.logs_dir,str); 
-						}
-                        break;
-					case 3:
-						uifc.helpbuf=
-							"`Executable/Module File Directory:`\n"
-							"\n"
-							"The Synchronet exec directory contains executable files that your BBS\n"
-							"executes. This directory does `not` need to be in your DOS search path.\n"
-							"If you place programs in this directory for the BBS to execute, you\n"
-							"should place the `%!` abbreviation for the exec directory at the\n"
-							"beginning of the configured command-lines.\n"
-							"\n"
-							"This option allows you to change the location of your exec directory.\n"
-						;
-						strcpy(str,cfg.exec_dir);
-						if(uifc.input(WIN_MID|WIN_SAV,0,9,"Exec Directory"
-							,str,sizeof(cfg.exec_dir)-1,K_EDIT)>0) {
-							backslash(str);
-							SAFECOPY(cfg.exec_dir,str); 
-						}
-                        break;
-					case 4:
-						uifc.helpbuf=
-							"`Modified Modules Directory:`\n"
-							"\n"
-							"This optional directory can be used to specify a location where modified\n"
-							"module files are stored. These modified modules will take precedence over\n"
-							"stock modules with the same filename (in the exec directory) and will\n"
-							"not be overwritten by future updates/upgrades.\n"
-							"\n"
-							"If this directory is `blank`, then this feature is not used and all modules\n"
-							"are assumed to be located in the `exec` directory.\n"
-						;
-						strcpy(str,cfg.mods_dir);
-						if(uifc.input(WIN_MID|WIN_SAV,0,9,"Mods Directory"
-							,str,sizeof(cfg.mods_dir)-1,K_EDIT)>0) {
-							backslash(str);
-							SAFECOPY(cfg.mods_dir,str); 
-						}
-                        break;
-					case 5:
-						strcpy(str,cfg.new_sif);
-						uifc.helpbuf=
-							"`SIF Questionnaire for User Input:`\n"
-							"\n"
-							"This is the name of a SIF questionnaire file that resides your text\n"
-							"directory that all users will be prompted to answer.\n"
-						;
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"SIF Questionnaire for User Input"
-							,str,LEN_CODE,K_UPPER|K_EDIT);
-						if(!str[0] || code_ok(str))
-							strcpy(cfg.new_sif,str);
-						else
-							uifc.msg("Invalid SIF Name");
-						break;
-					case 6:
-						strcpy(str,cfg.new_sof);
-						uifc.helpbuf=
-							"`SIF Questionnaire for Reviewing User Input:`\n"
-							"\n"
-							"This is the SIF file used to review the input of users from the user\n"
-							"edit function.\n"
-						;
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"SIF Questionnaire for Reviewing User Input"
-							,str,LEN_CODE,K_EDIT);
-						if(!str[0] || code_ok(str))
-							strcpy(cfg.new_sof,str);
-						else
-							uifc.msg("Invalid SIF Name");
-						break;
-					case 7:
-						uifc.helpbuf=
-							"`Credits Per Dollar:`\n"
-							"\n"
-							"This is the monetary value of a credit (How many credits per dollar).\n"
-							"This value should be a power of 2 (1, 2, 4, 8, 16, 32, 64, 128, etc.)\n"
-							"since credits are usually converted by 100 kilobyte (102400) blocks.\n"
-							"To make a dollar worth two megabytes of credits, set this value to\n"
-							"2,097,152 (a megabyte is 1024*1024 or 1048576).\n"
-						;
-						ultoa(cfg.cdt_per_dollar,str,10);
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Credits Per Dollar",str,10,K_NUMBER|K_EDIT);
-						cfg.cdt_per_dollar=atol(str);
-						break;
-					case 8:
-						uifc.helpbuf=
-							"`Minutes Per 100K Credits:`\n"
-							"\n"
-							"This is the value of a minute of time online. This field is the number\n"
-							"of minutes to give the user in exchange for each 100K credit block.\n"
-						;
-						sprintf(str,"%u",cfg.cdt_min_value);
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Minutes Per 100K Credits",str,5,K_NUMBER|K_EDIT);
-						cfg.cdt_min_value=atoi(str);
-						break;
-					case 9:
-						uifc.helpbuf=
-							"`Maximum Number of Minutes User Can Have:`\n"
-							"\n"
-							"This value is the maximum total number of minutes a user can have. If a\n"
-							"user has this number of minutes or more, they will not be allowed to\n"
-							"convert credits into minutes. A sysop can add minutes to a user's\n"
-							"account regardless of this maximum. If this value is set to `0`, users\n"
-							"will have no limit on the total number of minutes they can have.\n"
-						;
-						sprintf(str,"%"PRIu32,cfg.max_minutes);
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Maximum Number of Minutes a User Can Have "
-							"(0=No Limit)"
-							,str,10,K_NUMBER|K_EDIT);
-						cfg.max_minutes=atol(str);
-						break;
-					case 10:
-						uifc.helpbuf=
-							"`Warning Days Till Expire:`\n"
-							"\n"
-							"If a user's account will expire in this many days or less, the user will\n"
-							"be notified at logon. Setting this value to `0` disables the warning\n"
-							"completely.\n"
-						;
-						sprintf(str,"%u",cfg.sys_exp_warn);
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Warning Days Till Expire",str,5,K_NUMBER|K_EDIT);
-						cfg.sys_exp_warn=atoi(str);
-                        break;
-					case 11:
-						uifc.helpbuf=
-							"`Last Displayed Node:`\n"
-							"\n"
-							"This is the number of the last node to display to users in node lists.\n"
-							"This allows the sysop to define the higher numbered nodes as `invisible`\n"
-							"to users.\n"
-						;
-						sprintf(str,"%u",cfg.sys_lastnode);
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Last Displayed Node",str,5,K_NUMBER|K_EDIT);
-						cfg.sys_lastnode=atoi(str);
-                        break;
-					case 12:
-						uifc.helpbuf=
-							"`Phone Number Format:`\n"
-							"\n"
-							"This is the format used for phone numbers in your local calling\n"
-							"area. Use `N` for number positions, `A` for alphabetic, or `!` for any\n"
-							"character. All other characters will be static in the phone number\n"
-							"format. An example for North American phone numbers is `NNN-NNN-NNNN`.\n"
+							"Enter your local time zone offset from Universal Time (UTC/GMT)\n"
+							"in `HH:MM` format.\n"
 						;
 						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Phone Number Format",cfg.sys_phonefmt
-							,LEN_PHONE,K_UPPER|K_EDIT);
-                        break;
-					case 13:
-						getar("Sysop Chat Override",cfg.sys_chat_arstr);
+							,"Time (HH:MM) East (+) or West (-) of Universal "
+								"Time"
+							,str,6,K_EDIT|K_UPPER);
+						cfg.sys_timezone=atoi(str)*60;
+						char *p=strchr(str,':');
+						if(p) {
+							if(cfg.sys_timezone<0)
+								cfg.sys_timezone-=atoi(p+1);
+							else
+								cfg.sys_timezone+=atoi(p+1); 
+						}
 						break;
-					case 14:
-						uifc.helpbuf=
-							"`User Database Backups:`\n"
-							"\n"
-							"Setting this option to anything but 0 will enable automatic daily\n"
-							"backups of the user database. This number determines how many backups\n"
-							"to keep on disk.\n"
-						;
-						sprintf(str,"%u",cfg.user_backup_level);
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Number of Daily User Database Backups to Keep"
-							,str,4,K_NUMBER|K_EDIT);
-						cfg.user_backup_level=atoi(str);
-                        break;
-					case 15:
-						uifc.helpbuf=
-							"`Mail Database Backups:`\n"
-							"\n"
-							"Setting this option to anything but 0 will enable automatic daily\n"
-							"backups of the mail database. This number determines how many backups\n"
-							"to keep on disk.\n"
-						;
-						sprintf(str,"%u",cfg.mail_backup_level);
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Number of Daily Mail Database Backups to Keep"
-							,str,4,K_NUMBER|K_EDIT);
-						cfg.mail_backup_level=atoi(str);
-                        break;
-					case 16:
-						uifc.helpbuf=
-							"`Control Key Pass-through:`\n"
-							"\n"
-							"This value is a 32-bit hexadecimal number. Each set bit represents a\n"
-							"control key combination that will `not` be handled internally by\n"
-							"Synchronet or by a Global Hot Key Event.\n"
-							"\n"
-							"To disable internal handling of the `Ctrl-C` key combination (for example)\n"
-							"set this value to `8`. The value is determined by taking 2 to the power of\n"
-							"the ASCII value of the control character (Ctrl-A is 1, Ctrl-B is 2, \n"
-							"etc.). In the case of Ctrl-C, taking 2 to the power of 3 equals 8.\n"
-							"\n"
-							"To pass-through multiple control key combinations, multiple bits must be\n"
-							"set (or'd together) to create the necessary value, which may require the\n"
-							"use of a hexadecimal calculator.\n"
-							"\n"
-							"If unsure, leave this value set to `0`, the default.\n"
-						;
-						sprintf(str,"%"PRIX32,cfg.ctrlkey_passthru);
-						uifc.input(WIN_MID|WIN_SAV,0,0
-							,"Control Key Pass-through"
-							,str,8,K_UPPER|K_EDIT);
-						cfg.ctrlkey_passthru=strtoul(str,NULL,16);
-                        break;
-					} 
 				}
 				break;
-		case 12: /* Loadable Modules */
-			done=0;
-			k=0;
-			while(!done) {
-				i=0;
-				sprintf(opt[i++],"%-16.16s%s","Login",cfg.login_mod);
-				sprintf(opt[i++],"%-16.16s%s","Logon",cfg.logon_mod);
-				sprintf(opt[i++],"%-16.16s%s","Sync",cfg.sync_mod);
-				sprintf(opt[i++],"%-16.16s%s","Logoff",cfg.logoff_mod);
-				sprintf(opt[i++],"%-16.16s%s","Logout",cfg.logout_mod);
-				sprintf(opt[i++],"%-16.16s%s","New User",cfg.newuser_mod);
-				sprintf(opt[i++],"%-16.16s%s","Expired User",cfg.expire_mod);
-				sprintf(opt[i++],"%-16.16s%s","Read Mail",cfg.readmail_mod);
-				sprintf(opt[i++],"%-16.16s%s","Scan Msgs",cfg.scanposts_mod);
-				sprintf(opt[i++],"%-16.16s%s","Scan Subs",cfg.scansubs_mod);
-				opt[i][0]=0;
+			case 3:
 				uifc.helpbuf=
-					"`Loadable Modules:`\n"
+					"`System Operator:`\n"
 					"\n"
-					"Baja modules (`.bin` files) or JavaScript modules (`.js` files) can be\n"
-					"automatically loaded and executed during certain Terminal Server\n"
-					"operations. The name (root filename) of the module can be specified for\n"
-					"each of the available operations listed below:\n"
+					"This is the name or alias of the system operator. This does not have to\n"
+					"be the same as user #1. This field is used for informational purposes\n"
+					"only.\n"
+				;
+				uifc.input(WIN_MID,0,0,"System Operator",cfg.sys_op,sizeof(cfg.sys_op)-1,K_EDIT);
+				break;
+			case 4:
+				uifc.helpbuf=
+					"`System Password:`\n"
 					"\n"
-					"`Login`        Required module for interactive terminal logins (answer)\n"
-					"`Logon`        Executed during terminal logon procedure\n"
-					"`Sync`         Executed when terminal nodes are periodically synchronized\n"
-					"`Logoff`       Executed during terminal logoff procedure (interactive)\n"
-					"`Logout`       Executed during terminal logout procedure (offline)\n"
-					"`New User`     Executed at end of new terminal user creation process\n"
-					"`Expired User` Executed during daily event when user expires (offline)\n"
+					"This is an extra security password required for sysop logon and certain\n"
+					"sysop functions. This password should be something not easily guessed\n"
+					"and should be kept absolutely confidential. This password must be\n"
+					"entered at the Terminal Server `SY:` prompt.\n"
+				;
+				uifc.input(WIN_MID,0,0,"System Password",cfg.sys_pass,sizeof(cfg.sys_pass)-1,K_EDIT|K_UPPER);
+				break;
+			case 5:
+				strcpy(opt[0],"Yes");
+				strcpy(opt[1],"No");
+				opt[2][0]=0;
+				i=1;
+				uifc.helpbuf=
+					"`Allow Users to Change Their Password:`\n"
 					"\n"
-					"Full module command-lines may be used for the operations listed below:\n"
+					"If you want the users of your system to have the option of changing\n"
+					"their password to a string of their choice, set this option to `Yes`.\n"
+					"For the highest level of security, set this option to `No.`\n"
+				;
+				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+					,"Allow Users to Change Their Password",opt);
+				if(!i && !(cfg.sys_misc&SM_PWEDIT)) {
+					cfg.sys_misc|=SM_PWEDIT;
+					uifc.changes=1; 
+				}
+				else if(i==1 && cfg.sys_misc&SM_PWEDIT) {
+					cfg.sys_misc&=~SM_PWEDIT;
+					uifc.changes=1; 
+				}
+				i=0;
+				uifc.helpbuf=
+					"`Force Periodic Password uifc.changes:`\n"
 					"\n"
-					"`Read Mail`    Executed when a user reads email/netmail\n"
-					"`Scan Msgs`    Executed when a user reads or scans a message sub-board\n"
-					"`Scan Subs`    Executed when a user scans one or more sub-boards for msgs\n"
+					"If you want your users to be forced to change their passwords\n"
+					"periodically, select `Yes`.\n"
+				;
+				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+					,"Force Periodic Password Changes",opt);
+				if(!i) {
+					ultoa(cfg.sys_pwdays,str,10);
+				uifc.helpbuf=
+					"`Maximum Days Between Password uifc.changes:`\n"
 					"\n"
-					"`Note:` JavaScript modules take precedence over Baja modules if both exist\n"
-					"in your `exec` or `mods` directories.\n"
+					"Enter the maximum number of days allowed between password uifc.changes.\n"
+					"If a user has not voluntarily changed his or her password in this\n"
+					"many days, he or she will be forced to change their password upon\n"
+					"logon.\n"
 				;
-				switch(uifc.list(WIN_ACT|WIN_T2B|WIN_RHT,0,0,32,&k,0
-					,"Loadable Modules",opt)) {
-
-					case -1:
-						done=1;
-                        break;
-
-					case 0:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Login Module"
-							,cfg.login_mod,sizeof(cfg.login_mod)-1,K_EDIT);
-                        break;
-					case 1:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Logon Module"
-							,cfg.logon_mod,sizeof(cfg.logon_mod)-1,K_EDIT);
-                        break;
-					case 2:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Synchronize Module"
-							,cfg.sync_mod,sizeof(cfg.sync_mod)-1,K_EDIT);
-                        break;
-					case 3:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Logoff Module"
-							,cfg.logoff_mod,sizeof(cfg.logoff_mod)-1,K_EDIT);
-                        break;
-					case 4:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Logout Module"
-							,cfg.logout_mod,sizeof(cfg.logout_mod)-1,K_EDIT);
-                        break;
-					case 5:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"New User Module"
-							,cfg.newuser_mod,sizeof(cfg.newuser_mod)-1,K_EDIT);
-                        break;
-					case 6:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Expired User Module"
-							,cfg.expire_mod,sizeof(cfg.expire_mod)-1,K_EDIT);
-                        break;
-					case 7:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Read Mail Command"
-							,cfg.readmail_mod,sizeof(cfg.readmail_mod)-1,K_EDIT);
-                        break;
-					case 8:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Scan Msgs Command"
-							,cfg.scanposts_mod,sizeof(cfg.scanposts_mod)-1,K_EDIT);
-                        break;
-					case 9:
-						uifc.input(WIN_MID|WIN_SAV,0,0,"Scan Subs Command"
-							,cfg.scansubs_mod,sizeof(cfg.scansubs_mod)-1,K_EDIT);
-                        break;
-				} 
-			}
-			break;
-
-		case 13: /* Security Levels */
-			dflt=bar=0;
-			k=0;
-			while(1) {
-				for(i=0;i<100;i++) {
-					sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L);
-					sprintf(opt[i],"%-2d    %5d %5d "
-						"%5d %5d %5d %5d %6s %7s %2u",i
-						,cfg.level_timeperday[i],cfg.level_timepercall[i]
-						,cfg.level_callsperday[i],cfg.level_emailperday[i]
-						,cfg.level_postsperday[i],cfg.level_linespermsg[i]
-						,tmp
-						,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Val Set" : "Level"
-						,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ?
-							cfg.level_expireto[i] : cfg.expired_level); 
+					uifc.input(WIN_MID,0,0,"Maximum Days Between Password Changes"
+						,str,5,K_NUMBER|K_EDIT);
+					cfg.sys_pwdays=atoi(str); 
 				}
-				opt[i][0]=0;
-				i=0;
+				else if(i==1 && cfg.sys_pwdays) {
+					cfg.sys_pwdays=0;
+					uifc.changes=1; 
+				}
+			
+				break;
+			case 6:
+				sprintf(str,"%u",cfg.sys_deldays);
+				uifc.helpbuf=
+					"`Days Since Last Logon to Preserve Deleted Users:`\n"
+					"\n"
+					"Deleted user slots can be `undeleted` until the slot is written over\n"
+					"by a new user. If you want deleted user slots to be preserved for period\n"
+					"of time since their last logon, set this value to the number of days to\n"
+					"keep new users from taking over a deleted user's slot.\n"
+				;
+				uifc.input(WIN_MID,0,0,"Days Since Last Logon to Preserve Deleted Users"
+					,str,5,K_EDIT|K_NUMBER);
+				cfg.sys_deldays=atoi(str);
+				break;
+			case 7:
+				sprintf(str,"%u",cfg.sys_autodel);
 				uifc.helpbuf=
-					"`Security Level Values:`\n"
+					"`Maximum Days of Inactivity Before Auto-Deletion:`\n"
 					"\n"
-					"This menu allows you to change the security options for every possible\n"
-					"security level from 0 to 99. The available options for each level are:\n"
+					"If you want users that haven't logged on in certain period of time to\n"
+					"be automatically deleted, set this value to the maximum number of days\n"
+					"of inactivity before the user is deleted. Setting this value to `0`\n"
+					"disables this feature.\n"
 					"\n"
-					"    Time Per Day           Maximum online time per day\n"
-					"    Time Per Call          Maximum online time per call\n"
-					"    Calls Per Day          Maximum number of calls per day\n"
-					"    Email Per Day          Maximum number of email per day\n"
-					"    Posts Per Day          Maximum number of posts per day\n"
-					"    Lines Per Message      Maximum number of lines per message\n"
-					"    Free Credits Per Day   Number of free credits per day\n"
-					"    Expire To              Level or validation set to Expire to\n"
+					"Users with the `P` exemption will not be deleted due to inactivity.\n"
 				;
-				i=uifc.list(WIN_RHT|WIN_ACT,0,3,0,&dflt,&bar
-					,"Level   T/D   T/C   C/D   E/D   P/D   L/M   F/D   "
-						"Expire To",opt);
-				if(i==-1)
-					break;
-				while(1) {
-					sprintf(str,"Security Level %d Values",i);
-					j=0;
-					sprintf(opt[j++],"%-22.22s%-5u","Time Per Day"
-						,cfg.level_timeperday[i]);
-					sprintf(opt[j++],"%-22.22s%-5u","Time Per Call"
-						,cfg.level_timepercall[i]);
-					sprintf(opt[j++],"%-22.22s%-5u","Calls Per Day"
-						,cfg.level_callsperday[i]);
-					sprintf(opt[j++],"%-22.22s%-5u","Email Per Day"
-						,cfg.level_emailperday[i]);
-					sprintf(opt[j++],"%-22.22s%-5u","Posts Per Day"
-                        ,cfg.level_postsperday[i]);
-					sprintf(opt[j++],"%-22.22s%-5u","Lines Per Message"
-						,cfg.level_linespermsg[i]);
-					sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L);
-					sprintf(opt[j++],"%-22.22s%-6s","Free Credits Per Day"
-						,tmp);
-					sprintf(opt[j++],"%-22.22s%s %u","Expire To"
-						,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Validation Set"
-							: "Level"
-						,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ?
-							cfg.level_expireto[i] : cfg.expired_level);
-					opt[j][0]=0;
-					j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0
-						,str,opt);
-					if(j==-1)
-						break;
-					switch(j) {
+				uifc.input(WIN_MID,0,0,"Maximum Days of Inactivity Before Auto-Deletion"
+					,str,5,K_EDIT|K_NUMBER);
+				cfg.sys_autodel=atoi(str);
+				break;
+			case 8:
+				uifc.helpbuf=
+					"`New User Password:`\n"
+					"\n"
+					"If you want callers to only be able to logon as `New` if they know a\n"
+					"certain password, enter that password here. If you want any caller to\n"
+					"be able to logon as New, leave this option blank.\n"
+				;
+				uifc.input(WIN_MID,0,0,"New User Password",cfg.new_pass,sizeof(cfg.new_pass)-1
+					,K_EDIT|K_UPPER);
+				break;
+			case 9:    /* Toggle Options */
+				done=0;
+				while(!done) {
+					i=0;
+					sprintf(opt[i++],"%-33.33s%s","Allow Aliases"
+						,cfg.uq&UQ_ALIASES ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Allow Time Banking"
+						,cfg.sys_misc&SM_TIMEBANK ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Allow Credit Conversions"
+						,cfg.sys_misc&SM_NOCDTCVT ? "No" : "Yes");
+					sprintf(opt[i++],"%-33.33s%s","Allow Sysop Logins"
+						,cfg.sys_misc&SM_R_SYSOP ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Display/Log Passwords Locally"
+						,cfg.sys_misc&SM_ECHO_PW ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Short Sysop Page"
+						,cfg.sys_misc&SM_SHRTPAGE ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Include Sysop in Statistics"
+						,cfg.sys_misc&SM_SYSSTAT ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Closed to New Users"
+						,cfg.sys_misc&SM_CLOSED ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Use Location in User Lists"
+						,cfg.sys_misc&SM_LISTLOC ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Military (24 hour) Time Format"
+						,cfg.sys_misc&SM_MILITARY ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","European Date Format (DD/MM/YY)"
+						,cfg.sys_misc&SM_EURODATE ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","User Expires When Out-of-time"
+						,cfg.sys_misc&SM_TIME_EXP ? "Yes" : "No");
+					sprintf(opt[i++],"%-33.33s%s","Display Sys Info During Logon"
+						,cfg.sys_misc&SM_NOSYSINFO ? "No" : "Yes");
+					sprintf(opt[i++],"%-33.33s%s","Display Node List During Logon"
+						,cfg.sys_misc&SM_NONODELIST ? "No" : "Yes");
+					opt[i][0]=0;
+					uifc.helpbuf=
+						"`System Toggle Options:`\n"
+						"\n"
+						"This is a menu of system related options that can be toggled between\n"
+						"two or more states, such as `Yes` and `No`.\n"
+					;
+					switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,41,&tog_dflt,0
+						,"Toggle Options",opt)) {
+						case -1:
+							done=1;
+							break;
 						case 0:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Total Time Allowed Per Day"
-								,ultoa(cfg.level_timeperday[i],tmp,10),4
-								,K_NUMBER|K_EDIT);
-							cfg.level_timeperday[i]=atoi(tmp);
-							if(cfg.level_timeperday[i]>1440)
-								cfg.level_timeperday[i]=1440;
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.uq&UQ_ALIASES ? 0:1;
+							uifc.helpbuf=
+								"`Allow Users to Use Aliases:`\n"
+								"\n"
+								"If you want the users of your system to be allowed to be known by a\n"
+								"false name, handle, or alias, set this option to `Yes`. If you want all\n"
+								"users on your system to be known only by their real names, select `No`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Allow Users to Use Aliases",opt);
+							if(!i && !(cfg.uq&UQ_ALIASES)) {
+								cfg.uq|=UQ_ALIASES;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.uq&UQ_ALIASES) {
+								cfg.uq&=~UQ_ALIASES;
+								uifc.changes=1; 
+							}
 							break;
 						case 1:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Time Allowed Per Call"
-								,ultoa(cfg.level_timepercall[i],tmp,10),4
-								,K_NUMBER|K_EDIT);
-							cfg.level_timepercall[i]=atoi(tmp);
-							if(cfg.level_timepercall[i]>1440)
-								cfg.level_timepercall[i]=1440;
-                            break;
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_TIMEBANK ? 0:1;
+							uifc.helpbuf=
+								"`Allow Time Banking:`\n"
+								"\n"
+								"If you want the users of your system to be allowed to be deposit\n"
+								"any extra time they may have left during a call into their minute bank,\n"
+								"set this option to `Yes`. If this option is set to `No`, then the only\n"
+								"way a user may get minutes in their minute bank is to purchase them\n"
+								"with credits.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Allow Users to Depost Time in Minute Bank",opt);
+							if(!i && !(cfg.sys_misc&SM_TIMEBANK)) {
+								cfg.sys_misc|=SM_TIMEBANK;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_TIMEBANK) {
+								cfg.sys_misc&=~SM_TIMEBANK;
+								uifc.changes=1; 
+							}
+							break;
 						case 2:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Calls Allowed Per Day"
-								,ultoa(cfg.level_callsperday[i],tmp,10),4
-								,K_NUMBER|K_EDIT);
-							cfg.level_callsperday[i]=atoi(tmp);
-                            break;
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_NOCDTCVT ? 1:0;
+							uifc.helpbuf=
+								"`Allow Credits to be Converted into Minutes:`\n"
+								"\n"
+								"If you want the users of your system to be allowed to be convert\n"
+								"any credits they may have into minutes for their minute bank,\n"
+								"set this option to `Yes`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Allow Users to Convert Credits into Minutes"
+								,opt);
+							if(!i && cfg.sys_misc&SM_NOCDTCVT) {
+								cfg.sys_misc&=~SM_NOCDTCVT;
+								uifc.changes=1; 
+							}
+							else if(i==1 && !(cfg.sys_misc&SM_NOCDTCVT)) {
+								cfg.sys_misc|=SM_NOCDTCVT;
+								uifc.changes=1; 
+							}
+							break;
 						case 3:
-                            uifc.input(WIN_MID|WIN_SAV,0,0
-                                ,"Email Allowed Per Day"
-								,ultoa(cfg.level_emailperday[i],tmp,10),4
-                                ,K_NUMBER|K_EDIT);
-                            cfg.level_emailperday[i]=atoi(tmp);
-                            break;
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_R_SYSOP ? 0:1;
+							uifc.helpbuf=
+								"`Allow Sysop Logins:`\n"
+								"\n"
+								"If you want to be able to login with sysop access, set this option to `Yes`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Allow Sysop Logins",opt);
+							if(!i && !(cfg.sys_misc&SM_R_SYSOP)) {
+								cfg.sys_misc|=SM_R_SYSOP;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_R_SYSOP) {
+								cfg.sys_misc&=~SM_R_SYSOP;
+								uifc.changes=1; 
+							}
+							break;
 						case 4:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Posts Allowed Per Day"
-								,ultoa(cfg.level_postsperday[i],tmp,10),4
-								,K_NUMBER|K_EDIT);
-							cfg.level_postsperday[i]=atoi(tmp);
-                            break;
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_ECHO_PW ? 0:1;
+							uifc.helpbuf=
+								"`Display/Log Passwords Locally:`\n"
+								"\n"
+								"If you want to passwords to be displayed locally and/or logged to disk\n"
+								"(e.g. when there's a failed login attempt), set this option to `Yes`.\n"
+								"\n"
+								"For elevated security, set this option to `No`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Display/Log Passwords Locally",opt);
+							if(!i && !(cfg.sys_misc&SM_ECHO_PW)) {
+								cfg.sys_misc|=SM_ECHO_PW;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_ECHO_PW) {
+								cfg.sys_misc&=~SM_ECHO_PW;
+								uifc.changes=1; 
+							}
+							break;
 						case 5:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Lines Allowed Per Message (Post/E-mail)"
-								,ultoa(cfg.level_linespermsg[i],tmp,10),5
-								,K_NUMBER|K_EDIT);
-							cfg.level_linespermsg[i]=atoi(tmp);
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_SHRTPAGE ? 0:1;
+							uifc.helpbuf=
+								"`Short Sysop Page:`\n"
+								"\n"
+								"If you would like the sysop page to be a short series of beeps rather\n"
+								"than continuous random tones, set this option to `Yes`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Short Sysop Page"
+								,opt);
+							if(i==1 && cfg.sys_misc&SM_SHRTPAGE) {
+								cfg.sys_misc&=~SM_SHRTPAGE;
+								uifc.changes=1; 
+							}
+							else if(!i && !(cfg.sys_misc&SM_SHRTPAGE)) {
+								cfg.sys_misc|=SM_SHRTPAGE;
+								uifc.changes=1; 
+							}
 							break;
 						case 6:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Free Credits Per Day (in Kilobytes)"
-								,ultoa(cfg.level_freecdtperday[i]/1024L,tmp,10),8
-								,K_EDIT|K_UPPER);
-							cfg.level_freecdtperday[i]=atol(tmp)*1024L;
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_SYSSTAT ? 0:1;
+							uifc.helpbuf=
+								"`Include Sysop Activity in System Statistics:`\n"
+								"\n"
+								"If you want sysops to be included in the statistical data of the BBS,\n"
+								"set this option to `Yes`. The suggested setting for this option is\n"
+								"`No` so that statistical data will only reflect user usage and not\n"
+								"include sysop maintenance activity.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Include Sysop Activity in System Statistics"
+								,opt);
+							if(!i && !(cfg.sys_misc&SM_SYSSTAT)) {
+								cfg.sys_misc|=SM_SYSSTAT;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_SYSSTAT) {
+								cfg.sys_misc&=~SM_SYSSTAT;
+								uifc.changes=1; 
+							}
 							break;
 						case 7:
-							j=0;
-							sprintf(opt[j++],"Default Expired Level "
-								"(Currently %u)",cfg.expired_level);
-							sprintf(opt[j++],"Specific Level");
-							sprintf(opt[j++],"Quick-Validation Set");
-							opt[j][0]=0;
-							j=0;
-							sprintf(str,"Level %u Expires To",i);
-							j=uifc.list(WIN_SAV,2,1,0,&j,0
-								,str,opt);
-							if(j==-1)
-								break;
-							if(j==0) {
-								cfg.level_misc[i]&=
-									~(LEVEL_EXPTOLVL|LEVEL_EXPTOVAL);
-								uifc.changes=1;
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_CLOSED ? 0:1;
+							uifc.helpbuf=
+								"`Closed to New Users:`\n"
+								"\n"
+								"If you want callers to be able to logon as `New`, set this option to `No`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Closed to New Users",opt);
+							if(!i && !(cfg.sys_misc&SM_CLOSED)) {
+								cfg.sys_misc|=SM_CLOSED;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_CLOSED) {
+								cfg.sys_misc&=~SM_CLOSED;
+								uifc.changes=1; 
+							}
+							break;
+						case 8:
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_LISTLOC ? 0:1;
+							uifc.helpbuf=
+								"`User Location in User Lists:`\n"
+								"\n"
+								"If you want user locations (city, state) displayed in the user lists,\n"
+								"set this option to `Yes`. If this option is set to `No`, the user notes\n"
+								"(if they exist) are displayed in the user lists.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"User Location (Instead of Note) in User Lists"
+								,opt);
+							if(!i && !(cfg.sys_misc&SM_LISTLOC)) {
+								cfg.sys_misc|=SM_LISTLOC;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_LISTLOC) {
+								cfg.sys_misc&=~SM_LISTLOC;
+								uifc.changes=1; 
+							}
+							break;
+						case 9:
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_MILITARY ? 0:1;
+							uifc.helpbuf=
+								"`Military:`\n"
+								"\n"
+								"If you would like the time-of-day to be displayed and entered in 24 hour\n"
+								"format always, set this option to `Yes`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Use Military Time Format",opt);
+							if(!i && !(cfg.sys_misc&SM_MILITARY)) {
+								cfg.sys_misc|=SM_MILITARY;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_MILITARY) {
+								cfg.sys_misc&=~SM_MILITARY;
+								uifc.changes=1; 
+							}
+							break;
+						case 10:
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_EURODATE ? 0:1;
+							uifc.helpbuf=
+								"`European Date Format:`\n"
+								"\n"
+								"If you would like dates to be displayed and entered in `DD/MM/YY` format\n"
+								"instead of `MM/DD/YY` format, set this option to `Yes`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"European Date Format",opt);
+							if(!i && !(cfg.sys_misc&SM_EURODATE)) {
+								cfg.sys_misc|=SM_EURODATE;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_EURODATE) {
+								cfg.sys_misc&=~SM_EURODATE;
+								uifc.changes=1; 
+							}
+							break;
+						case 11:
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_TIME_EXP ? 0:1;
+							uifc.helpbuf=
+								"`User Expires When Out-of-time:`\n"
+								"\n"
+								"If you want users to be set to `Expired User Values` if they run out of\n"
+								"time online, then set this option to `Yes`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"User Expires When Out-of-time",opt);
+							if(!i && !(cfg.sys_misc&SM_TIME_EXP)) {
+								cfg.sys_misc|=SM_TIME_EXP;
+								uifc.changes=1; 
+							}
+							else if(i==1 && cfg.sys_misc&SM_TIME_EXP) {
+								cfg.sys_misc&=~SM_TIME_EXP;
+								uifc.changes=1; 
+							}
+							break;
+						case 12:
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_NOSYSINFO ? 1:0;
+							uifc.helpbuf=
+								"`Display System Information During Logon:`\n"
+								"\n"
+								"If you want system information displayed during logon, set this option\n"
+								"to `Yes`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Display System Information During Logon",opt);
+							if(!i && cfg.sys_misc&SM_NOSYSINFO) {
+								cfg.sys_misc&=~SM_NOSYSINFO;
+								uifc.changes=1; 
+							}
+							else if(i==1 && !(cfg.sys_misc&SM_NOSYSINFO)) {
+								cfg.sys_misc|=SM_NOSYSINFO;
+								uifc.changes=1; 
+							}
+							break;
+						case 13:
+							strcpy(opt[0],"Yes");
+							strcpy(opt[1],"No");
+							opt[2][0]=0;
+							i=cfg.sys_misc&SM_NONODELIST ? 1:0;
+							uifc.helpbuf=
+								"`Display Active Node List During Logon:`\n"
+								"\n"
+								"If you want the active nodes displayed during logon, set this option\n"
+								"to `Yes`.\n"
+							;
+							i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+								,"Display Active Node List During Logon",opt);
+							if(!i && cfg.sys_misc&SM_NONODELIST) {
+								cfg.sys_misc&=~SM_NONODELIST;
+								uifc.changes=1; 
+							}
+							else if(i==1 && !(cfg.sys_misc&SM_NONODELIST)) {
+								cfg.sys_misc|=SM_NONODELIST;
+								uifc.changes=1; 
+							}
+							break;
+						} 
+					}
+				break;
+			case 10:    /* New User Values */
+				done=0;
+				while(!done) {
+					i=0;
+					sprintf(opt[i++],"%-27.27s%u","Level",cfg.new_level);
+					sprintf(opt[i++],"%-27.27s%s","Flag Set #1"
+						,ltoaf(cfg.new_flags1,str));
+					sprintf(opt[i++],"%-27.27s%s","Flag Set #2"
+						,ltoaf(cfg.new_flags2,str));
+					sprintf(opt[i++],"%-27.27s%s","Flag Set #3"
+						,ltoaf(cfg.new_flags3,str));
+					sprintf(opt[i++],"%-27.27s%s","Flag Set #4"
+						,ltoaf(cfg.new_flags4,str));
+					sprintf(opt[i++],"%-27.27s%s","Exemptions"
+						,ltoaf(cfg.new_exempt,str));
+					sprintf(opt[i++],"%-27.27s%s","Restrictions"
+						,ltoaf(cfg.new_rest,str));
+					sprintf(opt[i++],"%-27.27s%s","Expiration Days"
+						,ultoa(cfg.new_expire,str,10));
+
+					ultoac(cfg.new_cdt,str);
+					sprintf(opt[i++],"%-27.27s%s","Credits",str);
+					ultoac(cfg.new_min,str);
+					sprintf(opt[i++],"%-27.27s%s","Minutes",str);
+					sprintf(opt[i++],"%-27.27s%s","Editor"
+						,cfg.new_xedit);
+					sprintf(opt[i++],"%-27.27s%s","Command Shell"
+						,cfg.shell[cfg.new_shell]->code);
+					if(cfg.new_prot!=' ')
+						sprintf(str,"%c",cfg.new_prot);
+					else
+						strcpy(str,"None");
+					sprintf(opt[i++],"%-27.27s%s","Download Protocol",str);
+					sprintf(opt[i++],"%-27.27s%hu","Days of New Messages", cfg.new_msgscan_init);
+					strcpy(opt[i++],"Default Toggles...");
+					strcpy(opt[i++],"Question Toggles...");
+					opt[i][0]=0;
+					uifc.helpbuf=
+						"`New User Values:`\n"
+						"\n"
+						"This menu allows you to determine the default settings for new users.\n"
+					;
+					switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&new_dflt,0
+						,"New User Values",opt)) {
+						case -1:
+							done=1;
+							break;
+						case 0:
+							ultoa(cfg.new_level,str,10);
+							uifc.helpbuf=
+								"`New User Security Level:`\n"
+								"\n"
+								"This is the security level automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level"
+								,str,2,K_EDIT|K_NUMBER);
+							cfg.new_level=atoi(str);
+							break;
+						case 1:
+							truncsp(ltoaf(cfg.new_flags1,str));
+							uifc.helpbuf=
+								"`New User Security Flags:`\n"
+								"\n"
+								"These are the security flags automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #1"
+								,str,26,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.new_flags1=aftol(str);
+							break;
+						case 2:
+							truncsp(ltoaf(cfg.new_flags2,str));
+							uifc.helpbuf=
+								"`New User Security Flags:`\n"
+								"\n"
+								"These are the security flags automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #2"
+								,str,26,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.new_flags2=aftol(str);
+							break;
+						case 3:
+							truncsp(ltoaf(cfg.new_flags3,str));
+							uifc.helpbuf=
+								"`New User Security Flags:`\n"
+								"\n"
+								"These are the security flags automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #3"
+								,str,26,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.new_flags3=aftol(str);
+							break;
+						case 4:
+							truncsp(ltoaf(cfg.new_flags4,str));
+							uifc.helpbuf=
+								"`New User Security Flags:`\n"
+								"\n"
+								"These are the security flags automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Flag Set #4"
+								,str,26,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.new_flags4=aftol(str);
+							break;
+						case 5:
+							truncsp(ltoaf(cfg.new_exempt,str));
+							uifc.helpbuf=
+								"`New User Exemption Flags:`\n"
+								"\n"
+								"These are the exemptions that are automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26
+								,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.new_exempt=aftol(str);
+							break;
+						case 6:
+							truncsp(ltoaf(cfg.new_rest,str));
+							uifc.helpbuf=
+								"`New User Restriction Flags:`\n"
+								"\n"
+								"These are the restrictions that are automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26
+								,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.new_rest=aftol(str);
+							break;
+						case 7:
+							ultoa(cfg.new_expire,str,10);
+							uifc.helpbuf=
+								"`New User Expiration Days:`\n"
+								"\n"
+								"If you wish new users to have an automatic expiration date, set this\n"
+								"value to the number of days before the user will expire. To disable\n"
+								"New User expiration, set this value to `0`.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Expiration Days",str,4
+								,K_EDIT|K_NUMBER);
+							cfg.new_expire=atoi(str);
+							break;
+						case 8:
+							ultoa(cfg.new_cdt,str,10);
+							uifc.helpbuf=
+								"`New User Credits:`\n"
+								"\n"
+								"This is the amount of credits that are automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Credits",str,10
+								,K_EDIT|K_NUMBER);
+							cfg.new_cdt=atol(str);
+							break;
+						case 9:
+							ultoa(cfg.new_min,str,10);
+							uifc.helpbuf=
+								"`New User Minutes:`\n"
+								"\n"
+								"This is the number of extra minutes automatically given to new users.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Minutes (Time Credit)"
+								,str,10,K_EDIT|K_NUMBER);
+							cfg.new_min=atol(str);
+							break;
+						case 10:
+							if(!cfg.total_xedits) {
+								uifc.msg("No External Editors Configured");
 								break; 
 							}
-							if(j==1) {
-								cfg.level_misc[i]&=~LEVEL_EXPTOVAL;
-								cfg.level_misc[i]|=LEVEL_EXPTOLVL;
+							strcpy(opt[0],"Internal");
+							for(i=1;i<=cfg.total_xedits;i++)
+								strcpy(opt[i],cfg.xedit[i-1]->code);
+							opt[i][0]=0;
+							i=0;
+							uifc.helpbuf=
+								"`New User Editor:`\n"
+								"\n"
+								"You can use this option to select the default editor for new users.\n"
+							;
+							i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0,"Editors",opt);
+							if(i==-1)
+								break;
+							uifc.changes=1;
+							if(i && i<=cfg.total_xedits)
+								sprintf(cfg.new_xedit,"%-.8s",cfg.xedit[i-1]->code);
+							else
+								cfg.new_xedit[0]=0;
+							break;
+						case 11:
+							for(i=0;i<cfg.total_shells && i<MAX_OPTS;i++)
+								sprintf(opt[i],"%-.8s",cfg.shell[i]->code);
+							opt[i][0]=0;
+							i=0;
+							uifc.helpbuf=
+								"`New User Command Shell:`\n"
+								"\n"
+								"You can use this option to select the default command shell for new\n"
+								"users.\n"
+							;
+							i=uifc.list(WIN_SAV|WIN_RHT,2,1,13,&i,0
+								,"Command Shells",opt);
+							if(i==-1)
+								break;
+							cfg.new_shell=i;
+							uifc.changes=1;
+							break;
+						case 12:
+							uifc.helpbuf=
+								"`New User Default Download Protocol:`\n"
+								"\n"
+								"This option allows you to set the default download protocol of new users\n"
+								"(protocol command key or `BLANK` for no default).\n"
+							;
+							sprintf(str,"%c",cfg.new_prot);
+							uifc.input(WIN_SAV|WIN_MID,0,0
+								,"Default Download Protocol (SPACE=Disabled)"
+								,str,1,K_EDIT|K_UPPER);
+							cfg.new_prot=str[0];
+							if(cfg.new_prot<' ')
+								cfg.new_prot=' ';
+							break;
+						case 13:
+							uifc.helpbuf=
+								"`New User Days of New Messages:`\n"
+								"\n"
+								"This option allows you to set the number of days worth of messages\n"
+								"which will be included in the new user's first `new message scan`.\n"
+								"\n"
+								"The value `0` means there will be `no` new messages for the new user.\n"
+							;
+							sprintf(str,"%hu",cfg.new_msgscan_init);
+							uifc.input(WIN_SAV|WIN_MID,0,0
+								,"Days of New Messages for New User's first new message scan"
+								,str,4,K_EDIT|K_NUMBER);
+							cfg.new_msgscan_init=atoi(str);
+							break;
+						case 14:
+							uifc.helpbuf=
+								"`New User Default Toggle Options:`\n"
+								"\n"
+								"This menu contains the default state of new user toggle options. All new\n"
+								"users on your system will have their defaults set according to the\n"
+								"settings on this menu. The user can then change them to his or her\n"
+								"liking.\n"
+								"\n"
+								"See the Synchronet User Manual for more information on the individual\n"
+								"options available.\n"
+							;
+							j=0;
+							k=0;
+							while(1) {
+								i=0;
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Expert Menu Mode"
+									,cfg.new_misc&EXPERT ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Screen Pause"
+									,cfg.new_misc&UPAUSE ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Spinning Cursor"
+									,cfg.new_misc&SPIN ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Clear Screen"
+									,cfg.new_misc&CLRSCRN ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Ask For New Scan"
+									,cfg.new_misc&ASK_NSCAN ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Ask For Your Msg Scan"
+									,cfg.new_misc&ASK_SSCAN ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Automatic New File Scan"
+									,cfg.new_misc&ANFSCAN ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Remember Current Sub-board"
+									,cfg.new_misc&CURSUB ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Batch Download File Flag"
+									,cfg.new_misc&BATCHFLAG ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Extended File Descriptions"
+									,cfg.new_misc&EXTDESC ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Hot Keys"
+									,cfg.new_misc&COLDKEYS ? "No":"Yes");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Auto Hang-up After Xfer"
+									,cfg.new_misc&AUTOHANG ? "Yes":"No");
+								opt[i][0]=0;
+								j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,&k
+									,"Default Toggle Options",opt);
+								if(j==-1)
+									break;
 								uifc.changes=1;
-								uifc.input(WIN_MID|WIN_SAV,0,0
-									,"Expired Level"
-									,ultoa(cfg.level_expireto[i],tmp,10),2
-									,K_EDIT|K_NUMBER);
-								cfg.level_expireto[i]=atoi(tmp);
-								break; 
+								switch(j) {
+									case 0:
+										cfg.new_misc^=EXPERT;
+										break;
+									case 1:
+										cfg.new_misc^=UPAUSE;
+										break;
+									case 2:
+										cfg.new_misc^=SPIN;
+										break;
+									case 3:
+										cfg.new_misc^=CLRSCRN;
+										break;
+									case 4:
+										cfg.new_misc^=ASK_NSCAN;
+										break;
+									case 5:
+										cfg.new_misc^=ASK_SSCAN;
+										break;
+									case 6:
+										cfg.new_misc^=ANFSCAN;
+										break;
+									case 7:
+										cfg.new_misc^=CURSUB;
+										break;
+									case 8:
+										cfg.new_misc^=BATCHFLAG;
+										break;
+									case 9:
+										cfg.new_misc^=EXTDESC;
+										break;
+									case 10:
+										cfg.new_misc^=COLDKEYS;
+										break;
+									case 11:
+										cfg.new_misc^=AUTOHANG;
+										break;
+									
+								} 
 							}
-							cfg.level_misc[i]&=~LEVEL_EXPTOLVL;
-							cfg.level_misc[i]|=LEVEL_EXPTOVAL;
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Quick-Validation Set to Expire To"
-								,ultoa(cfg.level_expireto[i],tmp,10),1
-								,K_EDIT|K_NUMBER);
-							cfg.level_expireto[i]=atoi(tmp);
 							break;
-					} 
-				} 
-			}
-			break;
-		case 14:	/* Expired Acccount Values */
-			dflt=0;
-			done=0;
-			while(!done) {
-				i=0;
-				sprintf(opt[i++],"%-27.27s%u","Level",cfg.expired_level);
-				sprintf(opt[i++],"%-27.27s%s","Flag Set #1 to Remove"
-					,ltoaf(cfg.expired_flags1,str));
-				sprintf(opt[i++],"%-27.27s%s","Flag Set #2 to Remove"
-					,ltoaf(cfg.expired_flags2,str));
-				sprintf(opt[i++],"%-27.27s%s","Flag Set #3 to Remove"
-					,ltoaf(cfg.expired_flags3,str));
-				sprintf(opt[i++],"%-27.27s%s","Flag Set #4 to Remove"
-					,ltoaf(cfg.expired_flags4,str));
-				sprintf(opt[i++],"%-27.27s%s","Exemptions to Remove"
-					,ltoaf(cfg.expired_exempt,str));
-				sprintf(opt[i++],"%-27.27s%s","Restrictions to Add"
-					,ltoaf(cfg.expired_rest,str));
-				opt[i][0]=0;
-				uifc.helpbuf=
-					"`Expired Account Values:`\n"
-					"\n"
-					"If a user's account expires, the security levels for that account will\n"
-					"be modified according to the settings of this menu. The `Main Level` and\n"
-					"`Transfer Level` will be set to the values listed on this menu. The `Main\n"
-					"Flags`, `Transfer Flags`, and `Exemptions` listed on this menu will be\n"
-					"removed from the account if they are set. The `Restrictions` listed will\n"
-					"be added to the account.\n"
-				;
-				switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&dflt,0
-					,"Expired Account Values",opt)) {
-					case -1:
-						done=1;
-						break;
-					case 0:
-						ultoa(cfg.expired_level,str,10);
-						uifc.helpbuf=
-							"`Expired Account Security Level:`\n"
-							"\n"
-							"This is the security level automatically given to expired user accounts.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level"
-							,str,2,K_EDIT|K_NUMBER);
-						cfg.expired_level=atoi(str);
-						break;
-					case 1:
-						truncsp(ltoaf(cfg.expired_flags1,str));
-						uifc.helpbuf=
-							"`Expired Security Flags to Remove:`\n"
-							"\n"
-							"These are the security flags automatically removed when a user account\n"
-							"has expired.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #1"
-							,str,26,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.expired_flags1=aftol(str);
-						break;
-					case 2:
-						truncsp(ltoaf(cfg.expired_flags2,str));
-						uifc.helpbuf=
-							"`Expired Security Flags to Remove:`\n"
-							"\n"
-							"These are the security flags automatically removed when a user account\n"
-							"has expired.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #2"
-							,str,26,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.expired_flags2=aftol(str);
-                        break;
-					case 3:
-						truncsp(ltoaf(cfg.expired_flags3,str));
-						uifc.helpbuf=
-							"`Expired Security Flags to Remove:`\n"
-							"\n"
-							"These are the security flags automatically removed when a user account\n"
-							"has expired.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #3"
-							,str,26,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.expired_flags3=aftol(str);
-                        break;
-					case 4:
-						truncsp(ltoaf(cfg.expired_flags4,str));
-						uifc.helpbuf=
-							"`Expired Security Flags to Remove:`\n"
-							"\n"
-							"These are the security flags automatically removed when a user account\n"
-							"has expired.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #4"
-							,str,26,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.expired_flags4=aftol(str);
-                        break;
-					case 5:
-						truncsp(ltoaf(cfg.expired_exempt,str));
-						uifc.helpbuf=
-							"`Expired Exemption Flags to Remove:`\n"
-							"\n"
-							"These are the exemptions that are automatically removed from a user\n"
-							"account if it expires.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26
-							,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.expired_exempt=aftol(str);
-						break;
-					case 6:
-						truncsp(ltoaf(cfg.expired_rest,str));
-						uifc.helpbuf=
-							"`Expired Restriction Flags to Add:`\n"
-							"\n"
-							"These are the restrictions that are automatically added to a user\n"
-							"account if it expires.\n"
-						;
-						uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26
-							,K_EDIT|K_UPPER|K_ALPHA);
-						cfg.expired_rest=aftol(str);
+						case 15:
+							uifc.helpbuf=
+								"`New User Question Toggle Options:`\n"
+								"\n"
+								"This menu allows you to decide which questions will be asked of a new\n"
+								"user.\n"
+							;
+							j=0;
+							k=0;
+							while(1) {
+								i=0;
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Real Name"
+									,cfg.uq&UQ_REALNAME ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Force Unique Real Name"
+									,cfg.uq&UQ_DUPREAL ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Force Upper/Lower Case"
+									,cfg.uq&UQ_NOUPRLWR ? "No":"Yes");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Company Name"
+									,cfg.uq&UQ_COMPANY ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Chat Handle / Call Sign"
+									,cfg.uq&UQ_HANDLE ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Force Unique Handle / Call Sign"
+									,cfg.uq&UQ_DUPHAND ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"E-mail/NetMail Address"
+									,cfg.uq&UQ_NONETMAIL ? "No":"Yes");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Sex (Gender)"
+									,cfg.uq&UQ_SEX ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Birthday"
+									,cfg.uq&UQ_BIRTH ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Address and Zip Code"
+									,cfg.uq&UQ_ADDRESS ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Location"
+									,cfg.uq&UQ_LOCATION ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Require Comma in Location"
+									,cfg.uq&UQ_NOCOMMAS ? "No":"Yes");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Phone Number"
+									,cfg.uq&UQ_PHONE ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Allow EX-ASCII in Answers"
+									,cfg.uq&UQ_NOEXASC ? "No":"Yes");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"External Editor"
+									,cfg.uq&UQ_XEDIT ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Command Shell"
+									,cfg.uq&UQ_CMDSHELL ? "Yes":"No");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Default Settings"
+									,cfg.uq&UQ_NODEF ? "No":"Yes");
+								sprintf(opt[i++],"%-27.27s %-3.3s"
+									,"Color Terminal"
+									,cfg.uq&UQ_COLORTERM ? "Yes":"No");
+								opt[i][0]=0;
+								j=uifc.list(WIN_BOT|WIN_RHT,2,1,0,&j,&k
+									,"New User Questions",opt);
+								if(j==-1)
+									break;
+								uifc.changes=1;
+								switch(j) {
+									case 0:
+										cfg.uq^=UQ_REALNAME;
+										break;
+									case 1:
+										cfg.uq^=UQ_DUPREAL;
+										break;
+									case 2:
+										cfg.uq^=UQ_NOUPRLWR;
+										break;
+									case 3:
+										cfg.uq^=UQ_COMPANY;
+										break;
+									case 4:
+										cfg.uq^=UQ_HANDLE;
+										break;
+									case 5:
+										cfg.uq^=UQ_DUPHAND;
+										break;
+									case 6:
+										cfg.uq^=UQ_NONETMAIL;
+										break;
+									case 7:
+										cfg.uq^=UQ_SEX;
+										break;
+									case 8:
+										cfg.uq^=UQ_BIRTH;
+										break;
+									case 9:
+										cfg.uq^=UQ_ADDRESS;
+										break;
+									case 10:
+										cfg.uq^=UQ_LOCATION;
+										break;
+									case 11:
+										cfg.uq^=UQ_NOCOMMAS;
+										break;
+									case 12:
+										cfg.uq^=UQ_PHONE;
+										break;
+									case 13:
+										cfg.uq^=UQ_NOEXASC;
+										break;
+									case 14:
+										cfg.uq^=UQ_XEDIT;
+										break;
+									case 15:
+										cfg.uq^=UQ_CMDSHELL;
+										break;
+									case 16:
+										cfg.uq^=UQ_NODEF;
+										break;
+									case 17:
+										cfg.uq^=UQ_COLORTERM;
+										break;
+								} 
+							}
 						break; 
 					} 
-			}
-			break;
-		case 15:	/* Quick-Validation Values */
-			dflt=0;
-			k=0;
-			while(1) {
-				for(i=0;i<10;i++)
-					sprintf(opt[i],"%d  SL: %-2d  F1: %s"
-						,i,cfg.val_level[i],ltoaf(cfg.val_flags1[i],str));
-				opt[i][0]=0;
-				i=0;
-				uifc.helpbuf=
-					"`Quick-Validation Values:`\n"
-					"\n"
-					"This is a list of the ten quick-validation sets. These sets are used to\n"
-					"quickly set a user's security values (Level, Flags, Exemptions,\n"
-					"Restrictions, Expiration Date, and Credits) with one key stroke. The\n"
-					"user's expiration date may be extended and additional credits may also\n"
-					"be added using quick-validation sets.\n"
-					"\n"
-					"Holding down ~ ALT ~ and one of the number keys (`1-9`) while a user\n"
-					"is online, automatically sets his or user security values to the\n"
-					"quick-validation set for that number key.\n"
-					"\n"
-					"From within the `User Edit` function, a sysop can use the `V`alidate\n"
-					"User command and select from this quick-validation list to change a\n"
-					"user's security values with very few key-strokes.\n"
-				;
-				i=uifc.list(WIN_RHT|WIN_BOT|WIN_ACT|WIN_SAV,0,0,0,&dflt,0
-					,"Quick-Validation Values",opt);
-				if(i==-1)
-                    break;
-				sprintf(str,"Quick-Validation Set %d",i);
-				while(1) {
-					j=0;
-					sprintf(opt[j++],"%-22.22s%u","Level",cfg.val_level[i]);
-					sprintf(opt[j++],"%-22.22s%s","Flag Set #1"
-						,ltoaf(cfg.val_flags1[i],tmp));
-					sprintf(opt[j++],"%-22.22s%s","Flag Set #2"
-						,ltoaf(cfg.val_flags2[i],tmp));
-					sprintf(opt[j++],"%-22.22s%s","Flag Set #3"
-						,ltoaf(cfg.val_flags3[i],tmp));
-					sprintf(opt[j++],"%-22.22s%s","Flag Set #4"
-						,ltoaf(cfg.val_flags4[i],tmp));
-					sprintf(opt[j++],"%-22.22s%s","Exemptions"
-						,ltoaf(cfg.val_exempt[i],tmp));
-					sprintf(opt[j++],"%-22.22s%s","Restrictions"
-						,ltoaf(cfg.val_rest[i],tmp));
-					sprintf(opt[j++],"%-22.22s%u days","Extend Expiration"
-						,cfg.val_expire[i]);
-					sprintf(opt[j++],"%-22.22s%u","Additional Credits"
-						,cfg.val_cdt[i]);
-					opt[j][0]=0;
-					j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0
-						,str,opt);
-					if(j==-1)
-						break;
-					switch(j) {
+				}
+				break;
+			case 11:	/* Advanced Options */
+				done=0;
+				while(!done) {
+					i=0;
+					sprintf(opt[i++],"%-27.27s%s","New User Magic Word",cfg.new_magic);
+					sprintf(opt[i++],"%-27.27s%.40s","Data Directory"
+						,cfg.data_dir);
+					sprintf(opt[i++],"%-27.27s%.40s","Logs Directory"
+						,cfg.logs_dir);
+					sprintf(opt[i++],"%-27.27s%.40s","Exec Directory"
+						,cfg.exec_dir);
+					sprintf(opt[i++],"%-27.27s%.40s","Mods Directory"
+						,cfg.mods_dir);
+					sprintf(opt[i++],"%-27.27s%s","Input SIF Questionnaire"
+						,cfg.new_sif);
+					sprintf(opt[i++],"%-27.27s%s","Output SIF Questionnaire"
+						,cfg.new_sof);
+					ultoac(cfg.cdt_per_dollar,str);
+					sprintf(opt[i++],"%-27.27s%s","Credits Per Dollar",str);
+					sprintf(opt[i++],"%-27.27s%u","Minutes Per 100k Credits"
+						,cfg.cdt_min_value);
+					sprintf(opt[i++],"%-27.27s%s","Maximum Number of Minutes"
+						,cfg.max_minutes ? ultoa(cfg.max_minutes,tmp,10) : "Unlimited");
+					sprintf(opt[i++],"%-27.27s%u","Warning Days Till Expire"
+						,cfg.sys_exp_warn);
+					sprintf(opt[i++],"%-27.27s%u","Last Displayable Node"
+						,cfg.sys_lastnode);
+					sprintf(opt[i++],"%-27.27s%s","Phone Number Format"
+						,cfg.sys_phonefmt);
+					sprintf(opt[i++],"%-27.27s%.40s","Sysop Chat Override"
+						,cfg.sys_chat_arstr);
+					if(cfg.user_backup_level)
+						sprintf(str,"%hu",cfg.user_backup_level);
+					else
+						strcpy(str,"None");
+					sprintf(opt[i++],"%-27.27s%s","User Database Backups",str);
+					if(cfg.mail_backup_level)
+						sprintf(str,"%hu",cfg.mail_backup_level);
+					else
+						strcpy(str,"None");
+					sprintf(opt[i++],"%-27.27s%s","Mail Database Backups",str);
+					sprintf(opt[i++],"%-27.27s%"PRIX32,"Control Key Pass-through"
+						,cfg.ctrlkey_passthru);
+					opt[i][0]=0;
+					uifc.helpbuf=
+						"`System Advanced Options:`\n"
+						"\n"
+						"Care should be taken when modifying any of the options listed here.\n"
+					;
+					switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&adv_dflt,0
+						,"Advanced Options",opt)) {
+						case -1:
+							done=1;
+							break;
+
 						case 0:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Level"
-								,ultoa(cfg.val_level[i],tmp,10),2
-								,K_NUMBER|K_EDIT);
-							cfg.val_level[i]=atoi(tmp);
+							uifc.helpbuf=
+								"`New User Magic Word:`\n"
+								"\n"
+								"If this field has a value, it is assumed the sysop has placed some\n"
+								"reference to this `magic word` in `text/newuser.msg` and new users\n"
+								"will be prompted for the magic word after they enter their password.\n"
+								"If they do not enter it correctly, it is assumed they didn't read the\n"
+								"new user information displayed to them and they are disconnected.\n"
+								"\n"
+								"Think of it as a password to guarantee that new users read the text\n"
+								"displayed to them.\n"
+							;
+							uifc.input(WIN_MID,0,0,"New User Magic Word",cfg.new_magic,sizeof(cfg.new_magic)-1
+								,K_EDIT|K_UPPER);
 							break;
 						case 1:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Flag Set #1"
-								,truncsp(ltoaf(cfg.val_flags1[i],tmp)),26
-								,K_UPPER|K_ALPHA|K_EDIT);
-							cfg.val_flags1[i]=aftol(tmp);
-                            break;
+							uifc.helpbuf=
+								"`Data File Directory:`\n"
+								"\n"
+								"The Synchronet data directory contains almost all the data for your BBS.\n"
+								"This directory must be located where `ALL` nodes can access it and\n"
+								"`MUST NOT` be placed on a RAM disk or other volatile media.\n"
+								"\n"
+								"This option allows you to change the location of your data directory.\n"
+							;
+							strcpy(str,cfg.data_dir);
+							if(uifc.input(WIN_MID|WIN_SAV,0,9,"Data Directory"
+								,str,sizeof(cfg.data_dir)-1,K_EDIT)>0) {
+								backslash(str);
+								SAFECOPY(cfg.data_dir,str); 
+							}
+							break;
 						case 2:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Flag Set #2"
-								,truncsp(ltoaf(cfg.val_flags2[i],tmp)),26
-								,K_UPPER|K_ALPHA|K_EDIT);
-							cfg.val_flags2[i]=aftol(tmp);
-                            break;
+							uifc.helpbuf=
+								"`Log File Directory:`\n"
+								"\n"
+								"Log files will be stored in this directory.\n"
+							;
+							strcpy(str,cfg.logs_dir);
+							if(uifc.input(WIN_MID|WIN_SAV,0,9,"Logs Directory"
+								,str,sizeof(cfg.logs_dir)-1,K_EDIT)>0) {
+								backslash(str);
+								SAFECOPY(cfg.logs_dir,str); 
+							}
+							break;
 						case 3:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Flag Set #3"
-								,truncsp(ltoaf(cfg.val_flags3[i],tmp)),26
-								,K_UPPER|K_ALPHA|K_EDIT);
-							cfg.val_flags3[i]=aftol(tmp);
-                            break;
+							uifc.helpbuf=
+								"`Executable/Module File Directory:`\n"
+								"\n"
+								"The Synchronet exec directory contains executable files that your BBS\n"
+								"executes. This directory does `not` need to be in your DOS search path.\n"
+								"If you place programs in this directory for the BBS to execute, you\n"
+								"should place the `%!` abbreviation for the exec directory at the\n"
+								"beginning of the configured command-lines.\n"
+								"\n"
+								"This option allows you to change the location of your exec directory.\n"
+							;
+							strcpy(str,cfg.exec_dir);
+							if(uifc.input(WIN_MID|WIN_SAV,0,9,"Exec Directory"
+								,str,sizeof(cfg.exec_dir)-1,K_EDIT)>0) {
+								backslash(str);
+								SAFECOPY(cfg.exec_dir,str); 
+							}
+							break;
 						case 4:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Flag Set #4"
-								,truncsp(ltoaf(cfg.val_flags4[i],tmp)),26
-								,K_UPPER|K_ALPHA|K_EDIT);
-							cfg.val_flags4[i]=aftol(tmp);
-                            break;
+							uifc.helpbuf=
+								"`Modified Modules Directory:`\n"
+								"\n"
+								"This optional directory can be used to specify a location where modified\n"
+								"module files are stored. These modified modules will take precedence over\n"
+								"stock modules with the same filename (in the exec directory) and will\n"
+								"not be overwritten by future updates/upgrades.\n"
+								"\n"
+								"If this directory is `blank`, then this feature is not used and all modules\n"
+								"are assumed to be located in the `exec` directory.\n"
+							;
+							strcpy(str,cfg.mods_dir);
+							if(uifc.input(WIN_MID|WIN_SAV,0,9,"Mods Directory"
+								,str,sizeof(cfg.mods_dir)-1,K_EDIT)>0) {
+								backslash(str);
+								SAFECOPY(cfg.mods_dir,str); 
+							}
+							break;
 						case 5:
+							strcpy(str,cfg.new_sif);
+							uifc.helpbuf=
+								"`SIF Questionnaire for User Input:`\n"
+								"\n"
+								"This is the name of a SIF questionnaire file that resides your text\n"
+								"directory that all users will be prompted to answer.\n"
+							;
 							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Exemption Flags"
-								,truncsp(ltoaf(cfg.val_exempt[i],tmp)),26
-								,K_UPPER|K_ALPHA|K_EDIT);
-							cfg.val_exempt[i]=aftol(tmp);
-                            break;
+								,"SIF Questionnaire for User Input"
+								,str,LEN_CODE,K_UPPER|K_EDIT);
+							if(!str[0] || code_ok(str))
+								strcpy(cfg.new_sif,str);
+							else
+								uifc.msg("Invalid SIF Name");
+							break;
 						case 6:
+							strcpy(str,cfg.new_sof);
+							uifc.helpbuf=
+								"`SIF Questionnaire for Reviewing User Input:`\n"
+								"\n"
+								"This is the SIF file used to review the input of users from the user\n"
+								"edit function.\n"
+							;
 							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Restriction Flags"
-								,truncsp(ltoaf(cfg.val_rest[i],tmp)),26
-								,K_UPPER|K_ALPHA|K_EDIT);
-							cfg.val_rest[i]=aftol(tmp);
+								,"SIF Questionnaire for Reviewing User Input"
+								,str,LEN_CODE,K_EDIT);
+							if(!str[0] || code_ok(str))
+								strcpy(cfg.new_sof,str);
+							else
+								uifc.msg("Invalid SIF Name");
 							break;
 						case 7:
+							uifc.helpbuf=
+								"`Credits Per Dollar:`\n"
+								"\n"
+								"This is the monetary value of a credit (How many credits per dollar).\n"
+								"This value should be a power of 2 (1, 2, 4, 8, 16, 32, 64, 128, etc.)\n"
+								"since credits are usually converted by 100 kilobyte (102400) blocks.\n"
+								"To make a dollar worth two megabytes of credits, set this value to\n"
+								"2,097,152 (a megabyte is 1024*1024 or 1048576).\n"
+							;
+							ultoa(cfg.cdt_per_dollar,str,10);
 							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Days to Extend Expiration"
-								,ultoa(cfg.val_expire[i],tmp,10),4
-								,K_NUMBER|K_EDIT);
-							cfg.val_expire[i]=atoi(tmp);
-                            break;
+								,"Credits Per Dollar",str,10,K_NUMBER|K_EDIT);
+							cfg.cdt_per_dollar=atol(str);
+							break;
 						case 8:
+							uifc.helpbuf=
+								"`Minutes Per 100K Credits:`\n"
+								"\n"
+								"This is the value of a minute of time online. This field is the number\n"
+								"of minutes to give the user in exchange for each 100K credit block.\n"
+							;
+							sprintf(str,"%u",cfg.cdt_min_value);
+							uifc.input(WIN_MID|WIN_SAV,0,0
+								,"Minutes Per 100K Credits",str,5,K_NUMBER|K_EDIT);
+							cfg.cdt_min_value=atoi(str);
+							break;
+						case 9:
+							uifc.helpbuf=
+								"`Maximum Number of Minutes User Can Have:`\n"
+								"\n"
+								"This value is the maximum total number of minutes a user can have. If a\n"
+								"user has this number of minutes or more, they will not be allowed to\n"
+								"convert credits into minutes. A sysop can add minutes to a user's\n"
+								"account regardless of this maximum. If this value is set to `0`, users\n"
+								"will have no limit on the total number of minutes they can have.\n"
+							;
+							sprintf(str,"%"PRIu32,cfg.max_minutes);
+							uifc.input(WIN_MID|WIN_SAV,0,0
+								,"Maximum Number of Minutes a User Can Have "
+								"(0=No Limit)"
+								,str,10,K_NUMBER|K_EDIT);
+							cfg.max_minutes=atol(str);
+							break;
+						case 10:
+							uifc.helpbuf=
+								"`Warning Days Till Expire:`\n"
+								"\n"
+								"If a user's account will expire in this many days or less, the user will\n"
+								"be notified at logon. Setting this value to `0` disables the warning\n"
+								"completely.\n"
+							;
+							sprintf(str,"%u",cfg.sys_exp_warn);
 							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Additional Credits"
-								,ultoa(cfg.val_cdt[i],tmp,10),10
-								,K_NUMBER|K_EDIT);
-							cfg.val_cdt[i]=atol(tmp);
+								,"Warning Days Till Expire",str,5,K_NUMBER|K_EDIT);
+							cfg.sys_exp_warn=atoi(str);
+							break;
+						case 11:
+							uifc.helpbuf=
+								"`Last Displayed Node:`\n"
+								"\n"
+								"This is the number of the last node to display to users in node lists.\n"
+								"This allows the sysop to define the higher numbered nodes as `invisible`\n"
+								"to users.\n"
+							;
+							sprintf(str,"%u",cfg.sys_lastnode);
+							uifc.input(WIN_MID|WIN_SAV,0,0
+								,"Last Displayed Node",str,5,K_NUMBER|K_EDIT);
+							cfg.sys_lastnode=atoi(str);
+							break;
+						case 12:
+							uifc.helpbuf=
+								"`Phone Number Format:`\n"
+								"\n"
+								"This is the format used for phone numbers in your local calling\n"
+								"area. Use `N` for number positions, `A` for alphabetic, or `!` for any\n"
+								"character. All other characters will be static in the phone number\n"
+								"format. An example for North American phone numbers is `NNN-NNN-NNNN`.\n"
+							;
+							uifc.input(WIN_MID|WIN_SAV,0,0
+								,"Phone Number Format",cfg.sys_phonefmt
+								,LEN_PHONE,K_UPPER|K_EDIT);
+							break;
+						case 13:
+							getar("Sysop Chat Override",cfg.sys_chat_arstr);
+							break;
+						case 14:
+							uifc.helpbuf=
+								"`User Database Backups:`\n"
+								"\n"
+								"Setting this option to anything but 0 will enable automatic daily\n"
+								"backups of the user database. This number determines how many backups\n"
+								"to keep on disk.\n"
+							;
+							sprintf(str,"%u",cfg.user_backup_level);
+							uifc.input(WIN_MID|WIN_SAV,0,0
+								,"Number of Daily User Database Backups to Keep"
+								,str,4,K_NUMBER|K_EDIT);
+							cfg.user_backup_level=atoi(str);
+							break;
+						case 15:
+							uifc.helpbuf=
+								"`Mail Database Backups:`\n"
+								"\n"
+								"Setting this option to anything but 0 will enable automatic daily\n"
+								"backups of the mail database. This number determines how many backups\n"
+								"to keep on disk.\n"
+							;
+							sprintf(str,"%u",cfg.mail_backup_level);
+							uifc.input(WIN_MID|WIN_SAV,0,0
+								,"Number of Daily Mail Database Backups to Keep"
+								,str,4,K_NUMBER|K_EDIT);
+							cfg.mail_backup_level=atoi(str);
+							break;
+						case 16:
+							uifc.helpbuf=
+								"`Control Key Pass-through:`\n"
+								"\n"
+								"This value is a 32-bit hexadecimal number. Each set bit represents a\n"
+								"control key combination that will `not` be handled internally by\n"
+								"Synchronet or by a Global Hot Key Event.\n"
+								"\n"
+								"To disable internal handling of the `Ctrl-C` key combination (for example)\n"
+								"set this value to `8`. The value is determined by taking 2 to the power of\n"
+								"the ASCII value of the control character (Ctrl-A is 1, Ctrl-B is 2, \n"
+								"etc.). In the case of Ctrl-C, taking 2 to the power of 3 equals 8.\n"
+								"\n"
+								"To pass-through multiple control key combinations, multiple bits must be\n"
+								"set (or'd together) to create the necessary value, which may require the\n"
+								"use of a hexadecimal calculator.\n"
+								"\n"
+								"If unsure, leave this value set to `0`, the default.\n"
+							;
+							sprintf(str,"%"PRIX32,cfg.ctrlkey_passthru);
+							uifc.input(WIN_MID|WIN_SAV,0,0
+								,"Control Key Pass-through"
+								,str,8,K_UPPER|K_EDIT);
+							cfg.ctrlkey_passthru=strtoul(str,NULL,16);
+							break;
+						} 
+					}
+					break;
+			case 12: /* Loadable Modules */
+				done=0;
+				k=0;
+				while(!done) {
+					i=0;
+					sprintf(opt[i++],"%-16.16s%s","Login",cfg.login_mod);
+					sprintf(opt[i++],"%-16.16s%s","Logon",cfg.logon_mod);
+					sprintf(opt[i++],"%-16.16s%s","Sync",cfg.sync_mod);
+					sprintf(opt[i++],"%-16.16s%s","Logoff",cfg.logoff_mod);
+					sprintf(opt[i++],"%-16.16s%s","Logout",cfg.logout_mod);
+					sprintf(opt[i++],"%-16.16s%s","New User",cfg.newuser_mod);
+					sprintf(opt[i++],"%-16.16s%s","Expired User",cfg.expire_mod);
+					sprintf(opt[i++],"%-16.16s%s","Read Mail",cfg.readmail_mod);
+					sprintf(opt[i++],"%-16.16s%s","Scan Msgs",cfg.scanposts_mod);
+					sprintf(opt[i++],"%-16.16s%s","Scan Subs",cfg.scansubs_mod);
+					opt[i][0]=0;
+					uifc.helpbuf=
+						"`Loadable Modules:`\n"
+						"\n"
+						"Baja modules (`.bin` files) or JavaScript modules (`.js` files) can be\n"
+						"automatically loaded and executed during certain Terminal Server\n"
+						"operations. The name (root filename) of the module can be specified for\n"
+						"each of the available operations listed below:\n"
+						"\n"
+						"`Login`        Required module for interactive terminal logins (answer)\n"
+						"`Logon`        Executed during terminal logon procedure\n"
+						"`Sync`         Executed when terminal nodes are periodically synchronized\n"
+						"`Logoff`       Executed during terminal logoff procedure (interactive)\n"
+						"`Logout`       Executed during terminal logout procedure (offline)\n"
+						"`New User`     Executed at end of new terminal user creation process\n"
+						"`Expired User` Executed during daily event when user expires (offline)\n"
+						"\n"
+						"Full module command-lines may be used for the operations listed below:\n"
+						"\n"
+						"`Read Mail`    Executed when a user reads email/netmail\n"
+						"`Scan Msgs`    Executed when a user reads or scans a message sub-board\n"
+						"`Scan Subs`    Executed when a user scans one or more sub-boards for msgs\n"
+						"\n"
+						"`Note:` JavaScript modules take precedence over Baja modules if both exist\n"
+						"in your `exec` or `mods` directories.\n"
+					;
+					switch(uifc.list(WIN_ACT|WIN_T2B|WIN_RHT,0,0,32,&k,0
+						,"Loadable Modules",opt)) {
+
+						case -1:
+							done=1;
+							break;
+
+						case 0:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Login Module"
+								,cfg.login_mod,sizeof(cfg.login_mod)-1,K_EDIT);
+							break;
+						case 1:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Logon Module"
+								,cfg.logon_mod,sizeof(cfg.logon_mod)-1,K_EDIT);
+							break;
+						case 2:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Synchronize Module"
+								,cfg.sync_mod,sizeof(cfg.sync_mod)-1,K_EDIT);
+							break;
+						case 3:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Logoff Module"
+								,cfg.logoff_mod,sizeof(cfg.logoff_mod)-1,K_EDIT);
+							break;
+						case 4:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Logout Module"
+								,cfg.logout_mod,sizeof(cfg.logout_mod)-1,K_EDIT);
+							break;
+						case 5:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"New User Module"
+								,cfg.newuser_mod,sizeof(cfg.newuser_mod)-1,K_EDIT);
+							break;
+						case 6:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Expired User Module"
+								,cfg.expire_mod,sizeof(cfg.expire_mod)-1,K_EDIT);
+							break;
+						case 7:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Read Mail Command"
+								,cfg.readmail_mod,sizeof(cfg.readmail_mod)-1,K_EDIT);
+							break;
+						case 8:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Scan Msgs Command"
+								,cfg.scanposts_mod,sizeof(cfg.scanposts_mod)-1,K_EDIT);
+							break;
+						case 9:
+							uifc.input(WIN_MID|WIN_SAV,0,0,"Scan Subs Command"
+								,cfg.scansubs_mod,sizeof(cfg.scansubs_mod)-1,K_EDIT);
+							break;
+					} 
+				}
+				break;
+
+			case 13: /* Security Levels */
+				dflt=bar=0;
+				k=0;
+				while(1) {
+					for(i=0;i<100;i++) {
+						sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L);
+						sprintf(opt[i],"%-2d    %5d %5d "
+							"%5d %5d %5d %5d %6s %7s %2u",i
+							,cfg.level_timeperday[i],cfg.level_timepercall[i]
+							,cfg.level_callsperday[i],cfg.level_emailperday[i]
+							,cfg.level_postsperday[i],cfg.level_linespermsg[i]
+							,tmp
+							,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Val Set" : "Level"
+							,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ?
+								cfg.level_expireto[i] : cfg.expired_level); 
+					}
+					opt[i][0]=0;
+					i=0;
+					uifc.helpbuf=
+						"`Security Level Values:`\n"
+						"\n"
+						"This menu allows you to change the security options for every possible\n"
+						"security level from 0 to 99. The available options for each level are:\n"
+						"\n"
+						"    Time Per Day           Maximum online time per day\n"
+						"    Time Per Call          Maximum online time per call\n"
+						"    Calls Per Day          Maximum number of calls per day\n"
+						"    Email Per Day          Maximum number of email per day\n"
+						"    Posts Per Day          Maximum number of posts per day\n"
+						"    Lines Per Message      Maximum number of lines per message\n"
+						"    Free Credits Per Day   Number of free credits per day\n"
+						"    Expire To              Level or validation set to Expire to\n"
+					;
+					i=uifc.list(WIN_RHT|WIN_ACT,0,3,0,&dflt,&bar
+						,"Level   T/D   T/C   C/D   E/D   P/D   L/M   F/D   "
+							"Expire To",opt);
+					if(i==-1)
+						break;
+					while(1) {
+						sprintf(str,"Security Level %d Values",i);
+						j=0;
+						sprintf(opt[j++],"%-22.22s%-5u","Time Per Day"
+							,cfg.level_timeperday[i]);
+						sprintf(opt[j++],"%-22.22s%-5u","Time Per Call"
+							,cfg.level_timepercall[i]);
+						sprintf(opt[j++],"%-22.22s%-5u","Calls Per Day"
+							,cfg.level_callsperday[i]);
+						sprintf(opt[j++],"%-22.22s%-5u","Email Per Day"
+							,cfg.level_emailperday[i]);
+						sprintf(opt[j++],"%-22.22s%-5u","Posts Per Day"
+							,cfg.level_postsperday[i]);
+						sprintf(opt[j++],"%-22.22s%-5u","Lines Per Message"
+							,cfg.level_linespermsg[i]);
+						sprintf(tmp,"%luk",cfg.level_freecdtperday[i]/1024L);
+						sprintf(opt[j++],"%-22.22s%-6s","Free Credits Per Day"
+							,tmp);
+						sprintf(opt[j++],"%-22.22s%s %u","Expire To"
+							,cfg.level_misc[i]&LEVEL_EXPTOVAL ? "Validation Set"
+								: "Level"
+							,cfg.level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ?
+								cfg.level_expireto[i] : cfg.expired_level);
+						opt[j][0]=0;
+						j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0
+							,str,opt);
+						if(j==-1)
+							break;
+						switch(j) {
+							case 0:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Total Time Allowed Per Day"
+									,ultoa(cfg.level_timeperday[i],tmp,10),4
+									,K_NUMBER|K_EDIT);
+								cfg.level_timeperday[i]=atoi(tmp);
+								if(cfg.level_timeperday[i]>1440)
+									cfg.level_timeperday[i]=1440;
+								break;
+							case 1:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Time Allowed Per Call"
+									,ultoa(cfg.level_timepercall[i],tmp,10),4
+									,K_NUMBER|K_EDIT);
+								cfg.level_timepercall[i]=atoi(tmp);
+								if(cfg.level_timepercall[i]>1440)
+									cfg.level_timepercall[i]=1440;
+								break;
+							case 2:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Calls Allowed Per Day"
+									,ultoa(cfg.level_callsperday[i],tmp,10),4
+									,K_NUMBER|K_EDIT);
+								cfg.level_callsperday[i]=atoi(tmp);
+								break;
+							case 3:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Email Allowed Per Day"
+									,ultoa(cfg.level_emailperday[i],tmp,10),4
+									,K_NUMBER|K_EDIT);
+								cfg.level_emailperday[i]=atoi(tmp);
+								break;
+							case 4:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Posts Allowed Per Day"
+									,ultoa(cfg.level_postsperday[i],tmp,10),4
+									,K_NUMBER|K_EDIT);
+								cfg.level_postsperday[i]=atoi(tmp);
+								break;
+							case 5:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Lines Allowed Per Message (Post/E-mail)"
+									,ultoa(cfg.level_linespermsg[i],tmp,10),5
+									,K_NUMBER|K_EDIT);
+								cfg.level_linespermsg[i]=atoi(tmp);
+								break;
+							case 6:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Free Credits Per Day (in Kilobytes)"
+									,ultoa(cfg.level_freecdtperday[i]/1024L,tmp,10),8
+									,K_EDIT|K_UPPER);
+								cfg.level_freecdtperday[i]=atol(tmp)*1024L;
+								break;
+							case 7:
+								j=0;
+								sprintf(opt[j++],"Default Expired Level "
+									"(Currently %u)",cfg.expired_level);
+								sprintf(opt[j++],"Specific Level");
+								sprintf(opt[j++],"Quick-Validation Set");
+								opt[j][0]=0;
+								j=0;
+								sprintf(str,"Level %u Expires To",i);
+								j=uifc.list(WIN_SAV,2,1,0,&j,0
+									,str,opt);
+								if(j==-1)
+									break;
+								if(j==0) {
+									cfg.level_misc[i]&=
+										~(LEVEL_EXPTOLVL|LEVEL_EXPTOVAL);
+									uifc.changes=1;
+									break; 
+								}
+								if(j==1) {
+									cfg.level_misc[i]&=~LEVEL_EXPTOVAL;
+									cfg.level_misc[i]|=LEVEL_EXPTOLVL;
+									uifc.changes=1;
+									uifc.input(WIN_MID|WIN_SAV,0,0
+										,"Expired Level"
+										,ultoa(cfg.level_expireto[i],tmp,10),2
+										,K_EDIT|K_NUMBER);
+									cfg.level_expireto[i]=atoi(tmp);
+									break; 
+								}
+								cfg.level_misc[i]&=~LEVEL_EXPTOLVL;
+								cfg.level_misc[i]|=LEVEL_EXPTOVAL;
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Quick-Validation Set to Expire To"
+									,ultoa(cfg.level_expireto[i],tmp,10),1
+									,K_EDIT|K_NUMBER);
+								cfg.level_expireto[i]=atoi(tmp);
+								break;
+						} 
+					} 
+				}
+				break;
+			case 14:	/* Expired Acccount Values */
+				dflt=0;
+				done=0;
+				while(!done) {
+					i=0;
+					sprintf(opt[i++],"%-27.27s%u","Level",cfg.expired_level);
+					sprintf(opt[i++],"%-27.27s%s","Flag Set #1 to Remove"
+						,ltoaf(cfg.expired_flags1,str));
+					sprintf(opt[i++],"%-27.27s%s","Flag Set #2 to Remove"
+						,ltoaf(cfg.expired_flags2,str));
+					sprintf(opt[i++],"%-27.27s%s","Flag Set #3 to Remove"
+						,ltoaf(cfg.expired_flags3,str));
+					sprintf(opt[i++],"%-27.27s%s","Flag Set #4 to Remove"
+						,ltoaf(cfg.expired_flags4,str));
+					sprintf(opt[i++],"%-27.27s%s","Exemptions to Remove"
+						,ltoaf(cfg.expired_exempt,str));
+					sprintf(opt[i++],"%-27.27s%s","Restrictions to Add"
+						,ltoaf(cfg.expired_rest,str));
+					opt[i][0]=0;
+					uifc.helpbuf=
+						"`Expired Account Values:`\n"
+						"\n"
+						"If a user's account expires, the security levels for that account will\n"
+						"be modified according to the settings of this menu. The `Main Level` and\n"
+						"`Transfer Level` will be set to the values listed on this menu. The `Main\n"
+						"Flags`, `Transfer Flags`, and `Exemptions` listed on this menu will be\n"
+						"removed from the account if they are set. The `Restrictions` listed will\n"
+						"be added to the account.\n"
+					;
+					switch(uifc.list(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&dflt,0
+						,"Expired Account Values",opt)) {
+						case -1:
+							done=1;
+							break;
+						case 0:
+							ultoa(cfg.expired_level,str,10);
+							uifc.helpbuf=
+								"`Expired Account Security Level:`\n"
+								"\n"
+								"This is the security level automatically given to expired user accounts.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Security Level"
+								,str,2,K_EDIT|K_NUMBER);
+							cfg.expired_level=atoi(str);
+							break;
+						case 1:
+							truncsp(ltoaf(cfg.expired_flags1,str));
+							uifc.helpbuf=
+								"`Expired Security Flags to Remove:`\n"
+								"\n"
+								"These are the security flags automatically removed when a user account\n"
+								"has expired.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #1"
+								,str,26,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.expired_flags1=aftol(str);
+							break;
+						case 2:
+							truncsp(ltoaf(cfg.expired_flags2,str));
+							uifc.helpbuf=
+								"`Expired Security Flags to Remove:`\n"
+								"\n"
+								"These are the security flags automatically removed when a user account\n"
+								"has expired.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #2"
+								,str,26,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.expired_flags2=aftol(str);
+							break;
+						case 3:
+							truncsp(ltoaf(cfg.expired_flags3,str));
+							uifc.helpbuf=
+								"`Expired Security Flags to Remove:`\n"
+								"\n"
+								"These are the security flags automatically removed when a user account\n"
+								"has expired.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #3"
+								,str,26,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.expired_flags3=aftol(str);
+							break;
+						case 4:
+							truncsp(ltoaf(cfg.expired_flags4,str));
+							uifc.helpbuf=
+								"`Expired Security Flags to Remove:`\n"
+								"\n"
+								"These are the security flags automatically removed when a user account\n"
+								"has expired.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Flags Set #4"
+								,str,26,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.expired_flags4=aftol(str);
+							break;
+						case 5:
+							truncsp(ltoaf(cfg.expired_exempt,str));
+							uifc.helpbuf=
+								"`Expired Exemption Flags to Remove:`\n"
+								"\n"
+								"These are the exemptions that are automatically removed from a user\n"
+								"account if it expires.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26
+								,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.expired_exempt=aftol(str);
+							break;
+						case 6:
+							truncsp(ltoaf(cfg.expired_rest,str));
+							uifc.helpbuf=
+								"`Expired Restriction Flags to Add:`\n"
+								"\n"
+								"These are the restrictions that are automatically added to a user\n"
+								"account if it expires.\n"
+							;
+							uifc.input(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26
+								,K_EDIT|K_UPPER|K_ALPHA);
+							cfg.expired_rest=aftol(str);
 							break; 
+						} 
+				}
+				break;
+			case 15:	/* Quick-Validation Values */
+				dflt=0;
+				k=0;
+				while(1) {
+					for(i=0;i<10;i++)
+						sprintf(opt[i],"%d  SL: %-2d  F1: %s"
+							,i,cfg.val_level[i],ltoaf(cfg.val_flags1[i],str));
+					opt[i][0]=0;
+					i=0;
+					uifc.helpbuf=
+						"`Quick-Validation Values:`\n"
+						"\n"
+						"This is a list of the ten quick-validation sets. These sets are used to\n"
+						"quickly set a user's security values (Level, Flags, Exemptions,\n"
+						"Restrictions, Expiration Date, and Credits) with one key stroke. The\n"
+						"user's expiration date may be extended and additional credits may also\n"
+						"be added using quick-validation sets.\n"
+						"\n"
+						"Holding down ~ ALT ~ and one of the number keys (`1-9`) while a user\n"
+						"is online, automatically sets his or user security values to the\n"
+						"quick-validation set for that number key.\n"
+						"\n"
+						"From within the `User Edit` function, a sysop can use the `V`alidate\n"
+						"User command and select from this quick-validation list to change a\n"
+						"user's security values with very few key-strokes.\n"
+					;
+					i=uifc.list(WIN_RHT|WIN_BOT|WIN_ACT|WIN_SAV,0,0,0,&dflt,0
+						,"Quick-Validation Values",opt);
+					if(i==-1)
+						break;
+					sprintf(str,"Quick-Validation Set %d",i);
+					while(1) {
+						j=0;
+						sprintf(opt[j++],"%-22.22s%u","Level",cfg.val_level[i]);
+						sprintf(opt[j++],"%-22.22s%s","Flag Set #1"
+							,ltoaf(cfg.val_flags1[i],tmp));
+						sprintf(opt[j++],"%-22.22s%s","Flag Set #2"
+							,ltoaf(cfg.val_flags2[i],tmp));
+						sprintf(opt[j++],"%-22.22s%s","Flag Set #3"
+							,ltoaf(cfg.val_flags3[i],tmp));
+						sprintf(opt[j++],"%-22.22s%s","Flag Set #4"
+							,ltoaf(cfg.val_flags4[i],tmp));
+						sprintf(opt[j++],"%-22.22s%s","Exemptions"
+							,ltoaf(cfg.val_exempt[i],tmp));
+						sprintf(opt[j++],"%-22.22s%s","Restrictions"
+							,ltoaf(cfg.val_rest[i],tmp));
+						sprintf(opt[j++],"%-22.22s%u days","Extend Expiration"
+							,cfg.val_expire[i]);
+						sprintf(opt[j++],"%-22.22s%u","Additional Credits"
+							,cfg.val_cdt[i]);
+						opt[j][0]=0;
+						j=uifc.list(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0
+							,str,opt);
+						if(j==-1)
+							break;
+						switch(j) {
+							case 0:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Level"
+									,ultoa(cfg.val_level[i],tmp,10),2
+									,K_NUMBER|K_EDIT);
+								cfg.val_level[i]=atoi(tmp);
+								break;
+							case 1:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Flag Set #1"
+									,truncsp(ltoaf(cfg.val_flags1[i],tmp)),26
+									,K_UPPER|K_ALPHA|K_EDIT);
+								cfg.val_flags1[i]=aftol(tmp);
+								break;
+							case 2:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Flag Set #2"
+									,truncsp(ltoaf(cfg.val_flags2[i],tmp)),26
+									,K_UPPER|K_ALPHA|K_EDIT);
+								cfg.val_flags2[i]=aftol(tmp);
+								break;
+							case 3:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Flag Set #3"
+									,truncsp(ltoaf(cfg.val_flags3[i],tmp)),26
+									,K_UPPER|K_ALPHA|K_EDIT);
+								cfg.val_flags3[i]=aftol(tmp);
+								break;
+							case 4:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Flag Set #4"
+									,truncsp(ltoaf(cfg.val_flags4[i],tmp)),26
+									,K_UPPER|K_ALPHA|K_EDIT);
+								cfg.val_flags4[i]=aftol(tmp);
+								break;
+							case 5:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Exemption Flags"
+									,truncsp(ltoaf(cfg.val_exempt[i],tmp)),26
+									,K_UPPER|K_ALPHA|K_EDIT);
+								cfg.val_exempt[i]=aftol(tmp);
+								break;
+							case 6:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Restriction Flags"
+									,truncsp(ltoaf(cfg.val_rest[i],tmp)),26
+									,K_UPPER|K_ALPHA|K_EDIT);
+								cfg.val_rest[i]=aftol(tmp);
+								break;
+							case 7:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Days to Extend Expiration"
+									,ultoa(cfg.val_expire[i],tmp,10),4
+									,K_NUMBER|K_EDIT);
+								cfg.val_expire[i]=atoi(tmp);
+								break;
+							case 8:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Additional Credits"
+									,ultoa(cfg.val_cdt[i],tmp,10),10
+									,K_NUMBER|K_EDIT);
+								cfg.val_cdt[i]=atol(tmp);
+								break; 
+						} 
 					} 
-				} 
-			}
-			break; 
+				}
+				break; 
 		} 
 	}
-
 }
diff --git a/src/sbbs3/scfg/scfgxfr1.c b/src/sbbs3/scfg/scfgxfr1.c
index cbf8ba1e22bd238d47929cfaeda11adffbc6e3f8..6f72310298351249f1c58228f877e6f5b8250521 100644
--- a/src/sbbs3/scfg/scfgxfr1.c
+++ b/src/sbbs3/scfg/scfgxfr1.c
@@ -59,1089 +59,1088 @@ void xfer_opts()
 	static dlevent_t savdlevent;
 	static char savaltpath[LEN_DIR+1];
 
-while(1) {
-	i=0;
-	sprintf(opt[i++],"%-33.33s%uk","Min Bytes Free Disk Space"
-		,cfg.min_dspace);
-	sprintf(opt[i++],"%-33.33s%u","Max Files in Batch UL Queue"
-		,cfg.max_batup);
-	sprintf(opt[i++],"%-33.33s%u","Max Files in Batch DL Queue"
-		,cfg.max_batdn);
-	sprintf(opt[i++],"%-33.33s%u","Max Users in User Transfers"
-		,cfg.max_userxfer);
-	sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Upload"
-		,cfg.cdt_up_pct);
-	sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Download"
-		,cfg.cdt_dn_pct);
-	if(cfg.leech_pct)
-		sprintf(str,"%u%% after %u seconds"
-			,cfg.leech_pct,cfg.leech_sec);
-	else
-		strcpy(str,"Disabled");
-    sprintf(opt[i++],"%-33.33s%s","Long Filenames in Listings"
-        ,cfg.file_misc&FM_NO_LFN ? "No":"Yes");
-	sprintf(opt[i++],"%-33.33s%s","Leech Protocol Detection",str);
-	strcpy(opt[i++],"Viewable Files...");
-	strcpy(opt[i++],"Testable Files...");
-	strcpy(opt[i++],"Download Events...");
-	strcpy(opt[i++],"Extractable Files...");
-	strcpy(opt[i++],"Compressable Files...");
-	strcpy(opt[i++],"Transfer Protocols...");
-	strcpy(opt[i++],"Alternate File Paths...");
-	opt[i][0]=0;
+	while(1) {
+		i=0;
+		sprintf(opt[i++],"%-33.33s%uk","Min Bytes Free Disk Space"
+			,cfg.min_dspace);
+		sprintf(opt[i++],"%-33.33s%u","Max Files in Batch UL Queue"
+			,cfg.max_batup);
+		sprintf(opt[i++],"%-33.33s%u","Max Files in Batch DL Queue"
+			,cfg.max_batdn);
+		sprintf(opt[i++],"%-33.33s%u","Max Users in User Transfers"
+			,cfg.max_userxfer);
+		sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Upload"
+			,cfg.cdt_up_pct);
+		sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Download"
+			,cfg.cdt_dn_pct);
+		if(cfg.leech_pct)
+			sprintf(str,"%u%% after %u seconds"
+				,cfg.leech_pct,cfg.leech_sec);
+		else
+			strcpy(str,"Disabled");
+		sprintf(opt[i++],"%-33.33s%s","Long Filenames in Listings"
+			,cfg.file_misc&FM_NO_LFN ? "No":"Yes");
+		sprintf(opt[i++],"%-33.33s%s","Leech Protocol Detection",str);
+		strcpy(opt[i++],"Viewable Files...");
+		strcpy(opt[i++],"Testable Files...");
+		strcpy(opt[i++],"Download Events...");
+		strcpy(opt[i++],"Extractable Files...");
+		strcpy(opt[i++],"Compressable Files...");
+		strcpy(opt[i++],"Transfer Protocols...");
+		strcpy(opt[i++],"Alternate File Paths...");
+		opt[i][0]=0;
+		uifc.helpbuf=
+			"`File Transfer Configuration:`\n"
+			"\n"
+			"This menu has options and sub-menus that pertain specifically to the\n"
+			"file transfer section of the BBS.\n"
+		;
+		switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&xfr_dflt,0
+			,"File Transfer Configuration",opt)) {
+			case -1:
+				i=save_changes(WIN_MID);
+				if(i==-1)
+					break;
+				if(!i) {
+					write_file_cfg(&cfg,backup_level);
+					refresh_cfg(&cfg);
+				}
+				return;
+			case 0:
+				uifc.helpbuf=
+					"`Minimum Kilobytes Free Disk Space to Allow Uploads:`\n"
+					"\n"
+					"This is the minimum free space in a file directory to allow user\n"
+					"uploads.\n"
+				;
+				uifc.input(WIN_MID,0,0
+					,"Minimum Kilobytes Free Disk Space to Allow Uploads"
+					,ultoa(cfg.min_dspace,tmp,10),5,K_EDIT|K_NUMBER);
+				cfg.min_dspace=atoi(tmp);
+				break;
+			case 1:
+				uifc.helpbuf=
+					"`Maximum Files in Batch Upload Queue:`\n"
+					"\n"
+					"This is the maximum number of files that can be placed in the batch\n"
+					"upload queue.\n"
+				;
+				uifc.input(WIN_MID,0,0,"Maximum Files in Batch Upload Queue"
+					,ultoa(cfg.max_batup,tmp,10),5,K_EDIT|K_NUMBER);
+				cfg.max_batup=atoi(tmp);
+				break;
+			case 2:
+				uifc.helpbuf=
+					"`Maximum Files in Batch Download Queue:`\n"
+					"\n"
+					"This is the maximum number of files that can be placed in the batch\n"
+					"download queue.\n"
+				;
+				uifc.input(WIN_MID,0,0,"Maximum Files in Batch Download Queue"
+					,ultoa(cfg.max_batdn,tmp,10),5,K_EDIT|K_NUMBER);
+				cfg.max_batdn=atoi(tmp);
+				break;
+			case 3:
+				uifc.helpbuf=
+					"`Maximum Destination Users in User to User Transfer:`\n"
+					"\n"
+					"This is the maximum number of users allowed in the destination user list\n"
+					"of a user to user upload.\n"
+				;
+				uifc.input(WIN_MID,0,0
+					,"Maximum Destination Users in User to User Transfers"
+					,ultoa(cfg.max_userxfer,tmp,10),5,K_EDIT|K_NUMBER);
+				cfg.max_userxfer=atoi(tmp);
+				break;
+			case 4:
 	uifc.helpbuf=
-		"`File Transfer Configuration:`\n"
+		"`Default Percentage of Credits to Credit Uploader on Upload:`\n"
 		"\n"
-		"This menu has options and sub-menus that pertain specifically to the\n"
-		"file transfer section of the BBS.\n"
+		"This is the default setting that will be used when new file\n"
+		"directories are created.\n"
 	;
-	switch(uifc.list(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&xfr_dflt,0
-		,"File Transfer Configuration",opt)) {
-		case -1:
-			i=save_changes(WIN_MID);
-			if(i==-1)
+				uifc.input(WIN_MID,0,0
+					,"Default Percentage of Credits to Credit Uploader on Upload"
+					,ultoa(cfg.cdt_up_pct,tmp,10),4,K_EDIT|K_NUMBER);
+				cfg.cdt_up_pct=atoi(tmp);
 				break;
-			if(!i) {
-				write_file_cfg(&cfg,backup_level);
-                refresh_cfg(&cfg);
-            }
-            return;
-		case 0:
-			uifc.helpbuf=
-				"`Minimum Kilobytes Free Disk Space to Allow Uploads:`\n"
-				"\n"
-				"This is the minimum free space in a file directory to allow user\n"
-				"uploads.\n"
-			;
-			uifc.input(WIN_MID,0,0
-				,"Minimum Kilobytes Free Disk Space to Allow Uploads"
-				,ultoa(cfg.min_dspace,tmp,10),5,K_EDIT|K_NUMBER);
-			cfg.min_dspace=atoi(tmp);
-			break;
-		case 1:
-			uifc.helpbuf=
-				"`Maximum Files in Batch Upload Queue:`\n"
-				"\n"
-				"This is the maximum number of files that can be placed in the batch\n"
-				"upload queue.\n"
-			;
-			uifc.input(WIN_MID,0,0,"Maximum Files in Batch Upload Queue"
-				,ultoa(cfg.max_batup,tmp,10),5,K_EDIT|K_NUMBER);
-			cfg.max_batup=atoi(tmp);
-            break;
-		case 2:
-			uifc.helpbuf=
-				"`Maximum Files in Batch Download Queue:`\n"
-				"\n"
-				"This is the maximum number of files that can be placed in the batch\n"
-				"download queue.\n"
-			;
-			uifc.input(WIN_MID,0,0,"Maximum Files in Batch Download Queue"
-				,ultoa(cfg.max_batdn,tmp,10),5,K_EDIT|K_NUMBER);
-			cfg.max_batdn=atoi(tmp);
-            break;
-		case 3:
-			uifc.helpbuf=
-				"`Maximum Destination Users in User to User Transfer:`\n"
-				"\n"
-				"This is the maximum number of users allowed in the destination user list\n"
-				"of a user to user upload.\n"
-			;
-			uifc.input(WIN_MID,0,0
-				,"Maximum Destination Users in User to User Transfers"
-				,ultoa(cfg.max_userxfer,tmp,10),5,K_EDIT|K_NUMBER);
-			cfg.max_userxfer=atoi(tmp);
-			break;
-		case 4:
-uifc.helpbuf=
-	"`Default Percentage of Credits to Credit Uploader on Upload:`\n"
-	"\n"
-	"This is the default setting that will be used when new file\n"
-	"directories are created.\n"
-;
-			uifc.input(WIN_MID,0,0
-				,"Default Percentage of Credits to Credit Uploader on Upload"
-				,ultoa(cfg.cdt_up_pct,tmp,10),4,K_EDIT|K_NUMBER);
-			cfg.cdt_up_pct=atoi(tmp);
-			break;
-		case 5:
-uifc.helpbuf=
-	"`Default Percentage of Credits to Credit Uploader on Download:`\n"
-	"\n"
-	"This is the default setting that will be used when new file\n"
-	"directories are created.\n"
-;
-			uifc.input(WIN_MID,0,0
-				,"Default Percentage of Credits to Credit Uploader on Download"
-				,ultoa(cfg.cdt_dn_pct,tmp,10),4,K_EDIT|K_NUMBER);
-			cfg.cdt_dn_pct=atoi(tmp);
-			break;
-        case 6:
-            strcpy(opt[0],"Yes");
-            strcpy(opt[1],"No");
-            opt[2][0]=0;
-            i=0;
-            uifc.helpbuf=
-	            "`Long Filenames in File Listings:`\n"
-	            "\n"
-	            "If you want long filenames to be displayed in the BBS file listings, set\n"
-	            "this option to `Yes`. Note: This feature requires Windows 98, Windows 2000\n"
-	            "or later.\n"
-            ;
-            i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
-                ,"Long Filenames in Listings (Win98/Win2K)",opt);
-            if(!i && cfg.file_misc&FM_NO_LFN) {
-                cfg.file_misc&=~FM_NO_LFN;
-                uifc.changes=1;
-            } else if(i==1 && !(cfg.file_misc&FM_NO_LFN)) {
-                cfg.file_misc|=FM_NO_LFN;
-                uifc.changes=1;
-            }
-            break;
-
-		case 7:
-			uifc.helpbuf=
-				"`Leech Protocol Detection Percentage:`\n"
-				"\n"
-				"This value is the sensitivity of the leech protocol detection feature of\n"
-				"Synchronet. If the transfer is apparently unsuccessful, but the transfer\n"
-				"time was at least this percentage of the estimated transfer time (based\n"
-				"on the estimated CPS of the connection result code), then a leech\n"
-				"protocol error is issued and the user's leech download counter is\n"
-				"incremented. Setting this value to `0` disables leech protocol detection.\n"
-			;
-			uifc.input(WIN_MID|WIN_SAV,0,0
-				,"Leech Protocol Detection Percentage (0=Disabled)"
-				,ultoa(cfg.leech_pct,tmp,10),3,K_EDIT|K_NUMBER);
-			cfg.leech_pct=atoi(tmp);
-			if(!cfg.leech_pct)
+			case 5:
+	uifc.helpbuf=
+		"`Default Percentage of Credits to Credit Uploader on Download:`\n"
+		"\n"
+		"This is the default setting that will be used when new file\n"
+		"directories are created.\n"
+	;
+				uifc.input(WIN_MID,0,0
+					,"Default Percentage of Credits to Credit Uploader on Download"
+					,ultoa(cfg.cdt_dn_pct,tmp,10),4,K_EDIT|K_NUMBER);
+				cfg.cdt_dn_pct=atoi(tmp);
 				break;
-			uifc.helpbuf=
-				"`Leech Protocol Minimum Time (in Seconds):`\n"
-				"\n"
-				"This option allows you to adjust the sensitivity of the leech protocol\n"
-				"detection feature. This value is the minimum length of transfer time\n"
-				"(in seconds) that must elapse before an aborted tranfser will be\n"
-				"considered a possible leech attempt.\n"
-			;
-			uifc.input(WIN_MID,0,0
-				,"Leech Protocol Minimum Time (in Seconds)"
-				,ultoa(cfg.leech_sec,tmp,10),3,K_EDIT|K_NUMBER);
-			cfg.leech_sec=atoi(tmp);
-			break;
-		case 8: 	/* Viewable file types */
-			while(1) {
-				for(i=0;i<cfg.total_fviews && i<MAX_OPTS;i++)
-					sprintf(opt[i],"%-3.3s  %-40s",cfg.fview[i]->ext,cfg.fview[i]->cmd);
-				opt[i][0]=0;
-				i=WIN_ACT|WIN_SAV;	/* save cause size can change */
-				if(cfg.total_fviews<MAX_OPTS)
-					i|=WIN_INS|WIN_XTR;
-				if(cfg.total_fviews)
-					i|=WIN_DEL|WIN_COPY|WIN_CUT;
-				if(savfview.cmd[0])
-					i|=WIN_PASTE;
+			case 6:
+				strcpy(opt[0],"Yes");
+				strcpy(opt[1],"No");
+				opt[2][0]=0;
+				i=0;
 				uifc.helpbuf=
-					"`Viewable File Types:`\n"
+					"`Long Filenames in File Listings:`\n"
 					"\n"
-					"This is a list of file types that have content information that can be\n"
-					"viewed through the execution of an external program. Here are a couple of\n"
-					"command line examples for a few file types.\n"
+					"If you want long filenames to be displayed in the BBS file listings, set\n"
+					"this option to `Yes`. Note: This feature requires Windows 98, Windows 2000\n"
+					"or later.\n"
 				;
-				i=uifc.list(i,0,0,50,&fview_dflt,NULL,"Viewable File Types",opt);
-				if(i==-1)
-					break;
-				int msk = i & MSK_ON;
-				i &= MSK_OFF;
-				if(msk == MSK_DEL || msk == MSK_CUT) {
-					if(msk == MSK_CUT)
-						savfview = *cfg.fview[i];
-					free(cfg.fview[i]);
-					cfg.total_fviews--;
-					while(i<cfg.total_fviews) {
-						cfg.fview[i]=cfg.fview[i+1];
-						i++; 
-					}
+				i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
+					,"Long Filenames in Listings (Win98/Win2K)",opt);
+				if(!i && cfg.file_misc&FM_NO_LFN) {
+					cfg.file_misc&=~FM_NO_LFN;
+					uifc.changes=1;
+				} else if(i==1 && !(cfg.file_misc&FM_NO_LFN)) {
+					cfg.file_misc|=FM_NO_LFN;
 					uifc.changes=1;
-					continue; 
 				}
-				if(msk == MSK_INS) {
-					if((cfg.fview=(fview_t **)realloc(cfg.fview
-						,sizeof(fview_t *)*(cfg.total_fviews+1)))==NULL) {
-						errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fviews+1);
-						cfg.total_fviews=0;
-						bail(1);
+				break;
+
+			case 7:
+				uifc.helpbuf=
+					"`Leech Protocol Detection Percentage:`\n"
+					"\n"
+					"This value is the sensitivity of the leech protocol detection feature of\n"
+					"Synchronet. If the transfer is apparently unsuccessful, but the transfer\n"
+					"time was at least this percentage of the estimated transfer time (based\n"
+					"on the estimated CPS of the connection result code), then a leech\n"
+					"protocol error is issued and the user's leech download counter is\n"
+					"incremented. Setting this value to `0` disables leech protocol detection.\n"
+				;
+				uifc.input(WIN_MID|WIN_SAV,0,0
+					,"Leech Protocol Detection Percentage (0=Disabled)"
+					,ultoa(cfg.leech_pct,tmp,10),3,K_EDIT|K_NUMBER);
+				cfg.leech_pct=atoi(tmp);
+				if(!cfg.leech_pct)
+					break;
+				uifc.helpbuf=
+					"`Leech Protocol Minimum Time (in Seconds):`\n"
+					"\n"
+					"This option allows you to adjust the sensitivity of the leech protocol\n"
+					"detection feature. This value is the minimum length of transfer time\n"
+					"(in seconds) that must elapse before an aborted tranfser will be\n"
+					"considered a possible leech attempt.\n"
+				;
+				uifc.input(WIN_MID,0,0
+					,"Leech Protocol Minimum Time (in Seconds)"
+					,ultoa(cfg.leech_sec,tmp,10),3,K_EDIT|K_NUMBER);
+				cfg.leech_sec=atoi(tmp);
+				break;
+			case 8: 	/* Viewable file types */
+				while(1) {
+					for(i=0;i<cfg.total_fviews && i<MAX_OPTS;i++)
+						sprintf(opt[i],"%-3.3s  %-40s",cfg.fview[i]->ext,cfg.fview[i]->cmd);
+					opt[i][0]=0;
+					i=WIN_ACT|WIN_SAV;	/* save cause size can change */
+					if(cfg.total_fviews<MAX_OPTS)
+						i|=WIN_INS|WIN_XTR;
+					if(cfg.total_fviews)
+						i|=WIN_DEL|WIN_COPY|WIN_CUT;
+					if(savfview.cmd[0])
+						i|=WIN_PASTE;
+					uifc.helpbuf=
+						"`Viewable File Types:`\n"
+						"\n"
+						"This is a list of file types that have content information that can be\n"
+						"viewed through the execution of an external program. Here are a couple of\n"
+						"command line examples for a few file types.\n"
+					;
+					i=uifc.list(i,0,0,50,&fview_dflt,NULL,"Viewable File Types",opt);
+					if(i==-1)
+						break;
+					int msk = i & MSK_ON;
+					i &= MSK_OFF;
+					if(msk == MSK_DEL || msk == MSK_CUT) {
+						if(msk == MSK_CUT)
+							savfview = *cfg.fview[i];
+						free(cfg.fview[i]);
+						cfg.total_fviews--;
+						while(i<cfg.total_fviews) {
+							cfg.fview[i]=cfg.fview[i+1];
+							i++; 
+						}
+						uifc.changes=1;
 						continue; 
 					}
-					if(!cfg.total_fviews) {
-						if((cfg.fview[0]=(fview_t *)malloc(
-							sizeof(fview_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t));
+					if(msk == MSK_INS) {
+						if((cfg.fview=(fview_t **)realloc(cfg.fview
+							,sizeof(fview_t *)*(cfg.total_fviews+1)))==NULL) {
+							errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fviews+1);
+							cfg.total_fviews=0;
+							bail(1);
 							continue; 
 						}
-						memset(cfg.fview[0],0,sizeof(fview_t));
-						strcpy(cfg.fview[0]->ext,"ZIP");
-						strcpy(cfg.fview[0]->cmd,"%@unzip -vq %s"); 
-					}
-					else {
-						for(j=cfg.total_fviews;j>i;j--)
-							cfg.fview[j]=cfg.fview[j-1];
-						if((cfg.fview[i]=(fview_t *)malloc(
-							sizeof(fview_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t));
-							continue; 
+						if(!cfg.total_fviews) {
+							if((cfg.fview[0]=(fview_t *)malloc(
+								sizeof(fview_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t));
+								continue; 
+							}
+							memset(cfg.fview[0],0,sizeof(fview_t));
+							strcpy(cfg.fview[0]->ext,"ZIP");
+							strcpy(cfg.fview[0]->cmd,"%@unzip -vq %s"); 
+						}
+						else {
+							for(j=cfg.total_fviews;j>i;j--)
+								cfg.fview[j]=cfg.fview[j-1];
+							if((cfg.fview[i]=(fview_t *)malloc(
+								sizeof(fview_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t));
+								continue; 
+							}
+							if(i>=cfg.total_fviews)
+								j=i-1;
+							else
+								j=i+1;
+							*cfg.fview[i]=*cfg.fview[j]; 
 						}
-						if(i>=cfg.total_fviews)
-							j=i-1;
-						else
-							j=i+1;
-						*cfg.fview[i]=*cfg.fview[j]; 
+						cfg.total_fviews++;
+						uifc.changes=1;
+						continue; 
 					}
-					cfg.total_fviews++;
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_COPY) {
-					savfview=*cfg.fview[i];
-					continue; 
-				}
-				if(msk == MSK_PASTE) {
-					*cfg.fview[i]=savfview;
-					uifc.changes=1;
-					continue; 
-				}
-				if (msk != 0)
-					continue;
-				done=0;
-				while(!done) {
-					j=0;
-					sprintf(opt[j++],"%-22.22s%s","File Extension"
-						,cfg.fview[i]->ext);
-					sprintf(opt[j++],"%-22.22s%-40s","Command Line"
-						,cfg.fview[i]->cmd);
-					sprintf(opt[j++],"%-22.22s%s","Access Requirements"
-						,cfg.fview[i]->arstr);
-					opt[j][0]=0;
-					switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fview_opt,0
-						,"Viewable File Type",opt)) {
-						case -1:
-							done=1;
-							break;
-						case 0:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Viewable File Type Extension"
-								,cfg.fview[i]->ext,sizeof(cfg.fview[i]->ext)-1,K_EDIT);
-							break;
-						case 1:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.fview[i]->cmd,sizeof(cfg.fview[i]->cmd)-1,K_EDIT);
-							break;
-						case 2:
-							sprintf(str,"Viewable File Type %s"
-								,cfg.fview[i]->ext);
-							getar(str,cfg.fview[i]->arstr);
-                            break; 
-					} 
-				} 
-			}
-            break;
-		case 9:    /* Testable file types */
-			while(1) {
-				for(i=0;i<cfg.total_ftests && i<MAX_OPTS;i++)
-					sprintf(opt[i],"%-3.3s  %-40s",cfg.ftest[i]->ext,cfg.ftest[i]->cmd);
-				opt[i][0]=0;
-				i=WIN_ACT|WIN_SAV;	/* save cause size can change */
-				if(cfg.total_ftests<MAX_OPTS)
-					i|=WIN_INS|WIN_XTR;
-				if(cfg.total_ftests)
-					i|=WIN_DEL|WIN_COPY|WIN_CUT;
-				if(savftest.cmd[0])
-					i|=WIN_PASTE;
-				uifc.helpbuf=
-					"`Testable File Types:`\n"
-					"\n"
-					"This is a list of file types that will have a command line executed to\n"
-					"test the file integrity upon their upload. The file types are specified\n"
-					"by `extension` and if one file extension is listed more than once, each\n"
-					"command line will be executed. The command lines must return a DOS error\n"
-					"code of 0 (no error) in order for the file to pass the test. This method\n"
-					"of file testing upon upload is also known as an upload event. This test\n"
-					"or event, can do more than just test the file, it can perform any\n"
-					"function that the sysop wishes. Such as adding comments to an archived\n"
-					"file, or extracting an archive and performing a virus scan. While the\n"
-					"external program is executing, a text string is displayed to the user.\n"
-					"This `working string` can be set for each file type and command line\n"
-					"listed.\n"
-				;
-				i=uifc.list(i,0,0,50,&ftest_dflt,NULL,"Testable File Types",opt);
-				if(i==-1)
-					break;
-				int msk = i & MSK_ON;
-				i &= MSK_OFF;
-				if(msk == MSK_DEL || msk == MSK_CUT) {
-					if(msk == MSK_CUT)
-						savftest = *cfg.ftest[i];
-					free(cfg.ftest[i]);
-					cfg.total_ftests--;
-					while(i<cfg.total_ftests) {
-						cfg.ftest[i]=cfg.ftest[i+1];
-						i++; 
+					if(msk == MSK_COPY) {
+						savfview=*cfg.fview[i];
+						continue; 
 					}
-					uifc.changes=1;
-					continue; 
+					if(msk == MSK_PASTE) {
+						*cfg.fview[i]=savfview;
+						uifc.changes=1;
+						continue; 
+					}
+					if (msk != 0)
+						continue;
+					done=0;
+					while(!done) {
+						j=0;
+						sprintf(opt[j++],"%-22.22s%s","File Extension"
+							,cfg.fview[i]->ext);
+						sprintf(opt[j++],"%-22.22s%-40s","Command Line"
+							,cfg.fview[i]->cmd);
+						sprintf(opt[j++],"%-22.22s%s","Access Requirements"
+							,cfg.fview[i]->arstr);
+						opt[j][0]=0;
+						switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fview_opt,0
+							,"Viewable File Type",opt)) {
+							case -1:
+								done=1;
+								break;
+							case 0:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Viewable File Type Extension"
+									,cfg.fview[i]->ext,sizeof(cfg.fview[i]->ext)-1,K_EDIT);
+								break;
+							case 1:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.fview[i]->cmd,sizeof(cfg.fview[i]->cmd)-1,K_EDIT);
+								break;
+							case 2:
+								sprintf(str,"Viewable File Type %s"
+									,cfg.fview[i]->ext);
+								getar(str,cfg.fview[i]->arstr);
+								break; 
+						} 
+					} 
 				}
-				if(msk == MSK_INS) {
-					if((cfg.ftest=(ftest_t **)realloc(cfg.ftest
-						,sizeof(ftest_t *)*(cfg.total_ftests+1)))==NULL) {
-						errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_ftests+1);
-						cfg.total_ftests=0;
-						bail(1);
+				break;
+			case 9:    /* Testable file types */
+				while(1) {
+					for(i=0;i<cfg.total_ftests && i<MAX_OPTS;i++)
+						sprintf(opt[i],"%-3.3s  %-40s",cfg.ftest[i]->ext,cfg.ftest[i]->cmd);
+					opt[i][0]=0;
+					i=WIN_ACT|WIN_SAV;	/* save cause size can change */
+					if(cfg.total_ftests<MAX_OPTS)
+						i|=WIN_INS|WIN_XTR;
+					if(cfg.total_ftests)
+						i|=WIN_DEL|WIN_COPY|WIN_CUT;
+					if(savftest.cmd[0])
+						i|=WIN_PASTE;
+					uifc.helpbuf=
+						"`Testable File Types:`\n"
+						"\n"
+						"This is a list of file types that will have a command line executed to\n"
+						"test the file integrity upon their upload. The file types are specified\n"
+						"by `extension` and if one file extension is listed more than once, each\n"
+						"command line will be executed. The command lines must return a DOS error\n"
+						"code of 0 (no error) in order for the file to pass the test. This method\n"
+						"of file testing upon upload is also known as an upload event. This test\n"
+						"or event, can do more than just test the file, it can perform any\n"
+						"function that the sysop wishes. Such as adding comments to an archived\n"
+						"file, or extracting an archive and performing a virus scan. While the\n"
+						"external program is executing, a text string is displayed to the user.\n"
+						"This `working string` can be set for each file type and command line\n"
+						"listed.\n"
+					;
+					i=uifc.list(i,0,0,50,&ftest_dflt,NULL,"Testable File Types",opt);
+					if(i==-1)
+						break;
+					int msk = i & MSK_ON;
+					i &= MSK_OFF;
+					if(msk == MSK_DEL || msk == MSK_CUT) {
+						if(msk == MSK_CUT)
+							savftest = *cfg.ftest[i];
+						free(cfg.ftest[i]);
+						cfg.total_ftests--;
+						while(i<cfg.total_ftests) {
+							cfg.ftest[i]=cfg.ftest[i+1];
+							i++; 
+						}
+						uifc.changes=1;
 						continue; 
 					}
-					if(!cfg.total_ftests) {
-						if((cfg.ftest[0]=(ftest_t *)malloc(
-							sizeof(ftest_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t));
+					if(msk == MSK_INS) {
+						if((cfg.ftest=(ftest_t **)realloc(cfg.ftest
+							,sizeof(ftest_t *)*(cfg.total_ftests+1)))==NULL) {
+							errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_ftests+1);
+							cfg.total_ftests=0;
+							bail(1);
 							continue; 
 						}
-						memset(cfg.ftest[0],0,sizeof(ftest_t));
-						strcpy(cfg.ftest[0]->ext,"ZIP");
-						strcpy(cfg.ftest[0]->cmd,"%@unzip -tqq %f");
-						strcpy(cfg.ftest[0]->workstr,"Testing ZIP Integrity..."); 
-					}
-					else {
+						if(!cfg.total_ftests) {
+							if((cfg.ftest[0]=(ftest_t *)malloc(
+								sizeof(ftest_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t));
+								continue; 
+							}
+							memset(cfg.ftest[0],0,sizeof(ftest_t));
+							strcpy(cfg.ftest[0]->ext,"ZIP");
+							strcpy(cfg.ftest[0]->cmd,"%@unzip -tqq %f");
+							strcpy(cfg.ftest[0]->workstr,"Testing ZIP Integrity..."); 
+						}
+						else {
 
-						for(j=cfg.total_ftests;j>i;j--)
-							cfg.ftest[j]=cfg.ftest[j-1];
-						if((cfg.ftest[i]=(ftest_t *)malloc(
-							sizeof(ftest_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t));
-							continue; 
+							for(j=cfg.total_ftests;j>i;j--)
+								cfg.ftest[j]=cfg.ftest[j-1];
+							if((cfg.ftest[i]=(ftest_t *)malloc(
+								sizeof(ftest_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t));
+								continue; 
+							}
+							if(i>=cfg.total_ftests)
+								j=i-1;
+							else
+								j=i+1;
+							*cfg.ftest[i]=*cfg.ftest[j]; 
 						}
-						if(i>=cfg.total_ftests)
-							j=i-1;
-						else
-							j=i+1;
-						*cfg.ftest[i]=*cfg.ftest[j]; 
+						cfg.total_ftests++;
+						uifc.changes=1;
+						continue; 
 					}
-					cfg.total_ftests++;
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_COPY) {
-					savftest=*cfg.ftest[i];
-					continue; 
-				}
-				if(msk == MSK_PASTE) {
-					*cfg.ftest[i]=savftest;
-					uifc.changes=1;
-					continue; 
-				}
-				if (msk != 0)
-					continue;
-				done=0;
-				while(!done) {
-					j=0;
-					sprintf(opt[j++],"%-22.22s%s","File Extension"
-						,cfg.ftest[i]->ext);
-					sprintf(opt[j++],"%-22.22s%-40s","Command Line"
-						,cfg.ftest[i]->cmd);
-					sprintf(opt[j++],"%-22.22s%s","Working String"
-						,cfg.ftest[i]->workstr);
-					sprintf(opt[j++],"%-22.22s%s","Access Requirements"
-						,cfg.ftest[i]->arstr);
-					opt[j][0]=0;
-					switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&ftest_opt,0
-						,"Testable File Type",opt)) {
-						case -1:
-							done=1;
-							break;
-						case 0:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Testable File Type Extension"
-								,cfg.ftest[i]->ext,sizeof(cfg.ftest[i]->ext)-1,K_EDIT);
-							break;
-						case 1:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.ftest[i]->cmd,sizeof(cfg.ftest[i]->cmd)-1,K_EDIT);
-							break;
-						case 2:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Working String"
-								,cfg.ftest[i]->workstr,sizeof(cfg.ftest[i]->workstr)-1,K_EDIT|K_MSG);
-							break;
-						case 3:
-							sprintf(str,"Testable File Type %s",cfg.ftest[i]->ext);
-							getar(str,cfg.ftest[i]->arstr);
-							break; 
-					} 
-				} 
-			}
-			break;
-		case 10:    /* Download Events */
-			while(1) {
-				for(i=0;i<cfg.total_dlevents && i<MAX_OPTS;i++)
-					sprintf(opt[i],"%-3.3s  %-40s",cfg.dlevent[i]->ext,cfg.dlevent[i]->cmd);
-				opt[i][0]=0;
-				i=WIN_ACT|WIN_SAV;	/* save cause size can change */
-				if(cfg.total_dlevents<MAX_OPTS)
-					i|=WIN_INS|WIN_XTR;
-				if(cfg.total_dlevents)
-					i|=WIN_DEL|WIN_COPY|WIN_CUT;
-				if(savdlevent.cmd[0])
-					i|=WIN_PASTE;
-				uifc.helpbuf=
-					"`Download Events:`\n"
-					"\n"
-					"This is a list of file types that will have a command line executed to\n"
-					"perform an event upon their download (e.g. trigger a download event).\n"
-					"The file types are specified by `extension` and if one file extension\n"
-					"is listed more than once, each command line will be executed. The\n"
-					"command lines must return a DOS error code of 0 (no error) in order\n"
-					"for the file to pass the test. This test or event, can do more than\n"
-					"just test the file, it can perform any function that the sysop wishes.\n"
-					"Such as adding comments to an archived file, or extracting an archive\n"
-					"and performing a virus scan. While the external program is executing,\n"
-					"a text string is displayed to the user. This `working string` can be set\n"
-					"for each file type and command line listed.\n"
-				;
-				i=uifc.list(i,0,0,50,&dlevent_dflt,NULL,"Download Events",opt);
-				if(i==-1)
-					break;
-				int msk = i & MSK_ON;
-				i &= MSK_OFF;
-				if(msk == MSK_DEL || msk == MSK_CUT) {
-					if(msk == MSK_CUT)
-						savdlevent = *cfg.dlevent[i];
-					free(cfg.dlevent[i]);
-					cfg.total_dlevents--;
-					while(i<cfg.total_dlevents) {
-						cfg.dlevent[i]=cfg.dlevent[i+1];
-						i++; 
+					if(msk == MSK_COPY) {
+						savftest=*cfg.ftest[i];
+						continue; 
 					}
-					uifc.changes=1;
-					continue; 
+					if(msk == MSK_PASTE) {
+						*cfg.ftest[i]=savftest;
+						uifc.changes=1;
+						continue; 
+					}
+					if (msk != 0)
+						continue;
+					done=0;
+					while(!done) {
+						j=0;
+						sprintf(opt[j++],"%-22.22s%s","File Extension"
+							,cfg.ftest[i]->ext);
+						sprintf(opt[j++],"%-22.22s%-40s","Command Line"
+							,cfg.ftest[i]->cmd);
+						sprintf(opt[j++],"%-22.22s%s","Working String"
+							,cfg.ftest[i]->workstr);
+						sprintf(opt[j++],"%-22.22s%s","Access Requirements"
+							,cfg.ftest[i]->arstr);
+						opt[j][0]=0;
+						switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&ftest_opt,0
+							,"Testable File Type",opt)) {
+							case -1:
+								done=1;
+								break;
+							case 0:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Testable File Type Extension"
+									,cfg.ftest[i]->ext,sizeof(cfg.ftest[i]->ext)-1,K_EDIT);
+								break;
+							case 1:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.ftest[i]->cmd,sizeof(cfg.ftest[i]->cmd)-1,K_EDIT);
+								break;
+							case 2:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Working String"
+									,cfg.ftest[i]->workstr,sizeof(cfg.ftest[i]->workstr)-1,K_EDIT|K_MSG);
+								break;
+							case 3:
+								sprintf(str,"Testable File Type %s",cfg.ftest[i]->ext);
+								getar(str,cfg.ftest[i]->arstr);
+								break; 
+						} 
+					} 
 				}
-				if(msk == MSK_INS) {
-					if((cfg.dlevent=(dlevent_t **)realloc(cfg.dlevent
-						,sizeof(dlevent_t *)*(cfg.total_dlevents+1)))==NULL) {
-						errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_dlevents+1);
-						cfg.total_dlevents=0;
-						bail(1);
+				break;
+			case 10:    /* Download Events */
+				while(1) {
+					for(i=0;i<cfg.total_dlevents && i<MAX_OPTS;i++)
+						sprintf(opt[i],"%-3.3s  %-40s",cfg.dlevent[i]->ext,cfg.dlevent[i]->cmd);
+					opt[i][0]=0;
+					i=WIN_ACT|WIN_SAV;	/* save cause size can change */
+					if(cfg.total_dlevents<MAX_OPTS)
+						i|=WIN_INS|WIN_XTR;
+					if(cfg.total_dlevents)
+						i|=WIN_DEL|WIN_COPY|WIN_CUT;
+					if(savdlevent.cmd[0])
+						i|=WIN_PASTE;
+					uifc.helpbuf=
+						"`Download Events:`\n"
+						"\n"
+						"This is a list of file types that will have a command line executed to\n"
+						"perform an event upon their download (e.g. trigger a download event).\n"
+						"The file types are specified by `extension` and if one file extension\n"
+						"is listed more than once, each command line will be executed. The\n"
+						"command lines must return a DOS error code of 0 (no error) in order\n"
+						"for the file to pass the test. This test or event, can do more than\n"
+						"just test the file, it can perform any function that the sysop wishes.\n"
+						"Such as adding comments to an archived file, or extracting an archive\n"
+						"and performing a virus scan. While the external program is executing,\n"
+						"a text string is displayed to the user. This `working string` can be set\n"
+						"for each file type and command line listed.\n"
+					;
+					i=uifc.list(i,0,0,50,&dlevent_dflt,NULL,"Download Events",opt);
+					if(i==-1)
+						break;
+					int msk = i & MSK_ON;
+					i &= MSK_OFF;
+					if(msk == MSK_DEL || msk == MSK_CUT) {
+						if(msk == MSK_CUT)
+							savdlevent = *cfg.dlevent[i];
+						free(cfg.dlevent[i]);
+						cfg.total_dlevents--;
+						while(i<cfg.total_dlevents) {
+							cfg.dlevent[i]=cfg.dlevent[i+1];
+							i++; 
+						}
+						uifc.changes=1;
 						continue; 
 					}
-					if(!cfg.total_dlevents) {
-						if((cfg.dlevent[0]=(dlevent_t *)malloc(
-							sizeof(dlevent_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t));
+					if(msk == MSK_INS) {
+						if((cfg.dlevent=(dlevent_t **)realloc(cfg.dlevent
+							,sizeof(dlevent_t *)*(cfg.total_dlevents+1)))==NULL) {
+							errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_dlevents+1);
+							cfg.total_dlevents=0;
+							bail(1);
 							continue; 
 						}
-						memset(cfg.dlevent[0],0,sizeof(dlevent_t));
-						strcpy(cfg.dlevent[0]->ext,"ZIP");
-						strcpy(cfg.dlevent[0]->cmd,"%@zip -z %f < %zzipmsg.txt");
-						strcpy(cfg.dlevent[0]->workstr,"Adding ZIP Comment..."); 
-					}
-					else {
+						if(!cfg.total_dlevents) {
+							if((cfg.dlevent[0]=(dlevent_t *)malloc(
+								sizeof(dlevent_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t));
+								continue; 
+							}
+							memset(cfg.dlevent[0],0,sizeof(dlevent_t));
+							strcpy(cfg.dlevent[0]->ext,"ZIP");
+							strcpy(cfg.dlevent[0]->cmd,"%@zip -z %f < %zzipmsg.txt");
+							strcpy(cfg.dlevent[0]->workstr,"Adding ZIP Comment..."); 
+						}
+						else {
 
-						for(j=cfg.total_dlevents;j>i;j--)
-							cfg.dlevent[j]=cfg.dlevent[j-1];
-						if((cfg.dlevent[i]=(dlevent_t *)malloc(
-							sizeof(dlevent_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t));
-							continue; 
+							for(j=cfg.total_dlevents;j>i;j--)
+								cfg.dlevent[j]=cfg.dlevent[j-1];
+							if((cfg.dlevent[i]=(dlevent_t *)malloc(
+								sizeof(dlevent_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t));
+								continue; 
+							}
+							if(i>=cfg.total_dlevents)
+								j=i-1;
+							else
+								j=i+1;
+							*cfg.dlevent[i]=*cfg.dlevent[j]; 
 						}
-						if(i>=cfg.total_dlevents)
-							j=i-1;
-						else
-							j=i+1;
-						*cfg.dlevent[i]=*cfg.dlevent[j]; 
+						cfg.total_dlevents++;
+						uifc.changes=1;
+						continue; 
 					}
-					cfg.total_dlevents++;
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_COPY) {
-					savdlevent=*cfg.dlevent[i];
-					continue; 
-				}
-				if(msk == MSK_PASTE) {
-					*cfg.dlevent[i]=savdlevent;
-					uifc.changes=1;
-					continue; 
-				}
-				if (msk != 0)
-					continue;
-				done=0;
-				while(!done) {
-					j=0;
-					sprintf(opt[j++],"%-22.22s%s","File Extension"
-						,cfg.dlevent[i]->ext);
-					sprintf(opt[j++],"%-22.22s%-40s","Command Line"
-						,cfg.dlevent[i]->cmd);
-					sprintf(opt[j++],"%-22.22s%s","Working String"
-						,cfg.dlevent[i]->workstr);
-					sprintf(opt[j++],"%-22.22s%s","Access Requirements"
-						,cfg.dlevent[i]->arstr);
-					opt[j][0]=0;
-					switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&dlevent_opt,0
-						,"Download Event",opt)) {
-						case -1:
-							done=1;
-							break;
-						case 0:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Download Event Extension"
-								,cfg.dlevent[i]->ext,sizeof(cfg.dlevent[i]->ext)-1,K_EDIT);
-							break;
-						case 1:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.dlevent[i]->cmd,sizeof(cfg.dlevent[i]->cmd)-1,K_EDIT);
-							break;
-						case 2:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Working String"
-								,cfg.dlevent[i]->workstr,sizeof(cfg.dlevent[i]->workstr)-1,K_EDIT|K_MSG);
-							break;
-						case 3:
-							sprintf(str,"Download Event %s",cfg.dlevent[i]->ext);
-							getar(str,cfg.dlevent[i]->arstr);
-							break; 
-					} 
-				} 
-			}
-            break;
-		case 11:	 /* Extractable file types */
-            while(1) {
-				for(i=0;i<cfg.total_fextrs && i<MAX_OPTS;i++)
-                    sprintf(opt[i],"%-3.3s  %-40s"
-                        ,cfg.fextr[i]->ext,cfg.fextr[i]->cmd);
-				opt[i][0]=0;
-                i=WIN_ACT|WIN_SAV;  /* save cause size can change */
-				if(cfg.total_fextrs<MAX_OPTS)
-                    i|=WIN_INS|WIN_XTR;
-                if(cfg.total_fextrs)
-                    i|=WIN_DEL|WIN_COPY|WIN_CUT;
-				if(savfextr.cmd[0])
-                    i|=WIN_PASTE;
-                uifc.helpbuf=
-	                "`Extractable File Types:`\n"
-	                "\n"
-	                "This is a list of archive file types that can be extracted to the temp\n"
-	                "directory by an external program. The file types are specified by their\n"
-	                "extension. For each file type you must specify the command line used to\n"
-	                "extract the file(s).\n"
-                ;
-				i=uifc.list(i,0,0,50,&fextr_dflt,NULL,"Extractable File Types",opt);
-                if(i==-1)
-                    break;
-				int msk = i & MSK_ON;
-				i &= MSK_OFF;
-				if(msk == MSK_DEL || msk == MSK_CUT) {
-					if(msk == MSK_CUT)
-						savfextr = *cfg.fextr[i];
-                    free(cfg.fextr[i]);
-                    cfg.total_fextrs--;
-                    while(i<cfg.total_fextrs) {
-                        cfg.fextr[i]=cfg.fextr[i+1];
-                        i++; 
+					if(msk == MSK_COPY) {
+						savdlevent=*cfg.dlevent[i];
+						continue; 
 					}
-                    uifc.changes=1;
-                    continue; 
-				}
-				if(msk == MSK_INS) {
-					if((cfg.fextr=(fextr_t **)realloc(cfg.fextr
-						,sizeof(fextr_t *)*(cfg.total_fextrs+1)))==NULL) {
-						errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fextrs+1);
-						cfg.total_fextrs=0;
-						bail(1);
+					if(msk == MSK_PASTE) {
+						*cfg.dlevent[i]=savdlevent;
+						uifc.changes=1;
 						continue; 
 					}
-                    if(!cfg.total_fextrs) {
-                        if((cfg.fextr[0]=(fextr_t *)malloc(
-                            sizeof(fextr_t)))==NULL) {
-                            errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t));
-                            continue; 
+					if (msk != 0)
+						continue;
+					done=0;
+					while(!done) {
+						j=0;
+						sprintf(opt[j++],"%-22.22s%s","File Extension"
+							,cfg.dlevent[i]->ext);
+						sprintf(opt[j++],"%-22.22s%-40s","Command Line"
+							,cfg.dlevent[i]->cmd);
+						sprintf(opt[j++],"%-22.22s%s","Working String"
+							,cfg.dlevent[i]->workstr);
+						sprintf(opt[j++],"%-22.22s%s","Access Requirements"
+							,cfg.dlevent[i]->arstr);
+						opt[j][0]=0;
+						switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&dlevent_opt,0
+							,"Download Event",opt)) {
+							case -1:
+								done=1;
+								break;
+							case 0:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Download Event Extension"
+									,cfg.dlevent[i]->ext,sizeof(cfg.dlevent[i]->ext)-1,K_EDIT);
+								break;
+							case 1:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.dlevent[i]->cmd,sizeof(cfg.dlevent[i]->cmd)-1,K_EDIT);
+								break;
+							case 2:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Working String"
+									,cfg.dlevent[i]->workstr,sizeof(cfg.dlevent[i]->workstr)-1,K_EDIT|K_MSG);
+								break;
+							case 3:
+								sprintf(str,"Download Event %s",cfg.dlevent[i]->ext);
+								getar(str,cfg.dlevent[i]->arstr);
+								break; 
+						} 
+					} 
+				}
+				break;
+			case 11:	 /* Extractable file types */
+				while(1) {
+					for(i=0;i<cfg.total_fextrs && i<MAX_OPTS;i++)
+						sprintf(opt[i],"%-3.3s  %-40s"
+							,cfg.fextr[i]->ext,cfg.fextr[i]->cmd);
+					opt[i][0]=0;
+					i=WIN_ACT|WIN_SAV;  /* save cause size can change */
+					if(cfg.total_fextrs<MAX_OPTS)
+						i|=WIN_INS|WIN_XTR;
+					if(cfg.total_fextrs)
+						i|=WIN_DEL|WIN_COPY|WIN_CUT;
+					if(savfextr.cmd[0])
+						i|=WIN_PASTE;
+					uifc.helpbuf=
+						"`Extractable File Types:`\n"
+						"\n"
+						"This is a list of archive file types that can be extracted to the temp\n"
+						"directory by an external program. The file types are specified by their\n"
+						"extension. For each file type you must specify the command line used to\n"
+						"extract the file(s).\n"
+					;
+					i=uifc.list(i,0,0,50,&fextr_dflt,NULL,"Extractable File Types",opt);
+					if(i==-1)
+						break;
+					int msk = i & MSK_ON;
+					i &= MSK_OFF;
+					if(msk == MSK_DEL || msk == MSK_CUT) {
+						if(msk == MSK_CUT)
+							savfextr = *cfg.fextr[i];
+						free(cfg.fextr[i]);
+						cfg.total_fextrs--;
+						while(i<cfg.total_fextrs) {
+							cfg.fextr[i]=cfg.fextr[i+1];
+							i++; 
 						}
-						memset(cfg.fextr[0],0,sizeof(fextr_t));
-                        strcpy(cfg.fextr[0]->ext,"ZIP");
-                        strcpy(cfg.fextr[0]->cmd,"%@unzip -Cojqq %f %s -d %g"); 
+						uifc.changes=1;
+						continue; 
 					}
-                    else {
+					if(msk == MSK_INS) {
+						if((cfg.fextr=(fextr_t **)realloc(cfg.fextr
+							,sizeof(fextr_t *)*(cfg.total_fextrs+1)))==NULL) {
+							errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fextrs+1);
+							cfg.total_fextrs=0;
+							bail(1);
+							continue; 
+						}
+						if(!cfg.total_fextrs) {
+							if((cfg.fextr[0]=(fextr_t *)malloc(
+								sizeof(fextr_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t));
+								continue; 
+							}
+							memset(cfg.fextr[0],0,sizeof(fextr_t));
+							strcpy(cfg.fextr[0]->ext,"ZIP");
+							strcpy(cfg.fextr[0]->cmd,"%@unzip -Cojqq %f %s -d %g"); 
+						}
+						else {
 
-                        for(j=cfg.total_fextrs;j>i;j--)
-                            cfg.fextr[j]=cfg.fextr[j-1];
-                        if((cfg.fextr[i]=(fextr_t *)malloc(
-                            sizeof(fextr_t)))==NULL) {
-                            errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t));
-                            continue; 
+							for(j=cfg.total_fextrs;j>i;j--)
+								cfg.fextr[j]=cfg.fextr[j-1];
+							if((cfg.fextr[i]=(fextr_t *)malloc(
+								sizeof(fextr_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t));
+								continue; 
+							}
+							if(i>=cfg.total_fextrs)
+								j=i-1;
+							else
+								j=i+1;
+							*cfg.fextr[i]=*cfg.fextr[j]; 
 						}
-						if(i>=cfg.total_fextrs)
-							j=i-1;
-						else
-							j=i+1;
-                        *cfg.fextr[i]=*cfg.fextr[j]; 
+						cfg.total_fextrs++;
+						uifc.changes=1;
+						continue; 
 					}
-                    cfg.total_fextrs++;
-                    uifc.changes=1;
-                    continue; 
-				}
-				if(msk == MSK_COPY) {
-                    savfextr=*cfg.fextr[i];
-                    continue; 
-				}
-				if(msk == MSK_PASTE) {
-                    *cfg.fextr[i]=savfextr;
-                    uifc.changes=1;
-                    continue; 
-				}
-				if (msk != 0)
-					continue;
-				done=0;
-				while(!done) {
-					j=0;
-					sprintf(opt[j++],"%-22.22s%s","File Extension"
-						,cfg.fextr[i]->ext);
-					sprintf(opt[j++],"%-22.22s%-40s","Command Line"
-						,cfg.fextr[i]->cmd);
-					sprintf(opt[j++],"%-22.22s%s","Access Requirements"
-						,cfg.fextr[i]->arstr);
-					opt[j][0]=0;
-					switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fextr_opt,0
-						,"Extractable File Type",opt)) {
-						case -1:
-							done=1;
-							break;
-						case 0:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Extractable File Type Extension"
-								,cfg.fextr[i]->ext,sizeof(cfg.fextr[i]->ext)-1,K_EDIT);
-							break;
-						case 1:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.fextr[i]->cmd,sizeof(cfg.fextr[i]->cmd)-1,K_EDIT);
-							break;
-						case 2:
-							sprintf(str,"Extractable File Type %s"
-								,cfg.fextr[i]->ext);
-							getar(str,cfg.fextr[i]->arstr);
-                            break; 
-					} 
-				} 
-			}
-            break;
-		case 12:	 /* Compressable file types */
-			while(1) {
-				for(i=0;i<cfg.total_fcomps && i<MAX_OPTS;i++)
-					sprintf(opt[i],"%-3.3s  %-40s",cfg.fcomp[i]->ext,cfg.fcomp[i]->cmd);
-				opt[i][0]=0;
-				i=WIN_ACT|WIN_SAV;	/* save cause size can change */
-				if(cfg.total_fcomps<MAX_OPTS)
-					i|=WIN_INS|WIN_XTR;
-				if(cfg.total_fcomps)
-					i|=WIN_DEL|WIN_COPY|WIN_CUT;
-				if(savfcomp.cmd[0])
-					i|=WIN_PASTE;
-				uifc.helpbuf=
-					"`Compressable File Types:`\n"
-					"\n"
-					"This is a list of compression methods available for different file types.\n"
-					"These will be used for items such as creating QWK packets, temporary\n"
-					"files from the transfer section, and more.\n"
-				;
-				i=uifc.list(i,0,0,50,&fcomp_dflt,NULL,"Compressable File Types",opt);
-				if(i==-1)
-					break;
-				int msk = i & MSK_ON;
-				i &= MSK_OFF;
-				if(msk == MSK_DEL || msk == MSK_CUT) {
-					if(msk == MSK_CUT)
-						savfcomp = *cfg.fcomp[i];
-					free(cfg.fcomp[i]);
-					cfg.total_fcomps--;
-					while(i<cfg.total_fcomps) {
-						cfg.fcomp[i]=cfg.fcomp[i+1];
-						i++; 
+					if(msk == MSK_COPY) {
+						savfextr=*cfg.fextr[i];
+						continue; 
 					}
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_INS) {
-					if((cfg.fcomp=(fcomp_t **)realloc(cfg.fcomp
-						,sizeof(fcomp_t *)*(cfg.total_fcomps+1)))==NULL) {
-						errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fcomps+1);
-						cfg.total_fcomps=0;
-						bail(1);
+					if(msk == MSK_PASTE) {
+						*cfg.fextr[i]=savfextr;
+						uifc.changes=1;
 						continue; 
 					}
-					if(!cfg.total_fcomps) {
-						if((cfg.fcomp[0]=(fcomp_t *)malloc(
-							sizeof(fcomp_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t));
-							continue; 
+					if (msk != 0)
+						continue;
+					done=0;
+					while(!done) {
+						j=0;
+						sprintf(opt[j++],"%-22.22s%s","File Extension"
+							,cfg.fextr[i]->ext);
+						sprintf(opt[j++],"%-22.22s%-40s","Command Line"
+							,cfg.fextr[i]->cmd);
+						sprintf(opt[j++],"%-22.22s%s","Access Requirements"
+							,cfg.fextr[i]->arstr);
+						opt[j][0]=0;
+						switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fextr_opt,0
+							,"Extractable File Type",opt)) {
+							case -1:
+								done=1;
+								break;
+							case 0:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Extractable File Type Extension"
+									,cfg.fextr[i]->ext,sizeof(cfg.fextr[i]->ext)-1,K_EDIT);
+								break;
+							case 1:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.fextr[i]->cmd,sizeof(cfg.fextr[i]->cmd)-1,K_EDIT);
+								break;
+							case 2:
+								sprintf(str,"Extractable File Type %s"
+									,cfg.fextr[i]->ext);
+								getar(str,cfg.fextr[i]->arstr);
+								break; 
+						} 
+					} 
+				}
+				break;
+			case 12:	 /* Compressable file types */
+				while(1) {
+					for(i=0;i<cfg.total_fcomps && i<MAX_OPTS;i++)
+						sprintf(opt[i],"%-3.3s  %-40s",cfg.fcomp[i]->ext,cfg.fcomp[i]->cmd);
+					opt[i][0]=0;
+					i=WIN_ACT|WIN_SAV;	/* save cause size can change */
+					if(cfg.total_fcomps<MAX_OPTS)
+						i|=WIN_INS|WIN_XTR;
+					if(cfg.total_fcomps)
+						i|=WIN_DEL|WIN_COPY|WIN_CUT;
+					if(savfcomp.cmd[0])
+						i|=WIN_PASTE;
+					uifc.helpbuf=
+						"`Compressable File Types:`\n"
+						"\n"
+						"This is a list of compression methods available for different file types.\n"
+						"These will be used for items such as creating QWK packets, temporary\n"
+						"files from the transfer section, and more.\n"
+					;
+					i=uifc.list(i,0,0,50,&fcomp_dflt,NULL,"Compressable File Types",opt);
+					if(i==-1)
+						break;
+					int msk = i & MSK_ON;
+					i &= MSK_OFF;
+					if(msk == MSK_DEL || msk == MSK_CUT) {
+						if(msk == MSK_CUT)
+							savfcomp = *cfg.fcomp[i];
+						free(cfg.fcomp[i]);
+						cfg.total_fcomps--;
+						while(i<cfg.total_fcomps) {
+							cfg.fcomp[i]=cfg.fcomp[i+1];
+							i++; 
 						}
-						memset(cfg.fcomp[0],0,sizeof(fcomp_t));
-						strcpy(cfg.fcomp[0]->ext,"ZIP");
-						strcpy(cfg.fcomp[0]->cmd,"%@zip -jD %f %s"); 
+						uifc.changes=1;
+						continue; 
 					}
-					else {
-						for(j=cfg.total_fcomps;j>i;j--)
-							cfg.fcomp[j]=cfg.fcomp[j-1];
-						if((cfg.fcomp[i]=(fcomp_t *)malloc(
-							sizeof(fcomp_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t));
+					if(msk == MSK_INS) {
+						if((cfg.fcomp=(fcomp_t **)realloc(cfg.fcomp
+							,sizeof(fcomp_t *)*(cfg.total_fcomps+1)))==NULL) {
+							errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_fcomps+1);
+							cfg.total_fcomps=0;
+							bail(1);
 							continue; 
 						}
-						if(i>=cfg.total_fcomps)
-							j=i-1;
-						else
-							j=i+1;
-						*cfg.fcomp[i]=*cfg.fcomp[j]; 
+						if(!cfg.total_fcomps) {
+							if((cfg.fcomp[0]=(fcomp_t *)malloc(
+								sizeof(fcomp_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t));
+								continue; 
+							}
+							memset(cfg.fcomp[0],0,sizeof(fcomp_t));
+							strcpy(cfg.fcomp[0]->ext,"ZIP");
+							strcpy(cfg.fcomp[0]->cmd,"%@zip -jD %f %s"); 
+						}
+						else {
+							for(j=cfg.total_fcomps;j>i;j--)
+								cfg.fcomp[j]=cfg.fcomp[j-1];
+							if((cfg.fcomp[i]=(fcomp_t *)malloc(
+								sizeof(fcomp_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t));
+								continue; 
+							}
+							if(i>=cfg.total_fcomps)
+								j=i-1;
+							else
+								j=i+1;
+							*cfg.fcomp[i]=*cfg.fcomp[j]; 
+						}
+						cfg.total_fcomps++;
+						uifc.changes=1;
+						continue; 
 					}
-					cfg.total_fcomps++;
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_COPY) {
-					savfcomp=*cfg.fcomp[i];
-					continue; 
-				}
-				if(msk == MSK_PASTE) {
-					*cfg.fcomp[i]=savfcomp;
-					uifc.changes=1;
-					continue; 
-				}
-				if (msk != 0)
-					continue;
-				done=0;
-				while(!done) {
-					j=0;
-					sprintf(opt[j++],"%-22.22s%s","File Extension"
-						,cfg.fcomp[i]->ext);
-					sprintf(opt[j++],"%-22.22s%-40s","Command Line"
-						,cfg.fcomp[i]->cmd);
-					sprintf(opt[j++],"%-22.22s%s","Access Requirements"
-						,cfg.fcomp[i]->arstr);
-					opt[j][0]=0;
-					switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fcomp_opt,0
-						,"Compressable File Type",opt)) {
-						case -1:
-							done=1;
-							break;
-						case 0:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Compressable File Type Extension"
-								,cfg.fcomp[i]->ext,sizeof(cfg.fcomp[i]->ext)-1,K_EDIT);
-							break;
-						case 1:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.fcomp[i]->cmd,sizeof(cfg.fcomp[i]->cmd)-1,K_EDIT);
-							break;
-						case 2:
-							sprintf(str,"Compressable File Type %s"
-								,cfg.fcomp[i]->ext);
-							getar(str,cfg.fcomp[i]->arstr);
-                            break; 
-					} 
-				} 
-			}
-            break;
-		case 13:	/* Transfer protocols */
-			while(1) {
-				for(i=0;i<cfg.total_prots && i<MAX_OPTS;i++)
-					sprintf(opt[i],"%c  %s"
-						,cfg.prot[i]->mnemonic,cfg.prot[i]->name);
-				opt[i][0]=0;
-				i=WIN_ACT|WIN_SAV;	/* save cause size can change */
-				if(cfg.total_prots<MAX_OPTS)
-					i|=WIN_INS|WIN_XTR;
-				if(cfg.total_prots)
-					i|=WIN_DEL|WIN_COPY|WIN_CUT;
-				if(savprot.mnemonic)
-					i|=WIN_PASTE;
-				uifc.helpbuf=
-					"`File Transfer Protocols:`\n"
-					"\n"
-					"This is a list of file transfer protocols that can be used to transfer\n"
-					"files either to or from a remote user. For each protocol, you can\n"
-					"specify the mnemonic (hot-key) to use to specify that protocol, the\n"
-					"command line to use for uploads, downloads, batch uploads, batch\n"
-					"downloads, bi-directional file transfers, support of DSZLOG, and (for\n"
-					"*nix only) if it uses socket I/O or the more common stdio.\n"
-					"\n"
-					"If the protocol doesn't support a certain method of transfer, or you\n"
-					"don't wish it to be available for a certain method of transfer, leave\n"
-					"the command line for that method blank.\n"
-				;
-				i=uifc.list(i,0,0,50,&prot_dflt,NULL,"File Transfer Protocols",opt);
-				if(i==-1)
-					break;
-				int msk = i & MSK_ON;
-				i &= MSK_OFF;
-				if(msk == MSK_DEL || msk == MSK_CUT) {
-					if(msk == MSK_CUT)
-						savprot = *cfg.prot[i];
-					free(cfg.prot[i]);
-					cfg.total_prots--;
-					while(i<cfg.total_prots) {
-						cfg.prot[i]=cfg.prot[i+1];
-						i++; 
+					if(msk == MSK_COPY) {
+						savfcomp=*cfg.fcomp[i];
+						continue; 
 					}
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_INS) {
-					if((cfg.prot=(prot_t **)realloc(cfg.prot
-						,sizeof(prot_t *)*(cfg.total_prots+1)))==NULL) {
-						errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_prots+1);
-						cfg.total_prots=0;
-						bail(1);
+					if(msk == MSK_PASTE) {
+						*cfg.fcomp[i]=savfcomp;
+						uifc.changes=1;
 						continue; 
 					}
-					if(!cfg.total_prots) {
-						if((cfg.prot[0]=(prot_t *)malloc(
-							sizeof(prot_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t));
-							continue; 
+					if (msk != 0)
+						continue;
+					done=0;
+					while(!done) {
+						j=0;
+						sprintf(opt[j++],"%-22.22s%s","File Extension"
+							,cfg.fcomp[i]->ext);
+						sprintf(opt[j++],"%-22.22s%-40s","Command Line"
+							,cfg.fcomp[i]->cmd);
+						sprintf(opt[j++],"%-22.22s%s","Access Requirements"
+							,cfg.fcomp[i]->arstr);
+						opt[j][0]=0;
+						switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&fcomp_opt,0
+							,"Compressable File Type",opt)) {
+							case -1:
+								done=1;
+								break;
+							case 0:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Compressable File Type Extension"
+									,cfg.fcomp[i]->ext,sizeof(cfg.fcomp[i]->ext)-1,K_EDIT);
+								break;
+							case 1:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.fcomp[i]->cmd,sizeof(cfg.fcomp[i]->cmd)-1,K_EDIT);
+								break;
+							case 2:
+								sprintf(str,"Compressable File Type %s"
+									,cfg.fcomp[i]->ext);
+								getar(str,cfg.fcomp[i]->arstr);
+								break; 
+						} 
+					} 
+				}
+				break;
+			case 13:	/* Transfer protocols */
+				while(1) {
+					for(i=0;i<cfg.total_prots && i<MAX_OPTS;i++)
+						sprintf(opt[i],"%c  %s"
+							,cfg.prot[i]->mnemonic,cfg.prot[i]->name);
+					opt[i][0]=0;
+					i=WIN_ACT|WIN_SAV;	/* save cause size can change */
+					if(cfg.total_prots<MAX_OPTS)
+						i|=WIN_INS|WIN_XTR;
+					if(cfg.total_prots)
+						i|=WIN_DEL|WIN_COPY|WIN_CUT;
+					if(savprot.mnemonic)
+						i|=WIN_PASTE;
+					uifc.helpbuf=
+						"`File Transfer Protocols:`\n"
+						"\n"
+						"This is a list of file transfer protocols that can be used to transfer\n"
+						"files either to or from a remote user. For each protocol, you can\n"
+						"specify the mnemonic (hot-key) to use to specify that protocol, the\n"
+						"command line to use for uploads, downloads, batch uploads, batch\n"
+						"downloads, bi-directional file transfers, support of DSZLOG, and (for\n"
+						"*nix only) if it uses socket I/O or the more common stdio.\n"
+						"\n"
+						"If the protocol doesn't support a certain method of transfer, or you\n"
+						"don't wish it to be available for a certain method of transfer, leave\n"
+						"the command line for that method blank.\n"
+					;
+					i=uifc.list(i,0,0,50,&prot_dflt,NULL,"File Transfer Protocols",opt);
+					if(i==-1)
+						break;
+					int msk = i & MSK_ON;
+					i &= MSK_OFF;
+					if(msk == MSK_DEL || msk == MSK_CUT) {
+						if(msk == MSK_CUT)
+							savprot = *cfg.prot[i];
+						free(cfg.prot[i]);
+						cfg.total_prots--;
+						while(i<cfg.total_prots) {
+							cfg.prot[i]=cfg.prot[i+1];
+							i++; 
 						}
-						memset(cfg.prot[0],0,sizeof(prot_t));
-						cfg.prot[0]->mnemonic='?';
-					} else {
-						for(j=cfg.total_prots;j>i;j--)
-							cfg.prot[j]=cfg.prot[j-1];
-						if((cfg.prot[i]=(prot_t *)malloc(
-							sizeof(prot_t)))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t));
+						uifc.changes=1;
+						continue; 
+					}
+					if(msk == MSK_INS) {
+						if((cfg.prot=(prot_t **)realloc(cfg.prot
+							,sizeof(prot_t *)*(cfg.total_prots+1)))==NULL) {
+							errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_prots+1);
+							cfg.total_prots=0;
+							bail(1);
 							continue; 
 						}
-						if(i>=cfg.total_prots)
-							j=i-1;
-						else
-							j=i+1;
-						*cfg.prot[i]=*cfg.prot[j]; 
-					}
-					cfg.total_prots++;
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_COPY) {
-					savprot=*cfg.prot[i];
-					continue; 
-				}
-				if(msk == MSK_PASTE) {
-					*cfg.prot[i]=savprot;
-					uifc.changes=1;
-					continue; 
-				}
-				if (msk != 0)
-					continue;
-				done=0;
-				while(!done) {
-					j=0;
-					sprintf(opt[j++],"%-30.30s%c","Mnemonic (Command Key)"
-						,cfg.prot[i]->mnemonic);
-					sprintf(opt[j++],"%-30.30s%-40s","Protocol Name"
-						,cfg.prot[i]->name);
-					sprintf(opt[j++],"%-30.30s%-40s","Access Requirements"
-						,cfg.prot[i]->arstr);
-					sprintf(opt[j++],"%-30.30s%-40s","Upload Command Line"
-						,cfg.prot[i]->ulcmd);
-					sprintf(opt[j++],"%-30.30s%-40s","Download Command Line"
-						,cfg.prot[i]->dlcmd);
-					sprintf(opt[j++],"%-30.30s%-40s","Batch Upload Command Line"
-						,cfg.prot[i]->batulcmd);
-					sprintf(opt[j++],"%-30.30s%-40s","Batch Download Command Line"
-						,cfg.prot[i]->batdlcmd);
-					sprintf(opt[j++],"%-30.30s%-40s","Bi-dir Command Line"
-						,cfg.prot[i]->bicmd);
-					sprintf(opt[j++],"%-30.30s%s",   "Native (32-bit) Executable"
-						,cfg.prot[i]->misc&PROT_NATIVE ? "Yes" : "No");
-					sprintf(opt[j++],"%-30.30s%s",	 "Supports DSZLOG"
-						,cfg.prot[i]->misc&PROT_DSZLOG ? "Yes":"No");
-					sprintf(opt[j++],"%-30.30s%s",	 "Socket I/O"
-						,cfg.prot[i]->misc&PROT_SOCKET ? "Yes":"No");
-					opt[j][0]=0;
-					switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,70,&prot_opt,0
-						,"File Transfer Protocol",opt)) {
-						case -1:
-							done=1;
-							break;
-						case 0:
-							str[0]=cfg.prot[i]->mnemonic;
-							str[1]=0;
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Mnemonic (Command Key)"
-								,str,1,K_UPPER|K_EDIT);
-							if(str[0])
-								cfg.prot[i]->mnemonic=str[0];
-							break;
-						case 1:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Protocol Name"
-								,cfg.prot[i]->name,sizeof(cfg.prot[i]->name)-1,K_EDIT);
-                            break;
-						case 2:
-							sprintf(str,"Protocol %s",cfg.prot[i]->name);
-							getar(str,cfg.prot[i]->arstr);
-							break;
-						case 3:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.prot[i]->ulcmd,sizeof(cfg.prot[i]->ulcmd)-1,K_EDIT);
-							break;
-						case 4:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.prot[i]->dlcmd,sizeof(cfg.prot[i]->dlcmd)-1,K_EDIT);
-                            break;
-						case 5:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.prot[i]->batulcmd,sizeof(cfg.prot[i]->batulcmd)-1,K_EDIT);
-                            break;
-						case 6:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.prot[i]->batdlcmd,sizeof(cfg.prot[i]->batdlcmd)-1,K_EDIT);
-                            break;
-						case 7:
-							uifc.input(WIN_MID|WIN_SAV,0,0
-								,"Command"
-								,cfg.prot[i]->bicmd,sizeof(cfg.prot[i]->bicmd)-1,K_EDIT);
-                            break;
-						case 8:
-							l=cfg.prot[i]->misc&PROT_NATIVE ? 0:1;
-							strcpy(opt[0],"Yes");
-							strcpy(opt[1],"No");
-							opt[2][0]=0;
-							l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0
-								,"Native (32-bit) Executable",opt);
-							if((l==0 && !(cfg.prot[i]->misc&PROT_NATIVE))
-								|| (l==1 && cfg.prot[i]->misc&PROT_NATIVE)) {
-								cfg.prot[i]->misc^=PROT_NATIVE;
-								uifc.changes=1; 
+						if(!cfg.total_prots) {
+							if((cfg.prot[0]=(prot_t *)malloc(
+								sizeof(prot_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t));
+								continue; 
 							}
-							break; 
-						case 9:
-							l=cfg.prot[i]->misc&PROT_DSZLOG ? 0:1;
-							strcpy(opt[0],"Yes");
-							strcpy(opt[1],"No");
-							opt[2][0]=0;
-							l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0
-								,"Uses DSZLOG",opt);
-							if((l==0 && !(cfg.prot[i]->misc&PROT_DSZLOG))
-								|| (l==1 && cfg.prot[i]->misc&PROT_DSZLOG)) {
-								cfg.prot[i]->misc^=PROT_DSZLOG;
-								uifc.changes=1; 
+							memset(cfg.prot[0],0,sizeof(prot_t));
+							cfg.prot[0]->mnemonic='?';
+						} else {
+							for(j=cfg.total_prots;j>i;j--)
+								cfg.prot[j]=cfg.prot[j-1];
+							if((cfg.prot[i]=(prot_t *)malloc(
+								sizeof(prot_t)))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t));
+								continue; 
 							}
-							break; 
-						case 10:
-							l=cfg.prot[i]->misc&PROT_SOCKET ? 0:1l;
-							strcpy(opt[0],"Yes");
-							strcpy(opt[1],"No");
-							opt[2][0]=0;
-							l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0
-								,"Uses Socket I/O",opt);
-							if((l==0 && !(cfg.prot[i]->misc&PROT_SOCKET))
-								|| (l==1 && cfg.prot[i]->misc&PROT_SOCKET)) {
-								cfg.prot[i]->misc^=PROT_SOCKET;
-								uifc.changes=1; 
-							}
-							break; 
-					} 
-				} 
-			}
-			break;
-		case 14:	/* Alternate file paths */
-			while(1) {
-				for(i=0;i<cfg.altpaths;i++)
-					sprintf(opt[i],"%3d: %-40s",i+1,cfg.altpath[i]);
-				opt[i][0]=0;
-				i=WIN_ACT|WIN_SAV;	/* save cause size can change */
-				if((int)cfg.altpaths<MAX_OPTS)
-					i|=WIN_INS|WIN_XTR;
-				if(cfg.altpaths)
-					i|=WIN_DEL|WIN_COPY|WIN_CUT;
-				if(savaltpath[0])
-					i|=WIN_PASTE;
-				uifc.helpbuf=
-					"`Alternate File Paths:`\n"
-					"\n"
-					"This option allows the sysop to add and configure alternate file paths\n"
-					"for files stored on drives and directories other than the configured\n"
-					"storage path for a file directory. This command is useful for those who\n"
-					"have file directories where they wish to have files listed from\n"
-					"multiple CD-ROMs or hard disks.\n"
-				;
-				i=uifc.list(i,0,0,50,&altpath_dflt,NULL,"Alternate File Paths",opt);
-				if(i==-1)
-					break;
-				int msk = i & MSK_ON;
-				i &= MSK_OFF;
-				if(msk == MSK_DEL || msk == MSK_CUT) {
-					if(msk == MSK_CUT)
-						SAFECOPY(savaltpath, cfg.altpath[i]);
-					free(cfg.altpath[i]);
-					cfg.altpaths--;
-					while(i<cfg.altpaths) {
-						cfg.altpath[i]=cfg.altpath[i+1];
-						i++; 
+							if(i>=cfg.total_prots)
+								j=i-1;
+							else
+								j=i+1;
+							*cfg.prot[i]=*cfg.prot[j]; 
+						}
+						cfg.total_prots++;
+						uifc.changes=1;
+						continue; 
 					}
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_INS) {
-					if((cfg.altpath=(char **)realloc(cfg.altpath
-						,sizeof(char *)*(cfg.altpaths+1)))==NULL) {
-						errormsg(WHERE,ERR_ALLOC,nulstr,cfg.altpaths+1);
-						cfg.altpaths=0;
-						bail(1);
-                        continue; 
+					if(msk == MSK_COPY) {
+						savprot=*cfg.prot[i];
+						continue; 
 					}
-					if(!cfg.altpaths) {
-						if((cfg.altpath[0]=(char *)malloc(LEN_DIR+1))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1);
-							continue; 
+					if(msk == MSK_PASTE) {
+						*cfg.prot[i]=savprot;
+						uifc.changes=1;
+						continue; 
+					}
+					if (msk != 0)
+						continue;
+					done=0;
+					while(!done) {
+						j=0;
+						sprintf(opt[j++],"%-30.30s%c","Mnemonic (Command Key)"
+							,cfg.prot[i]->mnemonic);
+						sprintf(opt[j++],"%-30.30s%-40s","Protocol Name"
+							,cfg.prot[i]->name);
+						sprintf(opt[j++],"%-30.30s%-40s","Access Requirements"
+							,cfg.prot[i]->arstr);
+						sprintf(opt[j++],"%-30.30s%-40s","Upload Command Line"
+							,cfg.prot[i]->ulcmd);
+						sprintf(opt[j++],"%-30.30s%-40s","Download Command Line"
+							,cfg.prot[i]->dlcmd);
+						sprintf(opt[j++],"%-30.30s%-40s","Batch Upload Command Line"
+							,cfg.prot[i]->batulcmd);
+						sprintf(opt[j++],"%-30.30s%-40s","Batch Download Command Line"
+							,cfg.prot[i]->batdlcmd);
+						sprintf(opt[j++],"%-30.30s%-40s","Bi-dir Command Line"
+							,cfg.prot[i]->bicmd);
+						sprintf(opt[j++],"%-30.30s%s",   "Native (32-bit) Executable"
+							,cfg.prot[i]->misc&PROT_NATIVE ? "Yes" : "No");
+						sprintf(opt[j++],"%-30.30s%s",	 "Supports DSZLOG"
+							,cfg.prot[i]->misc&PROT_DSZLOG ? "Yes":"No");
+						sprintf(opt[j++],"%-30.30s%s",	 "Socket I/O"
+							,cfg.prot[i]->misc&PROT_SOCKET ? "Yes":"No");
+						opt[j][0]=0;
+						switch(uifc.list(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,70,&prot_opt,0
+							,"File Transfer Protocol",opt)) {
+							case -1:
+								done=1;
+								break;
+							case 0:
+								str[0]=cfg.prot[i]->mnemonic;
+								str[1]=0;
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Mnemonic (Command Key)"
+									,str,1,K_UPPER|K_EDIT);
+								if(str[0])
+									cfg.prot[i]->mnemonic=str[0];
+								break;
+							case 1:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Protocol Name"
+									,cfg.prot[i]->name,sizeof(cfg.prot[i]->name)-1,K_EDIT);
+								break;
+							case 2:
+								sprintf(str,"Protocol %s",cfg.prot[i]->name);
+								getar(str,cfg.prot[i]->arstr);
+								break;
+							case 3:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.prot[i]->ulcmd,sizeof(cfg.prot[i]->ulcmd)-1,K_EDIT);
+								break;
+							case 4:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.prot[i]->dlcmd,sizeof(cfg.prot[i]->dlcmd)-1,K_EDIT);
+								break;
+							case 5:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.prot[i]->batulcmd,sizeof(cfg.prot[i]->batulcmd)-1,K_EDIT);
+								break;
+							case 6:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.prot[i]->batdlcmd,sizeof(cfg.prot[i]->batdlcmd)-1,K_EDIT);
+								break;
+							case 7:
+								uifc.input(WIN_MID|WIN_SAV,0,0
+									,"Command"
+									,cfg.prot[i]->bicmd,sizeof(cfg.prot[i]->bicmd)-1,K_EDIT);
+								break;
+							case 8:
+								l=cfg.prot[i]->misc&PROT_NATIVE ? 0:1;
+								strcpy(opt[0],"Yes");
+								strcpy(opt[1],"No");
+								opt[2][0]=0;
+								l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0
+									,"Native (32-bit) Executable",opt);
+								if((l==0 && !(cfg.prot[i]->misc&PROT_NATIVE))
+									|| (l==1 && cfg.prot[i]->misc&PROT_NATIVE)) {
+									cfg.prot[i]->misc^=PROT_NATIVE;
+									uifc.changes=1; 
+								}
+								break; 
+							case 9:
+								l=cfg.prot[i]->misc&PROT_DSZLOG ? 0:1;
+								strcpy(opt[0],"Yes");
+								strcpy(opt[1],"No");
+								opt[2][0]=0;
+								l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0
+									,"Uses DSZLOG",opt);
+								if((l==0 && !(cfg.prot[i]->misc&PROT_DSZLOG))
+									|| (l==1 && cfg.prot[i]->misc&PROT_DSZLOG)) {
+									cfg.prot[i]->misc^=PROT_DSZLOG;
+									uifc.changes=1; 
+								}
+								break; 
+							case 10:
+								l=cfg.prot[i]->misc&PROT_SOCKET ? 0:1l;
+								strcpy(opt[0],"Yes");
+								strcpy(opt[1],"No");
+								opt[2][0]=0;
+								l=uifc.list(WIN_MID|WIN_SAV,0,0,0,&l,0
+									,"Uses Socket I/O",opt);
+								if((l==0 && !(cfg.prot[i]->misc&PROT_SOCKET))
+									|| (l==1 && cfg.prot[i]->misc&PROT_SOCKET)) {
+									cfg.prot[i]->misc^=PROT_SOCKET;
+									uifc.changes=1; 
+								}
+								break; 
+						} 
+					} 
+				}
+				break;
+			case 14:	/* Alternate file paths */
+				while(1) {
+					for(i=0;i<cfg.altpaths;i++)
+						sprintf(opt[i],"%3d: %-40s",i+1,cfg.altpath[i]);
+					opt[i][0]=0;
+					i=WIN_ACT|WIN_SAV;	/* save cause size can change */
+					if((int)cfg.altpaths<MAX_OPTS)
+						i|=WIN_INS|WIN_XTR;
+					if(cfg.altpaths)
+						i|=WIN_DEL|WIN_COPY|WIN_CUT;
+					if(savaltpath[0])
+						i|=WIN_PASTE;
+					uifc.helpbuf=
+						"`Alternate File Paths:`\n"
+						"\n"
+						"This option allows the sysop to add and configure alternate file paths\n"
+						"for files stored on drives and directories other than the configured\n"
+						"storage path for a file directory. This command is useful for those who\n"
+						"have file directories where they wish to have files listed from\n"
+						"multiple CD-ROMs or hard disks.\n"
+					;
+					i=uifc.list(i,0,0,50,&altpath_dflt,NULL,"Alternate File Paths",opt);
+					if(i==-1)
+						break;
+					int msk = i & MSK_ON;
+					i &= MSK_OFF;
+					if(msk == MSK_DEL || msk == MSK_CUT) {
+						if(msk == MSK_CUT)
+							SAFECOPY(savaltpath, cfg.altpath[i]);
+						free(cfg.altpath[i]);
+						cfg.altpaths--;
+						while(i<cfg.altpaths) {
+							cfg.altpath[i]=cfg.altpath[i+1];
+							i++; 
 						}
-						memset(cfg.altpath[0],0,LEN_DIR+1); 
+						uifc.changes=1;
+						continue; 
 					}
-					else {
-						for(j=cfg.altpaths;j>i;j--)
-							cfg.altpath[j]=cfg.altpath[j-1];
-						if((cfg.altpath[i]=(char *)malloc(LEN_DIR+1))==NULL) {
-							errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1);
+					if(msk == MSK_INS) {
+						if((cfg.altpath=(char **)realloc(cfg.altpath
+							,sizeof(char *)*(cfg.altpaths+1)))==NULL) {
+							errormsg(WHERE,ERR_ALLOC,nulstr,cfg.altpaths+1);
+							cfg.altpaths=0;
+							bail(1);
 							continue; 
 						}
-						if(i>=cfg.altpaths)
-							j=i-1;
-						else
-							j=i+1;
-						memcpy(cfg.altpath[i],cfg.altpath[j],LEN_DIR+1); 
+						if(!cfg.altpaths) {
+							if((cfg.altpath[0]=(char *)malloc(LEN_DIR+1))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1);
+								continue; 
+							}
+							memset(cfg.altpath[0],0,LEN_DIR+1); 
+						}
+						else {
+							for(j=cfg.altpaths;j>i;j--)
+								cfg.altpath[j]=cfg.altpath[j-1];
+							if((cfg.altpath[i]=(char *)malloc(LEN_DIR+1))==NULL) {
+								errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1);
+								continue; 
+							}
+							if(i>=cfg.altpaths)
+								j=i-1;
+							else
+								j=i+1;
+							memcpy(cfg.altpath[i],cfg.altpath[j],LEN_DIR+1); 
+						}
+						cfg.altpaths++;
+						uifc.changes=1;
+						continue; 
 					}
-					cfg.altpaths++;
-					uifc.changes=1;
-					continue; 
-				}
-				if(msk == MSK_COPY) {
-					SAFECOPY(savaltpath,cfg.altpath[i]);
-					continue; 
-				}
-				if(msk == MSK_PASTE) {
-					memcpy(cfg.altpath[i],savaltpath,LEN_DIR+1);
-					uifc.changes=1;
-					continue; 
+					if(msk == MSK_COPY) {
+						SAFECOPY(savaltpath,cfg.altpath[i]);
+						continue; 
+					}
+					if(msk == MSK_PASTE) {
+						memcpy(cfg.altpath[i],savaltpath,LEN_DIR+1);
+						uifc.changes=1;
+						continue; 
+					}
+					if (msk != 0)
+						continue;
+					sprintf(str,"Path %d",i+1);
+					uifc.input(WIN_MID|WIN_SAV,0,0,str,cfg.altpath[i],LEN_DIR,K_EDIT); 
 				}
-				if (msk != 0)
-					continue;
-				sprintf(str,"Path %d",i+1);
-				uifc.input(WIN_MID|WIN_SAV,0,0,str,cfg.altpath[i],LEN_DIR,K_EDIT); 
-			}
-			break; 
+				break; 
 		} 
 	}
 }
-