diff --git a/src/filesrch.c b/src/filesrch.c
index 3e1e5891ac21ee9b7760f14ee44b8a7d825ff403..b80681306c3acb2f13758d91464f04e46422e796 100644
--- a/src/filesrch.c
+++ b/src/filesrch.c
@@ -514,14 +514,32 @@ void searchfilemenu(char *tempname)
 			dirmenu = NULL;
 	}
 
+	first = (((UINT8)(coredirmenu[0][DIR_TYPE]) == EXT_UP) ? 1 : 0); // skip UP...
+
 	if (!menusearch[0])
 	{
 		if (dirmenu)
 			Z_Free(dirmenu);
 		dirmenu = coredirmenu;
 		sizedirmenu = sizecoredirmenu;
+
 		if (tempname)
+		{
+			for (i = first; i < sizedirmenu; i++)
+			{
+				if (!strcmp(dirmenu[i]+DIR_STRING, tempname))
+				{
+					dir_on[menudepthleft] = i;
+					break;
+				}
+			}
+
+			if (i == sizedirmenu)
+				dir_on[menudepthleft] = first;
+
 			Z_Free(tempname);
+		}
+
 		return;
 	}
 
@@ -529,8 +547,6 @@ void searchfilemenu(char *tempname)
 	if (!cv_addons_search_case.value)
 		strupr(localmenusearch);
 
-	first = (((UINT8)(coredirmenu[0][DIR_TYPE]) == EXT_UP) ? 1 : 0); // skip UP...
-
 	sizedirmenu = 0;
 	for (i = first; i < sizecoredirmenu; i++)
 	{
@@ -544,6 +560,7 @@ void searchfilemenu(char *tempname)
 			|| !(dirmenu[0] = Z_StrDup(va("%c\13No results...", EXT_NORESULTS))))
 				I_Error("Ran out of memory whilst preparing add-ons menu");
 		sizedirmenu = 1;
+		dir_on[menudepthleft] = 0;
 		if (tempname)
 			Z_Free(tempname);
 		return;
@@ -557,17 +574,21 @@ void searchfilemenu(char *tempname)
 	{
 		if (filemenucmp(coredirmenu[i]+DIR_STRING, localmenusearch))
 		{
-			dirmenu[sizedirmenu++] = coredirmenu[i]; // pointer reuse
 			if (tempname && !strcmp(coredirmenu[i]+DIR_STRING, tempname))
-				dir_on[menudepthleft] = i;
+			{
+				dir_on[menudepthleft] = sizedirmenu;
+				Z_Free(tempname);
+				tempname = NULL;
+			}
+			dirmenu[sizedirmenu++] = coredirmenu[i]; // pointer reuse
 		}
 	}
 
-	if (dir_on[menudepthleft] >= sizedirmenu)
-		dir_on[menudepthleft] = sizedirmenu-1;
-
 	if (tempname)
+	{
+		dir_on[menudepthleft] = first;
 		Z_Free(tempname);
+	}
 }
 
 boolean preparefilemenu(boolean samedepth)