diff --git a/src/p_inter.c b/src/p_inter.c
index 956a13c2eb1912dd21e17e4ba1a33e090b1881e5..56956737941899b5da79577401050a4f34e5fb85 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -1718,6 +1718,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 				mcart->friction = FRACUNIT;
 
 				P_ResetPlayer(player);
+				player->pflags |= PF_JUMPDOWN;
 				player->powers[pw_carry] = CR_MINECART;
 				toucher->player->pflags &= ~PF_APPLYAUTOBRAKE;
 				P_SetTarget(&toucher->tracer, mcart);
diff --git a/src/p_user.c b/src/p_user.c
index b44a6f11821839f8e70bb4209addd9b91a669e3f..5e33d55a40b789a5776f3bd03676af705a046924 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -9990,9 +9990,7 @@ static void P_MinecartThink(player_t *player)
 	//P_ResetPlayer(player);
 
 	// Player holding jump?
-	if (player->cmd.buttons & BT_JUMP)
-		player->pflags |= PF_JUMPDOWN;
-	else
+	if (!(player->cmd.buttons & BT_JUMP))
 		player->pflags &= ~PF_JUMPDOWN;
 
 	// Handle segments.
@@ -10103,8 +10101,10 @@ static void P_MinecartThink(player_t *player)
 			//	currentSpeed -= FRACUNIT/8;
 
 			// Jumping
-			if (player->cmd.buttons & BT_JUMP)
+			if ((player->cmd.buttons & BT_JUMP) && !(player->pflags & PF_JUMPDOWN))
 			{
+				player->pflags |= PF_JUMPDOWN;
+
 				if (minecart->eflags & MFE_ONGROUND)
 					minecart->eflags &= ~MFE_ONGROUND;
 				minecart->z += P_MobjFlip(minecart);