diff --git a/src/sbbs3/scfg/Attic/scfgxfr2.c b/src/sbbs3/scfg/Attic/scfgxfr2.c
index dd02958298698a693a65eb94b548f339f6bb72ed..60536534cb3a7f8712d31481b582cc8dee1e2be5 100644
--- a/src/sbbs3/scfg/Attic/scfgxfr2.c
+++ b/src/sbbs3/scfg/Attic/scfgxfr2.c
@@ -35,6 +35,8 @@
 
 #include "scfg.h"
 
+#define DEFAULT_DIR_OPTIONS (DIR_FCHK|DIR_MULT|DIR_DUPES|DIR_CDTUL|DIR_CDTDL|DIR_DIZ)
+
 void xfer_cfg()
 {
 	static int libs_dflt,libs_bar,dflt;
@@ -188,6 +190,8 @@ library, select Yes.
 		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%.40s","Root Directory"
+			,cfg.lib[i]->root);
 		sprintf(opt[j++],"%-27.27s%.40s","Access Requirements"
 			,cfg.lib[i]->arstr);
 		strcpy(opt[j++],"Clone Options");
@@ -234,10 +238,21 @@ file transfer menu prompt.
 					,cfg.lib[i]->sname,LEN_GSNAME,K_EDIT);
 				break;
 			case 2:
+				SETHELP(WHERE);
+/*
+Root Directory:
+
+This an optional path to be used as the physical "root" or "parent" 
+directory for all logical directories in this library.
+*/
+				uifc.input(WIN_MID|WIN_SAV,0,0,"Root"
+					,cfg.lib[i]->root,LEN_DIR,K_EDIT);
+				break;
+			case 3:
 				sprintf(str,"%s Library",cfg.lib[i]->sname);
 				getar(str,cfg.lib[i]->arstr);
 				break;
-			case 3: /* clone options */
+			case 4: /* clone options */
 				j=0;
 				strcpy(opt[0],"Yes");
 				strcpy(opt[1],"No");
@@ -280,7 +295,7 @@ extension, and sort type.
 								cfg.dir[j]->seqdev=cfg.dir[k]->seqdev;
 								cfg.dir[j]->sort=cfg.dir[k]->sort; } } }
                 break;
-			case 4:
+			case 5:
 				k=0;
 				ported=0;
 				q=uifc.changes;
@@ -303,7 +318,6 @@ export to.
 					sprintf(str,"%sDIRS.TXT",cfg.ctrl_dir);
 				else if(k==1)
 					sprintf(str,"FILEBONE.NA");
-				strupr(str);
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Filename"
 					,str,40,K_EDIT)<=0) {
 					uifc.changes=q;
@@ -368,7 +382,7 @@ export to.
 				uifc.changes=q;
 				break;
 
-			case 5:
+			case 6:
 				ported=0;
 				k=0;
 				SETHELP(WHERE);
@@ -377,9 +391,13 @@ export to.
 
 This menu allows you to choose the format of the area file you wish to
 import into the current file library.
+
+A "raw" directory listing can be created in DOS with the following
+command: DIR /ON /AD /B > DIRS.RAW
 */
 				strcpy(opt[k++],"DIRS.TXT    (Synchronet)");
                 strcpy(opt[k++],"FILEBONE.NA (Fido)");
+				strcpy(opt[k++],"DIRS.RAW    (Raw)");
 				opt[k][0]=0;
 				k=0;
 				k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
@@ -390,7 +408,11 @@ import into the current file library.
 					sprintf(str,"%sDIRS.TXT",cfg.ctrl_dir);
 				else if(k==1)
 					sprintf(str,"FILEBONE.NA");
-				strupr(str);
+				else {
+					strcpy(str,cfg.lib[i]->root);
+					backslash(str);
+					strcat(str,"dirs.raw");
+				}
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Filename"
 					,str,40,K_EDIT)<=0)
                     break;
@@ -403,29 +425,40 @@ import into the current file library.
 					truncsp(str);
 					if(!str[0])
 						continue;
