diff --git a/enumtables.ps1 b/enumtables.ps1
index 45aed8433e1ef2da58336766cbf696d6b65ccf5b..eecc61ea8ff341a28874790fd53c2b74c9d53deb 100644
--- a/enumtables.ps1
+++ b/enumtables.ps1
@@ -16,9 +16,9 @@ if ($args.Count -gt 0)
     $path = $args[0]
 }
 
-# bash can't match whitespaces, so each // ENUMTABLES
+# bash can't match whitespaces, so each // ENUMTABLE
 # directive cannot be indented.
-$enumtables_line = '^\s*// ENUMTABLES '
+$enumtables_line = '^\s*// ENUMTABLE '
 
 $global:state = [PSCustomObject]@{
     enumtables = [IO.File]::ReadAllText("$PSScriptRoot\enumtables.txt")
@@ -37,8 +37,8 @@ function Read-Line {
     param( [string]$line )
     if ($line -match $enumtables_line)
     {
-        # // ENUMTABLES BEGIN TABLE_NAME ACTION_NAME ARG1 ARG2
-        # [0][1]        [2]   [3]        [4]         [5]  [6]
+        # // ENUMTABLE BEGIN TABLE_NAME ACTION_NAME ARG1 ARG2
+        # [0][1]       [2]   [3]        [4]         [5]  [6]
         $tokens = $line.Trim().Split(" ")
 
         if ($tokens[2] -match "BEGIN")
@@ -57,7 +57,7 @@ function Read-Line {
         elseif ($tokens[2] -match "END")
         {
             # Use TrimEnd on strings to achieve consistency with bash
-            $global:state.enumtables = $global:state.enumtables -replace "// ENUMTABLES SET $($tokens[3])", ($global:state.entries -join "`n").TrimEnd()
+            $global:state.enumtables = $global:state.enumtables -replace "// ENUMTABLE SET $($tokens[3])", ($global:state.entries -join "`n").TrimEnd()
 
             $global:state.do_generic = $false
             $global:state.do_actions = $false
@@ -84,7 +84,7 @@ function Read-Line {
 
         if ($line -match "^\t$($global:state.prefix_in)(?<Name>[^ \=,]+?)[ \=,]")
         {
-            $global:state.entry_line = "`t`"{0}{1}`"," -f $global:state.prefix_out, $Matches.Name
+            $global:state.entry_line = "`t`"{0}{1}`"," -f $global:state.prefix_out, $Matches.Name.ToUpper()
             $global:state.entries.Add($global:state.entry_line)
         }
         else
@@ -117,6 +117,18 @@ function Read-Line {
 [System.IO.File]::ReadLines("$path\p_mobj.h") | ForEach-Object {
     Read-Line -line $_
 }
+[System.IO.File]::ReadLines("$path\doomstat.h") | ForEach-Object {
+    Read-Line -line $_
+}
+[System.IO.File]::ReadLines("$path\d_player.h") | ForEach-Object {
+    Read-Line -line $_
+}
+[System.IO.File]::ReadLines("$path\m_menu.h") | ForEach-Object {
+    Read-Line -line $_
+}
+[System.IO.File]::ReadLines("$path\st_stuff.h") | ForEach-Object {
+    Read-Line -line $_
+}
 
 # Use TrimEnd on strings to achieve consistency with bash
 Set-Content "$path\enumtables.c" $global:state.enumtables.TrimEnd()
diff --git a/enumtables.sh b/enumtables.sh
index fc8f7a2fff51360960d634a8e23f131f50f80872..e003b661bcb71c19952539e4d8824015a4c2db77 100755
--- a/enumtables.sh
+++ b/enumtables.sh
@@ -22,9 +22,9 @@ SCRIPTPATH=`dirname $SCRIPT`
 
 enumtables=`cat $SCRIPTPATH/enumtables.txt`
 
-# bash can't match whitespaces, so each // ENUMTABLES
+# bash can't match whitespaces, so each // ENUMTABLE
 # directive cannot be indented.
-enumtables_line="^\s*// ENUMTABLES "
+enumtables_line="^\s*// ENUMTABLE "
 action_match="^\s*void A_(.*)\(\);"
 
 do_generic=0
@@ -39,8 +39,8 @@ entries=""
 function process_line () {
     line=$1
     if [[ "$line" =~ $enumtables_line ]]; then
-        # // ENUMTABLES BEGIN TABLE_NAME ACTION_NAME ARG1 ARG2
-        # [0][1]        [2]   [3]        [4]         [5]  [6]
+        # // ENUMTABLE BEGIN TABLE_NAME ACTION_NAME ARG1 ARG2
+        # [0][1]       [2]   [3]        [4]         [5]  [6]
         # Trim trailing newlines to prevent match bugs
         tokens=($line)
         verb_name="`echo ${tokens[2]} | tr -d '\r'`"
@@ -58,12 +58,12 @@ function process_line () {
             fi
         elif [[ "$verb_name" == "END" ]]; then
             if [[ "$do_generic" == "1" ]]; then
-                entries="`echo -e \"$entries\" | sed -r \"s/^\t$prefix_in([^ \=,]*?).*[ \=\/,].*/\t\\\"$prefix_out\1\\\",/\"`"
+                entries="`echo -e \"$entries\" | sed -r \"s/^\t$prefix_in([^ \=,]*?).*[ \=\/,].*/\t\\\"$prefix_out\U\1\\\",/\"`"
             elif [[ "$do_actions" == "1" ]]; then
                 entries="`echo -e \"$entries\"`"
             fi
 
-            enumtables="${enumtables/\/\/ ENUMTABLES SET $table_name/$entries}"
+            enumtables="${enumtables/\/\/ ENUMTABLE SET $table_name/$entries}"
 
             do_generic=0
             do_actions=0
@@ -115,4 +115,20 @@ while IFS= read -r line; do
     process_line "$line"
 done < "$path/p_mobj.h"
 
+while IFS= read -r line; do
+    process_line "$line"
+done < "$path/doomstat.h"
+
+while IFS= read -r line; do
+    process_line "$line"
+done < "$path/d_player.h"
+
+while IFS= read -r line; do
+    process_line "$line"
+done < "$path/m_menu.h"
+
+while IFS= read -r line; do
+    process_line "$line"
+done < "$path/st_stuff.h"
+
 echo "$enumtables" > "$path/enumtables.c"
diff --git a/enumtables.txt b/enumtables.txt
index aeaf6ce2f088cd7c480c35c74d2891436fea1fa0..82bf8c95d75c5f9eeac4f4d7034ef9e5dbaeff87 100644
--- a/enumtables.txt
+++ b/enumtables.txt
@@ -22,10 +22,42 @@
 #include "info.h"
 
 const char *const MOBJFLAG_LIST[] = {
-// ENUMTABLES SET MOBJFLAG_LIST
+// ENUMTABLE SET MOBJFLAG_LIST
     NULL
 };
 
+const char *const MOBJFLAG2_LIST[] = {
+// ENUMTABLE SET MOBJFLAG2_LIST
+    NULL
+};
+
+const char *const MOBJEFLAG_LIST[] = {
+// ENUMTABLE SET MOBJEFLAG_LIST
+    NULL
+};
+
+const char *const PLAYERFLAG_LIST[] = {
+// ENUMTABLE SET PLAYERFLAG_LIST
+    NULL
+};
+
+const char *const GAMETYPERULE_LIST[] = {
+// ENUMTABLE SET GAMETYPERULE_LIST
+    NULL
+};
+
+const char *const POWERS_LIST[] = {
+// ENUMTABLE SET POWERS_LIST
+};
+
+const char *const HUDITEMS_LIST[] = {
+// ENUMTABLE SET HUDITEMS_LIST
+};
+
+const char *const MENUTYPES_LIST[] = {
+// ENUMTABLE SET MENUTYPES_LIST
+};
+
 ////////////////////////////////////////////////////////////////////////////////
 // CRAZY LIST OF STATE NAMES AND ALL FROM HERE DOWN
 
@@ -33,7 +65,7 @@ const char *const MOBJFLAG_LIST[] = {
 // I am leaving the prefixes solely for clarity to programmers,
 // because sadly no one remembers this place while searching for full state names.
 const char *const STATE_LIST[] = {
-// ENUMTABLES SET STATE_LIST
+// ENUMTABLE SET STATE_LIST
 
 #ifdef SEENAMES
     "S_NAMECHECK",
@@ -44,7 +76,7 @@ const char *const STATE_LIST[] = {
 // I am leaving the prefixes solely for clarity to programmers,
 // because sadly no one remembers this place while searching for full state names.
 const char *const MOBJTYPE_LIST[] = {
-// ENUMTABLES SET MOBJTYPE_LIST
+// ENUMTABLE SET MOBJTYPE_LIST
 
 #ifdef SEENAMES
     "MT_NAMECHECK",
@@ -56,7 +88,7 @@ const char *const MOBJTYPE_LIST[] = {
   */
 actionpointer_t actionpointers[] =
 {
-// ENUMTABLES SET actionpointers
+// ENUMTABLE SET actionpointers
     {{NULL}, "NONE"},
 
 	// This NULL entry must be the last in the list
diff --git a/src/d_player.h b/src/d_player.h
index 8697e9836929c0e269f61127d7245686e71b0232..c8b3c6c0d654a71544f3c4b3954b3e309b735043 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -100,6 +100,7 @@ typedef enum
 //
 typedef enum
 {
+// ENUMTABLE BEGIN PLAYERFLAG_LIST do_generic PF_
 	// Cvars
 	PF_FLIPCAM       = 1, // Flip camera angle with gravity flip prefrence.
 	PF_ANALOGMODE    = 1<<1, // Analog mode?
@@ -155,6 +156,7 @@ typedef enum
 	PF_FINISHED    = 1<<30, // The player finished the level. NOT the same as exiting
 
 	// up to 1<<31 is free
+// ENUMTABLE END PLAYERFLAG_LIST
 } pflags_t;
 
 typedef enum
@@ -245,6 +247,7 @@ typedef enum
 // Player powers. (don't edit this comment)
 typedef enum
 {
+// ENUMTABLE BEGIN POWERS_LIST do_generic pw_
 	pw_invulnerability,
 	pw_sneakers,
 	pw_flashing,
@@ -284,6 +287,8 @@ typedef enum
 
 	pw_justlaunched, // Launched off a slope this tic (0=none, 1=standard launch, 2=half-pipe launch)
 
+// ENUMTABLE END POWERS_LIST
+
 	NUMPOWERS
 } powertype_t;
 
diff --git a/src/dehacked.c b/src/dehacked.c
index 7e0eb44affcea83337f3856e2c1960717a3e718e..2d81f8b71a5c05eb7c4cd5a9767b5f0bcb5fe820 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -1114,7 +1114,6 @@ static void readsprite2(MYFILE *f, INT32 num)
 }
 
 // copypasted from readPlayer :]
-static const char *const GAMETYPERULE_LIST[];
 static void readgametype(MYFILE *f, char *gtname)
 {
 	char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
@@ -4597,57 +4596,6 @@ void DEH_LoadDehackedLump(lumpnum_t lumpnum)
 	DEH_LoadDehackedLumpPwad(WADFILENUM(lumpnum),LUMPNUM(lumpnum), false);
 }
 
-// \tMF2_(\S+).*// (.+) --> \t"\1", // \2
-static const char *const MOBJFLAG2_LIST[] = {
-	"AXIS",			  // It's a NiGHTS axis! (For faster checking)
-	"TWOD",			  // Moves like it's in a 2D level
-	"DONTRESPAWN",	  // Don't respawn this object!
-	"DONTDRAW",		  // Don't generate a vissprite
-	"AUTOMATIC",	  // Thrown ring has automatic properties
-	"RAILRING",		  // Thrown ring has rail properties
-	"BOUNCERING",	  // Thrown ring has bounce properties
-	"EXPLOSION",	  // Thrown ring has explosive properties
-	"SCATTER",		  // Thrown ring has scatter properties
-	"BEYONDTHEGRAVE", // Source of this missile has died and has since respawned.
-	"SLIDEPUSH",	  // MF_PUSHABLE that pushes continuously.
-	"CLASSICPUSH",    // Drops straight down when object has negative momz.
-	"INVERTAIMABLE",  // Flips whether it's targetable by A_LookForEnemies (enemies no, decoys yes)
-	"INFLOAT",		  // Floating to a height for a move, don't auto float to target's height.
-	"DEBRIS",		  // Splash ring from explosion ring
-	"NIGHTSPULL",	  // Attracted from a paraloop
-	"JUSTATTACKED",	  // can be pushed by other moving mobjs
-	"FIRING",		  // turret fire
-	"SUPERFIRE",	  // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it.
-	"SHADOW",		  // Fuzzy draw, makes targeting harder.
-	"STRONGBOX",	  // Flag used for "strong" random monitors.
-	"OBJECTFLIP",	  // Flag for objects that always have flipped gravity.
-	"SKULLFLY",		  // Special handling: skull in flight.
-	"FRET",			  // Flashing from a previous hit
-	"BOSSNOTRAP",	  // No Egg Trap after boss
-	"BOSSFLEE",		  // Boss is fleeing!
-	"BOSSDEAD",		  // Boss is dead! (Not necessarily fleeing, if a fleeing point doesn't exist.)
-	"AMBUSH",         // Alternate behaviour typically set by MTF_AMBUSH
-	"LINKDRAW",       // Draw vissprite of mobj immediately before/after tracer's vissprite (dependent on dispoffset and position)
-	"SHIELD",         // Thinker calls P_AddShield/P_ShieldLook (must be partnered with MF_SCENERY to use)
-	NULL
-};
-
-static const char *const MOBJEFLAG_LIST[] = {
-	"ONGROUND", // The mobj stands on solid floor (not on another mobj or in air)
-	"JUSTHITFLOOR", // The mobj just hit the floor while falling, this is cleared on next frame
-	"TOUCHWATER", // The mobj stands in a sector with water, and touches the surface
-	"UNDERWATER", // The mobj stands in a sector with water, and his waist is BELOW the water surface
-	"JUSTSTEPPEDDOWN", // used for ramp sectors
-	"VERTICALFLIP", // Vertically flip sprite/allow upside-down physics
-	"GOOWATER", // Goo water
-	"TOUCHLAVA", // The mobj is touching a lava block
-	"PUSHED", // Mobj was already pushed this tic
-	"SPRUNG", // Mobj was already sprung this tic
-	"APPLYPMOMZ", // Platform movement
-	"TRACERANGLE", // Compute and trigger on mobj angle relative to tracer
-	NULL
-};
-
 static const char *const MAPTHINGFLAG_LIST[4] = {
 	"EXTRA", // Extra flag for objects.
 	"OBJECTFLIP", // Reverse gravity flag for objects.
@@ -4655,101 +4603,6 @@ static const char *const MAPTHINGFLAG_LIST[4] = {
 	"AMBUSH" // Deaf monsters/do not react to sound.
 };
 
-static const char *const PLAYERFLAG_LIST[] = {
-
-	// Cvars
-	"FLIPCAM", // Flip camera angle with gravity flip prefrence.
-	"ANALOGMODE", // Analog mode?
-	"DIRECTIONCHAR", // Directional character sprites?
-	"AUTOBRAKE", // Autobrake?
-
-	// Cheats
-	"GODMODE",
-	"NOCLIP",
-	"INVIS",
-
-	// True if button down last tic.
-	"ATTACKDOWN",
-	"USEDOWN",
-	"JUMPDOWN",
-	"WPNDOWN",
-
-	// Unmoving states
-	"STASIS", // Player is not allowed to move
-	"JUMPSTASIS", // and that includes jumping.
-	// (we don't include FULLSTASIS here I guess because it's just those two together...?)
-
-	// Applying autobrake?
-	"APPLYAUTOBRAKE",
-
-	// Character action status
-	"STARTJUMP",
-	"JUMPED",
-	"NOJUMPDAMAGE",
-
-	"SPINNING",
-	"STARTDASH",
-
-	"THOKKED",
-	"SHIELDABILITY",
-	"GLIDING",
-	"BOUNCING",
-
-	// Sliding (usually in water) like Labyrinth/Oil Ocean
-	"SLIDING",
-
-	// NiGHTS stuff
-	"TRANSFERTOCLOSEST",
-	"DRILLING",
-
-	// Gametype-specific stuff
-	"GAMETYPEOVER", // Race time over, or H&S out-of-game
-	"TAGIT", // The player is it! For Tag Mode
-
-	/*** misc ***/
-	"FORCESTRAFE", // Translate turn inputs into strafe inputs
-	"CANCARRY", // Can carry?
-	"FINISHED",
-
-	NULL // stop loop here.
-};
-
-static const char *const GAMETYPERULE_LIST[] = {
-	"CAMPAIGN",
-	"RINGSLINGER",
-	"SPECTATORS",
-	"LIVES",
-	"TEAMS",
-	"FIRSTPERSON",
-	"POWERSTONES",
-	"TEAMFLAGS",
-	"FRIENDLY",
-	"SPECIALSTAGES",
-	"EMERALDTOKENS",
-	"EMERALDHUNT",
-	"RACE",
-	"TAG",
-	"POINTLIMIT",
-	"TIMELIMIT",
-	"OVERTIME",
-	"HURTMESSAGES",
-	"FRIENDLYFIRE",
-	"STARTCOUNTDOWN",
-	"HIDEFROZEN",
-	"BLINDFOLDED",
-	"RESPAWNDELAY",
-	"PITYSHIELD",
-	"DEATHPENALTY",
-	"NOSPECTATORSPAWN",
-	"DEATHMATCHSTARTS",
-	"SPAWNINVUL",
-	"SPAWNENEMIES",
-	"ALLOWEXIT",
-	"NOTITLECARD",
-	"CUTSCENES",
-	NULL
-};
-
 // Linedef flags
 static const char *const ML_LIST[16] = {
 	"IMPASSIBLE",
@@ -4905,174 +4758,6 @@ static const char *COLOR_ENUMS[] = {
 	"SUPERTAN5"		// SKINCOLOR_SUPERTAN5,
 };
 
-static const char *const POWERS_LIST[] = {
-	"INVULNERABILITY",
-	"SNEAKERS",
-	"FLASHING",
-	"SHIELD",
-	"CARRY",
-	"TAILSFLY", // tails flying
-	"UNDERWATER", // underwater timer
-	"SPACETIME", // In space, no one can hear you spin!
-	"EXTRALIFE", // Extra Life timer
-	"PUSHING",
-	"JUSTSPRUNG",
-	"NOAUTOBRAKE",
-
-	"SUPER", // Are you super?
-	"GRAVITYBOOTS", // gravity boots
-
-	// Weapon ammunition
-	"INFINITYRING",
-	"AUTOMATICRING",
-	"BOUNCERING",
-	"SCATTERRING",
-	"GRENADERING",
-	"EXPLOSIONRING",
-	"RAILRING",
-
-	// Power Stones
-	"EMERALDS", // stored like global 'emeralds' variable
-
-	// NiGHTS powerups
-	"NIGHTS_SUPERLOOP",
-	"NIGHTS_HELPER",
-	"NIGHTS_LINKFREEZE",
-
-	//for linedef exec 427
-	"NOCONTROL",
-
-	//for dyes
-	"DYE",
-
-	"JUSTLAUNCHED"
-};
-
-static const char *const HUDITEMS_LIST[] = {
-	"LIVES",
-
-	"RINGS",
-	"RINGSNUM",
-	"RINGSNUMTICS",
-
-	"SCORE",
-	"SCORENUM",
-
-	"TIME",
-	"MINUTES",
-	"TIMECOLON",
-	"SECONDS",
-	"TIMETICCOLON",
-	"TICS",
-
-	"SS_TOTALRINGS",
-
-	"GETRINGS",
-	"GETRINGSNUM",
-	"TIMELEFT",
-	"TIMELEFTNUM",
-	"TIMEUP",
-	"HUNTPICS",
-	"POWERUPS"
-};
-
-static const char *const MENUTYPES_LIST[] = {
-	"NONE",
-
-	"MAIN",
-
-	// Single Player
-	"SP_MAIN",
-
-	"SP_LOAD",
-	"SP_PLAYER",
-
-	"SP_LEVELSELECT",
-	"SP_LEVELSTATS",
-
-	"SP_TIMEATTACK",
-	"SP_TIMEATTACK_LEVELSELECT",
-	"SP_GUESTREPLAY",
-	"SP_REPLAY",
-	"SP_GHOST",
-
-	"SP_NIGHTSATTACK",
-	"SP_NIGHTS_LEVELSELECT",
-	"SP_NIGHTS_GUESTREPLAY",
-	"SP_NIGHTS_REPLAY",
-	"SP_NIGHTS_GHOST",
-
-	// Multiplayer
-	"MP_MAIN",
-	"MP_SPLITSCREEN", // SplitServer
-	"MP_SERVER",
-	"MP_CONNECT",
-	"MP_ROOM",
-	"MP_PLAYERSETUP", // MP_PlayerSetupDef shared with SPLITSCREEN if #defined NONET
-	"MP_SERVER_OPTIONS",
-
-	// Options
-	"OP_MAIN",
-
-	"OP_P1CONTROLS",
-	"OP_CHANGECONTROLS", // OP_ChangeControlsDef shared with P2
-	"OP_P1MOUSE",
-	"OP_P1JOYSTICK",
-	"OP_JOYSTICKSET", // OP_JoystickSetDef shared with P2
-	"OP_P1CAMERA",
-
-	"OP_P2CONTROLS",
-	"OP_P2MOUSE",
-	"OP_P2JOYSTICK",
-	"OP_P2CAMERA",
-
-	"OP_PLAYSTYLE",
-
-	"OP_VIDEO",
-	"OP_VIDEOMODE",
-	"OP_COLOR",
-	"OP_OPENGL",
-	"OP_OPENGL_LIGHTING",
-	"OP_OPENGL_FOG",
-	"OP_OPENGL_COLOR",
-
-	"OP_SOUND",
-
-	"OP_SERVER",
-	"OP_MONITORTOGGLE",
-
-	"OP_DATA",
-	"OP_ADDONS",
-	"OP_SCREENSHOTS",
-	"OP_ERASEDATA",
-
-	// Extras
-	"SR_MAIN",
-	"SR_PANDORA",
-	"SR_LEVELSELECT",
-	"SR_UNLOCKCHECKLIST",
-	"SR_EMBLEMHINT",
-	"SR_PLAYER",
-	"SR_SOUNDTEST",
-
-	// Addons (Part of MISC, but let's make it our own)
-	"AD_MAIN",
-
-	// MISC
-	// "MESSAGE",
-	// "SPAUSE",
-
-	// "MPAUSE",
-	// "SCRAMBLETEAM",
-	// "CHANGETEAM",
-	// "CHANGELEVEL",
-
-	// "MAPAUSE",
-	// "HELP",
-
-	"SPECIAL"
-};
-
 struct {
 	const char *n;
 	// has to be able to hold both fixed_t and angle_t, so drastic measure!!
diff --git a/src/doomstat.h b/src/doomstat.h
index 0c2f1e975144d8ef9464afd57692539a56df4a3e..b355ee72b72d06460e31fe59d0d2b41eafbacdc1 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -402,6 +402,7 @@ enum GameType
 // Gametype rules
 enum GameTypeRules
 {
+// ENUMTABLE BEGIN GAMETYPERULE_LIST do_generic GTR_
 	GTR_CAMPAIGN         = 1,     // Linear Co-op map progression, don't allow random maps
 	GTR_RINGSLINGER      = 1<<1,  // Outside of Co-op, Competition, and Race (overriden by cv_ringslinger)
 	GTR_SPECTATORS       = 1<<2,  // Outside of Co-op, Competition, and Race
@@ -434,6 +435,7 @@ enum GameTypeRules
 	GTR_ALLOWEXIT        = 1<<29, // Allow exit sectors
 	GTR_NOTITLECARD      = 1<<30, // Don't show the title card
 	GTR_CUTSCENES        = 1<<31, // Play cutscenes, ending, credits, and evaluation
+// ENUMTABLE END GAMETYPERULE_LIST
 };
 
 // String names for gametypes
diff --git a/src/enumtables.h b/src/enumtables.h
index 2f8812b6590ec6a231a736743ed22d700470e2f7..1196459ea462f5533c8a67ae94d34529f3d4c8a6 100644
--- a/src/enumtables.h
+++ b/src/enumtables.h
@@ -14,6 +14,20 @@
 
 extern const char *const MOBJFLAG_LIST[];
 
+extern const char *const MOBJFLAG2_LIST[];
+
+extern const char *const MOBJEFLAG_LIST[];
+
+extern const char *const PLAYERFLAG_LIST[];
+
+extern const char *const GAMETYPERULE_LIST[];
+
+extern const char *const POWERS_LIST[];
+
+extern const char *const HUDITEMS_LIST[];
+
+extern const char *const MENUTYPES_LIST[];
+
 extern const char *const STATE_LIST[];
 
 extern const char *const MOBJTYPE_LIST[];
diff --git a/src/info.h b/src/info.h
index 140a0bc5eaf198b6525d61216f294bcc02239682..d5171c5626a80200dac4edeb399ca57c10f7a797 100644
--- a/src/info.h
+++ b/src/info.h
@@ -19,7 +19,7 @@
 #include "sounds.h"
 #include "m_fixed.h"
 
-// ENUMTABLES BEGIN actionpointers do_actions
+// ENUMTABLE BEGIN actionpointers do_actions
 void A_Explode();
 void A_Pain();
 void A_Fall();
@@ -281,7 +281,7 @@ void A_DragonbomberSpawn();
 void A_DragonWing();
 void A_DragonSegment();
 void A_ChangeHeight();
-// ENUMTABLES END actionpointers
+// ENUMTABLE END actionpointers
 
 // ratio of states to sprites to mobj types is roughly 6 : 1 : 1
 #define NUMMOBJFREESLOTS 512
@@ -874,7 +874,7 @@ typedef enum playersprite
 
 typedef enum state
 {
-// ENUMTABLES BEGIN STATE_LIST do_generic S_ S_
+// ENUMTABLE BEGIN STATE_LIST do_generic S_ S_
 	S_NULL,
 	S_UNKNOWN,
 	S_INVISIBLE, // state for invisible sprite
@@ -3997,7 +3997,7 @@ typedef enum state
 	S_BRICKDEBRIS,
 	S_WOODDEBRIS,
 
-// ENUMTABLES END STATE_LIST
+// ENUMTABLE END STATE_LIST
 
 #ifdef SEENAMES
 	S_NAMECHECK,
@@ -4028,7 +4028,7 @@ extern playersprite_t free_spr2;
 
 typedef enum mobj_type
 {
-// ENUMTABLES BEGIN MOBJTYPE_LIST do_generic MT_ MT_
+// ENUMTABLE BEGIN MOBJTYPE_LIST do_generic MT_ MT_
 	MT_NULL,
 	MT_UNKNOWN,
 
@@ -4800,7 +4800,7 @@ typedef enum mobj_type
 	MT_BRICKDEBRIS,
 	MT_WOODDEBRIS,
 
-// ENUMTABLES END MOBJTYPE_LIST
+// ENUMTABLE END MOBJTYPE_LIST
 
 #ifdef SEENAMES
 	MT_NAMECHECK,
diff --git a/src/m_menu.h b/src/m_menu.h
index 565b98945718e9612a47da82e1d306fa64a54845..ce17a1eac9bd9975b862eedb435cff6dbc1b3ada 100644
--- a/src/m_menu.h
+++ b/src/m_menu.h
@@ -36,6 +36,7 @@
  */
 typedef enum
 {
+// ENUMTABLE BEGIN MENUTYPES_LIST do_generic MN_
 	MN_NONE,
 
 	MN_MAIN,
@@ -130,6 +131,9 @@ typedef enum
 	// MN_HELP,
 
 	MN_SPECIAL,
+
+// ENUMTABLE END MENUTYPES_LIST
+
 	NUMMENUTYPES,
 } menutype_t; // up to 63; MN_SPECIAL = 53
 #define MTREE2(a,b) (a | (b<<MENUBITS))
diff --git a/src/p_mobj.h b/src/p_mobj.h
index 5984bc9dd3384e79eea609cbef688410bfb5fdef..7ee2a96b30d625d2275779ff7d983a807c5db29b 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -97,7 +97,7 @@
 //
 typedef enum
 {
-// ENUMTABLES BEGIN MOBJFLAG_LIST do_generic MF_
+// ENUMTABLE BEGIN MOBJFLAG_LIST do_generic MF_
 	// Call P_TouchSpecialThing when touched.
 	MF_SPECIAL          = 1,
 	// Blocks.
@@ -161,11 +161,12 @@ typedef enum
 	// Run the action thinker on spawn.
 	MF_RUNSPAWNFUNC     = 1<<29,
 	// free: 1<<30 and 1<<31
-// ENUMTABLES END MOBJFLAG_LIST
+// ENUMTABLE END MOBJFLAG_LIST
 } mobjflag_t;
 
 typedef enum
 {
+// ENUMTABLE BEGIN MOBJFLAG2_LIST do_generic MF2_
 	MF2_AXIS           = 1,     // It's a NiGHTS axis! (For faster checking)
 	MF2_TWOD           = 1<<1,  // Moves like it's in a 2D level
 	MF2_DONTRESPAWN    = 1<<2,  // Don't respawn this object!
@@ -197,6 +198,7 @@ typedef enum
 	MF2_LINKDRAW       = 1<<28, // Draw vissprite of mobj immediately before/after tracer's vissprite (dependent on dispoffset and position)
 	MF2_SHIELD         = 1<<29, // Thinker calls P_AddShield/P_ShieldLook (must be partnered with MF_SCENERY to use)
 	// free: to and including 1<<31
+// ENUMTABLE END MOBJFLAG2_LIST
 } mobjflag2_t;
 
 typedef enum
@@ -218,6 +220,7 @@ typedef enum
 //
 typedef enum
 {
+// ENUMTABLE BEGIN MOBJEFLAG_LIST do_generic MFE_
 	// The mobj stands on solid floor (not on another mobj or in air)
 	MFE_ONGROUND          = 1,
 	// The mobj just hit the floor while falling, this is cleared on next frame
@@ -247,6 +250,7 @@ typedef enum
 	// See Linedef Exec 457 (Track mobj angle to point)
 	MFE_TRACERANGLE       = 1<<11,
 	// free: to and including 1<<15
+// ENUMTABLE END MOBJEFLAG_LIST
 } mobjeflag_t;
 
 //
diff --git a/src/st_stuff.h b/src/st_stuff.h
index 4ea307d2b45c6cdcd91dd345755f9b18029237a0..eeb32b62e90ca805d6059c4b47b956f57211bd24 100644
--- a/src/st_stuff.h
+++ b/src/st_stuff.h
@@ -91,6 +91,7 @@ typedef struct
 
 typedef enum
 {
+// ENUMTABLE BEGIN HUDITEMS_LIST do_generic HUD_
 	HUD_LIVES,
 
 	HUD_RINGS,
@@ -117,6 +118,8 @@ typedef enum
 	HUD_HUNTPICS,
 	HUD_POWERUPS,
 
+// ENUMTABLE END HUDITEMS_LIST
+
 	NUMHUDITEMS
 } hudnum_t;