diff --git a/src/TimedPlanner.cpp b/src/TimedPlanner.cpp
index 4edaaaab86ed1f6a4547e99924e221d5bfe05c4e..e53c46ab12b51442f76fa159b964ec7e3d3657e7 100644
--- a/src/TimedPlanner.cpp
+++ b/src/TimedPlanner.cpp
@@ -74,8 +74,7 @@ void TimedPlanner::loadCircularTrajectory(double radius, geometry_msgs::Point or
   }
 }
 
-bool TimedPlanner::loadWaypoints() {
-
+bool TimedPlanner::updateWaypoints() {
   if (nextTrajectory.is_initialized()) {
     currentTrajectory = nextTrajectory.get();
     nextTrajectory.reset();
@@ -110,33 +109,28 @@ std::vector<moveit_msgs::RobotTrajectory> TimedPlanner::split(moveit::planning_i
 
 }
 
-void TimedPlanner::doMotion(const ros::NodeHandle &node_handle, moveit::planning_interface::MoveGroupInterface &group) {
-
-  loadWaypoints();
+void TimedPlanner::doMotion() {
+  updateWaypoints();
 
   do {
     for (auto &waypoint : currentTrajectory.waypoints) {
-
       moveit::planning_interface::MoveGroupInterface::Plan plan;
-
-      if (TrajectoryUtil::computePathToPose(group, plan, waypoint.pose, waypoint.mode, 0.8, 0.8)) {
-
-        if (nextTrajectory.is_initialized()) {
-          return;
-        }
-
-        for (auto trajectory : split(group, plan)) {
+      if (TrajectoryUtil::computePathToPose(*group, plan, waypoint.pose, waypoint.mode, 0.8, 0.8)) {
+        for (auto trajectory : split(*group, plan)) {
+          if (nextTrajectory.is_initialized()) {
+            ROS_WARN_STREAM("terminating current trajectory");
+            return;
+          }
           ROS_INFO_STREAM(
               "Moving to the next waypoint with speed factor " << motionSpeedFactor << " in mode " << waypoint.mode);
           TrajectoryUtil::applyMotionSpeedFactor(trajectory, motionSpeedFactor);
-          moveit_msgs::MoveItErrorCodes errorCode = group.execute(trajectory);
+          moveit_msgs::MoveItErrorCodes errorCode = group->execute(trajectory);
           if (errorCode.val != errorCode.SUCCESS) {
             ROS_ERROR_STREAM("Error Code from executing segment: " << errorCode);
           }
         }
       } else {
-        ROS_ERROR_STREAM(
-            "Unable to compute " << waypoint.mode << " path to the next waypoint." << std::endl << waypoint);
+        ROS_ERROR_STREAM("Unable to find " << waypoint.mode << " path to the next waypoint." << std::endl << waypoint);
       }
     }
   } while (currentTrajectory.loop);
@@ -162,11 +156,10 @@ void TimedPlanner::newMotionSpeedFactorCallback(const std_msgs::Float64ConstPtr
 
 }
 
-TimedPlanner::TimedPlanner(moveit::planning_interface::MoveGroupInterface &group, const double defaultVelocity,
-                           std::string defaultPlanningMode) : default_velocity(
-    defaultVelocity), default_planning_mode(std::move(defaultPlanningMode)) {
-
-  ros::NodeHandle node_handle("panda_mqtt_connector");
+TimedPlanner::TimedPlanner(ros::NodeHandle &node_handle, moveit::planning_interface::MoveGroupInterface &group,
+                           const double defaultVelocity, std::string defaultPlanningMode) :
+    node_handle(&node_handle), group(&group), default_velocity(defaultVelocity),
+    default_planning_mode(std::move(defaultPlanningMode)), motionSpeedFactor(defaultVelocity) {
 
   std::string defaultTrajectory = "<no value provided>";
   node_handle.getParam("default_trajectory", defaultTrajectory);
@@ -218,7 +211,7 @@ int main(int argc, char **argv) {
   // setup this ros-node
   ros::init(argc, argv, "timed_planner");
   ros::NodeHandle node_handle("panda_mqtt_connector");
-  ros::AsyncSpinner spinner(1);
+  ros::AsyncSpinner spinner(2);
   spinner.start();
 
   // wait for robot init of robot_state_initializer
@@ -229,15 +222,6 @@ int main(int argc, char **argv) {
   moveit::planning_interface::MoveGroupInterface group("panda_arm");
   moveit::planning_interface::PlanningSceneInterface planning_scene_interface;
 
-  TimedPlanner planner(group, .5, TrajectoryUtil::FLUID_PATH);
-
-  ros::Subscriber sub = node_handle.subscribe("trajectory_update", 1000, &TimedPlanner::newTrajectoryCallback,
-                                              &planner);
-
-  ros::Subscriber velocitySubscriber = node_handle.subscribe("max_velocity", 1000,
-                                                             &TimedPlanner::newMotionSpeedFactorCallback,
-                                                             &planner);
-
   // init motionSpeedFactor
   double factor = -1;
   if (node_handle.getParam("robot_speed_factor", factor)) {
@@ -254,11 +238,18 @@ int main(int argc, char **argv) {
   constructPlate(collision_objects, 5.0, 5.0);
   planning_scene_interface.applyCollisionObjects(collision_objects);
 
+  // everything is set up, we can start the planner now
+  TimedPlanner planner(node_handle, group, .5, TrajectoryUtil::FLUID_PATH);
+  ros::Subscriber sub = node_handle.subscribe("trajectory_update", 1000, &TimedPlanner::newTrajectoryCallback,
+                                              &planner);
+  ros::Subscriber velocitySubscriber = node_handle.subscribe("max_velocity", 1000,
+                                                             &TimedPlanner::newMotionSpeedFactorCallback,
+                                                             &planner);
   while (ros::ok()) {
 
     // execute a trajectory
-    planner.doMotion(node_handle, group);
-
+    planner.doMotion();
+    ros::Rate(100).sleep();
     ros::spinOnce();
   }
 
diff --git a/src/TimedPlanner.h b/src/TimedPlanner.h
index 2c1b39cabad3eebab1d3eaf5066e5714ac50c9ca..15cef7b8c65350729ab8fd959be4a77c68e48fd8 100644
--- a/src/TimedPlanner.h
+++ b/src/TimedPlanner.h
@@ -23,9 +23,9 @@ public:
   static std::vector<moveit_msgs::RobotTrajectory>
   split(MoveGroupInterface &group, const MoveGroupInterface::Plan &plan);
 
-  void doMotion(const ros::NodeHandle &node_handle, MoveGroupInterface &group);
+  void doMotion();
 
-  TimedPlanner(MoveGroupInterface &group, double defaultVelocity, std::string defaultPlanningMode);
+  TimedPlanner(ros::NodeHandle &node_handle, MoveGroupInterface &group, double defaultVelocity, std::string defaultPlanningMode);
 
   void newTrajectoryCallback(const panda_mqtt_connector::Trajectory::ConstPtr &msg);
   void newMotionSpeedFactorCallback(const std_msgs::Float64ConstPtr &msg);
@@ -33,10 +33,13 @@ public:
 private:
   double motionSpeedFactor;
 
+  std::shared_ptr<ros::NodeHandle> node_handle;
+  std::shared_ptr<moveit::planning_interface::MoveGroupInterface> group;
+
   panda_mqtt_connector::Trajectory currentTrajectory;
   boost::optional<panda_mqtt_connector::Trajectory> nextTrajectory;
 
-  bool loadWaypoints();
+  bool updateWaypoints();
 
   void loadSquareTrajectory();