diff --git a/xtrn/DDMsgReader/DDMsgReader.cfg b/xtrn/DDMsgReader/DDMsgReader.cfg
index f1ea4c897acf5f46be52745568bd4ccf0081d259..0570e32277e76f4bdfab8a772d6af4dad3e20b9b 100644
--- a/xtrn/DDMsgReader/DDMsgReader.cfg
+++ b/xtrn/DDMsgReader/DDMsgReader.cfg
@@ -108,5 +108,10 @@ subBoardChangeSorting=None
 ; as they like. Valid values are true or false.
 indexedModeNewscanOnlyShowSubsWithNewMsgs=false
 
+; For messages with upvotes/downvotes, when showing vote tally info (a sysop function),
+; whether or not to show whose votes are upvotes and whose are downvotes. If false,
+; it will just show the names of who voted on the message (and when).
+showWhoUpvotedAndDownvotedInTallyInfo=false
+
 ; The theme file name (for colors, strings, etc.)
 themeFilename=DefaultTheme.cfg
diff --git a/xtrn/DDMsgReader/DDMsgReader.js b/xtrn/DDMsgReader/DDMsgReader.js
index 296e8d92b98b72875bd9aef3206290ccac18b192..c20a21543dafa794035deb307afccbd638b97e4a 100644
--- a/xtrn/DDMsgReader/DDMsgReader.js
+++ b/xtrn/DDMsgReader/DDMsgReader.js
@@ -243,6 +243,12 @@
  * 2025-04-15 Eric Oulashin     Version 1.96o
  *                              Fix: For the sysop reading personal email addressed to
  *                              "sysop", mark the email as read
+ * 2025-04-19 Eric Oulashin     Version 1.96p
+ *                              When viewing tally information for a message (a sysop
+ *                              feature), DDMsgReader can now optionally show who
+ *                              specifically voted up/down. Defaults to false. The
+ *                              option can be toggled (true/false) via the new
+ *                              configuration option showWhoUpvotedAndDownvotedInTallyInfo
  */
 
 "use strict";
@@ -350,8 +356,8 @@ var hexdump = load('hexdump_lib.js');
 
 
 // Reader version information
-var READER_VERSION = "1.96o";
-var READER_DATE = "2025-04-15";
+var READER_VERSION = "1.96p";
+var READER_DATE = "2025-04-19";
 
 // Keyboard key codes for displaying on the screen
 var UP_ARROW = ascii(24);
@@ -1097,6 +1103,11 @@ function DigDistMsgReader(pSubBoardCode, pScriptArgs)
 	// reading the last message instead of prompting to go to the next sub-board.
 	// This is like the stock Synchronet behavior.
 	this.readingPostOnSubBoardInsteadOfGoToNext = false;
+	
+	// For messages with upvotes/downvotes, when showing vote tally info (a sysop function),
+	// whether or not to show whose votes are upvotes and whose are downvotes. If false,
+	// it will just show the names of who voted on the message (and when).
+	this.showWhoUpvotedAndDownvotedInTallyInfo = false;
 
 	// String lengths for the columns to write
 	// Fixed field widths: Message number, date, and time
@@ -9943,19 +9954,19 @@ function DigDistMsgReader_ReadConfigFile()
 			this.quickUserValSetIndex = numberVal;
 		if (settingsObj.hasOwnProperty("listInterfaceStyle") && typeof(settingsObj.listInterfaceStyle) === "string")
 			this.msgListUseLightbarListInterface = (settingsObj.listInterfaceStyle.toUpperCase() == "LIGHTBAR");
-		if (typeof(settingsObj["readerInterfaceStyle"]) === "string")
+		if (typeof(settingsObj.readerInterfaceStyle) === "string")
 			this.scrollingReaderInterface = (settingsObj.readerInterfaceStyle.toUpperCase() == "SCROLLABLE");
-		if (typeof(settingsObj["displayBoardInfoInHeader"]) === "boolean")
+		if (typeof(settingsObj.displayBoardInfoInHeader) === "boolean")
 			this.displayBoardInfoInHeader = settingsObj.displayBoardInfoInHeader;
-		if (typeof(settingsObj["promptToContinueListingMessages"]) === "boolean")
+		if (typeof(settingsObj.promptToContinueListingMessages) === "boolean")
 			this.promptToContinueListingMessages = settingsObj.promptToContinueListingMessages;
-		if (typeof(settingsObj["promptConfirmReadMessage"]) === "boolean")
+		if (typeof(settingsObj.promptConfirmReadMessage) === "boolean")
 			this.promptToReadMessage = settingsObj.promptConfirmReadMessage;
