diff --git a/src/deh_tables.c b/src/deh_tables.c
index 5f473654cf17792a0d6127eda25bcab0ea09f264..c256218613640758fab8cc685498ff1621dcccba 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -3690,7 +3690,6 @@ const char *const MOBJTYPE_LIST[] = {  // array length left dynamic for sanity t
 	"MT_TOKEN", // Special Stage token for special stage
 	"MT_REDFLAG", // Red CTF Flag
 	"MT_BLUEFLAG", // Blue CTF Flag
-	"MT_TEAMFLAG", // Team flag
 	"MT_EMBLEM",
 	"MT_EMERALD1",
 	"MT_EMERALD2",
diff --git a/src/doomdata.h b/src/doomdata.h
index 576fe03e29e9abc18659ce14972bfb41d5b1756e..439cb22b1555ac003b8e440f444d14d736893e9c 100644
--- a/src/doomdata.h
+++ b/src/doomdata.h
@@ -217,6 +217,8 @@ typedef struct
 	struct mobj_s *mobj;
 } mapthing_t;
 
+#define THING_TYPE_CTF_TEAM_FLAG 324
+
 #define ZSHIFT 4
 
 #define NUMMAPS 1035
diff --git a/src/g_game.c b/src/g_game.c
index cc9767bed4e9c4c698df49364a64dcd84debe643..08beccd92d465cfaf6efe95da35f03a106652f1d 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -3995,6 +3995,20 @@ UINT8 G_GetTeamListFromTeamFlags(UINT8 *teamlist, UINT32 flags)
 	return count;
 }
 
+UINT8 G_GetTeamByName(const char *name)
+{
+	if (name != NULL)
+	{
+		for (UINT8 i = 0; i < numteams; i++)
+		{
+			if (!strcmp(name, teamnames[i][1]))
+				return i;
+		}
+	}
+
+	return MAXTEAMS;
+}
+
 const char *G_GetTeamName(UINT8 team)
 {
 	if (team >= numteams || !teams[team].name)
diff --git a/src/g_game.h b/src/g_game.h
index 6119645c1bedaa01ff6427ccc813dd8180eb3dd0..b1d8d1bbbc1370075376cf5a26a3bba18ba08cc3 100644
--- a/src/g_game.h
+++ b/src/g_game.h
@@ -228,6 +228,7 @@ UINT8 G_GetGametypeTeam(UINT8 gtype, UINT8 team);
 UINT8 G_GetTeam(UINT8 team);
 UINT8 G_GetTeamFromTeamFlag(UINT32 flag);
 UINT8 G_GetTeamListFromTeamFlags(UINT8 *teamlist, UINT32 flags);
+UINT8 G_GetTeamByName(const char *name);
 const char *G_GetTeamName(UINT8 team);
 const char *G_GetTeamFlagName(UINT8 team);
 UINT32 G_GetTeamWeaponMobjtype(UINT8 team);
diff --git a/src/info.c b/src/info.c
index bc5214f597c016365a2662b0f54b855837cff2f1..47e4b6b9357b0a90a4705d05d971ff4bd1d1081b 100644
--- a/src/info.c
+++ b/src/info.c
@@ -7149,33 +7149,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
 		S_NULL          // raisestate
 	},
 
