diff --git a/src/dehacked.c b/src/dehacked.c
index 8b43b9b6c0dfdc0aee2ef6311d9a6feb84410173..629224c7722c9f5fd22d3741cccc74909ce4068d 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -6102,6 +6102,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
 	"S_FIREBALLEXP2",
 	"S_FIREBALLEXP3",
 	"S_SHELL",
+	"S_PUMA_START1",
+	"S_PUMA_START2",
 	"S_PUMA_UP1",
 	"S_PUMA_UP2",
 	"S_PUMA_UP3",
diff --git a/src/info.c b/src/info.c
index 37f7aebafa6a9fae04c1d6fb9395cc4d7f83a430..9656030d153317e6c0fb59c619b176cb363b2022 100644
--- a/src/info.c
+++ b/src/info.c
@@ -2745,6 +2745,8 @@ state_t states[NUMSTATES] =
 	{SPR_SHLL, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SHELL
 
 	// Puma (Mario fireball)
+	{SPR_PUMA, FF_FULLBRIGHT|2, 1, {A_FishJump}, 0, MT_PUMATRAIL, S_PUMA_START2},   // S_PUMA_START1
+	{SPR_PUMA, FF_FULLBRIGHT|2, 1, {A_PlaySound}, sfx_s3k70, 1, S_PUMA_UP1},   // S_PUMA_START2
 	{SPR_PUMA, FF_FULLBRIGHT  , 2, {A_FishJump}, 0, MT_PUMATRAIL, S_PUMA_UP2},   // S_PUMA_UP1
 	{SPR_PUMA, FF_FULLBRIGHT|1, 2, {A_FishJump}, 0, MT_PUMATRAIL, S_PUMA_UP3},   // S_PUMA_UP2
 	{SPR_PUMA, FF_FULLBRIGHT|2, 2, {A_FishJump}, 0, MT_PUMATRAIL, S_PUMA_UP1},   // S_PUMA_UP3
@@ -13157,9 +13159,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
 
 	{           // MT_PUMA
 		1805,           // doomednum
-		S_PUMA_UP1,     // spawnstate
+		S_PUMA_START1,  // spawnstate
 		1000,           // spawnhealth
-		S_PUMA_UP1,     // seestate
+		S_PUMA_START1,  // seestate
 		sfx_None,       // seesound
 		8,              // reactiontime
 		sfx_None,       // attacksound
diff --git a/src/info.h b/src/info.h
index d82c0d5783d91ecb709344096a345dd8c42e925a..f5056437261e0b4c2d39597a5e7d86fa6598ad2d 100644
--- a/src/info.h
+++ b/src/info.h
@@ -2907,6 +2907,8 @@ typedef enum state
 	S_FIREBALLEXP2,
 	S_FIREBALLEXP3,
 	S_SHELL,
+	S_PUMA_START1,
+	S_PUMA_START2,
 	S_PUMA_UP1,
 	S_PUMA_UP2,
 	S_PUMA_UP3,