diff --git a/xtrn/DDMsgReader/DDMsgReader.js b/xtrn/DDMsgReader/DDMsgReader.js
index b4ee23569e79b19ead9691a22c84179fbcda80dc..18e59dd1326ac4d8581e81998960644269a8bad8 100644
--- a/xtrn/DDMsgReader/DDMsgReader.js
+++ b/xtrn/DDMsgReader/DDMsgReader.js
@@ -39,6 +39,8 @@
  *                              Releasing this version
  * 2023-10-11 Eric Oulashin     Version 1.81
  *                              Updated permission check functions (speed improvement)
+ * 2023-10-18 Eric Oulashin     Version 1.82
+ *                              Fix for # posts and missing dates in sub-board list when changing sub-board
  */
 
 "use strict";
@@ -143,8 +145,8 @@ var ansiterm = require("ansiterm_lib.js", 'expand_ctrl_a');
 
 
 // Reader version information
-var READER_VERSION = "1.81";
-var READER_DATE = "2023-10-11";
+var READER_VERSION = "1.82";
+var READER_DATE = "2023-10-18";
 
 // Keyboard key codes for displaying on the screen
 var UP_ARROW = ascii(24);
@@ -4387,6 +4389,14 @@ function DigDistMsgReader_CreateLightbarSubBoardMenu(pGrpIdx)
 	// respond to these keys
 	subBoardMenu.AddAdditionalQuitKeys("nNqQ ?0123456789/" + CTRL_F);
 
+	// Add the sub-board items to the menu
+	for (var subIdx = 0; subIdx < msg_area.grp_list[pGrpIdx].sub_list.length; ++subIdx)
+	{
+		var itemText = this.GetMsgSubBoardLine(pGrpIdx, subIdx, false);
+		subBoardMenu.Add(strip_ctrl(itemText), subIdx);
+	}
+	// Alternately, we could change the menu's NumItems() and GetItem():
+	/*
 	// Change the menu's NumItems() and GetItem() function to reference
 	// the message list in this object rather than add the menu items
 	// to the menu
@@ -4407,6 +4417,7 @@ function DigDistMsgReader_CreateLightbarSubBoardMenu(pGrpIdx)
 
 		return menuItemObj;
 	};
+	*/
 
 	// Set the currently selected item to the current group
 	if (msg_area.sub[this.subBoardCode].grp_index == pGrpIdx)
@@ -12170,66 +12181,15 @@ function DigDistMsgReader_GetMsgSubBrdLine(pGrpIndex, pSubIndex, pHighlight)
 	// Use the highlight background color if pHighlight is true.
 	if (pHighlight)
 		subBoardStr += this.colors.areaChooserMsgAreaBkgHighlightColor;
-	// Open the current sub-board with the msgBase object (so that we can get
-	// the date & time of the last imporeted message).
-	var msgBase = new MsgBase(msg_area.grp_list[pGrpIndex].sub_list[pSubIndex].code);
-	if (msgBase.open())
-	{
-		// For storing the date of the newest post
-		var newestDate = {
-			date: "",
-			time: ""
-		};
-		// Get the date & time when the last message was imported.
-		//var numMsgs = numReadableMsgs(msgBase, msg_area.grp_list[pGrpIndex].sub_list[pSubIndex].code);
-		var numMsgs = msgBase.total_msgs;
-		if (numMsgs > 0)
-		{
-			// Get the header of the last readable message in the sub-board. This uses
-			// get_msg_index to get message indexes to quickly check to see if it's
-			// readable, then when a readable one is found, this uses get_msg_header
-			// to get the full header with the properties needed.
-			var msgHeader = null;
-			var msgOffset = msgBase.total_msgs - 1;
-			while (!isReadableMsgHdr(msgHeader, msg_area.grp_list[pGrpIndex].sub_list[pSubIndex].code) && msgOffset >= 0)
-				msgHeader = msgBase.get_msg_index(true, msgOffset--, false);
-			if (msgHeader != null)
-				msgHeader = msgBase.get_msg_header(true, msgOffset, false, false);
-			if (msgHeader != null)
-			{
-				// Construct the date & time strings of the latest post
-				if (this.msgAreaList_lastImportedMsg_showImportTime)
-				{
-					newestDate.date = strftime("%Y-%m-%d", msgHeader.when_imported_time);
-					newestDate.time = strftime("%H:%M:%S", msgHeader.when_imported_time);
-				}
-				else
-				{
-					//newestDate.date = strftime("%Y-%m-%d", msgHeader.when_written_time);
-					//newestDate.time = strftime("%H:%M:%S", msgHeader.when_written_time);
-					var msgWrittenLocalTime = msgWrittenTimeToLocalBBSTime(msgHeader);
-					if (msgWrittenLocalTime != -1)
-					{
-						newestDate.date = strftime("%Y-%m-%d", msgWrittenLocalTime);
-						newestDate.time = strftime("%H:%M:%S", msgWrittenLocalTime);
-					}
-					else
-					{
-						newestDate.date = strftime("%Y-%m-%d", msgHeader.when_written_time);
-						newestDate.time = strftime("%H:%M:%S", msgHeader.when_written_time);
-					}
-				}
-			}
-		}
 
-		// Print the sub-board information line.
-		subBoardStr += (currentSub ? this.colors.areaChooserMsgAreaMarkColor + "*" : " ");
-		subBoardStr += format((pHighlight ? this.subBoardListPrintfInfo[pGrpIndex].highlightPrintfStr : this.subBoardListPrintfInfo[pGrpIndex].printfStr),
-		                      +(pSubIndex+1),
-		                      msg_area.grp_list[pGrpIndex].sub_list[pSubIndex].description.substr(0, this.subBoardListPrintfInfo[pGrpIndex].nameLen),
-		                      numMsgs, newestDate.date, newestDate.time);
-		msgBase.close();
-	}
+	var subBoardInfo = getSubBoardInfo(pGrpIndex, pSubIndex, this.msgAreaList_lastImportedMsg_showImportTime);
+	var latestDateStr = strftime("%Y-%m-%d", subBoardInfo.newestTime);
+	var latestTimeStr = strftime("%H:%M:%S", subBoardInfo.newestTime);
+	subBoardStr += (currentSub ? this.colors.areaChooserMsgAreaMarkColor + "*" : " ");
+	subBoardStr += format((pHighlight ? this.subBoardListPrintfInfo[pGrpIndex].highlightPrintfStr : this.subBoardListPrintfInfo[pGrpIndex].printfStr),
+						  +(pSubIndex+1),
+						  msg_area.grp_list[pGrpIndex].sub_list[pSubIndex].description.substr(0, this.subBoardListPrintfInfo[pGrpIndex].nameLen),
+						  subBoardInfo.numItems, latestDateStr, latestTimeStr);
 	return subBoardStr;
 }
 
