diff --git a/src/d_player.h b/src/d_player.h
index dbc76b3e39ab9d4b0a694c23fbb62bec1c9faa24..69a4207c98b5a6fd7068356d14a44e0a8a232a56 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -1010,6 +1010,7 @@ struct player_t
 	UINT8 preventfailsafe; // Set when taking damage to prevent cheesing eggboxes
 
 	UINT8 tripwireUnstuck;
+	UINT8 bumpUnstuck;
 
 	UINT8 handtimer;
 	angle_t besthanddirection;
diff --git a/src/k_kart.c b/src/k_kart.c
index cc4d78a353870fe1aca0ca9bbbe0347ab0c54d24..98ca7268d33b65d4a5e535edd6671f92969ffb49 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -9162,6 +9162,16 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
 	if (player->hyudorotimer)
 		player->hyudorotimer--;
 
+	if (player->bumpUnstuck > 30*5)
+	{
+		player->bumpUnstuck = 0;
+		K_DoIngameRespawn(player);
+	}
+	else if (player->bumpUnstuck)
+	{
+		player->bumpUnstuck--;
+	}
+
 	if (player->fakeBoost)
 		player->fakeBoost--;
 
diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c
index 432af513a3b0fcbb2531dd43f27cd8a605d01bf6..8bd5821db0a6d9d69413b09e40fe8b5ec17de295 100644
--- a/src/lua_playerlib.c
+++ b/src/lua_playerlib.c
@@ -388,6 +388,8 @@ static int player_get(lua_State *L)
 		lua_pushinteger(L, plr->preventfailsafe);
 	else if (fastcmp(field,"tripwireunstuck"))
 		lua_pushinteger(L, plr->tripwireUnstuck);
+	else if (fastcmp(field,"bumpunstuck"))
+		lua_pushinteger(L, plr->bumpUnstuck);
 	/*
 	else if (fastcmp(field,"itemroulette"))
 		lua_pushinteger(L, plr->itemroulette);
@@ -946,6 +948,8 @@ static int player_set(lua_State *L)
 		plr->preventfailsafe = luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"tripwireunstuck"))
 		plr->tripwireUnstuck = luaL_checkinteger(L, 3);
+	else if (fastcmp(field,"bumpunstuck"))
+		plr->bumpUnstuck = luaL_checkinteger(L, 3);
 	/*
 	else if (fastcmp(field,"itemroulette"))
 		plr->itemroulette = luaL_checkinteger(L, 3);
diff --git a/src/p_map.c b/src/p_map.c
index bb7868dd44a22ca29359c0fa65dc8c7e678c3744..7f1965aeeaedb63e57c0ad7b0a43970ae5162c7d 100644
--- a/src/p_map.c
+++ b/src/p_map.c
@@ -4085,6 +4085,9 @@ static void P_BouncePlayerMove(mobj_t *mo, TryMoveResult_t *result)
 	P_PlayerHitBounceLine(bestslideline, &result->normal);
 	mo->eflags |= MFE_JUSTBOUNCEDWALL;
 
+	if (mo->player)
+		mo->player->bumpUnstuck += 5;
+
 	// Combo avoidance!
 	if (mo->player && P_PlayerInPain(mo->player) && gametyperules & GTR_BUMPERS && mo->health == 1)
 	{
diff --git a/src/p_saveg.c b/src/p_saveg.c
index 721285c9a51441353cb947a551a3774b74717499..268fc953b8640ccd595e038b2f9e6f73f86dc19b 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -608,6 +608,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
 		WRITEUINT8(save->p, players[i].preventfailsafe);
 
 		WRITEUINT8(save->p, players[i].tripwireUnstuck);
+		WRITEUINT8(save->p, players[i].bumpUnstuck);
 
 		WRITEUINT8(save->p, players[i].handtimer);
 		WRITEANGLE(save->p, players[i].besthanddirection);
@@ -1211,6 +1212,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
 		players[i].preventfailsafe = READUINT8(save->p);
 
 		players[i].tripwireUnstuck = READUINT8(save->p);
+		players[i].bumpUnstuck = READUINT8(save->p);
 
 		players[i].handtimer = READUINT8(save->p);
 		players[i].besthanddirection = READANGLE(save->p);