-	{           // MT_TEAMFLAG
-		323,            // doomednum
-		S_NULL,         // spawnstate
-		1000,           // spawnhealth
-		S_NULL,         // seestate
-		sfx_None,       // seesound
-		8,              // reactiontime
-		sfx_None,       // attacksound
-		S_NULL,         // painstate
-		0,              // painchance
-		sfx_None,       // painsound
-		S_NULL,         // meleestate
-		S_NULL,         // missilestate
-		S_NULL,         // deathstate
-		S_NULL,         // xdeathstate
-		sfx_lvpass,     // deathsound
-		8,              // speed
-		24*FRACUNIT,    // radius
-		64*FRACUNIT,    // height
-		0,              // display offset
-		0,              // mass
-		0,              // damage
-		sfx_None,       // activesound
-		MF_SPECIAL,     // flags
-		S_NULL          // raisestate
-	},
-
 	{           // MT_EMBLEM
 		322,            // doomednum
 		S_EMBLEM1,      // spawnstate
diff --git a/src/info.h b/src/info.h
index f7c7f80d4930f036edfee969fd334dd5a529b4fb..5c7a9f3fd428579c674c7f969db44f7d71b88f07 100644
--- a/src/info.h
+++ b/src/info.h
@@ -4521,7 +4521,6 @@ typedef enum mobj_type
 	MT_TOKEN, // Special Stage token for special stage
 	MT_REDFLAG, // Red CTF Flag
 	MT_BLUEFLAG, // Blue CTF Flag
-	MT_TEAMFLAG, // Team flag
 	MT_EMBLEM,
 	MT_EMERALD1,
 	MT_EMERALD2,
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 336e7759332bebc02c4e57a364ac7cd802bb1d5f..6300bde4814bb6f2093fb07d9535f24648053857 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -10012,6 +10012,10 @@ static void P_FlagFuseThink(mobj_t *mobj)
 	if (!mobj->spawnpoint)
 		return;
 
+	UINT8 team = mobj->extravalue1;
+	if (team == TEAM_NONE || team >= numteams)
+		return;
+
 	x = mobj->spawnpoint->x << FRACBITS;
 	y = mobj->spawnpoint->y << FRACBITS;
 	z = mobj->spawnpoint->z << FRACBITS;
@@ -10020,7 +10024,11 @@ static void P_FlagFuseThink(mobj_t *mobj)
 		z = ss->sector->ceilingheight - mobjinfo[mobj->type].height - z;
 	else
 		z = ss->sector->floorheight + z;
-	flagmo = P_SpawnMobj(x, y, z, mobj->type);
+
+	flagmo = P_SpawnTeamFlag(team, x, y, z);
+	if (flagmo == NULL)
+		return;
+
 	flagmo->spawnpoint = mobj->spawnpoint;
 	if (mobj->spawnpoint->options & MTF_OBJECTFLIP)
 	{
@@ -10028,20 +10036,16 @@ static void P_FlagFuseThink(mobj_t *mobj)
 		flagmo->flags2 |= MF2_OBJECTFLIP;
 	}
 
-	UINT8 team = mobj->info->mass;
-	if (team < numteams)
-	{
-		if (!(mobj->flags2 & MF2_JUSTATTACKED))
-			CONS_Printf(M_GetText("The %s%s\200 has returned to base.\n"), GetChatColorForSkincolor(G_GetTeamColor(team)), G_GetTeamFlagName(team));
+	if (!(mobj->flags2 & MF2_JUSTATTACKED))
+		CONS_Printf(M_GetText("The %s%s\200 has returned to base.\n"), GetChatColorForSkincolor(G_GetTeamColor(team)), G_GetTeamFlagName(team));
 
-		// Assumedly in splitscreen players will be on opposing teams
-		if (players[consoleplayer].ctfteam == team || splitscreen)
-			S_StartSound(NULL, sfx_hoop1);
-		else if (players[consoleplayer].ctfteam != 0)
-			S_StartSound(NULL, sfx_hoop3);
+	// Assumedly in splitscreen players will be on opposing teams
+	if (players[consoleplayer].ctfteam == team || splitscreen)
+		S_StartSound(NULL, sfx_hoop1);
+	else if (players[consoleplayer].ctfteam != 0)
+		S_StartSound(NULL, sfx_hoop3);
 
-		P_SetTarget(&flagmobjs[team], flagmo);
-	}
+	P_SetTarget(&flagmobjs[team], flagmo);
 }
 
 static boolean P_FuseThink(mobj_t *mobj)
@@ -10587,7 +10591,6 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing)
 		case MT_FLICKY_16:
 		case MT_SECRETFLICKY_01:
 		case MT_SECRETFLICKY_02:
-
 			return FRACUNIT;
 
 		default:
@@ -11472,6 +11475,24 @@ mobjtype_t P_GetMobjtype(UINT16 mthingtype)
 	return MT_UNKNOWN;
 }
 