-		if (typeof(settingsObj["msgListDisplayTime"]) === "string")
+		if (typeof(settingsObj.msgListDisplayTime) === "string")
 			this.msgList_displayMessageDateImported = (settingsObj.msgListDisplayTime.toUpperCase() == "IMPORTED");
-		if (typeof(settingsObj["msgAreaList_lastImportedMsg_time"]) === "string")
+		if (typeof(settingsObj.msgAreaList_lastImportedMsg_time) === "string")
 			this.msgAreaList_lastImportedMsg_showImportTime = (settingsObj.msgAreaList_lastImportedMsg_time.toUpperCase() == "IMPORTED");
-		if (typeof(settingsObj["startMode"]) === "string")
+		if (typeof(settingsObj.startMode) === "string")
 		{
 			var valueUpper = settingsObj.startMode.toUpperCase();
 			if ((valueUpper == "READER") || (valueUpper == "READ"))
@@ -9963,28 +9974,30 @@ function DigDistMsgReader_ReadConfigFile()
 			else if ((valueUpper == "LISTER") || (valueUpper == "LIST"))
 				this.startMode = READER_MODE_LIST;
 		}
-		if (typeof(settingsObj["pauseAfterNewMsgScan"]) === "boolean")
+		if (typeof(settingsObj.pauseAfterNewMsgScan) === "boolean")
 			this.pauseAfterNewMsgScan = settingsObj.pauseAfterNewMsgScan;
-		if (typeof(settingsObj["readingPostOnSubBoardInsteadOfGoToNext"]) === "boolean")
+		if (typeof(settingsObj.readingPostOnSubBoardInsteadOfGoToNext) === "boolean")
 			this.readingPostOnSubBoardInsteadOfGoToNext = settingsObj.readingPostOnSubBoardInsteadOfGoToNext;
-		if (typeof(settingsObj["areaChooserHdrFilenameBase"]) === "string")
+		if (typeof(settingsObj.areaChooserHdrFilenameBase) === "string")
 			this.areaChooserHdrFilenameBase = settingsObj.areaChooserHdrFilenameBase;
-		if (typeof(settingsObj["displayAvatars"]) === "boolean")
+		if (typeof(settingsObj.displayAvatars) === "boolean")
 			this.displayAvatars = settingsObj.displayAvatars;
-		if (typeof(settingsObj["rightJustifyAvatars"]) === "boolean")
+		if (typeof(settingsObj.rightJustifyAvatars) === "boolean")
 			this.rightJustifyAvatar = settingsObj.rightJustifyAvatars;
-		if (typeof(settingsObj["msgListSort"]) === "string")
+		if (typeof(settingsObj.msgListSort) === "string")
 		{
 			if (settingsObj.msgListSort.toUpperCase() == "WRITTEN")
 				this.msgListSort = MSG_LIST_SORT_DATETIME_WRITTEN;
 		}
-		if (typeof(settingsObj["convertYStyleMCIAttrsToSync"]) === "boolean")
+		if (typeof(settingsObj.convertYStyleMCIAttrsToSync) === "boolean")
 			this.convertYStyleMCIAttrsToSync = settingsObj.convertYStyleMCIAttrsToSync;
-		if (typeof(settingsObj["prependFowardMsgSubject"]) === "boolean")
+		if (typeof(settingsObj.prependFowardMsgSubject) === "boolean")
 			this.prependFowardMsgSubject = settingsObj.prependFowardMsgSubject;
-		if (typeof(settingsObj["enableIndexedModeMsgListCache"]) === "boolean")
+		if (typeof(settingsObj.enableIndexedModeMsgListCache) === "boolean")
 			this.enableIndexedModeMsgListCache = settingsObj.enableIndexedModeMsgListCache;
-		if (typeof(settingsObj["themeFilename"]) === "string")
+		if (typeof(settingsObj.showWhoUpvotedAndDownvotedInTallyInfo) === "boolean")
+			this.showWhoUpvotedAndDownvotedInTallyInfo = settingsObj.showWhoUpvotedAndDownvotedInTallyInfo;
+		if (typeof(settingsObj.themeFilename) === "string")
 		{
 			// First look for the theme config file in the sbbs/mods
 			// directory, then sbbs/ctrl, then the same directory as
@@ -9995,9 +10008,9 @@ function DigDistMsgReader_ReadConfigFile()
 			if (!file_exists(themeFilename))
 				themeFilename = js.exec_dir + settingsObj.themeFilename;
 		}
-		if (typeof(settingsObj["saveAllHdrsWhenSavingMsgToBBSPC"]) === "boolean")
+		if (typeof(settingsObj.saveAllHdrsWhenSavingMsgToBBSPC) === "boolean")
 			this.saveAllHdrsWhenSavingMsgToBBSPC = settingsObj.saveAllHdrsWhenSavingMsgToBBSPC;
