diff --git a/xtrn/DDAreaChoosers/DDFileAreaChooser.js b/xtrn/DDAreaChoosers/DDFileAreaChooser.js
index 20fea918ebbd6cc38ae30a430c833f2a5dd7649a..a5929af227c1ed29880543771a154e0758bba2ed 100644
--- a/xtrn/DDAreaChoosers/DDFileAreaChooser.js
+++ b/xtrn/DDAreaChoosers/DDFileAreaChooser.js
@@ -60,6 +60,8 @@
  *                            Area change header line bug fix
  * 2023-09-16 Eric Oulashin   Version 1.37
  *                            Releasing this version
+ * 2023-09-17 Eric Oulashin   Version 1.38
+ *                            Bug fix: Searching was stuck if using directory name collapsing
  */
 
 // TODO: Failing silently when 1st argument is true
@@ -100,8 +102,8 @@ if (system.version_num < 31400)
 }
 
 // Version & date variables
-var DD_FILE_AREA_CHOOSER_VERSION = "1.37";
-var DD_FILE_AREA_CHOOSER_VER_DATE = "2023-09-16";
+var DD_FILE_AREA_CHOOSER_VERSION = "1.38";
+var DD_FILE_AREA_CHOOSER_VER_DATE = "2023-09-17";
 
 // Keyboard input key codes
 var CTRL_H = "\x08";
@@ -256,6 +258,7 @@ function DDFileAreaChooser()
 	this.DisplayAreaChgHdr = DDFileAreaChooser_DisplayAreaChgHdr;
 	this.WriteLightbarKeyHelpErrorMsg = DDFileAreaChooser_WriteLightbarKeyHelpErrorMsg;
 	this.SetUpLibListWithCollapsedDirs = DDFileAreaChooser_SetUpLibListWithCollapsedDirs;
+	this.FindFileDirIdxFromText = DDFileAreaChooser_FindFileDirIdxFromText;
 	this.GetGreatestNumFiles = DDFileAreaChooser_GetGreatestNumFiles;
 
 	// Read the settings from the config file.
