diff --git a/xtrn/DDAreaChoosers/DDFileAreaChooser.js b/xtrn/DDAreaChoosers/DDFileAreaChooser.js
index 1374ff6260df4aacd8c27b0f11b826b8fb9f7e5d..37464021262904d66b6cd419f3cdfe7ac9d2abfe 100644
--- a/xtrn/DDAreaChoosers/DDFileAreaChooser.js
+++ b/xtrn/DDAreaChoosers/DDFileAreaChooser.js
@@ -49,6 +49,9 @@
  *                            Fix: For lightbar mode with directory collapsing, now sets the selected item based
  *                            on the user's current directory. Also, color settings no longer need the control
  *                            character (they can just be a list of the attribute characters).
+ * 2023-05-14 Eric Oulashin   Version 1.35
+ *                            Refactored the configuration reading code.
+ *                            Fix: Displays correct file counts in directories when using directory name collapsing
  */
 
 // TODO: Failing silently when 1st argument is true
@@ -89,8 +92,8 @@ if (system.version_num < 31400)
 }
 
 // Version & date variables
-var DD_FILE_AREA_CHOOSER_VERSION = "1.34";
-var DD_FILE_AREA_CHOOSER_VER_DATE = "2023-04-15";
+var DD_FILE_AREA_CHOOSER_VERSION = "1.35";
+var DD_FILE_AREA_CHOOSER_VER_DATE = "2023-05-14";
 
 // Keyboard input key codes
 var CTRL_H = "\x08";
