diff --git a/source/RobotAPI/components/units/KinematicUnitSimulation.cpp b/source/RobotAPI/components/units/KinematicUnitSimulation.cpp
index 81f545e0d01e864ac1576718f841bb798987fa01..f830c604c404e232535cd1812e49154da09dc496 100644
--- a/source/RobotAPI/components/units/KinematicUnitSimulation.cpp
+++ b/source/RobotAPI/components/units/KinematicUnitSimulation.cpp
@@ -63,7 +63,7 @@ void KinematicUnitSimulation::onInitKinematicUnit()
     ARMARX_TRACE;
     {
         // duplicate the loop because of locking
-        boost::mutex::scoped_lock lock(jointStatesMutex);
+        std::unique_lock lock(jointStatesMutex);
 
         // initialize JoinStates
         for (std::vector<VirtualRobot::RobotNodePtr>::iterator it = robotNodes.begin(); it != robotNodes.end(); it++)
@@ -115,7 +115,7 @@ void KinematicUnitSimulation::simulationFunction()
     };
 
     {
-        boost::mutex::scoped_lock lock(jointStatesMutex);
+        std::unique_lock lock(jointStatesMutex);
 
         for (KinematicUnitSimulationJointStates::iterator it = jointStates.begin(); it != jointStates.end(); it++)
         {
@@ -221,7 +221,7 @@ void KinematicUnitSimulation::switchControlMode(const NameControlModeMap& target
     bool aValueChanged = false;
     NameControlModeMap changedControlModes;
     {
-        boost::mutex::scoped_lock lock(jointStatesMutex);
+        std::unique_lock lock(jointStatesMutex);
 
         for (NameControlModeMap::const_iterator it = targetJointModes.begin(); it != targetJointModes.end(); it++)
         {
@@ -256,7 +256,7 @@ void KinematicUnitSimulation::switchControlMode(const NameControlModeMap& target
 void KinematicUnitSimulation::setJointAngles(const NameValueMap& targetJointAngles, const Ice::Current& c)
 {
 
-    boost::mutex::scoped_lock lock(jointStatesMutex);
+    std::unique_lock lock(jointStatesMutex);
     // name value maps for reporting
     NameValueMap actualJointAngles;
     bool aValueChanged = false;
@@ -321,7 +321,7 @@ void KinematicUnitSimulation::setJointAngles(const NameValueMap& targetJointAngl
 
 void KinematicUnitSimulation::setJointVelocities(const NameValueMap& targetJointVelocities, const Ice::Current& c)
 {
-    boost::mutex::scoped_lock lock(jointStatesMutex);
+    std::unique_lock lock(jointStatesMutex);
     NameValueMap actualJointVelocities;
     bool aValueChanged = false;
 
@@ -354,7 +354,7 @@ void KinematicUnitSimulation::setJointVelocities(const NameValueMap& targetJoint
 
 void KinematicUnitSimulation::setJointTorques(const NameValueMap& targetJointTorques, const Ice::Current& c)
 {
-    boost::mutex::scoped_lock lock(jointStatesMutex);
+    std::unique_lock lock(jointStatesMutex);
     NameValueMap actualJointTorques;
     bool aValueChanged = false;
 
@@ -408,7 +408,7 @@ void KinematicUnitSimulation::setJointDecelerations(const NameValueMap& targetJo
 void KinematicUnitSimulation::stop(const Ice::Current& c)
 {
 
-    boost::mutex::scoped_lock lock(jointStatesMutex);
+    std::unique_lock lock(jointStatesMutex);
 
     for (KinematicUnitSimulationJointStates::iterator it = jointStates.begin(); it != jointStates.end(); it++)
     {
diff --git a/source/RobotAPI/components/units/KinematicUnitSimulation.h b/source/RobotAPI/components/units/KinematicUnitSimulation.h
index cc3dae20ac7476572a4250c384a6395c7fd7d61b..f6512ecf5f261c3afa4047b6d87b5d6b3ff50811 100644
--- a/source/RobotAPI/components/units/KinematicUnitSimulation.h
+++ b/source/RobotAPI/components/units/KinematicUnitSimulation.h
@@ -29,10 +29,12 @@
 #include <ArmarXCore/core/services/tasks/PeriodicTask.h>
 #include <ArmarXCore/core/system/ImportExportComponent.h>
 #include <RobotAPI/libraries/core/PIDController.h>
-#include <random>
 
 #include <IceUtil/Time.h>
 
+#include <random>
+#include <mutex>
+
 namespace armarx
 {
     /**
@@ -178,7 +180,7 @@ namespace armarx
         KinematicUnitSimulationJointStates jointStates;
         KinematicUnitSimulationJointStates previousJointStates;
         KinematicUnitSimulationJointInfos jointInfos;
-        boost::mutex jointStatesMutex;
+        std::mutex jointStatesMutex;
         IceUtil::Time lastExecutionTime;
         float noise;
         int intervalMs;
diff --git a/source/RobotAPI/components/units/PlatformUnitSimulation.cpp b/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
index b4b4879b4ac4c0fd3246565c06eef9f83d50b35c..93b61e1d4f7338e888e55e0427e203a89843f731 100644
--- a/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
+++ b/source/RobotAPI/components/units/PlatformUnitSimulation.cpp
@@ -94,7 +94,7 @@ namespace armarx
         lastExecutionTime = now;
         std::vector<float> vel(3, 0.0f);
         {
-            ScopedLock lock(currentPoseMutex);
+            std::unique_lock lock(currentPoseMutex);
             switch (platformMode)
             {
                 case ePositionControl:
@@ -177,7 +177,7 @@ namespace armarx
     {
         ARMARX_INFO << "new target pose : " << targetPlatformPositionX << ", " << targetPlatformPositionY << " with angle " << targetPlatformRotation;
         {
-            ScopedLock lock(currentPoseMutex);
+            std::unique_lock lock(currentPoseMutex);
             platformMode = ePositionControl;
             targetPositionX = targetPlatformPositionX;
             targetPositionY = targetPlatformPositionY;
@@ -199,7 +199,7 @@ namespace armarx
     void armarx::PlatformUnitSimulation::move(float targetPlatformVelocityX, float targetPlatformVelocityY, float targetPlatformVelocityRotation, const Ice::Current& c)
     {
         ARMARX_INFO << deactivateSpam(1) << "New velocity: " << targetPlatformVelocityX << ", " << targetPlatformVelocityY << " with angular velocity: " << targetPlatformVelocityRotation;
-        ScopedLock lock(currentPoseMutex);
+        std::unique_lock lock(currentPoseMutex);
         platformMode = eVelocityControl;
         linearVelocityX = std::min(maxLinearVelocity, targetPlatformVelocityX);
         linearVelocityY = std::min(maxLinearVelocity, targetPlatformVelocityY);
@@ -211,7 +211,7 @@ namespace armarx
     {
         float targetPositionX, targetPositionY, targetRotation;
         {
-            ScopedLock lock(currentPoseMutex);
+            std::unique_lock lock(currentPoseMutex);
             targetPositionX = currentPositionX + targetPlatformOffsetX;
             targetPositionY = currentPositionY + targetPlatformOffsetY;
             targetRotation = currentRotation + targetPlatformOffsetRotation;
@@ -221,7 +221,7 @@ namespace armarx
 
     void PlatformUnitSimulation::setMaxVelocities(float positionalVelocity, float orientaionalVelocity, const Ice::Current& c)
     {
-        ScopedLock lock(currentPoseMutex);
+        std::unique_lock lock(currentPoseMutex);
         maxLinearVelocity = positionalVelocity;
         maxAngularVelocity = orientaionalVelocity;
     }
diff --git a/source/RobotAPI/components/units/PlatformUnitSimulation.h b/source/RobotAPI/components/units/PlatformUnitSimulation.h
index 8c7743a7f940c74860597157a46beb16b4de6794..c6d9851b1345a8aad3bd296b99f7c06ea774fec6 100644
--- a/source/RobotAPI/components/units/PlatformUnitSimulation.h
+++ b/source/RobotAPI/components/units/PlatformUnitSimulation.h
@@ -99,7 +99,7 @@ namespace armarx
         PropertyDefinitionsPtr createPropertyDefinitions() override;
 
     protected:
-        boost::mutex currentPoseMutex;
+        std::mutex currentPoseMutex;
         IceUtil::Time lastExecutionTime;
         int intervalMs;
 
diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.cpp
index 7f73e77b62de92a209368a3f379e0c9e1d3da81e..fbd850fd60d3769abd1a895d1087927e75f5ad78 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.cpp
@@ -282,7 +282,7 @@ namespace armarx
         onExitNJointController();
         // make sure the destructor of the handles does not throw an exception and triggers a termination of the process
         ARMARX_DEBUG << "Deleting thread handles";
-        ScopedLock lock(threadHandlesMutex);
+        std::unique_lock lock(threadHandlesMutex);
         for (auto& pair : threadHandles)
         {
             try
diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.h
index 1ca9843eb3dd70b97900d04020c286a8c2d27588..26c8a6aedb6cf2f5a85254987fd3f61ce87ead01 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.h
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.h
@@ -35,7 +35,6 @@
 #include <ArmarXCore/core/util/TripleBuffer.h>
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 #include <ArmarXCore/core/services/tasks/ThreadPool.h>
-#include <ArmarXCore/core/system/Synchronization.h>
 
 #include <ArmarXGui/interface/WidgetDescription.h>
 
@@ -701,7 +700,7 @@ namespace armarx
         template < typename Task >
         void runTask(const std::string& taskName, Task&& task)
         {
-            ScopedLock lock(threadHandlesMutex);
+            std::unique_lock lock(threadHandlesMutex);
             ARMARX_CHECK_EXPRESSION(!taskName.empty());
             ARMARX_CHECK_EXPRESSION(!threadHandles.count(taskName));
             ARMARX_CHECK_EXPRESSION(getState() < eManagedIceObjectExiting);
@@ -711,7 +710,7 @@ namespace armarx
             threadHandles[taskName] = handlePtr;
         }
         std::map<std::string, std::shared_ptr<ThreadPool::Handle>> threadHandles;
-        Mutex threadHandlesMutex;
+        std::mutex threadHandlesMutex;
 
         // //////////////////////////////////////////////////////////////////////////////////////// //
         // ///////////////////////////////////// ice interface //////////////////////////////////// //
diff --git a/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.cpp b/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.cpp
index f978876e538d9b8420af57d8c35b8f8f8063a9bd..1c98f6b653589f3a6f6fd611d4695e1933111458 100644
--- a/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.cpp
@@ -58,7 +58,7 @@ void TCPControllerSubUnit::setCycleTime(Ice::Int, const Ice::Current& c)
 
 void TCPControllerSubUnit::setTCPVelocity(const std::string& nodeSetName, const std::string& tcpName, const FramedDirectionBasePtr& translationVelocity, const FramedDirectionBasePtr& orientationVelocityRPY, const Ice::Current& c)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     ARMARX_CHECK_EXPRESSION_W_HINT(coordinateTransformationRobot->hasRobotNodeSet(nodeSetName), "The robot does not have the node set: " + nodeSetName);
     std::string tcp;
     if (tcpName.empty())
@@ -185,7 +185,7 @@ void TCPControllerSubUnit::setTCPVelocity(const std::string& nodeSetName, const
 
 bool TCPControllerSubUnit::isRequested(const Ice::Current&)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
     for (auto& pair : tcpControllerNameMap)
     {
         auto ctrl = robotUnit->getNJointController(pair.second);
diff --git a/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.h b/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.h
index b834d2b8adb16a0405bd3c60834693a3f7df4f57..cb7f6603057bdf2219d3f2aa92506bc6d76d2d53 100644
--- a/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.h
+++ b/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.h
@@ -27,6 +27,9 @@
 #include "RobotUnitSubUnit.h"
 #include "../NJointControllers/NJointTCPController.h"
 #include "../util.h"
+
+#include <mutex>
+
 namespace armarx
 {
     TYPEDEF_PTRS_HANDLE(RobotUnit);
@@ -57,7 +60,7 @@ namespace armarx
         // RobotUnitSubUnit interface
         void update(const SensorAndControl& sc, const JointAndNJointControllers& c) override;
     private:
-        mutable Mutex dataMutex;
+        mutable std::mutex dataMutex;
         RobotUnit* robotUnit = nullptr;
         VirtualRobot::RobotPtr coordinateTransformationRobot;
         std::map<std::string, std::string> tcpControllerNameMap;
diff --git a/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.cpp b/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.cpp
index 0a3669091152c2de2ec2caad4865a0e3d6b6c08d..4af60478ff5da6a4a57d055dd919473a64b1d1d5 100644
--- a/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.cpp
@@ -158,7 +158,7 @@ void TrajectoryControllerSubUnit::loadJointTraj(const TrajectoryBasePtr& jointTr
 {
     ARMARX_DEBUG << "Loading Trajectory ...";
 
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
 
     this->jointTraj = TrajectoryPtr::dynamicCast(jointTraj);
 
@@ -215,7 +215,7 @@ void TrajectoryControllerSubUnit::loadBasePoseTraj(const TrajectoryBasePtr& base
 
 void TrajectoryControllerSubUnit::setLoopPlayback(bool loop, const Ice::Current& c)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
 
     if (!controllerExists())
     {
@@ -237,7 +237,7 @@ double TrajectoryControllerSubUnit::getTrajEndTime(const Ice::Current& c)
 
 double TrajectoryControllerSubUnit::getCurrentTime(const Ice::Current& c)
 {
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
 
     if (!controllerExists())
     {
@@ -251,7 +251,7 @@ void TrajectoryControllerSubUnit::setEndTime(Ice::Double end, const Ice::Current
 {
     ARMARX_DEBUG << "Setting end-time ...";
 
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
 
     if (!jointTraj)
     {
@@ -306,7 +306,7 @@ bool TrajectoryControllerSubUnit::setJointsInUse(const std::string& jointName, b
 {
     ARMARX_DEBUG << "Setting joints in use ...";
 
-    ScopedLock lock(dataMutex);
+    std::unique_lock lock(dataMutex);
 
     if (controllerExists())
     {
@@ -366,7 +366,7 @@ void TrajectoryControllerSubUnit::considerConstraints(bool consider, const Ice::
 
 NJointTrajectoryControllerPtr TrajectoryControllerSubUnit::createTrajectoryController(std::vector<std::string>& jointNames, bool deleteIfAlreadyExist)
 {
-    ScopedRecursiveLock lock(controllerMutex);
+    std::unique_lock lock(controllerMutex);
 
     if (controllerExists() && deleteIfAlreadyExist)
     {
@@ -413,7 +413,7 @@ NJointTrajectoryControllerPtr TrajectoryControllerSubUnit::createTrajectoryContr
 
 void TrajectoryControllerSubUnit::assureTrajectoryController()
 {
-    ScopedRecursiveLock lock(controllerMutex);
+    std::unique_lock lock(controllerMutex);
 
     if (!controllerExists())
     {
@@ -424,7 +424,7 @@ void TrajectoryControllerSubUnit::assureTrajectoryController()
 
 bool TrajectoryControllerSubUnit::controllerExists()
 {
-    ScopedRecursiveLock lock(controllerMutex);
+    std::unique_lock lock(controllerMutex);
 
     auto allNJointControllers = robotUnit->getNJointControllersNotNull(robotUnit->getNJointControllerNames());
     NJointTrajectoryControllerPtr trajController;
diff --git a/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.h b/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.h
index d50323bf97082b1fb89df256ddf63784c0b7c277..b0b65db9dad4ee9cd94742d27b542cb03719492a 100644
--- a/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.h
+++ b/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.h
@@ -30,6 +30,8 @@
 
 #include "KinematicSubUnit.h"
 
+#include <mutex>
+
 namespace armarx
 {
     class TrajectoryControllerSubUnitPropertyDefinitions:
@@ -152,8 +154,8 @@ namespace armarx
         DebugDrawerInterfacePrx debugDrawer;
         PeriodicTask<TrajectoryControllerSubUnit>::pointer_type previewTask;
 
-        Mutex dataMutex;
-        RecursiveMutex controllerMutex;
+        std::mutex dataMutex;
+        std::recursive_mutex controllerMutex;
         bool recreateController = true;
 
         // Component interface
diff --git a/source/RobotAPI/components/units/SensorActorUnit.h b/source/RobotAPI/components/units/SensorActorUnit.h
index bef26a5e7c92e97d3ab2889e4081b59caee0daec..2c18c79e6bd840ed60f5660a858e104faecc3de6 100644
--- a/source/RobotAPI/components/units/SensorActorUnit.h
+++ b/source/RobotAPI/components/units/SensorActorUnit.h
@@ -27,7 +27,7 @@
 #include <ArmarXCore/core/exceptions/Exception.h>
 #include <RobotAPI/interface/units/UnitInterface.h>
 
-#include <boost/thread/mutex.hpp>
+#include <mutex>
 
 namespace armarx
 {
@@ -125,7 +125,7 @@ namespace armarx
         */
         virtual void onStop() {};
 
-        boost::mutex unitMutex;
+        std::mutex unitMutex;
         Ice::Identity ownerId;
         UnitExecutionState  executionState;
     };
diff --git a/source/RobotAPI/libraries/core/PIDController.cpp b/source/RobotAPI/libraries/core/PIDController.cpp
index 34c5e6c30469a5ef7d38d19a90a0bf5d67f57b5f..02f198137de13f4687bb212753b204b9ea49aaca 100644
--- a/source/RobotAPI/libraries/core/PIDController.cpp
+++ b/source/RobotAPI/libraries/core/PIDController.cpp
@@ -68,11 +68,11 @@ namespace armarx
         }
     }
 
-    ScopedRecursiveLockPtr PIDController::getLock() const
+    auto PIDController::getLock() const -> ScopedRecursiveLockPtr
     {
         if (threadSafe)
         {
-            return std::make_shared<ScopedRecursiveLock>(mutex);
+            return std::make_unique<ScopedRecursiveLock>(mutex);
         }
         else
         {
diff --git a/source/RobotAPI/libraries/core/PIDController.h b/source/RobotAPI/libraries/core/PIDController.h
index b8631b35b9154e28962149e3c1ca5688447d59ac..320f2e6146f018b9803d34dac4a4418dd22aebcc 100644
--- a/source/RobotAPI/libraries/core/PIDController.h
+++ b/source/RobotAPI/libraries/core/PIDController.h
@@ -28,10 +28,12 @@
 
 #include <ArmarXCore/core/logging/Logging.h>
 #include <ArmarXCore/observers/filters/rtfilters/RTFilterBase.h>
-#include <ArmarXCore/core/system/Synchronization.h>
 
 #include <Eigen/Core>
 
+#include <memory>
+#include <mutex>
+
 namespace armarx
 {
 
@@ -73,8 +75,10 @@ namespace armarx
         rtfilters::RTFilterBasePtr differentialFilter;
         rtfilters::RTFilterBasePtr pdOutputFilter;
     private:
+        using ScopedRecursiveLock = std::unique_lock<std::recursive_mutex>;
+        using ScopedRecursiveLockPtr = std::unique_ptr<ScopedRecursiveLock>;
         ScopedRecursiveLockPtr getLock() const;
-        mutable RecursiveMutex mutex;
+        mutable std::recursive_mutex mutex;
     };
     using PIDControllerPtr = std::shared_ptr<PIDController>;