-		if (typeof(settingsObj["msgSaveDir"]) === "string" && settingsObj.msgSaveDir.length > 0 && file_isdir(settingsObj.msgSaveDir))
+		if (typeof(settingsObj.msgSaveDir) === "string" && settingsObj.msgSaveDir.length > 0 && file_isdir(settingsObj.msgSaveDir))
 			this.msgSaveDir = settingsObj.msgSaveDir;
 		// User setting defaults
 		if (typeof(settingsObj.reverseListOrder === "boolean"))
@@ -19009,16 +19022,32 @@ function DigDistMsgReader_GetUpvoteAndDownvoteInfo(pMsgHdr)
 			{
 				if (tmpHdrs[tmpProp] == null)
 					continue;
-				// If this header's thread_back or reply_id matches the poll message
-				// number, then append the 'user voted' string to the message body.
-				if ((tmpHdrs[tmpProp].thread_back == pMsgHdr.number) || (tmpHdrs[tmpProp].reply_id == pMsgHdr.id))
+				// If this header's thread_back or reply_id matches the original message
+				// number and it's an upvote/downvote, then append a 'user voted'
+				// string to the message body.
+				if (tmpHdrs[tmpProp].thread_back == pMsgHdr.number || tmpHdrs[tmpProp].reply_id == pMsgHdr.id)
 				{
 					var tmpMessageBody = msgbase.get_msg_body(false, tmpHdrs[tmpProp].number, false, false, true, true);
-					if ((tmpHdrs[tmpProp].field_list.length == 0) && (tmpMessageBody.length == 0))
+					var msgIsUpvote = Boolean(tmpHdrs[tmpProp].attr & MSG_UPVOTE);
+					var msgIsDownvote = Boolean(tmpHdrs[tmpProp].attr & MSG_DOWNVOTE);
+					if (tmpHdrs[tmpProp].field_list.length == 0 && tmpMessageBody.length == 0 && (msgIsUpvote || msgIsDownvote))
 					{
 						var msgWrittenLocalTime = msgWrittenTimeToLocalBBSTime(tmpHdrs[tmpProp]);
 						var voteDate = strftime("%a %b %d %Y %H:%M:%S", msgWrittenLocalTime);
-						voteInfo.push("\x01n\x01c\x01h" + tmpHdrs[tmpProp].from + "\x01n\x01c voted on this message on " + voteDate + "\x01n");
+						var infoStr = "";
+						// If the option to show the users' specific up/downvotes is enabled, then include that
+						if (this.showWhoUpvotedAndDownvotedInTallyInfo)
+						{
+							var voteTypeStr = (msgIsUpvote ? "up" : msgIsDownvote ? "down" : "");
+							infoStr = format("\x01n\x01c\x01h%s\x01n\x01c voted on this message (%s) on %s\x01n",
+							                 tmpHdrs[tmpProp].from, voteTypeStr, voteDate);
+						}
+						else
+						{
+							infoStr = format("\x01n\x01c\x01h%s\x01n\x01c voted on this message on %s\x01n",
+							                 tmpHdrs[tmpProp].from, voteDate);
+						}
+						voteInfo.push(infoStr);
 					}
 				}
 			}
diff --git a/xtrn/DDMsgReader/ddmr_cfg.js b/xtrn/DDMsgReader/ddmr_cfg.js
index 0120ab64d7a57ee5804f764999bce631ee57a98c..dfd0fe53929651be15ae4f1a463ddba4f80934c8 100644
--- a/xtrn/DDMsgReader/ddmr_cfg.js
+++ b/xtrn/DDMsgReader/ddmr_cfg.js
@@ -5,7 +5,7 @@
 // If you have DDMsgReader in a directory other than xtrn/DDMsgReader, then the changes to
 // DDMsgReader.cfg will be saved in that directory (assuming you're running ddmr_cfg.js from
 // that same directory).
-// Currently for DDMsgReader 1.96o.
+// Currently for DDMsgReader 1.96p.
 //
 // If you're running DDMsgReader from xtrn/DDMsgReader (the standard location) and you want
 // to save the configuration file there (rather than sbbs/mods), you can use one of the
@@ -18,7 +18,7 @@ require("sbbsdefs.js", "P_NONE");
 require("uifcdefs.js", "UIFC_INMSG");
 
 
