diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 08f01cca969548bf23e9fbe28e6210bb83dde656..e3871d3c56663e21b27f298c981a21a0f0786f22 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -2631,24 +2631,6 @@ static int chk_received_hdr(SOCKET socket,const char* prot,const char *buf,IN_AD
 	return(dnsbl_result->s_addr);
 }
 
-static void strip_char(char* str, char ch)
-{
-	char* src;
-	char* p;
-	char* tmp = strdup(str);
-
-	if(tmp == NULL)
-		return;
-	p=tmp;
-	for(src = str; *src; src++) {
-		if(*src != ch)
-			*(p++) = *src;
-	}
-	*p=0;
-	strcpy(str, tmp);
-	free(tmp);
-}
-
 static void parse_mail_address(char* p
 							   ,char* name, size_t name_len
 							   ,char* addr, size_t addr_len)
@@ -2684,7 +2666,7 @@ static void parse_mail_address(char* p
 	if(tp) *tp=0;
 	sprintf(name,"%.*s",(int)name_len,p);
 	truncsp(name);
-	strip_char(name, '\\');
+	strip_char(name, name, '\\');
 }
 
 /* Decode quoted-printable content-transfer-encoded text */
@@ -4015,7 +3997,7 @@ static void smtp_thread(void* arg)
 				continue;
 			}
 			/* RFC822 Header parsing */
-			strip_char(buf, '\r');	/* There should be no bare carriage returns in header fields */
+			strip_char(buf, buf, '\r');	/* There should be no bare carriage returns in header fields */
 			if(startup->options&MAIL_OPT_DEBUG_RX_HEADER)
 				lprintf(LOG_DEBUG,"%04d %s %s",socket, client.protocol, buf);
 
diff --git a/src/sbbs3/rechocfg.c b/src/sbbs3/rechocfg.c
index 971608a2cf77c4afd3cf977b87a1233160cdb9b8..67316186214e308b063a65851137f7425d1dcac3 100644
--- a/src/sbbs3/rechocfg.c
+++ b/src/sbbs3/rechocfg.c
@@ -230,6 +230,7 @@ void get_default_echocfg(sbbsecho_cfg_t* cfg)
 	cfg->auto_add_subs				= true;
 	cfg->auto_add_to_areafile		= true;
 	cfg->auto_utf8					= true;
+	cfg->strip_soft_cr				= true;
 	cfg->min_free_diskspace			= 10*1024*1024;
 }
 
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index ca69c300db720b10ae114dad7b7b59d3146336d5..e184332582d1b26f17933ec9924906a5ab0100ed 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -1160,6 +1160,7 @@ extern "C" {
 	DLLEXPORT char *	strip_space(const char *str, char* dest);
 	DLLEXPORT char *	prep_file_desc(const char *str, char* dest);
 	DLLEXPORT char *	strip_ctrl(const char *str, char* dest);
+	DLLEXPORT char *	strip_char(const char* str, char* dest, char);
 	DLLEXPORT char *	net_addr(net_t* net);
 	DLLEXPORT BOOL		valid_ctrl_a_attr(char a);
 	DLLEXPORT BOOL		valid_ctrl_a_code(char a);
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 99a788b48c3388150ed9ede758d7e38d860b029f..1278a5426074455104ee7df2b2ac18178d5fef8d 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -3475,8 +3475,7 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t* hdr, uint user, uint subnum)
 			continue;
 		}
 
-		if(ch == '\n' ||
-			(ch == FIDO_SOFT_CR && cfg.strip_soft_cr))
+		if(ch == '\n')
 			continue;
 		if(cr && (!strncmp((char *)fbuf+l,"--- ",4)
 			|| !strncmp((char *)fbuf+l,"---\r",4)))
@@ -3549,6 +3548,10 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t* hdr, uint user, uint subnum)
 
 	if(smb_msg_is_utf8(&msg))
 		msg.hdr.auxattr |= MSG_HFIELDS_UTF8;
+	else {
+		if(cfg.strip_soft_cr)
+			strip_char((const char*)sbody, (char*)sbody, FIDO_SOFT_CR);
+	}
 
 	if(subnum==INVALID_SUB && !bodylen && !taillen && cfg.kill_empty_netmail) {
 		lprintf(LOG_INFO,"Empty NetMail - Ignored ");
diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c
index 7ca637b7aa3292f0f03811f120cab8b03a796e09..e0adfdfdb12e133d3ac37cb564e359741150c6b3 100644
--- a/src/sbbs3/str_util.c
+++ b/src/sbbs3/str_util.c
@@ -115,6 +115,21 @@ char* strip_space(const char *str, char* dest)
 	return dest;
 }
 
+char* strip_char(const char* str, char* dest, char ch)
+{
+	const char* src;
+
+	if(dest == NULL && (dest = strdup(str)) == NULL)
+		return NULL;
+	char* retval = dest;
+	for(src = str; *src != '\0'; src++) {
+		if(*src != ch)
+			*(dest++) = *src;
+	}
+	*dest = '\0';
+	return retval;
+}
+
 char* prep_file_desc(const char *str, char* dest)
 {
 	int	i,j;