diff --git a/src/p_mobj.c b/src/p_mobj.c
index cbd6c3c7fb8aae5a7fc1db6ca0e098d7e3125be6..d73f11f81aea2edf717d55d698c728c8d56336d8 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -3408,7 +3408,7 @@ void P_MobjCheckWater(mobj_t *mobj)
 
 		// Drown timer setting
 		if ((p->powers[pw_shield] & SH_PROTECTWATER) // Has water protection
-		 || (p->exiting) // Or exiting
+		 || (p->exiting) || (p->pflags & PF_FINISHED) // Or finished/exiting
 		 || (maptol & TOL_NIGHTS) // Or in NiGHTS mode
 		 || (mariomode)) // Or in Mario mode...
 		{
diff --git a/src/p_user.c b/src/p_user.c
index 47812744e8cf4dde8cef21cbbe7b16aba6bc6645..672cf8aae9f9ad2431da87f688e0557c81647386 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -2153,6 +2153,10 @@ void P_DoPlayerFinish(player_t *player)
 
 	if (netgame)
 		CONS_Printf(M_GetText("%s has completed the level.\n"), player_names[player-players]);
+
+	player->powers[pw_underwater] = 0;
+	player->powers[pw_spacetime] = 0;
+	P_RestoreMusic(player);
 }
 
 //
@@ -2860,7 +2864,7 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
 {
 	tic_t timeleft = (player->powers[pw_spacetime]) ? player->powers[pw_spacetime] : player->powers[pw_underwater];
 
-	if (player->exiting)
+	if (player->exiting || (player->pflags & PF_FINISHED))
 		player->powers[pw_underwater] = player->powers[pw_spacetime] = 0;
 
 	timeleft--; // The original code was all n*TICRATE + 1, so let's remove 1 tic for simplicity