diff --git a/src/p_map.c b/src/p_map.c
index 0b4987c49b6af53c000c16647b793f0756866c7e..48946a4ba6bfba15e3776167bdd46c023ed24541 100644
--- a/src/p_map.c
+++ b/src/p_map.c
@@ -307,7 +307,10 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
 	if ((sonic->pflags & PF_CARRIED) && sonic->mo->tracer == tails->mo)
 		return;
 
-	if (!tails->powers[pw_tailsfly] && !(tails->charability == CA_FLY && tails->mo->state-states == S_PLAY_FLY_TIRED))
+	if (tails->charability != CA_FLY && tails->charability != CA_SWIM)
+		return;
+
+	if (!tails->powers[pw_tailsfly] && tails->mo->state-states != S_PLAY_FLY_TIRED)
 		return;
 
 	if (tails->bot == 1)
diff --git a/src/p_user.c b/src/p_user.c
index 5149f8d736912d77e759cd5e47f5bfa82f141d2c..2934bc2ae41dacda47f66703f7bc2ba5ec763e20 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -9405,7 +9405,7 @@ void P_PlayerAfterThink(player_t *player)
 		player->mo->height = FixedDiv(P_GetPlayerHeight(player), FixedDiv(14*FRACUNIT,10*FRACUNIT));
 
 		if (player->mo->tracer->player
-			&& player->mo->tracer->state-states != S_PLAY_FLY
+			&& !player->mo->tracer->player->powers[pw_tailsfly]
 			&& player->mo->tracer->state-states != S_PLAY_FLY_TIRED)
 				player->pflags &= ~PF_CARRIED;