diff --git a/xtrn/DDMsgReader/DDMsgReader.js b/xtrn/DDMsgReader/DDMsgReader.js
index be95b72bcd26314672f8c15f1c24b0d98f8c9968..a3b311b8207081bd3178dff7db065b57fa202e04 100644
--- a/xtrn/DDMsgReader/DDMsgReader.js
+++ b/xtrn/DDMsgReader/DDMsgReader.js
@@ -108,6 +108,10 @@
  *                              so that screen updates work better after pausing output.
  *                              Also, when running a new message scan (not new-to-you), the current
  *                              sub-board being scanned is now outputted.
+ * 2023-03-24 Eric Oulashin     Version 1.69
+ *                              Bug fix for deleting multiple selected messages: When updating message
+ *                              headers in the cached arrays, don't try to save them back to the database,
+ *                              because that was already done (this avoids a 'header has expanded fields' error).
  */
 
 "use strict";
@@ -213,8 +217,8 @@ var ansiterm = require("ansiterm_lib.js", 'expand_ctrl_a');
 
 
 // Reader version information
-var READER_VERSION = "1.68";
-var READER_DATE = "2023-03-15";
+var READER_VERSION = "1.69";
+var READER_DATE = "2023-03-24";
 
 // Keyboard key codes for displaying on the screen
 var UP_ARROW = ascii(24);
@@ -1686,15 +1690,20 @@ function msgNumToIdxFromMsgbase(pSubCode, pMsgNum)
 //  pApply: Optional boolean - Whether or not to apply the attribute or remove it. Defaults to true.
 //  pSubBoardCode: Optional - An internal sub-board code.  If not specified, then
 //                 this method will default to this.subBoardCode.
-function DigDistMsgReader_RefreshSearchResultMsgHdr(pMsgIndex, pAttrib, pApply, pSubBoardCode)
+//  pWriteHdrToMsgbase: Optional boolean - Whether or not to also save the message to the messagebase.  Defaults to true.
+function DigDistMsgReader_RefreshSearchResultMsgHdr(pMsgIndex, pAttrib, pApply, pSubBoardCode, pWriteHdrToMsgbase)
 {
 	if (typeof(pMsgIndex) != "number")
 		return;
 
 	var applyAttr = (typeof(pApply) === "boolean" ? pApply : true);
-	var subCode = (typeof(pSubBoardCode) == "string" ? pSubBoardCode : this.subBoardCode);
+	var subCode = (typeof(pSubBoardCode) === "string" ? pSubBoardCode : this.subBoardCode);
+	var writeHdrToMsgbase = (typeof(pWriteHdrToMsgbase) === "boolean" ? pWriteHdrToMsgbase : true);
 	var msgbase = new MsgBase(subCode);
-	if (msgbase.open())
+	var continueOn = true;
+	if (writeHdrToMsgbase)
+		continueOn = msgbase.open();
+	if (continueOn)
 	{
 		if (this.msgSearchHdrs.hasOwnProperty(subCode))
 		{
@@ -1707,8 +1716,11 @@ function DigDistMsgReader_RefreshSearchResultMsgHdr(pMsgIndex, pAttrib, pApply,
 						this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex].attr = this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex].attr | pAttrib;
 					else
 						this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex].attr = this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex].attr ^ pAttrib;
-					var msgOffsetFromHdr = this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex].offset;
-					msgbase.put_msg_header(true, msgOffsetFromHdr, this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex]);
+					if (writeHdrToMsgbase)
+					{
+						var msgOffsetFromHdr = this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex].offset;
+						msgbase.put_msg_header(true, msgOffsetFromHdr, this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex]);
+					}
 				}
 			}
 			else
@@ -1717,11 +1729,13 @@ function DigDistMsgReader_RefreshSearchResultMsgHdr(pMsgIndex, pAttrib, pApply,
 				if (this.msgSearchHdrs[this.subBoardCode].indexed.hasOwnProperty(pMsgIndex))
 				{
 					this.msgSearchHdrs[this.subBoardCode].indexed[pMsgIndex] = msgHeader;
-					msgbase.put_msg_header(true, msgHeader.offset, msgHeader);
+					if (writeHdrToMsgbase)
+						msgbase.put_msg_header(true, msgHeader.offset, msgHeader);
 				}
 			}
 		}
