diff --git a/src/sbbs3/echocfg.c b/src/sbbs3/echocfg.c
index e4df204afaf7b22cee9dc20a332f96ca7547f1be..55e59c98044e868f395ae2309e7c401f5849e1d4 100644
--- a/src/sbbs3/echocfg.c
+++ b/src/sbbs3/echocfg.c
@@ -809,6 +809,8 @@ int main(int argc, char **argv)
 						,cfg.check_path ? "Enabled" : "Disabled");
 					sprintf(opt[i++],"%-50.50s%s","Bundle Attachments"
 						,misc&TRUNC_BUNDLES ? "Truncate" : "Kill");
+					sprintf(opt[i++],"%-50.50s%s","Zone Blind SEEN-BY and PATH Lines"
+						,cfg.zone_blind ? "Enabled" : "Disabled");
 					opt[i][0]=0;
 					j=uifc.list(0,0,0,65,&j,0,"Toggle Options",opt);
 					if(j==-1)
@@ -847,6 +849,10 @@ int main(int argc, char **argv)
 						case 10:
 							misc^=TRUNC_BUNDLES;
 							break;
+						case 11:
+							cfg.zone_blind=!cfg.zone_blind;
+							break;
+
 					} 
 				}
 				break;
@@ -1155,6 +1161,8 @@ int main(int argc, char **argv)
 				}
 				if(!cfg.check_path)
 					fprintf(stream,"NOPATHCHECK\n");
+				if(cfg.zone_blind)
+					fprintf(stream,"ZONE_BLIND\n");
 				if(cfg.notify)
 					fprintf(stream,"NOTIFY %u\n",cfg.notify);
 				if(misc&CONVERT_TEAR)
diff --git a/src/sbbs3/rechocfg.c b/src/sbbs3/rechocfg.c
index 8882b1a9710105b3fba03ecd4025dbfebb758ffb..3b153241a4d614cdd8b4c6e555f13524d74de718 100644
--- a/src/sbbs3/rechocfg.c
+++ b/src/sbbs3/rechocfg.c
@@ -200,6 +200,7 @@ void read_echo_cfg()
 	cfg.log=LOG_DEFAULTS;
 	cfg.log_level=LOG_INFO;
 	cfg.check_path=TRUE;
+	cfg.zone_blind=FALSE;
 	SAFECOPY(cfg.sysop_alias,"SYSOP");
 
 	while(1) {
@@ -268,6 +269,11 @@ void read_echo_cfg()
 			continue;
 		}
 
+		if(!stricmp(tmp,"ZONE_BLIND")) {
+			cfg.zone_blind=TRUE;
+			continue;
+		}
+
 		if(!stricmp(tmp,"NOTIFY")) {
 			cfg.notify=atoi(cleanstr(p));
 			continue; }
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 9199f30382245136cf9a04e26969268b02c7dec6..9309c80947e213f1a6b68ad476116ccdbb05e0d2 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -2706,121 +2706,141 @@ void putfmsg(FILE *stream,char *fbuf,fmsghdr_t fmsghdr,areasbbs_t area
 			,SBBSECHO_VERSION_MAJOR,SBBSECHO_VERSION_MINOR,PLATFORM_DESC,revision);
 	}
 			
