diff --git a/exec/load/cnfdefs.js b/exec/load/cnfdefs.js
index 7afbc83c4a3389d34d96d0d872590d2d361d2b8a..caa6f6632ca6883f08839496da9f3fc07e9d2941 100644
--- a/exec/load/cnfdefs.js
+++ b/exec/load/cnfdefs.js
@@ -3,11 +3,12 @@
 */
 
 /* miscellaneous constants required for cnf parsing
-(if adding definitions to this file, make sure the required
-constants are defined... if not, add them */
+   (if adding definitions to this file, make sure the required
+   constants are defined... if not, add them) 
+ */
 
 /* Note: rev 1.3 (and earlier) of this file used field names derived from the
- * C/C++ source code (sbbsdefs.h), while rev 1.4 and later now use field
+ * C/C++ source code (scfgdefs.h), while rev 1.4 and later now use field
  * names which correlate with the Synchronet JS object model (jsobjs.html).
  */
 
@@ -111,7 +112,7 @@ struct.sub_t={
 	ars:			{bytes:LEN_ARSTR+1,		type:"str"},	// was arstr
 	read_ars:		{bytes:LEN_ARSTR+1,		type:"str"},	// was read_arstr
 	post_ars:		{bytes:LEN_ARSTR+1,		type:"str"},	// was post_arstr
-	op_ars:			{bytes:LEN_ARSTR+1,		type:"str"},	// was op_arstr
+	operator_ars:	{bytes:LEN_ARSTR+1,		type:"str"},	// was op_arstr
 	// uchar		*ar,
 				// *read_ar,
 				// *post_ar,
@@ -126,7 +127,7 @@ struct.sub_t={
 	max_crcs:		{bytes:UINT32_T,		type:"int"},	// was maxcrcs
 	max_age:		{bytes:UINT16_T,		type:"int"},	// was maxage
 	ptridx:			{bytes:UINT16_T,		type:"int"},
-	mod_ars:		{bytes:LEN_ARSTR+1,		type:"str"},	// was mod_arstr
+	moderated_ars:	{bytes:LEN_ARSTR+1,		type:"str"},	// was mod_arstr
 	// *mod_ar;
 	qwk_conf:		{bytes:UINT16_T,		type:"int"},	// was qwkconf
 	__PADDING__:53
@@ -225,4 +226,135 @@ struct.msg={
 	inetmail_cost:	{bytes:UINT32_T, 		type:"str"},
 	smtpmail_sem:	{bytes:LEN_DIR+1, 		type:"str"}	
 };
-	
+
+/************/
+/* file.cnf */
+/************/
+struct.dir_t={
+	lib_number:		{bytes:UINT16_T,		type:"int"},
+	description:	{bytes:LEN_SLNAME+1,	type:"str"},
+	name:			{bytes:LEN_SSNAME+1,	type:"str"},
+	code_suffix:	{bytes:LEN_CODE+1,		type:"str"},
+	data_dir:		{bytes:LEN_DIR+1,		type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	upload_ars:		{bytes:LEN_ARSTR+1,		type:"str"},
+	download_ars:	{bytes:LEN_ARSTR+1,		type:"str"},
+	operator_ars:	{bytes:LEN_ARSTR+1,		type:"str"},
+	path:			{bytes:LEN_DIR+1,		type:"str"},
+	upload_sem:		{bytes:LEN_DIR+1,		type:"str"},
+	max_files:		{bytes:UINT16_T,		type:"int"},
+	extensions:		{bytes:41,				type:"str"},
+	settings:		{bytes:UINT32_T,		type:"int"},
+	seq_dev:		{bytes:1,				type:"int"},	// seqdev
+	sort:			{bytes:1,				type:"int"},
+	exempt_ars:		{bytes:LEN_ARSTR+1,		type:"str"},
+	max_age:		{bytes:UINT16_T,		type:"int"},
+	upload_pct:		{bytes:UINT16_T,		type:"int"},
+	download_pct:	{bytes:UINT16_T,		type:"int"},
+	__PADDING__:49
+};
+struct.lib_t={
+	description:	{bytes:LEN_GLNAME+1,	type:"str"},
+	name:			{bytes:LEN_GSNAME+1,	type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	parent_path:	{bytes:48,				type:"str"},
+	code_prefix:	{bytes:LEN_CODE+1,		type:"str"},
+	sort:			{bytes:1,				type:"int"},
+	settings:		{bytes:UINT32_T,		type:"int"},
+	__PADDING__:34
+};
+
+/* Extractable File Types */
+struct.fextr_t={
+	extension:		{bytes:4,				type:"str"},
+	cmd:			{bytes:LEN_CMD+1,		type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	__PADDING__:16
+};
+
+/* Compressable File Types */
+struct.fcomp_t={
+	extension:		{bytes:4,				type:"str"},
+	cmd:			{bytes:LEN_CMD+1,		type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	__PADDING__:16
+};
+
+/* Viewable File Types */
+struct.fview_t={
+	extension:		{bytes:4,				type:"str"},
+	cmd:			{bytes:LEN_CMD+1,		type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	__PADDING__:16
+};
+
+/* Testable File Types */
+struct.ftest_t={
+	extension:		{bytes:4,				type:"str"},
+	cmd:			{bytes:LEN_CMD+1,		type:"str"},
+	working:		{bytes:41,				type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	__PADDING__:16
+};
+
+/* Download Events */
+struct.dlevent_t={
+	extension:		{bytes:4,				type:"str"},
+	cmd:			{bytes:LEN_CMD+1,		type:"str"},
+	working:		{bytes:41,				type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	__PADDING__:16
+};
+
+/* File Transfer Protocol (drivers) */
+struct.prot_t={
+	mnemonic:		{bytes:1,				type:"str"},
+	name:			{bytes:26,				type:"str"},
+	ulcmd:			{bytes:LEN_CMD+1,		type:"str"},
+	dlcmd:			{bytes:LEN_CMD+1,		type:"str"},
+	batulcmd:		{bytes:LEN_CMD+1,		type:"str"},
+	batdlcmd:		{bytes:LEN_CMD+1,		type:"str"},
+	blindcmd:		{bytes:LEN_CMD+1,		type:"str"},	// unused
+	bicmd:			{bytes:LEN_CMD+1,		type:"str"},
+	settings:		{bytes:UINT32_T,		type:"int"},	// misc
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	__PADDING__:16
+};
+
+struct.altpath_t={
+	path:			{bytes:LEN_DIR+1,		type:"str"},
+	__PADDING__:16
+};
+
+struct.txtsec_t={
+	name:			{bytes:41,				type:"str"},
+	code:			{bytes:LEN_CODE+1,		type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},
+	__PADDING__:16
+};
+
+/* file transfer configuration (file.cnf) */
+struct.file={
+	min_dspace:		{bytes:UINT16_T,		type:"int"},
+	max_batup:		{bytes:UINT16_T,		type:"int"},
+	max_batdn:		{bytes:UINT16_T,		type:"int"},
+	max_userxfer:	{bytes:UINT16_T,		type:"int"},
+	__PADDING1__:4,
+	cdt_up_pct:		{bytes:UINT16_T,		type:"int"},
+	cdt_dn_pct:		{bytes:UINT16_T,		type:"int"},
+	__PADDING2__:68,
+	leech_pct:		{bytes:UINT16_T,		type:"int"},
+	leech_sec:		{bytes:UINT16_T,		type:"int"},
+	settings:		{bytes:UINT32_T,		type:"int"},
+	__PADDING3__:60,
+	fextr:			{bytes:struct.fextr_t,	type:"lst"},
+	fcomp:			{bytes:struct.fcomp_t,	type:"lst"},
+	fview:			{bytes:struct.fview_t,	type:"lst"},
+	ftest:			{bytes:struct.ftest_t,	type:"lst"},
+	dlevent:		{bytes:struct.dlevent_t,type:"lst"},
+	prot:			{bytes:struct.prot_t,	type:"lst"},
+	altpath:		{bytes:struct.altpath_t,type:"lst"},
+	lib:			{bytes:struct.lib_t,	type:"lst"},
+	dir:			{bytes:struct.dir_t,	type:"lst"},
+	txtsec:			{bytes:struct.txtsec_t,	type:"lst"},
+};
\ No newline at end of file
diff --git a/exec/load/cnflib.js b/exec/load/cnflib.js
index ea773772b6fdfc94e4bdef4bd8ef9a4d7c316daf..2861475c8afbaa3edd86a5284ad03d1be29e520b 100644
--- a/exec/load/cnflib.js
+++ b/exec/load/cnflib.js
@@ -1,4 +1,4 @@
-/* CNF data structure definitions (see scfglib2.c) 
+/* CNF data structure definitions (see scfglib2.c, scfgdefs.h) 
 	$Id$
 */
 
@@ -51,7 +51,7 @@ var CNF = new (function() {
 		setStr(file,bytes,"");
 	}
 
-	/* read a set of records from xtrn.cnf */
+	/* read a set of records from *.cnf */
 	function readArray(file,struct,length) {
 		var list = [];
 		if(length == undefined)
@@ -116,7 +116,7 @@ var CNF = new (function() {
 		return list;
 	}
 
-	/* write a set of records to xtrn.cnf */
+	/* write a set of records to *.cnf */
 	function writeArray(file,struct,length,records) {
 		if(length == undefined) {
 			setInt(file,UINT16_T,records.length);
@@ -191,6 +191,9 @@ var CNF = new (function() {
 				case "msgs.cnf":
 					struct = js.global.struct.msg;
 					break;
+				case "file.cnf":
+					struct = js.global.struct.file;
+					break;
 				default:
 					return false;
 			}
@@ -215,6 +218,9 @@ var CNF = new (function() {
 				case "msgs.cnf":
 					struct = js.global.struct.msg;
 					break;
+				case "file.cnf":
+					struct = js.global.struct.file;
+					break;
 				default:
 					return false;
 			}