@@ -19321,30 +19281,29 @@ function getLastReadableMsgHdrInSubBoard(pSubBoardCode)
 // Return value: The number of readable messages in the sub-board
 function numReadableMsgs(pMsgbase, pSubBoardCode)
 {
-	if ((pMsgbase === null) || !pMsgbase.is_open)
-		return 0;
-
-	var numMsgs = 0;
-	if (typeof(pMsgbase.get_all_msg_headers) === "function")
+	// The posts property in msg_area.sub[sub_code] and msg_area.grp_list.sub_list is the number
+	// of posts excluding vote posts
+	if (typeof(msg_area.sub[pSubBoardCode].posts) === "number")
+		return msg_area.sub[pSubBoardCode].posts;
+	else if ((pMsgbase !== null) && pMsgbase.is_open)
 	{
-		var msgHdrs = pMsgbase.get_all_msg_headers(true);
-		for (var msgHdrsProp in msgHdrs)
-		{
-			if (msgHdrs[msgHdrsProp] == null)
-				continue;
-			else if (isReadableMsgHdr(msgHdrs[msgHdrsProp], pSubBoardCode))
-				++numMsgs;
-		}
+		// Just return the total number of messages..  This isn't accurate, but it's fast.
+		return pMsgbase.total_msgs;
 	}
-	else
+	else if (pMsgbase === null)
 	{
-		for (var i = 0; i < pMsgbase.total_msgs; ++i)
+		var numMsgs = 0;
+		var msgBase = new MsgBase(pSubBoardCode);
+		if (msgBase.open())
 		{
-			if (isReadableMsgHdr(msgBase.get_msg_index(true, i, false), pSubBoardCode))
-				++numMsgs;
+			// Just return the total number of messages..  This isn't accurate, but it's fast.
+			numMsgs = msgBase.total_msgs;
+			msgBase.close();
 		}
+		return numMsgs;
 	}
-	return numMsgs;
+	else
+		return 0;
 }
 
 // Marks or unmarks vote messages as deleted (messages that have voting response data for a message with
@@ -22226,6 +22185,110 @@ function clearScreenRectangle(pX, pY, pWidth, pHeight)
 }
 
 
