diff --git a/CMakeLists.txt b/CMakeLists.txt
index cd15ab478ba627b71a3eea5fa1159e6d5cbf9619..a0f73bd4fe3434516a9528fe308fe8c2c25ce29f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,10 +16,15 @@ depends_on_armarx_package(ArmarXGui "OPTIONAL")
 
 set(ArmarX_Simox_VERSION 2.3.16)
 
+find_package(Simox ${ArmarX_Simox_VERSION} QUIET)
+if (Simox_FOUND)
+	setupSimoxExternalLibraries()
+endif()
+
 add_subdirectory(source)
 
 list(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS "simox")
 
 install_project()
 
-add_subdirectory(scenarios)
\ No newline at end of file
+add_subdirectory(scenarios)
diff --git a/source/RobotAPI/components/DebugDrawer/CMakeLists.txt b/source/RobotAPI/components/DebugDrawer/CMakeLists.txt
index 0b1f1c08e388326ead4f3b1eab0deea6e7d00817..80523e46f0dff7b0804e34279b300b3316e165ec 100644
--- a/source/RobotAPI/components/DebugDrawer/CMakeLists.txt
+++ b/source/RobotAPI/components/DebugDrawer/CMakeLists.txt
@@ -7,7 +7,7 @@ armarx_build_if(Eigen3_FOUND "Eigen3 not available")
 armarx_build_if(Simox_FOUND "Simox-VirtualRobot not available")
 
 if (Eigen3_FOUND AND Simox_FOUND)
-
+	setupSimoxExternalLibraries()
     include_directories(
         ${Eigen3_INCLUDE_DIR}
         ${Simox_INCLUDE_DIRS}
diff --git a/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp b/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp
index 7b109f0b52970e87ffa614756e9a5d9ab8d9c847..e3d50b64c1652f5ec1ccb8e706f0a3c3ea59f76e 100644
--- a/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp
+++ b/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp
@@ -23,6 +23,8 @@
 
 #include "DebugDrawerComponent.h"
 
+
+#include <VirtualRobot/VirtualRobot.h>
 #include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h>
 #include <VirtualRobot/Visualization/CoinVisualization/CoinVisualization.h>
 #include <Inventor/nodes/SoUnits.h>
@@ -1387,7 +1389,7 @@ namespace armarx
         d.layerName = layerName;
         d.name = robotName;
 
-        for (auto & it : configuration)
+        for (auto& it : configuration)
         {
             d.configuration[it.first] = it.second;
         }
@@ -1434,7 +1436,7 @@ namespace armarx
 
     void DebugDrawerComponent::clearAll(const Ice::Current&)
     {
-        for (auto & i : layers)
+        for (auto& i : layers)
         {
             clearLayer(i.first);
         }
@@ -1467,57 +1469,57 @@ namespace armarx
 
         auto& layer = layers.at(layerName);
 
-        for (const auto & i : layer.addedCoordVisualizations)
+        for (const auto& i : layer.addedCoordVisualizations)
         {
             removePoseVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedLineVisualizations)
+        for (const auto& i : layer.addedLineVisualizations)
         {
             removeLineVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedBoxVisualizations)
+        for (const auto& i : layer.addedBoxVisualizations)
         {
             removeBoxVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedTextVisualizations)
+        for (const auto& i : layer.addedTextVisualizations)
         {
             removeTextVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedSphereVisualizations)
+        for (const auto& i : layer.addedSphereVisualizations)
         {
             removeSphereVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedCylinderVisualizations)
+        for (const auto& i : layer.addedCylinderVisualizations)
         {
             removeCylinderVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedPointCloudVisualizations)
+        for (const auto& i : layer.addedPointCloudVisualizations)
         {
             removePointCloudVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedPolygonVisualizations)
+        for (const auto& i : layer.addedPolygonVisualizations)
         {
             removePolygonVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedArrowVisualizations)
+        for (const auto& i : layer.addedArrowVisualizations)
         {
             removeArrowVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedRobotVisualizations)
+        for (const auto& i : layer.addedRobotVisualizations)
         {
             removeRobotVisu(layerName, i.first);
         }
 
-        for (const auto & i : layer.addedCustomVisualizations)
+        for (const auto& i : layer.addedCustomVisualizations)
         {
             removeCustomVisu(layerName, i.first);
         }
@@ -1894,7 +1896,7 @@ namespace armarx
         ScopedRecursiveLockPtr l = getScopedVisuLock();
         StringSequence seq {};
 
-        for (const auto & layer : layers)
+        for (const auto& layer : layers)
         {
             seq.push_back(layer.first);
         }
@@ -1907,7 +1909,7 @@ namespace armarx
         ::armarx::LayerInformationSequence seq {};
         ScopedRecursiveLockPtr l = getScopedVisuLock();
 
-        for (const auto & layer : layers)
+        for (const auto& layer : layers)
         {
             int count = layer.second.addedCoordVisualizations.size() +
                         layer.second.addedLineVisualizations.size() +
@@ -2030,4 +2032,4 @@ namespace armarx
         removeColoredPointCloudVisu(DEBUG_LAYER_NAME, pointCloudName);
     }
 
-}//namespace armarx
\ No newline at end of file
+}//namespace armarx
diff --git a/source/RobotAPI/components/RobotState/CMakeLists.txt b/source/RobotAPI/components/RobotState/CMakeLists.txt
index fa39860ac77df6f7e32fd8d86392cd06ba2537b6..246213dd5994fd1a196ebbcb087962382581b6b3 100644
--- a/source/RobotAPI/components/RobotState/CMakeLists.txt
+++ b/source/RobotAPI/components/RobotState/CMakeLists.txt
@@ -1,8 +1,7 @@
-armarx_set_target("Core Library: ArmarXCoreRobotStateComponent")
+armarx_set_target("RobotAPI Library: RobotStateComponent")
 
 find_package(Eigen3 QUIET)
 find_package(Simox ${ArmarX_Simox_VERSION} QUIET)
-
 armarx_build_if(Eigen3_FOUND "Eigen3 not available")
 armarx_build_if(Simox_FOUND "Simox-VirtualRobot not available")
 
diff --git a/source/RobotAPI/components/units/HapticObserver.cpp b/source/RobotAPI/components/units/HapticObserver.cpp
index ed10cc0355424c71e974b67d624b754d92991d7d..2ad4e48737c6b673804c79d5b6e90b0fd8e02d8b 100644
--- a/source/RobotAPI/components/units/HapticObserver.cpp
+++ b/source/RobotAPI/components/units/HapticObserver.cpp
@@ -39,7 +39,6 @@ void HapticObserver::onInitObserver()
     offerConditionCheck("larger", new ConditionCheckLarger());
     offerConditionCheck("equals", new ConditionCheckEquals());
     offerConditionCheck("smaller", new ConditionCheckSmaller());
-
 }
 
 void HapticObserver::onConnectObserver()
@@ -55,7 +54,14 @@ void HapticObserver::onExitObserver()
 void HapticObserver::reportSensorValues(const std::string& device, const std::string& name, const armarx::MatrixFloatBasePtr& values, const armarx::TimestampBasePtr& timestamp, const Ice::Current&)
 {
     ScopedLock lock(dataMutex);
+
     MatrixFloatPtr matrix = MatrixFloatPtr::dynamicCast(values);
+    if (matrix->cols == 0)
+    {
+        // Empty matrix received, silently ignore
+        return;
+    }
+
     TimestampVariantPtr timestampPtr = TimestampVariantPtr::dynamicCast(timestamp);
     Eigen::MatrixXf eigenMatrix = matrix->toEigen();
     float max = eigenMatrix.maxCoeff();