@@ -1168,13 +1171,13 @@ function DDFileAreaChooser_SelectFileArea_Lightbar(pLevel, pLibIdx, pDirIdx, pCa
 				switch (level)
 				{
 					case 1:
-						idx = findFileLibIdxFromText(searchText, fileAreaMenu.selectedItemIdx);
+						idx = findFileLibIdxFromText(searchText, fileAreaMenu.selectedItemIdx, level, pDirIdx);
 						break;
 					case 2:
-						idx = findFileDirIdxFromText(pLibIdx, searchText, fileAreaMenu.selectedItemIdx+1);
+						idx = this.FindFileDirIdxFromText(pLibIdx, searchText, fileAreaMenu.selectedItemIdx+1, level, pDirIdx);
 						break;
 					case 3:
-						// TODO
+						idx = this.FindFileDirIdxFromText(pLibIdx, searchText, 0, level, pDirIdx);
 						break;
 				}
 				lastSearchFoundIdx = idx;
@@ -1202,10 +1205,10 @@ function DDFileAreaChooser_SelectFileArea_Lightbar(pLevel, pLibIdx, pDirIdx, pCa
 							idx = findFileLibIdxFromText(searchText, 0);
 							break;
 						case 2:
-							idx = findFileDirIdxFromText(pLibIdx, searchText, 0);
+							idx = this.FindFileDirIdxFromText(pLibIdx, searchText, 0, level, pDirIdx);
 							break;
 						case 3:
-							// TODO
+							idx = this.FindFileDirIdxFromText(pLibIdx, searchText, 0, level, pDirIdx);
 							break;
 					}
 					lastSearchFoundIdx = idx;
@@ -1255,7 +1258,7 @@ function DDFileAreaChooser_SelectFileArea_Lightbar(pLevel, pLibIdx, pDirIdx, pCa
 						idx = findFileLibIdxFromText(searchText, lastSearchFoundIdx+1);
 						break;
 					case 2:
-						idx = findFileDirIdxFromText(pLibIdx, searchText, lastSearchFoundIdx+1);
+						idx = this.FindFileDirIdxFromText(pLibIdx, searchText, lastSearchFoundIdx+1, level, pDirIdx);
 						break;
 					case 3:
 						// TODO
@@ -1290,7 +1293,7 @@ function DDFileAreaChooser_SelectFileArea_Lightbar(pLevel, pLibIdx, pDirIdx, pCa
 							idx = findFileLibIdxFromText(searchText, 0);
 							break;
 						case 2:
-							idx = findFileDirIdxFromText(pLibIdx, searchText, 0);
+							idx = this.FindFileDirIdxFromText(pLibIdx, searchText, 0, level, pDirIdx);
 							break;
 						case 3:
 							// TODO
@@ -2239,6 +2242,122 @@ function DDFileAreaChooser_SetUpLibListWithCollapsedDirs()
 	}
 }
 
+// For the DDFileAreaChooser class: Finds a file directory index with search text, matching either the name or
+// description, case-insensitive.
+//
+// Parameters:
+//  pGrpIdx: The index of the file library
+//  pSearchText: The name/description text to look for
+//  pStartItemIdx: The item index to start at.  Defaults to 0
+//  pLevel: Level (only if using directory collapsing): 2 = directories, and 3 = subdirectories
+//  pDirIdx: If level 3 (subdirs), this specifies the directory index
+//
+// Return value: The index of the file directory, or -1 if not found
+function DDFileAreaChooser_FindFileDirIdxFromText(pLibIdx, pSearchText, pStartItemIdx, pLevel, pDirIdx)
+{
+	if (typeof(pLibIdx) != "number")
+		return -1;
+	if (typeof(pSearchText) != "string")
+		return -1;
+
+	var fileDirIdx = -1;
+
+	var startIdx = (typeof(pStartItemIdx) == "number" ? pStartItemIdx : 0);
+
+	// Temporary
+	//if (user.is_sysop) console.print("\x01n\r\npDir collapsing: " + this.useDirCollapsing + "; Level, pDirIdx: " + pLevel + ", " + pDirIdx + "\r\n\x01p");
+	// End Temporary
+
+	// Go through the message group list and look for a match
+	var searchTextUpper = pSearchText.toUpperCase();
+	var continueOn = true;
+	if (this.useDirCollapsing)
+	{
+		if (typeof(pDirIdx) !== "number")
+			return -1;
+		if (pDirIdx < 0 || pDirIdx >= this.lib_list[pLibIdx].dir_list.length)
+			return -1;
+		if (typeof(pLevel) === "number")
+		{
+			if (pLevel == 2)
+			{
+				if ((startIdx < 0) || (startIdx >= this.lib_list[pLibIdx].dir_list.length))
+					startIdx = 0;
+				while (continueOn && fileDirIdx == -1)
+				{
+					for (var i = startIdx; i < this.lib_list[pLibIdx].dir_list.length; ++i)
+					{
+						if ((this.lib_list[pLibIdx].dir_list[i].name.toUpperCase().indexOf(searchTextUpper) > -1) ||
+							(this.lib_list[pLibIdx].dir_list[i].description.toUpperCase().indexOf(searchTextUpper) > -1))
+						{
+							fileDirIdx = i;
+							continueOn = false;
+							break;
+						}
+					}
+					if (fileDirIdx == -1)
+					{
+						if (startIdx > 0)
+							startIdx = 0;
+						else
+							continueOn = false;
+					}
+				}
+			}
+			else if (pLevel == 3)
+			{
+				if ((startIdx < 0) || (startIdx >= this.lib_list[pLibIdx].dir_list[pDirIdx].subdir_list.length))
+					startIdx = 0;
+				while (continueOn && fileDirIdx == -1)
+				{
+					for (var i = startIdx; i < this.lib_list[pLibIdx].dir_list[pDirIdx].subdir_list.length; ++i)
+					{
+						if ((this.lib_list[pLibIdx].dir_list[pDirIdx].subdir_list[i].description.toUpperCase().indexOf(searchTextUpper) > -1))
+						{
+							fileDirIdx = i;
+							continueOn = false;
+							break;
+						}
+					}
+					if (fileDirIdx == -1)
+					{
+						if (startIdx > 0)
+							startIdx = 0;
+						else
+							continueOn = false;
+					}
+				}
+			}
+		}
+	}
+	else
+	{
+		if ((startIdx < 0) || (startIdx >= file_area.lib_list[pLibIdx].dir_list.length))
+			startIdx = 0;
+		while (continueOn && fileDirIdx == -1)
+		{
+			for (var i = startIdx; i < file_area.lib_list[pLibIdx].dir_list.length; ++i)
+			{
+				if ((file_area.lib_list[pLibIdx].dir_list[i].name.toUpperCase().indexOf(searchTextUpper) > -1) ||
+					(file_area.lib_list[pLibIdx].dir_list[i].description.toUpperCase().indexOf(searchTextUpper) > -1))
+				{
+					fileDirIdx = i;
+					break;
+				}
+			}
+			if (fileDirIdx == -1)
+			{
+				if (startIdx > 0)
+					startIdx = 0;
+				else
+					continueOn = false;
+			}
+		}
+	}
+
+	return fileDirIdx;
+}
+
 // Removes multiple, leading, and/or trailing spaces
 // The search & replace regular expressions used in this
 // function came from the following URL:
@@ -2787,43 +2906,6 @@ function findFileLibIdxFromText(pSearchText, pStartItemIdx)
 	return libIdx;
 }
 