+// With a group & sub-board index, this function gets the date
+// & time of the latest posted message from a sub-board (or group of sub-boards, if using
+// sub-board name collapsing).  This function also gets the description of the sub-board (or
+// group of sub-boards if using sub-board name collapsing).
+//
+// Parameters:
+//  pGrpIdx: The index of the message group
+//  pSubIdx: The index of the sub-board in the message group (if using
+//           sub-board name collapsing, this could be the index of a set
+//           of sub-subboards).
+//  pShowImportTime: Boolean - Whether or not to use import time. If false, this will use the
+//                   message written time.
+//
+// Return value: An object containing the following properties:
+//               desc: The description of the sub-board (or group of sub-subboards if using name collapsing)
+//               numItems: The number of messages in the sub-board or number of sub-subboards in the group,
+//                         if using sub-board name collapsing
+//               subCode: The internal code of the sub-board (this will be an empty string if it's a group of sub-subboards)
+//               newestTime: A value containing the date & time of the newest post in the sub-board or group of sub-boards
+function getSubBoardInfo(pGrpIdx, pSubIdx, pShowImportTime)
+{
+	var retObj = {
+		desc: "",
+		numItems: 0,
+		subCode: "",
+		newestTime: 0
+	};
+
+	var showImportTime = (typeof(pShowImportTime) === "boolean" ? pShowImportTime : false);
+
+	retObj.desc = msg_area.grp_list[pGrpIdx].sub_list[pSubIdx].description;
+	retObj.subCode = msg_area.grp_list[pGrpIdx].sub_list[pSubIdx].code;
+	// Get the number of messages in the sub-board
+	var numMsgs = numReadableMsgs(null, msg_area.grp_list[pGrpIdx].sub_list[pSubIdx].code);
+	if (numMsgs > 0)
+	{
+		retObj.numItems = numMsgs;
+		//var msgHeader = msgBase.get_msg_header(true, msgBase.total_msgs-1, true);
+		var msgHeader = getLatestMsgHdr(retObj.subCode);
+		if (msgHeader != null)
+		{
+			// Set the newest post time
+			if (showImportTime)
+				retObj.newestTime = msgHeader.when_imported_time;
+			else
+			{
+				var msgWrittenLocalBBSTime = msgWrittenTimeToLocalBBSTime(msgHeader);
+				if (msgWrittenLocalBBSTime != -1)
+					retObj.newestTime = msgWrittenLocalBBSTime;
+				else
+					retObj.newestTime = msgHeader.when_written_time;
+			}
+		}
+	}
+
+	return retObj;
+}
+
+// Gets the header of the latest readable message in a sub-board,
+// given a number of messages to look at.
+//
+// Paramters:
+//  pSubCode: The internal code of the message sub-board
+//
+// Return value: The message header of the latest readable message.  If
+//               none is found, this will be null.
+function getLatestMsgHdr(pSubCode)
+{
+	var msgHdr = null;
+	var msgBase = new MsgBase(pSubCode);
+	if (msgBase.open())
+	{
+		msgHdr = getLatestMsgHdrWithMsgbase(msgBase, pSubCode);
+		msgBase.close();
+	}
+	return msgHdr;
+}
+// Gets the header of the latest readable message in a sub-board,
+// given a number of messages to look at.
+//
+// Paramters:
+//  pMsgbase: A MsgBase object for the sub-board, already opened
+//  pSubCode: The internal code of the sub-board
+//
+// Return value: The message header of the latest readable message.  If
+//               none is found, this will be null.
+function getLatestMsgHdrWithMsgbase(pMsgbase, pSubCode)
+{
+	if (typeof(pMsgbase) !== "object")
+		return null;
+	if (!pMsgbase.is_open)
+		return null;
+
+	// Look through the message headers to find the latest readable one
+	var msgHdrToReturn = null;
+	var msgIdx = pMsgbase.total_msgs-1;
+	var msgHeader = pMsgbase.get_msg_index(true, msgIdx, false);
+	while (!isReadableMsgHdr(msgHeader, pSubCode) && (msgIdx >= 0))
+		msgHeader = pMsgbase.get_msg_index(true, --msgIdx, true);
+	if (msgHeader != null)
+		msgHdrToReturn = pMsgbase.get_msg_header(true, msgIdx, false);
+	return msgHdrToReturn;
+}
+
 ///////////////////////////////////////////////////////////////////////////////////
 
 // For debugging: Writes some text on the screen at a given location with a given pause.
diff --git a/xtrn/DDMsgReader/readme.txt b/xtrn/DDMsgReader/readme.txt
index 184a06f75d470cb54ba8be85ad067456c55c858c..8cd7d5a9bbde3e7de70283c8379768547a2095f3 100644
--- a/xtrn/DDMsgReader/readme.txt
+++ b/xtrn/DDMsgReader/readme.txt
@@ -1,6 +1,6 @@
                       Digital Distortion Message Reader
-                                 Version 1.81
-                           Release date: 2023-10-11
+                                 Version 1.82
+                           Release date: 2023-10-18
 
                                      by
 
diff --git a/xtrn/DDMsgReader/revision_history.txt b/xtrn/DDMsgReader/revision_history.txt
index f33a3469e500759d7718d698d261d0aa17bd2902..87225a053ecaceab8208fc3b2317beb4bcadc23a 100644
--- a/xtrn/DDMsgReader/revision_history.txt
+++ b/xtrn/DDMsgReader/revision_history.txt
@@ -5,7 +5,9 @@ Revision History (change log)
 =============================
 Version  Date         Description
 -------  ----         -----------
-1.81     2023-10-10   Updated permission check functions (speed improvement)
+1.82     2023-10-18   Fix for # posts and missing dates in sub-board list when
+                      changing sub-board
+1.81     2023-10-11   Updated permission check functions (speed improvement)
 1.80     2023-10-10   Improved speed of new-to-you scans, and to an extent
                       (hopefully) overall speed
                       Bug fix: Setting reverseListOrder to "ask" in the .cfg