diff --git a/src/sbbs3/bulkmail.cpp b/src/sbbs3/bulkmail.cpp
index df241eaf3335f64cd6cd595351b5b717c12229e3..259a84cf905a924a85b78773f94fb8ec984bb43d 100644
--- a/src/sbbs3/bulkmail.cpp
+++ b/src/sbbs3/bulkmail.cpp
@@ -94,13 +94,13 @@ bool sbbs_t::bulkmail(uchar *ar)
 	}
 	msgbuf[length]=0;	/* ASCIIZ */
 
-	smb_hfield(&msg,SENDER,strlen(useron.alias),useron.alias);
+	smb_hfield_str(&msg,SENDER,useron.alias);
 
 	sprintf(str,"%u",useron.number);
-	smb_hfield(&msg,SENDEREXT,strlen(str),str);
+	smb_hfield_str(&msg,SENDEREXT,str);
 	msg.idx.from=useron.number;
 
-	smb_hfield(&msg,SUBJECT,strlen(title),title);
+	smb_hfield_str(&msg,SUBJECT,title);
 	msg.idx.subj=subject_crc(title);
 
 	memset(&smb,0,sizeof(smb));
@@ -185,16 +185,16 @@ int sbbs_t::bulkmailhdr(smb_t* smb, smbmsg_t* msg, uint usernum)
 		return(i);
 
 	SAFECOPY(str,user.alias);
-	smb_hfield(&newmsg,RECIPIENT,strlen(str),str);
+	smb_hfield_str(&newmsg,RECIPIENT,str);
 
 	if(cfg.sys_misc&SM_FWDTONET && user.misc&NETMAIL && user.netmail[0]) {
 		bprintf(text[UserNetMail],user.netmail);
 		nettype=NET_INTERNET;
 		smb_hfield(&newmsg,RECIPIENTNETTYPE,sizeof(nettype),&nettype);
-		smb_hfield(&newmsg,RECIPIENTNETADDR,strlen(user.netmail),user.netmail);
+		smb_hfield_str(&newmsg,RECIPIENTNETADDR,user.netmail);
 	} else {
 		sprintf(str,"%u",usernum);
-		smb_hfield(&newmsg,RECIPIENTEXT,strlen(str),str);
+		smb_hfield_str(&newmsg,RECIPIENTEXT,str);
 		newmsg.idx.to=usernum;
 	}
 
diff --git a/src/sbbs3/email.cpp b/src/sbbs3/email.cpp
index b241b84b71b4f05a5f02f1cfc4e6a28f9f8a3b77..cb09a0e22cb74f45b3181cd183d5cc54516e52d2 100644
--- a/src/sbbs3/email.cpp
+++ b/src/sbbs3/email.cpp
@@ -260,20 +260,20 @@ bool sbbs_t::email(int usernumber, char *top, char *subj, long mode)
 	msg.hdr.offset=offset;
 
 	username(&cfg,usernumber,str);
-	smb_hfield(&msg,RECIPIENT,strlen(str),str);
+	smb_hfield_str(&msg,RECIPIENT,str);
 
 	sprintf(str,"%u",usernumber);
-	smb_hfield(&msg,RECIPIENTEXT,strlen(str),str);
+	smb_hfield_str(&msg,RECIPIENTEXT,str);
 	msg.idx.to=usernumber;
 
 	strcpy(str,useron.alias);
-	smb_hfield(&msg,SENDER,strlen(str),str);
+	smb_hfield_str(&msg,SENDER,str);
 
 	sprintf(str,"%u",useron.number);
-	smb_hfield(&msg,SENDEREXT,strlen(str),str);
+	smb_hfield_str(&msg,SENDEREXT,str);
 	msg.idx.from=useron.number;
 
-	smb_hfield(&msg,SUBJECT,strlen(title),title);
+	smb_hfield_str(&msg,SUBJECT,title);
 	msg.idx.subj=subject_crc(title);
 
 	smb_dfield(&msg,TEXT_BODY,length);
diff --git a/src/sbbs3/js_msgbase.c b/src/sbbs3/js_msgbase.c
index 0aba325f66d056c5d80910ea1b784682ee417bd5..80678ddb3e068e51e1658aaf602df0abb4206e86 100644
--- a/src/sbbs3/js_msgbase.c
+++ b/src/sbbs3/js_msgbase.c
@@ -135,7 +135,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 			return(FALSE);
 	} else
 		cp="";
-	smb_hfield(msg, SUBJECT, (ushort)strlen(cp), cp);
+	smb_hfield_str(msg, SUBJECT, cp);
 	msg->idx.subj=subject_crc(cp);
 
 	if(JS_GetProperty(cx, hdr, "to", &val) && val!=JSVAL_VOID) {
@@ -146,7 +146,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 			return(FALSE);					/* "to" property required */
 		cp="All";
 	}
-	smb_hfield(msg, RECIPIENT, (ushort)strlen(cp), cp);
+	smb_hfield_str(msg, RECIPIENT, cp);
 	if(!(p->smb.status.attr&SMB_EMAIL)) {
 		SAFECOPY(to,cp);
 		strlwr(to);
@@ -158,7 +158,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 			return(FALSE);
 	} else
 		return(FALSE);	/* "from" property required */
