diff --git a/data/RobotAPI/VariantInfo-RobotAPI.xml b/data/RobotAPI/VariantInfo-RobotAPI.xml
index fac11b677edbf7fc26cd2538e453981601e94f13..9d9342ab21b51d11fd188a70c5e4cf6066afff24 100644
--- a/data/RobotAPI/VariantInfo-RobotAPI.xml
+++ b/data/RobotAPI/VariantInfo-RobotAPI.xml
@@ -43,10 +43,18 @@
         <Proxy include="RobotAPI/interface/units/PlatformUnitInterface.h"
             humanName="Platform Unit (obstacle avoiding)"
             typeName="PlatformUnitInterfacePrx"
-            memberName="obstacleAvoidingPlatformUnit"
-            getterName="getObstacleAvoidingPlatformUnit"
-            propertyName="ObstacleAvoidingPlatformUnitName"
+            memberName="platformUnit1"
+            getterName="getPlatformUnit1"
+            propertyName="PlatformUnitName1"
             propertyDefaultValue="ObstacleAvoidingPlatformUnit"
+	    propertyIsOptional="true" />
+         <Proxy include="RobotAPI/interface/units/PlatformUnitInterface.h"
+            humanName="Platform Unit (obstacle aware)"
+            typeName="PlatformUnitInterfacePrx"
+            memberName="platformUnit2"
+            getterName="getPlatformUnit2"
+            propertyName="PlatformUnitName2"
+            propertyDefaultValue="ObstacleAwarePlatformUnit"
             propertyIsOptional="true" />
         <Proxy include="RobotAPI/interface/observers/PlatformUnitObserverInterface.h"
             humanName="Platform Unit Observer"
diff --git a/scenarios/dasd/config/DynamicObstacleManager.cfg b/scenarios/dasd/config/DynamicObstacleManager.cfg
index fa54617910f49a719e8a00a6e430cb815c0e9fb2..0eabec6c1f57706ae48e25fe4b2f92f67c85c8a5 100644
--- a/scenarios/dasd/config/DynamicObstacleManager.cfg
+++ b/scenarios/dasd/config/DynamicObstacleManager.cfg
@@ -179,7 +179,7 @@ ArmarX.DynamicObstacleManager.MinObstacleValueForAccepting = 50
 #  - Default:            0.899999976
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.DynamicObstacleManager.MinSampleRatioPerLineSegment = 0.899999976
+ArmarX.DynamicObstacleManager.MinSampleRatioPerLineSegment = 0.5
 
 
 # ArmarX.DynamicObstacleManager.MinimumLoggingLevel:  Local logging level only for this component
@@ -188,7 +188,7 @@ ArmarX.DynamicObstacleManager.MinObstacleValueForAccepting = 50
 #  - Case sensitivity:   yes
 #  - Required:           no
 #  - Possible values: {Debug, Error, Fatal, Important, Info, Undefined, Verbose, Warning}
-# ArmarX.DynamicObstacleManager.MinimumLoggingLevel = Undefined
+ArmarX.DynamicObstacleManager.MinimumLoggingLevel = Debug
 
 
 # ArmarX.DynamicObstacleManager.ObjectName:  Name of IceGrid well-known object
@@ -229,7 +229,7 @@ ArmarX.DynamicObstacleManager.ObstacleSecurityMargin = 300
 #  - Default:            500
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.DynamicObstacleManager.UpdateInterval = 500
+ArmarX.DynamicObstacleManager.UpdateInterval = 350
 
 
 # ArmarX.EnableProfiling:  Enable profiling of CPU load produced by this application
diff --git a/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.cpp b/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.cpp
index 42cad7e869e398d5dca9c0505014e052dac0f408..41fc3e85f7a6a7250c47fe58c0730973a16480be 100644
--- a/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.cpp
+++ b/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.cpp
@@ -120,6 +120,7 @@ namespace armarx
 
     void DynamicObstacleManager::add_decayable_line_segment(const Eigen::Vector2f& line_start, const Eigen::Vector2f& line_end, const Ice::Current&)
     {
+        TIMING_START(add_decayable_line_segment);
         const Eigen::Vector2f difference_vec = line_end - line_start;
         const float length = difference_vec.norm();
         const Eigen::Vector2f center_vec = line_start + 0.5 * difference_vec;
@@ -141,6 +142,7 @@ namespace armarx
         {
             std::shared_lock<std::shared_mutex> l(m_managed_obstacles_mutex);
 
+            TIMING_START(add_decayable_line_segment_mutex);
             // First check own obstacles
             for (ManagedObstaclePtr& managed_obstacle : m_managed_obstacles)
             {
@@ -156,13 +158,15 @@ namespace armarx
                     managed_obstacle->line_matches.push_back(line_start);
                     managed_obstacle->line_matches.push_back(line_end);
                     managed_obstacle->m_last_matched = IceUtil::Time::now();
+                    TIMING_END(add_decayable_line_segment_mutex);
                     return;
                 }
             }
+            TIMING_END(add_decayable_line_segment_mutex);
         }
 
         // Second check the obstacles from the obstacle avoidance
-        for (const auto& published_obstacle : m_obstacle_detection->getObstacles())
+        /*for (const auto& published_obstacle : m_obstacle_detection->getObstacles())
         {
             float coverage = ManagedObstacle::line_segment_ellipsis_coverage(
             {published_obstacle.posX, published_obstacle.posY}, published_obstacle.axisLengthX, published_obstacle.axisLengthY, published_obstacle.yaw,
@@ -173,7 +177,7 @@ namespace armarx
                 ARMARX_DEBUG << "Found the obstacle in the static obstacle list! Matching name: " << published_obstacle.name;
                 return;
             }
-        }
+        }*/
 
         ARMARX_DEBUG << " No matching obstacle found. Create new obstacle and add to list";
         ManagedObstaclePtr new_managed_obstacle(new ManagedObstacle());