-					if(k) {
-						p=str;
-						while(*p && *p<=SP) p++;
+					memset(&tmpdir,0,sizeof(dir_t));
+					tmpdir.misc=DEFAULT_DIR_OPTIONS;
+					tmpdir.maxfiles=1000;
+					tmpdir.up_pct=cfg.cdt_up_pct;
+					tmpdir.dn_pct=cfg.cdt_dn_pct; 
+
+					p=str;
+					while(*p && *p<=SP) p++;
+
+					if(k==2) { /* raw */
+						SAFECOPY(tmpdir.code,p);
+						SAFECOPY(tmpdir.lname,p);
+						SAFECOPY(tmpdir.sname,p);
+						SAFECOPY(tmpdir.path,p);
+						ported++;
+					}
+					else if(k==1) {
 						if(strnicmp(p,"AREA ",5))
 							continue;
-						memset(&tmpdir,0,sizeof(dir_t));
-						tmpdir.misc|=
-							(DIR_FCHK|DIR_DUPES|DIR_CDTUL|DIR_CDTDL|DIR_DIZ);
-						if(k==1) {
-							p+=5;
-							while(*p && *p<=SP) p++;
-							sprintf(tmpdir.code,"%.8s",p);
-							truncsp(tmpdir.code);
-							while(*p>SP) p++;			/* Skip areaname */
-							while(*p && *p<=SP) p++;	/* Skip space */
-							while(*p>SP) p++;			/* Skip level */
-							while(*p && *p<=SP) p++;	/* Skip space */
-							while(*p>SP) p++;			/* Skip flags */
-							while(*p && *p<=SP) p++;	/* Skip space */
-							sprintf(tmpdir.lname,"%.*s",LEN_SLNAME,p); }
-						ported++; }
+						p+=5;
+						while(*p && *p<=SP) p++;
+						sprintf(tmpdir.code,"%.8s",p);
+						truncsp(tmpdir.code);
+						while(*p>SP) p++;			/* Skip areaname */
+						while(*p && *p<=SP) p++;	/* Skip space */
+						while(*p>SP) p++;			/* Skip level */
+						while(*p && *p<=SP) p++;	/* Skip space */
+						while(*p>SP) p++;			/* Skip flags */
+						while(*p && *p<=SP) p++;	/* Skip space */
+						SAFECOPY(tmpdir.sname,p); 
+						SAFECOPY(tmpdir.lname,p); 
+						ported++; 
+					}
 					else {
-						memset(&tmpdir,0,sizeof(dir_t));
 						sprintf(tmpdir.lname,"%.*s",LEN_SLNAME,str);
 						if(!fgets(str,128,stream)) break;
 						truncsp(str);
@@ -486,7 +519,9 @@ import into the current file library.
 						while(!feof(stream)
 							&& strcmp(str,"***END-OF-DIR***")) {
 							if(!fgets(str,128,stream)) break;
-							truncsp(str); } }
+							truncsp(str); 
+						} 
+					}
 
 					for(j=0;j<cfg.total_dirs;j++) {
 						if(cfg.dir[j]->lib!=i)
@@ -507,29 +542,31 @@ import into the current file library.
 							errormsg(WHERE,ERR_ALLOC,"dir",sizeof(dir_t));
 							break; }
 						memset(cfg.dir[j],0,sizeof(dir_t)); }
-					if(!k)
-						memcpy(cfg.dir[j],&tmpdir,sizeof(dir_t));
-					else {
+					if(k==1) {
 						strcpy(cfg.dir[j]->code,tmpdir.code);
 						strcpy(cfg.dir[j]->sname,tmpdir.code);
 						strcpy(cfg.dir[j]->lname,tmpdir.lname);
 						if(j==cfg.total_dirs) {
 							cfg.dir[j]->maxfiles=1000;
 							cfg.dir[j]->up_pct=cfg.cdt_up_pct;
-							cfg.dir[j]->dn_pct=cfg.cdt_dn_pct; }
+							cfg.dir[j]->dn_pct=cfg.cdt_dn_pct; 
 						}
+					} else
+						memcpy(cfg.dir[j],&tmpdir,sizeof(dir_t));
 					cfg.dir[j]->lib=i;
 					if(j==cfg.total_dirs) {
 						cfg.dir[j]->misc=tmpdir.misc;
-						cfg.total_dirs++; }
-					uifc.changes=1; }
+						cfg.total_dirs++; 
+					}
+					uifc.changes=1; 
+				}
 				fclose(stream);
 				uifc.pop(0);
 				sprintf(str,"%lu File Areas Imported Successfully",ported);
                 uifc.msg(str);
                 break;
 
-			case 6:
+			case 7:
 				dir_cfg(i);
 				break; } } }
 
@@ -648,8 +685,7 @@ this directory will be stored. Example: C:\XFER\GAMES
 		cfg.dir[dirnum[i]]->lib=libnum;
 		cfg.dir[dirnum[i]]->maxfiles=MAX_FILES<500 ? MAX_FILES:500;
 		if(stricmp(str2,"OFFLINE"))
-			cfg.dir[dirnum[i]]->misc=(DIR_FCHK|DIR_MULT|DIR_DUPES
-				|DIR_CDTUL|DIR_CDTDL|DIR_DIZ);
+			cfg.dir[dirnum[i]]->misc=DEFAULT_DIR_OPTIONS;
 		strcpy(cfg.dir[dirnum[i]]->code,code);
 		strcpy(cfg.dir[dirnum[i]]->lname,str);
 		strcpy(cfg.dir[dirnum[i]]->sname,str2);
