diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointCartesianWaypointController.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointCartesianWaypointController.cpp
index 0078a0e05e3743fd076f257e7a45777ca8253873..edb5b230b98170649235f345ad416aaba70d3140 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointCartesianWaypointController.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointCartesianWaypointController.cpp
@@ -8,7 +8,7 @@
 
 namespace armarx
 {
-    std::ostream& operator<<(std::ostream& out, const CartesianWaypointControllerConfigWithForceLimit& cfg)
+    std::ostream& operator<<(std::ostream& out, const NJointCartesianWaypointControllerRuntimeConfig& cfg)
     {
         out << "maxPositionAcceleration     " << cfg.wpCfg.maxPositionAcceleration << '\n'
             << "maxOrientationAcceleration  " << cfg.wpCfg.maxOrientationAcceleration << '\n'
@@ -137,6 +137,7 @@ namespace armarx
                 _rtWpController->setConfig(r.cfg.wpCfg);
                 _rtForceThreshold = r.cfg.forceThreshold;
                 _publishForceThreshold = _rtForceThreshold;
+                _rtOptimizeNullspaceIfTargetWasReached = r.cfg.optimizeNullspaceIfTargetWasReached;
                 ARMARX_RT_LOGF_IMPORTANT("updated the controller config");
             }
             if (r.wpsUpdated)
@@ -203,7 +204,8 @@ namespace armarx
         {
             rt2nonrtBuf.tcpTarg = rt2nonrtBuf.tcp;
         }
-        _rtStopConditionReached = _rtStopConditionReached || reachedFtLimit || reachedTarget;
+        _rtStopConditionReached = _rtStopConditionReached || reachedFtLimit ||
+                                  (reachedTarget && !_rtOptimizeNullspaceIfTargetWasReached);
         _publishIsAtTarget = reachedTarget;
         if (!_rtHasWps || _rtStopConditionReached)
         {
@@ -231,7 +233,7 @@ namespace armarx
     {
         return _publishIsAtTarget;
     }
-    void NJointCartesianWaypointController::setConfig(const CartesianWaypointControllerConfigWithForceLimit& cfg, const Ice::Current&)
+    void NJointCartesianWaypointController::setConfig(const NJointCartesianWaypointControllerRuntimeConfig& cfg, const Ice::Current&)
     {
         std::lock_guard g{_tripBufWpCtrlMut};
         auto& w = _tripBufWpCtrl.getWriteBuffer();
@@ -262,7 +264,7 @@ namespace armarx
         _tripBufWpCtrl.commitWrite();
         ARMARX_IMPORTANT << "set new waypoint\n" << wp;
     }
-    void NJointCartesianWaypointController::setConfigAndWaypoints(const CartesianWaypointControllerConfigWithForceLimit& cfg,
+    void NJointCartesianWaypointController::setConfigAndWaypoints(const NJointCartesianWaypointControllerRuntimeConfig& cfg,
             const std::vector<Eigen::Matrix4f>& wps,
             const Ice::Current&)
     {
@@ -275,7 +277,7 @@ namespace armarx
         _tripBufWpCtrl.commitWrite();
         ARMARX_IMPORTANT << "set new config\n" << cfg << " and new waypoints\n" << wps;
     }
-    void NJointCartesianWaypointController::setConfigAndWaypoint(const CartesianWaypointControllerConfigWithForceLimit& cfg,
+    void NJointCartesianWaypointController::setConfigAndWaypoint(const NJointCartesianWaypointControllerRuntimeConfig& cfg,
             const Eigen::Matrix4f& wp,
             const Ice::Current&)
     {
diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointCartesianWaypointController.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointCartesianWaypointController.h
index d16afbcbe35a604e85dba2ff80972db59fb3b227..af526869cc86ce553e84c1dd772f5985deb622da 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointCartesianWaypointController.h
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointCartesianWaypointController.h
@@ -52,11 +52,11 @@ namespace armarx
         bool hasReachedTarget(const Ice::Current& = Ice::emptyCurrent) override;
         bool hasReachedForceLimit(const Ice::Current& = Ice::emptyCurrent) override;
 
-        void setConfig(const CartesianWaypointControllerConfigWithForceLimit& cfg, const Ice::Current& = Ice::emptyCurrent) override;
+        void setConfig(const NJointCartesianWaypointControllerRuntimeConfig& cfg, const Ice::Current& = Ice::emptyCurrent) override;
         void setWaypoints(const std::vector<Eigen::Matrix4f>& wps, const Ice::Current& = Ice::emptyCurrent) override;
         void setWaypoint(const Eigen::Matrix4f& wp, const Ice::Current& = Ice::emptyCurrent) override;
-        void setConfigAndWaypoints(const CartesianWaypointControllerConfigWithForceLimit& cfg, const std::vector<Eigen::Matrix4f>& wps, const Ice::Current& = Ice::emptyCurrent) override;
-        void setConfigAndWaypoint(const CartesianWaypointControllerConfigWithForceLimit& cfg, const Eigen::Matrix4f& wp, const Ice::Current& = Ice::emptyCurrent) override;
+        void setConfigAndWaypoints(const NJointCartesianWaypointControllerRuntimeConfig& cfg, const std::vector<Eigen::Matrix4f>& wps, const Ice::Current& = Ice::emptyCurrent) override;
+        void setConfigAndWaypoint(const NJointCartesianWaypointControllerRuntimeConfig& cfg, const Eigen::Matrix4f& wp, const Ice::Current& = Ice::emptyCurrent) override;
         void stopMovement(const Ice::Current& = Ice::emptyCurrent) override;
 
         FTSensorValue getFTSensorValue(const Ice::Current& = Ice::emptyCurrent) override;
@@ -73,7 +73,7 @@ namespace armarx
         struct CtrlData
         {
             std::vector<Eigen::Matrix4f> wps;
-            CartesianWaypointControllerConfigWithForceLimit cfg;
+            NJointCartesianWaypointControllerRuntimeConfig cfg;
             float skipRad2mmFactor = 500;
             bool wpsUpdated = false;
             bool cfgUpdated = false;
@@ -108,6 +108,7 @@ namespace armarx
         Eigen::Vector3f _rtForceOffset;
 
         float _rtForceThreshold = -1;
+        bool _rtOptimizeNullspaceIfTargetWasReached = false;
         bool _rtHasWps = false;
         bool _rtStopConditionReached = false;
 
diff --git a/source/RobotAPI/gui-plugins/CartesianWaypointControlGui/CartesianWaypointControlGuiWidgetController.cpp b/source/RobotAPI/gui-plugins/CartesianWaypointControlGui/CartesianWaypointControlGuiWidgetController.cpp
index 93bb8b33a3d60d24e224475cf21ac35e15f881f0..06495d8290f40fc5dd14aebabe6460262cf9714b 100644
--- a/source/RobotAPI/gui-plugins/CartesianWaypointControlGui/CartesianWaypointControlGuiWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/CartesianWaypointControlGui/CartesianWaypointControlGuiWidgetController.cpp
@@ -217,9 +217,9 @@ namespace armarx
         _ui.labelParsingSuccess->setText("Parsed " + QString::number(_lastParsedWPs.size()) + " waypoints.");
     }
 
-    CartesianWaypointControllerConfigWithForceLimit CartesianWaypointControlGuiWidgetController::readRunCfg() const
+    NJointCartesianWaypointControllerRuntimeConfig CartesianWaypointControlGuiWidgetController::readRunCfg() const
     {
-        CartesianWaypointControllerConfigWithForceLimit cfg;
+        NJointCartesianWaypointControllerRuntimeConfig cfg;
 
         cfg.wpCfg.maxPositionAcceleration     = static_cast<float>(_ui.doubleSpinBoxMaxAccPos->value());
         cfg.wpCfg.maxOrientationAcceleration  = static_cast<float>(_ui.doubleSpinBoxMaxAccOri->value());
diff --git a/source/RobotAPI/gui-plugins/CartesianWaypointControlGui/CartesianWaypointControlGuiWidgetController.h b/source/RobotAPI/gui-plugins/CartesianWaypointControlGui/CartesianWaypointControlGuiWidgetController.h
index 4816a63feab9995b559f27e5a32a541a26dcf8d3..e8cf03487dd0d30be29158713bd1ccd2a9e943b3 100644
--- a/source/RobotAPI/gui-plugins/CartesianWaypointControlGui/CartesianWaypointControlGuiWidgetController.h
+++ b/source/RobotAPI/gui-plugins/CartesianWaypointControlGui/CartesianWaypointControlGuiWidgetController.h
@@ -103,7 +103,7 @@ namespace armarx
         void triggerParsing();
 
     private:
-        CartesianWaypointControllerConfigWithForceLimit readRunCfg() const;
+        NJointCartesianWaypointControllerRuntimeConfig readRunCfg() const;
         void deleteOldController();
 
     private:
diff --git a/source/RobotAPI/interface/units/RobotUnit/NJointCartesianWaypointController.ice b/source/RobotAPI/interface/units/RobotUnit/NJointCartesianWaypointController.ice
index 765afbb10068a59ecec091e416dfdff73b0d2ea7..00a1419fca440de821d31c407d32dbfbee9bef4f 100644
--- a/source/RobotAPI/interface/units/RobotUnit/NJointCartesianWaypointController.ice
+++ b/source/RobotAPI/interface/units/RobotUnit/NJointCartesianWaypointController.ice
@@ -29,10 +29,11 @@
 
 module armarx
 {
-    struct CartesianWaypointControllerConfigWithForceLimit
+    struct NJointCartesianWaypointControllerRuntimeConfig
     {
         CartesianWaypointControllerConfig wpCfg;
         float forceThreshold = -1; // < 0 -> no limit
+        bool optimizeNullspaceIfTargetWasReached = false;
     };
     
     struct FTSensorValue
@@ -45,7 +46,7 @@ module armarx
     class NJointCartesianWaypointControllerConfig extends NJointControllerConfig
     {
         string rns;
-        CartesianWaypointControllerConfigWithForceLimit runCfg;
+        NJointCartesianWaypointControllerRuntimeConfig runCfg;
         string ftName; //optional
     };
 
@@ -54,11 +55,11 @@ module armarx
         idempotent bool hasReachedTarget();
         idempotent bool hasReachedForceLimit();
 
-        void setConfig(CartesianWaypointControllerConfigWithForceLimit cfg);
+        void setConfig(NJointCartesianWaypointControllerRuntimeConfig cfg);
         void setWaypoints(Eigen::Matrix4fSeq wps);
         void setWaypoint(Eigen::Matrix4f wp);
-        void setConfigAndWaypoints(CartesianWaypointControllerConfigWithForceLimit cfg, Eigen::Matrix4fSeq wps);
-        void setConfigAndWaypoint(CartesianWaypointControllerConfigWithForceLimit cfg, Eigen::Matrix4f wp);
+        void setConfigAndWaypoints(NJointCartesianWaypointControllerRuntimeConfig cfg, Eigen::Matrix4fSeq wps);
+        void setConfigAndWaypoint(NJointCartesianWaypointControllerRuntimeConfig cfg, Eigen::Matrix4f wp);
         
         FTSensorValue getFTSensorValue();
         void setCurrentFTAsOffset();
diff --git a/source/RobotAPI/libraries/ControllerUIUtility/NJointCartesianWaypointControllerConfig/RemoteGui.cpp b/source/RobotAPI/libraries/ControllerUIUtility/NJointCartesianWaypointControllerConfig/RemoteGui.cpp
index 2bd5c3cae52f6bb9ccc245eacd162e14b06e4458..7998ef600a583592b7aae38022f9f19435291df8 100644
--- a/source/RobotAPI/libraries/ControllerUIUtility/NJointCartesianWaypointControllerConfig/RemoteGui.cpp
+++ b/source/RobotAPI/libraries/ControllerUIUtility/NJointCartesianWaypointControllerConfig/RemoteGui.cpp
@@ -25,10 +25,11 @@ namespace armarx::RemoteGui
 {
     detail::GroupBoxBuilder makeConfigGui(
         const std::string& name,
-        const CartesianWaypointControllerConfigWithForceLimit& val)
+        const NJointCartesianWaypointControllerRuntimeConfig& val)
     {
         detail::GroupBoxBuilder builder = makeConfigGui(name, val.wpCfg);
         auto& cs = builder.child(0)->children;
+
         cs.emplace_back(RemoteGui::makeTextLabel("Force limit:"));
         cs.emplace_back(RemoteGui::makeFloatSpinBox(name + "_forceThreshold")
                         .min(-1)
@@ -36,17 +37,25 @@ namespace armarx::RemoteGui
                         .value(val.forceThreshold)
                         .decimals(3));
         cs.emplace_back(new RemoteGui::HSpacer);
+
+        cs.emplace_back(new RemoteGui::Widget);
+        cs.emplace_back(RemoteGui::makeCheckBox(name + "_optimizeNullspaceIfTargetWasReached")
+                        .value(val.optimizeNullspaceIfTargetWasReached)
+                        .label("Optimize nullspace if target was reached"));
+        cs.emplace_back(new RemoteGui::HSpacer);
+
         return builder;
     }
 
     template <>
-    CartesianWaypointControllerConfigWithForceLimit getValue<CartesianWaypointControllerConfigWithForceLimit>(
+    NJointCartesianWaypointControllerRuntimeConfig getValue<NJointCartesianWaypointControllerRuntimeConfig>(
         ValueMap const& values,
         std::string const& name)
     {
-        CartesianWaypointControllerConfigWithForceLimit cfg;
+        NJointCartesianWaypointControllerRuntimeConfig cfg;
         getValue(cfg.wpCfg,          values, name);
         getValue(cfg.forceThreshold, values, name + "_forceThreshold");
+        getValue(cfg.optimizeNullspaceIfTargetWasReached, values, name + "_optimizeNullspaceIfTargetWasReached");
         return cfg;
     }
 }
diff --git a/source/RobotAPI/libraries/ControllerUIUtility/NJointCartesianWaypointControllerConfig/RemoteGui.h b/source/RobotAPI/libraries/ControllerUIUtility/NJointCartesianWaypointControllerConfig/RemoteGui.h
index 4951d5efac47f1197b36a8c99379962b6524128b..3f5f2b12167071338a4ca2384c4f1ff840be6d7b 100644
--- a/source/RobotAPI/libraries/ControllerUIUtility/NJointCartesianWaypointControllerConfig/RemoteGui.h
+++ b/source/RobotAPI/libraries/ControllerUIUtility/NJointCartesianWaypointControllerConfig/RemoteGui.h
@@ -30,10 +30,10 @@ namespace armarx::RemoteGui
 {
     detail::GroupBoxBuilder makeConfigGui(
         const std::string& name,
-        const CartesianWaypointControllerConfigWithForceLimit& val);
+        const NJointCartesianWaypointControllerRuntimeConfig& val);
 
     template <>
-    CartesianWaypointControllerConfigWithForceLimit getValue<CartesianWaypointControllerConfigWithForceLimit>(
+    NJointCartesianWaypointControllerRuntimeConfig getValue<NJointCartesianWaypointControllerRuntimeConfig>(
         ValueMap const& values,
         std::string const& name);
 }