@@ -199,6 +203,15 @@ namespace armarx
             std::lock_guard<std::shared_mutex> l(m_managed_obstacles_mutex);
             m_managed_obstacles.push_back(new_managed_obstacle);
         }
+        TIMING_END(add_decayable_line_segment);
+    }
+
+    void DynamicObstacleManager::add_decayable_line_segments(const dynamicobstaclemanager::LineSegments& lines, const Ice::Current& c)
+    {
+        for (const auto& line : lines)
+        {
+            add_decayable_line_segment(line.lineStart, line.lineEnd, c);
+        }
     }
 
 
@@ -248,7 +261,7 @@ namespace armarx
 
         const float sample_step = 5; // in [mm], sample step size towards goal.
         const float distance_to_goal = (goal - agentPosition).norm() + safetyRadius;
-        float current_distance = sample_step;
+        float current_distance = safetyRadius;
 
         while (current_distance < distance_to_goal)
         {
diff --git a/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.h b/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.h
index b6a4371232cd0c6d60359bb1ec473c1e15360e38..5f2d8065a307706ea16789930c12f5165d6044eb 100644
--- a/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.h
+++ b/source/RobotAPI/components/DynamicObstacleManager/DynamicObstacleManager.h
@@ -69,6 +69,7 @@ namespace armarx
 
         void add_decayable_obstacle(const Eigen::Vector2f&, float, float, float, const Ice::Current& = Ice::Current()) override;
         void add_decayable_line_segment(const Eigen::Vector2f&, const Eigen::Vector2f&, const Ice::Current& = Ice::Current()) override;
+        void add_decayable_line_segments(const dynamicobstaclemanager::LineSegments& lines, const Ice::Current& = Ice::Current()) override;
         void remove_all_decayable_obstacles(const Ice::Current& = Ice::Current()) override;
         void directly_update_obstacle(const std::string& name, const Eigen::Vector2f&, float, float, float, const Ice::Current& = Ice::Current()) override;
         void remove_obstacle(const std::string& name, const Ice::Current& = Ice::Current()) override;
diff --git a/source/RobotAPI/components/DynamicObstacleManager/ManagedObstacle.cpp b/source/RobotAPI/components/DynamicObstacleManager/ManagedObstacle.cpp
index fe21cc4e46558b3a70102592ee77ef56715421f8..f718a45434ec538fbd5d2541fb9413568f3e79f0 100644
--- a/source/RobotAPI/components/DynamicObstacleManager/ManagedObstacle.cpp
+++ b/source/RobotAPI/components/DynamicObstacleManager/ManagedObstacle.cpp
@@ -94,10 +94,25 @@ namespace armarx
     float ManagedObstacle::line_segment_ellipsis_coverage(const Eigen::Vector2f e_origin, const float e_rx, const float e_ry, const float e_yaw, const Eigen::Vector2f line_seg_start, const Eigen::Vector2f line_seg_end)
     {
         // Again we discretize the line into n points and we check the coverage of those points
-        const unsigned int SAMPLES = 40;
         const Eigen::Vector2f difference_vec = line_seg_end - line_seg_start;
         const Eigen::Vector2f difference_vec_normed = difference_vec.normalized();
         const float distance = difference_vec.norm();
+        const unsigned int SAMPLES = std::max(distance / 10.0, 40.0);
+
+        const Vector2f difference_start_origin = e_origin - line_seg_start;
+        const Vector2f difference_end_origin = e_origin - line_seg_end;
+
+        if (difference_start_origin.norm() > std::max(e_rx, e_ry) && distance < std::max(e_rx, e_ry))
+        {
+            return 0.0;
+        }
+
+        if (difference_end_origin.norm() > std::max(e_rx, e_ry) && distance < std::max(e_rx, e_ry))
+        {
+            return 0.0;
+        }
+
+
         const float step_size = distance / SAMPLES;
         const Eigen::Vector2f dir = difference_vec_normed * step_size;
 
diff --git a/source/RobotAPI/interface/components/ObstacleAvoidance/DynamicObstacleManagerInterface.ice b/source/RobotAPI/interface/components/ObstacleAvoidance/DynamicObstacleManagerInterface.ice
index 313de2b9d41a3e89f634ccab7b933fb8d4ca15c3..5ff2649fae12cb906f5821f73ba1fb1fd21647fe 100644
--- a/source/RobotAPI/interface/components/ObstacleAvoidance/DynamicObstacleManagerInterface.ice
+++ b/source/RobotAPI/interface/components/ObstacleAvoidance/DynamicObstacleManagerInterface.ice
@@ -30,6 +30,18 @@
 
 module armarx
 {
+    module dynamicobstaclemanager
+    {
+        struct LineSegment
+        {
+            Eigen::Vector2f lineStart;
+            Eigen::Vector2f lineEnd;
+        };
+
+        sequence<LineSegment> LineSegments;
+    }
+
+
     interface DynamicObstacleManagerInterface
     {
         void
@@ -38,6 +50,9 @@ module armarx
         void
         add_decayable_line_segment(Eigen::Vector2f line_start, Eigen::Vector2f line_end);
 
+        void
+        add_decayable_line_segments(dynamicobstaclemanager::LineSegments lines);
+
         void
         remove_all_decayable_obstacles();