diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index c7409825447292f41aa3756ae56a3d1838a5bc53..eeeaf9dc0478bb26720756207dca7bf802a90a38 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -114,7 +114,7 @@ char *usage=
 "opts:\n"
 "       c    = create message base if it doesn't exist\n"
 "       a    = always pack msg base (disable compression analysis)\n"
-"       i    = ignore duplicate messages (do not store CRC)\n"
+"       i    = ignore dupes (do not store CRCs or search for duplicate hashes)\n"
 "       d    = use default values (no prompt) for to, from, and subject\n"
 "       t<s> = set 'to' user name for imported message\n"
 "       n<s> = set 'to' netmail address for imported message\n"
@@ -129,15 +129,16 @@ char *usage=
 /*****************************************************************************/
 // Expands Unix LF to CRLF
 /*****************************************************************************/
-ulong lf_expand(BYTE* inbuf, ulong inlen, BYTE* outbuf)
+ulong lf_expand(BYTE* inbuf, BYTE* outbuf)
 {
 	ulong	i,j;
 
-	for(i=j=0;i<inlen;i++) {
+	for(i=j=0;inbuf[i];i++) {
 		if(inbuf[i]=='\n' && (!i || inbuf[i-1]!='\r'))
 			outbuf[j++]='\r';
 		outbuf[j++]=inbuf[i];
 	}
+	outbuf[j]=0;
 	return(j);
 }
 
@@ -149,16 +150,13 @@ ulong lf_expand(BYTE* inbuf, ulong inlen, BYTE* outbuf)
 void postmsg(char type, char* to, char* to_number, char* to_address, 
 			 char* from, char* from_number, char* subject, FILE* fp)
 {
-	char	str[128];
-	char	buf[128];
-	char	pad=0;
-	char*	msgtxt=NULL;
-	char*	newtxt;
-	long	msgtxtlen;
-	ushort	xlat,net;
-	int 	i;
-	long	l,length;
-	ulong	offset,crc;
+	char		str[128];
+	char		buf[1024];
+	char*		msgtxt=NULL;
+	char*		newtxt;
+	long		msgtxtlen;
+	ushort		net;
+	int 		i;
 	ushort		agent=AGENT_SMBUTIL;
 	smbmsg_t	msg;
 
@@ -168,77 +166,41 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		i=fread(buf,1,sizeof(buf),fp);
 		if(i<1)
 			break;
-		if((msgtxt=(char*)realloc(msgtxt,msgtxtlen+i))==NULL) {
-			fprintf(stderr,"\n\7malloc(%ld) failure\n",msgtxtlen+i);
+		if((msgtxt=(char*)realloc(msgtxt,msgtxtlen+i+1))==NULL) {
+			fprintf(stderr,"\n\7realloc(%ld) failure\n",msgtxtlen+i+1);
 			exit(1);
 		}
-		memcpy(msgtxt+msgtxtlen,buf,i);
+		strcpy(msgtxt+msgtxtlen,buf);
 		msgtxtlen+=i;
 	}
 
-	if((newtxt=(char*)malloc(msgtxtlen*2))==NULL) {
-		fprintf(stderr,"\n\7malloc(%ld) failure\n",msgtxtlen*2);
-		exit(1);
-	}
-
-	/* Expand LFs to CRLFs */
-	msgtxtlen=lf_expand(msgtxt, msgtxtlen, newtxt);
-	free(msgtxt);
-	msgtxt=newtxt;
-
-	/* Allocate space in message base */
-	length=msgtxtlen+sizeof(xlat);	/* for translation string */
-	if(!(smb.status.attr&SMB_HYPERALLOC)) {
-		i=smb_open_da(&smb);
-		if(i) {
-			fprintf(stderr,"\n\7!smb_open_da returned %d: %s\n",i,smb.last_error);
-			exit(1); 
+	if(msgtxt!=NULL) {
+		if((newtxt=(char*)malloc((msgtxtlen*2)+1))==NULL) {
+			fprintf(stderr,"\n\7malloc(%ld) failure\n",(msgtxtlen*2)+1);
+			exit(1);
 		}
-		offset=smb_allocdat(&smb,length,1);
-		smb_close_da(&smb); 
-	} else
-		offset=smb_hallocdat(&smb);
 
-	fseek(smb.sdt_fp,offset,SEEK_SET);
-	xlat=XLAT_NONE;
-	smb_fwrite(&smb,&xlat,sizeof(xlat),smb.sdt_fp);
-	smb_fwrite(&smb,msgtxt,msgtxtlen,smb.sdt_fp);
-	for(l=length;l%SDT_BLOCK_LEN;l++)
-		smb_fwrite(&smb,&pad,sizeof(pad),smb.sdt_fp);
-	fflush(smb.sdt_fp);
+		/* Expand LFs to CRLFs */
+		msgtxtlen=lf_expand(msgtxt, newtxt);
+		free(msgtxt);
+		msgtxt=newtxt;
+	}
 
 	memset(&msg,0,sizeof(smbmsg_t));
-	msg.hdr.version=smb_ver();
 	msg.hdr.when_written.time=time(NULL);
 	msg.hdr.when_written.zone=tzone;
 	msg.hdr.when_imported=msg.hdr.when_written;
 
-	if(smb.status.max_crcs && !(mode&NOCRC)) {
-		crc=0xffffffffUL;
-		for(l=0;l<msgtxtlen;l++) 
-			crc=ucrc32(msgtxt[l],crc);
-		crc=~crc;
-		i=smb_addcrc(&smb,crc);
-		if(i) {
-			fprintf(stderr,"\n\7!smb_addcrc returned %d: %s\n",i,smb.last_error);
-			smb_freemsgdat(&smb,offset,length,1);
-			exit(1); 
-		} 
-	}
-
-	msg.hdr.offset=offset;
-
 	if(to==NULL) {
 		printf("To User Name: ");
 		fgets(str,sizeof(str),stdin); 
 	} else
 		SAFECOPY(str,to);
-
 	truncsp(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);
+
+	if((i=smb_hfield_str(&msg,RECIPIENT,str))!=SMB_SUCCESS) {
+		fprintf(stderr,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+			,RECIPIENT,i,smb.last_error);
 		exit(1); 
 	}
 	if(type=='E' || type=='N')
@@ -250,10 +212,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		} else
 			SAFECOPY(str,to_number);
 		truncsp(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);
+		if((i=smb_hfield_str(&msg,RECIPIENTEXT,str))!=SMB_SUCCESS) {
+			fprintf(stderr,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+				,RECIPIENTEXT,i,smb.last_error);
 			exit(1); 
 		}
 		msg.idx.to=atoi(str); 
@@ -275,16 +236,14 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 				net=NET_INTERNET;
 			else
 				net=NET_QWK;
-			i=smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
-			if(i) {
-				fprintf(stderr,"\n\7!smb_hfield returned %d: %s\n",i,smb.last_error);
-				smb_freemsgdat(&smb,offset,length,1);
+			if((i=smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net))!=SMB_SUCCESS) {
+				fprintf(stderr,"\n\7!smb_hfield(0x%02X) returned %d: %s\n"
+					,RECIPIENTNETTYPE,i,smb.last_error);
 				exit(1); 
 			}
-			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);
+			if((i=smb_hfield_str(&msg,RECIPIENTNETADDR,str))!=SMB_SUCCESS) {
+				fprintf(stderr,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+					,RECIPIENTNETADDR,i,smb.last_error);
 				exit(1); 
 			} 
 		} 