@@ -1552,8 +1555,6 @@ function DDFileAreaChooser_CreateLightbarFileLibMenu()
 // the given file library
 function DDFileAreaChooser_CreateLightbarFileDirMenu(pLibIdx, pDirIdx, pLevel)
 {
-	// TODO: Update this for directory name collapsing
-
 	// Start & end indexes for the various items in each mssage group list row
 	// Selected mark, group#, description, # directorys
 	var fileDirListIdxes = {
@@ -1767,92 +1768,37 @@ function DDFileAreaChooser_ReadConfigFile()
 	var cfgFile = new File(gStartupPath + "DDFileAreaChooser.cfg");
 	if (cfgFile.open("r"))
 	{
+		var behaviorSettings = cfgFile.iniGetObject("BEHAVIOR");
+		var colorSettings = cfgFile.iniGetObject("COLORS");
+		cfgFile.close();
+		// Behavior settings
+		var hdrMaxNumLines = parseInt(behaviorSettings["areaChooserHdrMaxLines"]);
+		if (!isNaN(hdrMaxNumLines) && hdrMaxNumLines > 0)
+			this.areaChooserHdrMaxLines = hdrMaxNumLines;
+		if (typeof(behaviorSettings["useLightbarInterface"]) === "boolean")
+			this.useLightbarInterface = behaviorSettings.useLightbarInterface;
+		if (typeof(behaviorSettings["areaChooserHdrFilenameBase"]) === "string")
+			this.areaChooserHdrFilenameBase = behaviorSettings.areaChooserHdrFilenameBase;
+		if (typeof(behaviorSettings["useDirCollapsing"]) === "boolean")
+			this.useDirCollapsing = behaviorSettings.useDirCollapsing;
+		if (typeof(behaviorSettings["dirCollapseSeparator"]) === "string" && behaviorSettings["dirCollapseSeparator"].length > 0)
+			this.dirCollapseSeparator = behaviorSettings.dirCollapseSeparator;
+		// Color settings
 		var onlySyncAttrsRegexWholeWord = new RegExp("^[\x01krgybmcw01234567hinq,;\.dtlasz]+$", 'i');
-		var settingsMode = "behavior";
-		var fileLine = null;     // A line read from the file
-		var equalsPos = 0;       // Position of a = in the line
-		var commentPos = 0;      // Position of the start of a comment
-		var setting = null;      // A setting name (string)
-		var settingUpper = null; // Upper-case setting name
-		var value = null;        // A value for a setting (string)
-		while (!cfgFile.eof)
+		for (var prop in this.colors)
 		{
-			// Read the next line from the config file.
-			fileLine = cfgFile.readln(2048);
-
-			// fileLine should be a string, but I've seen some cases
-			// where it isn't, so check its type.
-			if (typeof(fileLine) != "string")
-				continue;
-
-			// If the line starts with with a semicolon (the comment
-			// character) or is blank, then skip it.
-			if ((fileLine.substr(0, 1) == ";") || (fileLine.length == 0))
-				continue;
-
-			// If in the "behavior" section, then set the behavior-related variables.
-			if (fileLine.toUpperCase() == "[BEHAVIOR]")
-			{
-				settingsMode = "behavior";
-				continue;
-			}
-			else if (fileLine.toUpperCase() == "[COLORS]")
-			{
-				settingsMode = "colors";
-				continue;
-			}
-
-			// If the line has a semicolon anywhere in it, then remove
-			// everything from the semicolon onward.
-			commentPos = fileLine.indexOf(";");
-			if (commentPos > -1)
-				fileLine = fileLine.substr(0, commentPos);
-
-			// Look for an equals sign, and if found, separate the line
-			// into the setting name (before the =) and the value (after the
-			// equals sign).
-			equalsPos = fileLine.indexOf("=");
-			if (equalsPos > 0)
+			if (typeof(colorSettings[prop] === "string"))
 			{
-				// Read the setting & value, and trim leading & trailing spaces.
-				setting = trimSpaces(fileLine.substr(0, equalsPos), true, false, true);
-				settingUpper = setting.toUpperCase();
-				value = trimSpaces(fileLine.substr(equalsPos+1), true, false, true);
-
-				if (settingsMode == "behavior")
-				{
-					// Set the appropriate value in the settings object.
-					if (settingUpper == "USELIGHTBARINTERFACE")
-						this.useLightbarInterface = (value.toUpperCase() == "TRUE");
-					else if (settingUpper == "AREACHOOSERHDRFILENAMEBASE")
-						this.areaChooserHdrFilenameBase = value;
-					else if (settingUpper == "AREACHOOSERHDRMAXLINES")
-					{
-						var maxNumLines = +value;
-						if (maxNumLines > 0)
-							this.areaChooserHdrMaxLines = maxNumLines;
-					}
-					else if (settingUpper == "USEDIRCOLLAPSING")
-						this.useDirCollapsing = (value.toUpperCase() == "TRUE");
-					else if (settingUpper == "DIRCOLLAPSESEPARATOR")
-					{
-						if (value.length > 0)
-							this.dirCollapseSeparator = value;
-					}
-				}
-				else if (settingsMode == "colors")
-				{
-					// If the value doesn't have any control characters, then add the control character
-					// before attribute characters
-					if (!/\x01/.test(value))
-						value = attrCodeStr(value);
-					if (onlySyncAttrsRegexWholeWord.test(value))
-						this.colors[setting] = value;
-				}
+				// Make sure the value is a string (for attrCodeStr() etc; in some cases, such as a background attribute of 4, it will be a number)
+				var value = colorSettings[prop].toString();
+				// If the value doesn't have any control characters, then add the control character
+				// before attribute characters
+				if (!/\x01/.test(value))
+					value = attrCodeStr(value);
+				if (onlySyncAttrsRegexWholeWord.test(value))
+					this.colors[prop] = value;
 			}
 		}
-
-		cfgFile.close();
 	}
 }
 
@@ -1943,7 +1889,7 @@ function numFilesInDir(pLibIdx, pDirIdx)
 
 	// file_area.lib_list[pLibIdx].dir_list[pDirIdx].files was added in Synchronet 3.18c
 	if (file_area.lib_list[pLibIdx].dir_list[pDirIdx].hasOwnProperty("files"))
-		numFiles = +(file_area.lib_list[pLibIdx].dir_list[pDirIdx].files);
+		numFiles = file_area.lib_list[pLibIdx].dir_list[pDirIdx].files;
 	else
 	{
 		// Count the files in the directory.  If it's not a directory, then
@@ -2362,7 +2308,10 @@ function DDFileAreaChooser_GetGreatestNumFiles(pLibIndex)
 			if (this.lib_list[pLibIndex].dir_list[dirIndex].subdir_list.length > 0)
 				retObj.fileCounts[dirIndex] = this.lib_list[pLibIndex].dir_list[dirIndex].subdir_list.length;
 			else
-				retObj.fileCounts[dirIndex] = numFilesInDir(pLibIndex, dirIndex);
+			{
+				var dirCode = this.lib_list[pLibIndex].dir_list[dirIndex].code;
+				retObj.fileCounts[dirIndex] = numFilesInDir(file_area.dir[dirCode].lib_index, file_area.dir[dirCode].index);
+			}
 			if (retObj.fileCounts[dirIndex] > retObj.greatestNumFiles)
 				retObj.greatestNumFiles = retObj.fileCounts[dirIndex];
 		}
@@ -2876,3 +2825,4 @@ function attrCodeStr(pAttrCodeCharStr)
 	}
 	return str;
 }