diff --git a/src/sbbs3/scfg/scfgxfr2.c b/src/sbbs3/scfg/scfgxfr2.c
index dd02958298698a693a65eb94b548f339f6bb72ed..60536534cb3a7f8712d31481b582cc8dee1e2be5 100644
--- a/src/sbbs3/scfg/scfgxfr2.c
+++ b/src/sbbs3/scfg/scfgxfr2.c
@@ -35,6 +35,8 @@
 
 #include "scfg.h"
 
+#define DEFAULT_DIR_OPTIONS (DIR_FCHK|DIR_MULT|DIR_DUPES|DIR_CDTUL|DIR_CDTDL|DIR_DIZ)
+
 void xfer_cfg()
 {
 	static int libs_dflt,libs_bar,dflt;
@@ -188,6 +190,8 @@ library, select Yes.
 		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%.40s","Root Directory"
+			,cfg.lib[i]->root);
 		sprintf(opt[j++],"%-27.27s%.40s","Access Requirements"
 			,cfg.lib[i]->arstr);
 		strcpy(opt[j++],"Clone Options");
@@ -234,10 +238,21 @@ file transfer menu prompt.
 					,cfg.lib[i]->sname,LEN_GSNAME,K_EDIT);
 				break;
 			case 2:
+				SETHELP(WHERE);
+/*
+Root Directory:
+
+This an optional path to be used as the physical "root" or "parent" 
+directory for all logical directories in this library.
+*/
+				uifc.input(WIN_MID|WIN_SAV,0,0,"Root"
+					,cfg.lib[i]->root,LEN_DIR,K_EDIT);
+				break;
+			case 3:
 				sprintf(str,"%s Library",cfg.lib[i]->sname);
 				getar(str,cfg.lib[i]->arstr);
 				break;
-			case 3: /* clone options */
+			case 4: /* clone options */
 				j=0;
 				strcpy(opt[0],"Yes");
 				strcpy(opt[1],"No");
@@ -280,7 +295,7 @@ extension, and sort type.
 								cfg.dir[j]->seqdev=cfg.dir[k]->seqdev;
 								cfg.dir[j]->sort=cfg.dir[k]->sort; } } }
                 break;
-			case 4:
+			case 5:
 				k=0;
 				ported=0;
 				q=uifc.changes;
@@ -303,7 +318,6 @@ export to.
 					sprintf(str,"%sDIRS.TXT",cfg.ctrl_dir);
 				else if(k==1)
 					sprintf(str,"FILEBONE.NA");