@@ -296,10 +255,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 	} else
 		SAFECOPY(str,from);
 	truncsp(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);
+	if((i=smb_hfield_str(&msg,SENDER,str))!=SMB_SUCCESS) {
+		fprintf(stderr,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+			,SENDER,i,smb.last_error);
 		exit(1); 
 	}
 	if(smb.status.attr&SMB_EMAIL) {
@@ -309,10 +267,9 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		} else
 			SAFECOPY(str,from_number);
 		truncsp(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);
+		if((i=smb_hfield_str(&msg,SENDEREXT,str))!=SMB_SUCCESS) {
+			fprintf(stderr,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+				,SENDEREXT,i,smb.last_error);
 			exit(1); 
 		}
 		msg.idx.from=atoi(str); 
@@ -320,7 +277,11 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		strlwr(str);
 		msg.idx.from=crc16(str,0); 
 	}
-	smb_hfield(&msg, SENDERAGENT, sizeof(agent), &agent);
+	if((i=smb_hfield(&msg, SENDERAGENT, sizeof(agent), &agent))!=SMB_SUCCESS) {
+		fprintf(stderr,"\n\7!smb_hfield(0x%02X) returned %d: %s\n"
+			,SENDERAGENT,i,smb.last_error);
+		exit(1);
+	}
 
 	if(subject==NULL) {
 		printf("Subject: ");
@@ -328,21 +289,13 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 	} else
 		SAFECOPY(str,subject);
 	truncsp(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);