-	smb_hfield(msg, SENDER, (ushort)strlen(cp), cp);
+	smb_hfield_str(msg, SENDER, cp);
 	if(!(p->smb.status.attr&SMB_EMAIL)) {
 		SAFECOPY(from,cp);
 		strlwr(from);
@@ -169,7 +169,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "from_ext", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, SENDEREXT, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, SENDEREXT, cp);
 		if(p->smb.status.attr&SMB_EMAIL)
 			msg->idx.from=atoi(cp);
 	}
@@ -177,7 +177,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "from_org", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, SENDERORG, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, SENDERORG, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "from_net_type", &val) && val!=JSVAL_VOID) {
@@ -191,7 +191,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "from_net_addr", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, SENDERNETADDR, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, SENDERNETADDR, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "from_agent", &val) && val!=JSVAL_VOID) {
@@ -203,7 +203,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "to_ext", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, RECIPIENTEXT, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, RECIPIENTEXT, cp);
 		if(p->smb.status.attr&SMB_EMAIL)
 			msg->idx.to=atoi(cp);
 	}
@@ -211,7 +211,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "to_org", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, RECIPIENTORG, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, RECIPIENTORG, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "to_net_type", &val) && val!=JSVAL_VOID) {
@@ -225,7 +225,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "to_net_addr", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, RECIPIENTNETADDR, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, RECIPIENTNETADDR, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "to_agent", &val) && val!=JSVAL_VOID) {
@@ -237,19 +237,19 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "replyto", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, REPLYTO, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, REPLYTO, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "replyto_ext", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, REPLYTOEXT, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, REPLYTOEXT, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "replyto_org", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, REPLYTOORG, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, REPLYTOORG, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "replyto_net_type", &val) && val!=JSVAL_VOID) {
@@ -261,7 +261,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "replyto_net_addr", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, REPLYTONETADDR, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, REPLYTONETADDR, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "replyto_agent", &val) && val!=JSVAL_VOID) {
@@ -274,69 +274,69 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "id", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, RFC822MSGID, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, RFC822MSGID, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "reply_id", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, RFC822REPLYID, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, RFC822REPLYID, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "reverse_path", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, SMTPREVERSEPATH, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, SMTPREVERSEPATH, cp);
 	}
 
 	/* USENET headers */
 	if(JS_GetProperty(cx, hdr, "path", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, USENETPATH, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, USENETPATH, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "newsgroups", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, USENETNEWSGROUPS, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, USENETNEWSGROUPS, cp);
 	}
 
 	/* FTN headers */
 	if(JS_GetProperty(cx, hdr, "ftn_msgid", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, FIDOMSGID, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, FIDOMSGID, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_reply", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, FIDOREPLYID, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, FIDOREPLYID, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_area", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, FIDOAREA, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, FIDOAREA, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_flags", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, FIDOFLAGS, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, FIDOFLAGS, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_pid", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, FIDOPID, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, FIDOPID, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_tid", &val) && val!=JSVAL_VOID) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield(msg, FIDOTID, (ushort)strlen(cp), cp);
+		smb_hfield_str(msg, FIDOTID, cp);
 	}
 
 	if(JS_GetProperty(cx, hdr, "date", &val) && val!=JSVAL_VOID) {
@@ -413,7 +413,7 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 				continue;
 			if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 				return(FALSE);
-			smb_hfield(msg, type, (ushort)strlen(cp), cp);
+			smb_hfield_str(msg, type, cp);
 		}
 	}
 
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 6114d147ece5b99c54a4a0960227b3e56a70b91e..3474ae5cbefe9c14712e8253fed04e3b6b54b74e 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -1411,39 +1411,39 @@ static int parse_header_field(char* buf, smbmsg_t* msg, ushort* type)
 	if(buf[0]<=' ' && *type!=UNKNOWN) {	/* folded header, append to previous */
 		p=buf;
 		truncsp(p);
-		smb_hfield_append(msg,*type,2,"\r\n");
-		return smb_hfield_append(msg,*type, (ushort)strlen(p), p);
+		smb_hfield_append_str(msg,*type,"\r\n");
+		return smb_hfield_append_str(msg, *type, p);
 	}
 
 	if(!strnicmp(buf, "TO:",3)) {
 		p=buf+3;
 		SKIP_WHITESPACE(p);
 		truncsp(p);
-		return smb_hfield(msg, *type=RFC822TO, (ushort)strlen(p), p);
+		return smb_hfield_str(msg, *type=RFC822TO, p);
 	}
 	if(!strnicmp(buf, "REPLY-TO:",9)) {
 		p=buf+9;
 		SKIP_WHITESPACE(p);
 		truncsp(p);
-		smb_hfield(msg, *type=RFC822REPLYTO, (ushort)strlen(p), p);
+		smb_hfield_str(msg, *type=RFC822REPLYTO, p);
 		if(*p=='<')  {
 			p++;
 			truncstr(p,">");
 		}
 		nettype=NET_INTERNET;
 		smb_hfield(msg, REPLYTONETTYPE, sizeof(nettype), &nettype);
-		return smb_hfield(msg, *type=REPLYTONETADDR, (ushort)strlen(p), p);
+		return smb_hfield_str(msg, *type=REPLYTONETADDR, p);
 	}
 	if(!strnicmp(buf, "FROM:", 5)) {
 		p=buf+5;
 		SKIP_WHITESPACE(p);
 		truncsp(p);
-		return smb_hfield(msg, *type=RFC822FROM, (ushort)strlen(p), p);
+		return smb_hfield_str(msg, *type=RFC822FROM, p);
 	}
 	if(!strnicmp(buf, "ORGANIZATION:",13)) {
 		p=buf+13;
 		SKIP_WHITESPACE(p);
-		return smb_hfield(msg, *type=SENDERORG, (ushort)strlen(p), p);
+		return smb_hfield_str(msg, *type=SENDERORG, p);
 	}
 	if(!strnicmp(buf, "DATE:",5)) {
 		p=buf+5;
@@ -1454,15 +1454,15 @@ static int parse_header_field(char* buf, smbmsg_t* msg, ushort* type)
 	if(!strnicmp(buf, "MESSAGE-ID:",11)) {
 		p=buf+11;
 		SKIP_WHITESPACE(p);
-		return smb_hfield(msg, *type=RFC822MSGID, (ushort)strlen(p), p);
+		return smb_hfield_str(msg, *type=RFC822MSGID, p);
 	}
 	if(!strnicmp(buf, "IN-REPLY-TO:",12)) {
 		p=buf+12;
 		SKIP_WHITESPACE(p);
-		return smb_hfield(msg, *type=RFC822REPLYID, (ushort)strlen(p), p);
+		return smb_hfield_str(msg, *type=RFC822REPLYID, p);
 	}
 	/* Fall-through */
-	return smb_hfield(msg, *type=RFC822HEADER, (ushort)strlen(buf), buf);
+	return smb_hfield_str(msg, *type=RFC822HEADER, buf);
 }
 
 static int chk_received_hdr(SOCKET socket,const char *buf,IN_ADDR *dnsbl_result, char *dnsbl, char *dnsbl_ip)
