diff --git a/src/sbbs3/js_msgbase.c b/src/sbbs3/js_msgbase.c
index 39980dc1c8a29006bf3f82cde3789e6db3680314..5974abee653f3df0e50a8139f43a2f2446a78e34 100644
--- a/src/sbbs3/js_msgbase.c
+++ b/src/sbbs3/js_msgbase.c
@@ -335,6 +335,14 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 		smb_hfield(msg, FIDOPID, (ushort)strlen(cp), cp);
 	}
 
+	if(JS_GetProperty(cx, hdr, "ftn_tid", &val) && val!=JSVAL_VOID) {
+		if((js_str=JS_ValueToString(cx,val))==NULL)
+			return(FALSE);
+		if((cp=JS_GetStringBytes(js_str))==NULL)
+			return(FALSE);
+		smb_hfield(msg, FIDOTID, (ushort)strlen(cp), cp);
+	}
+
 	if(JS_GetProperty(cx, hdr, "date", &val) && val!=JSVAL_VOID) {
 		if((js_str=JS_ValueToString(cx,val))==NULL)
 			return(FALSE);
@@ -568,6 +576,10 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 		JS_DefineProperty(cx, hdrobj, "ftn_pid"
 			,STRING_TO_JSVAL(JS_NewStringCopyZ(cx,msg.ftn_pid))
 			,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE);
+	if(msg.ftn_tid!=NULL)
+		JS_DefineProperty(cx, hdrobj, "ftn_tid"
+			,STRING_TO_JSVAL(JS_NewStringCopyZ(cx,msg.ftn_pid))
+			,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE);
 	if(msg.ftn_area!=NULL)
 		JS_DefineProperty(cx, hdrobj, "ftn_area"
 			,STRING_TO_JSVAL(JS_NewStringCopyZ(cx,msg.ftn_area))
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 6cef322e224ed1f737c2a599d1a4fbed6c47bf3d..717ada8677afd04c147f145536c0654b36356304 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -2420,6 +2420,15 @@ int fmsgtosmsg(uchar HUGE16 *fbuf, fmsghdr_t fmsghdr, uint user, uint subnum)
 				if(m>l)
 					smb_hfield(&msg,FIDOPID,(ushort)(m-l),fbuf+l); }
 
+			else if(!strncmp((char *)fbuf+l+1,"TID:",4)) {
+				l+=5;
+				while(l<length && fbuf[l]<=SP) l++;
+				m=l;
+				while(m<length && fbuf[m]!=CR) m++;
+				while(m && fbuf[m-1]<=SP) m--;
+				if(m>l)
+					smb_hfield(&msg,FIDOTID,(ushort)(m-l),fbuf+l); }
+
 			else if(!strncmp((char *)fbuf+l+1,"TZUTC:",6)) {		/* FSP-1001 */
 				l+=7;
 				while(l<length && fbuf[l]<=SP) l++;
@@ -3761,8 +3770,10 @@ void export_echomail(char *sub_code,faddr_t addr)
 				}
 				if(msg.ftn_pid!=NULL)	/* use original PID */
 					f+=sprintf(fmsgbuf+f,"\1PID: %.256s\r", msg.ftn_pid);
-				else					/* generate PID */
-					f+=sprintf(fmsgbuf+f,"\1PID: SBBSecho v%s-%s r%s %s %s\r"
+				if(msg.ftn_tid!=NULL)	/* use original TID */
+					f+=sprintf(fmsgbuf+f,"\1TID: %.256s\r", msg.ftn_tid);
+				else					/* generate TID */
+					f+=sprintf(fmsgbuf+f,"\1TID: SBBSecho v%s-%s r%s %s %s\r"
 						,SBBSECHO_VER,PLATFORM_DESC,revision,__DATE__,compiler);
 
 				/* Unknown kludge lines are added here */
diff --git a/src/smblib/smbdefs.h b/src/smblib/smbdefs.h
index 6b102a3b96638c2b744bf7ba0075ae5a1f61c3c7..87f07e8c4c8a0d08e59dbb96673271787b611d65 100644
--- a/src/smblib/smbdefs.h
+++ b/src/smblib/smbdefs.h
@@ -265,6 +265,7 @@
 #define FIDOREPLYID 		0xa5
 #define FIDOPID 			0xa6
 #define FIDOFLAGS			0xa7
+#define FIDOTID 			0xa8
 
 #define RFC822HEADER		0xb0
 #define RFC822MSGID 		0xb1
@@ -518,6 +519,7 @@ typedef struct {				// Message
 				*path,			// USENET Path
 				*newsgroups,	// USENET Newsgroups
 				*ftn_pid,		// FTN PID
+				*ftn_tid,		// FTN TID
 				*ftn_area,		// FTN AREA
 				*ftn_flags,		// FTN FLAGS
 				*ftn_msgid,		// FTN MSGID
diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index d2dcdf9615f922fe49183e1014c490e679d0aca1..3a6f16bbb6ca6468da5c256c886b8fa0a35a5f35 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -845,6 +845,9 @@ int SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg)
 			case FIDOPID:
 				msg->ftn_pid=(char*)msg->hfield_dat[i];
 				break;
+			case FIDOTID:
+				msg->ftn_tid=(char*)msg->hfield_dat[i];
+				break;
 			case FIDOFLAGS:
 				msg->ftn_flags=(char*)msg->hfield_dat[i];
 				break;
@@ -1833,6 +1836,7 @@ char* SMBCALL smb_hfieldtype(ushort type)
 		case FIDOREPLYID:		return("FIDOREPLYID");
 		case FIDOPID:			return("FIDOPID");
 		case FIDOFLAGS:			return("FIDOFLAGS");
+		case FIDOTID:			return("FIDOTID");
 
 		case RFC822HEADER:		return("RFC822HEADER");
 		case RFC822MSGID:		return("RFC822MSGID");