diff --git a/src/p_user.c b/src/p_user.c
index ce6c01d9494bb1bea888fffa51e4d1ae3fcaf89a..99d2c2fb133bfddd085602074c4c00e0f4bb83dd 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -2007,65 +2007,43 @@ static void P_CheckSneakerAndLivesTimer(player_t *player)
 //
 static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
 {
-	fixed_t height;
-	mobj_t *numbermobj = NULL;
+	tic_t timeleft = (player->powers[pw_spacetime]) ? player->powers[pw_spacetime] : player->powers[pw_underwater];
 
-	if (player->mo->eflags & MFE_VERTICALFLIP)
-		height = player->mo->z - FixedMul(8*FRACUNIT - mobjinfo[MT_DROWNNUMBERS].height, player->mo->scale);
-	else
-		height = player->mo->z + player->mo->height + FixedMul(8*FRACUNIT, player->mo->scale);
+	if ((timeleft == 11*TICRATE + 1) // 5
+	 || (timeleft ==  9*TICRATE + 1) // 4
+	 || (timeleft ==  7*TICRATE + 1) // 3
+	 || (timeleft ==  5*TICRATE + 1) // 2
+	 || (timeleft ==  3*TICRATE + 1) // 1
+	 || (timeleft ==  1*TICRATE + 1) // 0
+	) {
+		fixed_t height = (player->mo->eflags & MFE_VERTICALFLIP)
+		? player->mo->z - FixedMul(8*FRACUNIT - mobjinfo[MT_DROWNNUMBERS].height, player->mo->scale)
+		: player->mo->z + player->mo->height + FixedMul(8*FRACUNIT, player->mo->scale);
 
-	if (player->powers[pw_underwater] == 11*TICRATE + 1 || player->powers[pw_spacetime] == 11*TICRATE + 1)
-	{
-		numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
-		P_SetMobjState(numbermobj, numbermobj->info->spawnstate+5);
-	}
-	else if (player->powers[pw_underwater] == 9*TICRATE + 1 || player->powers[pw_spacetime] == 9*TICRATE + 1)
-	{
-		numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
-		P_SetMobjState(numbermobj, numbermobj->info->spawnstate+4);
-	}
-	else if (player->powers[pw_underwater] == 7*TICRATE + 1 || player->powers[pw_spacetime] == 7*TICRATE + 1)
-	{
-		numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
-		P_SetMobjState(numbermobj, numbermobj->info->spawnstate+3);
-	}
-	else if (player->powers[pw_underwater] == 5*TICRATE + 1 || player->powers[pw_spacetime] == 5*TICRATE + 1)
-	{
-		numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
-		P_SetMobjState(numbermobj, numbermobj->info->spawnstate+2);
-	}
-	else if (player->powers[pw_underwater] == 3*TICRATE + 1 || player->powers[pw_spacetime] == 3*TICRATE + 1)
-	{
-		numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
-		P_SetMobjState(numbermobj, numbermobj->info->spawnstate+1);
-	}
-	else if (player->powers[pw_underwater] == 1*TICRATE + 1 || player->powers[pw_spacetime] == 1*TICRATE + 1)
-	{
-		numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
-		//P_SetMobjState(numbermobj, numbermobj->info->spawnstate+0);
+		mobj_t *numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
+
+		timeleft /= (2*TICRATE); // To be strictly accurate it'd need to be ((timeleft/TICRATE) - 1)/2, but integer division rounds down for us
+
+		S_StartSound(player->mo, sfx_dwnind);
+
+		if (timeleft) // Don't waste time setting the state if the time is 0.
+			P_SetMobjState(numbermobj, numbermobj->info->spawnstate+timeleft);
+
+		P_SetTarget(&numbermobj->target, player->mo);
+		numbermobj->threshold = 40;
+		numbermobj->destscale = player->mo->scale;
+		P_SetScale(numbermobj, player->mo->scale);
 	}
 	// Underwater timer runs out
-	else if (player->powers[pw_underwater] == 1)
-	{
-		if ((netgame || multiplayer) && P_IsLocalPlayer(player))
-			S_ChangeMusic(mapmusname, mapmusflags, true);
-		P_DamageMobj(player->mo, NULL, NULL, 1, DMG_DROWNED);
-	}
-	else if (player->powers[pw_spacetime] == 1)
+	else if (timeleft == 1)
 	{
 		if ((netgame || multiplayer) && P_IsLocalPlayer(player))
 			S_ChangeMusic(mapmusname, mapmusflags, true);
-		P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPACEDROWN);
-	}
 
-	if (numbermobj)
-	{
-		P_SetTarget(&numbermobj->target, player->mo);
-		numbermobj->threshold = 40;
-		S_StartSound(player->mo, sfx_dwnind);
-		numbermobj->destscale = player->mo->scale;
-		P_SetScale(numbermobj, player->mo->scale);
+		if (player->powers[pw_spacetime] == 1)
+			P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPACEDROWN);
+		else
+			P_DamageMobj(player->mo, NULL, NULL, 1, DMG_DROWNED);
 	}
 
 	if (!(player->mo->eflags & MFE_UNDERWATER) && player->powers[pw_underwater])
@@ -2085,19 +2063,19 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
 	// Underwater audio cues
 	if (P_IsLocalPlayer(player) && !player->bot)
 	{
-		if (player->powers[pw_underwater] == 11*TICRATE + 1
-		&& player == &players[consoleplayer])
-		{
-			S_StopMusic();
-			S_ChangeMusicInternal("drown", false);
-		}
-
 		if (player->powers[pw_underwater] == 25*TICRATE + 1)
 			S_StartSound(NULL, sfx_wtrdng);
 		else if (player->powers[pw_underwater] == 20*TICRATE + 1)
 			S_StartSound(NULL, sfx_wtrdng);
 		else if (player->powers[pw_underwater] == 15*TICRATE + 1)
 			S_StartSound(NULL, sfx_wtrdng);
+
+		if (player->powers[pw_underwater] == 11*TICRATE + 1
+		&& player == &players[consoleplayer])
+		{
+			S_StopMusic();
+			S_ChangeMusicInternal("drown", false);
+		}
 	}
 
 	if (player->exiting)