@@ -1946,7 +1946,7 @@ static void smtp_thread(void* arg)
 							lprintf("%04d !SMTP TAGGED MAIL SUBJECT from blacklisted server with: %s"
 								,socket, startup->dnsbl_tag);
 						}
-						smb_hfield(&msg, SUBJECT, (ushort)strlen(p), p);
+						smb_hfield_str(&msg, SUBJECT, p);
 						msg.idx.subj=subject_crc(p);
 						continue;
 					}
@@ -2040,7 +2040,7 @@ static void smtp_thread(void* arg)
 						sprintf(str,"%s: %s is listed on %s as %s"
 							,startup->dnsbl_hdr, dnsbl_ip
 							,dnsbl, inet_ntoa(dnsbl_result));
-						smb_hfield(&msg,RFC822HEADER,strlen(str),str);
+						smb_hfield_str(&msg, RFC822HEADER, str);
 						lprintf("%04d !SMTP TAGGED MAIL HEADER from blacklisted server with: %s"
 							,socket, startup->dnsbl_hdr);
 					}
@@ -2059,10 +2059,10 @@ static void smtp_thread(void* arg)
 					continue;
 				}
 				nettype=NET_INTERNET;
-				smb_hfield(&msg, SMTPREVERSEPATH, (ushort)strlen(reverse_path), reverse_path);
-				smb_hfield(&msg, SENDER, (ushort)strlen(sender), sender);
+				smb_hfield_str(&msg, SMTPREVERSEPATH, reverse_path);
+				smb_hfield_str(&msg, SENDER, sender);
 				smb_hfield(&msg, SENDERNETTYPE, sizeof(nettype), &nettype);
