diff --git a/src/sbbs3/echocfg.c b/src/sbbs3/echocfg.c
index 53046f295b74c74305114096ebeb248253d55488..b47d7b404c7d553e946ed8c2ce4bf6987aee9803 100644
--- a/src/sbbs3/echocfg.c
+++ b/src/sbbs3/echocfg.c
@@ -180,24 +180,6 @@ int main(int argc, char **argv)
 	}
 	SAFECOPY(cfg.cfgfile,str);
 
-	p=getenv("SBBSCTRL");
-	if(!p) {
-		p=getenv("SBBSNODE");
-		if(!p) {
-			printf("usage: echocfg [cfg_file]\n");
-			exit(1); 
-		}
-		strcpy(str,p);
-		backslash(str);
-		strcat(str,"../ctrl/ftn_domains.ini"); 
-	}
-	else {
-		strcpy(str,p);
-		backslash(str);
-		strcat(str,"ftn_domains.ini"); 
-	} 
-	SAFECOPY(cfg.ftndomainsfile,str);
-
 	if(!sbbsecho_read_ini(&cfg)) {
 		fprintf(stderr, "ERROR %d (%s) reading %s\n", errno, strerror(errno), cfg.cfgfile);
 		exit(1);
diff --git a/src/sbbs3/rechocfg.c b/src/sbbs3/rechocfg.c
index 577543a1e4f656871bf82e021fff26a77c148225..43e7e28e6ee85639c923996ced4b99ab65ce992c 100644
--- a/src/sbbs3/rechocfg.c
+++ b/src/sbbs3/rechocfg.c
@@ -365,19 +365,31 @@ bool sbbsecho_read_ini(sbbsecho_cfg_t* cfg)
 
 	strListFree(&ini);
 
+	return true;
+}
+
+bool sbbsecho_read_ftn_domains(sbbsecho_cfg_t* cfg, const char * ctrl_dir)
+{
+	FILE*		fp;
+	str_list_t	ini;
+	char		path[MAX_PATH+1];
+	str_list_t	domains;
+	const char *	domain;
+	str_list_t	zones;
+	const char *	zone;
+	struct zone_mapping * mapping;
+
 	if(cfg->use_ftn_domains) {
-		if((fp=iniOpenFile(cfg->ftndomainsfile, /* create: */false))==NULL)
+		SAFEPRINTF(path, "%sftn_domains.ini", ctrl_dir);
+		if((fp=iniOpenFile(path, /* create: */false))==NULL)
 			return false;
 		ini = iniReadFile(fp);
 		iniCloseFile(fp);
-		str_list_t domains = iniGetSectionList(ini, NULL);
-		const char* domain;
+		domains = iniGetSectionList(ini, NULL);
 		while((domain = strListPop(&domains)) != NULL) {
-			str_list_t zones = iniGetStringList(ini, domain, "Zones", ",", NULL);
-			const char* zone;
+			zones = iniGetStringList(ini, domain, "Zones", ",", NULL);
 			while((zone = strListPop(&zones)) != NULL) {
-				char path[MAX_PATH+1];
-				struct zone_mapping *mapping = (struct zone_mapping *)malloc(sizeof(struct zone_mapping));
+				mapping = (struct zone_mapping *)malloc(sizeof(struct zone_mapping));
 
 				if (mapping == NULL) {
 					strListFree(&zones);
@@ -390,9 +402,11 @@ bool sbbsecho_read_ini(sbbsecho_cfg_t* cfg)
 				mapping->next = cfg->zone_map;
 				cfg->zone_map = mapping;
 			}
+			strListFree(&zones);
 		}
+		strListFree(&domains);
 	}
-
+	strListFree(&ini);
 	return true;
 }
 
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 6d16dc0394797125b6e8b2e2f02151c53397ef0f..78ec34d77efe952a03464334b2fee5db9f960d2c 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -5015,13 +5015,14 @@ int main(int argc, char **argv)
 	if(!cfg.cfgfile[0])
 		SAFEPRINTF(cfg.cfgfile,"%ssbbsecho.ini",scfg.ctrl_dir);
 
-	if(!cfg.ftndomainsfile[0])
-		SAFEPRINTF(cfg.ftndomainsfile,"%sftn_domains.ini",scfg.ctrl_dir);
-
 	if(!sbbsecho_read_ini(&cfg)) {
 		fprintf(stderr, "ERROR %d (%s) reading %s\n", errno, strerror(errno), cfg.cfgfile);
 		bail(1);
 	}
+	if(!sbbsecho_read_ftn_domains(&cfg, scfg.ctrl_dir)) {
+		fprintf(stderr, "ERROR %d (%s) reading %sftn_domains.ini\n", errno, strerror(errno), scfg.ctrl_dir);
+		bail(1);
+	}
 
 	if(nodeaddr.zone && (nodecfg = findnodecfg(&cfg, nodeaddr, /* exact: */true)) == NULL) {
 		fprintf(stderr, "Invalid node address: %s\n", argv[i]);
diff --git a/src/sbbs3/sbbsecho.h b/src/sbbs3/sbbsecho.h
index 5d5edf79d60b3c43b3c895277e47cae893e27bf2..aad74decea00e9642392169c1ae28cd5dac41650 100644
--- a/src/sbbs3/sbbsecho.h
+++ b/src/sbbs3/sbbsecho.h
@@ -135,7 +135,6 @@ typedef struct {
 	char		areafile[MAX_PATH+1];	/* AREAS.BBS path/filename */
 	char		logfile[MAX_PATH+1];	/* LOG path/filename */
 	char		cfgfile[MAX_PATH+1];	/* Configuration path/filename */
-	char		ftndomainsfile[MAX_PATH+1];	/* ftn_domains.ini path/filename */
 	char		temp_dir[MAX_PATH+1];	/* Temporary file directory */
 	str_list_t	sysop_alias_list;		/* List of sysop aliases */
 	ulong		maxpktsize				/* Maximum size for packets */
@@ -186,6 +185,7 @@ char* mailStatusStringList[4];
 /* Function prototypes */
 /***********************/
 bool sbbsecho_read_ini(sbbsecho_cfg_t*);
+bool sbbsecho_read_ftn_domains(sbbsecho_cfg_t*, const char*);
 bool sbbsecho_write_ini(sbbsecho_cfg_t*);
 void bail(int code);
 fidoaddr_t atofaddr(const char *str);