-if (!uifc.init("DigDist. Message Reader 1.96o Configurator"))
+if (!uifc.init("DigDist. Message Reader 1.96p Configurator"))
 {
 	print("Failed to initialize uifc");
 	exit(1);
@@ -119,6 +119,7 @@ function doMainMenu()
 		"promptDelPersonalEmailAfterReply", // Boolean
 		"subBoardChangeSorting", // String: None, Alphabetical, LatestMsgDateOldestFirst, or LatestMsgDateNewestFirst
 		"indexedModeNewscanOnlyShowSubsWithNewMsgs", // Boolean
+		"showWhoUpvotedAndDownvotedInTallyInfo", // Boolean
 		"themeFilename" // String
 	];
 	// Strings for the options to display on the menu
@@ -155,6 +156,7 @@ function doMainMenu()
 		"Personal email: Prompt to delete after reply",
 		"Sorting for sub-board change",
 		"Index newscan: Only show subs w/ new msgs",
+		"Include specific up/downvotes w/ tally info",
 		"Theme Filename"
 	];
 	// Build an array of formatted string to be displayed on the menu
@@ -635,6 +637,11 @@ function getOptionHelpText()
 	optionHelpText["indexedModeNewscanOnlyShowSubsWithNewMsgs"] += "whether to only show sub-boards with new messages. This is a ";
 	optionHelpText["indexedModeNewscanOnlyShowSubsWithNewMsgs"] += "default for a user setting, which users can change for themselves.";
 
+	optionHelpText["showWhoUpvotedAndDownvotedInTallyInfo"] = "Include specific up/downvotes w/ tally info: For messages with upvotes/downvotes, ";
+	optionHelpText["showWhoUpvotedAndDownvotedInTallyInfo"] += "when showing vote tally info (a sysop function), whether or not to show whose votes ";
+	optionHelpText["showWhoUpvotedAndDownvotedInTallyInfo"] += "are upvotes and whose are downvotes. If false, it will just show the names of who ";
+	optionHelpText["showWhoUpvotedAndDownvotedInTallyInfo"] += "voted on the message (and when).";
+
 	optionHelpText["themeFilename"] = "Theme filename: The name of a file for a color theme to use";
 
 	// Word-wrap the help text items
@@ -839,6 +846,8 @@ function readDDMsgReaderCfgFile()
 		retObj.cfgOptions.subBoardChangeSorting = "None";
 	if (!retObj.cfgOptions.hasOwnProperty("indexedModeNewscanOnlyShowSubsWithNewMsgs"))
 		retObj.cfgOptions.indexedModeNewscanOnlyShowSubsWithNewMsgs = false;
+	if (!retObj.cfgOptions.hasOwnProperty("showWhoUpvotedAndDownvotedInTallyInfo"))
+		retObj.cfgOptions.showWhoUpvotedAndDownvotedInTallyInfo = false;
 	if (!retObj.cfgOptions.hasOwnProperty("themeFilename"))
 		retObj.cfgOptions.themeFilename = "DefaultTheme.cfg";
 
diff --git a/xtrn/DDMsgReader/readme.txt b/xtrn/DDMsgReader/readme.txt
index 08cb70fe0a87e303446533903dc9f2b80f4242d1..0cdbcadd33f08cad48f715f21a6375ea7bb47392 100644
--- a/xtrn/DDMsgReader/readme.txt
+++ b/xtrn/DDMsgReader/readme.txt
@@ -1,6 +1,6 @@
                       Digital Distortion Message Reader
-                                 Version 1.96o
-                           Release date: 2025-04-15
+                                 Version 1.96p
+                           Release date: 2025-04-19
 
                                      by
 
@@ -853,6 +853,15 @@ indexedModeNewscanOnlyShowSubsWithNewMsgs  For indexed-mode newscan, whether to
                                            for themselves as they like. Valid
                                            values are true or false.
 
+showWhoUpvotedAndDownvotedInTallyInfo  For messages with upvotes/downvotes, when
+                                       showing vote tally info (a sysop
+                                       function), this specifies whether or not
+                                       to show whose votes are upvotes and whose
+                                       are downvotes. If false, it will just
+                                       show the names of who voted on the
+                                       message (and when). Valid values are true
+                                       or false.
+
 themeFilename                         The name of the configuration file to
                                       use for colors & string settings
 
diff --git a/xtrn/DDMsgReader/revision_history.txt b/xtrn/DDMsgReader/revision_history.txt
index 3456413b7e1cc6995215d4274319198886241fc9..5cbb2f4cdf0ac01882dae63b29e13cb04a09268d 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.96p    2025-04-19   When viewing tally information for a message (a sysop
+                      feature), DDMsgReader can now optionally show who
+                      specifically voted up/down. Defaults to false. The option
+                      can be toggled (true/false) via the new configuration
+                      option showWhoUpvotedAndDownvotedInTallyInfo
 1.96o    2025-04-15   Fix: For the sysop reading personal email addressed to
                       "sysop", mark the email as read
 1.96N    2025-04-13   Changes (fixes) for the bottom-row key help lines due to