diff --git a/Assets/Scenes/Forest.unity b/Assets/Scenes/Forest.unity
index 80e03cb84e8f5bb559a017de041aacd831222f61..215ab3edb3d5f3ac9718f6eca978686eecc16d15 100644
--- a/Assets/Scenes/Forest.unity
+++ b/Assets/Scenes/Forest.unity
@@ -441,8 +441,8 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   allowUserControl: 1
-  inputVelocity: 2.5
-  moveSpeed: 10
+  inputVelocity: 0.5
+  inputDampening: 0.1
   edgeDetectionBoxInsets: {x: 0.1, y: 0.1}
   maxZoom: 5
   minZoom: 1.5
diff --git a/Assets/Scripts/BaseCameraController.cs b/Assets/Scripts/BaseCameraController.cs
index efbc50b5e4496f4343bda8302e123a126e3ac330..0c8b3d20b1659df0b06240a8b020e09162fc5ba7 100644
--- a/Assets/Scripts/BaseCameraController.cs
+++ b/Assets/Scripts/BaseCameraController.cs
@@ -9,7 +9,7 @@ public class BaseCameraController : MonoBehaviour
 
     [Header("Movement")]
     [SerializeField] float inputVelocity = 2f;
-    [SerializeField] float moveSpeed = 10f;
+    [SerializeField] float inputDampening = .1f;
     [SerializeField] Vector2 edgeDetectionBoxInsets = new Vector2(0.1f, 0.1f);
 
     [Header("Zoom")]
@@ -26,6 +26,8 @@ public class BaseCameraController : MonoBehaviour
     InsetCameraEdges mouseMovementEdges;
     bool waitForMouseOutsideEdges = false;
     LayeredInterpolator zoomInterpolator;
+    Interpolator xInputInterpolator;
+    Interpolator yInputInterpolator;
     LayeredInterpolator xPositionInterpolator;
     LayeredInterpolator yPositionInterpolator;
     Vector2 inputVector;
@@ -60,8 +62,10 @@ public class BaseCameraController : MonoBehaviour
 
         mouseMovementEdges = new InsetCameraEdges(camera, edgeDetectionBoxInsets);
         zoomInterpolator = new LayeredInterpolator(new Interpolator(1 / zoomSpeed, camera.orthographicSize, camera.orthographicSize, minZoom, maxZoom));
-        xPositionInterpolator = new LayeredInterpolator(new Interpolator(1 / moveSpeed, transform.position.x));
-        yPositionInterpolator = new LayeredInterpolator(new Interpolator(1 / moveSpeed, transform.position.y));
+        xInputInterpolator = new Interpolator(inputDampening);
+        yInputInterpolator = new Interpolator(inputDampening);
+        xPositionInterpolator = new LayeredInterpolator(new Interpolator(inputDampening, transform.position.x));
+        yPositionInterpolator = new LayeredInterpolator(new Interpolator(inputDampening, transform.position.y));
         UpdateColliderSize();
     }
 
@@ -74,7 +78,7 @@ public class BaseCameraController : MonoBehaviour
         }
 
 
-        var inputZoomDelta = (allowUserControl && !zoomInterpolator.hasLayers) ? Input.mouseScrollDelta.y * -zoomStepSize : 0;
+        var inputZoomDelta = IsUserControlEnabled() ? Input.mouseScrollDelta.y * -zoomStepSize : 0;
         if (inputZoomDelta != 0)
         {
             zoomInterpolator.targetValue += inputZoomDelta;
@@ -91,7 +95,7 @@ public class BaseCameraController : MonoBehaviour
             waitForMouseOutsideEdges = true;
         }
         mouseMovementEdges.DrawDebug(waitForMouseOutsideEdges ? Color.red : Color.green);
-        var mouseViewportPos = allowUserControl ? camera.ScreenToViewportPoint(Input.mousePosition) : new Vector3(0.5f, 0.5f);
+        var mouseViewportPos = IsUserControlEnabled() ? camera.ScreenToViewportPoint(Input.mousePosition) : new Vector3(0.5f, 0.5f);
         var mouseInputVector = mouseMovementEdges.GetOutOfBoundsDirection(mouseViewportPos);
         if (waitForMouseOutsideEdges && mouseInputVector.magnitude == 0)
         {
@@ -101,25 +105,29 @@ public class BaseCameraController : MonoBehaviour
         {
             inputVector = mouseInputVector;
         }
+        xInputInterpolator.targetValue = inputVector.x * zoomRatio * inputVelocity;
+        yInputInterpolator.targetValue = inputVector.y * zoomRatio * inputVelocity;
     }
 
     void FixedUpdate()
     {
         xPositionInterpolator.currentValue = rigidbody.position.x;
         yPositionInterpolator.currentValue = rigidbody.position.y;
-        if (allowUserControl && !xPositionInterpolator.hasLayers && !yPositionInterpolator.hasLayers)
+        var overrideInput = xPositionInterpolator.hasLayers || yPositionInterpolator.hasLayers;
+        var targetPos = overrideInput ?
+            new Vector3(xPositionInterpolator.Tick(), yPositionInterpolator.Tick()) :
+            transform.position + new Vector3(xInputInterpolator.Tick(), yInputInterpolator.Tick());
+        rigidbody.MovePosition(targetPos);
+        if (overrideInput)
         {
-            if (inputVector.x != 0)
-            {
-                xPositionInterpolator.targetValue = rigidbody.position.x + inputVector.x * zoomRatio * inputVelocity;
-            }
-            if (inputVector.y != 0)
-            {
-                yPositionInterpolator.targetValue = rigidbody.position.y + inputVector.y * zoomRatio * inputVelocity;
-            }
+            xInputInterpolator.Reset();
+            yInputInterpolator.Reset();
         }
-        var targetPos = new Vector3(xPositionInterpolator.Tick(), yPositionInterpolator.Tick());
-        rigidbody.MovePosition(targetPos);
+    }
+
+    bool IsUserControlEnabled()
+    {
+        return allowUserControl && !zoomInterpolator.hasLayers && !xPositionInterpolator.hasLayers && !yPositionInterpolator.hasLayers;
     }
 
     void UpdateColliderSize()
diff --git a/Assets/Scripts/Interpolator.cs b/Assets/Scripts/Interpolator.cs
index 5e14bd44341fe26482ae369ff4feff173ca1a31d..13dd7840a4b40cb38b6d6b64517f6d492d99a1cd 100644
--- a/Assets/Scripts/Interpolator.cs
+++ b/Assets/Scripts/Interpolator.cs
@@ -56,6 +56,13 @@ public class Interpolator
         return currentValue;
     }
 
+    public void Reset()
+    {
+        velocity = 0;
+        currentValue = 0;
+        targetValue = 0;
+    }
+
     public override string ToString() => $"Interpolator{{ Running: {running} Duration: {duration} Current Value: {currentValue} Target Value: {targetValue} Velocity: {velocity} }}";
 
 }