diff --git a/src/sbbs3/scfg/scfgmsg.c b/src/sbbs3/scfg/scfgmsg.c
index 761c5b972905115c7d63cbf477d87895b170d231..a771b102be9f6cec337e9a531517bf812ef57bf5 100644
--- a/src/sbbs3/scfg/scfgmsg.c
+++ b/src/sbbs3/scfg/scfgmsg.c
@@ -22,6 +22,7 @@
 #include "scfg.h"
 #include "strwrap.h"	/* itoa() */
 #include "str_util.h"
+#include "ciolib.h"	// CIO_KEY_*
 #include <stdbool.h>
 
 #define CUT_GROUPNUM	USHRT_MAX
@@ -669,11 +670,22 @@ void msgs_cfg()
 				"This menu allows you to configure the security requirements for access\n"
 				"to this message group. You can also add, delete, and configure the\n"
 				"sub-boards of this group by selecting the `Messages Sub-boards...` option.\n"
+				"\n"
+				"The left and right arrow keys may be used to cycle through message\n"
+				"groups.\n"
 			;
-			switch(uifc.list(WIN_ACT|WIN_T2B,6,0,60,&dflt,0,str,opt)) {
+			switch(uifc.list(WIN_ACT|WIN_T2B|WIN_EXTKEYS,6,0,60,&dflt,0,str,opt)) {
 				case -1:
 					done=1;
 					break;
+				case -CIO_KEY_LEFT-2:
+					if(grpnum > 0)
+						grpnum--;
+					break;
+				case -CIO_KEY_RIGHT-2:
+					if(grpnum + 1 < cfg.total_grps)
+						grpnum++;
+					break;
 				case __COUNTER__:
 					uifc.helpbuf=grp_long_name_help;
 					SAFECOPY(str, cfg.grp[grpnum]->lname);
@@ -755,13 +767,13 @@ void msgs_cfg()
 					if(j==0) {
 						sub_t* template = NULL;
 						for(j=0;j<cfg.total_subs;j++) {
-							if(cfg.sub[j]->grp == i && cfg.sub[j]->misc&SUB_TEMPLATE) {
+							if(cfg.sub[j]->grp == grpnum && cfg.sub[j]->misc&SUB_TEMPLATE) {
 								template = cfg.sub[j];
 								break;
 							}
 						}
 						for(j=0;j<cfg.total_subs;j++)
-							if(cfg.sub[j]->grp==i) {
+							if(cfg.sub[j]->grp == grpnum) {
 								if(template == NULL)
 									template = cfg.sub[j];
 								else if(cfg.sub[j] != template) {
@@ -877,7 +889,7 @@ void msgs_cfg()
 					}
 					uifc.pop("Exporting Areas...");
 					for(j=0;j<cfg.total_subs;j++) {
-						if(cfg.sub[j]->grp!=i)
+						if(cfg.sub[j]->grp != grpnum)
 							continue;
 						ported++;
 						if(k==1) {		/* AREAS.BBS SBBSecho */
@@ -1069,7 +1081,7 @@ void msgs_cfg()
 					break;
 
 				case __COUNTER__:
-					sub_cfg(i);
+					sub_cfg(grpnum);
 					break; 
 			} 
 		} 
diff --git a/src/sbbs3/scfg/scfgsub.c b/src/sbbs3/scfg/scfgsub.c
index 9ebc707a74866c02a98a642a97fa85f0ba36570b..bc2a19758a5be034933cb38c3d32040986a84612 100644
--- a/src/sbbs3/scfg/scfgsub.c
+++ b/src/sbbs3/scfg/scfgsub.c
@@ -18,6 +18,7 @@
  ****************************************************************************/
 
 #include "scfg.h"
+#include "ciolib.h"	// CIO_KEY_*
 
 static sub_t** cut_qhub_sub;
 
@@ -109,6 +110,24 @@ void remove_sub(scfg_t* cfg, unsigned subnum, bool cut)
 		cfg->sub[i] = cfg->sub[i + 1];
 }
 
+static int next_subnum(sub_t* sub)
+{
+	for(int i = sub->subnum + 1; i < cfg.total_subs; i++) {
+		if(cfg.sub[i]->grp == sub->grp)
+			return i;
+	}
+	return sub->subnum;
+}
+
+static int prev_subnum(sub_t* sub)
+{
+	for(int i = sub->subnum - 1; i >= 0; i--) {
+		if(cfg.sub[i]->grp == sub->grp)
+			return i;
+	}
+	return sub->subnum;
+}
+
 void sub_cfg(uint grpnum)
 {
 	static int dflt,tog_dflt,tog_bar,opt_dflt,net_dflt,adv_dflt,bar;
@@ -380,12 +399,20 @@ void sub_cfg(uint grpnum)
 				"\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"
+				"\n"
+				"The left and right arrow keys may be used to cycle through sub-boards.\n"
 			;
-			switch(uifc.list(WIN_ACT|WIN_SAV|WIN_BOT|WIN_L2R
-				,0,0,60,&opt_dflt,0,str,opt)) {
+			switch(uifc.list(WIN_ACT|WIN_SAV|WIN_BOT|WIN_L2R|WIN_EXTKEYS
+				,0,0,72,&opt_dflt,0,str,opt)) {
 				case -1:
 					done=1;
 					break;
+				case -CIO_KEY_LEFT-2:
+					i = prev_subnum(cfg.sub[i]);
+					break;
+				case -CIO_KEY_RIGHT-2:
+					i = next_subnum(cfg.sub[i]);
+					break;
 				case 0:
 					uifc.helpbuf=sub_long_name_help;
 					SAFECOPY(str, cfg.sub[i]->lname);
diff --git a/src/sbbs3/scfg/scfgxfr2.c b/src/sbbs3/scfg/scfgxfr2.c
index 820eab3ab3550ce6d77fb78700c20c28bc3722a6..fc5f5a3a2e8e25045ba7ff2aa6b65ea88ee8f94d 100644
--- a/src/sbbs3/scfg/scfgxfr2.c
+++ b/src/sbbs3/scfg/scfgxfr2.c
@@ -18,6 +18,7 @@
  ****************************************************************************/
 
 #include "scfg.h"
+#include "ciolib.h"	// CIO_KEY_*
 #include <stdbool.h>
 
 #define DEFAULT_DIR_OPTIONS (DIR_FCHK|DIR_DUPES|DIR_CDTUL|DIR_CDTDL|DIR_DIZ)
@@ -74,6 +75,24 @@ static bool new_dir(unsigned new_dirnum, unsigned libnum)
 	return true;
 }
 
+static int next_dirnum(dir_t* dir)
+{
+	for(int i = dir->dirnum + 1; i < cfg.total_dirs; i++) {
+		if(cfg.dir[i]->lib == dir->lib)
+			return i;
+	}
+	return dir->dirnum;
+}
+
+static int prev_dirnum(dir_t* dir)
+{
+	for(int i = dir->dirnum - 1; i >= 0; i--) {
+		if(cfg.dir[i]->lib == dir->lib)
+			return i;
+	}
+	return dir->dirnum;
+}
+
 static bool code_prefix_exists(const char* prefix)
 {
 	size_t i;
@@ -394,61 +413,72 @@ void xfer_cfg()
 		done=0;
 		while(!done) {
 			j=0;
-			sprintf(opt[j++],"%-27.27s%s","Long Name",cfg.lib[i]->lname);
-			sprintf(opt[j++],"%-27.27s%s","Short Name",cfg.lib[i]->sname);
-			sprintf(opt[j++],"%-27.27s%s","Internal Code Prefix",cfg.lib[i]->code_prefix);
+			sprintf(opt[j++],"%-27.27s%s","Long Name",cfg.lib[libnum]->lname);
+			sprintf(opt[j++],"%-27.27s%s","Short Name",cfg.lib[libnum]->sname);
+			sprintf(opt[j++],"%-27.27s%s","Internal Code Prefix",cfg.lib[libnum]->code_prefix);
 			sprintf(opt[j++],"%-27.27s%s","Parent Directory"
-				,cfg.lib[i]->parent_path);
+				,cfg.lib[libnum]->parent_path);
 			sprintf(opt[j++],"%-27.27s%s","Access Requirements"
-				,cfg.lib[i]->arstr);
+				,cfg.lib[libnum]->arstr);
 			sprintf(opt[j++],"%-27.27s%s","Access to Sub-directories"
-				,cfg.lib[i]->parent_path[0] ? (cfg.lib[i]->misc&LIB_DIRS ? "Yes":"No") : "N/A");
-			sprintf(opt[j++],"%-27.27s%s","Sort Library By Directory", area_sort_desc[cfg.lib[i]->sort]);
+				,cfg.lib[libnum]->parent_path[0] ? (cfg.lib[libnum]->misc&LIB_DIRS ? "Yes":"No") : "N/A");
+			sprintf(opt[j++],"%-27.27s%s","Sort Library By Directory", area_sort_desc[cfg.lib[libnum]->sort]);
 			strcpy(opt[j++],"Clone Options");
 			strcpy(opt[j++],"Export Areas...");
 			strcpy(opt[j++],"Import Areas...");
 			strcpy(opt[j++],"File Directories...");
 			opt[j][0]=0;
-			sprintf(str,"%s Library",cfg.lib[i]->sname);
+			sprintf(str,"%s Library",cfg.lib[libnum]->sname);
 			uifc.helpbuf=
 				"`File Library Configuration:`\n"
 				"\n"
 				"This menu allows you to configure the security requirements for access\n"
 				"to this file library. You can also add, delete, and configure the\n"
 				"directories of this library by selecting the `File Directories...` option.\n"
+				"\n"
+				"The left and right arrow keys may be used to cycle through file\n"
+				"libraries.\n"
 			;
-			switch(uifc.list(WIN_ACT,6,4,60,&dflt,0,str,opt)) {
+			switch(uifc.list(WIN_ACT|WIN_EXTKEYS,6,4,60,&dflt,0,str,opt)) {
 				case -1:
 					done=1;
 					break;
+				case -CIO_KEY_LEFT-2:
+					if(libnum > 0)
+						libnum--;
+					break;
+				case -CIO_KEY_RIGHT-2:
+					if(libnum + 1 < cfg.total_libs)
+						libnum++;
+					break;
 				case __COUNTER__:
 					uifc.helpbuf=lib_long_name_help;
-					SAFECOPY(str, cfg.lib[i]->lname);
+					SAFECOPY(str, cfg.lib[libnum]->lname);
 					if(uifc.input(WIN_MID|WIN_SAV,0,0,"Name to use for Listings"
 						,str,LEN_GLNAME,K_EDIT) > 0)
-						SAFECOPY(cfg.lib[i]->lname,str);
+						SAFECOPY(cfg.lib[libnum]->lname,str);
 					break;
 				case __COUNTER__:
 					uifc.helpbuf=lib_short_name_help;
-					SAFECOPY(str, cfg.lib[i]->sname);
+					SAFECOPY(str, cfg.lib[libnum]->sname);
 					if(uifc.input(WIN_MID|WIN_SAV,0,0,"Name to use for Prompts"
 						,str,LEN_GSNAME,K_EDIT) > 0)
-						SAFECOPY(cfg.lib[i]->sname,str);
+						SAFECOPY(cfg.lib[libnum]->sname,str);
 					break;
 				case __COUNTER__:
 				{
 					char code_prefix[LEN_CODE+1];
-					SAFECOPY(code_prefix, cfg.lib[i]->code_prefix);
+					SAFECOPY(code_prefix, cfg.lib[libnum]->code_prefix);
 					uifc.helpbuf=lib_code_prefix_help;
 					if(uifc.input(WIN_MID|WIN_SAV,0,17,"Internal Code Prefix"
 						,code_prefix,LEN_CODE,K_EDIT|K_UPPER) < 0)
 						continue;
-					if(stricmp(code_prefix, cfg.lib[i]->code_prefix) == 0)
+					if(stricmp(code_prefix, cfg.lib[libnum]->code_prefix) == 0)
 						break;
 					if(code_prefix_exists(code_prefix))
 						uifc.msg(strDuplicateCodePrefix);
 					else if(code_prefix[0] == 0 || code_ok(code_prefix)) {
-						SAFECOPY(cfg.lib[i]->code_prefix, code_prefix);
+						SAFECOPY(cfg.lib[libnum]->code_prefix, code_prefix);
 					} else {
 						uifc.helpbuf = invalid_code;
 						uifc.msg(strInvalidCodePrefix);
@@ -473,11 +503,11 @@ void xfer_cfg()
 						"`Transfer File Path` configured."
 					;
 					uifc.input(WIN_MID|WIN_SAV,0,0,"Parent Directory"
-						,cfg.lib[i]->parent_path,sizeof(cfg.lib[i]->parent_path)-1,K_EDIT);
+						,cfg.lib[libnum]->parent_path,sizeof(cfg.lib[libnum]->parent_path)-1,K_EDIT);
 					break;
 				case __COUNTER__:
-					sprintf(str,"%s Library",cfg.lib[i]->sname);
-					getar(str,cfg.lib[i]->arstr);
+					sprintf(str,"%s Library",cfg.lib[libnum]->sname);
+					getar(str,cfg.lib[libnum]->arstr);
 					break;
 				case __COUNTER__:
 					uifc.helpbuf=
@@ -492,18 +522,18 @@ void xfer_cfg()
 						"\n"
 						"~ This is an experimental feature. ~"
 					;
-					if(cfg.lib[i]->parent_path[0] == '\0') {
+					if(cfg.lib[libnum]->parent_path[0] == '\0') {
 						uifc.msg("A parent directory must be specified to use this feature");
 						break;
 					}
 					j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
 						,"Allow Access to Sub-directories of Parent Directory"
 						,uifcYesNoOpts);
-					if(j==0 && (cfg.lib[i]->misc&LIB_DIRS) == 0) {
-						cfg.lib[i]->misc|=LIB_DIRS;
+					if(j==0 && (cfg.lib[libnum]->misc&LIB_DIRS) == 0) {
+						cfg.lib[libnum]->misc|=LIB_DIRS;
 						uifc.changes = true;
-					} else if(j==1 && (cfg.lib[i]->misc&LIB_DIRS) != 0) {
-						cfg.lib[i]->misc &= ~LIB_DIRS;
+					} else if(j==1 && (cfg.lib[libnum]->misc&LIB_DIRS) != 0) {
+						cfg.lib[libnum]->misc &= ~LIB_DIRS;
 						uifc.changes = true;
 					}
 					break;
@@ -519,11 +549,11 @@ void xfer_cfg()
 						"The library will be automatically re-sorted when new directories\n"
 						"are added via `SCFG` or when existing directories are modified.\n"
 						;
-					j = cfg.lib[i]->sort;
+					j = cfg.lib[libnum]->sort;
 					j = uifc.list(WIN_MID|WIN_SAV, 0, 0, 0, &j, 0, "Sort Library By Directory", area_sort_desc);
 					if(j >= 0) {
-						cfg.lib[i]->sort = j;
-						sort_dirs(i);
+						cfg.lib[libnum]->sort = j;
+						sort_dirs(libnum);
 						uifc.changes = TRUE;
 					}
 					break;
@@ -551,13 +581,13 @@ void xfer_cfg()
 					if(j==0) {
 						dir_t* template = NULL;
 						for(j=0;j<cfg.total_dirs;j++) {
-							if(cfg.dir[j]->lib == i && cfg.dir[j]->misc&DIR_TEMPLATE) {
+							if(cfg.dir[j]->lib == libnum && cfg.dir[j]->misc&DIR_TEMPLATE) {
 								template = cfg.dir[j];
 								break;
 							}
 						}
 						for(j=0;j<cfg.total_dirs;j++) {
-							if(cfg.dir[j]->lib != i)
+							if(cfg.dir[j]->lib != libnum)
 								continue;
 							if(template == NULL)
 								template = cfg.dir[j];
@@ -638,7 +668,7 @@ void xfer_cfg()
 					}
 					uifc.pop("Exporting Areas...");
 					for(j=0;j<cfg.total_dirs;j++) {
-						if(cfg.dir[j]->lib!=i)
+						if(cfg.dir[j]->lib != libnum)
 							continue;
 						ported++;
 						if(k==1) {
@@ -719,7 +749,7 @@ void xfer_cfg()
 					else if(k==1)
 						sprintf(str,"FILEGATE.ZXX");
 					else {
-						strcpy(str,cfg.lib[i]->parent_path);
+						strcpy(str,cfg.lib[libnum]->parent_path);
 						backslash(str);
 						strcat(str,"dirs.raw");
 					}
@@ -875,7 +905,7 @@ void xfer_cfg()
 						if(tmpdir.sname[0] == 0)
 							SAFECOPY(tmpdir.sname, tmp_code);
 
-						SAFECOPY(tmpdir.code_suffix, prep_code(tmp_code,cfg.lib[i]->code_prefix));
+						SAFECOPY(tmpdir.code_suffix, prep_code(tmp_code,cfg.lib[libnum]->code_prefix));
 
 						int dupes = 0;
 						int attempts = 0;	// attempts to generate a unique internal code
@@ -884,14 +914,14 @@ void xfer_cfg()
 						else
 							duplicate_codes = 0;
 						for(j=0; j < cfg.total_dirs && attempts < (36*36*36); j++) {
-							if(cfg.dir[j]->lib == i) {	/* same lib */
+							if(cfg.dir[j]->lib == libnum) {	/* same lib */
 								if(tmpdir.path[0]
 									&& strcmp(cfg.dir[j]->path, tmpdir.path) == 0)	/* same path? overwrite the dir entry */
 									break;
 								if(stricmp(cfg.dir[j]->sname, tmpdir.sname) == 0)
 									break;
 							} else {
-								if((cfg.lib[i]->code_prefix[0] || cfg.lib[cfg.dir[j]->lib]->code_prefix[0]))
+								if((cfg.lib[libnum]->code_prefix[0] || cfg.lib[cfg.dir[j]->lib]->code_prefix[0]))
 									continue;
 							}
 							if(stricmp(cfg.dir[j]->code_suffix,tmpdir.code_suffix) == 0) {
@@ -943,7 +973,7 @@ void xfer_cfg()
 							}
 						} else
 							memcpy(cfg.dir[j],&tmpdir,sizeof(dir_t));
-						cfg.dir[j]->lib=i;
+						cfg.dir[j]->lib = libnum;
 						if(j==cfg.total_dirs) {
 							cfg.dir[j]->misc=tmpdir.misc;
 							cfg.total_dirs++; 
@@ -951,8 +981,8 @@ void xfer_cfg()
 						uifc.changes=1; 
 					}
 					fclose(stream);
-					if(ported && cfg.lib[i]->sort)
-						sort_dirs(i);
+					if(ported && cfg.lib[libnum]->sort)
+						sort_dirs(libnum);
 					uifc.pop(NULL);
 					sprintf(str,"%lu File Areas Imported Successfully (%lu added)",ported, added);
 					uifc.msg(str);
@@ -1079,7 +1109,7 @@ void dir_cfg(uint libnum)
 		int msk = i & MSK_ON;
 		i &= MSK_OFF;
 		if(msk == MSK_INS) {
-			strcpy(str,"My Brand-New File Directory");
+			strcpy(str,"My Brand-New Files");
 			uifc.helpbuf=dir_long_name_help;
 			if(uifc.input(WIN_MID|WIN_SAV,0,0,"Directory Long Name",str,LEN_SLNAME
 				,K_EDIT)<1)
@@ -1241,12 +1271,21 @@ void dir_cfg(uint libnum)
 				"\n"
 				"This menu allows you to configure the individual selected directory.\n"
 				"Options with a trailing `...` provide a sub-menu of more options.\n"
+				"\n"
+				"The left and right arrow keys may be used to cycle through file\n"
+				"directories.\n"
 			;
-			switch(uifc.list(WIN_SAV|WIN_ACT|WIN_RHT|WIN_BOT
-				,0,0,0,&opt_dflt,0,str,opt)) {
+			switch(uifc.list(WIN_SAV|WIN_ACT|WIN_L2R|WIN_BOT|WIN_EXTKEYS
+				,0,0,72,&opt_dflt,0,str,opt)) {
 				case -1:
 					done=1;
 					break;
+				case -CIO_KEY_LEFT-2:
+					i = prev_dirnum(cfg.dir[i]);
+					break;
+				case -CIO_KEY_RIGHT-2:
+					i = next_dirnum(cfg.dir[i]);
+					break;
 				case 0:
 					uifc.helpbuf=dir_long_name_help;
 					SAFECOPY(str, cfg.dir[i]->lname);