-		msgbase.close();
+		if (writeHdrToMsgbase)
+			msgbase.close();
 	}
 }
 
@@ -1758,10 +1772,11 @@ function DigDistMsgReader_RefreshHdrInSubBoardHdrs(pMsgIndex, pAttrib, pApply)
 //  pApply: Optional boolean - Whether or not to apply the attribute or remove it. Defaults to true.
 //  pSubBoardCode: Optional - An internal sub-board code.  If not specified, then
 //                 this method will default to this.subBoardCode.
-function DigDistMsgReader_RefreshHdrInSavedArrays(pMsgIndex, pAttrib, pApply, pSubBoardCode)
+//  pWriteHdrToMsgbase: Optional boolean - Whether or not to also save the message to the messagebase.  Defaults to true.
+function DigDistMsgReader_RefreshHdrInSavedArrays(pMsgIndex, pAttrib, pApply, pSubBoardCode, pWriteHdrToMsgbase)
 {
 	var applyAttr = (typeof(pApply) === "boolean" ? pApply : true);
-	this.RefreshSearchResultMsgHdr(pMsgIndex, pAttrib, applyAttr, pSubBoardCode);
+	this.RefreshSearchResultMsgHdr(pMsgIndex, pAttrib, applyAttr, pSubBoardCode, pWriteHdrToMsgbase);
 	this.RefreshHdrInSubBoardHdrs(pMsgIndex, pAttrib, applyAttr);
 }
 
@@ -14317,7 +14332,7 @@ function DigDistMsgReader_DeleteOrUndeleteSelectedMessages(pDelete)
 						// Refresh the message header in the header arrays (if it exists there) and
 						// remove the message index from the selectedMessages object.  Also, delete
 						// or undelete any vote response messages that may exist for this message.
-						this.RefreshHdrInSavedArrays(msgIdxNumber, MSG_DELETE, markAsDeleted, subBoardCode);
+						this.RefreshHdrInSavedArrays(msgIdxNumber, MSG_DELETE, markAsDeleted, subBoardCode, false);
 						var voteDelRetObj = toggleVoteMsgsDeleted(msgBase, msgHdr.number, msgHdr.id, markAsDeleted, (subBoardCode == "mail"));
 						if (!voteDelRetObj.allVoteMsgsAffected)
 						{
diff --git a/xtrn/DDMsgReader/readme.txt b/xtrn/DDMsgReader/readme.txt
index 4dc9016fd6ebdf3b8abbfb39a78860614f9b832c..f8319e3b1e6b3349c5f17ec0b05b2cbfc0e51bc5 100644
--- a/xtrn/DDMsgReader/readme.txt
+++ b/xtrn/DDMsgReader/readme.txt
@@ -1,6 +1,6 @@
                       Digital Distortion Message Reader
-                                 Version 1.68
-                           Release date: 2023-03-15
+                                 Version 1.69
+                           Release date: 2023-03-24
 
                                      by
 
diff --git a/xtrn/DDMsgReader/revision_history.txt b/xtrn/DDMsgReader/revision_history.txt
index 3cabe176b29df1d8fa44c981b7f11da2b2169037..1a23f4c33cf0112f83fa7dcc3db2405b62b5755c 100644
--- a/xtrn/DDMsgReader/revision_history.txt
+++ b/xtrn/DDMsgReader/revision_history.txt
@@ -5,6 +5,11 @@ Revision History (change log)
 =============================
 Version  Date         Description
 -------  ----         -----------
+1.69     2023-03-24   Bug fix for deleting multiple selected messages: When
+                      updating message headers in the cached arrays, don't try
+                      to save them back to the database, because that was
+                      already done (this avoids a 'header has expanded fields'
+                      error).
 1.68     2023-03-15   Makes use of console.aborted when displaying help screens
                       so that screen updates work better after pausing output.
                       Also, when running a new message scan (not new-to-you),