diff --git a/source/RobotAPI/components/CyberGloveObserver/CyberGloveObserver.cpp b/source/RobotAPI/components/CyberGloveObserver/CyberGloveObserver.cpp
index a68eb49d875c6d8eece619f72e2b6f64bd82a08a..96b0f863c87245ddf16d84c983e08407f39e3331 100644
--- a/source/RobotAPI/components/CyberGloveObserver/CyberGloveObserver.cpp
+++ b/source/RobotAPI/components/CyberGloveObserver/CyberGloveObserver.cpp
@@ -56,7 +56,7 @@ namespace armarx
 
     void CyberGloveObserver::reportGloveValues(const CyberGloveValues& gloveValues, const Ice::Current&)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
 
         IceUtil::Time now = TimeUtil::GetTime();
 
@@ -107,7 +107,7 @@ namespace armarx
 
     CyberGloveValues armarx::CyberGloveObserver::getLatestValues(const Ice::Current&)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
         return latestValues;
     }
 }
diff --git a/source/RobotAPI/components/CyberGloveObserver/CyberGloveObserver.h b/source/RobotAPI/components/CyberGloveObserver/CyberGloveObserver.h
index 8eb91e4654620598605f4b04fc1f4c8629ef0048..45eb2f52a2c86c47c8c0272a6f2c55ce9c39b865 100644
--- a/source/RobotAPI/components/CyberGloveObserver/CyberGloveObserver.h
+++ b/source/RobotAPI/components/CyberGloveObserver/CyberGloveObserver.h
@@ -23,13 +23,12 @@
 #pragma once
 
 
-//#include <ArmarXCore/core/Component.h>
-//#include <RobotAPI/interface/units/CyberGloveInterface.h>
 #include <RobotAPI/interface/units/CyberGloveObserverInterface.h>
 #include <ArmarXCore/observers/Observer.h>
 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
 
