diff --git a/source/common/filesystem/file_directory.cpp b/source/common/filesystem/file_directory.cpp
index 167658a09..bbc6d23f5 100644
--- a/source/common/filesystem/file_directory.cpp
+++ b/source/common/filesystem/file_directory.cpp
@@ -72,12 +72,13 @@ struct FDirectoryLump : public FResourceLump
 class FDirectory : public FResourceFile
 {
 	TArray<FDirectoryLump> Lumps;
+	const bool nosubdir;
 
 	int AddDirectory(const char *dirpath);
 	void AddEntry(const char *fullpath, int size);
 
 public:
-	FDirectory(const char * dirname);
+	FDirectory(const char * dirname, bool nosubdirflag);
 	bool Open(bool quiet);
 	virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
 };
@@ -90,8 +91,8 @@ public:
 //
 //==========================================================================
 
-FDirectory::FDirectory(const char * directory)
-: FResourceFile(NULL)
+FDirectory::FDirectory(const char * directory, bool nosubdirflag)
+: FResourceFile(NULL), nosubdir(nosubdirflag)
 {
 	FString dirname;
 
@@ -144,11 +145,11 @@ int FDirectory::AddDirectory(const char *dirpath)
 			if (fileinfo.attrib & _A_SUBDIR)
 			{
 
-				if (fi[0] == '.' &&
+				if (nosubdir || (fi[0] == '.' &&
 					(fi[1] == '\0' ||
-					 (fi[1] == '.' && fi[2] == '\0')))
+					 (fi[1] == '.' && fi[2] == '\0'))))
 				{
-					// Do not record . and .. directories.
+					// Skip if requested and do not record . and .. directories.
 					continue;
 				}
 				FString newdir = dirpath;
@@ -320,9 +321,9 @@ int FDirectoryLump::ValidateCache()
 //
 //==========================================================================
 
-FResourceFile *CheckDir(const char *filename, bool quiet)
+FResourceFile *CheckDir(const char *filename, bool quiet, bool nosubdirflag)
 {
-	FResourceFile *rf = new FDirectory(filename);
+	FResourceFile *rf = new FDirectory(filename, nosubdirflag);
 	if (rf->Open(quiet)) return rf;
 	delete rf;
 	return NULL;
diff --git a/source/common/filesystem/filesystem.cpp b/source/common/filesystem/filesystem.cpp
index d98badba1..68b27b65e 100644
--- a/source/common/filesystem/filesystem.cpp
+++ b/source/common/filesystem/filesystem.cpp
@@ -111,7 +111,14 @@ int FileSystem::InitMultipleFiles (TArray<FString> &filenames, const TArray<FStr
 	for(unsigned i=0;i<filenames.Size(); i++)
 	{
 		int baselump = NumEntries;
-		AddFile (filenames[i]);
+		bool nosubdirflag = false;
+		const char* fn = filenames[i];
+		if (*fn == '*')
+		{
+			fn++;
+			nosubdirflag = true;
+		}
+		AddFile (filenames[i], nullptr, nosubdirflag);
 	}
 	
 	NumEntries = FileInfo.Size();
@@ -139,7 +146,7 @@ int FileSystem::InitMultipleFiles (TArray<FString> &filenames, const TArray<FStr
 //
 //==========================================================================
 
-void FileSystem::AddFile (const char *filename, FileReader *filer)
+void FileSystem::AddFile (const char *filename, FileReader *filer, bool nosubdirflag)
 {
 	int startlump;
 	bool isdir = false;
@@ -175,7 +182,7 @@ void FileSystem::AddFile (const char *filename, FileReader *filer)
 	if (!isdir)
 		resfile = FResourceFile::OpenResourceFile(filename, fr);
 	else
-		resfile = FResourceFile::OpenDirectory(filename);
+		resfile = FResourceFile::OpenDirectory(filename, false, nosubdirflag);
 
 	if (resfile != NULL)
 	{
diff --git a/source/common/filesystem/filesystem.h b/source/common/filesystem/filesystem.h
index a3cea6c5e..cf3b6b307 100644
--- a/source/common/filesystem/filesystem.h
+++ b/source/common/filesystem/filesystem.h
@@ -82,7 +82,7 @@ public:
 	~FileSystem ();
 
 	int InitMultipleFiles (TArray<FString> &filenames, const TArray<FString> &todelete);
-	void AddFile (const char *filename, FileReader *wadinfo = NULL);
+	void AddFile (const char *filename, FileReader *wadinfo = NULL, bool nosubdirflag = false);
 	void AddAdditionalFile(const char* filename, FileReader* wadinfo = NULL) {}
 	int CheckIfResourceFileLoaded (const char *name) noexcept;
 
diff --git a/source/common/filesystem/resourcefile.cpp b/source/common/filesystem/resourcefile.cpp
index 36857ee67..1a99afb62 100644
--- a/source/common/filesystem/resourcefile.cpp
+++ b/source/common/filesystem/resourcefile.cpp
@@ -209,7 +209,7 @@ FResourceFile *CheckPak(const char *filename, FileReader &file, bool quiet);
 FResourceFile *CheckZip(const char *filename, FileReader &file, bool quiet);
 FResourceFile *Check7Z(const char *filename,  FileReader &file, bool quiet);
 FResourceFile *CheckLump(const char *filename,FileReader &file, bool quiet);
-FResourceFile *CheckDir(const char *filename, bool quiet);
+FResourceFile *CheckDir(const char *filename, bool quiet, bool nosubdirflag);
 
 static CheckFunc funcs[] = { CheckGRP, CheckRFF, CheckZip, Check7Z, CheckPak, CheckLump };
 
@@ -244,9 +244,9 @@ FResourceFile *FResourceFile::OpenResourceFileFromLump(int lumpnum, bool quiet,
 }
 */
 
-FResourceFile *FResourceFile::OpenDirectory(const char *filename, bool quiet)
+FResourceFile *FResourceFile::OpenDirectory(const char *filename, bool quiet, bool nosubdirflag)
 {
-	return CheckDir(filename, quiet);
+	return CheckDir(filename, quiet, nosubdirflag);
 }
 
 //==========================================================================
diff --git a/source/common/filesystem/resourcefile.h b/source/common/filesystem/resourcefile.h
index 8dd3666bb..5a83f6d9f 100644
--- a/source/common/filesystem/resourcefile.h
+++ b/source/common/filesystem/resourcefile.h
@@ -120,7 +120,7 @@ private:
 public:
 	static FResourceFile *OpenResourceFile(const char *filename, FileReader &file, bool quiet = false, bool containeronly = false);
 	static FResourceFile *OpenResourceFile(const char *filename, bool quiet = false, bool containeronly = false);
-	static FResourceFile *OpenDirectory(const char *filename, bool quiet = false);
+	static FResourceFile* OpenDirectory(const char* filename, bool quiet = false, bool nosubdirs = false);
 	virtual ~FResourceFile();
     // If this FResourceFile represents a directory, the Reader object is not usable so don't return it.
     FileReader *GetReader() { return Reader.isOpen()? &Reader : nullptr; }
diff --git a/source/common/initfs.cpp b/source/common/initfs.cpp
index 3c566d97c..d4dfecd96 100644
--- a/source/common/initfs.cpp
+++ b/source/common/initfs.cpp
@@ -329,7 +329,7 @@ void InitFileSystem(TArray<GrpEntry>& groups)
 			// Do this only if explicitly requested because this severely limits the usability of GRP files.
 			if (insertdirectoriesafter) for (auto& file : *userConfig.AddFilesPre)
 			{
-				D_AddFile(Files, file);
+				D_AddFile(Files, '*' + file);	// The * tells the file system not to pull in all subdirectories.
 			}
 
 			D_AddFile(Files, fn);
diff --git a/wadsrc/static/demolition/demolition.grpinfo b/wadsrc/static/demolition/demolition.grpinfo
index 14ee916b7..0595433d9 100644
--- a/wadsrc/static/demolition/demolition.grpinfo
+++ b/wadsrc/static/demolition/demolition.grpinfo
@@ -321,7 +321,7 @@ grpinfo
 	size 191798609
 	crc RRRA_CRC
 	defname "rrra.def"
-	flags GAMEFLAG_RRRA
+	flags GAMEFLAG_RRRA|GAMEFLAG_RR
 	dependency 0
 	gamefilter "Redneck.RidesAgain"
 }