-// Finds a file directory index with search text, matching either the name or
-// description, case-insensitive.
-//
-// Parameters:
-//  pGrpIdx: The index of the file library
-//  pSearchText: The name/description text to look for
-//  pStartItemIdx: The item index to start at.  Defaults to 0
-//
-// Return value: The index of the file directory, or -1 if not found
-function findFileDirIdxFromText(pLibIdx, pSearchText, pStartItemIdx)
-{
-	if (typeof(pLibIdx) != "number")
-		return -1;
-	if (typeof(pSearchText) != "string")
-		return -1;
-
-	var fileDirIdx = -1;
-
-	var startIdx = (typeof(pStartItemIdx) == "number" ? pStartItemIdx : 0);
-	if ((startIdx < 0) || (startIdx > file_area.lib_list[pLibIdx].dir_list.length))
-		startIdx = 0;
-
-	// Go through the message group list and look for a match
-	var searchTextUpper = pSearchText.toUpperCase();
-	for (var i = startIdx; i < file_area.lib_list[pLibIdx].dir_list.length; ++i)
-	{
-		if ((file_area.lib_list[pLibIdx].dir_list[i].name.toUpperCase().indexOf(searchTextUpper) > -1) ||
-		    (file_area.lib_list[pLibIdx].dir_list[i].description.toUpperCase().indexOf(searchTextUpper) > -1))
-		{
-			fileDirIdx = i;
-			break;
-		}
-	}
-
-	return fileDirIdx;
-}
-
 // Given a string of attribute characters, this function inserts the control code
 // in front of each attribute character and returns the new string.
 //
diff --git a/xtrn/DDAreaChoosers/readme.txt b/xtrn/DDAreaChoosers/readme.txt
index 311edc677a8e0ee3ab146fd677d2e4455718c78e..ddba43a44e9d2e81b41a6f506e9b9f5f27d10a43 100644
--- a/xtrn/DDAreaChoosers/readme.txt
+++ b/xtrn/DDAreaChoosers/readme.txt
@@ -1,6 +1,6 @@
                      Digital Distortion Area Choosers
-                              Version 1.37
-                        Release date: 2023-09-16
+                              Version 1.38/1.37
+                        Release date: 2023-09-17
 
                                   by
 
diff --git a/xtrn/DDAreaChoosers/version_history.txt b/xtrn/DDAreaChoosers/version_history.txt
index ebc9178890c579394b8eacab3358febc8869d053..23a3ca83fd31470082b4b9be14a3abcf88f7de67 100644
--- a/xtrn/DDAreaChoosers/version_history.txt
+++ b/xtrn/DDAreaChoosers/version_history.txt
@@ -5,6 +5,8 @@ Revision History (change log)
 =============================
 Version  Date         Description
 -------  ----         -----------
+1.38     2023-09-17   File area chooser: Bug fix for searching with name
+                      collapsing
 1.37     2023-09-16   Header line bug fix
 1.36     2023-07-21   Message area chooser fix for not allowing to change sub-
                       board if the first group is empty. File area chooser fix: