diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index e8cc33fcebc1ec350d73f85f7ec0907a6b7b3485..3a6611fb59cb8b854fbf6a9d2e7999a8bb6e93c5 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -2584,7 +2584,7 @@ void seektonull(FILE *stream)
 /******************************************************************************
  This function returns a packet name - used for outgoing packets
 ******************************************************************************/
-char *pktname(void)
+char *pktname(BOOL temp)
 {
 	static char str[128];
 	int i;
@@ -2595,8 +2595,8 @@ char *pktname(void)
 	for(i=0;i<MAX_TOTAL_PKTS*2;i++) {
 		now+=i;
 		tm=localtime(&now);
-		sprintf(str,"%s%02u%02u%02u%02u.pk_",cfg.outbound,tm->tm_mday,tm->tm_hour
-			,tm->tm_min,tm->tm_sec);
+		sprintf(str,"%s%02u%02u%02u%02u.%s",cfg.outbound,tm->tm_mday,tm->tm_hour
+			,tm->tm_min,tm->tm_sec,temp ? "pk_" : "pkt");
 		if(!fexist(str))				/* Add 1 second if name exists */
 			break; }
 	return(str);
@@ -2613,6 +2613,7 @@ void putfmsg(FILE *stream,uchar *fbuf,fmsghdr_t fmsghdr,areasbbs_t area
 	faddr_t addr,sysaddr;
 	fpkdmsg_t pkdmsg;
 	time_t t;
+	size_t len;
 	struct tm* tm;
 
 	addr=getsysfaddr(fmsghdr.destzone);
@@ -2634,13 +2635,15 @@ void putfmsg(FILE *stream,uchar *fbuf,fmsghdr_t fmsghdr,areasbbs_t area
 	fwrite(fmsghdr.from	,strlen(fmsghdr.from)+1	,1,stream);
 	fwrite(fmsghdr.subj	,strlen(fmsghdr.subj)+1	,1,stream);
 
+	len = strlen((char *)fbuf);
+
 	/* Write message body */
 	if(area.name)
 		if(strncmp((char *)fbuf,"AREA:",5))                     /* No AREA: Line */
 			fprintf(stream,"AREA:%s\r",area.name);              /* So add one */
-	fwrite(fbuf,strlen((char *)fbuf),1,stream);
+	fwrite(fbuf,len,1,stream);
 	lastlen=9;
-	if(fbuf[strlen((char *)fbuf)-1]!='\r')
+	if(len && fbuf[len-1]!='\r')
 		fputc('\r',stream);
 
 	if(area.name==NULL)	{ /* NetMail, so add FSP-1010 Via kludge line */
@@ -2774,7 +2777,30 @@ void putfmsg(FILE *stream,uchar *fbuf,fmsghdr_t fmsghdr,areasbbs_t area
 
 		fputc('\r',stream); }
 
-	fputc(0,stream);
+	fputc(FIDO_PACKED_MSG_TERMINATOR, stream);
+}
+
+size_t terminate_packet(FILE* stream)
+{
+	WORD	terminator=FIDO_PACKET_TERMINATOR;
+
+	return fwrite(&terminator, sizeof(terminator), 1, stream);
+}
+
+long find_packet_terminator(FILE* stream)
+{
+	WORD	terminator;
+	long	offset;
+
+	fseek(stream, 0, SEEK_END);
+	offset = ftell(stream);
+	if(offset >= sizeof(fpkthdr_t)+sizeof(terminator)) {
+		fseek(stream, offset-sizeof(terminator), SEEK_SET);
+		if(fread(&terminator, sizeof(terminator), 1, stream)
+			&& terminator==FIDO_PACKET_TERMINATOR)
+			offset -= sizeof(terminator);
+	}
+	return(offset);
 }
 
 /******************************************************************************
@@ -3024,8 +3050,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t area,faddr_t faddr
 				break;
 			}
 			if(outpkt[i].curopen) {
-				fputc(0,outpkt[i].stream);
-				fputc(0,outpkt[i].stream);
+				terminate_packet(outpkt[i].stream);
 				fclose(outpkt[i].stream); }
 			else {
 				if((outpkt[i].stream=fnopen(&file,outpkt[i].filename
@@ -3033,8 +3058,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t area,faddr_t faddr
 					lprintf(LOG_ERR,"ERROR line %d opening %s %s",__LINE__
 						,outpkt[i].filename,strerror(errno));
 					continue; }
-				fputc(0,outpkt[i].stream);
-				fputc(0,outpkt[i].stream);
+				terminate_packet(outpkt[i].stream);
 				fclose(outpkt[i].stream); }
 			  /* pack_nundle() disabled.  Why?  ToDo */
 			  /* pack_bundle(outpkt[i].filename,outpkt[i].uplink); */
@@ -3089,8 +3113,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t area,faddr_t faddr
 					fmsghdr.destzone=area.uplink[j].zone;
 					putfmsg(outpkt[i].stream,fbuf,fmsghdr,area,seenbys,paths); }
 				else {
-					fputc(0,outpkt[i].stream);
-					fputc(0,outpkt[i].stream);
+					terminate_packet(outpkt[i].stream);
 					fclose(outpkt[i].stream);
 					/* pack_bundle() disabled.  Why?  ToDo */
 					/* pack_bundle(outpkt[i].filename,outpkt[i].uplink); */
@@ -3112,7 +3135,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t area,faddr_t faddr
 						outpkt[k].curopen=0;
 						--openpkts;
 						break; } }
-			strcpy(outpkt[i].filename,pktname());
+			strcpy(outpkt[i].filename,pktname(/* temp? */ TRUE));
 			now=time(NULL);
 			tm=localtime(&now);
 			if((outpkt[i].stream=fnopen(&file,outpkt[i].filename
@@ -4147,11 +4170,11 @@ int main(int argc, char **argv)
 			fseek(fidomsg,-3L,SEEK_END);
 			fread(str,3,1,fidomsg);
 			if(str[2])						/* No ending NULL, probably junk */
-				fputc(0,fidomsg);
+				fputc(FIDO_PACKED_MSG_TERMINATOR,fidomsg);
 			if(str[1])
-				fputc(0,fidomsg);
+				fputc(FIDO_PACKED_MSG_TERMINATOR,fidomsg);
 			if(str[0])
-				fputc(0,fidomsg);
+				fputc(FIDO_PACKED_MSG_TERMINATOR,fidomsg);
 			fclose(fidomsg);
 			pkt_faddr.zone=pkthdr.destzone;
 			pkt_faddr.net=pkthdr.destnet;
@@ -4168,7 +4191,7 @@ int main(int argc, char **argv)
 			pack_bundle(packet,pkt_faddr); }
 		else {
 			fclose(fidomsg);
-			lprintf(LOG_WARNING,"Stray Outbound Packet (%s) possibly still in use (ftime: .%24s)"
+			lprintf(LOG_WARNING,"Stray Outbound Packet (%s) possibly still in use (ftime: %.24s)"
 				,packet,ctime(&ftime)); 
 		} 
 	}
@@ -4808,17 +4831,19 @@ int main(int argc, char **argv)
 					if(write_flofile(hdr.subj,addr,FALSE /* !bundle */))
 						bail(1); }
 			else
-				strcpy(packet,pktname());
+				strcpy(packet,pktname(/* Temp? */ FALSE));
 
 			now=time(NULL);
 			tm=localtime(&now);
-			if((stream=fnopen(&file,packet,O_WRONLY|O_APPEND|O_CREAT))==NULL) {
+			if((stream=fnopen(&file,packet,O_RDWR|O_CREAT))==NULL) {
 				lprintf(LOG_ERR,"ERROR line %d opening %s %s",__LINE__,packet
 					,strerror(errno));
 				bail(1); 
 			}
 
-			if(!filelength(file)) {
+			if(filelength(file) < sizeof(pkthdr_t)) {
+				chsize(file,0);
+				rewind(stream);
 				memset(&pkthdr,0,sizeof(pkthdr));
 				pkthdr.orignode=hdr.orignode;
 				pkthdr.destnode=addr.node;
@@ -4856,10 +4881,14 @@ int main(int argc, char **argv)
 					memcpy(pkthdr.password,cfg.nodecfg[node].pktpwd,sizeof(pkthdr.password));
 				}
 				fwrite(&pkthdr,sizeof(pkthdr_t),1,stream); 
-			}
+			} else
+				fseek(stream,find_packet_terminator(stream),SEEK_SET);
 
 			putfmsg(stream,fmsgbuf,hdr,fakearea,msg_seen,msg_path);
 
+			/* Write packet terminator */
+			terminate_packet(stream);
+
 			free(fmsgbuf);
 			fclose(stream);
 			/**************************************/