+
diff --git a/xtrn/DDAreaChoosers/DDMsgAreaChooser.js b/xtrn/DDAreaChoosers/DDMsgAreaChooser.js
index e70a299c9efab72287ab3050ef9b0b30b982ee99..cf49c8a8fba1223183d58a4e4dd9050527a0e197 100644
--- a/xtrn/DDAreaChoosers/DDMsgAreaChooser.js
+++ b/xtrn/DDAreaChoosers/DDMsgAreaChooser.js
@@ -52,6 +52,8 @@
  *                            Fix: For lightbar mode with sub-board collapsing, now sets the selected item based
  *                            on the user's current sub-board. Also, color settings no longer need the control
  *                            character (they can just be a list of the attribute characters).
+ * 2023-05-14 Eric Oulashin   Version 1.35
+ *                            Refactored the code for reading the configuration file
 */
 
 // TODO: In the area list, the 10,000ths digit (for # posts) is in a different color)
@@ -95,8 +97,8 @@ if (system.version_num < 31400)
 }
 
 // Version & date variables
-var DD_MSG_AREA_CHOOSER_VERSION = "1.34";
-var DD_MSG_AREA_CHOOSER_VER_DATE = "2023-04-15";
+var DD_MSG_AREA_CHOOSER_VERSION = "1.35";
+var DD_MSG_AREA_CHOOSER_VER_DATE = "2023-05-14";
 
 // Keyboard input key codes
 var CTRL_H = "\x08";
@@ -2128,96 +2130,41 @@ function DDMsgAreaChooser_ReadConfigFile()
 	var cfgFile = new File(startup_path + "DDMsgAreaChooser.cfg");
 	if (cfgFile.open("r"))
 	{
+		var behaviorSettings = cfgFile.iniGetObject("BEHAVIOR");
+		var colorSettings = cfgFile.iniGetObject("COLORS");
+		cfgFile.close();
+		// Behavior settings
+		var hdrMaxNumLines = parseInt(behaviorSettings["areaChooserHdrMaxLines"]);
+		if (!isNaN(hdrMaxNumLines) && hdrMaxNumLines > 0)
+			this.areaChooserHdrMaxLines = hdrMaxNumLines;
+		if (typeof(behaviorSettings["useLightbarInterface"]) === "boolean")
+			this.useLightbarInterface = behaviorSettings.useLightbarInterface;
+		if (typeof(behaviorSettings["showImportDates"]) === "boolean")
+			this.showImportDates = behaviorSettings.showImportDates;
+		if (typeof(behaviorSettings["areaChooserHdrFilenameBase"]) === "string")
+			this.areaChooserHdrFilenameBase = behaviorSettings.areaChooserHdrFilenameBase;
+		if (typeof(behaviorSettings["useSubCollapsing"]) === "boolean")
+			this.useSubCollapsing = behaviorSettings.useSubCollapsing;
+		if (typeof(behaviorSettings["subCollapseSeparator"]) === "string" && behaviorSettings["subCollapseSeparator"].length > 0)
+			this.subCollapseSeparator = behaviorSettings.subCollapseSeparator;
+		if (typeof(behaviorSettings["showDatesInSubBoardList"]) === "boolean")
+			this.showDatesInSubBoardList = behaviorSettings.showDatesInSubBoardList;
+		// Color settings
 		var onlySyncAttrsRegexWholeWord = new RegExp("^[\x01krgybmcw01234567hinq,;\.dtlasz]+$", 'i');
-		var settingsMode = "behavior";
-		var fileLine = null;     // A line read from the file
-		var equalsPos = 0;       // Position of a = in the line
-		var commentPos = 0;      // Position of the start of a comment
-		var setting = null;      // A setting name (string)
-		var settingUpper = null; // Upper-case setting name
-		var value = null;        // A value for a setting (string)
-		while (!cfgFile.eof)
-		{
-			// Read the next line from the config file.
-			fileLine = cfgFile.readln(2048);
-
-			// fileLine should be a string, but I've seen some cases
-			// where it isn't, so check its type.
-			if (typeof(fileLine) != "string")
-				continue;
-
-			// If the line starts with with a semicolon (the comment
-			// character) or is blank, then skip it.
-			if ((fileLine.substr(0, 1) == ";") || (fileLine.length == 0))
-				continue;
-
-			// If in the "behavior" section, then set the behavior-related variables.
-			if (fileLine.toUpperCase() == "[BEHAVIOR]")
-			{
-				settingsMode = "behavior";
-				continue;
-			}
-			else if (fileLine.toUpperCase() == "[COLORS]")
-			{
-				settingsMode = "colors";
-				continue;
-			}
-
-			// If the line has a semicolon anywhere in it, then remove
-			// everything from the semicolon onward.
-			commentPos = fileLine.indexOf(";");
-			if (commentPos > -1)
-				fileLine = fileLine.substr(0, commentPos);
-
-			// Look for an equals sign, and if found, separate the line
-			// into the setting name (before the =) and the value (after the
-			// equals sign).
-			equalsPos = fileLine.indexOf("=");
-			if (equalsPos > 0)
+		for (var prop in this.colors)
+		{
+			if (typeof(colorSettings[prop] === "string"))
 			{
-				// Read the setting & value, and trim leading & trailing spaces.
-				setting = trimSpaces(fileLine.substr(0, equalsPos), true, false, true);
-				settingUpper = setting.toUpperCase();
-				value = trimSpaces(fileLine.substr(equalsPos+1), true, false, true);
-
-				if (settingsMode == "behavior")
-				{
-					// Set the appropriate value in the settings object.
-					if (settingUpper == "USELIGHTBARINTERFACE")
-						this.useLightbarInterface = (value.toUpperCase() == "TRUE");
-					else if (settingUpper == "SHOWIMPORTDATES")
-						this.showImportDates = (value.toUpperCase() == "TRUE");
-					else if (settingUpper == "AREACHOOSERHDRFILENAMEBASE")
-						this.areaChooserHdrFilenameBase = value;
-					else if (settingUpper == "AREACHOOSERHDRMAXLINES")
-					{
-						var maxNumLines = +value;
-						if (maxNumLines > 0)
-							this.areaChooserHdrMaxLines = maxNumLines;
-					}
-					else if (settingUpper == "SHOWDATESINSUBBOARDLIST")
-						this.showDatesInSubBoardList = (value.toUpperCase() == "TRUE");
-					else if (settingUpper == "USESUBCOLLAPSING")
-						this.useSubCollapsing = (value.toUpperCase() == "TRUE");
-					else if (settingUpper == "SUBCOLLAPSESEPARATOR")
-					{
-						if (value.length > 0)
-							this.subCollapseSeparator = value;
-					}
-				}
-				else if (settingsMode == "colors")
-				{
-					// If the value doesn't have any control characters, then add the control character
-					// before attribute characters
-					if (!/\x01/.test(value))
-						value = attrCodeStr(value);
-					if (onlySyncAttrsRegexWholeWord.test(value))
-						this.colors[setting] = value;
-				}
+				// Make sure the value is a string (for attrCodeStr() etc; in some cases, such as a background attribute of 4, it will be a number)
+				var value = colorSettings[prop].toString();
+				// If the value doesn't have any control characters, then add the control character
+				// before attribute characters
+				if (!/\x01/.test(value))
+					value = attrCodeStr(value);
+				if (onlySyncAttrsRegexWholeWord.test(value))
+					this.colors[prop] = value;
 			}
 		}
-
-		cfgFile.close();
 	}
 }
 