-#if 0
-	if(area.name && addr.zone!=fmsghdr.destzone)	/* Zone Gate */
-		fprintf(stream,"SEEN-BY: %d/%d\r",fmsghdr.destnet,fmsghdr.destnode);
-#endif
-	if(area.name /* && addr.zone==fmsghdr.destzone */) {	/* Not NetMail */
-		fprintf(stream,"SEEN-BY:");
-		for(i=0;i<seenbys.addrs;i++) {			  /* Put back original SEEN-BYs */
-			strcpy(seenby," ");
-			if(seenbys.addr[i].zone!=addr.zone)
-				continue;
-			if(seenbys.addr[i].net!=addr.net || !net_exists) {
-				net_exists=1;
-				addr.net=seenbys.addr[i].net;
-				sprintf(str,"%d/",addr.net);
-				strcat(seenby,str); }
-			sprintf(str,"%d",seenbys.addr[i].node);
-			strcat(seenby,str);
-			if(lastlen+strlen(seenby)<80) {
-				fwrite(seenby,strlen(seenby),1,stream);
-				lastlen+=strlen(seenby); }
-			else {
-				--i;
-				lastlen=9; /* +strlen(seenby); */
-				net_exists=0;
-				fprintf(stream,"\rSEEN-BY:"); } }
-
-		for(i=0;i<area.uplinks;i++) {			/* Add all uplinks to SEEN-BYs */
-			strcpy(seenby," ");
-			if(area.uplink[i].zone!=addr.zone || area.uplink[i].point)
-				continue;
-			for(j=0;j<seenbys.addrs;j++)
-				if(!memcmp(&area.uplink[i],&seenbys.addr[j],sizeof(faddr_t)))
-					break;
-			if(j==seenbys.addrs) {
-				if(area.uplink[i].net!=addr.net || !net_exists) {
+	if(area.name) { /* EchoMail, Not NetMail */
+		if(!cfg.zone_blind && addr.zone!=fmsghdr.destzone)	/* Zone Gate */
+			fprintf(stream,"SEEN-BY: %d/%d\r",fmsghdr.destnet,fmsghdr.destnode);
+		else {
+			fprintf(stream,"SEEN-BY:");
+			for(i=0;i<seenbys.addrs;i++) {			  /* Put back original SEEN-BYs */
+				strcpy(seenby," ");
+				if(!cfg.zone_blind && seenbys.addr[i].zone!=addr.zone)
+					continue;
+				if(seenbys.addr[i].net!=addr.net || !net_exists) {
 					net_exists=1;
-					addr.net=area.uplink[i].net;
+					addr.net=seenbys.addr[i].net;
 					sprintf(str,"%d/",addr.net);
-					strcat(seenby,str); }
-				sprintf(str,"%d",area.uplink[i].node);
+					strcat(seenby,str); 
+				}
+				sprintf(str,"%d",seenbys.addr[i].node);
 				strcat(seenby,str);
 				if(lastlen+strlen(seenby)<80) {
 					fwrite(seenby,strlen(seenby),1,stream);
-					lastlen+=strlen(seenby); }
+					lastlen+=strlen(seenby); 
+				}
 				else {
 					--i;
 					lastlen=9; /* +strlen(seenby); */
 					net_exists=0;
-					fprintf(stream,"\rSEEN-BY:"); } } }
+					fprintf(stream,"\rSEEN-BY:"); 
+				} 
+			}
 
-		for(i=0;i<scfg.total_faddrs;i++) {				/* Add AKAs to SEEN-BYs */
-			strcpy(seenby," ");
-			if(scfg.faddr[i].zone!=addr.zone || scfg.faddr[i].point)
-				continue;
-			for(j=0;j<seenbys.addrs;j++)
-				if(!memcmp(&scfg.faddr[i],&seenbys.addr[j],sizeof(faddr_t)))
-					break;
-			if(j==seenbys.addrs) {
-				if(scfg.faddr[i].net!=addr.net || !net_exists) {
+			for(i=0;i<area.uplinks;i++) {			/* Add all uplinks to SEEN-BYs */
+				strcpy(seenby," ");
+				if((!cfg.zone_blind && area.uplink[i].zone!=addr.zone) || area.uplink[i].point)
+					continue;
+				for(j=0;j<seenbys.addrs;j++)
+					if(!memcmp(&area.uplink[i],&seenbys.addr[j],sizeof(faddr_t)))
+						break;
+				if(j==seenbys.addrs) {
+					if(area.uplink[i].net!=addr.net || !net_exists) {
+						net_exists=1;
+						addr.net=area.uplink[i].net;
+						sprintf(str,"%d/",addr.net);
+						strcat(seenby,str); 
+					}
+					sprintf(str,"%d",area.uplink[i].node);
+					strcat(seenby,str);
+					if(lastlen+strlen(seenby)<80) {
+						fwrite(seenby,strlen(seenby),1,stream);
+						lastlen+=strlen(seenby); 
+					}
+					else {
+						--i;
+						lastlen=9; /* +strlen(seenby); */
+						net_exists=0;
+						fprintf(stream,"\rSEEN-BY:"); 
+					} 
+				} 
+			}
+
+			for(i=0;i<scfg.total_faddrs;i++) {				/* Add AKAs to SEEN-BYs */
+				strcpy(seenby," ");
+				if((!cfg.zone_blind && scfg.faddr[i].zone!=addr.zone) || scfg.faddr[i].point)
+					continue;
+				for(j=0;j<seenbys.addrs;j++)
+					if(!memcmp(&scfg.faddr[i],&seenbys.addr[j],sizeof(faddr_t)))
+						break;
+				if(j==seenbys.addrs) {
+					if(scfg.faddr[i].net!=addr.net || !net_exists) {
+						net_exists=1;
+						addr.net=scfg.faddr[i].net;
+						sprintf(str,"%d/",addr.net);
+						strcat(seenby,str); }
+					sprintf(str,"%d",scfg.faddr[i].node);
+					strcat(seenby,str);
+					if(lastlen+strlen(seenby)<80) {
+						fwrite(seenby,strlen(seenby),1,stream);
+						lastlen+=strlen(seenby); 
+					}
+					else {
+						--i;
+						lastlen=9; /* +strlen(seenby); */
+						net_exists=0;
+						fprintf(stream,"\rSEEN-BY:"); 
+					} 
+				} 
+			}
+
+			lastlen=7;
+			net_exists=0;
+			fprintf(stream,"\r\1PATH:");
+			addr=getsysfaddr(fmsghdr.destzone);
+			for(i=0;i<paths.addrs;i++) {			  /* Put back the original PATH */
+				strcpy(seenby," ");
+				if((!cfg.zone_blind && paths.addr[i].zone!=addr.zone) || paths.addr[i].point)
+					continue;
+				if(paths.addr[i].net!=addr.net || !net_exists) {
 					net_exists=1;
-					addr.net=scfg.faddr[i].net;
+					addr.net=paths.addr[i].net;
 					sprintf(str,"%d/",addr.net);
-					strcat(seenby,str); }
-				sprintf(str,"%d",scfg.faddr[i].node);
+					strcat(seenby,str); 
+				}
+				sprintf(str,"%d",paths.addr[i].node);
 				strcat(seenby,str);
 				if(lastlen+strlen(seenby)<80) {
 					fwrite(seenby,strlen(seenby),1,stream);
-					lastlen+=strlen(seenby); }
+					lastlen+=strlen(seenby); 
+				}
 				else {
 					--i;
-					lastlen=9; /* +strlen(seenby); */
+					lastlen=7; /* +strlen(seenby); */
 					net_exists=0;
-					fprintf(stream,"\rSEEN-BY:"); } } }
-
-		lastlen=7;
-		net_exists=0;
-		fprintf(stream,"\r\1PATH:");
-		addr=getsysfaddr(fmsghdr.destzone);
-		for(i=0;i<paths.addrs;i++) {			  /* Put back the original PATH */
-			strcpy(seenby," ");
-			if(paths.addr[i].zone!=addr.zone || paths.addr[i].point)
-				continue;
-			if(paths.addr[i].net!=addr.net || !net_exists) {
-				net_exists=1;
-				addr.net=paths.addr[i].net;
-				sprintf(str,"%d/",addr.net);
-				strcat(seenby,str); }
-			sprintf(str,"%d",paths.addr[i].node);
-			strcat(seenby,str);
-			if(lastlen+strlen(seenby)<80) {
-				fwrite(seenby,strlen(seenby),1,stream);
-				lastlen+=strlen(seenby); }
-			else {
-				--i;
-				lastlen=7; /* +strlen(seenby); */
-				net_exists=0;
-				fprintf(stream,"\r\1PATH:"); } }
-
-		strcpy(seenby," ");         /* Add first address with same zone to PATH */
-		sysaddr=getsysfaddr(fmsghdr.destzone);
-		if(!sysaddr.point) {
-			if(sysaddr.net!=addr.net || !net_exists) {
-				net_exists=1;
-				addr.net=sysaddr.net;
-				sprintf(str,"%d/",addr.net);
-				strcat(seenby,str); }
-			sprintf(str,"%d",sysaddr.node);
-			strcat(seenby,str);
-			if(lastlen+strlen(seenby)<80)
-				fwrite(seenby,strlen(seenby),1,stream);
-			else {
-				fprintf(stream,"\r\1PATH:");
-				fwrite(seenby,strlen(seenby),1,stream); } }
+					fprintf(stream,"\r\1PATH:"); 
+				} 
+			}
 