-				strupr(str);
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Filename"
 					,str,40,K_EDIT)<=0) {
 					uifc.changes=q;
@@ -368,7 +382,7 @@ export to.
 				uifc.changes=q;
 				break;
 
-			case 5:
+			case 6:
 				ported=0;
 				k=0;
 				SETHELP(WHERE);
@@ -377,9 +391,13 @@ export to.
 
 This menu allows you to choose the format of the area file you wish to
 import into the current file library.
+
+A "raw" directory listing can be created in DOS with the following
+command: DIR /ON /AD /B > DIRS.RAW
 */
 				strcpy(opt[k++],"DIRS.TXT    (Synchronet)");
                 strcpy(opt[k++],"FILEBONE.NA (Fido)");
+				strcpy(opt[k++],"DIRS.RAW    (Raw)");
 				opt[k][0]=0;
 				k=0;
 				k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
@@ -390,7 +408,11 @@ import into the current file library.
 					sprintf(str,"%sDIRS.TXT",cfg.ctrl_dir);
 				else if(k==1)
 					sprintf(str,"FILEBONE.NA");
-				strupr(str);
+				else {
+					strcpy(str,cfg.lib[i]->root);
+					backslash(str);
+					strcat(str,"dirs.raw");
+				}
 				if(uifc.input(WIN_MID|WIN_SAV,0,0,"Filename"
 					,str,40,K_EDIT)<=0)
                     break;
@@ -403,29 +425,40 @@ import into the current file library.
 					truncsp(str);
 					if(!str[0])
 						continue;
-					if(k) {
-						p=str;
-						while(*p && *p<=SP) p++;
+					memset(&tmpdir,0,sizeof(dir_t));
+					tmpdir.misc=DEFAULT_DIR_OPTIONS;
+					tmpdir.maxfiles=1000;
+					tmpdir.up_pct=cfg.cdt_up_pct;
+					tmpdir.dn_pct=cfg.cdt_dn_pct; 
+
+					p=str;
+					while(*p && *p<=SP) p++;
+
+					if(k==2) { /* raw */
+						SAFECOPY(tmpdir.code,p);
+						SAFECOPY(tmpdir.lname,p);
+						SAFECOPY(tmpdir.sname,p);
+						SAFECOPY(tmpdir.path,p);
+						ported++;
+					}
+					else if(k==1) {
 						if(strnicmp(p,"AREA ",5))
 							continue;
-						memset(&tmpdir,0,sizeof(dir_t));
-						tmpdir.misc|=
-							(DIR_FCHK|DIR_DUPES|DIR_CDTUL|DIR_CDTDL|DIR_DIZ);
-						if(k==1) {
-							p+=5;
-							while(*p && *p<=SP) p++;
-							sprintf(tmpdir.code,"%.8s",p);
-							truncsp(tmpdir.code);
-							while(*p>SP) p++;			/* Skip areaname */
-							while(*p && *p<=SP) p++;	/* Skip space */
-							while(*p>SP) p++;			/* Skip level */
-							while(*p && *p<=SP) p++;	/* Skip space */
-							while(*p>SP) p++;			/* Skip flags */
-							while(*p && *p<=SP) p++;	/* Skip space */
-							sprintf(tmpdir.lname,"%.*s",LEN_SLNAME,p); }
-						ported++; }
+						p+=5;
+						while(*p && *p<=SP) p++;
+						sprintf(tmpdir.code,"%.8s",p);
+						truncsp(tmpdir.code);
+						while(*p>SP) p++;			/* Skip areaname */
+						while(*p && *p<=SP) p++;	/* Skip space */
+						while(*p>SP) p++;			/* Skip level */
+						while(*p && *p<=SP) p++;	/* Skip space */
+						while(*p>SP) p++;			/* Skip flags */
+						while(*p && *p<=SP) p++;	/* Skip space */
+						SAFECOPY(tmpdir.sname,p); 
+						SAFECOPY(tmpdir.lname,p); 
+						ported++; 
+					}
 					else {
-						memset(&tmpdir,0,sizeof(dir_t));
 						sprintf(tmpdir.lname,"%.*s",LEN_SLNAME,str);
 						if(!fgets(str,128,stream)) break;
 						truncsp(str);
@@ -486,7 +519,9 @@ import into the current file library.
 						while(!feof(stream)
 							&& strcmp(str,"***END-OF-DIR***")) {
 							if(!fgets(str,128,stream)) break;
-							truncsp(str); } }
+							truncsp(str); 
+						} 
+					}
 
 					for(j=0;j<cfg.total_dirs;j++) {
 						if(cfg.dir[j]->lib!=i)
@@ -507,29 +542,31 @@ import into the current file library.
 							errormsg(WHERE,ERR_ALLOC,"dir",sizeof(dir_t));
 							break; }
 						memset(cfg.dir[j],0,sizeof(dir_t)); }
-					if(!k)
-						memcpy(cfg.dir[j],&tmpdir,sizeof(dir_t));
-					else {
+					if(k==1) {
 						strcpy(cfg.dir[j]->code,tmpdir.code);
 						strcpy(cfg.dir[j]->sname,tmpdir.code);
 						strcpy(cfg.dir[j]->lname,tmpdir.lname);
 						if(j==cfg.total_dirs) {
 							cfg.dir[j]->maxfiles=1000;
 							cfg.dir[j]->up_pct=cfg.cdt_up_pct;
-							cfg.dir[j]->dn_pct=cfg.cdt_dn_pct; }
+							cfg.dir[j]->dn_pct=cfg.cdt_dn_pct; 
 						}
+					} else
+						memcpy(cfg.dir[j],&tmpdir,sizeof(dir_t));
 					cfg.dir[j]->lib=i;
 					if(j==cfg.total_dirs) {
 						cfg.dir[j]->misc=tmpdir.misc;
-						cfg.total_dirs++; }
-					uifc.changes=1; }
+						cfg.total_dirs++; 
+					}
+					uifc.changes=1; 
+				}
 				fclose(stream);
 				uifc.pop(0);
 				sprintf(str,"%lu File Areas Imported Successfully",ported);
                 uifc.msg(str);
                 break;
 
-			case 6:
+			case 7:
 				dir_cfg(i);
 				break; } } }
 
@@ -648,8 +685,7 @@ this directory will be stored. Example: C:\XFER\GAMES
 		cfg.dir[dirnum[i]]->lib=libnum;
 		cfg.dir[dirnum[i]]->maxfiles=MAX_FILES<500 ? MAX_FILES:500;
 		if(stricmp(str2,"OFFLINE"))
-			cfg.dir[dirnum[i]]->misc=(DIR_FCHK|DIR_MULT|DIR_DUPES
-				|DIR_CDTUL|DIR_CDTDL|DIR_DIZ);
+			cfg.dir[dirnum[i]]->misc=DEFAULT_DIR_OPTIONS;
 		strcpy(cfg.dir[dirnum[i]]->code,code);
 		strcpy(cfg.dir[dirnum[i]]->lname,str);
 		strcpy(cfg.dir[dirnum[i]]->sname,str2);