diff --git a/exec/binkit.js b/exec/binkit.js
index 11f5febe9486d08b023d12f9138b198d870483de..8681250f25e50d4dd14ac1bede74027137d11171 100644
--- a/exec/binkit.js
+++ b/exec/binkit.js
@@ -916,7 +916,7 @@ function inbound_auth_cb(pwd, bp)
 						bp.cram.challenge += '\x00\x00\x00';
 						expected = bp.getCRAM('MD5', cpw);
 						if (expected === pwd[0]) {
-							log(LOG_INFO, "CRAM-MD5 password match for " + addr);
+							log(LOG_INFO, "Mystic CRAM-MD5 password match for " + addr);
 							addrs.push(addr);
 							check_nocrypt(bp.cb_data.binkitcfg.node[addr]);
 							ret = cpw;
@@ -1123,6 +1123,13 @@ function install()
 	ini.iniSetValue(null, "BinkleyStyleOutbound", true);
 	ini.iniSetValue(null, "OutgoingSemaphore", "../data/binkout.now");
 	var links = ini.iniGetAllObjects("addr", "node:");
+	for (var i in links) {
+		if (links[i].addr.toUpperCase().indexOf('ALL') >= 0)	// Don't include wildcard links
+			continue;
+		var password = links[i].PacketPwd ? links[i].PacketPwd : links[i].AreaFixPwd;
+		ini.iniSetValue("node:"+links[i].addr, "SessionPwd", password === undefined ? '' : password);
+		ini.iniSetValue("node:"+links[i].addr, "Poll", links[i].GroupHub ? true : false);
+	}
 	ini.close();
 
 	ini = new File(file_cfgname(system.ctrl_dir, "services.ini"));
@@ -1137,26 +1144,70 @@ function install()
 	}
 	ini.close();
 
-	ini = new File(file_cfgname(system.ctrl_dir, "binkit.ini"));
-	if (!file_exists(ini.name)) {
-		if (!ini.open('wt'))
-			return ini.name + " create error " + ini.error;
-		printf("Creating %s\r\n", ini.name);
-		for (var i in links) {
-			if (links[i].addr.toUpperCase().indexOf('ALL') >= 0)	// Don't include wildcard links
-				continue;
-			ini.writeln(format("[%s]", links[i].addr));
-			var password = links[i].PacketPwd ? links[i].PacketPwd : links[i].AreaFixPwd;
-			ini.writeln(format("Password=%s", password === undefined ? '' : password));
-			ini.writeln(format("Poll=%s", links[i].GroupHub ? true : false));
-			ini.writeln();
+	return true;
+}
+
+// Upgrade from separate binkit.ini/sbbsecho.ini/ftn_domains.ini to a combined sbbsecho.ini
+function upgrade()
+{
+	var sbbsecho_ini = new File(file_cfgname(system.ctrl_dir, "sbbsecho.ini"));
+	if (!sbbsecho_ini.open('r+'))
+		return sbbsecho_ini.name + " open error " + sbbsecho_ini.error;
+	printf("Updating %s\r\n", sbbsecho_ini.name);
+
+	var binkit_ini = new File(file_cfgname(system.ctrl_dir, "binkit.ini"));
+	if(binkit_ini.open("r")) {
+		
+		sbbsecho_ini.iniSetValue("BinkP", "Capabilities", binkit_ini.iniGetValue(null, "Capabilities", ""));
+		sbbsecho_ini.iniSetValue("BinkP", "Sysop", binkit_ini.iniGetValue(null, "Sysop", ""));
+
+		var nodes = sbbsecho_ini.iniGetSections("node:");
+		var links = binkit_ini.iniGetSections();
+		for(var i in links) {
+			var section = "node:" + links[i];
+			for(var n in nodes) {
+				if(nodes[n] + '@' == section.substr(0, nodes[n].length + 1)) {
+					section = nodes[n];
+					break;
+				}
+			}
+			var obj = sbbsecho_ini.iniGetObject(section);
+			if(obj == null)
+				obj = {};
+			sbbsecho_ini.iniRemoveSection(section);
+			obj.SessionPwd = binkit_ini.iniGetValue(links[i], "Password", "");
+			obj.BinkpHost = binkit_ini.iniGetValue(links[i], "host", "");
+			obj.BinkpPort = binkit_ini.iniGetValue(links[i], "port", 24554);
+			obj.BinkpPoll = binkit_ini.iniGetValue(links[i], "poll", false);
+			obj.BinkpAllowPlainAuth = binkit_ini.iniGetValue(links[i], "AllowPlainPassword", false);
+			obj.BinkpAllowPlainText = binkit_ini.iniGetValue(links[i], "AllowUnencrypted", false);
+			obj.BinkpSourceAddress = binkit_ini.iniGetValue(links[i], "SourceAddress", "");
+			print("Writing");
+			print(JSON.stringify(obj, null, 4));
+			sbbsecho_ini.iniSetObject("node:" + links[i], obj);
+		}
+		binkit_ini.close();
+
+		file_rename(binkit_ini.name, binkit_ini.name + ".old");
+	}
+
+	/* Merge ftn_domains.ini -> sbbsecho.ini */
+	var domains_ini = new File(file_cfgname(system.ctrl_dir, "ftn_domains.ini"));
+	if(domains_ini.open("r")) {
+		
+		var domains = domains_ini.iniGetAllObjects("name");
+		for(var d in domains) {
+			var section = "domain:" + domains[d].name;
+			delete domains[d].name;
+			sbbsecho_ini.iniSetObject(section, domains[d]);
 		}
-		ini.close();
+		domains_ini.close();
+		file_rename(domains_ini.name, domains_ini.name + ".old");
 	}
+	sbbsecho_ini.close();
 	return true;
 }
 
-
 var sock;
 try {
 	sock = client.socket;
@@ -1180,6 +1231,14 @@ else {
 		}
 		exit(0);
 	}
+	if (argv.indexOf('upgrade') !== -1) {
+		var result = upgrade();
+		if (result != true) {
+			alert(result);
+			exit(1);
+		}
+		exit(0);
+	}
 	if (argv.indexOf('-l') !== -1) {
 		for (i=0; i<argv.length; i++) {
 			if (argv[i] === '-l') {