diff --git a/src/d_player.h b/src/d_player.h
index f1458f7fcbd0d88380c771ff891c73206cb2628b..80ebacc259db690f5e7f1d7422af4fbdecb65d92 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -150,6 +150,7 @@ typedef enum
 	CR_SLIDING,
 	CR_ZOOMTUBE,
 	CR_DASHRING,
+	CR_TRAPBUBBLE,
 } carrytype_t; // carry
 
 /*
diff --git a/src/deh_tables.c b/src/deh_tables.c
index 6a5255e8ee7671a7e09a5d49956c34e0367481a9..58deb6cb86a97cb465b517c27ccc69c5b9ec16d3 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -4670,7 +4670,10 @@ struct int_const_s const INT_CONST[] = {
 
 	// Carrying
 	{"CR_NONE",CR_NONE},
+	{"CR_SLIDING",CR_SLIDING},
 	{"CR_ZOOMTUBE",CR_ZOOMTUBE},
+	{"CR_DASHRING",CR_DASHRING},
+	{"CR_TRAPBUBBLE",CR_TRAPBUBBLE},
 
 	// Character flags (skinflags_t)
 	{"SF_MACHINE",SF_MACHINE},
diff --git a/src/k_respawn.c b/src/k_respawn.c
index 6fe2f989744154e56f52af3c6e5237578237207f..127dc7a3cfa94e0c2878a2e940e3e9bbc103ec80 100644
--- a/src/k_respawn.c
+++ b/src/k_respawn.c
@@ -724,7 +724,7 @@ static void K_DropDashWait(player_t *player)
 		player->respawn.timer--;
 
 	if (player->pflags & PF_FAULT)
-		return;
+		return;	
 
 	if (leveltime % 8 == 0)
 	{
@@ -871,6 +871,12 @@ static void K_HandleDropDash(player_t *player)
 		{
 			player->mo->colorized = false;
 		}
+		// if player got trapped inside a bubble but lost its bubble object in a unintended way, remove no gravity flag
+		if (((P_MobjWasRemoved(player->mo->tracer) || player->mo->tracer == NULL || (!P_MobjWasRemoved(player->mo->tracer) && player->mo->tracer && player->mo->tracer->type != MT_BUBBLESHIELDTRAP)) && player->carry == CR_TRAPBUBBLE) && (player->mo->flags & MF_NOGRAVITY))
+		{
+			player->mo->flags &= ~MF_NOGRAVITY;
+			player->carry = CR_NONE;
+		}
 	}
 	else
 	{
diff --git a/src/p_inter.c b/src/p_inter.c
index 49cae6cab68bbce3be386a575c73bcf78410e9de..1c696327acf02b63cacdf2e63fafea48c388b6cb 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -642,6 +642,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 			P_SetTarget(&special->tracer, toucher);
 			toucher->flags |= MF_NOGRAVITY;
 			toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher);
+			toucher->player->carry = CR_TRAPBUBBLE;
+			P_SetTarget(&toucher->tracer, special); //use tracer to acces the object 
 
 			// Snap to the unfortunate player and quit moving laterally, or we can end up quite far away
 			special->momx = 0;
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 896af74d673242825b282031bf18c74a1bbc405e..4fe37026ed1d81729b4ec03cd86b468452129fce 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -9339,7 +9339,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
 		if (leveltime % 180 == 0)
 			S_StartSound(mobj, sfx_s3kbfl);
 
-		if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->player)
+		if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->tracer == mobj && mobj->tracer->player && mobj->tracer->player->carry == CR_TRAPBUBBLE)
 		{
 			player_t *player = mobj->tracer->player;
 			fixed_t destx, desty, curfz, destfz;
@@ -9387,6 +9387,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
 			{
 				S_StartSound(mobj->tracer, sfx_s3k77);
 				mobj->tracer->flags &= ~MF_NOGRAVITY;
+				mobj->tracer->player->carry = CR_NONE;
 				P_KillMobj(mobj, mobj->tracer, mobj->tracer, DMG_NORMAL);
 				break;
 			}
diff --git a/src/p_user.c b/src/p_user.c
index ecff343eeec5469e345b20e4a36c06b086ed2709..0ba95a032cddcdf91db1a830bdea67e565c61236 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -418,7 +418,8 @@ void P_ResetPlayer(player_t *player)
 {
 	//player->pflags &= ~(PF_);
 
-	player->carry = CR_NONE;
+	if (player->carry != CR_TRAPBUBBLE)
+		player->carry = CR_NONE;
 	player->onconveyor = 0;
 
 	//player->drift = player->driftcharge = 0;