-		fputc('\r',stream); }
+			strcpy(seenby," ");         /* Add first address with same zone to PATH */
+			sysaddr=getsysfaddr(fmsghdr.destzone);
+			if(!sysaddr.point) {
+				if(sysaddr.net!=addr.net || !net_exists) {
+					net_exists=1;
+					addr.net=sysaddr.net;
+					sprintf(str,"%d/",addr.net);
+					strcat(seenby,str); 
+				}
+				sprintf(str,"%d",sysaddr.node);
+				strcat(seenby,str);
+				if(lastlen+strlen(seenby)<80)
+					fwrite(seenby,strlen(seenby),1,stream);
+				else {
+					fprintf(stream,"\r\1PATH:");
+					fwrite(seenby,strlen(seenby),1,stream); 
+				} 
+			}
+			fputc('\r',stream); 
+		}
+	}
 
 	fputc(FIDO_PACKED_MSG_TERMINATOR, stream);
 }
@@ -2990,19 +3010,27 @@ void gen_psb(addrlist_t *seenbys,addrlist_t *paths,char *inbuf
 
 /******************************************************************************
  This function takes the addrs passed to it and compares them to the address
- passed in inaddr.	1 is returned if inaddr matches any of the addrs
- otherwise a 0 is returned.
+ passed in compaddr.	TRUE is returned if inaddr matches any of the addrs
+ otherwise FALSE is returned.
 ******************************************************************************/
-int check_psb(addrlist_t* addrlist,faddr_t inaddr)
+BOOL check_psb(addrlist_t* addrlist, faddr_t compaddr)
 {
 	int i;
 
 	for(i=0;i<addrlist->addrs;i++) {
-		if(!memcmp(&addrlist->addr[i],&inaddr,sizeof(faddr_t)))
-			return(1); 
+		if(!cfg.zone_blind && compaddr.zone != addrlist->addr[i].zone)
+			continue;
+		if(compaddr.net != addrlist->addr[i].net)
+			continue;
+		if(compaddr.node != addrlist->addr[i].node)
+			continue;
+		if(compaddr.point != addrlist->addr[i].point)
+			continue;
+		return(TRUE); /* match found */
 	}
-	return(0);
+	return(FALSE);	/* match not found */
 }
+
 /******************************************************************************
  This function strips the message seen-bys and path from inbuf.
 ******************************************************************************/
diff --git a/src/sbbs3/sbbsecho.h b/src/sbbs3/sbbsecho.h
index 8ef2d00a089645934adcca40fc02213f24a21051..2b9beaf8f7adbeb5f92ea4fb5a2b2c4aae8c618f 100644
--- a/src/sbbs3/sbbsecho.h
+++ b/src/sbbs3/sbbsecho.h
@@ -38,7 +38,7 @@
 /* Portions written by Allen Christiansen 1994-1996 						*/
 
 #define SBBSECHO_VERSION_MAJOR		2
-#define SBBSECHO_VERSION_MINOR		22
+#define SBBSECHO_VERSION_MINOR		23
 
 #define SBBSECHO_PRODUCT_CODE		0x12FF	/* from http://ftsc.org/docs/ftscprod.013 */
 
@@ -241,6 +241,7 @@ typedef struct {
 	echolist_t *listcfg;			/* Each echolist configuration */
 	areasbbs_t *area;				/* Each area configuration */
 	BOOL		check_path;			/* Enable circular path detection */
+	BOOL		zone_blind;			/* Pretend zones don't matter when parsing and constructing PATH and SEEN-BY lines (per Wilfred van Velzen, 2:280/464) */
 	} config_t;
 
 #ifdef __WATCOMC__