diff --git a/src/p_floor.c b/src/p_floor.c
index ede2a86abb416e72d1831928845e30c35e135ff7..118b4bdbc7c11f7030380dd0472bcf74ecba5b5b 100644
--- a/src/p_floor.c
+++ b/src/p_floor.c
@@ -1212,6 +1212,19 @@ static boolean T_SectorHasEnemies(sector_t *sec)
 	return false;
 }
 
+static void T_UpdateMobjPlaneZ(sector_t *sec)
+{
+	msecnode_t *node = sec->touching_thinglist; // things touching this sector
+	mobj_t *mo;
+	while (node)
+	{
+		mo = node->m_thing;
+		mo->floorz = P_FloorzAtPos(mo->x, mo->y, mo->z, mo->height);
+		mo->ceilingz = P_CeilingzAtPos(mo->x, mo->y, mo->z, mo->height);
+		node = node->m_thinglist_next;
+	}
+}
+
 //
 // T_NoEnemiesThinker
 //
@@ -1941,6 +1954,7 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover)
 	// no longer exists (can't collide with again)
 	rover->fofflags &= ~FOF_EXISTS;
 	rover->master->frontsector->moved = true;
+	T_UpdateMobjPlaneZ(sec); // prevent objects from floating
 	P_RecalcPrecipInSector(sec);
 }