diff --git a/source/armarx/navigation/factories/test/factoriesTest.cpp b/source/armarx/navigation/factories/test/factoriesTest.cpp
index 2e7d7fdbefdf5ebc2048dc96704d14885f6ca8f8..587ca5051d0cb50eb37dd3549cca0771b46a8e69 100644
--- a/source/armarx/navigation/factories/test/factoriesTest.cpp
+++ b/source/armarx/navigation/factories/test/factoriesTest.cpp
@@ -64,10 +64,10 @@ BOOST_AUTO_TEST_CASE(testStackCreation)
     const auto navStack = armarx::navigation::fac::NavigationStackFactory::create(dto, scene);
 
     BOOST_CHECK(navStack.globalPlanner.get() != nullptr);
-    BOOST_CHECK(navStack.trajectoryControl.get() != nullptr);
+    // BOOST_CHECK(navStack.trajectoryControl.get() != nullptr);
 
     BOOST_CHECK(dynamic_cast<armarx::navigation::global_planning::AStar*>(
                     navStack.globalPlanner.get()) != nullptr);
-    BOOST_CHECK(dynamic_cast<armarx::navigation::traj_ctrl::TrajectoryFollowingController*>(
-                    navStack.trajectoryControl.get()) != nullptr);
+    // BOOST_CHECK(dynamic_cast<armarx::navigation::traj_ctrl::TrajectoryFollowingController*>(
+    //                 navStack.trajectoryControl.get()) != nullptr);
 }
diff --git a/source/armarx/navigation/server/execution/DummyExecutor.h b/source/armarx/navigation/server/execution/DummyExecutor.h
index ae5e40c6327f7fde24b393271b0697200690dfc8..3a9d25a9fc19645719a5a1df42b7c2587cf2618f 100644
--- a/source/armarx/navigation/server/execution/DummyExecutor.h
+++ b/source/armarx/navigation/server/execution/DummyExecutor.h
@@ -33,26 +33,16 @@ namespace armarx::navigation::server
         }
 
         void
-        move(const core::Twist& twist) override
+        execute(const core::Trajectory& trajectory) override
         {
-            this->twist = twist;
-            //const auto now = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::steady_clock::now());
-
-            //const float dt = now - lastUpdated;
-
-            //lastUpdated = now;
+        }
 
-            const core::Pose diff; // TODO
+        void start() override{};
+        void stop() override{};
 
-            robot->setGlobalPose(robot->getGlobalPose() * diff.matrix());
-        }
 
     private:
         VirtualRobot::RobotPtr robot;
-
-        core::Twist twist;
-
-        std::chrono::microseconds lastUpdated;
     };
 
 } // namespace armarx::navigation::server
diff --git a/source/armarx/navigation/server/test/serverTest.cpp b/source/armarx/navigation/server/test/serverTest.cpp
index 5fb6ce9232b61ea5dcbfb3d0709a0c87958809dd..d7ba7e7f2643f33365b14c8554034ab36ed02bb5 100644
--- a/source/armarx/navigation/server/test/serverTest.cpp
+++ b/source/armarx/navigation/server/test/serverTest.cpp
@@ -21,6 +21,7 @@
  *             GNU General Public License
  */
 
+#include "armarx/navigation/server/scene_provider/SceneProvider.h"
 #include <armarx/navigation/client/NavigationStackConfig.h>
 #include <armarx/navigation/client/services/SimpleEventHandler.h>
 #include <armarx/navigation/core/types.h>
@@ -44,6 +45,42 @@
 
 using namespace armarx::navigation;
 
+namespace armarx::navigation::server::scene_provider
+{
+
+    class DummySceneProvider : public SceneProviderInterface
+    {
+    public:
+        DummySceneProvider() = default;
+
+        const core::Scene&
+        scene() const override
+        {
+            return dummyScene; 
+        };
+
+        bool
+        initialize(const armarx::DateTime&  /*timestamp*/) override
+        {
+            return true;
+        };
+
+        bool
+        synchronize(const armarx::DateTime&  /*timestamp*/) override
+        {
+            return true;
+        };
+
+
+        // non-api
+        ~DummySceneProvider() override = default;
+
+        private:
+        core::Scene dummyScene; // FIXME implement
+    };
+
+} // namespace armarx::navigation::server::scene_provider
+
 BOOST_AUTO_TEST_CASE(testNavigator)
 {
 
@@ -56,19 +93,21 @@ BOOST_AUTO_TEST_CASE(testNavigator)
 
     // TODO create static shared ctor
     server::NavigationStack stack{.globalPlanner = std::make_shared<global_planning::Point2Point>(
-                                      global_planning::Point2PointParams(), scene),
-                                  .trajectoryControl =
-                                      std::make_shared<traj_ctrl::TrajectoryFollowingController>(
-                                          traj_ctrl::TrajectoryFollowingControllerParams(), scene)};
+                                      global_planning::Point2PointParams(), scene)};
+    //   .trajectoryControl =
+    //       std::make_shared<traj_ctrl::TrajectoryFollowingController>(
+    //           traj_ctrl::TrajectoryFollowingControllerParams(), scene)};
 
     // Executor.
     server::DummyExecutor executor{scene.robot, server::DummyExecutor::Params()};
     client::SimpleEventHandler eventHandler;
 
