diff --git a/exec/avatars.js b/exec/avatars.js
index 8b2974339d44dadb9f096ca11fa094feada365c9..6ef66f81a0114d87864f6d7ef72088510e1bc3d7 100644
--- a/exec/avatars.js
+++ b/exec/avatars.js
@@ -290,12 +290,14 @@ function import_from_msgbase(msgbase, import_ptr, limit, all)
 			break;
     }
 
-    if(ini.open(file_exists(ini.name) ? 'r+':'w+')) {
-        print("new import_ptr = " + highest);
-        ini.iniSetValue("avatars","import_ptr",highest);
-        ini.close();
-    } else
-        print("Error opening/creating " + ini.name);
+	if(highest != import_ptr) {
+		if(ini.open(file_exists(ini.name) ? 'r+':'w+')) {
+			print("new import_ptr = " + highest);
+			ini.iniSetValue("avatars","import_ptr",highest);
+			ini.close();
+		} else
+			print("Error opening/creating " + ini.name);
+	}
     print("Imported " + count + " messages");
 }
 
@@ -466,17 +468,17 @@ function install()
 				"sec": 0,
 				"name": "Avatar Chooser",
 				"code": "AVATCHOO",
-				"arstr": "",
-				"run_arstr": "ANSI & !GUEST & REST ! Q",
+				"ars": "",
+				"run_ars": "ANSI & !GUEST & REST ! Q",
 				"type": 0,
-				"misc": 1,
+				"settings": 1,
 				"event": 3,
 				"cost": 0,
 				"cmd": "?avatar_chooser",
-				"clean": "",
-				"path": "",
+				"clean_cmd": "",
+				"startup_dir": "",
 				"textra": 0,
-				"maxtime": 0
+				"max_time": 0
 				});
 		changed = true;
 	}
@@ -488,9 +490,9 @@ function install()
 				"cmd": "?avatars import",
 				"days": 255,
 				"time": 0,
-				"node": 1,
-				"misc": 0,
-				"dir": "",
+				"node_num": 1,
+				"settings": 0,
+				"startup_dir": "",
 				"freq": 30,
 				"mdays": 0,
 				"months": 0
@@ -505,9 +507,9 @@ function install()
 				"cmd": "?avatars export",
 				"days": 255,
 				"time": 0,
-				"node": 1,
-				"misc": 0,
-				"dir": "",
+				"node_num": 1,
+				"settings": 0,
+				"startup_dir": "",
 				"freq": 30,
 				"mdays": 0,
 				"months": 0
@@ -593,6 +595,7 @@ function main()
 			case "install":
 			case "normalize":
 			case "count":
+			case "colls":
 				cmds.push(arg);
 				break;
 			default:
@@ -821,6 +824,43 @@ function main()
 					printf("%u total\r\n", total);
 					break;
 				}
+			case "colls":
+				if(!files.length) {
+					var total = 0;
+					files = directory(lib.local_library() + "*.bin");
+					for(var i in files) {
+						var filename = files[i];
+						if(filename.search(EXCLUDE_FILES) >= 0)
+							continue;
+						printf("%-32s : ", file_getname(filename));
+						var sauce = SAUCE.read(filename);
+						if(!sauce) {
+							printf("no SAUCE\r\n");
+							conintue;
+						}
+						var count = sauce.filesize / lib.size;
+						printf("%u\r\n", count);
+						total += count;
+						var f = new File(filename);
+						if(!f.open('rb')) {
+							alert("Error " + f.error + " opening " + f.name);
+							continue;
+						}
+						var buf = f.read();
+						f.close();
+						for(var a = 0; a < count; a++) {
+							var avatar = buf.substr(a * lib.size, lib.size);
+							var b64 = base64_encode(avatar);
+							printf("%s #%u: ", file_getname(filename), a+1);
+							if(sauce.comment[a])
+								print(sauce.comment[a]);
+							print(b64);
+							print(LZString.compressToBase64(avatar));
+						}
+					}
+					printf("%u total\r\n", total);
+					break;
+				}
 				break;
 			case "install":
 				var result = install();
diff --git a/exec/binkit.js b/exec/binkit.js
index 8266341e902e99a1acb894361d4c53bee8e6c199..f6583dbb0423c6c0b60ac3d1ebd8e5e1f861c7a3 100644
--- a/exec/binkit.js
+++ b/exec/binkit.js
@@ -972,9 +972,9 @@ function install()
 				"cmd": "?binkit",
 				"days": 255,
 				"time": 0,