+#include <mutex>
 
 namespace armarx
 {
@@ -103,7 +102,7 @@ namespace armarx
 
     private:
 
-        Mutex dataMutex;
+        std::mutex dataMutex;
         CyberGloveValues latestValues;
         IceUtil::Time lastUpdate;
 
diff --git a/source/RobotAPI/components/RobotState/RobotStateComponent.cpp b/source/RobotAPI/components/RobotState/RobotStateComponent.cpp
index e3c8d00b914d2431ac9a746158d1d3e7af155026..53fb866aa9f7f349bcb7ce5090552e58b0bbb21e 100644
--- a/source/RobotAPI/components/RobotState/RobotStateComponent.cpp
+++ b/source/RobotAPI/components/RobotState/RobotStateComponent.cpp
@@ -323,7 +323,7 @@ namespace armarx
         }
 
         {
-            boost::unique_lock<SharedMutex> lock(jointHistoryMutex);
+            std::unique_lock lock(jointHistoryMutex);
             jointHistory.emplace_hint(jointHistory.end(), time, jointAngles);
 
             if (jointHistory.size() > jointHistoryLength)
@@ -512,7 +512,7 @@ namespace armarx
         IceUtil::Time duration;
         {
             IceUtil::Time start = IceUtil::Time::now();
-            boost::unique_lock<SharedMutex> lock(poseHistoryMutex);
+            std::unique_lock lock(poseHistoryMutex);
             duration = IceUtil::Time::now() - start;
 
             poseHistory.emplace_hint(poseHistory.end(),
@@ -553,7 +553,7 @@ namespace armarx
 
     auto RobotStateComponent::interpolateJoints(IceUtil::Time time) const -> std::optional<Timestamped<NameValueMap>>
     {
-        boost::shared_lock<SharedMutex> lock(jointHistoryMutex);
+        std::shared_lock lock(jointHistoryMutex);
         if (jointHistory.empty())
         {
             ARMARX_WARNING << deactivateSpam(1) << "Joint history of robot state component is empty!";
@@ -628,7 +628,7 @@ namespace armarx
 
     auto RobotStateComponent::interpolatePose(IceUtil::Time time) const -> std::optional<Timestamped<FramedPosePtr>>
     {
-        boost::shared_lock<SharedMutex> lock(poseHistoryMutex);
+        std::shared_lock lock(poseHistoryMutex);
 
         if (poseHistory.empty())
         {
diff --git a/source/RobotAPI/components/RobotState/RobotStateComponent.h b/source/RobotAPI/components/RobotState/RobotStateComponent.h
index 27751d203b73c11313caa6a87bbaeabe3cf675ff..2a1da853b696150112fc5ee982cf3a7734c9a4d2 100644
--- a/source/RobotAPI/components/RobotState/RobotStateComponent.h
+++ b/source/RobotAPI/components/RobotState/RobotStateComponent.h
@@ -37,6 +37,9 @@
 
 #include "SharedRobotServants.h"
 
+#include <shared_mutex>
+#include <mutex>
+
 
 namespace armarx
 {
@@ -216,11 +219,11 @@ namespace armarx
         std::string robotFile;
         std::string relativeRobotFile;
 
-        mutable SharedMutex jointHistoryMutex;
+        mutable std::shared_mutex jointHistoryMutex;
         std::map<IceUtil::Time, NameValueMap> jointHistory;
         size_t jointHistoryLength;
 
-        mutable SharedMutex poseHistoryMutex;
+        mutable std::shared_mutex poseHistoryMutex;
         std::map<IceUtil::Time, FramedPosePtr> poseHistory;
         size_t poseHistoryLength;
 
diff --git a/source/RobotAPI/components/units/ForceTorqueObserver.cpp b/source/RobotAPI/components/units/ForceTorqueObserver.cpp
index a365530d8022e8ac1f7e51f7246c44f28903c5ef..58a5eb9ed9e4a89fb724219ce64a6b85236b310c 100644
--- a/source/RobotAPI/components/units/ForceTorqueObserver.cpp
+++ b/source/RobotAPI/components/units/ForceTorqueObserver.cpp
@@ -123,7 +123,7 @@ namespace armarx
         auto channels = getAvailableChannels(false);
         auto batchPrx = debugDrawer->ice_batchOneway();
         {
-            ScopedLock lock(dataMutex);
+            std::unique_lock lock(dataMutex);
 
             std::set<std::string> frameAlreadyReported;
             for (auto& channel : channels)
@@ -242,7 +242,7 @@ namespace armarx
 
     void ForceTorqueObserver::updateRobot()
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
         RemoteRobot::synchronizeLocalClone(localRobot, robot);
     }
 
@@ -304,7 +304,7 @@ namespace armarx
 
     void armarx::ForceTorqueObserver::reportSensorValues(const std::string& sensorNodeName, const FramedDirectionBasePtr& forces, const FramedDirectionBasePtr& torques, const Ice::Current& c)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
 
         auto offerForceAndTorqueValue = [ = ](std::string const & sensorNodeName, std::string const & frame, std::string channelName, const FramedDirectionBasePtr & forces, const FramedDirectionBasePtr & torques)
         {
diff --git a/source/RobotAPI/components/units/ForceTorqueObserver.h b/source/RobotAPI/components/units/ForceTorqueObserver.h
index 24c031200b51613c9b3409129df79b2804d7a48b..0f17d8a498377664b98882e26dff3c9b8df1bb50 100644
--- a/source/RobotAPI/components/units/ForceTorqueObserver.h
+++ b/source/RobotAPI/components/units/ForceTorqueObserver.h
@@ -27,6 +27,8 @@
 #include <ArmarXCore/observers/Observer.h>
 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
 
+#include <mutex>
+
 namespace armarx
 {
     /**
@@ -92,7 +94,7 @@ namespace armarx
     private:
         void updateRobot();
 
-        armarx::Mutex dataMutex;
+        std::mutex dataMutex;
         std::string topicName;
         RobotStateComponentInterfacePrx robot;
         VirtualRobot::RobotPtr localRobot;
diff --git a/source/RobotAPI/components/units/GamepadUnitObserver.cpp b/source/RobotAPI/components/units/GamepadUnitObserver.cpp
index e6e5226324c46df8d35f6307660b9e016b71fd02..b1848c5325d931a623c828e1dd58973121beedb5 100644
--- a/source/RobotAPI/components/units/GamepadUnitObserver.cpp
+++ b/source/RobotAPI/components/units/GamepadUnitObserver.cpp
@@ -69,7 +69,7 @@ namespace armarx
 
     void GamepadUnitObserver::reportGamepadState(const std::string& device, const std::string& name, const GamepadData& data, const TimestampBasePtr& timestamp, const Ice::Current& c)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
 
         TimestampVariantPtr timestampPtr = TimestampVariantPtr::dynamicCast(timestamp);
 
diff --git a/source/RobotAPI/components/units/GamepadUnitObserver.h b/source/RobotAPI/components/units/GamepadUnitObserver.h
index fcccf65fc017cda9f3cc69e89a2eebb747df61cc..2f4d59c2a7a44ede66adaec1663be2263b6d25de 100644
--- a/source/RobotAPI/components/units/GamepadUnitObserver.h
+++ b/source/RobotAPI/components/units/GamepadUnitObserver.h
@@ -29,6 +29,7 @@
 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
 #include <RobotAPI/libraries/core/Pose.h>
 
+#include <mutex>
 
 namespace armarx
 {
@@ -79,7 +80,7 @@ namespace armarx
 
 
     private:
-        Mutex dataMutex;
+        std::mutex dataMutex;
         DebugDrawerInterfacePrx debugDrawerPrx;
 
 
diff --git a/source/RobotAPI/components/units/GraspCandidateObserver.cpp b/source/RobotAPI/components/units/GraspCandidateObserver.cpp
index 3a0cac2ec7835df8e0362b59b70d9d48ef36708e..527216c96a63d769c625cc5deeae30fab64fef47 100644
--- a/source/RobotAPI/components/units/GraspCandidateObserver.cpp
+++ b/source/RobotAPI/components/units/GraspCandidateObserver.cpp
@@ -122,21 +122,21 @@ void GraspCandidateObserver::handleProviderUpdate(const std::string& providerNam
 
 void GraspCandidateObserver::reportGraspCandidates(const std::string& providerName, const GraspCandidateSeq& candidates, const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     this->candidates[providerName] = candidates;
     handleProviderUpdate(providerName, candidates.size());
 }
 
 void GraspCandidateObserver::reportBimanualGraspCandidates(const std::string& providerName, const BimanualGraspCandidateSeq& candidates, const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     this->bimanualCandidates[providerName] = candidates;
     handleProviderUpdate(providerName, candidates.size());
 }
 
 void GraspCandidateObserver::reportProviderInfo(const std::string& providerName, const ProviderInfoPtr& info, const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     providers[providerName] = info;
     if (updateCounters.count(providerName) == 0)
     {
@@ -153,13 +153,13 @@ void GraspCandidateObserver::reportProviderInfo(const std::string& providerName,
 
 InfoMap GraspCandidateObserver::getAvailableProvidersWithInfo(const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     return providers;
 }
 
 StringSeq GraspCandidateObserver::getAvailableProviderNames(const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     return getAvailableProviderNames();
 }
 
@@ -167,14 +167,14 @@ StringSeq GraspCandidateObserver::getAvailableProviderNames(const Ice::Current&)
 
 ProviderInfoPtr GraspCandidateObserver::getProviderInfo(const std::string& providerName, const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     checkHasProvider(providerName);
     return providers[providerName];
 }
 
 bool GraspCandidateObserver::hasProvider(const std::string& providerName, const Ice::Current& c)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     return hasProvider(providerName);
 }
 
@@ -182,7 +182,7 @@ bool GraspCandidateObserver::hasProvider(const std::string& providerName, const
 
 GraspCandidateSeq GraspCandidateObserver::getAllCandidates(const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     GraspCandidateSeq all;
     for (const std::pair<std::string, grasping::GraspCandidateSeq>& pair : candidates)
     {
@@ -200,7 +200,7 @@ GraspCandidateSeq GraspCandidateObserver::getCandidatesByProvider(const std::str
 
 GraspCandidateSeq GraspCandidateObserver::getCandidatesByFilter(const CandidateFilterConditionPtr& filter, const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     GraspCandidateSeq matching;
     for (const std::pair<std::string, grasping::GraspCandidateSeq>& pair : candidates)
     {
@@ -217,20 +217,20 @@ GraspCandidateSeq GraspCandidateObserver::getCandidatesByFilter(const CandidateF
 
 Ice::Int GraspCandidateObserver::getUpdateCounterByProvider(const std::string& providerName, const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     checkHasProvider(providerName);
     return updateCounters[providerName];
 }
 
 IntMap GraspCandidateObserver::getAllUpdateCounters(const Ice::Current& providerName)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     return updateCounters;
 }
 
 bool GraspCandidateObserver::setProviderConfig(const std::string& providerName, const StringVariantBaseMap& config, const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     if (providers.count(providerName) == 0)
     {
         return false;
@@ -241,19 +241,19 @@ bool GraspCandidateObserver::setProviderConfig(const std::string& providerName,
 
 void GraspCandidateObserver::setSelectedCandidates(const GraspCandidateSeq& candidates, const Ice::Current&)
 {
-    ScopedLock lock(selectedCandidatesMutex);
+    std::unique_lock lock(selectedCandidatesMutex);
     selectedCandidates = candidates;
 }
 
 GraspCandidateSeq GraspCandidateObserver::getSelectedCandidates(const Ice::Current&)
 {
-    ScopedLock lock(selectedCandidatesMutex);
+    std::unique_lock lock(selectedCandidatesMutex);
     return selectedCandidates;
 }
 
 BimanualGraspCandidateSeq GraspCandidateObserver::getAllBimanualCandidates(const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     BimanualGraspCandidateSeq all;
     for (const std::pair<std::string, grasping::BimanualGraspCandidateSeq>& pair : bimanualCandidates)
     {
@@ -264,13 +264,13 @@ BimanualGraspCandidateSeq GraspCandidateObserver::getAllBimanualCandidates(const
 
 void GraspCandidateObserver::setSelectedBimanualCandidates(const grasping::BimanualGraspCandidateSeq& candidates, const Ice::Current&)
 {
-    ScopedLock lock(selectedCandidatesMutex);
+    std::unique_lock lock(selectedCandidatesMutex);
     selectedBimanualCandidates = candidates;
 }
 
 BimanualGraspCandidateSeq GraspCandidateObserver::getSelectedBimanualCandidates(const Ice::Current&)
 {
-    ScopedLock lock(selectedCandidatesMutex);
+    std::unique_lock lock(selectedCandidatesMutex);
     return selectedBimanualCandidates;
 }
 
diff --git a/source/RobotAPI/components/units/GraspCandidateObserver.h b/source/RobotAPI/components/units/GraspCandidateObserver.h
index a481ec2791d6c97a5c882361109d96d494e44e9e..beb95c3a2bde2c9bd3c568031dd4ce2db7939d07 100644
--- a/source/RobotAPI/components/units/GraspCandidateObserver.h
+++ b/source/RobotAPI/components/units/GraspCandidateObserver.h
@@ -26,6 +26,8 @@
 #include <ArmarXCore/observers/Observer.h>
 #include <RobotAPI/interface/observers/GraspCandidateObserverInterface.h>
 
+#include <mutex>
+
 namespace armarx
 {
     /**
@@ -106,7 +108,7 @@ namespace armarx
         bool hasProvider(const std::string& providerName);
         void checkHasProvider(const std::string& providerName);
         grasping::StringSeq getAvailableProviderNames();
-        Mutex dataMutex;
+        std::mutex dataMutex;
         std::map<std::string, grasping::GraspCandidateSeq> candidates;
         std::map<std::string, grasping::BimanualGraspCandidateSeq> bimanualCandidates;
         grasping::InfoMap providers;
@@ -114,7 +116,7 @@ namespace armarx
 
         grasping::GraspCandidateProviderInterfacePrx configTopic;
 
-        Mutex selectedCandidatesMutex;
+        std::mutex selectedCandidatesMutex;
         grasping::GraspCandidateSeq selectedCandidates;
 
         grasping::BimanualGraspCandidateSeq selectedBimanualCandidates;
diff --git a/source/RobotAPI/components/units/HapticObserver.cpp b/source/RobotAPI/components/units/HapticObserver.cpp
index 759927bd8799c8d319ba69fe1e3e384402ac8d7a..0fe52df490098255ef86b56bd43025017a2997b5 100644
--- a/source/RobotAPI/components/units/HapticObserver.cpp
+++ b/source/RobotAPI/components/units/HapticObserver.cpp
@@ -76,7 +76,7 @@ namespace armarx
 
     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);
+        std::unique_lock lock(dataMutex);
 
         MatrixFloatPtr matrix = MatrixFloatPtr::dynamicCast(values);
         if (matrix->cols == 0)
@@ -159,7 +159,7 @@ namespace armarx
 
     void HapticObserver::updateStatistics()
     {
-        /*ScopedLock lock(dataMutex);
+        /*std::unique_lock lock(dataMutex);
         //ARMARX_LOG << "updateStatistics";
         long now = TimestampVariant::nowLong();
         for (std::map<std::string, HapticSampleStatistics>::iterator it = statistics.begin(); it != statistics.end(); ++it)
diff --git a/source/RobotAPI/components/units/HapticObserver.h b/source/RobotAPI/components/units/HapticObserver.h
index 5e75db5b05f74cf23cecb6ce3908f6f9ca1fd2c9..cac9a85c903e4c83125489f97c8c65dd3b368ff5 100644
--- a/source/RobotAPI/components/units/HapticObserver.h
+++ b/source/RobotAPI/components/units/HapticObserver.h
@@ -30,6 +30,7 @@
 #include <ArmarXCore/util/variants/eigen3/Eigen3VariantObjectFactories.h>
 #include <ArmarXCore/core/services/tasks/PeriodicTask.h>
 
+#include <mutex>
 
 namespace armarx
 {
@@ -146,7 +147,7 @@ namespace armarx
          */
         PropertyDefinitionsPtr createPropertyDefinitions() override;
     private:
-        armarx::Mutex dataMutex;
+        std::mutex dataMutex;
         std::string topicName;
         PeriodicTask<HapticObserver>::pointer_type statisticsTask;
 
diff --git a/source/RobotAPI/components/units/InertialMeasurementUnitObserver.cpp b/source/RobotAPI/components/units/InertialMeasurementUnitObserver.cpp
index 52e6f92ea93cb4c5f4f58611a56fb6f73533b3af..dc73454fe838fafeddebbbfca0915efaca5752f0 100644
--- a/source/RobotAPI/components/units/InertialMeasurementUnitObserver.cpp
+++ b/source/RobotAPI/components/units/InertialMeasurementUnitObserver.cpp
@@ -71,7 +71,7 @@ namespace armarx
         const std::string& device, const std::string& name, const IMUData& values,
         const TimestampBasePtr& timestamp, const Ice::Current&)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
 
         TimestampVariantPtr timestampPtr = TimestampVariantPtr::dynamicCast(timestamp);
 
diff --git a/source/RobotAPI/components/units/InertialMeasurementUnitObserver.h b/source/RobotAPI/components/units/InertialMeasurementUnitObserver.h
index 4591228d92d457967b85106554898345895b6ee2..728e2dc385906114fa09c2b7b044990196a94a2a 100644
--- a/source/RobotAPI/components/units/InertialMeasurementUnitObserver.h
+++ b/source/RobotAPI/components/units/InertialMeasurementUnitObserver.h
@@ -29,6 +29,7 @@
 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
 #include <RobotAPI/libraries/core/Pose.h>
 
+#include <mutex>
 
 namespace armarx
 {
@@ -82,7 +83,7 @@ namespace armarx
 
 
     private:
-        Mutex dataMutex;
+        std::mutex dataMutex;
         DebugDrawerInterfacePrx debugDrawerPrx;
 
 
diff --git a/source/RobotAPI/components/units/KinematicUnitObserver.cpp b/source/RobotAPI/components/units/KinematicUnitObserver.cpp
index 15712aa55724e6eb29ffe97e9fa9226a5c9c9872..c3d52e47fac5f00008939a9acb4c299aa814f680 100644
--- a/source/RobotAPI/components/units/KinematicUnitObserver.cpp
+++ b/source/RobotAPI/components/units/KinematicUnitObserver.cpp
@@ -287,7 +287,7 @@ namespace armarx
         //    ARMARX_INFO << deactivateSpam(10) << " timestamp is " << (IceUtil::Time::now() - IceUtil::Time::microSeconds(timestamp)).toMicroSecondsDouble() << " µs old";
         bool newChannel;
         {
-            ScopedLock lock(initializedChannelsMutex);
+            std::unique_lock lock(initializedChannelsMutex);
             newChannel = initializedChannels.count(channelName) == 0;
             initializedChannels.insert(channelName);
         }
diff --git a/source/RobotAPI/components/units/KinematicUnitObserver.h b/source/RobotAPI/components/units/KinematicUnitObserver.h
index 8d726600692d58d32b35c22f11b43fa7f4e3b4dd..5b21e89d0cb300c331cd105b907439da70cc937a 100644
--- a/source/RobotAPI/components/units/KinematicUnitObserver.h
+++ b/source/RobotAPI/components/units/KinematicUnitObserver.h
@@ -32,6 +32,7 @@
 #include <ArmarXCore/observers/Observer.h>
 
 #include <string>
+#include <mutex>
 
 namespace armarx
 {
@@ -154,7 +155,7 @@ namespace armarx
     protected:
         void nameValueMapToDataFields(const std::string& channelName, const NameValueMap& nameValueMap, Ice::Long timestamp, bool aValueChanged);
         std::set<std::string> initializedChannels;
-        Mutex initializedChannelsMutex;
+        std::mutex initializedChannelsMutex;
     private:
         std::string robotNodeSetName;
         std::set<std::string> robotNodes;
diff --git a/source/RobotAPI/components/units/LaserScannerUnitObserver.cpp b/source/RobotAPI/components/units/LaserScannerUnitObserver.cpp
index 0944336bfaf52400a6685ce58d4b1c409a3e86c3..04bd47d5a9cd4931ad9783391e346c88d29aa4ce 100644
--- a/source/RobotAPI/components/units/LaserScannerUnitObserver.cpp
+++ b/source/RobotAPI/components/units/LaserScannerUnitObserver.cpp
@@ -64,7 +64,7 @@ namespace armarx
 
     void LaserScannerUnitObserver::reportSensorValues(const std::string& device, const std::string& name, const LaserScan& scan, const TimestampBasePtr& timestamp, const Ice::Current& c)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
 
         if (!existsChannel(device))
         {
diff --git a/source/RobotAPI/components/units/LaserScannerUnitObserver.h b/source/RobotAPI/components/units/LaserScannerUnitObserver.h
index 4b093eb49cc12f3d07b457f744f3fda78e8872c0..05aa07cb9c36668d72d4fa8046c855c28e0ab735 100644
--- a/source/RobotAPI/components/units/LaserScannerUnitObserver.h
+++ b/source/RobotAPI/components/units/LaserScannerUnitObserver.h
@@ -29,6 +29,7 @@
 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
 #include <RobotAPI/libraries/core/Pose.h>
 
+#include <mutex>
 
 namespace armarx
 {
@@ -78,7 +79,7 @@ namespace armarx
                                 const TimestampBasePtr& timestamp, const Ice::Current& c) override;
 
     private:
-        Mutex dataMutex;
+        std::mutex dataMutex;
 
     };
 }
diff --git a/source/RobotAPI/components/units/MetaWearIMUObserver.cpp b/source/RobotAPI/components/units/MetaWearIMUObserver.cpp
index b6885037df8700f4f6c09b01d0483a3c277210b2..95937330857902c4127d0ffe3b35eebff3e8d86d 100644
--- a/source/RobotAPI/components/units/MetaWearIMUObserver.cpp
+++ b/source/RobotAPI/components/units/MetaWearIMUObserver.cpp
@@ -64,7 +64,7 @@ namespace armarx
 
     void armarx::MetaWearIMUObserver::reportIMUValues(const std::string& name, const MetaWearIMUData& data, const TimestampBasePtr& timestamp, const Ice::Current&)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
 
         if (!existsChannel(name))
         {
diff --git a/source/RobotAPI/components/units/MetaWearIMUObserver.h b/source/RobotAPI/components/units/MetaWearIMUObserver.h
index 6dba1f74653563fc132706e39d23036b2595ae4a..87eb6b49fbd390a66aef98c4f0a22d174115d659 100644
--- a/source/RobotAPI/components/units/MetaWearIMUObserver.h
+++ b/source/RobotAPI/components/units/MetaWearIMUObserver.h
@@ -29,6 +29,7 @@
 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
 #include <RobotAPI/libraries/core/Pose.h>
 
+#include <mutex>
 
 namespace armarx
 {
@@ -74,7 +75,7 @@ namespace armarx
 
 
     private:
-        Mutex dataMutex;
+        std::mutex dataMutex;
         DebugDrawerInterfacePrx debugDrawerPrx;
 
         void offerVector3(const std::string& channelName, const std::string& dfName, const std::vector<float>& data);
diff --git a/source/RobotAPI/components/units/OptoForceUnitObserver.cpp b/source/RobotAPI/components/units/OptoForceUnitObserver.cpp
index ce09bacd4543fb2ac779229d5c02de89bf3d6e05..f87a5b56edb87cc841b71da64a5018d42ace1274 100644
--- a/source/RobotAPI/components/units/OptoForceUnitObserver.cpp
+++ b/source/RobotAPI/components/units/OptoForceUnitObserver.cpp
@@ -65,7 +65,7 @@ namespace armarx
 
     void OptoForceUnitObserver::reportSensorValues(const std::string& device, const std::string& name, float fx, float fy, float fz, const TimestampBasePtr& timestamp, const Ice::Current& c)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
         TimestampVariantPtr timestampPtr = TimestampVariantPtr::dynamicCast(timestamp);
 
         if (!existsChannel(name))
@@ -86,7 +86,7 @@ namespace armarx
 
     /*void OptoForceUnitObserver::reportSensorValues(const std::string& device, const std::string& name, const IMUData& values, const TimestampBasePtr& timestamp, const Ice::Current& c)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
 
         TimestampVariantPtr timestampPtr = TimestampVariantPtr::dynamicCast(timestamp);
 
diff --git a/source/RobotAPI/components/units/OptoForceUnitObserver.h b/source/RobotAPI/components/units/OptoForceUnitObserver.h
index 3bdc63e1a6b874cb9005260801c8c11869b009c7..0d415cb2bc89396f9fc0d81669009f034b17c646 100644
--- a/source/RobotAPI/components/units/OptoForceUnitObserver.h
+++ b/source/RobotAPI/components/units/OptoForceUnitObserver.h
@@ -29,6 +29,7 @@
 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
 #include <RobotAPI/libraries/core/Pose.h>
 
+#include <mutex>
 
 namespace armarx
 {
@@ -81,7 +82,7 @@ namespace armarx
 
 
     private:
-        Mutex dataMutex;
+        std::mutex dataMutex;
         DebugDrawerInterfacePrx debugDrawerPrx;
 
 
diff --git a/source/RobotAPI/components/units/OrientedTactileSensorUnitObserver.cpp b/source/RobotAPI/components/units/OrientedTactileSensorUnitObserver.cpp
index 514a1767b5c95ad06228d87f4c09df94ff87f833..75640877635972e5cbf11f078580487834f64d4d 100644
--- a/source/RobotAPI/components/units/OrientedTactileSensorUnitObserver.cpp
+++ b/source/RobotAPI/components/units/OrientedTactileSensorUnitObserver.cpp
@@ -59,7 +59,7 @@ namespace armarx
 
     void OrientedTactileSensorUnitObserver::reportSensorValues(int id, float pressure, float qw, float qx, float qy, float qz, float pressureRate, float rotationRate, float accelerationRate, float accelx, float accely, float accelz, const TimestampBasePtr& timestamp, const Ice::Current&)
     {
-        ScopedLock lock(dataMutex);
+        std::unique_lock lock(dataMutex);
         TimestampVariantPtr timestampPtr = TimestampVariantPtr::dynamicCast(timestamp);
 
         std::stringstream ss;
diff --git a/source/RobotAPI/components/units/OrientedTactileSensorUnitObserver.h b/source/RobotAPI/components/units/OrientedTactileSensorUnitObserver.h
index 033f9cd08bd4f82bf399eb33df20eb2ac5a4956c..70916163f96bfa87944269e5bcf3f85a88bb5278 100644
--- a/source/RobotAPI/components/units/OrientedTactileSensorUnitObserver.h
+++ b/source/RobotAPI/components/units/OrientedTactileSensorUnitObserver.h
@@ -29,6 +29,7 @@
 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
 #include <RobotAPI/libraries/core/Pose.h>
 
+#include <mutex>
 
 namespace armarx
 {
@@ -80,7 +81,7 @@ namespace armarx
 
 
     private:
-        Mutex dataMutex;
+        std::mutex dataMutex;
         DebugDrawerInterfacePrx debugDrawerPrx;
     };
 }
diff --git a/source/RobotAPI/libraries/core/remoterobot/RobotStateObserver.cpp b/source/RobotAPI/libraries/core/remoterobot/RobotStateObserver.cpp
index 9a2dbb98e6026f602741b6020b50e0d1fd1a9ad4..9fe87907b881e06b12cac0495503da973c23a625 100644
--- a/source/RobotAPI/libraries/core/remoterobot/RobotStateObserver.cpp
+++ b/source/RobotAPI/libraries/core/remoterobot/RobotStateObserver.cpp
@@ -92,7 +92,7 @@ void RobotStateObserver::updatePoses()
         return;
     }
 
-    ScopedRecursiveLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     ReadLockPtr lock2 = robot->getReadLock();
     FramedPoseBaseMap tcpPoses;
     std::string rootFrame =  robot->getRootNode()->getName();
@@ -181,7 +181,7 @@ void RobotStateObserver::updateNodeVelocities(const NameValueMap& jointVel, long
         return;
     }
 
-    ScopedRecursiveLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
 
     if (!robot)
     {
@@ -316,7 +316,7 @@ PropertyDefinitionsPtr RobotStateObserver::createPropertyDefinitions()
 
 void RobotStateObserver::setRobot(RobotPtr robot)
 {
-    ScopedRecursiveLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     this->robot = robot;
 
     std::vector< VirtualRobot::RobotNodeSetPtr > robotNodes;
diff --git a/source/RobotAPI/libraries/core/remoterobot/RobotStateObserver.h b/source/RobotAPI/libraries/core/remoterobot/RobotStateObserver.h
index b604011aec6843d69bc58a1cd8e0b335345344d0..e3acfd611dc6487744decc1c4d3183e33f74c383 100644
--- a/source/RobotAPI/libraries/core/remoterobot/RobotStateObserver.h
+++ b/source/RobotAPI/libraries/core/remoterobot/RobotStateObserver.h
@@ -94,7 +94,7 @@ namespace armarx
         RobotStateComponentInterfacePrx server;
         VirtualRobot::RobotPtr  robot, velocityReportRobot;
         std::vector<std::pair<VirtualRobot::RobotNodePtr, std::string> > nodesToReport;
-        RecursiveMutex dataMutex;
+        std::recursive_mutex dataMutex;
         IceUtil::Time lastVelocityUpdate;
 
         // RobotStateObserverInterface interface