-				smb_hfield(&msg, SENDERNETADDR, (ushort)strlen(sender_addr), sender_addr);
+				smb_hfield_str(&msg, SENDERNETADDR, sender_addr);
 				if(msg.idx.subj==0) {
 					p="";
 					smb_hfield(&msg, SUBJECT, 0, p);
@@ -2095,7 +2095,7 @@ static void smtp_thread(void* arg)
 				if(subnum!=INVALID_SUB) {	/* Message Base */
 					if(rcpt_name[0]==0)
 						strcpy(rcpt_name,"All");
-					smb_hfield(&msg, RECIPIENT, (ushort)strlen(rcpt_name), rcpt_name);
+					smb_hfield_str(&msg, RECIPIENT, rcpt_name);
 
 					smb.subnum=subnum;
 					if((i=savemsg(&scfg, &smb, &msg, msgbuf))!=0) {
@@ -2155,20 +2155,19 @@ static void smtp_thread(void* arg)
 						,revision,PLATFORM_DESC
 						,esmtp ? "ESMTP" : "SMTP"
 						,rcpt_name,msgdate(msg.hdr.when_imported,date));
-					smb_hfield(&newmsg, RFC822HEADER, (ushort)strlen(hdrfield), hdrfield);
+					smb_hfield_str(&newmsg, RFC822HEADER, hdrfield);
 
-					smb_hfield(&newmsg, RECIPIENT, (ushort)strlen(rcpt_name), rcpt_name);
+					smb_hfield_str(&newmsg, RECIPIENT, rcpt_name);
 
 					newmsg.idx.to=usernum;
 					if(nettype==NET_NONE) {	/* Local destination */
 						sprintf(str,"%u",usernum);
-						smb_hfield(&newmsg, RECIPIENTEXT, (ushort)strlen(str), str);
+						smb_hfield_str(&newmsg, RECIPIENTEXT, str);
 					} else {
 						if(nettype!=NET_QWK)
 							newmsg.idx.to=0;
 						smb_hfield(&newmsg, RECIPIENTNETTYPE, sizeof(nettype), &nettype);
-						smb_hfield(&newmsg, RECIPIENTNETADDR
-							,(ushort)strlen(rcpt_addr), rcpt_addr);
+						smb_hfield_str(&newmsg, RECIPIENTNETADDR, rcpt_addr);
 					}
 
 					i=smb_addmsghdr(&smb,&newmsg,SMB_SELFPACK);
@@ -2987,21 +2986,19 @@ BOOL bounce(smb_t* smb, smbmsg_t* msg, char* err, BOOL immediate)
 	newmsg.hdr.delivery_attempts=0;
 
 	sprintf(str,"Delivery failure: %.100s",newmsg.subj);
-	smb_hfield(&newmsg, SUBJECT, (ushort)strlen(str), str);
-	smb_hfield(&newmsg, RECIPIENT, (ushort)strlen(newmsg.from), newmsg.from);
+	smb_hfield_str(&newmsg, SUBJECT, str);
+	smb_hfield_str(&newmsg, RECIPIENT, newmsg.from);
 	if(newmsg.idx.to) {
 		sprintf(str,"%u",newmsg.idx.to);
-		smb_hfield(&newmsg, RECIPIENTEXT, (ushort)strlen(str), str);
+		smb_hfield_str(&newmsg, RECIPIENTEXT, str);
 	}
 	if(newmsg.from_net.type!=NET_NONE && newmsg.from_net.type!=NET_FIDO
 		&& newmsg.reverse_path!=NULL) {
-		smb_hfield(&newmsg, RECIPIENTNETTYPE, sizeof(newmsg.from_net.type)
-			,&newmsg.from_net.type);
-		smb_hfield(&newmsg, RECIPIENTNETADDR, (ushort)strlen(newmsg.reverse_path)
-			,newmsg.reverse_path);
+		smb_hfield(&newmsg, RECIPIENTNETTYPE, sizeof(newmsg.from_net.type), &newmsg.from_net.type);
+		smb_hfield_str(&newmsg, RECIPIENTNETADDR, newmsg.reverse_path);
 	}
 	strcpy(str,"Mail Delivery Subsystem");
-	smb_hfield(&newmsg, SENDER, (ushort)strlen(str), str);
+	smb_hfield_str(&newmsg, SENDER, str);
 	smb_hfield(&newmsg, SENDERAGENT, sizeof(agent), &agent);
 	
 	/* Put error message in subject for now */
@@ -3011,16 +3008,15 @@ BOOL bounce(smb_t* smb, smbmsg_t* msg, char* err, BOOL immediate)
 		attempts[0]=0;
 	sprintf(str,"%s reporting delivery failure of message %s"
 		,startup->host_name, attempts);
-	smb_hfield(&newmsg, SMB_COMMENT, (ushort)strlen(str), str);
+	smb_hfield_str(&newmsg, SMB_COMMENT, str);
 	sprintf(str,"from %s to %s\r\n"
 		,msg->reverse_path==NULL ? msg->from : msg->reverse_path
 		,(char*)msg->to_net.addr);
-	smb_hfield(&newmsg, SMB_COMMENT, (ushort)strlen(str), str);
+	smb_hfield_str(&newmsg, SMB_COMMENT, str);
 	strcpy(str,"Reason:");
-	smb_hfield(&newmsg, SMB_COMMENT, (ushort)strlen(str), str);
-	smb_hfield(&newmsg, SMB_COMMENT, (ushort)strlen(err), err);
-	sprintf(str,"\r\nOriginal message text follows:\r\n");
-	smb_hfield(&newmsg, SMB_COMMENT, (ushort)strlen(str), str);
+	smb_hfield_str(&newmsg, SMB_COMMENT, str);
+	smb_hfield_str(&newmsg, SMB_COMMENT, err);
+	smb_hfield_str(&newmsg, SMB_COMMENT, "\r\nOriginal message text follows:\r\n");
 
 	if((i=smb_addmsghdr(smb,&newmsg,SMB_SELFPACK))!=0)
 		lprintf("0000 !BOUNCE ERROR %d (%s) adding message header"
diff --git a/src/sbbs3/netmail.cpp b/src/sbbs3/netmail.cpp
index 47018f7aa1ac9b06e65e3c5e440a68046c478dad..6ff6729d41bd6a6595f992021bdd6f5e267e2160 100644
--- a/src/sbbs3/netmail.cpp
+++ b/src/sbbs3/netmail.cpp
@@ -228,16 +228,16 @@ bool sbbs_t::inetmail(char *into, char *subj, long mode)
 	msg.hdr.offset=offset;
 
 	net=NET_INTERNET;
-	smb_hfield(&msg,RECIPIENT,strlen(name),name);
+	smb_hfield_str(&msg,RECIPIENT,name);
 	msg.idx.to=0;	/* Out-bound NetMail set to 0 */
 	smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
-	smb_hfield(&msg,RECIPIENTNETADDR,strlen(addr),addr);
+	smb_hfield_str(&msg,RECIPIENTNETADDR,addr);
 
 	strcpy(str,cfg.inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name);
-	smb_hfield(&msg,SENDER,strlen(str),str);
+	smb_hfield_str(&msg,SENDER,str);
 
 	sprintf(str,"%u",useron.number);
-	smb_hfield(&msg,SENDEREXT,strlen(str),str);
+	smb_hfield_str(&msg,SENDEREXT,str);
 	msg.idx.from=useron.number;
 
 	/*
@@ -245,7 +245,7 @@ bool sbbs_t::inetmail(char *into, char *subj, long mode)
 	smb_hfield(&msg,SENDERNETADDR,strlen(sys_inetaddr),sys_inetaddr);
 	*/
 
-	smb_hfield(&msg,SUBJECT,strlen(title),title);
+	smb_hfield_str(&msg,SUBJECT,title);
 	strcpy(str,title);
 	msg.idx.subj=subject_crc(str);
 
@@ -420,18 +420,18 @@ bool sbbs_t::qnetmail(char *into, char *subj, long mode)
 	msg.hdr.offset=offset;
 
 	net=NET_QWK;
-	smb_hfield(&msg,RECIPIENT,strlen(to),to);
+	smb_hfield_str(&msg,RECIPIENT,to);
 	msg.idx.to=touser;
 	smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
-	smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr);
+	smb_hfield_str(&msg,RECIPIENTNETADDR,fulladdr);
 
-	smb_hfield(&msg,SENDER,strlen(useron.alias),useron.alias);
+	smb_hfield_str(&msg,SENDER,useron.alias);
 
 	sprintf(str,"%u",useron.number);
-	smb_hfield(&msg,SENDEREXT,strlen(str),str);
+	smb_hfield_str(&msg,SENDEREXT,str);
 	msg.idx.from=useron.number;
 
-	smb_hfield(&msg,SUBJECT,strlen(title),title);
+	smb_hfield_str(&msg,SUBJECT,title);
 	msg.idx.subj=subject_crc(title);
 
 	smb_dfield(&msg,TEXT_BODY,length);
diff --git a/src/sbbs3/postmsg.cpp b/src/sbbs3/postmsg.cpp
index 8a551500bf08d22afcfe6a99b3e8ee16c6ebcb32..04caee951643cade6672863de4e765dbabed99a7 100644
--- a/src/sbbs3/postmsg.cpp
+++ b/src/sbbs3/postmsg.cpp
@@ -37,13 +37,12 @@
 
 #include "sbbs.h"
 
-static char* program_id()
+static char* program_id(char* pid)
 {
-	static char str[128];
 	char compiler[64];
 
 	DESCRIBE_COMPILER(compiler);
-	sprintf(str,"%.10s %s%c-%s%s%s %s %s"
+	sprintf(pid,"%.10s %s%c-%s%s%s %s %s"
 		,VERSION_NOTICE,VERSION,REVISION,PLATFORM_DESC
 		,beta_version
 #ifdef _DEBUG
@@ -52,7 +51,7 @@ static char* program_id()
 		,""
 #endif
 		,__DATE__,compiler);
-	return(str);
+	return(pid);
 }
 
 /****************************************************************************/
@@ -64,7 +63,7 @@ bool sbbs_t::postmsg(uint subnum, smbmsg_t *remsg, long wm_mode)
 	char	str[256],touser[256],title[LEN_TITLE+1],buf[SDT_BLOCK_LEN]
 			,top[256];
 	char	msg_id[256];
-	char*	pid;
+	char	pid[128];
 	ushort	xlat,msgattr;
 	int 	i,j,x,file,storage;
 	ulong	l,length,offset,crc=0xffffffff;
@@ -314,23 +313,22 @@ bool sbbs_t::postmsg(uint subnum, smbmsg_t *remsg, long wm_mode)
 	msg.idx.time=msg.hdr.when_imported.time;
 	msg.idx.number=smb.status.last_msg+1; /* this *should* be the new message number */
 
-	pid=program_id();
-	smb_hfield(&msg,FIDOPID,strlen(pid),pid);
+	smb_hfield_str(&msg,FIDOPID,program_id(pid));
 
 	/* Generate default (RFC822) message-id (always) */
 	SAFECOPY(msg_id,get_msgid(&cfg,subnum,&msg));
-	smb_hfield(&msg,RFC822MSGID,strlen(msg_id),msg_id);
+	smb_hfield_str(&msg,RFC822MSGID,msg_id);
 
 	/* Generate FTN (FTS-9) MSGID */
 	if(cfg.sub[subnum]->misc&SUB_FIDO) {
 		SAFECOPY(msg_id,ftn_msgid(cfg.sub[subnum],&msg));
-		smb_hfield(&msg,FIDOMSGID,strlen(msg_id),msg_id);
+		smb_hfield_str(&msg,FIDOMSGID,msg_id);
 	}
 	if(remsg) {
 		if(remsg->ftn_msgid!=NULL)
-			smb_hfield(&msg,FIDOREPLYID,strlen(remsg->ftn_msgid),remsg->ftn_msgid);
+			smb_hfield_str(&msg,FIDOREPLYID,remsg->ftn_msgid);
 		if(remsg->id!=NULL)
-			smb_hfield(&msg,RFC822REPLYID,strlen(remsg->id),remsg->id);
+			smb_hfield_str(&msg,RFC822REPLYID,remsg->id);
 		msg.hdr.thread_orig=remsg->hdr.number;
 		if(!remsg->hdr.thread_first) {
 			remsg->hdr.thread_first=smb.status.last_msg+1;
@@ -380,19 +378,19 @@ bool sbbs_t::postmsg(uint subnum, smbmsg_t *remsg, long wm_mode)
 
 	msg.hdr.offset=offset;
 
-	smb_hfield(&msg,RECIPIENT,strlen(touser),touser);
+	smb_hfield_str(&msg,RECIPIENT,touser);
 	strlwr(touser);
 	msg.idx.to=crc16(touser,0);
 
 	strcpy(str,cfg.sub[subnum]->misc&SUB_NAME ? useron.name : useron.alias);
-	smb_hfield(&msg,SENDER,strlen(str),str);
+	smb_hfield_str(&msg,SENDER,str);
 	strlwr(str);
 	msg.idx.from=crc16(str,0);
 
 	sprintf(str,"%u",useron.number);
-	smb_hfield(&msg,SENDEREXT,strlen(str),str);
+	smb_hfield_str(&msg,SENDEREXT,str);
 
-	smb_hfield(&msg,SUBJECT,strlen(title),title);
+	smb_hfield_str(&msg,SUBJECT,title);
 	msg.idx.subj=subject_crc(title);
 
 	smb_dfield(&msg,TEXT_BODY,length);
@@ -443,7 +441,7 @@ extern "C" void DLLCALL signal_sub_sem(scfg_t* cfg, uint subnum)
 extern "C" int DLLCALL savemsg(scfg_t* cfg, smb_t* smb, smbmsg_t* msg, char* msgbuf)
 {
 	char	pad=0;
-	char*	pid;
+	char	pid[128];
 	char*	reply_id;
 	char	msg_id[256];
 	char*	lzhbuf=NULL;
@@ -602,22 +600,20 @@ extern "C" int DLLCALL savemsg(scfg_t* cfg, smb_t* smb, smbmsg_t* msg, char* msg
 	}
 	smb_dfield(msg,TEXT_BODY,length);
 
-	if(smb_get_hfield(msg,FIDOPID,NULL)==NULL) {	/* Don't create duplicate PIDs */
-		pid=program_id();
-		smb_hfield(msg,FIDOPID,strlen(pid),pid);
-	}
+	if(smb_get_hfield(msg,FIDOPID,NULL)==NULL) 	/* Don't create duplicate PIDs */
+		smb_hfield_str(msg,FIDOPID,program_id(pid));
 
 	/* Generate default (RFC822) message-id  */
 	if(smb_get_hfield(msg,RFC822MSGID,NULL)==NULL) {
 		SAFECOPY(msg_id,get_msgid(cfg,smb->subnum,msg));
-		smb_hfield(msg,RFC822MSGID,strlen(msg_id),msg_id);
+		smb_hfield_str(msg,RFC822MSGID,msg_id);
 	}
 
 	/* Generate FTN MSGID */
 	if(smb->subnum!=INVALID_SUB && cfg->sub[smb->subnum]->misc&SUB_FIDO
 		&& smb_get_hfield(msg,FIDOMSGID,NULL)==NULL) {
 		SAFECOPY(msg_id,ftn_msgid(cfg->sub[smb->subnum],msg));
-		smb_hfield(msg,FIDOMSGID,strlen(msg_id),msg_id);
+		smb_hfield_str(msg,FIDOMSGID,msg_id);
 	}
 
 	if(msg->to==NULL)	/* no recipient, don't add header */
@@ -649,12 +645,12 @@ extern "C" int DLLCALL savemsg(scfg_t* cfg, smb_t* smb, smbmsg_t* msg, char* msg
 		/* Add RFC-822 Reply-ID (generate if necessary) */
 		if(msg->reply_id==NULL) {
 			reply_id=get_msgid(cfg,smb->subnum,&remsg);
-			smb_hfield(msg,RFC822REPLYID,strlen(reply_id),reply_id);
+			smb_hfield_str(msg,RFC822REPLYID,reply_id);
 		}
 
 		/* Add FidoNet Reply if original message has FidoNet MSGID */
 		if(msg->ftn_reply==NULL && remsg.ftn_msgid!=NULL)
-			smb_hfield(msg,FIDOREPLYID,strlen(remsg.ftn_msgid),remsg.ftn_msgid);
+			smb_hfield_str(msg,FIDOREPLYID,remsg.ftn_msgid);
 
 		if(!remsg.hdr.thread_first) {	/* This msg is first reply */
 			remsg.hdr.thread_first=msg->idx.number;
diff --git a/src/sbbs3/qwktomsg.cpp b/src/sbbs3/qwktomsg.cpp
index 50799262ca3343898b5d96e36218c260af59e0f6..e6e5d96fffad3cae961da5625e143df605f212c2 100644
--- a/src/sbbs3/qwktomsg.cpp
+++ b/src/sbbs3/qwktomsg.cpp
@@ -110,20 +110,20 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 		msg.idx.to=touser;
 
 		username(&cfg,touser,str);
-		smb_hfield(&msg,RECIPIENT,strlen(str),str);
+		smb_hfield_str(&msg,RECIPIENT,str);
 		sprintf(str,"%u",touser);
-		smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); 
+		smb_hfield_str(&msg,RECIPIENTEXT,str); 
 	} else {
 		sprintf(str,"%25.25s",(char *)hdrblk+21);     /* To user */
 		truncsp(str);
-		smb_hfield(&msg,RECIPIENT,strlen(str),str);
+		smb_hfield_str(&msg,RECIPIENT,str);
 		strlwr(str);
 		msg.idx.to=crc16(str,0); 
 	}
 
 	sprintf(str,"%25.25s",hdrblk+71);   /* Subject */
 	truncsp(str);
-	smb_hfield(&msg,SUBJECT,strlen(str),str);
+	smb_hfield_str(&msg,SUBJECT,str);
 	msg.idx.subj=subject_crc(str);
 
 	/********************************/
@@ -259,18 +259,18 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 		strupr(str);
 		j=NET_QWK;
 		smb_hfield(&msg,SENDERNETTYPE,2,&j);
-		smb_hfield(&msg,SENDERNETADDR,strlen(str),str);
+		smb_hfield_str(&msg,SENDERNETADDR,str);
 		sprintf(str,"%25.25s",hdrblk+46);  /* From user */
 		truncsp(str);
 	} else {
 		sprintf(str,"%u",useron.number);
-		smb_hfield(&msg,SENDEREXT,strlen(str),str);
+		smb_hfield_str(&msg,SENDEREXT,str);
 		if((uint)subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_NAME)
 			strcpy(str,useron.name);
 		else
 			strcpy(str,useron.alias);
 	}
-	smb_hfield(&msg,SENDER,strlen(str),str);
+	smb_hfield_str(&msg,SENDER,str);
 	if((uint)subnum==INVALID_SUB) {
 		if(useron.rest&FLAG('Q') || fromhub)
 			msg.idx.from=0;
@@ -293,7 +293,7 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 		p=header+i+7;					/* Skip "@MSGID:" */
 		while(*p && *p<=SP) p++;		/* Skip any spaces */
 		truncstr(p," ");				/* Truncate at first space char */
-		smb_hfield(&msg,RFC822MSGID,strlen(p),p);
+		smb_hfield_str(&msg,RFC822MSGID,p);
 	}
 	if(!strnicmp(header+skip,"@REPLY:",7)) {
 		if(!fromhub)
@@ -307,7 +307,7 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 		p=header+i+7;					/* Skip "@REPLY:" */
 		while(*p && *p<=SP) p++;		/* Skip any spaces */
 		truncstr(p," ");				/* Truncate at first space char */
-		smb_hfield(&msg,RFC822REPLYID,strlen(p),p);
+		smb_hfield_str(&msg,RFC822REPLYID,p);
 	}
 	if(!strnicmp(header+skip,"@TZ:",4)) {
 		if(!fromhub)
@@ -331,7 +331,7 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 		}
 		p=header+i+9;					/* Skip "@REPLYTO:" */
 		while(*p && *p<=SP) p++;		/* Skip any spaces */
-		smb_hfield(&msg,REPLYTO,strlen(p),p);
+		smb_hfield_str(&msg,REPLYTO,p);
 	}
 	free(header);
 
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 435be8b5cf742d3138c999fa7692d9ea0d006326..33236845e8c61a1165a141c2fb63bf61cc8ec503 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -2388,23 +2388,23 @@ int fmsgtosmsg(uchar HUGE16 *fbuf, fmsghdr_t fmsghdr, uint user, uint subnum)
 	destaddr.node=fmsghdr.destnode;
 	destaddr.point=fmsghdr.destpoint;
 
-	smb_hfield(&msg,SENDER,(ushort)strlen(fmsghdr.from),fmsghdr.from);
+	smb_hfield_str(&msg,SENDER,fmsghdr.from);
 	strlwr(fmsghdr.from);
 	if(subnum==INVALID_SUB)
 		msg.idx.from=0;
 	else
 		msg.idx.from=crc16(fmsghdr.from,0);
 
-	smb_hfield(&msg,RECIPIENT,(ushort)strlen(fmsghdr.to),fmsghdr.to);
+	smb_hfield_str(&msg,RECIPIENT,fmsghdr.to);
 	strlwr(fmsghdr.to);
 	msg.idx.to=crc16(fmsghdr.to,0);
 
 	if(user) {
 		sprintf(str,"%u",user);
-		smb_hfield(&msg,RECIPIENTEXT,(ushort)strlen(str),str);
+		smb_hfield_str(&msg,RECIPIENTEXT,str);
 		msg.idx.to=user; }
 
-	smb_hfield(&msg,SUBJECT,(ushort)strlen(fmsghdr.subj),fmsghdr.subj);
+	smb_hfield_str(&msg,SUBJECT,fmsghdr.subj);
 	msg.idx.subj=subject_crc(fmsghdr.subj);
 
 	if(fbuf==NULL) {
diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index 0fbc7594fabc68db02676f5d4a604a9efaf73325..09f3666a1ac299bbd6aefb492033f88ffa44cba7 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -224,7 +224,7 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		SAFECOPY(str,to);
 
 	truncsp(str);
-	i=smb_hfield(&msg,RECIPIENT,(ushort)strlen(str),str);
+	i=smb_hfield_str(&msg,RECIPIENT,str);
 	if(i) {
 		fprintf(stderr,"\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 		smb_freemsgdat(&smb,offset,length,1);
@@ -239,7 +239,7 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		} else
 			SAFECOPY(str,to_number);
 		truncsp(str);
-		i=smb_hfield(&msg,RECIPIENTEXT,(ushort)strlen(str),str);
+		i=smb_hfield_str(&msg,RECIPIENTEXT,str);
 		if(i) {
 			fprintf(stderr,"\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 			smb_freemsgdat(&smb,offset,length,1);
@@ -270,7 +270,7 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 				smb_freemsgdat(&smb,offset,length,1);
 				exit(1); 
 			}
-			i=smb_hfield(&msg,RECIPIENTNETADDR,(ushort)strlen(str),str);
+			i=smb_hfield_str(&msg,RECIPIENTNETADDR,str);
 			if(i) {
 				fprintf(stderr,"\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 				smb_freemsgdat(&smb,offset,length,1);
@@ -285,7 +285,7 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 	} else
 		SAFECOPY(str,from);
 	truncsp(str);
-	i=smb_hfield(&msg,SENDER,(ushort)strlen(str),str);
+	i=smb_hfield_str(&msg,SENDER,str);
 	if(i) {
 		fprintf(stderr,"\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 		smb_freemsgdat(&smb,offset,length,1);
@@ -298,7 +298,7 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		} else
 			SAFECOPY(str,from_number);
 		truncsp(str);
-		i=smb_hfield(&msg,SENDEREXT,(ushort)strlen(str),str);
+		i=smb_hfield_str(&msg,SENDEREXT,str);
 		if(i) {
 			fprintf(stderr,"\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 			smb_freemsgdat(&smb,offset,length,1);
@@ -317,7 +317,7 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 	} else
 		SAFECOPY(str,subject);
 	truncsp(str);
-	i=smb_hfield(&msg,SUBJECT,(ushort)strlen(str),str);
+	i=smb_hfield_str(&msg,SUBJECT,str);
 	if(i) {
 		fprintf(stderr,"\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
 		smb_freemsgdat(&smb,offset,length,1);
@@ -339,7 +339,7 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		,__DATE__
 		,compiler
 		);
-	smb_hfield(&msg,FIDOPID,(ushort)strlen(str),str);
+	smb_hfield_str(&msg,FIDOPID,str);
 
 	i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
 
diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp
index 25a569cbaa04d5379c447c3268d11d15ca1e4d83..fabd351101c663cc0fb2a34b723b7edd88427957 100644
--- a/src/sbbs3/writemsg.cpp
+++ b/src/sbbs3/writemsg.cpp
@@ -931,12 +931,12 @@ void sbbs_t::forwardmail(smbmsg_t *msg, int usernumber)
 	msg->hdr.attr=msg->idx.attr;
 
 
-	smb_hfield(msg,SENDER,strlen(useron.alias),useron.alias);
+	smb_hfield_str(msg,SENDER,useron.alias);
 	sprintf(str,"%u",useron.number);
-	smb_hfield(msg,SENDEREXT,strlen(str),str);
+	smb_hfield_str(msg,SENDEREXT,str);
 
 	username(&cfg,usernumber,touser);
-	smb_hfield(msg,RECIPIENT,strlen(touser),touser);
+	smb_hfield_str(msg,RECIPIENT,touser);
 	sprintf(str,"%u",usernumber);
 	smb_hfield(msg,RECIPIENTEXT,sizeof(str),str);
 	msg->idx.to=usernumber;
diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index 170f4f3966cbfe13a7b34abb4b5f2847c99bb965..a620209d5bdb00c8a782b969b8c40390041387f0 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -1197,6 +1197,14 @@ int SMBCALL smb_hfield(smbmsg_t* msg, ushort type, size_t length, void* data)
 	return(SMB_SUCCESS);
 }
 
+/****************************************************************************/
+/* Convenience function to add an ASCIIZ string header field				*/
+/****************************************************************************/
+int SMBCALL smb_hfield_str(smbmsg_t* msg, ushort type, const char* str)
+{
+	return smb_hfield(msg, type, strlen(str), (void*)str);
+}
+
 /****************************************************************************/
 /* Appends data to an existing header field (in memory only)				*/
 /****************************************************************************/
@@ -1239,6 +1247,13 @@ int SMBCALL smb_hfield_append(smbmsg_t* msg, ushort type, size_t length, void* d
 	return(SMB_SUCCESS);
 }
 
+/****************************************************************************/
+/* Appends data to an existing ASCIIZ header field (in memory only)			*/
+/****************************************************************************/
+int SMBCALL smb_hfield_append_str(smbmsg_t* msg, ushort type, const char* str)
+{
+	return smb_hfield_append(msg, type, strlen(str), (void*)str);
+}
 
 /****************************************************************************/
 /* Searches for a specific header field (by type) and returns it			*/
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index 02fedaf0bb4bdfb2977b0ff0ba5ad1ffb8158de1..def48ab53da2ab1fcd2ec9cbd121317b5004cd12 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -121,7 +121,9 @@ SMBEXPORT int 		SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg);
 SMBEXPORT int 		SMBCALL smb_unlockmsghdr(smb_t* smb, smbmsg_t* msg);
 SMBEXPORT int 		SMBCALL smb_addcrc(smb_t* smb, ulong crc);
 SMBEXPORT int 		SMBCALL smb_hfield(smbmsg_t* msg, ushort type, size_t length, void* data);
+SMBEXPORT int		SMBCALL smb_hfield_str(smbmsg_t* msg, ushort type, const char* str);
 SMBEXPORT int		SMBCALL smb_hfield_append(smbmsg_t* msg, ushort type, size_t length, void* data);
+SMBEXPORT int		SMBCALL smb_hfield_append_str(smbmsg_t* msg, ushort type, const char* data);
 SMBEXPORT int 		SMBCALL smb_dfield(smbmsg_t* msg, ushort type, ulong length);
 SMBEXPORT void*		SMBCALL smb_get_hfield(smbmsg_t* msg, ushort type, hfield_t* hfield);
 SMBEXPORT char*		SMBCALL smb_hfieldtype(ushort type);