diff --git a/src/p_inter.c b/src/p_inter.c
index 709e0e2bef06868eb8fbdd09c4852713d1a8140e..55d36a1dee451882bb84298c9c3c2473c0d85d1d 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -1339,6 +1339,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 			}
 			else
 				player->pflags |= PF_ITEMHANG;
+
+			// Can't jump first frame
+			player->pflags |= PF_JUMPSTASIS;
 			return;
 		case MT_BIGMINE:
 		case MT_BIGAIRMINE:
diff --git a/src/p_user.c b/src/p_user.c
index 96841d7e070727fe0fedc833fd55550d2f9e2391..da65b7cb41fef5e0b75cf0989fa6d84d5e328ac6 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -6340,8 +6340,7 @@ static void P_MovePlayer(player_t *player)
 		if (!(player->powers[pw_nocontrol] & (1<<15)))
 			player->pflags |= PF_JUMPSTASIS;
 	}
-	else
-		player->pflags &= ~PF_FULLSTASIS;
+	// note: don't unset stasis here
 
 	if (!player->spectator && G_TagGametype())
 	{
@@ -8928,6 +8927,11 @@ void P_PlayerThink(player_t *player)
 	if (!player->mo)
 		return; // P_MovePlayer removed player->mo.
 
+	// Unset statis flags after moving.
+	// In other words, if you manually set stasis via code,
+	// it lasts for one tic.
+	player->pflags &= ~PF_FULLSTASIS;
+
 #ifdef POLYOBJECTS
 	if (player->onconveyor == 1)
 			player->cmomy = player->cmomx = 0;