diff --git a/xtrn/DDAreaChoosers/readme.txt b/xtrn/DDAreaChoosers/readme.txt
index a407caf916535621579179da9bae067a7d743c9a..718134157c69c709d6449d59327e5313738bdfd4 100644
--- a/xtrn/DDAreaChoosers/readme.txt
+++ b/xtrn/DDAreaChoosers/readme.txt
@@ -1,6 +1,6 @@
                      Digital Distortion Area Choosers
-                              Version 1.34
-                        Release date: 2023-04-15
+                              Version 1.35
+                        Release date: 2023-05-14
 
                                   by
 
diff --git a/xtrn/DDAreaChoosers/revision_history.txt b/xtrn/DDAreaChoosers/revision_history.txt
index 93a23936e986649714374c746e17ced81604d32b..d8debf37974d4ae87138f7284b373b61863e1033 100644
--- a/xtrn/DDAreaChoosers/revision_history.txt
+++ b/xtrn/DDAreaChoosers/revision_history.txt
@@ -5,6 +5,10 @@ Revision History (change log)
 =============================
 Version  Date         Description
 -------  ----         -----------
+1.35     2023-05-14   File area chooser fix: Displays correct file counts in
+                      directories when using directory name collapsing.
+                      Both: Internal refactor for the code that reads the
+                      configuration file (no functional change).
 1.34     2023-04-15   Fix: For lightbar mode with sub-board or dir collapsing,
                       these now set the selected item based on the user's
                       current sub-board or directory. Also, color settings no