+static mobjtype_t P_GetMobjtypeFromMapthing(mapthing_t *mthing)
+{
+	if (mthing->type == THING_TYPE_CTF_TEAM_FLAG) // CTF team flag
+	{
+		UINT8 team = G_GetTeamByName(mthing->stringargs[0]);
+		if (team == TEAM_NONE || team >= numteams)
+			return MT_UNKNOWN;
+		else
+		{
+			mobjtype_t type = teams[team].flag_mobj_type;
+			if (type == MT_NULL || type >= NUMMOBJTYPES)
+				return MT_UNKNOWN;
+		}
+	}
+
+	return P_GetMobjtype(mthing->type);
+}
+
 //
 // P_RespawnSpecials
 //
@@ -12055,12 +12076,12 @@ static boolean P_AllowMobjSpawn(mapthing_t* mthing, mobjtype_t i)
 
 	if (!(gametyperules & GTR_TEAMFLAGS)) // CTF specific things
 	{
-		if (i == MT_BLUEFLAG || i == MT_REDFLAG || i == MT_TEAMFLAG)
+		if (i == MT_BLUEFLAG || i == MT_REDFLAG || mthing->type == THING_TYPE_CTF_TEAM_FLAG)
 			return false; // No flags in non-CTF modes!
 	}
-	else if (i == MT_BLUEFLAG || i == MT_REDFLAG || i == MT_TEAMFLAG)
+	else if (i == MT_BLUEFLAG || i == MT_REDFLAG || mthing->type == THING_TYPE_CTF_TEAM_FLAG)
 	{
-		UINT8 team = i == MT_TEAMFLAG ? mthing->args[0] : G_GetTeam(mobjinfo[i].mass);
+		UINT8 team = mthing->type == THING_TYPE_CTF_TEAM_FLAG ? G_GetTeamByName(mthing->stringargs[0]) : G_GetTeam(mobjinfo[i].mass);
 		if (team == TEAM_NONE || team >= numteams)
 			return false;
 		else if (flagmobjs[team] && !P_MobjWasRemoved(flagmobjs[team]))
@@ -12148,14 +12169,7 @@ static mobjtype_t P_GetMobjtypeSubstitute(mapthing_t *mthing, mobjtype_t i)
 			return MT_NIGHTSCHIP;
 	}
 
-	if (i == MT_TEAMFLAG)
-	{
-		INT32 team = mthing->args[0];
-		if (team == TEAM_NONE || team >= numteams)
-			return MT_NULL;
-		return teams[team].flag_mobj_type;
-	}
-	else if (i == MT_BLUEFLAG || i == MT_REDFLAG)
+	if (i == MT_BLUEFLAG || i == MT_REDFLAG)
 	{
 		INT32 team = G_GetTeam(mobjinfo[i].mass);
 		if (team == TEAM_NONE || team >= numteams)
@@ -13189,8 +13203,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
 	case MT_REDFLAG:
 	case MT_BLUEFLAG:
 		mobj->extravalue1 = G_GetTeam(mobj->info->mass);
-		/* FALLTHRU */
-	case MT_TEAMFLAG:
 		mobj->eflags |= MFE_TEAMFLAG;
 		break;
 	case MT_NIGHTSSTAR:
@@ -13249,6 +13261,9 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
 		break;
 	}
 
+	if (mthing->type == THING_TYPE_CTF_TEAM_FLAG)
+		mobj->eflags |= MFE_TEAMFLAG;
+
 	if (mobj->flags & MF_BOSS)
 	{
 		if (mthing->args[1]) // No egg trap for this boss
@@ -13406,7 +13421,7 @@ mobj_t *P_SpawnMapThing(mapthing_t *mthing)
 	if (!objectplacing && P_SpawnNonMobjMapThing(mthing))
 		return mobj;
 
-	i = P_GetMobjtype(mthing->type);
+	i = P_GetMobjtypeFromMapthing(mthing);
 	if (i == MT_UNKNOWN)
 		CONS_Alert(CONS_WARNING, M_GetText("Unknown thing type %d placed at (%d, %d)\n"), mthing->type, mthing->x, mthing->y);