diff --git a/source/core/defparser.cpp b/source/core/defparser.cpp
index bdc618d7b..9b9e5bca4 100644
--- a/source/core/defparser.cpp
+++ b/source/core/defparser.cpp
@@ -2229,100 +2229,6 @@ static void parseDefineQAV(FScanner& sc, FScriptPosition& pos)
 	fileSystem.CreatePathlessCopy(fn, res_id, 0);
 }
 
-static void parseSpawnClasses(FScanner& sc, FScriptPosition& pos)
-{
-	FString fn;
-	int res_id = -1;
-	int numframes = -1;
-	bool interpolate = false;
-	int clipdist = -1;
-
-	sc.SetCMode(true);
-	if (!sc.CheckString("{"))
-	{
-		pos.Message(MSG_ERROR, "spawnclasses:'{' expected, unable to continue");
-		sc.SetCMode(false);
-		return;
-	}
-	while (!sc.CheckString("}"))
-	{
-		// This will need some reworking once we can use real textures.
-		int num = -1;
-		int base = -1;
-		int basetex = -1;
-		int brokentex = -1;
-		int fullbright = 0;
-		int flags = 0;
-		FName sound = NAME_None;
-		FName cname;
-		sc.GetNumber(num, true);
-		sc.MustGetStringName("=");
-		sc.MustGetString();
-		cname = sc.String;
-		if (sc.CheckString(","))
-		{
-			if (sc.CheckNumber(true)) base = sc.Number;
-			else
-			{
-				// prefixing the texture names here with a '*' will render them fullbright.
-				sc.MustGetString();
-				const char* p = sc.String;
-				if (*p == '*') { fullbright |= 1; p++; }
-				basetex = TileFiles.tileForName(p);
-				if (basetex < 0) Printf(TEXTCOLOR_RED "Unknown texture %s in definition for spawn ID # %d\n", sc.String, num);
-				if (sc.CheckString(","))
-				{
-					sc.MustGetString();
-					const char* p = sc.String;
-					if (*p)
-					{
-						if (*p == '*') { fullbright |= 2; p++; }
-						brokentex = TileFiles.tileForName(p);
-						if (brokentex < 0) Printf(TEXTCOLOR_RED "Unknown texture %s in definition for spawn ID # %d\n", sc.String, num);
-					}
-					if (sc.CheckString(","))
-					{
-						sc.MustGetString();
-						sound = sc.String;
-#if 0
-						// Sound engine is not initialized here.
-						S_FindSound(sc.String).index();
-						if (sound <= 0) Printf(TEXTCOLOR_RED "Unknown sound %s in definition for spawn ID # %d\n", num);
-#endif
-						if (sc.CheckString(","))
-						{
-							bool cont = true;
-							if (sc.CheckNumber())
-							{
-								clipdist = sc.Number;
-								cont = sc.CheckString(",");
-							}
-							if (cont) do
-							{
-								sc.MustGetString();
-								if (sc.Compare("damaging")) flags |= 1;
-								else if (sc.Compare("solid") || sc.Compare("blocking")) flags |= 2;
-								else if (sc.Compare("unblocking")) flags |= 4;
-								else if (sc.Compare("spawnglass")) flags |= 8;
-								else if (sc.Compare("spawnscrap")) flags |= 16;
-								else if (sc.Compare("spawnsmoke")) flags |= 32;
-								else if (sc.Compare("spawnglass2")) flags |= 64; // Duke has 2 ways of spawning glass debris...
-								else sc.ScriptMessage("'%s': Unknown actor class flag", sc.String);
-							} while (sc.CheckString(","));
-						}
-
-					}
-				}
-				
-			}
-		}
-
-		// todo: check for proper base class
-		spawnMap.Insert(num, { cname, nullptr, base, basetex, brokentex, sound, int8_t(fullbright), int8_t(clipdist), int16_t(flags) });
-	}
-	sc.SetCMode(false);
-}
-
 static void parseTileFlags(FScanner& sc, FScriptPosition& pos)
 {
 	int num = -1;
@@ -2351,47 +2257,6 @@ static void parseTileFlags(FScanner& sc, FScriptPosition& pos)
 	sc.SetCMode(false);
 }
 
-static void parseBreakWall(FScanner& sc, FScriptPosition& pos)
-{
-	int basetile;
-	int breaktile;
-	FName sound;
-	VMFunction* handler = nullptr;
-
-	sc.SetCMode(true);
-	sc.MustGetString();
-	basetile = TileFiles.tileForName(sc.String);
-	sc.MustGetStringName(",");
-	sc.MustGetString();
-	breaktile = TileFiles.tileForName(sc.String);
-	sc.MustGetStringName(",");
-	sc.MustGetString();
-	sound = sc.String;
-	if (sc.CheckString(","))
-	{
-		sc.MustGetString();
-
-		size_t p = strcspn(sc.String, ".");
-		if (p == 0)
-		{
-			sc.ScriptMessage("Call to undefined function %s", sc.String);
-			return;
-		}
-
-		FString clsname(sc.String, p);
-		FString funcname = sc.String + p + 1;
-		handler = PClass::FindFunction(clsname, funcname);
-		if (handler == nullptr)
-			sc.ScriptMessage("Call to undefined function %s", sc.String);
-
-		// todo: validate the function's signature. Must be (walltype, TextureID, Sound, DukeActor)
-
-	}
-	breakWallMap.Insert(basetile, { breaktile, sound, handler });
-	sc.SetCMode(false);
-}
-
-
 //===========================================================================
 //
 // 
@@ -2484,9 +2349,7 @@ static const dispatch basetokens[] =
 	{ "rffdefineid",     parseRffDefineId      },
 	{ "defineqav",       parseDefineQAV        },
 
-	{ "spawnclasses",		parseSpawnClasses },
 	{ "tileflag",			parseTileFlags },
-	{ "breakwall",			parseBreakWall },
 	{ nullptr,           nullptr               },
 };
 
diff --git a/source/core/g_mapinfo.cpp b/source/core/g_mapinfo.cpp
index ee2dfa230..f785485a4 100644
--- a/source/core/g_mapinfo.cpp
+++ b/source/core/g_mapinfo.cpp
@@ -45,7 +45,7 @@
 #include "autosegs.h"
 #include "i_system.h"
 #include "gamecontrol.h"
-#include "autosegs.h"
+#include "coreactor.h"
 
 extern TArray<ClusterDef> clusters;
 extern TArray<VolumeRecord> volumes;
@@ -220,6 +220,173 @@ void FMapInfoParser::ParseMusic(FString &name, int &order)
 	}
 }
 
+//==========================================================================
+//
+//
+//
+//==========================================================================
+
+void FMapInfoParser::ParseSpawnClasses()
+{
+	FString fn;
+	int res_id = -1;
+	int numframes = -1;
+	bool interpolate = false;
+	int clipdist = -1;
+
+	sc.MustGetStringName("{");
+	while (!sc.CheckString("}"))
+	{
+		// This will need some reworking once we can use real textures.
+		int num = -1;
+		int base = -1;
+		int basetex = -1;
+		int brokentex = -1;
+		int fullbright = 0;
+		int flags = 0;
+		FSoundID sound = NO_SOUND;
+		PClassActor* actor = nullptr;
+
+		sc.MustGetString();
+		char* p;
+		num = (int)strtol(sc.String, &p, 10);
+		if (num < 0 || *p)
+		{
+			sc.ScriptMessage("Invalid spawn number. Must be positive integer, but got '%s'", sc.String);
+			SkipToNext();
+			continue;
+		}
+		ParseAssign();
+		sc.MustGetString();
+		actor = PClass::FindActor(sc.String);
+		if (actor == nullptr)
+		{
+			sc.ScriptMessage("Unknown actor class '%s' for spawn ID # %d", sc.String, num);
+
+		}
+
+		if (sc.CheckString(","))
+		{
+			// prefixing the texture names here with a '*' will render them fullbright.
+			sc.MustGetString();
+			const char* p = sc.String;
+			if (*p == '*') { fullbright |= 1; p++; }
+			basetex = TileFiles.tileForName(p);
+			if (basetex < 0) sc.ScriptMessage("Unknown texture '%s' in definition for spawn ID # %d", sc.String, num);
+			if (sc.CheckString(","))
+			{
+				sc.MustGetString();
+				const char* p = sc.String;
+				if (*p)
+				{
+					if (*p == '*') { fullbright |= 2; p++; }
+					brokentex = TileFiles.tileForName(p);
+					if (brokentex < 0) sc.ScriptMessage("Unknown texture '%s' in definition for spawn ID # %d", sc.String, num);
+				}
+				if (sc.CheckString(","))
+				{
+					sc.MustGetString();
+
+					sound = S_FindSound(sc.String);
+					if (*sc.String && !sound.isvalid()) Printf(TEXTCOLOR_RED "Unknown sound '%s' in definition for spawn ID # %d\n", sc.String, num);
+					if (sc.CheckString(","))
+					{
+						bool cont = true;
+						if (sc.CheckNumber())
+						{
+							clipdist = sc.Number;
+							cont = sc.CheckString(",");
+						}
+						if (cont) do
+						{
+							sc.MustGetString();
+							if (sc.Compare("damaging")) flags |= 1;
+							else if (sc.Compare("solid") || sc.Compare("blocking")) flags |= 2;
+							else if (sc.Compare("unblocking")) flags |= 4;
+							else if (sc.Compare("spawnglass")) flags |= 8;
+							else if (sc.Compare("spawnscrap")) flags |= 16;
+							else if (sc.Compare("spawnsmoke")) flags |= 32;
+							else if (sc.Compare("spawnglass2")) flags |= 64; // Duke has 2 ways of spawning glass debris...
+							else sc.ScriptMessage("'%s': Unknown actor class flag", sc.String);
+						} while (sc.CheckString(","));
+					}
+				}
+			}
+		}
+		if (actor != 0 && num >= 0)
+		{
+			// todo: check for proper base class
+			spawnMap.Insert(num, { actor, basetex, brokentex, sound, int8_t(fullbright), int8_t(clipdist), int16_t(flags) });
+		}
+	}
+}
+
+//==========================================================================
+//
+//
+//
+//==========================================================================
+
+void FMapInfoParser::ParseBreakWall()
+{
+	int basetile = -1;
+	int breaktile = -1;
+	int flags = 0;
+	FSoundID sound = NO_SOUND;
+	VMFunction* handler = nullptr;
+	FString basename;
+
+	sc.MustGetStringName("{");
+	while (!sc.CheckString("}"))
+	{
+		sc.MustGetString();
+		basename = sc.String; // save for printing error messages.
+		basetile = TileFiles.tileForName(sc.String);
+		if (basetile < 0)
+		{
+			sc.ScriptMessage("Unknown texture '%s' in breakwall definition", sc.String, basetile);
+			SkipToNext();
+		}
+		ParseAssign();
+		sc.MustGetString();
+		breaktile = TileFiles.tileForName(sc.String);
+		if (breaktile < 0) sc.ScriptMessage("Unknown texture '%s' in breakwall definition", sc.String, breaktile);
+		if (sc.CheckString(","))
+		{
+			sc.MustGetString();
+			sound = S_FindSound(sc.String);
+			if (*sc.String && !sound.isvalid()) Printf(TEXTCOLOR_RED "Unknown sound '%s' in definition for breakable wall '5s'\n", basename.GetChars());
+
+			auto saved = sc.SavePos();
+			if (sc.CheckString(","))
+			{
+				sc.MustGetString();
+
+				size_t p = strcspn(sc.String, ".");
+				if (p != 0)
+				{
+					FName clsname(sc.String, p, false);
+					FName funcname = sc.String + p + 1;
+					handler = PClass::FindFunction(clsname, funcname);
+					if (handler == nullptr)
+						sc.ScriptMessage("Call to undefined function %s", sc.String);
+					// todo: validate the function's signature. Must be (walltype, TextureID, Sound, DukeActor)
+				}
+				else sc.RestorePos(saved);
+				while (sc.CheckString(","))
+				{
+					sc.MustGetString();
+					if (sc.Compare("twosided")) flags |= 1;
+					else sc.ScriptMessage("'%s': Unknown breakable flag", sc.String);
+				}
+			}
+		}
+		breakWallMap.Insert(basetile, { breaktile, sound, handler, flags });
+	}
+}
+
+
+
 //==========================================================================
 //
 //
@@ -1111,7 +1278,7 @@ void FMapInfoParser::ParseGameInfo()
 			ParseAssign();
 			sc.SetCMode(false);
 			sc.MustGetString();
-			sc.SetCMode(false);
+			sc.SetCMode(true);
 			globalCutscenes.SummaryScreen = sc.String;
 		}
 		else if (sc.Compare("mpsummaryscreen"))
@@ -1119,7 +1286,7 @@ void FMapInfoParser::ParseGameInfo()
 			ParseAssign();
 			sc.SetCMode(false);
 			sc.MustGetString();
-			sc.SetCMode(false);
+			sc.SetCMode(true);
 			globalCutscenes.MPSummaryScreen = sc.String;
 		}
 		else if (sc.Compare("statusbarclass"))
@@ -1127,7 +1294,7 @@ void FMapInfoParser::ParseGameInfo()
 			ParseAssign();
 			sc.SetCMode(false);
 			sc.MustGetString();
-			sc.SetCMode(false);
+			sc.SetCMode(true);
 			globalCutscenes.StatusBarClass = sc.String;
 		}
 		else if (!ParseCloseBrace())
