diff --git a/src/d_player.h b/src/d_player.h
index 606415a717692827b3b585899046becd994f1cee..e7e7d348e31640e267e7faee0215d2d3ee77e9a5 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -402,7 +402,7 @@ typedef struct player_s
 	UINT8 justbumped;		// Prevent players from endlessly bumping into each other
 	UINT8 tumbleBounces;
 	UINT16 tumbleHeight;	// In *mobjscaled* fracunits, or mfu, not raw fu
-	boolean justDI;			// Directional Influence ended, true until letting go of turn
+	UINT8 justDI;			// Turn-lockout timer to briefly prevent unintended turning after DI, resets when actionable or no input
 	boolean flipDI;			// Bananas flip the DI direction. Was a bug, but it made bananas much more interesting.
 
 	SINT8 drift;			// (-5 to 5) - Drifting Left or Right, plus a bigger counter = sharper turn
diff --git a/src/k_kart.c b/src/k_kart.c
index 81374d9c6da088ecdda5461b235a9f16c85d8809..1ee01a9c887c575c11571fb293876c45bfc9eccd 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -7561,6 +7561,15 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
 	if (player->instashield)
 		player->instashield--;
 
+	if (player->justDI)
+	{
+		player->justDI--;
+
+		// return turning if player is fully actionable, no matter when!
+		if (!P_PlayerInPain(player))
+			player->justDI = 0;
+	}
+
 	if (player->eggmanexplode)
 	{
 		if (player->spectator || (gametype == GT_BATTLE && !player->bumpers))
@@ -8296,7 +8305,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
 		return 0;
 	}
 
-	if (player->justDI == true)
+	if (player->justDI > 0)
 	{
 		// No turning until you let go after DI-ing.
 		return 0;
@@ -10496,7 +10505,7 @@ void K_HandleDirectionalInfluence(player_t *player)
 	}
 
 	// DI attempted!!
-	player->justDI = true;
+	player->justDI = MAXHITLAGTICS;
 
 	cmd = &player->cmd;
 
diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c
index b4a971d996adc41843633917bb8551d83964ae8a..4b2bad33d19b17c42459dd33363c572f58b793ba 100644
--- a/src/lua_playerlib.c
+++ b/src/lua_playerlib.c
@@ -239,7 +239,7 @@ static int player_get(lua_State *L)
 	else if (fastcmp(field,"tumbleHeight"))
 		lua_pushinteger(L, plr->tumbleHeight);
 	else if (fastcmp(field,"justDI"))
-		lua_pushboolean(L, plr->justDI);
+		lua_pushinteger(L, plr->justDI);
 	else if (fastcmp(field,"flipDI"))
 		lua_pushboolean(L, plr->flipDI);
 	else if (fastcmp(field,"drift"))
@@ -593,7 +593,7 @@ static int player_set(lua_State *L)
 	else if (fastcmp(field,"tumbleHeight"))
 		plr->tumbleHeight = luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"justDI"))
-		plr->justDI = luaL_checkboolean(L, 3);
+		plr->justDI = luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"flipDI"))
 		plr->flipDI = luaL_checkboolean(L, 3);
 	else if (fastcmp(field,"drift"))
diff --git a/src/p_saveg.c b/src/p_saveg.c
index f6819eb9c3b889db65d9c3a0c818850db56170f1..e92458710a3291b0ca16acbbb4b6d4fde27bc351 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -521,7 +521,7 @@ static void P_NetUnArchivePlayers(void)
 		players[i].tumbleBounces = READUINT8(save_p);
 		players[i].tumbleHeight = READUINT16(save_p);
 
-		players[i].justDI = (boolean)READUINT8(save_p);
+		players[i].justDI = READUINT8(save_p);
 		players[i].flipDI = (boolean)READUINT8(save_p);
 
 		players[i].drift = READSINT8(save_p);
diff --git a/src/p_user.c b/src/p_user.c
index dbf7169257b1f12df9ee12ac6602d1f2cacd2638..927dbf01854aed75530f58e1e5985897b6b91547 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -2142,7 +2142,7 @@ void P_MovePlayer(player_t *player)
 
 	if (cmd->turning == 0)
 	{
-		player->justDI = false;
+		player->justDI = 0;
 	}
 
 	// Kart frames