diff --git a/src/smblib/smbdefs.h b/src/smblib/smbdefs.h
index baf75c087d0fb3736b34c741da391eb18b701d4d..61d3ea5b06eaa3de35c33375b94c2b5fb5ff9af1 100644
--- a/src/smblib/smbdefs.h
+++ b/src/smblib/smbdefs.h
@@ -657,7 +657,7 @@ typedef struct {				/* Message base */
 	/* Private member variables (not initialized by or used by smblib) */
 	uint32_t	subnum;			/* Sub-board number */
 	uint32_t	msgs;			/* Number of messages loaded (for user) */
-	uint32_t	curmsg;			/* Current message number (for user) */
+	uint32_t	curmsg;			/* Current message number (for user, 0-based) */
 
 } smb_t;
 
diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index ba19655137d1df00196f7308f9e584fba872f5f4..4ad9b2ba26cf7beb89ff9c6831555422e8442c90 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -2004,4 +2004,32 @@ int SMBCALL smb_updatethread(smb_t* smb, smbmsg_t* remsg, ulong newmsgnum)
 	return(retval);
 }
 
+long SMBCALL smb_first_in_thread(smb_t* smb, smbmsg_t* remsg)
+{
+	smbmsg_t msg;
+
+	if(!remsg->hdr.thread_back)
+		return remsg->hdr.number;
+
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.number = remsg->hdr.thread_id;
+	if(smb_getmsgidx(smb, &msg) == SMB_SUCCESS)
+		return msg.hdr.number;
+
+	/* Walk the thread backwards to find the oldest msg in thread */
+	long msgnum = msg.hdr.number = remsg->hdr.number;
+	msg.hdr.thread_back = remsg->hdr.thread_back;
+	while(msg.hdr.thread_back != 0 && msg.hdr.thread_back < msg.hdr.number) {
+		msg.hdr.number = msg.hdr.thread_back;
+		if(smb_getmsgidx(smb, &msg) != SMB_SUCCESS)
+			break;
+		if(smb_getmsghdr(smb, &msg) != SMB_SUCCESS)
+			break;
+		smb_freemsgmem(&msg);
+		msgnum = msg.hdr.number;
+	}
+
+	return msgnum;
+}
+
 /* End of SMBLIB.C */
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index 7e5e3d314aa2271df5469ef58331b8e4f0a290a5..eae371e7fa484fe73c2a408b1dfb3f4dc4da54b7 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -186,6 +186,7 @@ SMBEXPORT BOOL		SMBCALL smb_valid_hdr_offset(smb_t* smb, ulong offset);
 SMBEXPORT int		SMBCALL smb_init_idx(smb_t* smb, smbmsg_t* msg);
 SMBEXPORT uint16_t	SMBCALL	smb_voted_already(smb_t*, uint32_t msgnum, const char* name, enum smb_net_type, void* net_addr);
 SMBEXPORT BOOL		SMBCALL smb_msg_is_from(smbmsg_t* msg, const char* name, enum smb_net_type net_type, const void* net_addr);
+SMBEXPORT long		SMBCALL smb_first_in_thread(smb_t*, smbmsg_t*);
 
 /* smbadd.c */
 SMBEXPORT int		SMBCALL smb_addmsg(smb_t* smb, smbmsg_t* msg, int storage, long dupechk_hashes