+	if((i=smb_hfield_str(&msg,SUBJECT,str))!=SMB_SUCCESS) {
+		fprintf(stderr,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+			,SUBJECT,i,smb.last_error);
 		exit(1); 
 	}
 	msg.idx.subj=smb_subject_crc(str);
 
-	i=smb_dfield(&msg,TEXT_BODY,length);
-	if(i) {
-		fprintf(stderr,"\n\7!smb_dfield returned %d: %s\n",i,smb.last_error);
-		smb_freemsgdat(&smb,offset,length,1);
-		exit(1); 
-	}
-
 	sprintf(str,"SMBUTIL %s-%s r%s %s %s"
 		,SMBUTIL_VER
 		,PLATFORM_DESC
@@ -350,18 +303,20 @@ void postmsg(char type, char* to, char* to_number, char* to_address,
 		,__DATE__
 		,compiler
 		);
-	smb_hfield_str(&msg,FIDOPID,str);
-
-	i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
+	if((i=smb_hfield_str(&msg,FIDOPID,str))!=SMB_SUCCESS) {
+		fprintf(stderr,"\n\7!smb_hfield_str(0x%02X) returned %d: %s\n"
+			,FIDOPID,i,smb.last_error);
+		exit(1); 
+	}
 
-	if(i!=SMB_SUCCESS) {
-		fprintf(stderr,"\n\7!smb_addmsghdr returned %d: %s\n",i,smb.last_error);
-		smb_freemsg_dfields(&smb,&msg,1);
+	if((i=smb_addmsg(&smb,&msg,smb.status.attr&SMB_HYPERALLOC
+		,INT_TO_BOOL(mode&NOCRC),XLAT_NONE,msgtxt,NULL))!=SMB_SUCCESS) {
+		fprintf(stderr,"\n\7!smb_addmsg returned %d: %s\n",i,smb.last_error);
 		exit(1); 
 	}
 	smb_freemsgmem(&msg);
 
-	free(msgtxt);
+	FREE_AND_NULL(msgtxt);
 }
 
 /****************************************************************************/
@@ -1531,10 +1486,7 @@ int main(int argc, char **argv)
 						smb_close(&smb);
 						continue; 
 					}
-					smb.status.max_crcs=0;
-					smb.status.max_age=0;
-					smb.status.max_msgs=1000;
-					smb.status.attr=0;
+					memset(&smb.status,0,sizeof(smb.status));
 					if((i=smb_create(&smb))!=0) {
 						smb_close(&smb);
 						printf("!Error %d (%s) creating %s\n",i,smb.last_error,smb.file);