diff --git a/exec/binkit.js b/exec/binkit.js
index dc628d770d1c8660b7f2f59857fa0b21448b4d88..4afb7c704b4be1713254d0aa331ea82c2cbc5114 100644
--- a/exec/binkit.js
+++ b/exec/binkit.js
@@ -566,45 +566,7 @@ function callout(addr, scfg, locks, bicfg)
 	else
 		src_addr = addr;
 	// Sort by "distance" from src_addr address.
-	bp.addr_list.sort(function(addr1, addr2) {
-		var dist1;
-		var dist2;
-
-		if (addr1.str === src_addr.str)
-			return -1;
-		if (addr2.str === src_addr.str)
-			return 1;
-		if (addr1.domain !== addr2.domain) {
-			if (addr1.domain === src_addr.domain)
-				return -1;
-			if (addr2.domain === src_addr.domain)
-				return 1;
-			if (addr1.domain < addr2.domain)
-				return -1;
-			return 1;
-		}
-		if (addr1.zone !== addr2.zone) {
-			dist1 = Math.abs(addr1.zone - src_addr.zone);
-			dist2 = Math.abs(addr2.zone - src_addr.zone);
-			return dist1-dist2;
-		}
-		if (addr1.net !== addr2.net) {
-			dist1 = Math.abs(addr1.net - src_addr.net);
-			dist2 = Math.abs(addr2.net - src_addr.net);
-			return dist1-dist2;
-		}
-		if (addr1.node !== addr2.node) {
-			dist1 = Math.abs(addr1.node - src_addr.node);
-			dist2 = Math.abs(addr2.node - src_addr.node);
-			return dist1-dist2;
-		}
-		if (addr1.point !== addr2.point) {
-			dist1 = Math.abs(addr1.point - src_addr.point);
-			dist2 = Math.abs(addr2.point - src_addr.point);
-			return dist1-dist2;
-		}
-		return 0;
-	});
+	FIDO.distance_sort(bp.addr_list, src_addr);
 
 	log(LOG_DEBUG, format("connecting to %s at %s", addr, host));
 	// We won't add files until the auth finishes...
diff --git a/exec/load/fido.js b/exec/load/fido.js
index ddafa51686cfe5c9d50f5370df8e92fec002eb80..683738e668c5c3bf3049b792fba8636ddd36fba5 100644
--- a/exec/load/fido.js
+++ b/exec/load/fido.js
@@ -37,6 +37,10 @@ require('fido_syscfg.js', 'FTNDomains');
  * 		it containing all the nodelist entries (4D address is the key
  * 		unless domain is specified in which case 5D address is the key).
  * 		If warn is true, will warn on "illegal" values (per FTS-0005).
+ *
+ * FIDO.distance_sort(array, anchor)
+ *		Sorts an array of addresses by increasing distance from anchor.
+ *		The elements of the array and anchor should be FIDO.Addr objects.
  */
 
 var FIDO = {
@@ -424,7 +428,7 @@ var FIDO = {
 				this.messages.push(new FIDO.PackedMessage(this, offset));
 			}
 		}
-	}
+	},
 	/*
 	 * Suggested kludge lines:
 	 * INTL: (FTS-0001)
@@ -433,6 +437,49 @@ var FIDO = {
 	 * TZUTC: (FTS-4008)
 	 * PID: (FTS-
 	 */