-				"node": 1,
-				"misc": 0,
-				"dir": "",
+				"node_num": 1,
+				"settings": 0,
+				"startup_dir": "",
 				"freq": 0,
 				"mdays": 0,
 				"months": 0
@@ -989,9 +989,9 @@ function install()
 				"cmd": "?binkit -p",
 				"days": 255,
 				"time": 0,
-				"node": 1,
-				"misc": 0,
-				"dir": "",
+				"node_num": 1,
+				"settings": 0,
+				"startup_dir": "",
 				"freq": 60,
 				"mdays": 0,
 				"months": 0
diff --git a/exec/load/cnfdefs.js b/exec/load/cnfdefs.js
index 228a4bbf790e4f3b7a22d09bfb06f1400799f8b2..7afbc83c4a3389d34d96d0d872590d2d361d2b8a 100644
--- a/exec/load/cnfdefs.js
+++ b/exec/load/cnfdefs.js
@@ -6,6 +6,11 @@
 (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
+ * names which correlate with the Synchronet JS object model (jsobjs.html).
+ */
+
 var LEN_DIR = 		63;
 var LEN_CMD = 		63;
 var LEN_ARSTR =		40;
@@ -36,52 +41,52 @@ struct.swap_t={
 struct.xedit_t={
 	name:		{bytes:41,				type:"str"},
 	code:		{bytes:LEN_CODE+1,		type:"str"},
-	lcmd:		{bytes:LEN_CMD+1,		type:"str"},
-	rcmd:		{bytes:LEN_CMD+1,		type:"str"},
-	misc:		{bytes:UINT32_T,		type:"int"},
-	arstr:		{bytes:LEN_ARSTR+1,		type:"str"},
+	cmd:		{bytes:LEN_CMD+1,		type:"str"},	// was lcmd
+	rcmd:		{bytes:LEN_CMD+1,		type:"str"},	// unused
+	settings:	{bytes:UINT32_T,		type:"int"},	// was misc
+	ars:		{bytes:LEN_ARSTR+1,		type:"str"},	// was arstr
 	type:		{bytes:UCHAR,			type:"int"},
 	__PADDING__:15
 };
 struct.xtrnsec_t={
 	name:		{bytes:41,				type:"str"},
 	code:		{bytes:LEN_CODE+1,		type:"str"},
-	arstr:		{bytes:LEN_ARSTR+1,		type:"str"},
+	ars:		{bytes:LEN_ARSTR+1,		type:"str"},	// was arstr
 	__PADDING__:16
 };
 struct.xtrn_t={
-	sec:		{bytes:UINT16_T,		type:"int"},
-	name:		{bytes:41,				type:"str"},
-	code:		{bytes:LEN_CODE+1,		type:"str"},
-	arstr:		{bytes:LEN_ARSTR+1,		type:"str"},
-	run_arstr:	{bytes:LEN_ARSTR+1,		type:"str"},
-	type:		{bytes:UCHAR,			type:"int"},
-	misc:		{bytes:UINT32_T,		type:"int"},
-	event:		{bytes:UCHAR,			type:"int"},
-	cost:		{bytes:UINT32_T,		type:"int"},
-	cmd:		{bytes:LEN_CMD+1,		type:"str"},
-	clean:		{bytes:LEN_CMD+1,		type:"str"},
-	path:		{bytes:LEN_DIR+1,		type:"str"},
-	textra:		{bytes:UCHAR,			type:"int"},
-	maxtime:	{bytes:UCHAR,			type:"int"},
+	sec:			{bytes:UINT16_T,		type:"int"},
+	name:			{bytes:41,				type:"str"},
+	code:			{bytes:LEN_CODE+1,		type:"str"},
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},	// was arstr
+	execution_ars:	{bytes:LEN_ARSTR+1,		type:"str"},	// was run_arstr
+	type:			{bytes:UCHAR,			type:"int"},
+	settings:		{bytes:UINT32_T,		type:"int"},	// was misc
+	event:			{bytes:UCHAR,			type:"int"},
+	cost:			{bytes:UINT32_T,		type:"int"},
+	cmd:			{bytes:LEN_CMD+1,		type:"str"},
+	clean_cmd:		{bytes:LEN_CMD+1,		type:"str"},	// was clean
+	startup_dir:	{bytes:LEN_DIR+1,		type:"str"},	// was path
+	textra:			{bytes:UCHAR,			type:"int"},
+	max_time:		{bytes:UCHAR,			type:"int"},	// was maxtime
 	__PADDING__:14
 };
 struct.event_t={
-	code:		{bytes:LEN_CODE+1,		type:"str"},
-	cmd:		{bytes:LEN_CMD+1,		type:"str"},
-	days:		{bytes:1,				type:"int"},
-	time:		{bytes:UINT16_T,		type:"int"},
-	node:		{bytes:UINT16_T,		type:"int"},
-	misc:		{bytes:UINT32_T,		type:"int"},
-	dir:		{bytes:LEN_DIR+1,		type:"str"},
-	freq:		{bytes:UINT16_T,		type:"int"},
-	mdays:		{bytes:UINT32_T,		type:"int"},
-	months:		{bytes:UINT16_T,		type:"int"},
+	code:			{bytes:LEN_CODE+1,		type:"str"},
+	cmd:			{bytes:LEN_CMD+1,		type:"str"},
+	days:			{bytes:1,				type:"int"},
+	time:			{bytes:UINT16_T,		type:"int"},
+	node_num:		{bytes:UINT16_T,		type:"int"},	// was node
+	settings:		{bytes:UINT32_T,		type:"int"},	// was misc
+	startup_dir:	{bytes:LEN_DIR+1,		type:"str"},	// was dir
+	freq:			{bytes:UINT16_T,		type:"int"},
+	mdays:			{bytes:UINT32_T,		type:"int"},
+	months:			{bytes:UINT16_T,		type:"int"},
 	__PADDING__:8
 };
 struct.natvpgm_t={
 	name:		{bytes:13,				type:"str"},
-	misc:		{bytes:UINT32_T,		type:"int"}
+	misc:		{bytes:UINT32_T,		type:"int"}			// unused
 };
 struct.hotkey_t={
 	key:		{bytes:UCHAR,			type:"int"},
@@ -97,40 +102,40 @@ struct.faddr_t={
 	faddr4:		{bytes:2,				type:"int"}
 };
 struct.sub_t={
-	grp:		{bytes:UINT16_T,		type:"int"},
-	lname:		{bytes:LEN_SLNAME+1,	type:"str"},
-	sname:		{bytes:LEN_SSNAME+1,	type:"str"},
-	qwkname:	{bytes:11,				type:"str"},
-	code_suffix:{bytes:LEN_CODE+1,		type:"str"},
-	data_dir:	{bytes:LEN_DIR+1,		type:"str"},
-	arstr:		{bytes:LEN_ARSTR+1,		type:"str"},
-	read_arstr:	{bytes:LEN_ARSTR+1,		type:"str"},
-	post_arstr:	{bytes:LEN_ARSTR+1,		type:"str"},
-	op_arstr:	{bytes:LEN_ARSTR+1,		type:"str"},
+	grp_number:		{bytes:UINT16_T,		type:"int"},	// was grp
+	description:	{bytes:LEN_SLNAME+1,	type:"str"},	// was lname
+	name:			{bytes:LEN_SSNAME+1,	type:"str"},	// was sname
+	qwk_name:		{bytes:11,				type:"str"},	// was qwkname
+	code_suffix:	{bytes:LEN_CODE+1,		type:"str"},
+	data_dir:		{bytes:LEN_DIR+1,		type:"str"},
+	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
 	// uchar		*ar,
 				// *read_ar,
 				// *post_ar,
 				// *op_ar,
-	misc:		{bytes:UINT32_T,		type:"int"},
-	tagline:	{bytes:81,				type:"str"},
-	origline:	{bytes:51,				type:"str"},
-	post_sem:	{bytes:LEN_DIR+1,		type:"str"},
-	newsgroup:	{bytes:LEN_DIR+1,		type:"str"},
-	faddr:		{bytes:struct.faddr_t,	type:"obj"},
-	maxmsgs:	{bytes:UINT32_T,		type:"int"},
-	maxcrcs:	{bytes:UINT32_T,		type:"int"},
-	maxage:		{bytes:UINT16_T,		type:"int"},
-	ptridx:		{bytes:UINT16_T,		type:"int"},
-	mod_arstr:	{bytes:LEN_ARSTR+1,		type:"str"},
+	settings:		{bytes:UINT32_T,		type:"int"},	// was misc
+	qwknet_tagline:	{bytes:81,				type:"str"},	// was tagline
+	fidonet_origin:	{bytes:51,				type:"str"},	// was origline
+	post_sem:		{bytes:LEN_DIR+1,		type:"str"},
+	newsgroup:		{bytes:LEN_DIR+1,		type:"str"},
+	faddr:			{bytes:struct.faddr_t,	type:"obj"},
+	max_msgs:		{bytes:UINT32_T,		type:"int"},	// was maxmsgs
+	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
 	// *mod_ar;
-	qwkconf:	{bytes:UINT16_T,		type:"int"},
+	qwk_conf:		{bytes:UINT16_T,		type:"int"},	// was qwkconf
 	__PADDING__:53
 };
 struct.grp_t={
-	lname:		{bytes:LEN_GLNAME+1,	type:"str"},
-	sname:		{bytes:LEN_GSNAME+1,	type:"str"},
-	arstr:		{bytes:LEN_ARSTR+1,		type:"str"},
-	code_prefix:{bytes:LEN_CODE+1,		type:"str"},
+	description:	{bytes:LEN_GLNAME+1,	type:"str"},	// was lname
+	name:			{bytes:LEN_GSNAME+1,	type:"str"},	// was sname
+	ars:			{bytes:LEN_ARSTR+1,		type:"str"},	// was arstr
+	code_prefix:	{bytes:LEN_CODE+1,		type:"str"},
 	// uchar		*ar;
 	__PADDING__:87
 };
diff --git a/exec/sbbslist.js b/exec/sbbslist.js
index de827733144e467f8c6121ea9b53290b2ef575d7..6a93a2b16a2c396c5a159cd34ba17d488709f892 100644
--- a/exec/sbbslist.js
+++ b/exec/sbbslist.js
@@ -656,7 +656,7 @@ function verify_services(address, timeout)
         var service = udp_services[i];
         printf("Verifying %-10s UDP connection at %s\r\n", service, address);
         if(!udp_socket.sendto("\r\n", address, standard_service_port[service]))
-            log(LOG_ERR,format("FAILED Send to %s UDP service at %s", service, address));
+            log(LOG_NOTICE,format("FAILED Send to %s UDP service at %s", service, address));
     }
 
     for(i in tcp_services) {
@@ -678,7 +678,7 @@ function verify_services(address, timeout)
             break;
 		var msg=udp_socket.recvfrom(32*1024);
         if(msg==null)
-            log(LOG_ERR, "FAILED (UDP recv)");
+            log(LOG_NOTICE, "FAILED (UDP recv)");
         else {
             log(LOG_DEBUG, format("UDP message (%u bytes) from %s port %u", msg.data.length, msg.ip_address, msg.port));
             if(msg.ip_address != address)
@@ -1963,25 +1963,25 @@ function install()
 		"sec": 0,
 		"name": "Synchronet BBS List",
 		"code": "SBBSLIST",
-		"arstr": "",
-		"run_arstr": "",
+		"ars": "",
+		"run_ars": "",
 		"type": 0,
-		"misc": 1,
+		"settings": 1,
 		"event": 0,
 		"cost": 0,
 		"cmd": "?sbbslist.js browse",
-		"clean": "",
-		"path": "",
+		"clean_cmd": "",
+		"startup_dir": "",
 		"textra": 0,
-		"maxtime": 0
+		"max_time": 0
 		};
 	var smb2sbl_cfg = {
 		"code": "SMB2SBL",
 		"cmd": "?sbbslist import",
 		"days": 255,
 		"time": 0,
-		"node": 1,
-		"misc": 0,
+		"node_num": 1,
+		"settings": 0,
 		"dir": "",
 		"freq": 360,
 		"mdays": 0,
@@ -1992,8 +1992,8 @@ function install()
         "cmd": "?sbbslist export",
         "days": 255,
         "time": 0,
-        "node": 1,
-        "misc": 0,
+        "node_num": 1,
+        "settings": 0,
         "dir": "",
         "freq": 360,
         "mdays": 0,
@@ -2004,8 +2004,8 @@ function install()
         "cmd": "?sbbslist update -preview",
         "days": 255,
         "time": 0,
-        "node": 1,
-        "misc": 0,
+        "node_num": 1,
+        "settings": 0,
         "dir": "",
         "freq": 0,
         "mdays": 2,
@@ -2016,8 +2016,8 @@ function install()
         "cmd": "?sbbslist maint",
         "days": 255,
         "time": 0,
-        "node": 1,
-        "misc": 0,
+        "node_num": 1,
+        "settings": 0,
         "dir": "",
         "freq": 0,
         "mdays": 0,
@@ -2340,7 +2340,7 @@ function main()
 				bbs.total = lib.system_stats();
 				bbs.terminal.nodes = system.nodes;
 				if(preview) {
-					log("Capturing preview from: " + bbs.name);
+					log(LOG_INFO,"Capturing preview from: " + bbs.name);
 					var result = capture_preview(bbs, addr);
 					if(result != true)
 						alert(result);