+    server::scene_provider::DummySceneProvider sceneProvider;
+
     server::Navigator navigator(
-        server::Navigator::Config{
-            .stack = stack, .scene = &scene, .general = server::Navigator::Config::General{}},
-        server::Navigator::InjectedServices{.executor = &executor, .publisher = &eventHandler});
+        server::Navigator::Config{.stack = stack, .general = server::Navigator::Config::General{}},
+        server::Navigator::InjectedServices{
+            .executor = &executor, .publisher = &eventHandler, .sceneProvider = &sceneProvider});
     navigator.moveTo(std::vector{goal}, core::NavigationFrame::Absolute);
 
     BOOST_CHECK_EQUAL(true, true);
diff --git a/source/armarx/navigation/trajectory_control/test/trajectory_controlTest.cpp b/source/armarx/navigation/trajectory_control/test/trajectory_controlTest.cpp
index 0f080fae25490b79e080b55a49cfa0375e1d14a5..6ad882342c75fd930f1a086df87579aca737fcb1 100644
--- a/source/armarx/navigation/trajectory_control/test/trajectory_controlTest.cpp
+++ b/source/armarx/navigation/trajectory_control/test/trajectory_controlTest.cpp
@@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerOnTrajectory)
     params.limits.linear = std::numeric_limits<float>::max();
     params.limits.angular = std::numeric_limits<float>::max();
 
-    traj_ctrl::TrajectoryFollowingController controller(params, scene);
+    traj_ctrl::TrajectoryFollowingController controller(scene.robot, params);
 
     constexpr float ffVelocity = 100.0; // ground truth
 
@@ -106,7 +106,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerNextToTrajectory)
     params.limits.linear = std::numeric_limits<float>::max();
     params.limits.angular = std::numeric_limits<float>::max();
 
-    traj_ctrl::TrajectoryFollowingController controller(params, scene);
+    traj_ctrl::TrajectoryFollowingController controller(scene.robot, params);
 
     constexpr float ffVelocity = 100.0; // ground truth
 
@@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerReachGoal)
     params.limits.linear = std::numeric_limits<float>::max();
     params.limits.angular = std::numeric_limits<float>::max();
 
-    traj_ctrl::TrajectoryFollowingController controller(params, scene);
+    traj_ctrl::TrajectoryFollowingController controller(scene.robot, params);
 
     core::TrajectoryPoint tpStart;
     tpStart.waypoint.pose = core::Pose::Identity();
@@ -269,7 +269,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerApplyLimitsExceedLinear)
     params.limits.linear = 500.F;                 // [mm/s]
     params.limits.angular = 2.F * M_PIf32 / 10.F; // [rad/s]
 
-    traj_ctrl::TrajectoryFollowingController controller(params, scene);
+    traj_ctrl::TrajectoryFollowingController controller(scene.robot, params);
 
     const core::Twist unclippedTwist{
         .linear = 600 * Eigen::Vector3f::UnitX(), // 600 vs 500
@@ -315,7 +315,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerApplyLimitsExceedLinear2)
     params.limits.linear = 500.F;                 // [mm/s]
     params.limits.angular = 2.F * M_PIf32 / 10.F; // [rad/s]
 
-    traj_ctrl::TrajectoryFollowingController controller(params, scene);
+    traj_ctrl::TrajectoryFollowingController controller(scene.robot, params);
 
     const core::Twist unclippedTwist{
         .linear = 600 * Eigen::Vector3f::Ones(),  // 600 vs 500
@@ -360,7 +360,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerApplyLimitsExceedAngular)
     params.limits.linear = 500.F;                 // [mm/s]
     params.limits.angular = 2.F * M_PIf32 / 10.F; // [rad/s]
 
-    traj_ctrl::TrajectoryFollowingController controller(params, scene);
+    traj_ctrl::TrajectoryFollowingController controller(scene.robot, params);
 
     const core::Twist unclippedTwist{
         .linear = 400 * Eigen::Vector3f::UnitX(),           // below limit
@@ -406,7 +406,7 @@ BOOST_AUTO_TEST_CASE(testTrajectoryFollowingControllerApplyLimitsExceedBoth)
     params.limits.linear = 500.F;                 // [mm/s]
     params.limits.angular = 2.F * M_PIf32 / 10.F; // [rad/s]
 
-    traj_ctrl::TrajectoryFollowingController controller(params, scene);
+    traj_ctrl::TrajectoryFollowingController controller(scene.robot, params);
 
     const core::Twist unclippedTwist{
         .linear = 600 * Eigen::Vector3f::UnitX(),           // 600 vs 500