+	distance_sort:function(addrs, anchor)
+	{
+		// Sort by "distance" from anchor.
+		addrs.sort(function(addr1, addr2) {
+			var dist1;
+			var dist2;
+
+			if (addr1.str === anchor.str)
+				return -1;
+			if (addr2.str === anchor.str)
+				return 1;
+			if (addr1.domain !== addr2.domain) {
+				if (addr1.domain === anchor.domain)
+					return -1;
+				if (addr2.domain === anchor.domain)
+					return 1;
+				if (addr1.domain < addr2.domain)
+					return -1;
+				return 1;
+			}
+			if (addr1.zone !== addr2.zone) {
+				dist1 = Math.abs(addr1.zone - anchor.zone);
+				dist2 = Math.abs(addr2.zone - anchor.zone);
+				return dist1-dist2;
+			}
+			if (addr1.net !== addr2.net) {
+				dist1 = Math.abs(addr1.net - anchor.net);
+				dist2 = Math.abs(addr2.net - anchor.net);
+				return dist1-dist2;
+			}
+			if (addr1.node !== addr2.node) {
+				dist1 = Math.abs(addr1.node - anchor.node);
+				dist2 = Math.abs(addr2.node - anchor.node);
+				return dist1-dist2;
+			}
+			if (addr1.point !== addr2.point) {
+				dist1 = Math.abs(addr1.point - anchor.point);
+				dist2 = Math.abs(addr2.point - anchor.point);
+				return dist1-dist2;
+			}
+			return 0;
+		});
+	}
 };
 Object.defineProperties(FIDO.Addr.prototype, {
 	'str': {
diff --git a/exec/tickit.js b/exec/tickit.js
index 5343ef19b932e7cb7b499cbff4d1d944099b0dc9..88b26d3de446ad78a966ba3cce3c4408b577fb83 100644
--- a/exec/tickit.js
+++ b/exec/tickit.js
@@ -24,8 +24,8 @@
  */
 
 load("sbbsdefs.js");
-load("fidocfg.js");
-load("fido.js");
+require("fidocfg.js", 'TickITCfg');
+require("fido.js", 'FIDO');
 
 var sbbsecho = new SBBSEchoCfg();
 var tickit = new TickITCfg();
@@ -214,34 +214,6 @@ function add_links(seenbys, links, list)
 	}
 }
 
-function parse_addr(addr, dz)
-{
-	var m;
-	var ret={zone:dz, net:0, node:0, point:0};
-
-	m = addr.match(/^([0-9]+):/);
-	if (m !== null)
-		ret.zone = parseInt(m[1], 10);
-
-	m = addr.match(/([0-9]+)\//);
-	if (m !== null)
-		ret.net = parseInt(m[1], 10);
-
-	m = addr.match(/\/([0-9]+)/);
-	if (m !== null)
-		ret.node = parseInt(m[1], 10);
-
-	m = addr.match(/\.([0-9]+)/);
-	if (m !== null)
-		ret.point = parseInt(m[1], 10);
-
-	m = addr.match(/@.+$/);
-	if (m !== null)
-		ret.domain = m[1];
-
-	return ret;
-}
-
 function get_zone(addr)
 {
 	var m;
@@ -268,13 +240,18 @@ function forward_tic(tic)
 	var flobase;
 	var pw;
 	var i;
+	var addrs;
+	var saddr;
 
 	defzone = get_zone(system.fido_addr_list[0]);
 	if (defzone === undefined) {
-		log(LOG_ERROR, "Unable to detect default zone!");
+		log(LOG_ERROR, "Unable to detect fido_addr_listdefault zone!");
 		return false;
 	}
 
+	for (saddr in system.fido_addr_list)
+		addrs.push(FIDO.parse_addr(system.fido_addr_list[saddr]));
+
 	// Add us to the path...
 	tic.path.push(system.fido_addr_list[0]);
 
@@ -310,7 +287,7 @@ function forward_tic(tic)
 			pw = '';
 
 		// Figure out the outbound dir...
-		addr = parse_addr(link, defzone);
+		addr = FIDO.parse_addr(link, defzone);
 		if (addr.zone === undefined)
 			addr.zone = defzone;
 
@@ -341,7 +318,9 @@ function forward_tic(tic)
 		}
 		tf.write(tic[' forward'].join("\r\n"));
 		tf.write('\r\n');
-		tf.write('From '+system.fido_addr_list[0]+'\r\n');
+		// TODO: Use BinkpSourceAddress?
+		FIDO.distance_sort(addrs, addr);
+		tf.write('From '+addrs[0]+'\r\n');
 		tf.write('To '+link+'\r\n');
 		tf.write('Pw '+pw+'\r\n');
 		for (i=0; i<tic.path.length; i++)