diff --git game/Player.h game/Player.h
index a51a589..b4f2fd5 100644
--- game/Player.h
+++ game/Player.h
@@ -825,6 +825,8 @@ public:
 
 	void					UpdateSkinSetup( bool restart );
 
+	bool					IsShoulderingBody( void ) { return m_bShoulderingBody; };
+
 	bool					OnLadder( void ) const;
 	// Virtal override of idActor::OnElevator()
 	virtual CMultiStateMover* OnElevator(bool mustBeMoving) const;
diff --git game/physics/Physics_Player.cpp game/physics/Physics_Player.cpp
index e610f28..c57a3c7 100644
--- game/physics/Physics_Player.cpp
+++ game/physics/Physics_Player.cpp
@@ -4283,9 +4283,33 @@ void idPhysics_Player::StartMantle
 	EMantlePhase initialMantlePhase,
 	idVec3 eyePos,
 	idVec3 startPos,
-	idVec3 endPos
+	idVec3 endPos,
+	float floorHeight
 )
 {
+	// #5892: While shouldering a body, allow mantling at roughly waist height.
+	if (static_cast<idPlayer*>(self)->IsShoulderingBody())
+	{
+		const bool bIsCrouched = current.movementFlags & PMF_DUCKED;
+		const float fallingSpeed = current.velocity * gravityNormal;
+		const float endHeight = -endPos * gravityNormal;
+		const float mantleHeight = endHeight - floorHeight;
+		const float maxMantleHeight = bIsCrouched ?
+			cv_pm_mantle_maxLowObstacleHeight.GetFloat() :     // crouched: 36
+			cv_pm_mantle_maxLowObstacleHeight.GetFloat() + 5;  // standing: 41
+
+		// must be standing on the ground (or not falling from a jump-mantle)
+		if (!groundPlane && fallingSpeed > 0)
+			return;
+		// must be doing a non-hanging, non-pulling mantle
+		if (!(initialMantlePhase == push_DarkModMantlePhase ||
+		      initialMantlePhase == pushNonCrouched_DarkModMantlePhase))
+			return;
+		// must mantle at roughly waist height
+		if (mantleHeight > maxMantleHeight)
+			return;
+	}
+
 	// Ishtvan 10/16/05
 	// If mantling starts while on a rope, detach from that rope
 	if ( m_bOnRope )
@@ -5120,7 +5144,7 @@ void idPhysics_Player::PerformMantle()
 					|| mantleEndHeight < feetHeight + cv_pm_mantle_maxLowObstacleHeight.GetFloat()*0.66f)) // Reduce allowed obstacle height mid-air
 				{
 					// Do a fast mantle over low obstacle
-					StartMantle(pushNonCrouched_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint);
+					StartMantle(pushNonCrouched_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint, floorHeight);
 					return;
 				}
 			}
@@ -5135,7 +5159,7 @@ void idPhysics_Player::PerformMantle()
 					&& mantleEndHeight < floorHeight + pm_normalviewheight.GetFloat())
 				{
 					// Do a fast pull-push mantle over medium sized obstacle
-					StartMantle(pullFast_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint);
+					StartMantle(pullFast_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint, floorHeight);
 					return;
 				}
 			}
@@ -5144,16 +5168,16 @@ void idPhysics_Player::PerformMantle()
 				// Start with pull if on the ground, hang if not
 				if (groundPlane)
 				{
-					StartMantle(pull_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint);
+					StartMantle(pull_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint, floorHeight);
 				}
 				else
 				{
-					StartMantle(hang_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint);
+					StartMantle(hang_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint, floorHeight);
 				}
 			}
 			else
 			{
-				StartMantle(push_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint);
+				StartMantle(push_DarkModMantlePhase, eyePos, GetOrigin(), mantleEndPoint, floorHeight);
 			}
 		}
 	}
diff --git game/physics/Physics_Player.h game/physics/Physics_Player.h
index ba17de1..712d81e 100644
--- game/physics/Physics_Player.h
+++ game/physics/Physics_Player.h
@@ -571,7 +571,8 @@ protected:
 		EMantlePhase initialMantlePhase,
 		idVec3 eyePos,
 		idVec3 startPos,
-		idVec3 endPos
+		idVec3 endPos,
+		float floatHeight
 	);
 
 	/*!
