diff --git a/src/deh_tables.c b/src/deh_tables.c
index c8da6cabd80a36e8f80879096b0cd3bd677a0bb7..1474296f9207ad1c64593f570047015795017a12 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -369,6 +369,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
 
 	"S_KART_LEFTOVER",
 	"S_KART_LEFTOVER_NOTIRES",
+	"S_KART_LEFTOVER_CUSTOM",
 
 	"S_KART_TIRE1",
 	"S_KART_TIRE2",
diff --git a/src/info.c b/src/info.c
index c639c7c3583a57fb47ddb58e8ae29337ca2c878e..ffdf5daf8d2f952e4fd5799991595f43142250fd 100644
--- a/src/info.c
+++ b/src/info.c
@@ -795,6 +795,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
 	"SIGN", "SIGL", "SSIG", // Finish signpost
 	"XTRA", // Three Faces of Darkness
 	"TALK", // Dialogue
+	"DKRT", // Kart husk
 };
 playersprite_t free_spr2 = SPR2_FIRSTFREESLOT;
 
@@ -839,13 +840,14 @@ playersprite_t spr2defaults[NUMPLAYERSPRITES] = {
 	SPR2_SIGN, // SPR2_SSIG
 	0, // SPR2_XTRA
 	0, // SPR2_TALK
+	0, // SPR2_DKRT
 };
 
 // Doesn't work with g++, needs actionf_p1 (don't modify this comment)
 state_t states[NUMSTATES] =
 {
 	// frame is masked through FF_FRAMEMASK
-	// FF_ANIMATE makes simple state animations (var1 #frames, var2 tic delay)
+	// FF_ANIMATE makes simple state animations (var1 #frames, var2 tic delay) (var1 is ignored in P_SetupStateAnimation() if sprite is SPR_PLAY)
 	// FF_FULLBRIGHT activates the fullbright colormap
 	// use FF_TRANS10 - FF_TRANS90 for easy translucency
 	// (or tr_trans10<<FF_TRANSSHIFT if you want to make it hard on yourself)
@@ -903,6 +905,7 @@ state_t states[NUMSTATES] =
 
 	{SPR_KART, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_LEFTOVER
 	{SPR_DIEF, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_LEFTOVER_NOTIRES
+	{SPR_PLAY, SPR2_DKRT,3,{NULL},0,0,S_KART_LEFTOVER_CUSTOM},// S_KART_LEFTOVER_CUSTOM
 
 	{SPR_TIRE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KART_TIRE1
 	{SPR_TIRE, 1, -1, {NULL}, 0, 0, S_NULL}, // S_KART_TIRE2
diff --git a/src/info.h b/src/info.h
index dc900685651968d243bba01b7aee3a3cc304bf9b..c1474dc01609db6417d92785711ca33c6f5eb7fa 100644
--- a/src/info.h
+++ b/src/info.h
@@ -1329,6 +1329,7 @@ typedef enum playersprite
 	SPR2_SIGN, SPR2_SIGL, SPR2_SSIG,
 	SPR2_XTRA,
 	SPR2_TALK,
+	SPR2_DKRT,
 
 	SPR2_FIRSTFREESLOT,
 	SPR2_LASTFREESLOT = 0x7f,
@@ -1389,6 +1390,7 @@ typedef enum state
 
 	S_KART_LEFTOVER,
 	S_KART_LEFTOVER_NOTIRES,
+	S_KART_LEFTOVER_CUSTOM,
 
 	S_KART_TIRE1,
 	S_KART_TIRE2,
diff --git a/src/objects/destroyed-kart.cpp b/src/objects/destroyed-kart.cpp
index b029d8304cebd5d80487e547385bbbff643e5e27..95782cf749615927728b21a57a54727be35d0b35 100644
--- a/src/objects/destroyed-kart.cpp
+++ b/src/objects/destroyed-kart.cpp
@@ -309,15 +309,34 @@ struct Kart : Mobj
 			return true;
 		}
 
+
 		if (health <= 1)
 		{
 			return false;
 		}
 
+		Mobj* p = player();
+		bool pValid = Mobj::valid(p) && p->player;
+		bool hasCustomHusk = pValid && skins[p->player->skin].sprites[SPR2_DKRT].numframes;
+
+		if(hasCustomHusk)
+		{
+			skin = (void*)(&skins[p->player->skin]);
+			frame = 0;
+		}
+
 		Particle::spew(this);
-		scale(3 * scale() / 2);
+		scale(3*scale()/2);
+
+		if(hasCustomHusk){
+			flags |= MF_NOSQUISH; //K_Squish() automates spritexscale/spriteyscale & this flag prevents that at the cost of no squish visual when the kart husk hits the ground
+			fixed_t huskScale = FixedDiv(mapobjectscale, scale());
+			spritexscale(FixedMul(spritexscale(), huskScale));
+			spriteyscale(FixedMul(spriteyscale(), huskScale));
+		}
+
 		health = 1;
-		state(S_KART_LEFTOVER_NOTIRES);
+		state(!hasCustomHusk ? S_KART_LEFTOVER_NOTIRES : S_KART_LEFTOVER_CUSTOM);
 		cooldown(20);
 		burning(burn_duration());
 
@@ -326,9 +345,9 @@ struct Kart : Mobj
 			voice(sfx_die00);
 		}
 
-		if (Mobj* p = player(); Mobj::valid(p))
+		if(pValid)
 		{
-			if (p->player && skins[p->player->skin].flags & SF_BADNIK)
+			if((skins[p->player->skin].flags & SF_BADNIK))
 			{
 				P_SpawnBadnikExplosion(p);
 				p->spritescale({2*FRACUNIT, 2*FRACUNIT});
@@ -446,7 +465,7 @@ private:
 			P_PlayDeathSound(p);
 		}
 
-		// First tick after hitlag: destroyed kart appears!
+		// First tick after hitlag: destroyed kart appears! State will change away from S_INVISIBLE inside destroy() where S_INVISIBLE was set in static spawn()
 		if (state()->num() == S_INVISIBLE)
 		{
 			destroy();
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 7941c228aafe0a8b10acb41d3e64f272324ac8cf..e5f0e542a411cff9397b3e1224300db8a4d9e177 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -9880,10 +9880,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
 	case MT_KART_LEFTOVER:
 	{
 		Obj_DestroyedKartThink(mobj);
+
 		if (P_MobjWasRemoved(mobj))
 		{
 			return false;
 		}
+		
 		break;
 	}