diff --git a/source/game/LadderMovementController.cpp b/source/game/LadderMovementController.cpp
index 6152853f6bdaecc805dc1ce60e52c9693c7e9f76..ef824bf04907b941823c1931fcf2562008b94d13 100644
--- a/source/game/LadderMovementController.cpp
+++ b/source/game/LadderMovementController.cpp
@@ -45,9 +45,10 @@ void CLadderMovementController::setCharacter(CBaseCharacter *pCharacter)
 	pCharacterController->setGravity(float3(0.0f, 0.0f, 0.0f));
 	pCharacterController->setVelocityForTimeInterval(float3(0.0f, 0.0f, 0.0f), 0.0f);
 
-	TODO("Make move smoother");
-	float3 vPointOnLadder = SMProjectPointOnLine(m_pCharacter->getPos(), m_vLadderPoint[0], m_vLadderPoint[1]);
-	m_pCharacter->setPos(vPointOnLadder);
+	m_mounting.is = true;
+	m_mounting.fFrac = 0.0f;
+	m_mounting.vStartPos = m_pCharacter->getPos();
+	m_mounting.vTargetPos = SMProjectPointOnLine(m_pCharacter->getPos(), m_vLadderPoint[0], m_vLadderPoint[1]);
 }
 
 void CLadderMovementController::handleMove(const float3 &vDir)
@@ -68,7 +69,17 @@ bool CLadderMovementController::handleUse()
 
 void CLadderMovementController::update(float fDt)
 {
-	if(m_bWillDismount)
+	if(m_mounting.is)
+	{
+		m_mounting.fFrac += 7.0f * fDt;
+		if(m_mounting.fFrac > 1.0f)
+		{
+			m_mounting.fFrac = 1.0f;
+			m_mounting.is = false;
+		}
+		m_pCharacter->setPos(vlerp(m_mounting.vStartPos, m_mounting.vTargetPos, m_mounting.fFrac));
+	}
+	else if(m_bWillDismount)
 	{
 		((CPlayer*)m_pCharacter)->m_vCurrentSpeed = m_vMoveDir;
 		m_pCharacter->setMovementController(NULL);
diff --git a/source/game/LadderMovementController.h b/source/game/LadderMovementController.h
index a41cc4ac208975e67aba2a2005d6e2157cc878aa..0b34f2256e1e0e4051f4f39cf1d2a40e87046739 100644
--- a/source/game/LadderMovementController.h
+++ b/source/game/LadderMovementController.h
@@ -26,6 +26,15 @@ private:
 
 	float3_t m_vMoveDir;
 
+	struct
+	{
+		bool is = false;
+		float fFrac = 0.0f;
+		float3_t vStartPos;
+		float3_t vTargetPos;
+	}
+	m_mounting;
+
 	bool m_bWillDismount = false;
 };