@@ -1187,7 +1354,7 @@ void FMapInfoParser::ParseMapInfo (int lump, MapRecord &gamedefaults, MapRecord
 	{
 		ParsedLumps.Push(lump);
 	}
-
+	sc.SetCMode(true);
 	while (sc.GetString ())
 	{
 		if (sc.Compare("include"))
@@ -1263,6 +1430,14 @@ void FMapInfoParser::ParseMapInfo (int lump, MapRecord &gamedefaults, MapRecord
 		{
 			ParseGameInfo();
 		}
+		else if (sc.Compare("spawnclasses"))
+		{
+			ParseSpawnClasses();
+		}
+		else if (sc.Compare("breakwalls"))
+		{
+			ParseBreakWall();
+		}
 		else if (sc.Compare("clearall"))
 		{
 			// clears all map and progression related data, so that a mod can start with a clean slate.
diff --git a/source/core/g_mapinfo.h b/source/core/g_mapinfo.h
index 6131b1e97..3a950fd4e 100644
--- a/source/core/g_mapinfo.h
+++ b/source/core/g_mapinfo.h
@@ -39,6 +39,32 @@
 #include "sc_man.h"
 #include "file_zip.h"
 
+struct SpawnRec
+{
+	PClassActor* cls;
+	int basetex, brokentex;
+	FSoundID breaksound;
+	int8_t fullbright, clipdist;
+	int16_t flags;
+
+	PClassActor* Class(int pn)
+	{
+		return cls;
+	}
+};
+using SpawnMap = TMap<int, SpawnRec>;
+inline SpawnMap spawnMap;
+
+struct BreakWallRec
+{
+	int brokentex;
+	FSoundID breaksound;
+	VMFunction* handler;
+	int flags;
+};
+using BreakWallMap = TMap<int, BreakWallRec>;
+inline BreakWallMap breakWallMap;
+
 struct FMapInfoParser
 {
 	FScanner sc;
@@ -63,6 +89,8 @@ struct FMapInfoParser
 	void ParseEpisodeInfo ();
 	void ParseCutsceneInfo();
 	void ParseGameInfo();
+	void ParseSpawnClasses();
+	void ParseBreakWall();
 	void ParseMapInfo (int lump, MapRecord &gamedefaults, MapRecord &defaultinfo);
 
 	void ParseOpenBrace();
diff --git a/source/core/gamecontrol.h b/source/core/gamecontrol.h
index ffdbcf88a..e8670206f 100644
--- a/source/core/gamecontrol.h
+++ b/source/core/gamecontrol.h
@@ -271,35 +271,3 @@ enum gameaction_t : int
 };
 extern gameaction_t		gameaction;
 
-struct SpawnRec
-{
-	FName clsname;
-	PClass* cls;
-	int param;
-	int basetex, brokentex;
-	FName breaksound;
-	int8_t fullbright, clipdist;
-	int16_t flags;
-
-	PClass* Class(int pn)
-	{
-		if (!cls && clsname != NAME_None) cls = PClass::FindClass(clsname);
-		if (cls == nullptr)
-		{
-			Printf(TEXTCOLOR_RED "Bad class name %s for ID# %d\n", clsname.GetChars(), pn);
-		}
-		clsname = NAME_None;
-		return cls;
-	}
-};
-using SpawnMap = TMap<int, SpawnRec>;
-inline SpawnMap spawnMap;
-
-struct BreakWallRec
-{
-	int brokentex;
-	FName breaksound;
-	VMFunction* handler;
-};
-using BreakWallMap = TMap<int, BreakWallRec>;
-inline BreakWallMap breakWallMap;
diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h
index b1a308848..00aab3c1f 100644
--- a/source/games/duke/src/funct.h
+++ b/source/games/duke/src/funct.h
@@ -4,6 +4,7 @@
 #include "constants.h"
 #include "packet.h"
 #include "types.h"
+#include "g_mapinfo.h"
 
 struct MapRecord;
 
diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp
index 50fa8e186..62f7592a5 100644
--- a/source/games/duke/src/sectors_r.cpp
+++ b/source/games/duke/src/sectors_r.cpp
@@ -876,11 +876,11 @@ void checkhitwall_r(DDukeActor* spr, walltype* wal, const DVector3& pos, int atw
 		if (!data->handler)
 		{
 			wal->picnum = data->brokentex;
-			S_PlayActorSound(S_FindSound(data->breaksound.GetChars()), spr);
+			S_PlayActorSound(data->breaksound, spr);
 		}
 		else
 		{
-			VMValue args[4] = { wal, data->brokentex, S_FindSound(data->breaksound.GetChars()).index(), spr };
+			VMValue args[4] = { wal, data->brokentex, data->breaksound.index(), spr};
 			VMCall(data->handler, args, 4, nullptr, 0);
 		}
 	}
diff --git a/source/games/duke/src/spawn.cpp b/source/games/duke/src/spawn.cpp
index 90b7c8c71..21177117d 100644
--- a/source/games/duke/src/spawn.cpp
+++ b/source/games/duke/src/spawn.cpp
@@ -47,14 +47,12 @@ void setFromSpawnRec(DDukeActor* act, SpawnRec* info)
 {
 	if (info)
 	{
-		//int basepicnum = info->param;
-		//act->basepicnum = basepicnum;
 		if (info->basetex > 0 && act->IsKindOf(NAME_DukeGenericDestructible))
 		{
 			// allow defining simple destructibles without actual actor definitions.
 			act->IntVar(NAME_spawnstate) = info->basetex;
 			act->IntVar(NAME_brokenstate) = info->brokentex;
-			act->IntVar(NAME_breaksound) = S_FindSound(info->breaksound.GetChars()).index();
+			act->IntVar(NAME_breaksound) = info->breaksound.index();
 			act->IntVar(NAME_fullbright) = info->fullbright;
 			act->spr.inittype = info->flags;
 			if (info->clipdist > 0) act->spr.clipdist = info->clipdist;
diff --git a/wadsrc/static/filter/duke.worldtour/engine/engine.def b/wadsrc/static/filter/duke.worldtour/rmapinfo.spawnclasses
similarity index 100%
rename from wadsrc/static/filter/duke.worldtour/engine/engine.def
rename to wadsrc/static/filter/duke.worldtour/rmapinfo.spawnclasses
diff --git a/wadsrc/static/filter/dukelike/engine/engine.def b/wadsrc/static/filter/dukelike/engine/engine.def
index 1bec95fe6..99e4a148a 100644
--- a/wadsrc/static/filter/dukelike/engine/engine.def
+++ b/wadsrc/static/filter/dukelike/engine/engine.def
@@ -1,240 +1,6 @@
 include "engine/defines.def"
 
-spawnclasses
-{
-	2 = DukeActivator
-	3 = DukeTouchplate
-	4 = DukeActivatorLocked
-	5 = DukeSoundController
-	6 = DukeLocator
-	7 = DukeCycler
-	8 = DukeMasterSwitch
-	9 = DukeRespawnController
-	10 = DukeGPSpeed
-	4890 = DukeNaturalLightning
-	
-	1221 = DukeCranePole
-	1222 = DukeCrane
-	563 = DukeWaterFountain
-	564 = DukeWaterFountain
-	565 = DukeWaterFountain
-	566 = DukeWaterFountain
-	567 = DukeWaterFountainBroke
-	951 = DukeBox
-	978 = DukeCone
-	908 = DukeTree1
-	910 = DukeTree2
-	990 = DukeTire
-	911 = DukeCactus
-	939 = DukeCactusBroke
-	2566 = DukeTripbombPlaced
-	2567 = DukeLaserline
-	546 = DukeCrack
-	547 = DukeCrack, "CRACK2"
-	548 = DukeCrack, "CRACK3"
-	549 = DukeCrack, "CRACK4"
-	916 = DukeFireext
-	1079 = DukeOozFilter
-	1247 = DukeSeenine
-	502 = DukeViewscreen
-	499 = DukeViewscreen2
-	621 = DukeCamera // yes, they are all the same!
-	622 = DukeCamera
-	623 = DukeCamera
-	624 = DukeCamera
-	625 = DukeCamera
-	3190 = DukeRespawnmarker
-	1267 = DukeRat
-	902 = DukeQueball
-	901 = DukeStripeBall
-	903 = DukePoolPocket
-	2590 = DukeForceSphere
-	1960 = DukeRecon
-	2300 = DukeOoz
-	2309 = DukeOoz2
-	2296 = DukeBloodSplat1
-	2297 = DukeBloodSplat2
-	2298 = DukeBloodSplat3
-	2299 = DukeBloodSplat4
-	1625 = DukeFireLaser
-	1646 = DukeShrinkSpark
-	2605 = DukeRPG
-	1641 = DukeFreezeBlast
-	1636 = DukeSpit
-	1360 = DukeCoolExplosion1
-	578 = DukeReactor2
-	580 = DukeReactor2Spark
-	1088 = DukeReactor
-	1092 = DukeReactorSpark
-	4465 = DukeGenericPole2
-	979 = DukeHangLight
-	869 = DukeStatueFlash
-	753 = DukeStatue
-	1157 = DukeBottle10
-	765 = DukeVase
-	4502 = DukeLetter
-	4361 = DukeDuck
-	4359 = DukeTarget
-	1346 = DukeHelicopter
-	2491 = DukeCar
-	26 = DukePipeBomb
-	940 = DukeBounceMine
-	1650 = DukeMortar
-	2999 = DukeFrameEffect
-	925 = DukeNeon
-	926 = DukeNeon, "NEON2"
-	1007 = DukeNeon, "NEON3"
-	1008 = DukeNeon, "NEON4"
-	1009 = DukeNeon, "NEON5"
-	1046 = DukeNeon, "NEON6"
-	142 = DukeNukeButton
-	1233 = DukeMoney
-	4460 = DukePaper
-	4410 = DukeMail
-	1380 = DukeWaterSplash
-	1031 = DukeGlassPieces1
-	1032 = DukeGlassPieces2
-	1033 = DukeGlassPieces3
-	2533 = DukeShell
-	2535 = DukeShotgunShell
-	1226 = DukeBloodPool
-	407 = DukeFanSprite
-	516 = DukeSatellite
-	517 = DukeFuelPod
-	602 = DukeSolarPanel
-	607 = DukeAntenna
-	1358 = DukeFetus
-	1359 = DukeFetusBroke
-	969 = DukeHydroplant
-	1003 = DukeHydroplantBroke
-	981 = DukeHydrant
-	619 = DukePipe1
-	616 = DukePipe2
-	618 = DukePipe3
-	996 = DukePipe4
-	994 = DukePipe5
-	995 = DukePipe6
-	4943 = DukeJuryGuy
-	1353 = DukeSpaceMarine
-	1355 = DukeIndy
-	1352 = DukeMonk
-	1354 = DukeLuke
-	680 = DukeChair3
-	569 = DukeToilet
-	571 = DukeStall
-	1069 = DukePlug
-	568 = DukeFemMag
-	577 = DukeFemMag, "FEMMAG2"
-	4900 = DukeTag
-	4909 = DukeTag, "SIGN1"
-	4912 = DukeTag, "SIGN2"
-	285	= DukeMaskWall
-	913	= DukeMaskWall, "MASKWALL2"
-	914	= DukeMaskWall, "MASKWALL3"
-	915	= DukeMaskWall, "MASKWALL4"
-	514	= DukeMaskWall, "MASKWALL5"
-	1059 = DukeMaskWall, "MASKWALL6"
-	1174 = DukeMaskWall, "MASKWALL7"
-	1124 = DukeMaskWall, "MASKWALL8"
-	255	= DukeMaskWall, "MASKWALL9"
-	387	= DukeMaskWall, "MASKWALL10"
-	391	= DukeMaskWall, "MASKWALL11"
-	609	= DukeMaskWall, "MASKWALL12"
-	830	= DukeMaskWall, "MASKWALL13"
-	988	= DukeMaskWall, "MASKWALL14"
-	1024 = DukeMaskWall, "MASKWALL15"
-	550 = DukeFootprints
-	672 = DukeFootprints
-	673 = DukeFootprints
-	674 = DukeFootprints
-	952 = DukeBulletHole
-	554 = DukeCameraPole
-	977 = DukeGenericPole
-
-	1272 = DukeTrash
-	634 = DukeBolt1
-	635 = DukeBolt2
-	636 = DukeBolt3
-	637 = DukeBolt4
-	4525 = DukeSideBolt1
-	4526 = DukeSideBolt2
-	4527 = DukeSideBolt3
-	4528 = DukeSideBolt4
-	660 = DukeWaterdrip
-	160 = DukeDoorshock
-	1232 = DukeCanWithSomething
-	2807 = DukeCanWithSomething, "CANWITHSOMETHING2"
-	2808 = DukeCanWithSomething, "CANWITHSOMETHING3"
-	2809 = DukeCanWithSomething, "CANWITHSOMETHING4"
-	1647 = DukeTongue
-	1860 = DukeInnerJaw
-	1861 = DukeInnerJaw1
-	2245 = DukeJibs1
-	2250 = DukeJibs2
-	2255 = DukeJibs3
-	2260 = DukeJibs4
-	2265 = DukeJibs5
-	2286 = DukeJibs6
-	1768 = DukeHeadJib1
-	1772 = DukeArmJib1
-	1776 = DukeLegJib1
-	2201 = DukeLizmanHead
-	2205 = DukeLizmanArm
-	2209 = DukeLizmanLeg
-	1520 = DukePlayerTorso
-	1528 = DukePlayerGun
-	1536 = DukePlayerLeg
-	
-	2370 = DukeGreenSlime
-
-	595 = DukeGenericDestructible, "GRATE1", "BGRATE1", "VENT_BUST", solid, unblocking
-	1113 = DukeGenericDestructible, "CIRCLEPANNEL", "CIRCLEPANNELBROKE", "VENT_BUST", unblocking
-	342 = DukeGenericDestructible, "PANNEL1", "BPANNEL1", "VENT_BUST", solid, unblocking
-	343 = DukeGenericDestructible, "PANNEL2", "BPANNEL3", "VENT_BUST", solid, unblocking
-	4099 = DukeGenericDestructible, "PANNEL3", "BPANNEL3", "VENT_BUST", unblocking
-	556 = DukeGenericDestructible, "CHAIR1", "BROKENCHAIR", solid, unblocking
-	557 = DukeGenericDestructible, "CHAIR2", "BROKENCHAIR", solid, unblocking
-
-	686 = DukeGenericDestructible, "MOVIECAMERA", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	678 = DukeGenericDestructible, "SCALE", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	685 = DukeGenericDestructible, "CAMERALIGHT", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	689 = DukeGenericDestructible, "IVUNIT", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	694 = DukeGenericDestructible, "POT1", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	695 = DukeGenericDestructible, "POT2", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	697 = DukeGenericDestructible, "POT3", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	4444 = DukeGenericDestructible, "TRIPODCAMERA", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	669 = DukeGenericDestructible, "*VACUUM", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	971 = DukeGenericDestructible, "OCEANSPRITE1", "", "", 8, blocking, spawnsmoke
-	972 = DukeGenericDestructible, "OCEANSPRITE2", "", "", 8, blocking, spawnsmoke
-	973 = DukeGenericDestructible, "OCEANSPRITE3", "", "", 8, blocking, spawnsmoke
-	974 = DukeGenericDestructible, "OCEANSPRITE4", "", "", spawnsmoke
-	975 = DukeGenericDestructible, "OCEANSPRITE5", "", "", 8, blocking, spawnsmoke
-	1025 = DukeGenericDestructible, "BOTTLE7", "", "GLASS_BREAKING", solid, spawnglass
-	551 = DukeGenericDestructible, "DOMELITE", "", "GLASS_HEAVYBREAK", blocking, spawnglass2
-	954 =  DukeGenericDestructible, "BOTTLE1", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	955 =  DukeGenericDestructible, "BOTTLE2", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	956 =  DukeGenericDestructible, "BOTTLE3", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	957 =  DukeGenericDestructible, "BOTTLE4", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1012 = DukeGenericDestructible, "BOTTLE5", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1013 = DukeGenericDestructible, "BOTTLE6", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1014 = DukeGenericDestructible, "BOTTLE8", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1158 = DukeGenericDestructible, "BOTTLE11", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1159 = DukeGenericDestructible, "BOTTLE12", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1160 = DukeGenericDestructible, "BOTTLE13", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1161 = DukeGenericDestructible, "BOTTLE14", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1162 = DukeGenericDestructible, "BOTTLE15", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1163 = DukeGenericDestructible, "BOTTLE16", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1164 = DukeGenericDestructible, "BOTTLE17", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1165 = DukeGenericDestructible, "BOTTLE18", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1166 = DukeGenericDestructible, "BOTTLE19", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	716 = DukeGenericDestructible, "WAITTOBESEATED", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	768 = DukeGenericDestructible, "SUSHIPLATE1", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	769 = DukeGenericDestructible, "SUSHIPLATE2", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	774 = DukeGenericDestructible, "SUSHIPLATE3", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	779 = DukeGenericDestructible, "SUSHIPLATE4", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	792 = DukeGenericDestructible, "SUSHIPLATE5", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-}
-
+// most things in here will later go elsewhere, once better definition methods exist
 
 tileflag TFLAG_WALLSWITCH {
 	HANDPRINTSWITCH
diff --git a/wadsrc/static/filter/dukelike/rmapinfo.spawnclasses b/wadsrc/static/filter/dukelike/rmapinfo.spawnclasses
new file mode 100644
index 000000000..d3e0507c4
--- /dev/null
+++ b/wadsrc/static/filter/dukelike/rmapinfo.spawnclasses
@@ -0,0 +1,234 @@
+spawnclasses
+{
+	2 = DukeActivator
+	3 = DukeTouchplate
+	4 = DukeActivatorLocked
+	5 = DukeSoundController
+	6 = DukeLocator
+	7 = DukeCycler
+	8 = DukeMasterSwitch
+	9 = DukeRespawnController
+	10 = DukeGPSpeed
+	4890 = DukeNaturalLightning
+	
+	1221 = DukeCranePole
+	1222 = DukeCrane
+	563 = DukeWaterFountain
+	564 = DukeWaterFountain
+	565 = DukeWaterFountain
+	566 = DukeWaterFountain
+	567 = DukeWaterFountainBroke
+	951 = DukeBox
+	978 = DukeCone
+	908 = DukeTree1
+	910 = DukeTree2
+	990 = DukeTire
+	911 = DukeCactus
+	939 = DukeCactusBroke
+	2566 = DukeTripbombPlaced
+	2567 = DukeLaserline
+	546 = DukeCrack
+	547 = DukeCrack, "CRACK2"
+	548 = DukeCrack, "CRACK3"
+	549 = DukeCrack, "CRACK4"
+	916 = DukeFireext
+	1079 = DukeOozFilter
+	1247 = DukeSeenine
+	502 = DukeViewscreen
+	499 = DukeViewscreen2
+	621 = DukeCamera // yes, they are all the same!
+	622 = DukeCamera
+	623 = DukeCamera
+	624 = DukeCamera
+	625 = DukeCamera
+	3190 = DukeRespawnmarker
+	1267 = DukeRat
+	902 = DukeQueball
+	901 = DukeStripeBall
+	903 = DukePoolPocket
+	2590 = DukeForceSphere
+	1960 = DukeRecon
+	2300 = DukeOoz
+	2309 = DukeOoz2
+	2296 = DukeBloodSplat1
+	2297 = DukeBloodSplat2
+	2298 = DukeBloodSplat3
+	2299 = DukeBloodSplat4
+	1625 = DukeFireLaser
+	1646 = DukeShrinkSpark
+	2605 = DukeRPG
+	1641 = DukeFreezeBlast
+	1636 = DukeSpit
+	1360 = DukeCoolExplosion1
+	578 = DukeReactor2
+	580 = DukeReactor2Spark
+	1088 = DukeReactor
+	1092 = DukeReactorSpark
+	4465 = DukeGenericPole2
+	979 = DukeHangLight
+	869 = DukeStatueFlash
+	753 = DukeStatue
+	1157 = DukeBottle10
+	765 = DukeVase
+	4502 = DukeLetter
+	4361 = DukeDuck
+	4359 = DukeTarget
+	1346 = DukeHelicopter
+	2491 = DukeCar
+	26 = DukePipeBomb
+	940 = DukeBounceMine
+	1650 = DukeMortar
+	2999 = DukeFrameEffect
+	925 = DukeNeon
+	926 = DukeNeon, "NEON2"
+	1007 = DukeNeon, "NEON3"
+	1008 = DukeNeon, "NEON4"
+	1009 = DukeNeon, "NEON5"
+	1046 = DukeNeon, "NEON6"
+	142 = DukeNukeButton
+	1233 = DukeMoney
+	4460 = DukePaper
+	4410 = DukeMail
+	1380 = DukeWaterSplash
+	1031 = DukeGlassPieces
+	1032 = DukeGlassPieces1
+	1033 = DukeGlassPieces2
+	2533 = DukeShell
+	2535 = DukeShotgunShell
+	1226 = DukeBloodPool
+	407 = DukeFanSprite
+	516 = DukeSatellite
+	517 = DukeFuelPod
+	602 = DukeSolarPanel
+	607 = DukeAntenna
+	1358 = DukeFetus
+	1359 = DukeFetusBroke
+	969 = DukeHydroplant
+	1003 = DukeHydroplantBroke
+	981 = DukeHydrant
+	619 = DukePipe1
+	616 = DukePipe2
+	618 = DukePipe3
+	996 = DukePipe4
+	994 = DukePipe5
+	995 = DukePipe6
+	4943 = DukeJuryGuy
+	1353 = DukeSpaceMarine
+	1355 = DukeIndy
+	1352 = DukeMonk
+	1354 = DukeLuke
+	680 = DukeChair3
+	569 = DukeToilet
+	571 = DukeStall
+	1069 = DukePlug
+	568 = DukeFemMag
+	577 = DukeFemMag, "FEMMAG2"
+	4900 = DukeTag
+	4909 = DukeTag, "SIGN1"
+	4912 = DukeTag, "SIGN2"
+	285	= DukeMaskWall
+	913	= DukeMaskWall, "MASKWALL2"
+	914	= DukeMaskWall, "MASKWALL3"
+	915	= DukeMaskWall, "MASKWALL4"
+	514	= DukeMaskWall, "MASKWALL5"
+	1059 = DukeMaskWall, "MASKWALL6"
+	1174 = DukeMaskWall, "MASKWALL7"
+	1124 = DukeMaskWall, "MASKWALL8"
+	255	= DukeMaskWall, "MASKWALL9"
+	387	= DukeMaskWall, "MASKWALL10"
+	391	= DukeMaskWall, "MASKWALL11"
+	609	= DukeMaskWall, "MASKWALL12"
+	830	= DukeMaskWall, "MASKWALL13"
+	988	= DukeMaskWall, "MASKWALL14"
+	1024 = DukeMaskWall, "MASKWALL15"
+	550 = DukeFootprints
+	672 = DukeFootprints
+	673 = DukeFootprints
+	674 = DukeFootprints
+	952 = DukeBulletHole
+	554 = DukeCameraPole
+	977 = DukeGenericPole
+
+	1272 = DukeTrash
+	634 = DukeBolt1
+	635 = DukeBolt2
+	636 = DukeBolt3
+	637 = DukeBolt4
+	4525 = DukeSideBolt1
+	4526 = DukeSideBolt2
+	4527 = DukeSideBolt3
+	4528 = DukeSideBolt4
+	660 = DukeWaterdrip
+	160 = DukeDoorshock
+	1232 = DukeCanWithSomething
+	2807 = DukeCanWithSomething, "CANWITHSOMETHING2"
+	2808 = DukeCanWithSomething, "CANWITHSOMETHING3"
+	2809 = DukeCanWithSomething, "CANWITHSOMETHING4"
+	1647 = DukeTongue
+	1860 = DukeInnerJaw
+	1861 = DukeInnerJaw1
+	2245 = DukeJibs1
+	2250 = DukeJibs2
+	2255 = DukeJibs3
+	2260 = DukeJibs4
+	2265 = DukeJibs5
+	2286 = DukeJibs6
+	1768 = DukeHeadJib1
+	1772 = DukeArmJib1
+	1776 = DukeLegJib1
+	2201 = DukeLizmanHead
+	2205 = DukeLizmanArm
+	2209 = DukeLizmanLeg
+	1520 = DukePlayerTorso
+	1528 = DukePlayerGun
+	1536 = DukePlayerLeg
+	
+	2370 = DukeGreenSlime
+
+	595 = DukeGenericDestructible, "GRATE1", "BGRATE1", "VENT_BUST", solid, unblocking
+	1113 = DukeGenericDestructible, "CIRCLEPANNEL", "CIRCLEPANNELBROKE", "VENT_BUST", unblocking
+	342 = DukeGenericDestructible, "PANNEL1", "BPANNEL1", "VENT_BUST", solid, unblocking
+	343 = DukeGenericDestructible, "PANNEL2", "BPANNEL3", "VENT_BUST", solid, unblocking
+	4099 = DukeGenericDestructible, "PANNEL3", "BPANNEL3", "VENT_BUST", unblocking
+	556 = DukeGenericDestructible, "CHAIR1", "BROKENCHAIR", "", solid, unblocking
+	557 = DukeGenericDestructible, "CHAIR2", "BROKENCHAIR", "", solid, unblocking
+
+	686 = DukeGenericDestructible, "MOVIECAMERA", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	678 = DukeGenericDestructible, "SCALE", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	685 = DukeGenericDestructible, "CAMERALIGHT", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	689 = DukeGenericDestructible, "IVUNIT", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	694 = DukeGenericDestructible, "POT1", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	695 = DukeGenericDestructible, "POT2", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	697 = DukeGenericDestructible, "POT3", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	4444 = DukeGenericDestructible, "TRIPODCAMERA", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	669 = DukeGenericDestructible, "*VACUUM", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	971 = DukeGenericDestructible, "OCEANSPRITE1", "", "", 8, blocking, spawnsmoke
+	972 = DukeGenericDestructible, "OCEANSPRITE2", "", "", 8, blocking, spawnsmoke
+	973 = DukeGenericDestructible, "OCEANSPRITE3", "", "", 8, blocking, spawnsmoke
+	974 = DukeGenericDestructible, "OCEANSPRITE4", "", "", spawnsmoke
+	975 = DukeGenericDestructible, "OCEANSPRITE5", "", "", 8, blocking, spawnsmoke
+	1025 = DukeGenericDestructible, "BOTTLE7", "", "GLASS_BREAKING", solid, spawnglass
+	551 = DukeGenericDestructible, "DOMELITE", "", "GLASS_HEAVYBREAK", blocking, spawnglass2
+	954 =  DukeGenericDestructible, "BOTTLE1", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	955 =  DukeGenericDestructible, "BOTTLE2", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	956 =  DukeGenericDestructible, "BOTTLE3", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	957 =  DukeGenericDestructible, "BOTTLE4", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1012 = DukeGenericDestructible, "BOTTLE5", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1013 = DukeGenericDestructible, "BOTTLE6", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1014 = DukeGenericDestructible, "BOTTLE8", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1158 = DukeGenericDestructible, "BOTTLE11", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1159 = DukeGenericDestructible, "BOTTLE12", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1160 = DukeGenericDestructible, "BOTTLE13", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1161 = DukeGenericDestructible, "BOTTLE14", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1162 = DukeGenericDestructible, "BOTTLE15", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1163 = DukeGenericDestructible, "BOTTLE16", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1164 = DukeGenericDestructible, "BOTTLE17", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1165 = DukeGenericDestructible, "BOTTLE18", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1166 = DukeGenericDestructible, "BOTTLE19", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	716 = DukeGenericDestructible, "WAITTOBESEATED", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	768 = DukeGenericDestructible, "SUSHIPLATE1", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	769 = DukeGenericDestructible, "SUSHIPLATE2", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	774 = DukeGenericDestructible, "SUSHIPLATE3", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	779 = DukeGenericDestructible, "SUSHIPLATE4", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	792 = DukeGenericDestructible, "SUSHIPLATE5", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+}
diff --git a/wadsrc/static/filter/redneck.redneck/engine/engine.def b/wadsrc/static/filter/redneck.redneck/rmapinfo.spawnclasses
similarity index 100%
rename from wadsrc/static/filter/redneck.redneck/engine/engine.def
rename to wadsrc/static/filter/redneck.redneck/rmapinfo.spawnclasses
diff --git a/wadsrc/static/filter/redneck.ridesagain/engine/engine.def b/wadsrc/static/filter/redneck.ridesagain/engine/engine.def
index f5dba6aa0..6eeb867f4 100644
--- a/wadsrc/static/filter/redneck.ridesagain/engine/engine.def
+++ b/wadsrc/static/filter/redneck.ridesagain/engine/engine.def
@@ -1,167 +1,5 @@
 include "engine/defines.def"
 
-spawnclasses
-{
-	3464 = RedneckCheerBomb
-	2430 = RedneckCactusLargeYellow
-	2431 = RedneckCactusLargeGreen
-	2432 = RedneckCactusLargeBrown
-	2443 = RedneckCactusDrug
-	2451 = RedneckCactusWithHoles
-	2455 = RedneckCactusSmall
-	2446 = RedneckCactusLargeGreen2
-	2460 = RedneckCactusDebris1
-	2465 = RedneckCactusDebris2
-	7424 = RedneckRabbitSpawner
-	5872 = RedneckBikeJibA
-	5877 = RedneckBikeJibB
-	5882 = RedneckBikeJibC
-	6112 = RedneckBikerJibA
-	6117 = RedneckBikerJibB
-	6121 = RedneckBikerJibC
-	6127 = RedneckBikerJibD
-	7000 = RedneckCheerJibA
-	7005 = RedneckCheerJibB
-	7010 = RedneckCheerJibC
-	7015 = RedneckCheerJibD
-	7020 = RedneckFBoatJibA
-	7025 = RedneckFBoatJibB
-	7387 = RedneckRabbitJibA
-	7392 = RedneckRabbitJibB
-	7397 = RedneckRabbitJibC
-	8890 = RedneckMamaJibA
-	8895 = RedneckMamaJibB	
-	8487 = RedneckBalloons1
-	8489 = RedneckBalloons2
-	8165 = RedneckGamblingMachine
-	8593 = RedneckGamblingMachine2
-	2437 = RedneckBell
-	5270 = RedneckUfoRRRA
-	5274 = RedneckUfo2
-	5278 = RedneckUfo3
-	5282 = RedneckUfo4
-	5286 = RedneckUfo5
-	8192 = RedneckUfoSpawnerToggle
-	1781 = RedneckChickenArrow
-	1790 = RedneckBoatGrenade
-	4956 = RedneckPigDisplay
-	8450 = RedneckAirplane
-	8099 = RedneckPiano
-	8094 = RedneckPianoKeys
-	8679 = RedneckSnakeRiverSign
-	8448 = RedneckMusicNotes
-	8704 = RedneckJoe9000
-	7220 = RedneckEmptyBike
-	7233 = RedneckEmptyBoat
-
-	7636 = DukeGenericDestructible, "OLDPHOTO0", "OLDPHOTO0BROKE", "VENT_BUST"
-	7638 = DukeGenericDestructible, "OLDPHOTO1", "OLDPHOTO1BROKE", "VENT_BUST"
-	7640 = DukeGenericDestructible, "FLAMMABLESIGN", "FLAMMABLESIGNBROKE", "VENT_BUST"
-	7644 = DukeGenericDestructible, "OLDPHOTO2", "OLDPHOTO2BROKE", "VENT_BUST"
-	7646 = DukeGenericDestructible, "OLDPHOTO3", "OLDPHOTO3BROKE", "VENT_BUST"
-	7648 = DukeGenericDestructible, "WILLIESGUNS", "WILLIESGUNSBROKE", "WOODBREK"
-	7650 = DukeGenericDestructible, "FLAMMABLE2SIGN", "FLAMMABLE2SIGNBROKE", "VENT_BUST"
-	7653 = DukeGenericDestructible, "LABSIGN", "LABSIGNBROKE", "VENT_BUST"
-	7655 = DukeGenericDestructible, "LABSIGN2", "LABSIGN2BROKE", "VENT_BUST"
-	7691 = DukeGenericDestructible, "SALOONSIGN", "SALOONSIGNBROKE", "VENT_BUST"
-	7875 = DukeGenericDestructible, "NOMOTOSIGN", "NOMOTOSIGNBROKE", "VENT_BUST"
-	7876 = DukeGenericDestructible, "STREETSIGN1", "STREETSIGN1BROKE", "VENT_BUST"
-	7881 = DukeGenericDestructible, "DANGERSIGN", "DANGERSIGNBROKE", "VENT_BUST"
-	7883 = DukeGenericDestructible, "RADIATIONSIGN", "RADIATIONSIGNBROKE", "VENT_BUST"
-	7879 = DukeGenericDestructible, "DIABLOHWAY", "DIABLOHWAYBROKE", "SIGNHIT", damaging
-	7694 = DukeGenericDestructible, "BANKELPESO", "BANKELPESOBROKE", "WOODBREK"
-	7700 = DukeGenericDestructible, "SHERIFFSIGN", "SHERIFFSIGNBROKE", "WOODBREK"
-	7702 = DukeGenericDestructible, "STORESIGN", "STORESIGNBROKE", "WOODBREK"
-	7711 = DukeGenericDestructible, "HOTELSIGN", "HOTELSIGNBROKE", "WOODBREK"
-	7595 = DukeGenericDestructible, "RRTILE7595", "RRTILE7705", "SIGNHIT"
-	7704 = DukeGenericDestructible, "RRTILE7704", "RRTILE7705", "SIGNHIT"
-	8579 = DukeGenericDestructible, "RRTILE8579", "RRTILE5014", "GLASS_HEAVYBREAK"
-	7441 = DukeGenericDestructible, "RRTILE7441", "RRTILE5016", "GLASS_HEAVYBREAK"
-	7534 = DukeGenericDestructible, "RRTILE7534", "RRTILE5029", "GLASS_HEAVYBREAK"
-	7545 = DukeGenericDestructible, "RRTILE7545", "RRTILE5030", "GLASS_HEAVYBREAK"
-	7547 = DukeGenericDestructible, "RRTILE7547", "RRTILE5031", "GLASS_HEAVYBREAK"
-	7574 = DukeGenericDestructible, "RRTILE7574", "RRTILE5032", "GLASS_HEAVYBREAK"
-	7575 = DukeGenericDestructible, "RRTILE7575", "RRTILE5033", "GLASS_HEAVYBREAK"
-	7578 = DukeGenericDestructible, "RRTILE7578", "RRTILE5034", "GLASS_HEAVYBREAK"
-	7478 = DukeGenericDestructible, "RRTILE7478", "RRTILE5035", "GLASS_HEAVYBREAK"
-	8525 = DukeGenericDestructible, "RRTILE8525", "RRTILE5036", "GLASS_HEAVYBREAK"
-	8537 = DukeGenericDestructible, "RRTILE8537", "RRTILE5062", "GLASS_HEAVYBREAK"
-	8215 = DukeGenericDestructible, "RRTILE8215", "RRTILE5064", "GLASS_HEAVYBREAK"
-	8216 = DukeGenericDestructible, "*RRTILE8216", "RRTILE5065", "GLASS_HEAVYBREAK"	// *prefix means fullbright.
-	8217 = DukeGenericDestructible, "RRTILE8217", "RRTILE5066", "GLASS_HEAVYBREAK"
-	8218 = DukeGenericDestructible, "*RRTILE8218", "RRTILE5067", "GLASS_HEAVYBREAK"
-	8220 = DukeGenericDestructible, "*RRTILE8220", "RRTILE5068", "GLASS_HEAVYBREAK"
-	8221 = DukeGenericDestructible, "RRTILE8221", "RRTILE5069", "GLASS_HEAVYBREAK"
-	8395 = DukeGenericDestructible, "RRTILE8395", "RRTILE5072", "GLASS_HEAVYBREAK"
-	8423 = DukeGenericDestructible, "RRTILE8423", "RRTILE5073", "GLASS_HEAVYBREAK"
-	8462 = DukeGenericDestructible, "RRTILE8462", "RRTILE5074", "GLASS_HEAVYBREAK"
-	8475 = DukeGenericDestructible, "RRTILE8475", "RRTILE5075", "GLASS_HEAVYBREAK"
-	8608 = DukeGenericDestructible, "RRTILE8608", "RRTILE5083", "GLASS_HEAVYBREAK"
-	8609 = DukeGenericDestructible, "RRTILE8609", "RRTILE5084", "GLASS_HEAVYBREAK"
-	8312 = DukeGenericDestructible, "RRTILE8312", "RRTILE5071", "POOLBUD"
-	8567 = DukeGenericDestructible, "RRTILE8567", "RRTILE5082", "GLASS_HEAVYBREAK"
-	8568 = DukeGenericDestructible, "RRTILE8568", "RRTILE5082", "GLASS_HEAVYBREAK"
-	8569 = DukeGenericDestructible, "RRTILE8569", "RRTILE5082", "GLASS_HEAVYBREAK"
-	8570 = DukeGenericDestructible, "RRTILE8570", "RRTILE5082", "GLASS_HEAVYBREAK"
-	8571 = DukeGenericDestructible, "RRTILE8571", "RRTILE5082", "GLASS_HEAVYBREAK"
-	8640 = DukeGenericDestructible, "RRTILE8640", "RRTILE5085", "GLASS_HEAVYBREAK"
-	8611 = DukeGenericDestructible, "RRTILE8611", "RRTILE5086", "GLASS_HEAVYBREAK"
-	8497 = DukeGenericDestructible, "RRTILE8497", "RRTILE5076", "GLASS_HEAVYBREAK"
-	8498 = DukeGenericDestructible, "RRTILE8498", "RRTILE5077", "GLASS_HEAVYBREAK"
-	8499 = DukeGenericDestructible, "RRTILE8499", "RRTILE5078", "GLASS_HEAVYBREAK"
-	8503 = DukeGenericDestructible, "RRTILE8503", "RRTILE5079", "GLASS_HEAVYBREAK"
-	7901 = DukeGenericDestructible, "RRTILE7901", "RRTILE5080", "GLASS_HEAVYBREAK"
-	7696 = DukeGenericDestructible, "RRTILE7696", "RRTILE7697", "WOODBREK"
-	7806 = DukeGenericDestructible, "RRTILE7806", "RRTILE5043", "GLASS_HEAVYBREAK"
-	7900 = DukeGenericDestructible, "RRTILE7900", "RRTILE5047", "GLASS_HEAVYBREAK"
-	7906 = DukeGenericDestructible, "RRTILE7906", "RRTILE5048", "GLASS_HEAVYBREAK"
-	7912 = DukeGenericDestructible, "RRTILE7912", "RRTILE5049", "GLASS_HEAVYBREAK"
-	7913 = DukeGenericDestructible, "RRTILE7913", "RRTILE5049", "GLASS_HEAVYBREAK"
-	8047 = DukeGenericDestructible, "RRTILE8047", "RRTILE5050", "GLASS_HEAVYBREAK"
-	8596 = DukeGenericDestructible, "RRTILE8596", "RRTILE8598", "GLASS_HEAVYBREAK"
-	8059 = DukeGenericDestructible, "RRTILE8059", "RRTILE5051", "GLASS_HEAVYBREAK"
-	8060 = DukeGenericDestructible, "RRTILE8060", "RRTILE5052", "GLASS_HEAVYBREAK"
-	8222 = DukeGenericDestructible, "RRTILE8222", "RRTILE5053", "GLASS_HEAVYBREAK"
-	8223 = DukeGenericDestructible, "RRTILE8223", "RRTILE5054", "GLASS_HEAVYBREAK"
-	8224 = DukeGenericDestructible, "RRTILE8224", "RRTILE5055", "GLASS_HEAVYBREAK"
-	8370 = DukeGenericDestructible, "RRTILE8370", "RRTILE5056", "GLASS_HEAVYBREAK"
-	8371 = DukeGenericDestructible, "RRTILE8371", "RRTILE5057", "GLASS_HEAVYBREAK"
-	8372 = DukeGenericDestructible, "RRTILE8372", "RRTILE5058", "GLASS_HEAVYBREAK"
-	8373 = DukeGenericDestructible, "RRTILE8373", "RRTILE5059", "GLASS_HEAVYBREAK"
-	8396 = DukeGenericDestructible, "RRTILE8396", "RRTILE5038", "GLASS_HEAVYBREAK"
-	8397 = DukeGenericDestructible, "RRTILE8397", "RRTILE5039", "GLASS_HEAVYBREAK"
-	8398 = DukeGenericDestructible, "RRTILE8398", "RRTILE5040", "GLASS_HEAVYBREAK"
-	8399 = DukeGenericDestructible, "RRTILE8399", "RRTILE5041", "GLASS_HEAVYBREAK"
-	8385 = DukeGenericDestructible, "RRTILE8385", "RRTILE8386", "GLASS_HEAVYBREAK"
-	8387 = DukeGenericDestructible, "RRTILE8387", "RRTILE8388", "GLASS_HEAVYBREAK"
-	8389 = DukeGenericDestructible, "RRTILE8389", "RRTILE8390", "GLASS_HEAVYBREAK"
-	8391 = DukeGenericDestructible, "RRTILE8391", "RRTILE8392", "GLASS_HEAVYBREAK"
-	7553 = DukeGenericDestructible, "RRTILE7553", "RRTILE5035", "GLASS_HEAVYBREAK"
-	8475 = DukeGenericDestructible, "RRTILE8475", "RRTILE5075", "GLASS_HEAVYBREAK"
-	8498 = DukeGenericDestructible, "RRTILE8498", "RRTILE5077", "GLASS_HEAVYBREAK"
-	8499 = DukeGenericDestructible, "RRTILE8499", "RRTILE5078", "GLASS_HEAVYBREAK"
-	2445 = DukeGenericDestructible, "RRTILE2445", "RRTILE2450", "GLASS_HEAVYBREAK"
-	7885 = DukeGenericDestructible, "RRTILE7885", "RRTILE5045", "SIGNHIT", damaging
-	7890 = DukeGenericDestructible, "RRTILE7890", "RRTILE5045", "SIGNHIT", damaging
-	7886 = DukeGenericDestructible, "RRTILE7886", "RRTILE5046", "SIGNHIT", damaging
-	7887 = DukeGenericDestructible, "RRTILE7887", "RRTILE5044", "GLASS_HEAVYBREAK", damaging
-	2123 = DukeGenericDestructible, "RRTILE2123", "RRTILE2124", "GLASS_BREAKING", damaging
-	3773 = DukeGenericDestructible, "RRTILE3773", "RRTILE8651", "GLASS_BREAKING", damaging
-	7533 = DukeGenericDestructible, "*RRTILE7533", "*RRTILE5035", "SIGNHIT", damaging
-	3584 = DukeGenericDestructible, "RRTILE3584", "RRTILE8681", "SIGNHIT", damaging
-	8394 = DukeGenericDestructible, "RRTILE8394", "RRTILE5072", "SIGNHIT"
-	8461 = DukeGenericDestructible, "RRTILE8461", "RRTILE5074", "GLASS_HEAVYBREAK"
-	8462 = DukeGenericDestructible, "RRTILE8462", "RRTILE5074", "GLASS_HEAVYBREAK"
-	8682 = DukeGenericDestructible, "RRTILE8682", "RRTILE8683", "GLASS_HEAVYBREAK"
-	1824 = DukeGenericDestructible, "YELLOWBOTTLE", "", "GLASS_HEAVYBREAK", spawnglass2
-	244 = DukeActor, "*WALLLIGHT3"
-	246 = DukeActor, "*WALLLIGHT1"
-	3668 = DukeActor, "*RRTILE3668"
-	3795 = DukeActor, "*RRTILE3795"
-	7505 = DukeActor, "*RRTILE7505"
-	7506 = DukeActor, "*RRTILE7506"
-
-}
 
 tileflag TFLAG_WALLSWITCH {
 		MULTISWITCH2
@@ -194,34 +32,3 @@ tileflag TFLAG_BLOCKDOOR {
 	RRTILE8605
 	}
 	
-	breakwall RRTILE7555, RRTILE5015, GLASS_HEAVYBREAK
-	breakwall RRTILE7441, RRTILE5016, GLASS_HEAVYBREAK
-	breakwall RRTILE7559, RRTILE5017, GLASS_HEAVYBREAK
-	breakwall RRTILE7433, RRTILE5018, GLASS_HEAVYBREAK
-	breakwall RRTILE7557, RRTILE5019, GLASS_HEAVYBREAK
-	breakwall RRTILE7553, RRTILE5020, GLASS_HEAVYBREAK
-	breakwall RRTILE7552, RRTILE5021, GLASS_HEAVYBREAK
-	breakwall RRTILE7568, RRTILE5022, GLASS_HEAVYBREAK
-	breakwall RRTILE7540, RRTILE5023, GLASS_HEAVYBREAK
-	breakwall RRTILE7558, RRTILE5024, GLASS_HEAVYBREAK
-	breakwall RRTILE7554, RRTILE5025, GLASS_HEAVYBREAK
-	breakwall RRTILE7579, RRTILE5026, GLASS_HEAVYBREAK
-	breakwall RRTILE7561, RRTILE5027, GLASS_HEAVYBREAK
-	breakwall RRTILE7580, RRTILE5037, GLASS_HEAVYBREAK
-	breakwall RRTILE8227, RRTILE5070, GLASS_HEAVYBREAK
-	breakwall RRTILE8503, RRTILE5079, GLASS_HEAVYBREAK
-	breakwall RRTILE8567, RRTILE5082, GLASS_HEAVYBREAK
-	breakwall RRTILE8568, RRTILE5082, GLASS_HEAVYBREAK
-	breakwall RRTILE8569, RRTILE5082, GLASS_HEAVYBREAK
-	breakwall RRTILE8570, RRTILE5082, GLASS_HEAVYBREAK
-	breakwall RRTILE8571, RRTILE5082, GLASS_HEAVYBREAK
-	breakwall RRTILE7859, RRTILE5081, GLASS_HEAVYBREAK
-	breakwall RRTILE8496, RRTILE5061, GLASS_HEAVYBREAK
-	breakwall RRTILE8620, RRTILE8621, WOODBREK
-	breakwall RRTILE8622, RRTILE8623, SIGNHIT
-	breakwall WEAPONCABINET, WEAPONCABINETBROKE, GLASS_HEAVYBREAK
-	breakwall RRTILE8497, RRTILE5076, SIGNHIT
-	breakwall RRTILE7533, RRTILE5035, SIGNHIT
-	breakwall RRTILE8617, RRTILE8618, WOODBREK, "RedneckBreakwalls.SinglePlayerBreak"
-		
-
diff --git a/wadsrc/static/filter/redneck.ridesagain/rmapinfo.breakwall b/wadsrc/static/filter/redneck.ridesagain/rmapinfo.breakwall
new file mode 100644
index 000000000..766b64cdb
--- /dev/null
+++ b/wadsrc/static/filter/redneck.ridesagain/rmapinfo.breakwall
@@ -0,0 +1,32 @@
+breakwalls
+{
+	RRTILE7555 = RRTILE5015, GLASS_HEAVYBREAK
+	RRTILE7441 = RRTILE5016, GLASS_HEAVYBREAK
+	RRTILE7559 = RRTILE5017, GLASS_HEAVYBREAK
+	RRTILE7433 = RRTILE5018, GLASS_HEAVYBREAK
+	RRTILE7557 = RRTILE5019, GLASS_HEAVYBREAK
+	RRTILE7553 = RRTILE5020, GLASS_HEAVYBREAK
+	RRTILE7552 = RRTILE5021, GLASS_HEAVYBREAK
+	RRTILE7568 = RRTILE5022, GLASS_HEAVYBREAK
+	RRTILE7540 = RRTILE5023, GLASS_HEAVYBREAK
+	RRTILE7558 = RRTILE5024, GLASS_HEAVYBREAK
+	RRTILE7554 = RRTILE5025, GLASS_HEAVYBREAK
+	RRTILE7579 = RRTILE5026, GLASS_HEAVYBREAK
+	RRTILE7561 = RRTILE5027, GLASS_HEAVYBREAK
+	RRTILE7580 = RRTILE5037, GLASS_HEAVYBREAK
+	RRTILE8227 = RRTILE5070, GLASS_HEAVYBREAK
+	RRTILE8503 = RRTILE5079, GLASS_HEAVYBREAK
+	RRTILE8567 = RRTILE5082, GLASS_HEAVYBREAK
+	RRTILE8568 = RRTILE5082, GLASS_HEAVYBREAK
+	RRTILE8569 = RRTILE5082, GLASS_HEAVYBREAK
+	RRTILE8570 = RRTILE5082, GLASS_HEAVYBREAK
+	RRTILE8571 = RRTILE5082, GLASS_HEAVYBREAK
+	RRTILE7859 = RRTILE5081, GLASS_HEAVYBREAK
+	RRTILE8496 = RRTILE5061, GLASS_HEAVYBREAK
+	RRTILE8620 = RRTILE8621, WOODBREK
+	RRTILE8622 = RRTILE8623, SIGNHIT
+	WEAPONCABINET = WEAPONCABINETBROKE, GLASS_HEAVYBREAK
+	RRTILE8497 = RRTILE5076, SIGNHIT
+	RRTILE7533 = RRTILE5035, SIGNHIT
+	RRTILE8617 = RRTILE8618, WOODBREK, "RedneckBreakwalls.SinglePlayerBreak"
+}
diff --git a/wadsrc/static/filter/redneck.ridesagain/rmapinfo.spawnclasses b/wadsrc/static/filter/redneck.ridesagain/rmapinfo.spawnclasses
new file mode 100644
index 000000000..0500be6f6
--- /dev/null
+++ b/wadsrc/static/filter/redneck.ridesagain/rmapinfo.spawnclasses
@@ -0,0 +1,162 @@
+spawnclasses
+{
+	3464 = RedneckCheerBomb
+	2430 = RedneckCactusLargeYellow
+	2431 = RedneckCactusLargeGreen
+	2432 = RedneckCactusLargeBrown
+	2443 = RedneckCactusDrug
+	2451 = RedneckCactusWithHoles
+	2455 = RedneckCactusSmall
+	2446 = RedneckCactusLargeGreen2
+	2460 = RedneckCactusDebris1
+	2465 = RedneckCactusDebris2
+	7424 = RedneckRabbitSpawner
+	5872 = RedneckBikeJibA
+	5877 = RedneckBikeJibB
+	5882 = RedneckBikeJibC
+	6112 = RedneckBikerJibA
+	6117 = RedneckBikerJibB
+	6121 = RedneckBikerJibC
+	6127 = RedneckBikerJibD
+	7000 = RedneckCheerJibA
+	7005 = RedneckCheerJibB
+	7010 = RedneckCheerJibC
+	7015 = RedneckCheerJibD
+	7020 = RedneckFBoatJibA
+	7025 = RedneckFBoatJibB
+	7387 = RedneckRabbitJibA
+	7392 = RedneckRabbitJibB
+	7397 = RedneckRabbitJibC
+	8890 = RedneckMamaJibA
+	8895 = RedneckMamaJibB	
+	8487 = RedneckBalloons1
+	8489 = RedneckBalloons2
+	8165 = RedneckGamblingMachine
+	8593 = RedneckGamblingMachine2
+	2437 = RedneckBell
+	5270 = RedneckUfoRRRA
+	5274 = RedneckUfo2
+	5278 = RedneckUfo3
+	5282 = RedneckUfo4
+	5286 = RedneckUfo5
+	8192 = RedneckUfoSpawnerToggle
+	1781 = RedneckChickenArrow
+	1790 = RedneckBoatGrenade
+	4956 = RedneckPigDisplay
+	8450 = RedneckAirplane
+	8099 = RedneckPiano
+	8094 = RedneckPianoKeys
+	8679 = RedneckSnakeRiverSign
+	8448 = RedneckMusicNotes
+	8704 = RedneckJoe9000
+	7220 = RedneckEmptyBike
+	7233 = RedneckEmptyBoat
+
+	7636 = DukeGenericDestructible, "OLDPHOTO0", "OLDPHOTO0BROKE", "VENT_BUST"
+	7638 = DukeGenericDestructible, "OLDPHOTO1", "OLDPHOTO1BROKE", "VENT_BUST"
+	7640 = DukeGenericDestructible, "FLAMMABLESIGN", "FLAMMABLESIGNBROKE", "VENT_BUST"
+	7644 = DukeGenericDestructible, "OLDPHOTO2", "OLDPHOTO2BROKE", "VENT_BUST"
+	7646 = DukeGenericDestructible, "OLDPHOTO3", "OLDPHOTO3BROKE", "VENT_BUST"
+	7648 = DukeGenericDestructible, "WILLIESGUNS", "WILLIESGUNSBROKE", "WOODBREK"
+	7650 = DukeGenericDestructible, "FLAMMABLE2SIGN", "FLAMMABLE2SIGNBROKE", "VENT_BUST"
+	7653 = DukeGenericDestructible, "LABSIGN", "LABSIGNBROKE", "VENT_BUST"
+	7655 = DukeGenericDestructible, "LABSIGN2", "LABSIGN2BROKE", "VENT_BUST"
+	7691 = DukeGenericDestructible, "SALOONSIGN", "SALOONSIGNBROKE", "VENT_BUST"
+	7875 = DukeGenericDestructible, "NOMOTOSIGN", "NOMOTOSIGNBROKE", "VENT_BUST"
+	7876 = DukeGenericDestructible, "STREETSIGN1", "STREETSIGN1BROKE", "VENT_BUST"
+	7881 = DukeGenericDestructible, "DANGERSIGN", "DANGERSIGNBROKE", "VENT_BUST"
+	7883 = DukeGenericDestructible, "RADIATIONSIGN", "RADIATIONSIGNBROKE", "VENT_BUST"
+	7879 = DukeGenericDestructible, "DIABLOHWAY", "DIABLOHWAYBROKE", "SIGNHIT", damaging
+	7694 = DukeGenericDestructible, "BANKELPESO", "BANKELPESOBROKE", "WOODBREK"
+	7700 = DukeGenericDestructible, "SHERIFFSIGN", "SHERIFFSIGNBROKE", "WOODBREK"
+	7702 = DukeGenericDestructible, "STORESIGN", "STORESIGNBROKE", "WOODBREK"
+	7711 = DukeGenericDestructible, "HOTELSIGN", "HOTELSIGNBROKE", "WOODBREK"
+	7595 = DukeGenericDestructible, "RRTILE7595", "RRTILE7705", "SIGNHIT"
+	7704 = DukeGenericDestructible, "RRTILE7704", "RRTILE7705", "SIGNHIT"
+	8579 = DukeGenericDestructible, "RRTILE8579", "RRTILE5014", "GLASS_HEAVYBREAK"
+	7441 = DukeGenericDestructible, "RRTILE7441", "RRTILE5016", "GLASS_HEAVYBREAK"
+	7534 = DukeGenericDestructible, "RRTILE7534", "RRTILE5029", "GLASS_HEAVYBREAK"
+	7545 = DukeGenericDestructible, "RRTILE7545", "RRTILE5030", "GLASS_HEAVYBREAK"
+	7547 = DukeGenericDestructible, "RRTILE7547", "RRTILE5031", "GLASS_HEAVYBREAK"
+	7574 = DukeGenericDestructible, "RRTILE7574", "RRTILE5032", "GLASS_HEAVYBREAK"
+	7575 = DukeGenericDestructible, "RRTILE7575", "RRTILE5033", "GLASS_HEAVYBREAK"
+	7578 = DukeGenericDestructible, "RRTILE7578", "RRTILE5034", "GLASS_HEAVYBREAK"
+	7478 = DukeGenericDestructible, "RRTILE7478", "RRTILE5035", "GLASS_HEAVYBREAK"
+	8525 = DukeGenericDestructible, "RRTILE8525", "RRTILE5036", "GLASS_HEAVYBREAK"
+	8537 = DukeGenericDestructible, "RRTILE8537", "RRTILE5062", "GLASS_HEAVYBREAK"
+	8215 = DukeGenericDestructible, "RRTILE8215", "RRTILE5064", "GLASS_HEAVYBREAK"
+	8216 = DukeGenericDestructible, "*RRTILE8216", "RRTILE5065", "GLASS_HEAVYBREAK"	// *prefix means fullbright.
+	8217 = DukeGenericDestructible, "RRTILE8217", "RRTILE5066", "GLASS_HEAVYBREAK"
+	8218 = DukeGenericDestructible, "*RRTILE8218", "RRTILE5067", "GLASS_HEAVYBREAK"
+	8220 = DukeGenericDestructible, "*RRTILE8220", "RRTILE5068", "GLASS_HEAVYBREAK"
+	8221 = DukeGenericDestructible, "RRTILE8221", "RRTILE5069", "GLASS_HEAVYBREAK"
+	8395 = DukeGenericDestructible, "RRTILE8395", "RRTILE5072", "GLASS_HEAVYBREAK"
+	8423 = DukeGenericDestructible, "RRTILE8423", "RRTILE5073", "GLASS_HEAVYBREAK"
+	8462 = DukeGenericDestructible, "RRTILE8462", "RRTILE5074", "GLASS_HEAVYBREAK"
+	8475 = DukeGenericDestructible, "RRTILE8475", "RRTILE5075", "GLASS_HEAVYBREAK"
+	8608 = DukeGenericDestructible, "RRTILE8608", "RRTILE5083", "GLASS_HEAVYBREAK"
+	8609 = DukeGenericDestructible, "RRTILE8609", "RRTILE5084", "GLASS_HEAVYBREAK"
+	8312 = DukeGenericDestructible, "RRTILE8312", "RRTILE5071", "POOLBUD"
+	8567 = DukeGenericDestructible, "RRTILE8567", "RRTILE5082", "GLASS_HEAVYBREAK"
+	8568 = DukeGenericDestructible, "RRTILE8568", "RRTILE5082", "GLASS_HEAVYBREAK"
+	8569 = DukeGenericDestructible, "RRTILE8569", "RRTILE5082", "GLASS_HEAVYBREAK"
+	8570 = DukeGenericDestructible, "RRTILE8570", "RRTILE5082", "GLASS_HEAVYBREAK"
+	8571 = DukeGenericDestructible, "RRTILE8571", "RRTILE5082", "GLASS_HEAVYBREAK"
+	8640 = DukeGenericDestructible, "RRTILE8640", "RRTILE5085", "GLASS_HEAVYBREAK"
+	8611 = DukeGenericDestructible, "RRTILE8611", "RRTILE5086", "GLASS_HEAVYBREAK"
+	8497 = DukeGenericDestructible, "RRTILE8497", "RRTILE5076", "GLASS_HEAVYBREAK"
+	8498 = DukeGenericDestructible, "RRTILE8498", "RRTILE5077", "GLASS_HEAVYBREAK"
+	8499 = DukeGenericDestructible, "RRTILE8499", "RRTILE5078", "GLASS_HEAVYBREAK"
+	8503 = DukeGenericDestructible, "RRTILE8503", "RRTILE5079", "GLASS_HEAVYBREAK"
+	7901 = DukeGenericDestructible, "RRTILE7901", "RRTILE5080", "GLASS_HEAVYBREAK"
+	7696 = DukeGenericDestructible, "RRTILE7696", "RRTILE7697", "WOODBREK"
+	7806 = DukeGenericDestructible, "RRTILE7806", "RRTILE5043", "GLASS_HEAVYBREAK"
+	7900 = DukeGenericDestructible, "RRTILE7900", "RRTILE5047", "GLASS_HEAVYBREAK"
+	7906 = DukeGenericDestructible, "RRTILE7906", "RRTILE5048", "GLASS_HEAVYBREAK"
+	7912 = DukeGenericDestructible, "RRTILE7912", "RRTILE5049", "GLASS_HEAVYBREAK"
+	7913 = DukeGenericDestructible, "RRTILE7913", "RRTILE5049", "GLASS_HEAVYBREAK"
+	8047 = DukeGenericDestructible, "RRTILE8047", "RRTILE5050", "GLASS_HEAVYBREAK"
+	8596 = DukeGenericDestructible, "RRTILE8596", "RRTILE8598", "GLASS_HEAVYBREAK"
+	8059 = DukeGenericDestructible, "RRTILE8059", "RRTILE5051", "GLASS_HEAVYBREAK"
+	8060 = DukeGenericDestructible, "RRTILE8060", "RRTILE5052", "GLASS_HEAVYBREAK"
+	8222 = DukeGenericDestructible, "RRTILE8222", "RRTILE5053", "GLASS_HEAVYBREAK"
+	8223 = DukeGenericDestructible, "RRTILE8223", "RRTILE5054", "GLASS_HEAVYBREAK"
+	8224 = DukeGenericDestructible, "RRTILE8224", "RRTILE5055", "GLASS_HEAVYBREAK"
+	8370 = DukeGenericDestructible, "RRTILE8370", "RRTILE5056", "GLASS_HEAVYBREAK"
+	8371 = DukeGenericDestructible, "RRTILE8371", "RRTILE5057", "GLASS_HEAVYBREAK"
+	8372 = DukeGenericDestructible, "RRTILE8372", "RRTILE5058", "GLASS_HEAVYBREAK"
+	8373 = DukeGenericDestructible, "RRTILE8373", "RRTILE5059", "GLASS_HEAVYBREAK"
+	8396 = DukeGenericDestructible, "RRTILE8396", "RRTILE5038", "GLASS_HEAVYBREAK"
+	8397 = DukeGenericDestructible, "RRTILE8397", "RRTILE5039", "GLASS_HEAVYBREAK"
+	8398 = DukeGenericDestructible, "RRTILE8398", "RRTILE5040", "GLASS_HEAVYBREAK"
+	8399 = DukeGenericDestructible, "RRTILE8399", "RRTILE5041", "GLASS_HEAVYBREAK"
+	8385 = DukeGenericDestructible, "RRTILE8385", "RRTILE8386", "GLASS_HEAVYBREAK"
+	8387 = DukeGenericDestructible, "RRTILE8387", "RRTILE8388", "GLASS_HEAVYBREAK"
+	8389 = DukeGenericDestructible, "RRTILE8389", "RRTILE8390", "GLASS_HEAVYBREAK"
+	8391 = DukeGenericDestructible, "RRTILE8391", "RRTILE8392", "GLASS_HEAVYBREAK"
+	7553 = DukeGenericDestructible, "RRTILE7553", "RRTILE5035", "GLASS_HEAVYBREAK"
+	8475 = DukeGenericDestructible, "RRTILE8475", "RRTILE5075", "GLASS_HEAVYBREAK"
+	8498 = DukeGenericDestructible, "RRTILE8498", "RRTILE5077", "GLASS_HEAVYBREAK"
+	8499 = DukeGenericDestructible, "RRTILE8499", "RRTILE5078", "GLASS_HEAVYBREAK"
+	2445 = DukeGenericDestructible, "RRTILE2445", "RRTILE2450", "GLASS_HEAVYBREAK"
+	7885 = DukeGenericDestructible, "RRTILE7885", "RRTILE5045", "SIGNHIT", damaging
+	7890 = DukeGenericDestructible, "RRTILE7890", "RRTILE5045", "SIGNHIT", damaging
+	7886 = DukeGenericDestructible, "RRTILE7886", "RRTILE5046", "SIGNHIT", damaging
+	7887 = DukeGenericDestructible, "RRTILE7887", "RRTILE5044", "GLASS_HEAVYBREAK", damaging
+	2123 = DukeGenericDestructible, "RRTILE2123", "RRTILE2124", "GLASS_BREAKING", damaging
+	3773 = DukeGenericDestructible, "RRTILE3773", "RRTILE8651", "GLASS_BREAKING", damaging
+	7533 = DukeGenericDestructible, "*RRTILE7533", "*RRTILE5035", "SIGNHIT", damaging
+	3584 = DukeGenericDestructible, "RRTILE3584", "RRTILE8681", "SIGNHIT", damaging
+	8394 = DukeGenericDestructible, "RRTILE8394", "RRTILE5072", "SIGNHIT"
+	8461 = DukeGenericDestructible, "RRTILE8461", "RRTILE5074", "GLASS_HEAVYBREAK"
+	8462 = DukeGenericDestructible, "RRTILE8462", "RRTILE5074", "GLASS_HEAVYBREAK"
+	8682 = DukeGenericDestructible, "RRTILE8682", "RRTILE8683", "GLASS_HEAVYBREAK"
+	1824 = DukeGenericDestructible, "YELLOWBOTTLE", "", "GLASS_HEAVYBREAK", spawnglass2
+	244 = DukeActor, "*WALLLIGHT3"
+	246 = DukeActor, "*WALLLIGHT1"
+	3668 = DukeActor, "*RRTILE3668"
+	3795 = DukeActor, "*RRTILE3795"
+	7505 = DukeActor, "*RRTILE7505"
+	7506 = DukeActor, "*RRTILE7506"
+
+}
diff --git a/wadsrc/static/filter/redneck/engine/engine.def b/wadsrc/static/filter/redneck/engine/engine.def
index 7d80021dc..9661840a9 100644
--- a/wadsrc/static/filter/redneck/engine/engine.def
+++ b/wadsrc/static/filter/redneck/engine/engine.def
@@ -1,275 +1,5 @@
 include "engine/defines.def"
 
-spawnclasses
-{
-	2 = DukeActivator
-	3 = DukeTouchplate
-	4 = DukeActivatorLocked
-	5 = DukeSoundController
-	6 = DukeLocator
-	7 = DukeCycler
-	8 = DukeMasterSwitch
-	9 = DukeRespawnController
-	10 = DukeGPSpeed
-	
-	18 = DukeTorchCtrl
-	35 = DukeLightningCtrl
-	68 = DukeShadeCtrl
-	67 = DukeDummyCtrl
-	71 = DukeSoundFX
-	
-	64 = RedneckMinecartDef
-	65 = RedneckMinecartSound
-	66 = RedneckMinecartInner
-	11 = RedneckJaildoorDef
-	38 = RedneckJaildoorSound
-	19 = RedneckGeometryEffect
-	34 = RedneckKeyinfoSetter
-
-	1298 = DukeCranePole
-	1299 = DukeCrane
-	1092 = DukeWaterFountain
-	1093 = DukeWaterFountain
-	1094 = DukeWaterFountain
-	1095 = DukeWaterFountain
-	1096 = DukeWaterFountainBroke
-	1211 = DukeBox
-	1191 = DukeTree1
-	1193 = DukeTree2
-	1230 = DukeTire
-	1194 = DukeCactus
-	1203 = DukeCactusBroke
-	1075 = DukeCrack
-	1076 = DukeCrack, "CRACK2"
-	1077 = DukeCrack, "CRACK3"
-	1078 = DukeCrack, "CRACK4"
-	1273 = DukeOozFilter
-	1324 = DukeSeenine
-	1346 = DukeTrash
-	1127 = DukeBolt1
-	1128 = DukeBolt2
-	1129 = DukeBolt3
-	1130 = DukeBolt4
-	239 = DukeWaterdrip
-	120 = DukeDoorshock
-	1309 = DukeCanWithSomething
-	1414 = DukeTongue
-	1439 = DukeInnerJaw
-	1440 = DukeInnerJaw1
-	866 = RedneckRespawnMarker
-	1344 = DukeRat
-	1759 = DukeForceSphere
-	1529 = DukeOoz
-	1525 = DukeBloodSplat1
-	1526 = DukeBloodSplat2
-	1527 = DukeBloodSplat3
-	1528 = DukeBloodSplat4
-	3420 = DukeFireLaser
-	3471 = RedneckOWhip
-	3475 = RedneckUWhip
-	2095 = RedneckVixenShot
-	1774 = RedneckDynamiteArrow
-	3390 = RedneckShitBall
-	3400 = RedneckSawBlade
-	1107 = DukeReactor2
-	1109 = DukeReactor2Spark
-	2239 = DukeReactor
-	2243 = DukeReactorSpark
-	2754 = DukeGenericPole2
-	3063 = DukeHangLight
-	2231 = DukeStatueFlash
-	1168 = DukeStatue
-	1280 = DukeBottle10
-	1172 = DukeVase
-	4095 = DukeFrameEffect
-	1200 = DukeNeon
-	1201 = DukeNeon, "NEON2"
-	1241 = DukeNeon, "NEON3"
-	1242 = DukeNeon, "NEON4"
-	1243 = DukeNeon, "NEON5"
-	1264 = DukeNeon, "NEON6"
-	1310 = RedneckFeather
-	1383 = DukeWaterSplash
-	1420 = RedneckMudSplash
-	1256 = DukeGlassPieces1
-	1257 = DukeGlassPieces2
-	1258 = DukeGlassPieces3
-	1702 = DukeShell
-	1704 = DukeShotgunShell
-	1303 = DukeBloodPool
-	210 = DukeFanSprite
-	1066 = DukeSatellite
-	1067 = DukeFuelPod
-	1114 = DukeSolarPanel
-	1117 = DukeAntenna
-	1228 = DukeHydrant
-	1124 = DukePipe1
-	1121 = DukePipe2
-	1123 = DukePipe3
-	1234 = DukePipe4
-	1232 = DukePipe5
-	1233 = DukePipe6
-	1152 = DukeChair3
-	1098 = DukeToilet
-	1100 = DukeStall
-	2121 = RedneckToiletSeat
-	2122 = RedneckToilet2
-	1097 = DukeFemMag
-	1106 = DukeFemMag, "FEMMAG2"
-	2264 = DukeMaskWall, "MASKWALL7"
-	1079 = DukeFootprints
-	1144 = DukeFootprints
-	1145 = DukeFootprints
-	1146 = DukeFootprints
-	1212 = DukeBulletHole
-	1083 = DukeCameraPole
-
-	26 = RedneckDynamite
-	1416 = RedneckMortar
-	285 = RedneckChickenSpawner1
-	286 = RedneckChickenSpawner2
-	287 = RedneckFeatherSpawner
-	288 = RedneckChickenHeadSpawner
-	289 = RedneckChickenLoafSpawner
-	290 = RedneckChickenNuggetSpawner
-	291 = RedneckChickenRoastSpawner
-	292 = RedneckBonelessSpawner
-	293 = RedneckJibsSpawner
-	7525 = RedneckRabbitSpawner
-	3190 = RedneckChickenA
-	3191 = RedneckChickenB
-	3192 = RedneckChickenC
-	3120 = RedneckChickenLoaf
-	3122 = RedneckChickenNugget
-	3123 = RedneckRoastedChicken
-	3124 = RedneckBonelessChicken
-	3132 = RedneckChickenHead
-	3410 = RedneckLumberBlade
-	295 = RedneckKegHolder
-	1463 = DukeJibs1
-	1468 = RedneckJibs2
-	1473 = DukeJibs3
-	1478 = DukeJibs4
-	1483 = DukeJibs5
-	1515 = DukeJibs6
-	4041 = DukePlayerTorso
-	4046 = DukePlayerGun
-	4055 = DukePlayerLeg
-	4235 = RedneckBillyJibA
-	4244 = RedneckBillyJibB
-	4748 = RedneckHulkJibA
-	4753 = RedneckHulkJibB
-	4758 = RedneckHulkJibB
-	5290 = RedneckMinJibA
-	5295 = RedneckMinJibB
-	5300 = RedneckMinJibB
-	5602 = RedneckCootJibA
-	5607 = RedneckCootJibB
-	5616 = RedneckCootJibB
-	280 = RedneckBowlingPinController
-	281 = RedneckBowlingSectorLink
-	282 = RedneckBowlingBallSpot
-	283 = RedneckBowlingPinSpot
-	3440 = RedneckBowlingPin
-	3430 = RedneckBowlingBall
-	4897 = RedneckHenstand
-	296 = RedneckTeleport
-	297 = RedneckTeleportDest
-	2137 = RedneckFlamingo
-	2151 = RedneckMarbleStatue
-	2152 = RedneckMarbleStatue2
-	
-	3114 = DukeGenericDestructible, "RRTILE3114", "RRTILE3117", "GLASS_BREAKING", spawnglass
-	2876 = DukeGenericDestructible, "RRTILE2876", "RRTILE2990", "GLASS_BREAKING", spawnglass
-	3152 = DukeGenericDestructible, "RRTILE3152", "RRTILE3218", "GLASS_BREAKING", spawnglass
-	3153 = DukeGenericDestructible, "RRTILE3153", "RRTILE3219", "GLASS_BREAKING", spawnglass
-	2030 = DukeGenericDestructible, "RRTILE2030", "RRTILE2034", "GLASS_BREAKING", spawnglass
-	2915 = DukeGenericDestructible, "RRTILE2915", "RRTILE2977", "GLASS_BREAKING", spawnglass
-	2893 = DukeGenericDestructible, "RRTILE2893", "RRTILE2978", "GLASS_BREAKING", spawnglass
-	3115 = DukeGenericDestructible, "RRTILE3115", "RRTILE3116", "GLASS_BREAKING", spawnglass
-	3171 = DukeGenericDestructible, "RRTILE3171", "RRTILE3216", "GLASS_BREAKING", spawnglass
-	2156 = DukeGenericDestructible, "*RRTILE2156", "*RRTILE2157", "GLASS_BREAKING", spawnglass
-	2158 = DukeGenericDestructible, "*RRTILE2158", "*RRTILE2159", "GLASS_BREAKING", spawnglass
-	2160 = DukeGenericDestructible, "*RRTILE2160", "*RRTILE2161", "GLASS_BREAKING", spawnglass
-	2175 = DukeGenericDestructible, "*RRTILE2175", "*RRTILE2176", "GLASS_BREAKING", spawnglass
-
-	234 = DukeGenericDestructible, "GRATE1", "BGRATE1", "VENT_BUST", solid, unblocking
-	2251 = DukeGenericDestructible, "CIRCLEPANNEL", "CIRCLEPANNELBROKE", "VENT_BUST", unblocking
-	343 = DukeGenericDestructible, "PANNEL2", "BPANNEL3", "VENT_BUST", solid, unblocking
-	1085 = DukeGenericDestructible, "CHAIR1", "BROKENCHAIR", solid, unblocking
-	1086 = DukeGenericDestructible, "CHAIR2", "BROKENCHAIR", solid, unblocking
-	1157 = DukeGenericDestructible, "CAMERALIGHT", "", "GLASS_HEAVYBREAK", spawnscrap
-	1158 = DukeGenericDestructible, "MOVIECAMERA", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	1150 = DukeGenericDestructible, "SCALE", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	1163 = DukeGenericDestructible, "IVUNIT", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	1164 = DukeGenericDestructible, "POT1", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	1165 = DukeGenericDestructible, "POT2", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	1166 = DukeGenericDestructible, "POT3", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	1141 = DukeGenericDestructible, "VACUUM", "", "GLASS_HEAVYBREAK", solid, spawnscrap
-	1080 = DukeGenericDestructible, "DOMELITE", "", "GLASS_HEAVYBREAK", blocking, spawnglass2
-	1215 = DukeGenericDestructible, "BOTTLE1", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1216 = DukeGenericDestructible, "BOTTLE2", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1217 = DukeGenericDestructible, "BOTTLE3", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1218 = DukeGenericDestructible, "BOTTLE4", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1219 = DukeGenericDestructible, "BOTTLE5", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1220 = DukeGenericDestructible, "BOTTLE6", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1221 = DukeGenericDestructible, "BOTTLE7", "", "GLASS_BREAKING", solid, spawnglass
-	1222 = DukeGenericDestructible, "BOTTLE8", "",  "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1281 = DukeGenericDestructible, "BOTTLE11", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1282 = DukeGenericDestructible, "BOTTLE12", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1283 = DukeGenericDestructible, "BOTTLE13", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1284 = DukeGenericDestructible, "BOTTLE14", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1285 = DukeGenericDestructible, "BOTTLE15", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1286 = DukeGenericDestructible, "BOTTLE16", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1287 = DukeGenericDestructible, "BOTTLE17", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1288 = DukeGenericDestructible, "BOTTLE18", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1289 = DukeGenericDestructible, "BOTTLE19", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-
-	2215 = DukeGenericDestructible, "WAITTOBESEATED", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1174 = DukeGenericDestructible, "SUSHIPLATE1", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1175 = DukeGenericDestructible, "SUSHIPLATE2", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1176 = DukeGenericDestructible, "SUSHIPLATE3", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1178 = DukeGenericDestructible, "SUSHIPLATE4", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-	1180 = DukeGenericDestructible, "SUSHIPLATE5", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
-
-	2654 = DukeGenericDestructible, "RRTILE2654", "", "GLASS_BREAKING", spawnglass
-	2656 = DukeGenericDestructible, "RRTILE2656", "", "GLASS_BREAKING", spawnglass
-	3172 = DukeGenericDestructible, "RRTILE3172", "", "GLASS_BREAKING", spawnglass
-	
-	1878 = DukeActor, "*RRTILE1878"
-	1952 = DukeActor, "*RRTILE1952"
-	1953 = DukeActor, "*RRTILE1953"
-	1990 = DukeActor, "*RRTILE1990"
-	2050 = DukeActor, "*RRTILE2050"
-	2056 = DukeActor, "*RRTILE2056"
-	2072 = DukeActor, "*RRTILE2072"
-	2075 = DukeActor, "*RRTILE2075"
-	2083 = DukeActor, "*RRTILE2083"
-	2097 = DukeActor, "*RRTILE2097"
-	2357 = DukeActor, "*RRTILE2357"
-	2564 = DukeActor, "*RRTILE2564"
-	2573 = DukeActor, "*RRTILE2573"
-	2574 = DukeActor, "*RRTILE2574"
-	2583 = DukeActor, "*RRTILE2583"
-	2604 = DukeActor, "*RRTILE2604"
-	2689 = DukeActor, "*RRTILE2689"
-	2893 = DukeActor, "*RRTILE2893"
-	2894 = DukeActor, "*RRTILE2894"
-	2915 = DukeActor, "*RRTILE2915"
-	2945 = DukeActor, "*RRTILE2945"
-	2946 = DukeActor, "*RRTILE2946"
-	2947 = DukeActor, "*RRTILE2947"
-	2948 = DukeActor, "*RRTILE2948"
-	2949 = DukeActor, "*RRTILE2949"
-	2977 = DukeActor, "*RRTILE2977"
-	2978 = DukeActor, "*RRTILE2978"
-	3116 = DukeActor, "*RRTILE3116"
-	3171 = DukeActor, "*RRTILE3171"
-	3216 = DukeActor, "*RRTILE3216"
-	3720 = DukeActor, "*RRTILE3720"
-	
-}
-
 
 tileflag TFLAG_WALLSWITCH {
 	HANDPRINTSWITCH
diff --git a/wadsrc/static/filter/redneck/rmapinfo.spawnclasses b/wadsrc/static/filter/redneck/rmapinfo.spawnclasses
new file mode 100644
index 000000000..6429e1d07
--- /dev/null
+++ b/wadsrc/static/filter/redneck/rmapinfo.spawnclasses
@@ -0,0 +1,270 @@
+spawnclasses
+{
+	2 = DukeActivator
+	3 = DukeTouchplate
+	4 = DukeActivatorLocked
+	5 = DukeSoundController
+	6 = DukeLocator
+	7 = DukeCycler
+	8 = DukeMasterSwitch
+	9 = DukeRespawnController
+	10 = DukeGPSpeed
+	
+	18 = DukeTorchCtrl
+	35 = DukeLightningCtrl
+	68 = DukeShadeCtrl
+	67 = DukeDummyCtrl
+	71 = DukeSoundFX
+	
+	64 = RedneckMinecartDef
+	65 = RedneckMinecartSound
+	66 = RedneckMinecartInner
+	11 = RedneckJaildoorDef
+	38 = RedneckJaildoorSound
+	19 = RedneckGeometryEffect
+	34 = RedneckKeyinfoSetter
+
+	1298 = DukeCranePole
+	1299 = DukeCrane
+	1092 = DukeWaterFountain
+	1093 = DukeWaterFountain
+	1094 = DukeWaterFountain
+	1095 = DukeWaterFountain
+	1096 = DukeWaterFountainBroke
+	1211 = DukeBox
+	1191 = DukeTree1
+	1193 = DukeTree2
+	1230 = DukeTire
+	1194 = DukeCactus
+	1203 = DukeCactusBroke
+	1075 = DukeCrack
+	1076 = DukeCrack, "CRACK2"
+	1077 = DukeCrack, "CRACK3"
+	1078 = DukeCrack, "CRACK4"
+	1273 = DukeOozFilter
+	1324 = DukeSeenine
+	1346 = DukeTrash
+	1127 = DukeBolt1
+	1128 = DukeBolt2
+	1129 = DukeBolt3
+	1130 = DukeBolt4
+	239 = DukeWaterdrip
+	120 = DukeDoorshock
+	1309 = DukeCanWithSomething
+	1414 = DukeTongue
+	1439 = DukeInnerJaw
+	1440 = DukeInnerJaw1
+	866 = RedneckRespawnMarker
+	1344 = DukeRat
+	1759 = DukeForceSphere
+	1529 = DukeOoz
+	1525 = DukeBloodSplat1
+	1526 = DukeBloodSplat2
+	1527 = DukeBloodSplat3
+	1528 = DukeBloodSplat4
+	3420 = DukeFireLaser
+	3471 = RedneckOWhip
+	3475 = RedneckUWhip
+	2095 = RedneckVixenShot
+	1774 = RedneckDynamiteArrow
+	3390 = RedneckShitBall
+	3400 = RedneckSawBlade
+	1107 = DukeReactor2
+	1109 = DukeReactor2Spark
+	2239 = DukeReactor
+	2243 = DukeReactorSpark
+	2754 = DukeGenericPole2
+	3063 = DukeHangLight
+	2231 = DukeStatueFlash
+	1168 = DukeStatue
+	1280 = DukeBottle10
+	1172 = DukeVase
+	4095 = DukeFrameEffect
+	1200 = DukeNeon
+	1201 = DukeNeon, "NEON2"
+	1241 = DukeNeon, "NEON3"
+	1242 = DukeNeon, "NEON4"
+	1243 = DukeNeon, "NEON5"
+	1264 = DukeNeon, "NEON6"
+	1310 = RedneckFeather
+	1383 = DukeWaterSplash
+	1420 = RedneckMudSplash
+	1256 = DukeGlassPieces
+	1257 = DukeGlassPieces1
+	1258 = DukeGlassPieces2
+	1702 = DukeShell
+	1704 = DukeShotgunShell
+	1303 = DukeBloodPool
+	210 = DukeFanSprite
+	1066 = DukeSatellite
+	1067 = DukeFuelPod
+	1114 = DukeSolarPanel
+	1117 = DukeAntenna
+	1228 = DukeHydrant
+	1124 = DukePipe1
+	1121 = DukePipe2
+	1123 = DukePipe3
+	1234 = DukePipe4
+	1232 = DukePipe5
+	1233 = DukePipe6
+	1152 = DukeChair3
+	1098 = DukeToilet
+	1100 = DukeStall
+	2121 = RedneckToiletSeat
+	2122 = RedneckToilet2
+	1097 = DukeFemMag
+	1106 = DukeFemMag, "FEMMAG2"
+	2264 = DukeMaskWall, "MASKWALL7"
+	1079 = DukeFootprints
+	1144 = DukeFootprints
+	1145 = DukeFootprints
+	1146 = DukeFootprints
+	1212 = DukeBulletHole
+	1083 = DukeCameraPole
+
+	26 = RedneckDynamite
+	1416 = RedneckMortar
+	285 = RedneckChickenSpawner1
+	286 = RedneckChickenSpawner2
+	287 = RedneckFeatherSpawner
+	288 = RedneckChickenHeadSpawner
+	289 = RedneckChickenLoafSpawner
+	290 = RedneckChickenNuggetSpawner
+	291 = RedneckChickenRoastSpawner
+	292 = RedneckBonelessSpawner
+	293 = RedneckJibsSpawner
+	7525 = RedneckRabbitSpawner
+	3190 = RedneckChickenA
+	3191 = RedneckChickenB
+	3192 = RedneckChickenC
+	3120 = RedneckChickenLoaf
+	3122 = RedneckChickenNugget
+	3123 = RedneckRoastedChicken
+	3124 = RedneckBonelessChicken
+	3132 = RedneckChickenHead
+	3410 = RedneckLumberBlade
+	295 = RedneckKegHolder
+	1463 = DukeJibs1
+	1468 = RedneckJibs2
+	1473 = DukeJibs3
+	1478 = DukeJibs4
+	1483 = DukeJibs5
+	1515 = DukeJibs6
+	4041 = DukePlayerTorso
+	4046 = DukePlayerGun
+	4055 = DukePlayerLeg
+	4235 = RedneckBillyJibA
+	4244 = RedneckBillyJibB
+	4748 = RedneckHulkJibA
+	4753 = RedneckHulkJibB
+	4758 = RedneckHulkJibB
+	5290 = RedneckMinJibA
+	5295 = RedneckMinJibB
+	5300 = RedneckMinJibB
+	5602 = RedneckCootJibA
+	5607 = RedneckCootJibB
+	5616 = RedneckCootJibB
+	280 = RedneckBowlingPinController
+	281 = RedneckBowlingSectorLink
+	282 = RedneckBowlingBallSpot
+	283 = RedneckBowlingPinSpot
+	3440 = RedneckBowlingPin
+	3430 = RedneckBowlingBall
+	4897 = RedneckHenstand
+	296 = RedneckTeleport
+	297 = RedneckTeleportDest
+	2137 = RedneckFlamingo
+	2151 = RedneckMarbleStatue
+	2152 = RedneckMarbleStatue2
+	
+	3114 = DukeGenericDestructible, "RRTILE3114", "RRTILE3117", "GLASS_BREAKING", spawnglass
+	2876 = DukeGenericDestructible, "RRTILE2876", "RRTILE2990", "GLASS_BREAKING", spawnglass
+	3152 = DukeGenericDestructible, "RRTILE3152", "RRTILE3218", "GLASS_BREAKING", spawnglass
+	3153 = DukeGenericDestructible, "RRTILE3153", "RRTILE3219", "GLASS_BREAKING", spawnglass
+	2030 = DukeGenericDestructible, "RRTILE2030", "RRTILE2034", "GLASS_BREAKING", spawnglass
+	2915 = DukeGenericDestructible, "RRTILE2915", "RRTILE2977", "GLASS_BREAKING", spawnglass
+	2893 = DukeGenericDestructible, "RRTILE2893", "RRTILE2978", "GLASS_BREAKING", spawnglass
+	3115 = DukeGenericDestructible, "RRTILE3115", "RRTILE3116", "GLASS_BREAKING", spawnglass
+	3171 = DukeGenericDestructible, "RRTILE3171", "RRTILE3216", "GLASS_BREAKING", spawnglass
+	2156 = DukeGenericDestructible, "*RRTILE2156", "*RRTILE2157", "GLASS_BREAKING", spawnglass
+	2158 = DukeGenericDestructible, "*RRTILE2158", "*RRTILE2159", "GLASS_BREAKING", spawnglass
+	2160 = DukeGenericDestructible, "*RRTILE2160", "*RRTILE2161", "GLASS_BREAKING", spawnglass
+	2175 = DukeGenericDestructible, "*RRTILE2175", "*RRTILE2176", "GLASS_BREAKING", spawnglass
+
+	234 = DukeGenericDestructible, "GRATE1", "BGRATE1", "VENT_BUST", solid, unblocking
+	2251 = DukeGenericDestructible, "CIRCLEPANNEL", "CIRCLEPANNELBROKE", "VENT_BUST", unblocking
+	343 = DukeGenericDestructible, "PANNEL2", "BPANNEL3", "VENT_BUST", solid, unblocking
+	1085 = DukeGenericDestructible, "CHAIR1", "BROKENCHAIR", "", solid, unblocking
+	1086 = DukeGenericDestructible, "CHAIR2", "BROKENCHAIR", "", solid, unblocking
+	1157 = DukeGenericDestructible, "CAMERALIGHT", "", "GLASS_HEAVYBREAK", spawnscrap
+	1158 = DukeGenericDestructible, "MOVIECAMERA", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	1150 = DukeGenericDestructible, "SCALE", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	1163 = DukeGenericDestructible, "IVUNIT", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	1164 = DukeGenericDestructible, "POT1", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	1165 = DukeGenericDestructible, "POT2", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	1166 = DukeGenericDestructible, "POT3", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	1141 = DukeGenericDestructible, "VACUUM", "", "GLASS_HEAVYBREAK", solid, spawnscrap
+	1080 = DukeGenericDestructible, "DOMELITE", "", "GLASS_HEAVYBREAK", blocking, spawnglass2
+	1215 = DukeGenericDestructible, "BOTTLE1", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1216 = DukeGenericDestructible, "BOTTLE2", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1217 = DukeGenericDestructible, "BOTTLE3", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1218 = DukeGenericDestructible, "BOTTLE4", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1219 = DukeGenericDestructible, "BOTTLE5", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1220 = DukeGenericDestructible, "BOTTLE6", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1221 = DukeGenericDestructible, "BOTTLE7", "", "GLASS_BREAKING", solid, spawnglass
+	1222 = DukeGenericDestructible, "BOTTLE8", "",  "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1281 = DukeGenericDestructible, "BOTTLE11", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1282 = DukeGenericDestructible, "BOTTLE12", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1283 = DukeGenericDestructible, "BOTTLE13", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1284 = DukeGenericDestructible, "BOTTLE14", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1285 = DukeGenericDestructible, "BOTTLE15", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1286 = DukeGenericDestructible, "BOTTLE16", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1287 = DukeGenericDestructible, "BOTTLE17", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1288 = DukeGenericDestructible, "BOTTLE18", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1289 = DukeGenericDestructible, "BOTTLE19", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+
+	2215 = DukeGenericDestructible, "WAITTOBESEATED", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1174 = DukeGenericDestructible, "SUSHIPLATE1", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1175 = DukeGenericDestructible, "SUSHIPLATE2", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1176 = DukeGenericDestructible, "SUSHIPLATE3", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1178 = DukeGenericDestructible, "SUSHIPLATE4", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+	1180 = DukeGenericDestructible, "SUSHIPLATE5", "", "GLASS_HEAVYBREAK", 8, blocking, spawnglass2
+
+	2654 = DukeGenericDestructible, "RRTILE2654", "", "GLASS_BREAKING", spawnglass
+	2656 = DukeGenericDestructible, "RRTILE2656", "", "GLASS_BREAKING", spawnglass
+	3172 = DukeGenericDestructible, "RRTILE3172", "", "GLASS_BREAKING", spawnglass
+	
+	1878 = DukeActor, "*RRTILE1878"
+	1952 = DukeActor, "*RRTILE1952"
+	1953 = DukeActor, "*RRTILE1953"
+	1990 = DukeActor, "*RRTILE1990"
+	2050 = DukeActor, "*RRTILE2050"
+	2056 = DukeActor, "*RRTILE2056"
+	2072 = DukeActor, "*RRTILE2072"
+	2075 = DukeActor, "*RRTILE2075"
+	2083 = DukeActor, "*RRTILE2083"
+	2097 = DukeActor, "*RRTILE2097"
+	2357 = DukeActor, "*RRTILE2357"
+	2564 = DukeActor, "*RRTILE2564"
+	2573 = DukeActor, "*RRTILE2573"
+	2574 = DukeActor, "*RRTILE2574"
+	2583 = DukeActor, "*RRTILE2583"
+	2604 = DukeActor, "*RRTILE2604"
+	2689 = DukeActor, "*RRTILE2689"
+	2893 = DukeActor, "*RRTILE2893"
+	2894 = DukeActor, "*RRTILE2894"
+	2915 = DukeActor, "*RRTILE2915"
+	2945 = DukeActor, "*RRTILE2945"
+	2946 = DukeActor, "*RRTILE2946"
+	2947 = DukeActor, "*RRTILE2947"
+	2948 = DukeActor, "*RRTILE2948"
+	2949 = DukeActor, "*RRTILE2949"
+	2977 = DukeActor, "*RRTILE2977"
+	2978 = DukeActor, "*RRTILE2978"
+	3116 = DukeActor, "*RRTILE3116"
+	3171 = DukeActor, "*RRTILE3171"
+	3216 = DukeActor, "*RRTILE3216"
+	3720 = DukeActor, "*RRTILE3720"
+	
+}
+
diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt
index 94e55e32f..76b4d9d4e 100644
--- a/wadsrc/static/zscript.txt
+++ b/wadsrc/static/zscript.txt
@@ -63,6 +63,7 @@ version "4.10"
 
 #include "zscript/games/duke/actors/dukemisc.zs"
 #include "zscript/games/duke/actors/projectiles.zs"
+#include "zscript/games/duke/actors/mortar.zs"
 #include "zscript/games/duke/actors/rat.zs"
 #include "zscript/games/duke/actors/jibs.zs"
 #include "zscript/games/duke/actors/crane.zs"
diff --git a/wadsrc/static/zscript/games/duke/actors/greenslime.zs b/wadsrc/static/zscript/games/duke/actors/greenslime.zs
index 8f2d2292e..8c83a2405 100644
--- a/wadsrc/static/zscript/games/duke/actors/greenslime.zs
+++ b/wadsrc/static/zscript/games/duke/actors/greenslime.zs
@@ -74,7 +74,7 @@ class DukeGreenSlime : DukeActor
 					let vel = frandom(0, 2) + 2;
 					let zvel = 4 - frandom(0, 4);
 
-					static const name pieces[] = {'DukeGlassPieces', 'DukeGlassPieces', 'DukeGlassPieces'};
+					static const name pieces[] = {'DukeGlassPieces', 'DukeGlassPieces1', 'DukeGlassPieces2'};
 					let k = dlevel.SpawnActor(self.sector, self.pos, pieces[j % 3], -32, (0.5625, 0.5625), a, vel, zvel, self, STAT_MISC);
 					if (k) k.pal = 1;
 				}
diff --git a/wadsrc/static/zscript/games/duke/actors/mortar.zs b/wadsrc/static/zscript/games/duke/actors/mortar.zs
index d44eba925..4ebe6c0cd 100644
--- a/wadsrc/static/zscript/games/duke/actors/mortar.zs
+++ b/wadsrc/static/zscript/games/duke/actors/mortar.zs
@@ -177,7 +177,7 @@ class DukeBounceMine : DukeMortar
 	}
 }
 
-class RedneckNortar : DukeMortar
+class RedneckMortar : DukeMortar
 {
 	default
 	{
diff --git a/wadsrc/static/zscript/games/duke/world/redneckbreak.zs b/wadsrc/static/zscript/games/duke/world/redneckbreak.zs
index 3f4e72090..f564d9288 100644
--- a/wadsrc/static/zscript/games/duke/world/redneckbreak.zs
+++ b/wadsrc/static/zscript/games/duke/world/redneckbreak.zs
@@ -1,5 +1,7 @@
-// Container for handler functions that handle walls with breakable textures
-struct RedneckBreakWalls
+// Container for handler functions that handle walls with breakable textures.
+// Note that this must be a class, not a struct, so that the internal lookup functions can find it.
+
+class RedneckBreakWalls
 {
 
 	static void breakwall(TextureID newpn, DukeActor spr, walltype wal)