diff --git a/GraspPlanning/ApproachMovementSurfaceNormal.cpp b/GraspPlanning/ApproachMovementSurfaceNormal.cpp
index a596fe387cf5ea3ed2202a253255c3121f9e7ca9..e344e92f105579c629eb99b1785c83a9b406a0ff 100644
--- a/GraspPlanning/ApproachMovementSurfaceNormal.cpp
+++ b/GraspPlanning/ApproachMovementSurfaceNormal.cpp
@@ -10,6 +10,8 @@
 #include <VirtualRobot/Nodes/RobotNode.h>
 #include <VirtualRobot/Visualization/TriMeshModel.h>
 
+#include <Eigen/Geometry>
+
 
 using namespace std;
 using namespace VirtualRobot;
diff --git a/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.h b/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.h
index d96033b628cb450930d72f6e3553e4d91bd9824a..0ddc46c6b921066a40120cf6febb39d532b511ba 100644
--- a/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.h
+++ b/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.h
@@ -41,7 +41,7 @@ namespace GraspStudio
      *   "Pose Error Robust Grasping from Contact Wrench Space Metrics",
      *   2012 IEEE International Conference on Robotics and Automation.
      */
-    class GRASPSTUDIO_IMPORT_EXPORT GraspEvaluationPoseUncertainty : public boost::enable_shared_from_this<GraspEvaluationPoseUncertainty>
+    class GRASPSTUDIO_IMPORT_EXPORT GraspEvaluationPoseUncertainty : public std::enable_shared_from_this<GraspEvaluationPoseUncertainty>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
diff --git a/GraspPlanning/GraspQuality/GraspQualityMeasureWrenchSpace.cpp b/GraspPlanning/GraspQuality/GraspQualityMeasureWrenchSpace.cpp
index fe00636d114bf2c0b80a66236d0a1dd8099eb619..f15fe6f882c58a7ab394f3cbddffbea6c471253f 100644
--- a/GraspPlanning/GraspQuality/GraspQualityMeasureWrenchSpace.cpp
+++ b/GraspPlanning/GraspQuality/GraspQualityMeasureWrenchSpace.cpp
@@ -19,6 +19,9 @@
 #include <fstream>
 #include <string>
 #include <cfloat>
+
+#include <Eigen/Geometry>
+
 // if defined, the inverted contact normals are used
 //#define INVERT_NORMALS
 
diff --git a/GraspPlanning/GraspQuality/GraspQualityMeasureWrenchSpaceNotNormalized.cpp b/GraspPlanning/GraspQuality/GraspQualityMeasureWrenchSpaceNotNormalized.cpp
index ddcf65c6dda4cc78555f83249300f5b6a0ea6caf..f423297f813d79d25a49e1196052f24834574a5f 100644
--- a/GraspPlanning/GraspQuality/GraspQualityMeasureWrenchSpaceNotNormalized.cpp
+++ b/GraspPlanning/GraspQuality/GraspQualityMeasureWrenchSpaceNotNormalized.cpp
@@ -20,6 +20,8 @@
 #include <string>
 #include <cfloat>
 
+#include <Eigen/Geometry>
+
 
 using namespace std;
 using namespace VirtualRobot;
diff --git a/GraspPlanning/GraspStudio.h b/GraspPlanning/GraspStudio.h
index 1d6de55a64e0a115dca56580d1101a5134e97f02..fca01ec9a0230848ca5a253198d2871b4b2b9f54 100644
--- a/GraspPlanning/GraspStudio.h
+++ b/GraspPlanning/GraspStudio.h
@@ -82,15 +82,15 @@ namespace GraspStudio
     class GraspPlanner;
     class GenericGraspPlanner;
 
-    typedef boost::shared_ptr<GraspQualityMeasure> GraspQualityMeasurePtr;
-    typedef boost::shared_ptr<GraspQualityMeasureWrenchSpace> GraspQualityMeasureWrenchSpacePtr;
-    typedef boost::shared_ptr<GraspQualityMeasureWrenchSpaceNotNormalized> GraspQualityMeasureWrenchSpaceNotNormalizedPtr;
-    typedef boost::shared_ptr<ContactConeGenerator> ContactConeGeneratorPtr;
-    typedef boost::shared_ptr<GraspQualityMeasure> GraspQualityMeasurePtr;
-    typedef boost::shared_ptr<ApproachMovementGenerator> ApproachMovementGeneratorPtr;
-    typedef boost::shared_ptr<ApproachMovementSurfaceNormal> ApproachMovementSurfaceNormalPtr;
-    typedef boost::shared_ptr<GraspPlanner> GraspPlannerPtr;
-    typedef boost::shared_ptr<GenericGraspPlanner> GenericGraspPlannerPtr;
+    typedef std::shared_ptr<GraspQualityMeasure> GraspQualityMeasurePtr;
+    typedef std::shared_ptr<GraspQualityMeasureWrenchSpace> GraspQualityMeasureWrenchSpacePtr;
+    typedef std::shared_ptr<GraspQualityMeasureWrenchSpaceNotNormalized> GraspQualityMeasureWrenchSpaceNotNormalizedPtr;
+    typedef std::shared_ptr<ContactConeGenerator> ContactConeGeneratorPtr;
+    typedef std::shared_ptr<GraspQualityMeasure> GraspQualityMeasurePtr;
+    typedef std::shared_ptr<ApproachMovementGenerator> ApproachMovementGeneratorPtr;
+    typedef std::shared_ptr<ApproachMovementSurfaceNormal> ApproachMovementSurfaceNormalPtr;
+    typedef std::shared_ptr<GraspPlanner> GraspPlannerPtr;
+    typedef std::shared_ptr<GenericGraspPlanner> GenericGraspPlannerPtr;
 
 #define GRASPSTUDIO_INFO VR_INFO
 #define GRASPSTUDIO_WARNING VR_WARNING
diff --git a/GraspPlanning/Visualization/CoinVisualization/CoinConvexHullVisualization.h b/GraspPlanning/Visualization/CoinVisualization/CoinConvexHullVisualization.h
index f48dd9b8ef1efb83109e3179aefac4f87c9a3940..b9d2ede1a0e763e03bc79c8e775c1a8698a4c2d7 100644
--- a/GraspPlanning/Visualization/CoinVisualization/CoinConvexHullVisualization.h
+++ b/GraspPlanning/Visualization/CoinVisualization/CoinConvexHullVisualization.h
@@ -63,7 +63,7 @@ namespace GraspStudio
 
     };
 
-    typedef boost::shared_ptr<CoinConvexHullVisualization> CoinConvexHullVisualizationPtr;
+    typedef std::shared_ptr<CoinConvexHullVisualization> CoinConvexHullVisualizationPtr;
 
 
 } // namespace Saba
diff --git a/GraspPlanning/examples/GraspPlanner/GraspPlannerWindow.h b/GraspPlanning/examples/GraspPlanner/GraspPlannerWindow.h
index ee79d811c8c1c5fa8c7b6052190c326a267f03da..e168c4462b1c33a0f5dffd81307c0794fca31cf6 100644
--- a/GraspPlanning/examples/GraspPlanner/GraspPlannerWindow.h
+++ b/GraspPlanning/examples/GraspPlanner/GraspPlannerWindow.h
@@ -105,8 +105,8 @@ protected:
     GraspStudio::ApproachMovementSurfaceNormalPtr approach;
     GraspStudio::GenericGraspPlannerPtr planner;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot;
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject;
 private slots:
     void on_pushButtonLoadObject_clicked();
 };
diff --git a/GraspPlanning/examples/GraspQuality/GraspQualityWindow.h b/GraspPlanning/examples/GraspQuality/GraspQualityWindow.h
index eab6017676745deef4fb31d07e205e23dcb346d4..1712e49a21a2ac63ddc5cb32ec040ba640afc1c4 100644
--- a/GraspPlanning/examples/GraspQuality/GraspQualityWindow.h
+++ b/GraspPlanning/examples/GraspQuality/GraspQualityWindow.h
@@ -125,7 +125,7 @@ protected:
 
     GraspStudio::GraspQualityMeasureWrenchSpacePtr qualityMeasure;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot;
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject;
 };
 
diff --git a/MotionPlanning/CSpace/CSpace.cpp b/MotionPlanning/CSpace/CSpace.cpp
index 2bc6d5c3d14510e89b341dffdfab88fdc52e7672..cf0d893c122eec1d045819bb4151a2b6237829f9 100644
--- a/MotionPlanning/CSpace/CSpace.cpp
+++ b/MotionPlanning/CSpace/CSpace.cpp
@@ -22,7 +22,7 @@ using namespace std;
 namespace Saba
 {
 
-    SABA_IMPORT_EXPORT boost::mutex CSpace::colCheckMutex;
+    SABA_IMPORT_EXPORT std::mutex CSpace::colCheckMutex;
     SABA_IMPORT_EXPORT int CSpace::cloneCounter = 0;
 
     //#define DO_THE_TESTS
diff --git a/MotionPlanning/CSpace/CSpace.h b/MotionPlanning/CSpace/CSpace.h
index c3e73d9a3b114b9cf5c067cc97c2a82e8a2f664d..3dcf18523cfb6c87a4393dc48776edeaff3f04e0 100644
--- a/MotionPlanning/CSpace/CSpace.h
+++ b/MotionPlanning/CSpace/CSpace.h
@@ -55,7 +55,7 @@ namespace Saba
      @see CSpaceSampled
 
      */
-    class SABA_IMPORT_EXPORT CSpace : public boost::enable_shared_from_this<CSpace>
+    class SABA_IMPORT_EXPORT CSpace : public std::enable_shared_from_this<CSpace>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -341,7 +341,7 @@ namespace Saba
         std::vector< bool > borderLessDimension;         // store borderless state
 
         bool multiThreaded;                             // indicates that more than one CSpace is used by some threads
-        static boost::mutex colCheckMutex;              // only needed when multithreading support is enabled
+        static std::mutex colCheckMutex;              // only needed when multithreading support is enabled
         //  -> setting the configurations and checking against collisions is protected by this mutex
         std::vector<ConfigurationConstraintPtr>  constraints;
 
diff --git a/MotionPlanning/CSpace/CSpaceTree.h b/MotionPlanning/CSpace/CSpaceTree.h
index 3df48413f6376e262053fcda77ff892b657d03ae..fa04f949dcb6a85fb4ace07505981587d9807983 100644
--- a/MotionPlanning/CSpace/CSpaceTree.h
+++ b/MotionPlanning/CSpace/CSpaceTree.h
@@ -25,6 +25,7 @@
 #include "../Saba.h"
 #include <iostream>
 #include <vector>
+#include <mutex>
 #include <map>
 
 namespace Saba
@@ -181,7 +182,7 @@ namespace Saba
 
         std::map<unsigned int, CSpaceNodePtr > idNodeMapping; // mapping id<->node
 
-        boost::mutex mutex;
+        std::mutex mutex;
     };
 
 } // namespace Saba
diff --git a/MotionPlanning/Planner/GraspRrt.cpp b/MotionPlanning/Planner/GraspRrt.cpp
index 48b6a1d5e9c6200baafe98219d96c6bfb4d6794c..6d13dea2abf4972ea3b289169b4b267ee1b5f89c 100644
--- a/MotionPlanning/Planner/GraspRrt.cpp
+++ b/MotionPlanning/Planner/GraspRrt.cpp
@@ -12,6 +12,8 @@
 #include <cfloat>
 #include <ctime>
 
+#include <Eigen/Geometry>
+
 using namespace std;
 
 namespace Saba
diff --git a/MotionPlanning/Planner/GraspRrt.h b/MotionPlanning/Planner/GraspRrt.h
index 7c9d37d12474d2bea12d91229154a1b5e003eb27..e697840e8e8e2d8fcf19cc716b97894b9e7c752e 100644
--- a/MotionPlanning/Planner/GraspRrt.h
+++ b/MotionPlanning/Planner/GraspRrt.h
@@ -257,7 +257,7 @@ namespace Saba
 
         int colChecksOverall;
         bool foundSolution;
-        boost::mutex graspInfoMutex;
+        std::mutex graspInfoMutex;
 
         bool verbose;
 
diff --git a/MotionPlanning/Planner/PlanningThread.cpp b/MotionPlanning/Planner/PlanningThread.cpp
index 18365c3dd4c87a06c8844490ae871c424472e124..9d756658788dde8289ff5ba24155f3896ac7f066 100644
--- a/MotionPlanning/Planner/PlanningThread.cpp
+++ b/MotionPlanning/Planner/PlanningThread.cpp
@@ -26,7 +26,7 @@ namespace Saba
 
     void PlanningThread::start()
     {
-        boost::lock_guard<boost::mutex> lock(mutex);
+        std::scoped_lock lock(mutex);
 
         if (threadStarted)
         {
@@ -38,7 +38,10 @@ namespace Saba
         threadStarted = true;
         plannerFinished = false;
 
-        planningThread = boost::thread(&PlanningThread::workingMethod, this);
+        planningThread = std::thread([this]()
+        {
+            this->workingMethod();
+        });
     }
 
     void PlanningThread::interrupt(bool waitUntilStopped)
@@ -72,7 +75,7 @@ namespace Saba
 
     bool PlanningThread::isRunning()
     {
-        boost::lock_guard<boost::mutex> lock(mutex);
+        std::scoped_lock lock(mutex);
         return threadStarted;
     }
 
diff --git a/MotionPlanning/Planner/PlanningThread.h b/MotionPlanning/Planner/PlanningThread.h
index d6ff3defadef54afaf492148a938cd342de5891d..48948152a6a4173c5adeac8f0a617029ddf97fe9 100644
--- a/MotionPlanning/Planner/PlanningThread.h
+++ b/MotionPlanning/Planner/PlanningThread.h
@@ -28,6 +28,9 @@
 #include <VirtualRobot/VirtualRobot.h>
 #include "MotionPlanner.h"
 
+#include <thread>
+#include <mutex>
+
 
 namespace Saba
 {
@@ -86,8 +89,8 @@ namespace Saba
         bool threadStarted;
         bool plannerFinished;
         MotionPlannerPtr planner;
-        boost::thread planningThread;
-        boost::mutex mutex;
+        std::thread planningThread;
+        std::mutex mutex;
 
     };
 
diff --git a/MotionPlanning/Planner/Rrt.cpp b/MotionPlanning/Planner/Rrt.cpp
index 1c5ab1e6b58d4b6b5656b94e11f840b8ad27f935..14c5139c08b1928f9e1dce920e99852e265da729 100644
--- a/MotionPlanning/Planner/Rrt.cpp
+++ b/MotionPlanning/Planner/Rrt.cpp
@@ -15,7 +15,7 @@ namespace Saba
 {
 
     Rrt::Rrt(CSpacePtr cspace, RrtMethod mode, float probabilityExtendToGoal, float samplingSize)
-        : MotionPlanner(boost::dynamic_pointer_cast<CSpace>(cspace))
+        : MotionPlanner(std::dynamic_pointer_cast<CSpace>(cspace))
     {
         rrtMode = mode;
         tree.reset(new CSpaceTree(cspace));
@@ -33,7 +33,7 @@ namespace Saba
         }
 
         extendGoToGoal = probabilityExtendToGoal;
-        CSpaceSampledPtr sampledCSpace = boost::dynamic_pointer_cast<CSpaceSampled>(cspace);
+        CSpaceSampledPtr sampledCSpace = std::dynamic_pointer_cast<CSpaceSampled>(cspace);
         if(samplingSize > 0)
             this->extendStepSize = samplingSize;
         else if(sampledCSpace)
@@ -358,7 +358,7 @@ namespace Saba
 
         float DCDsize = 0.0f;
         float Pathsize = 0.0f;
-        CSpaceSampledPtr cs = boost::dynamic_pointer_cast<CSpaceSampled>(cspace);
+        CSpaceSampledPtr cs = std::dynamic_pointer_cast<CSpaceSampled>(cspace);
 
         if (cs)
         {
diff --git a/MotionPlanning/PostProcessing/PathProcessingThread.cpp b/MotionPlanning/PostProcessing/PathProcessingThread.cpp
index 24171680f5603bb305af6343da60a14145423958..d8977449e9400511289be8bc635782f401ebfc10 100644
--- a/MotionPlanning/PostProcessing/PathProcessingThread.cpp
+++ b/MotionPlanning/PostProcessing/PathProcessingThread.cpp
@@ -29,7 +29,7 @@ namespace Saba
 
     void PathProcessingThread::start(int optimizeSteps)
     {
-        boost::lock_guard<boost::mutex> lock(mutex);
+        std::scoped_lock lock(mutex);
 
         if (threadStarted)
         {
@@ -43,7 +43,10 @@ namespace Saba
         this->optimizeSteps = optimizeSteps;
         resultPath.reset();
 
-        processingThread = boost::thread(&PathProcessingThread::workingMethod, this);
+        processingThread = std::thread([this]()
+        {
+            this->workingMethod();;
+        });
     }
 
     void PathProcessingThread::interrupt(bool waitUntilStopped)
@@ -77,7 +80,7 @@ namespace Saba
 
     bool PathProcessingThread::isRunning()
     {
-        boost::lock_guard<boost::mutex> lock(mutex);
+        std::scoped_lock lock(mutex);
         return threadStarted;
     }
 
diff --git a/MotionPlanning/PostProcessing/PathProcessingThread.h b/MotionPlanning/PostProcessing/PathProcessingThread.h
index 61f127a0a6617aa9352f136b0efe75e9fa3ccd21..d38b3a80a5d583c9806532ae498301f0ca5820af 100644
--- a/MotionPlanning/PostProcessing/PathProcessingThread.h
+++ b/MotionPlanning/PostProcessing/PathProcessingThread.h
@@ -27,6 +27,8 @@
 #include "PathProcessor.h"
 #include "../CSpace/CSpacePath.h"
 
+#include <thread>
+#include <mutex>
 
 namespace Saba
 {
@@ -88,8 +90,8 @@ namespace Saba
         bool threadStarted;
         bool processingFinished;
         PathProcessorPtr pathProcessor;
-        boost::thread processingThread;
-        boost::mutex mutex;
+        std::thread processingThread;
+        std::mutex mutex;
 
         CSpacePathPtr resultPath;
         int optimizeSteps;
diff --git a/MotionPlanning/Saba.h b/MotionPlanning/Saba.h
index 40a5394f2c4f49b61276e1831b8be4b7a9a8e47d..5d6aca2193a6bdd10a575eb751eb95aa8b80b85e 100644
--- a/MotionPlanning/Saba.h
+++ b/MotionPlanning/Saba.h
@@ -48,12 +48,6 @@ mobile manipulators or service and humanoid robots.
 #include "VirtualRobot/VirtualRobotException.h"
 
 
-#include <iostream>
-#include <sstream>
-#include <cmath>
-#include <Eigen/Core>
-#include <Eigen/Geometry>
-
 #ifdef WIN32
 #  include <winsock2.h>
 #  include <windows.h>
@@ -93,24 +87,24 @@ namespace Saba
     class PlanningThread;
     class PathProcessingThread;
 
-    typedef boost::shared_ptr<CSpace> CSpacePtr;
-    typedef boost::shared_ptr<CSpaceSampled> CSpaceSampledPtr;
-    typedef boost::shared_ptr<CSpacePath> CSpacePathPtr;
-    typedef boost::shared_ptr<Sampler> SamplerPtr;
-    typedef boost::shared_ptr<CSpaceTree> CSpaceTreePtr;
-    typedef boost::shared_ptr<CSpaceNode> CSpaceNodePtr;
-    typedef boost::shared_ptr<MotionPlanner> MotionPlannerPtr;
-    typedef boost::shared_ptr<Rrt> RrtPtr;
-    typedef boost::shared_ptr<BiRrt> BiRrtPtr;
-    typedef boost::shared_ptr<GraspIkRrt> GraspIkRrtPtr;
-    typedef boost::shared_ptr<GraspRrt> GraspRrtPtr;
-    typedef boost::shared_ptr<PathProcessor> PathProcessorPtr;
-    typedef boost::shared_ptr<ShortcutProcessor> ShortcutProcessorPtr;
-    typedef boost::shared_ptr<ElasticBandProcessor> ElasticBandProcessorPtr;
-    typedef boost::shared_ptr<ConfigurationConstraint> ConfigurationConstraintPtr;
-    typedef boost::shared_ptr<ApproachDiscretization> ApproachDiscretizationPtr;
-    typedef boost::shared_ptr<PlanningThread> PlanningThreadPtr;
-    typedef boost::shared_ptr<PathProcessingThread> PathProcessingThreadPtr;
+    typedef std::shared_ptr<CSpace> CSpacePtr;
+    typedef std::shared_ptr<CSpaceSampled> CSpaceSampledPtr;
+    typedef std::shared_ptr<CSpacePath> CSpacePathPtr;
+    typedef std::shared_ptr<Sampler> SamplerPtr;
+    typedef std::shared_ptr<CSpaceTree> CSpaceTreePtr;
+    typedef std::shared_ptr<CSpaceNode> CSpaceNodePtr;
+    typedef std::shared_ptr<MotionPlanner> MotionPlannerPtr;
+    typedef std::shared_ptr<Rrt> RrtPtr;
+    typedef std::shared_ptr<BiRrt> BiRrtPtr;
+    typedef std::shared_ptr<GraspIkRrt> GraspIkRrtPtr;
+    typedef std::shared_ptr<GraspRrt> GraspRrtPtr;
+    typedef std::shared_ptr<PathProcessor> PathProcessorPtr;
+    typedef std::shared_ptr<ShortcutProcessor> ShortcutProcessorPtr;
+    typedef std::shared_ptr<ElasticBandProcessor> ElasticBandProcessorPtr;
+    typedef std::shared_ptr<ConfigurationConstraint> ConfigurationConstraintPtr;
+    typedef std::shared_ptr<ApproachDiscretization> ApproachDiscretizationPtr;
+    typedef std::shared_ptr<PlanningThread> PlanningThreadPtr;
+    typedef std::shared_ptr<PathProcessingThread> PathProcessingThreadPtr;
 
 #define SABA_INFO VR_INFO
 #define SABA_WARNING VR_WARNING
diff --git a/MotionPlanning/Visualization/CoinVisualization/CoinRrtWorkspaceVisualization.h b/MotionPlanning/Visualization/CoinVisualization/CoinRrtWorkspaceVisualization.h
index 732f5cbc9694d0a9b960a87faec024372d2031da..47788b74c20dec7fe05cd3608bc7fa8ade646bad 100644
--- a/MotionPlanning/Visualization/CoinVisualization/CoinRrtWorkspaceVisualization.h
+++ b/MotionPlanning/Visualization/CoinVisualization/CoinRrtWorkspaceVisualization.h
@@ -84,7 +84,7 @@ namespace Saba
         SoSeparator* visualization;
     };
 
-    typedef boost::shared_ptr<CoinRrtWorkspaceVisualization> CoinRrtWorkspaceVisualizationPtr;
+    typedef std::shared_ptr<CoinRrtWorkspaceVisualization> CoinRrtWorkspaceVisualizationPtr;
 
 
 } // namespace Saba
diff --git a/MotionPlanning/examples/GraspRRT/GraspRrtWindow.cpp b/MotionPlanning/examples/GraspRRT/GraspRrtWindow.cpp
index b3f052241ed82b35d3fa078da0994a56c6eb810f..be18acb9294f72df2814bb1bd8fdda136efc6371 100644
--- a/MotionPlanning/examples/GraspRRT/GraspRrtWindow.cpp
+++ b/MotionPlanning/examples/GraspRRT/GraspRrtWindow.cpp
@@ -696,7 +696,7 @@ void GraspRrtWindow::buildRRTVisu()
         return;
     }
 
-    boost::shared_ptr<Saba::CoinRrtWorkspaceVisualization> w(new Saba::CoinRrtWorkspaceVisualization(robot, cspace, eef->getGCP()->getName()));
+    std::shared_ptr<Saba::CoinRrtWorkspaceVisualization> w(new Saba::CoinRrtWorkspaceVisualization(robot, cspace, eef->getGCP()->getName()));
 
     if (UI.checkBoxShowRRT->isChecked())
     {
diff --git a/MotionPlanning/examples/GraspRRT/GraspRrtWindow.h b/MotionPlanning/examples/GraspRRT/GraspRrtWindow.h
index d8be275aadff876f47e923763aa70b2e1ed4e2e7..8295b67283fd6bf183b3ebe8f7d02018dd0148a8 100644
--- a/MotionPlanning/examples/GraspRRT/GraspRrtWindow.h
+++ b/MotionPlanning/examples/GraspRRT/GraspRrtWindow.h
@@ -147,7 +147,7 @@ protected:
     Saba::CSpaceTreePtr tree;
     GraspStudio::GraspQualityMeasureWrenchSpacePtr graspQuality;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization;
 
     Saba::GraspRrtPtr test_graspRrt;
     Saba::CSpaceSampledPtr test_cspace;
diff --git a/MotionPlanning/examples/IKRRT/IKRRTWindow.cpp b/MotionPlanning/examples/IKRRT/IKRRTWindow.cpp
index 969af0b75c0182b0772efb6286f6c545099a6529..f58e9958819412623a0f122f1ddbb528257b09ee 100644
--- a/MotionPlanning/examples/IKRRT/IKRRTWindow.cpp
+++ b/MotionPlanning/examples/IKRRT/IKRRTWindow.cpp
@@ -529,7 +529,7 @@ void IKRRTWindow::buildRRTVisu()
         return;
     }
 
-    boost::shared_ptr<Saba::CoinRrtWorkspaceVisualization> w(new Saba::CoinRrtWorkspaceVisualization(robot, cspace, eef->getTcpName()));
+    std::shared_ptr<Saba::CoinRrtWorkspaceVisualization> w(new Saba::CoinRrtWorkspaceVisualization(robot, cspace, eef->getTcpName()));
 
     if (tree)
     {
diff --git a/MotionPlanning/examples/IKRRT/IKRRTWindow.h b/MotionPlanning/examples/IKRRT/IKRRTWindow.h
index cb93d6fa48bfc96d53ace3e02574886f4655532b..44a253bad3007742e6eff61d2ad99b97a6d9eb93 100644
--- a/MotionPlanning/examples/IKRRT/IKRRTWindow.h
+++ b/MotionPlanning/examples/IKRRT/IKRRTWindow.h
@@ -130,7 +130,7 @@ protected:
     bool playbackMode;
     int playCounter;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot;
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject;
 };
 
diff --git a/MotionPlanning/examples/MultiThreadedPlanning/MTPlanningScenery.cpp b/MotionPlanning/examples/MultiThreadedPlanning/MTPlanningScenery.cpp
index 4a59357fec4cc464a8f05ad6f39c44b2023b4f97..8ab9aa5906d65da3f034de1f2563c8adb58af49b 100644
--- a/MotionPlanning/examples/MultiThreadedPlanning/MTPlanningScenery.cpp
+++ b/MotionPlanning/examples/MultiThreadedPlanning/MTPlanningScenery.cpp
@@ -212,7 +212,7 @@ void MTPlanningScenery::buildScene()
         m.block(0, 3, 3, 1) = p;
         o->setGlobalPose(m);
         environment->addSceneObject(o);
-        boost::shared_ptr<CoinVisualization> visualization = o->getVisualization<CoinVisualization>();
+        std::shared_ptr<CoinVisualization> visualization = o->getVisualization<CoinVisualization>();
         SoNode* visualisationNode = nullptr;
 
         if (visualization)
@@ -637,7 +637,7 @@ void MTPlanningScenery::loadRobotMTPlanning(bool bMultiCollisionCheckers)
 
     if ((int)robots.size() == 1)
     {
-        boost::shared_ptr<CoinVisualization> visualization = robots[0]->getVisualization<CoinVisualization>(robotModelVisuColModel ? SceneObject::Full : SceneObject::Collision);
+        std::shared_ptr<CoinVisualization> visualization = robots[0]->getVisualization<CoinVisualization>(robotModelVisuColModel ? SceneObject::Full : SceneObject::Collision);
         //SoNode* visualisationNode = NULL;
         robotSep = new SoSeparator();
 
@@ -762,7 +762,7 @@ void MTPlanningScenery::setRobotModelShape(bool collisionModel)
     //sceneSep->removeChild(robotSep);
     if (robots.size() > 0)
     {
-        boost::shared_ptr<CoinVisualization> visualization = robots[0]->getVisualization<CoinVisualization>(robotModelVisuColModel ? SceneObject::Full : SceneObject::Collision);
+        std::shared_ptr<CoinVisualization> visualization = robots[0]->getVisualization<CoinVisualization>(robotModelVisuColModel ? SceneObject::Full : SceneObject::Collision);
         //SoNode* visualisationNode = NULL;
         robotSep = new SoSeparator();
 
diff --git a/MotionPlanning/examples/PlatformDemo/PlatformWindow.cpp b/MotionPlanning/examples/PlatformDemo/PlatformWindow.cpp
index ac64b91c596cd7e023cf8707cc424f59b44cbc5a..96c06157293eaa66b9eada095761001185201fcd 100644
--- a/MotionPlanning/examples/PlatformDemo/PlatformWindow.cpp
+++ b/MotionPlanning/examples/PlatformDemo/PlatformWindow.cpp
@@ -346,7 +346,7 @@ void PlatformWindow::buildRRTVisu()
         return;
     }
 
-    boost::shared_ptr<Saba::CoinRrtWorkspaceVisualization> w(new Saba::CoinRrtWorkspaceVisualization(robot, cspace, rns->getTCP()->getName()));
+    std::shared_ptr<Saba::CoinRrtWorkspaceVisualization> w(new Saba::CoinRrtWorkspaceVisualization(robot, cspace, rns->getTCP()->getName()));
 
     if (UI.checkBoxShowRRT->isChecked())
     {
diff --git a/MotionPlanning/examples/PlatformDemo/PlatformWindow.h b/MotionPlanning/examples/PlatformDemo/PlatformWindow.h
index 0a272dc74024d608e9422617ee728e89cb515512..2e7d214623f709af48ae0b0bb9006ea0bc63dece 100644
--- a/MotionPlanning/examples/PlatformDemo/PlatformWindow.h
+++ b/MotionPlanning/examples/PlatformDemo/PlatformWindow.h
@@ -141,7 +141,7 @@ protected:
     Saba::CSpaceTreePtr tree;
     Saba::CSpaceTreePtr tree2;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization;
 
     Saba::BiRrtPtr rrt;
 };
diff --git a/MotionPlanning/examples/RRT/RRTdemo.cpp b/MotionPlanning/examples/RRT/RRTdemo.cpp
index 3d1ade71a637d2dec4d70582e04981ff68e58685..08885df145697e9bc8b3d7507bd7e34aed993499 100644
--- a/MotionPlanning/examples/RRT/RRTdemo.cpp
+++ b/MotionPlanning/examples/RRT/RRTdemo.cpp
@@ -174,7 +174,7 @@ void startRRTVisualization()
     SoSeparator* sep = new SoSeparator();
     SceneObject::VisualizationType colModel = SceneObject::Full;
 
-    boost::shared_ptr<CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(colModel);
+    std::shared_ptr<CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(colModel);
     SoNode* visualisationNode = nullptr;
 
     if (visualization)
@@ -188,12 +188,12 @@ void startRRTVisualization()
     VisualizationNodePtr visuObstacle = o->getVisualization();
     std::vector<VisualizationNodePtr> visus;
     visus.push_back(visuObstacle);
-    boost::shared_ptr<CoinVisualization> visualizationO(new CoinVisualization(visus));
+    std::shared_ptr<CoinVisualization> visualizationO(new CoinVisualization(visus));
     SoNode* obstacleSoNode = visualizationO->getCoinVisualization();
     sep->addChild(obstacleSoNode);
 
     // show rrt visu
-    boost::shared_ptr<CoinRrtWorkspaceVisualization> w(new CoinRrtWorkspaceVisualization(robot, cspace, "EndPoint"));
+    std::shared_ptr<CoinRrtWorkspaceVisualization> w(new CoinRrtWorkspaceVisualization(robot, cspace, "EndPoint"));
     w->addTree(tree);
 #ifdef USE_BIRRT
     CSpaceTreePtr tree2 = rrt->getTree2();
diff --git a/MotionPlanning/examples/RrtGui/RrtGuiWindow.cpp b/MotionPlanning/examples/RrtGui/RrtGuiWindow.cpp
index 83fbae72a51da2eeda60232cee58cf97f4289e31..a285fdad90101e139adad8fcbdd85b8f74f5a51a 100644
--- a/MotionPlanning/examples/RrtGui/RrtGuiWindow.cpp
+++ b/MotionPlanning/examples/RrtGui/RrtGuiWindow.cpp
@@ -578,7 +578,7 @@ void RrtGuiWindow::buildRRTVisu()
         return;
     }
 
-    boost::shared_ptr<Saba::CoinRrtWorkspaceVisualization> w(new Saba::CoinRrtWorkspaceVisualization(robot, cspace, rns->getTCP()->getName()));
+    std::shared_ptr<Saba::CoinRrtWorkspaceVisualization> w(new Saba::CoinRrtWorkspaceVisualization(robot, cspace, rns->getTCP()->getName()));
 
     if (UI.checkBoxShowRRT->isChecked())
     {
diff --git a/MotionPlanning/examples/RrtGui/RrtGuiWindow.h b/MotionPlanning/examples/RrtGui/RrtGuiWindow.h
index faaf2b0e178620b59489e2ca98e4c0d3da5b6c22..60d13e359a3b477c9eff2ba54ea7fdde511d3c4e 100644
--- a/MotionPlanning/examples/RrtGui/RrtGuiWindow.h
+++ b/MotionPlanning/examples/RrtGui/RrtGuiWindow.h
@@ -115,6 +115,6 @@ protected:
     Saba::CSpaceTreePtr tree;
     Saba::CSpaceTreePtr tree2;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization;
 };
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletCoinQtViewer.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletCoinQtViewer.cpp
index 262d27c543eb07bbeb1ea0735ce0dbc3cb17cfca..c8b14a4a0373709648d3e8aaf0bde50d17aa89e3 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletCoinQtViewer.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletCoinQtViewer.cpp
@@ -34,7 +34,7 @@ namespace SimDynamics
 
         SIMDYNAMICS_ASSERT(world);
 
-        bulletEngine = boost::dynamic_pointer_cast<BulletEngine>(world->getEngine());
+        bulletEngine = std::dynamic_pointer_cast<BulletEngine>(world->getEngine());
 
         SIMDYNAMICS_ASSERT(bulletEngine);
 
@@ -243,7 +243,7 @@ namespace SimDynamics
         //VR_ASSERT(so);
         removeVisualization(robot);
 
-        boost::shared_ptr<VirtualRobot::CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(visuType);
+        std::shared_ptr<VirtualRobot::CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(visuType);
         SoNode* n = visualization->getCoinVisualization();
 
         if (n)
@@ -336,9 +336,9 @@ namespace SimDynamics
         }
 
         SoSeparator* n = new SoSeparator();
-        BOOST_FOREACH(VisualizationNodePtr visualizationNode, collectedVisualizationNodes)
+        for (VisualizationNodePtr const& visualizationNode : collectedVisualizationNodes)
         {
-            boost::shared_ptr<CoinVisualizationNode> coinVisualizationNode = boost::dynamic_pointer_cast<CoinVisualizationNode>(visualizationNode);
+            std::shared_ptr<CoinVisualizationNode> coinVisualizationNode = std::dynamic_pointer_cast<CoinVisualizationNode>(visualizationNode);
 
             if (coinVisualizationNode && coinVisualizationNode->getCoinVisualization())
             {
@@ -482,18 +482,18 @@ namespace SimDynamics
         }
     }
 
-    void BulletCoinQtViewer::setMutex(boost::shared_ptr<boost::recursive_mutex> engineMutexPtr)
+    void BulletCoinQtViewer::setMutex(std::shared_ptr<std::recursive_mutex> engineMutexPtr)
     {
         this->engineMutexPtr = engineMutexPtr;
     }
 
     BulletCoinQtViewer::MutexLockPtr BulletCoinQtViewer::getScopedLock()
     {
-        boost::shared_ptr< boost::recursive_mutex::scoped_lock > scoped_lock;
+        std::shared_ptr< std::scoped_lock<std::recursive_mutex> > scoped_lock;
 
         if (engineMutexPtr)
         {
-            scoped_lock.reset(new boost::recursive_mutex::scoped_lock(*engineMutexPtr));
+            scoped_lock.reset(new std::scoped_lock<std::recursive_mutex>(*engineMutexPtr));
         }
 
         return scoped_lock;
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletCoinQtViewer.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletCoinQtViewer.h
index fa965ffefc8bdd217f4b680964da181436b719f0..f7d28e379f7f6161d1b29e9cdbdc1a97f66e3e97 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletCoinQtViewer.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletCoinQtViewer.h
@@ -168,9 +168,9 @@ namespace SimDynamics
         void addStepCallback(BulletStepCallback callback, void* data);
 
         //! If set, all actions are protected with this mutex
-        virtual void setMutex(boost::shared_ptr<boost::recursive_mutex> engineMutexPtr);
+        virtual void setMutex(std::shared_ptr<std::recursive_mutex> engineMutexPtr);
 
-        typedef boost::shared_ptr< boost::recursive_mutex::scoped_lock > MutexLockPtr;
+        typedef std::shared_ptr< std::scoped_lock<std::recursive_mutex> > MutexLockPtr;
         /*!
         This lock can be used to protect data access. It locks the mutex until deletion.
         If no mutex was specified, an empty lock will be returned which does not protect the engine calls (this is the standard behavior).
@@ -249,11 +249,11 @@ namespace SimDynamics
         bool enablePhysicsUpdates;
         int updateTimerIntervalMS;
 
-        boost::shared_ptr <boost::recursive_mutex> engineMutexPtr;
+        std::shared_ptr <std::recursive_mutex> engineMutexPtr;
     };
 
 
-    typedef boost::shared_ptr<BulletCoinQtViewer> BulletCoinQtViewerPtr;
+    typedef std::shared_ptr<BulletCoinQtViewer> BulletCoinQtViewerPtr;
 
 } // namespace
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.cpp
index ca1abb6a9222242757b774f58bb7d57faf8967f4..586eb94c1be8b3339e6b9ef716f91f18100513f7 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.cpp
@@ -36,7 +36,7 @@ namespace SimDynamics
     }
 
 
-    BulletEngine::BulletEngine(boost::shared_ptr <boost::recursive_mutex> engineMutex)
+    BulletEngine::BulletEngine(std::shared_ptr <std::recursive_mutex> engineMutex)
         : DynamicsEngine(engineMutex)
     {
         collision_config = nullptr;
@@ -55,7 +55,7 @@ namespace SimDynamics
     bool BulletEngine::init(DynamicsEngineConfigPtr config)
     {
         // first check if config is of type BulletEngineConfig
-        BulletEngineConfigPtr test = boost::dynamic_pointer_cast<BulletEngineConfig>(config);
+        BulletEngineConfigPtr test = std::dynamic_pointer_cast<BulletEngineConfig>(config);
 
         if (!config || !test)
         {
@@ -184,7 +184,7 @@ namespace SimDynamics
 
         for (std::vector<DynamicsObjectPtr>::const_iterator i = objects.begin(); i != objects.end(); ++i)
         {
-            BulletObjectPtr btObject = boost::dynamic_pointer_cast<BulletObject>(*i);
+            BulletObjectPtr btObject = std::dynamic_pointer_cast<BulletObject>(*i);
 
             if (!btObject)
             {
@@ -205,7 +205,7 @@ namespace SimDynamics
     bool BulletEngine::addObject(DynamicsObjectPtr o)
     {
         MutexLockPtr lock = getScopedLock();
-        BulletObjectPtr btObject = boost::dynamic_pointer_cast<BulletObject>(o);
+        BulletObjectPtr btObject = std::dynamic_pointer_cast<BulletObject>(o);
 
         if (!btObject)
         {
@@ -257,7 +257,7 @@ namespace SimDynamics
     bool BulletEngine::removeObject(DynamicsObjectPtr o)
     {
         MutexLockPtr lock = getScopedLock();
-        BulletObjectPtr btObject = boost::dynamic_pointer_cast<BulletObject>(o);
+        BulletObjectPtr btObject = std::dynamic_pointer_cast<BulletObject>(o);
 
         if (!btObject)
         {
@@ -436,7 +436,7 @@ namespace SimDynamics
     bool BulletEngine::addRobot(DynamicsRobotPtr r)
     {
         MutexLockPtr lock = getScopedLock();
-        BulletRobotPtr btRobot = boost::dynamic_pointer_cast<BulletRobot>(r);
+        BulletRobotPtr btRobot = std::dynamic_pointer_cast<BulletRobot>(r);
 
         if (!btRobot)
         {
@@ -500,7 +500,7 @@ namespace SimDynamics
     bool BulletEngine::removeRobot(DynamicsRobotPtr r)
     {
         MutexLockPtr lock = getScopedLock();
-        BulletRobotPtr btRobot = boost::dynamic_pointer_cast<BulletRobot>(r);
+        BulletRobotPtr btRobot = std::dynamic_pointer_cast<BulletRobot>(r);
 
         if (!btRobot)
         {
@@ -552,8 +552,8 @@ namespace SimDynamics
             cout << "++ Object " << i << ":" << objects[i]->getName() << endl;
             Eigen::Matrix4f m = objects[i]->getSceneObject()->getGlobalPose();
             cout << "   pos (simox)  " << m(0, 3) << "," << m(1, 3) << "," << m(2, 3) << endl;
-            BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(objects[i]);
-            boost::shared_ptr<btRigidBody> rb = bo->getRigidBody();
+            BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(objects[i]);
+            std::shared_ptr<btRigidBody> rb = bo->getRigidBody();
             btVector3 v = rb->getWorldTransform().getOrigin();
             cout << "   pos (bullet) " << v[0] << "," << v[1]  << "," << v[2]  << endl;
             btVector3 va = rb->getAngularVelocity();
@@ -565,7 +565,7 @@ namespace SimDynamics
         for (size_t i = 0; i < robots.size(); i++)
         {
             cout << "++ Robot " << i << ":" << objects[i]->getName() << endl;
-            BulletRobotPtr br = boost::dynamic_pointer_cast<BulletRobot>(robots[i]);
+            BulletRobotPtr br = std::dynamic_pointer_cast<BulletRobot>(robots[i]);
             std::vector<BulletRobot::LinkInfo> links = br->getLinks();
 
             for (size_t j = 0; j < links.size(); j++)
@@ -575,7 +575,7 @@ namespace SimDynamics
                 cout << "++++ - ColModelB " << j << ":" << links[j].nodeB->getName();
 
                 cout << "     enabled:" << links[j].joint->isEnabled() << endl;
-                boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(links[j].joint);
+                std::shared_ptr<btHingeConstraint> hinge = std::dynamic_pointer_cast<btHingeConstraint>(links[j].joint);
 
                 if (hinge)
                 {
@@ -589,7 +589,7 @@ namespace SimDynamics
 #endif
                 }
 
-                boost::shared_ptr<btGeneric6DofConstraint> dof = boost::dynamic_pointer_cast<btGeneric6DofConstraint>(links[j].joint);
+                std::shared_ptr<btGeneric6DofConstraint> dof = std::dynamic_pointer_cast<btGeneric6DofConstraint>(links[j].joint);
 
                 if (dof)
                 {
@@ -688,7 +688,7 @@ namespace SimDynamics
         }
 
 
-        BulletRobotPtr br = boost::dynamic_pointer_cast<BulletRobot>(r);
+        BulletRobotPtr br = std::dynamic_pointer_cast<BulletRobot>(r);
 
         if (!br)
         {
@@ -722,7 +722,7 @@ namespace SimDynamics
         }
 
 
-        BulletRobotPtr br = boost::dynamic_pointer_cast<BulletRobot>(r);
+        BulletRobotPtr br = std::dynamic_pointer_cast<BulletRobot>(r);
 
         if (!br)
         {
@@ -730,7 +730,7 @@ namespace SimDynamics
             return false;
         }
 
-        BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(object);
+        BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(object);
 
         if (!bo)
         {
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.h
index 7a2b7c6c7ee496affa151eb25f9bfba3ce95220e..1da1d348eeb36ea9f85c39f8e90141397ab8364a 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngine.h
@@ -64,13 +64,13 @@ namespace SimDynamics
         btScalar bulletSolverSplitImpulsePenetrationThreshold;
     };
 
-    typedef boost::shared_ptr<BulletEngineConfig> BulletEngineConfigPtr;
+    typedef std::shared_ptr<BulletEngineConfig> BulletEngineConfigPtr;
 
     /*!
         This class encapsulates all calls to the bullet physics engine.
         Usually there is no need to instantiate this object by your own, it is automatically created when calling DynamicsWorld::Init().
     */
-    class SIMDYNAMICS_IMPORT_EXPORT BulletEngine : public DynamicsEngine, public btActionInterface, public boost::enable_shared_from_this<BulletEngine>
+    class SIMDYNAMICS_IMPORT_EXPORT BulletEngine : public DynamicsEngine, public btActionInterface, public std::enable_shared_from_this<BulletEngine>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -81,7 +81,7 @@ namespace SimDynamics
             Constructor
             \param engineMutex Optionally, all engine access methods can be protected by an external mutex. If not set, an internal mutex is creeated.
         */
-        BulletEngine(boost::shared_ptr <boost::recursive_mutex> engineMutex = boost::shared_ptr<boost::recursive_mutex>());
+        BulletEngine(std::shared_ptr <std::recursive_mutex> engineMutex = std::shared_ptr<std::recursive_mutex>());
 
         /*!
         */
@@ -202,7 +202,7 @@ namespace SimDynamics
         void debugDraw(btIDebugDraw* debugDrawer) override;
     };
 
-    typedef boost::shared_ptr<BulletEngine> BulletEnginePtr;
+    typedef std::shared_ptr<BulletEngine> BulletEnginePtr;
 
 } // namespace SimDynamics
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngineFactory.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngineFactory.cpp
index 2984161d0fb577131c8cd5dd987776825ac5c319..edbeed84fe5b9019020b2ff0d277e83e6b4ae563 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngineFactory.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngineFactory.cpp
@@ -32,9 +32,9 @@ namespace SimDynamics
     /**
      * \return new instance of BulletEngineFactory
      */
-    boost::shared_ptr<DynamicsEngineFactory> BulletEngineFactory::createInstance(void*)
+    std::shared_ptr<DynamicsEngineFactory> BulletEngineFactory::createInstance(void*)
     {
-        boost::shared_ptr<BulletEngineFactory> bulletFactory(new BulletEngineFactory());
+        std::shared_ptr<BulletEngineFactory> bulletFactory(new BulletEngineFactory());
         return bulletFactory;
     }
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngineFactory.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngineFactory.h
index 418e96e08484e2df540e2850f8654c974b8ef505..e9019bc1d728f3b0573c2f1a5f009adbb806b9a8 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletEngineFactory.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletEngineFactory.h
@@ -49,7 +49,7 @@ namespace SimDynamics
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<DynamicsEngineFactory> createInstance(void*);
+        static std::shared_ptr<DynamicsEngineFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
     };
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
index c8bc7f3d56f3f8e333c4f761560b029b99a8b840..755bb027dd3fa17e9ee48fe21e248f68c8917518 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
@@ -182,20 +182,20 @@ namespace SimDynamics
 
         if (primitive->type == Primitive::Box::TYPE)
         {
-            Primitive::Box* box = boost::dynamic_pointer_cast<Primitive::Box>(primitive).get();
+            Primitive::Box* box = std::dynamic_pointer_cast<Primitive::Box>(primitive).get();
             // w/h/d have to be halved
             btBoxShape* boxShape = new btBoxShape(btVector3(box->width / 2000.f * ScaleFactor, box->height / 2000.f * ScaleFactor, box->depth / 2000.f * ScaleFactor));
             result = boxShape;
         }
         else if (primitive->type == Primitive::Sphere::TYPE)
         {
-            Primitive::Sphere* sphere = boost::dynamic_pointer_cast<Primitive::Sphere>(primitive).get();
+            Primitive::Sphere* sphere = std::dynamic_pointer_cast<Primitive::Sphere>(primitive).get();
             btSphereShape* sphereShape = new btSphereShape(btScalar(sphere->radius / 1000.0  * ScaleFactor));
             result = sphereShape;
         }
         else if (primitive->type == Primitive::Cylinder::TYPE)
         {
-            Primitive::Cylinder* cyl = boost::dynamic_pointer_cast<Primitive::Cylinder>(primitive).get();
+            Primitive::Cylinder* cyl = std::dynamic_pointer_cast<Primitive::Cylinder>(primitive).get();
             btCylinderShape* cylShape = new btCylinderShape(btVector3(cyl->radius / 1000.0  * ScaleFactor, cyl->height / 1000.0  * ScaleFactor, cyl->radius / 1000.0  * ScaleFactor));
             result = cylShape;
         }
@@ -257,10 +257,10 @@ namespace SimDynamics
         else
         {
             // build convex hull
-            boost::shared_ptr<btConvexShape> btConvexShape(new btConvexTriangleMeshShape(btTrimesh.get()));
+            std::shared_ptr<btConvexShape> btConvexShape(new btConvexTriangleMeshShape(btTrimesh.get()));
             btConvexShape->setMargin(btMargin);
 
-            boost::shared_ptr<btShapeHull> btHull(new btShapeHull(btConvexShape.get()));
+            std::shared_ptr<btShapeHull> btHull(new btShapeHull(btConvexShape.get()));
             btHull->buildHull(btMargin);
             btConvexHullShape* btConvex = new btConvexHullShape();
             btConvex->setLocalScaling(btVector3(1, 1, 1));
@@ -278,7 +278,7 @@ namespace SimDynamics
         }
     }
 
-    boost::shared_ptr<btRigidBody> BulletObject::getRigidBody()
+    std::shared_ptr<btRigidBody> BulletObject::getRigidBody()
     {
         return rigidBody;
     }
@@ -301,7 +301,7 @@ namespace SimDynamics
         this->rigidBody->setWorldTransform(BulletEngine::getPoseBullet(poseGlobal));
 
         // notify motionState of non-robot nodes
-        if(!boost::dynamic_pointer_cast<VirtualRobot::RobotNode>(sceneObject))
+        if(!std::dynamic_pointer_cast<VirtualRobot::RobotNode>(sceneObject))
         {
             motionState->setGlobalPose(pose);
         }
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
index adebc0e6bbf82bd13df260f07f6cdf62855b7ae8..10e20c571b1bf20f6668bf0083e59c4adc7608df 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
@@ -44,7 +44,7 @@ namespace SimDynamics
         ~BulletObject() override;
 
 
-        boost::shared_ptr<btRigidBody> getRigidBody();
+        std::shared_ptr<btRigidBody> getRigidBody();
 
 
         /*!
@@ -102,8 +102,8 @@ namespace SimDynamics
 
         btCollisionShape* createConvexHullShape(VirtualRobot::TriMeshModelPtr trimesh);
 
-        boost::shared_ptr<btRigidBody> rigidBody;
-        boost::shared_ptr<btCollisionShape> collisionShape; // bullet collision shape
+        std::shared_ptr<btRigidBody> rigidBody;
+        std::shared_ptr<btCollisionShape> collisionShape; // bullet collision shape
         std::unique_ptr<btTriangleMesh> btTrimesh;
 
         Eigen::Vector3f com; // com offset of trimesh
@@ -113,7 +113,7 @@ namespace SimDynamics
 
     };
 
-    typedef boost::shared_ptr<BulletObject> BulletObjectPtr;
+    typedef std::shared_ptr<BulletObject> BulletObjectPtr;
 
 } // namespace SimDynamics
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.cpp
index 7c6ce736290aed31ec2915a55ba248d85c5c6419..0fd864f9d916ef84ff85948c375bcfe0a725b78b 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.cpp
@@ -10,7 +10,7 @@ namespace SimDynamics
         SIMDYNAMICS_ASSERT(world);
         m_sundirection = btVector3(1, 1, -2) * BulletObject::ScaleFactor * 1000 ;
 
-        bulletEngine = boost::dynamic_pointer_cast<BulletEngine>(world->getEngine());
+        bulletEngine = std::dynamic_pointer_cast<BulletEngine>(world->getEngine());
 
         SIMDYNAMICS_ASSERT(bulletEngine);
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.h
index 63c1dd8d23efa2e4008f5b6b93b27dc0e562c39f..09f4fab2bb6a2ec2f94c8837219f5078a1280a47 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.h
@@ -81,7 +81,7 @@ namespace SimDynamics
     };
 
 
-    typedef boost::shared_ptr<BulletOpenGLViewer> BulletOpenGLViewerPtr;
+    typedef std::shared_ptr<BulletOpenGLViewer> BulletOpenGLViewerPtr;
 
 } // namespace
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp
index b2106a708bed9c7dd00675f6e97f2c771ebed2d0..4b5cff4e94d679129bc5db2ac94cd69dca6ab1f5 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp
@@ -15,6 +15,10 @@
 
 #include "DetectBulletVersion.h"
 
+#include <boost/math/special_functions/fpclassify.hpp>
+
+#include <unordered_set>
+
 //#define DEBUG_FIXED_OBJECTS
 //#define DEBUG_SHOW_LINKS
 using namespace VirtualRobot;
@@ -38,7 +42,7 @@ namespace SimDynamics
 
         for (; it != sensors.end(); it++)
         {
-            ForceTorqueSensorPtr ftSensor = boost::dynamic_pointer_cast<ForceTorqueSensor>(*it);
+            ForceTorqueSensorPtr ftSensor = std::dynamic_pointer_cast<ForceTorqueSensor>(*it);
 
             if (ftSensor)
             {
@@ -95,7 +99,7 @@ namespace SimDynamics
                     joint = rn;
                 }
 
-                RobotNodePtr parent = boost::dynamic_pointer_cast<RobotNode>(rn->getParent());
+                RobotNodePtr parent = std::dynamic_pointer_cast<RobotNode>(rn->getParent());
 
                 while (parent && !bodyA)
                 {
@@ -119,8 +123,8 @@ namespace SimDynamics
 
                             double d = (p1.block(0, 3, 3, 1) - p2.block(0, 3, 3, 1)).norm();
                             THROW_VR_EXCEPTION_IF((d > 1e-6), "Could not create hinge2 joint: Joint coord systems must be located at the same position:" << joint->getName() << ", " << joint2->getName());
-                            RobotNodeRevolutePtr rev1 = boost::dynamic_pointer_cast<RobotNodeRevolute>(joint);
-                            RobotNodeRevolutePtr rev2 = boost::dynamic_pointer_cast<RobotNodeRevolute>(joint2);
+                            RobotNodeRevolutePtr rev1 = std::dynamic_pointer_cast<RobotNodeRevolute>(joint);
+                            RobotNodeRevolutePtr rev2 = std::dynamic_pointer_cast<RobotNodeRevolute>(joint2);
                             THROW_VR_EXCEPTION_IF(!rev1 || !rev2 , "Could not create hinge2 joint: Joints must be revolute nodes:" << joint->getName() << ", " << joint2->getName());
                             Eigen::Vector3f ax1 = rev1->getJointRotationAxis();
                             Eigen::Vector3f ax2 = rev2->getJointRotationAxis();
@@ -135,7 +139,7 @@ namespace SimDynamics
                         break;
                     }
 
-                    parent = boost::dynamic_pointer_cast<RobotNode>(parent->getParent());
+                    parent = std::dynamic_pointer_cast<RobotNode>(parent->getParent());
                 }
 
                 if (!bodyA)
@@ -172,7 +176,7 @@ namespace SimDynamics
         createDynamicsNode(rn);
         std::vector<std::string> ic = rn->getIgnoredCollisionModels();
         RobotPtr robot = rn->getRobot();
-        BulletObjectPtr drn1 = boost::dynamic_pointer_cast<BulletObject>(dynamicRobotNodes[rn]);
+        BulletObjectPtr drn1 = std::dynamic_pointer_cast<BulletObject>(dynamicRobotNodes[rn]);
         VR_ASSERT(drn1);
 
         for (const auto& i : ic)
@@ -186,7 +190,7 @@ namespace SimDynamics
             else
             {
                 createDynamicsNode(rn2);
-                BulletObjectPtr drn2 = boost::dynamic_pointer_cast<BulletObject>(dynamicRobotNodes[rn2]);
+                BulletObjectPtr drn2 = std::dynamic_pointer_cast<BulletObject>(dynamicRobotNodes[rn2]);
                 VR_ASSERT(drn2);
                 DynamicsWorld::GetWorld()->getEngine()->disableCollision(drn1.get(), drn2.get());
             }
@@ -214,7 +218,7 @@ namespace SimDynamics
         return result;
     }
 
-    boost::shared_ptr<btTypedConstraint> BulletRobot::createHingeJoint(boost::shared_ptr<btRigidBody> btBody1, boost::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& coordSystemNode1, Eigen::Matrix4f& coordSystemNode2,  Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2, Eigen::Vector3f& /*axisGlobal*/, Eigen::Vector3f& axisLocal, Eigen::Matrix4f& coordSystemJoint, double limMinBT, double limMaxBT)
+    std::shared_ptr<btTypedConstraint> BulletRobot::createHingeJoint(std::shared_ptr<btRigidBody> btBody1, std::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& coordSystemNode1, Eigen::Matrix4f& coordSystemNode2,  Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2, Eigen::Vector3f& /*axisGlobal*/, Eigen::Vector3f& axisLocal, Eigen::Matrix4f& coordSystemJoint, double limMinBT, double limMaxBT)
     {
         // HINGE joint
         /*Eigen::Matrix4f tmpGp1 = coordSystemNode1;
@@ -245,7 +249,7 @@ namespace SimDynamics
         tr1.getOrigin() = pivot1;
         tr2.getOrigin() = pivot2;
 
-        boost::shared_ptr<btHingeConstraint> hinge(new btHingeConstraint(*btBody1, *btBody2, tr1, tr2, true));
+        std::shared_ptr<btHingeConstraint> hinge(new btHingeConstraint(*btBody1, *btBody2, tr1, tr2, true));
         //        hinge->setDbgDrawSize(0.15);
 
         // todo: check effects of parameters...
@@ -261,7 +265,7 @@ namespace SimDynamics
         return hinge;
     }
 
-    boost::shared_ptr<btTypedConstraint> BulletRobot::createTranslationalJoint(boost::shared_ptr<btRigidBody> btBody1, boost::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& coordSystemNode1, Eigen::Matrix4f& coordSystemNode2, Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2, Eigen::Vector3f& directionLocal, Eigen::Matrix4f& coordSystemJoint, double limMinBT, double limMaxBT)
+    std::shared_ptr<btTypedConstraint> BulletRobot::createTranslationalJoint(std::shared_ptr<btRigidBody> btBody1, std::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& coordSystemNode1, Eigen::Matrix4f& coordSystemNode2, Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2, Eigen::Vector3f& directionLocal, Eigen::Matrix4f& coordSystemJoint, double limMinBT, double limMaxBT)
     {
         // we need to align coord system joint, so that z-axis is rotation axis
 
@@ -278,7 +282,7 @@ namespace SimDynamics
         tr1.getOrigin() = pivot1;
         tr2.getOrigin() = pivot2;
 
-        boost::shared_ptr<btSliderConstraint> joint(new btSliderConstraint(*btBody1, *btBody2, tr1, tr2, true));
+        std::shared_ptr<btSliderConstraint> joint(new btSliderConstraint(*btBody1, *btBody2, tr1, tr2, true));
 
         // disable agular part
         joint->setLowerAngLimit(btScalar(0));
@@ -290,12 +294,12 @@ namespace SimDynamics
         return joint;
     }
 
-    boost::shared_ptr<btTypedConstraint> BulletRobot::createFixedJoint(boost::shared_ptr<btRigidBody> btBody1, boost::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2)
+    std::shared_ptr<btTypedConstraint> BulletRobot::createFixedJoint(std::shared_ptr<btRigidBody> btBody1, std::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2)
     {
         btTransform localA, localB;
         localA = BulletEngine::getPoseBullet(anchor_inNode1);
         localB = BulletEngine::getPoseBullet(anchor_inNode2);
-        boost::shared_ptr<btGeneric6DofConstraint> generic6Dof(new btGeneric6DofConstraint(*btBody1, *btBody2, localA, localB, true));
+        std::shared_ptr<btGeneric6DofConstraint> generic6Dof(new btGeneric6DofConstraint(*btBody1, *btBody2, localA, localB, true));
         generic6Dof->setOverrideNumSolverIterations(100);
 
         for (int i = 0; i < 6; i++)
@@ -331,12 +335,12 @@ namespace SimDynamics
             THROW_VR_EXCEPTION("Joints are already connected:" << bodyA->getName() << "," << bodyB->getName());
         }
 
-        BulletObjectPtr drn1 = boost::dynamic_pointer_cast<BulletObject>(dynamicRobotNodes[bodyA]);
-        BulletObjectPtr drn2 = boost::dynamic_pointer_cast<BulletObject>(dynamicRobotNodes[bodyB]);
+        BulletObjectPtr drn1 = std::dynamic_pointer_cast<BulletObject>(dynamicRobotNodes[bodyA]);
+        BulletObjectPtr drn2 = std::dynamic_pointer_cast<BulletObject>(dynamicRobotNodes[bodyB]);
         VR_ASSERT(drn1);
         VR_ASSERT(drn2);
-        boost::shared_ptr<btRigidBody> btBody1 = drn1->getRigidBody();
-        boost::shared_ptr<btRigidBody> btBody2 = drn2->getRigidBody();
+        std::shared_ptr<btRigidBody> btBody1 = drn1->getRigidBody();
+        std::shared_ptr<btRigidBody> btBody2 = drn2->getRigidBody();
         VR_ASSERT(btBody1);
         VR_ASSERT(btBody2);
         DynamicsWorld::GetWorld()->getEngine()->disableCollision(drn1.get(), drn2.get());
@@ -369,14 +373,14 @@ namespace SimDynamics
         com2.block(0, 3, 3, 1) = -drn2->getCom();
         anchor_inNode2 = com2 * anchor_inNode2;
 
-        boost::shared_ptr<btTypedConstraint> jointbt;
+        std::shared_ptr<btTypedConstraint> jointbt;
 
         double vr2bulletOffset = 0.0f;
 
 
         if (joint->isTranslationalJoint() && !ignoreTranslationalJoints)
         {
-            boost::shared_ptr<RobotNodePrismatic> rnPrisJoint = boost::dynamic_pointer_cast<RobotNodePrismatic>(joint);
+            std::shared_ptr<RobotNodePrismatic> rnPrisJoint = std::dynamic_pointer_cast<RobotNodePrismatic>(joint);
 
             double limMin, limMax;
             btScalar diff = joint->getJointValueOffset();
@@ -392,7 +396,7 @@ namespace SimDynamics
         else if (joint->isRotationalJoint())
         {
             // create joint
-            boost::shared_ptr<RobotNodeRevolute> rnRevJoint = boost::dynamic_pointer_cast<RobotNodeRevolute>(joint);
+            std::shared_ptr<RobotNodeRevolute> rnRevJoint = std::dynamic_pointer_cast<RobotNodeRevolute>(joint);
 
             // transform axis direction (not position!)
             Eigen::Vector4f axisLocalJoint = Eigen::Vector4f::Zero();
@@ -440,8 +444,8 @@ namespace SimDynamics
         // disable col model
         i.disabledCollisionPairs.push_back(
             std::pair<DynamicsObjectPtr, DynamicsObjectPtr>(
-                boost::dynamic_pointer_cast<DynamicsObject>(drn1),
-                boost::dynamic_pointer_cast<DynamicsObject>(drn2)));
+                std::dynamic_pointer_cast<DynamicsObject>(drn1),
+                std::dynamic_pointer_cast<DynamicsObject>(drn2)));
 
         links.push_back(i);
 #ifndef DEBUG_FIXED_OBJECTS
@@ -530,13 +534,13 @@ namespace SimDynamics
             {
                 if (it->second.node->isRotationalJoint())
                 {
-                    boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(link.joint);
+                    std::shared_ptr<btHingeConstraint> hinge = std::dynamic_pointer_cast<btHingeConstraint>(link.joint);
                     hinge->enableMotor(false);
                     continue;
                 }
                 else if (it->second.node->isTranslationalJoint() && !ignoreTranslationalJoints)
                 {
-                    boost::shared_ptr<btSliderConstraint> slider = boost::dynamic_pointer_cast<btSliderConstraint>(link.joint);
+                    std::shared_ptr<btSliderConstraint> slider = std::dynamic_pointer_cast<btSliderConstraint>(link.joint);
                     slider->setPoweredLinMotor(false);
                     continue;
                 }
@@ -549,7 +553,7 @@ namespace SimDynamics
 
                 if (it->second.node->isRotationalJoint())
                 {
-                    boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(link.joint);
+                    std::shared_ptr<btHingeConstraint> hinge = std::dynamic_pointer_cast<btHingeConstraint>(link.joint);
                     auto torque = it->second.jointTorqueTarget;
                     btVector3 hingeAxisLocalA =
                         hinge->getFrameOffsetA().getBasis().getColumn(2);
@@ -575,7 +579,7 @@ namespace SimDynamics
                 else
                 {
                     // not yet tested!
-                    boost::shared_ptr<btSliderConstraint> slider = boost::dynamic_pointer_cast<btSliderConstraint>(link.joint);
+                    std::shared_ptr<btSliderConstraint> slider = std::dynamic_pointer_cast<btSliderConstraint>(link.joint);
                     auto torque = it->second.jointTorqueTarget;
                     btVector3 sliderAxisLocalA =
                         slider->getFrameOffsetA().getBasis().getColumn(2);
@@ -656,12 +660,12 @@ namespace SimDynamics
                 }
                 if (it->second.node->isRotationalJoint())
                 {
-                    boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(link.joint);
+                    std::shared_ptr<btHingeConstraint> hinge = std::dynamic_pointer_cast<btHingeConstraint>(link.joint);
                     hinge->enableAngularMotor(true, btScalar(targetVelocity), maxImpulse);
                 }
                 else if (it->second.node->isTranslationalJoint() && !ignoreTranslationalJoints)
                 {
-                    boost::shared_ptr<btSliderConstraint> slider = boost::dynamic_pointer_cast<btSliderConstraint>(link.joint);
+                    std::shared_ptr<btSliderConstraint> slider = std::dynamic_pointer_cast<btSliderConstraint>(link.joint);
                     slider->setMaxLinMotorForce(maxImpulse * 1000); // Magic number!!!
                     slider->setTargetLinMotorVelocity(btScalar(targetVelocity));
                     slider->setPoweredLinMotor(true);
@@ -676,12 +680,12 @@ namespace SimDynamics
     void BulletRobot::updateSensors(double dt)
     {
         MutexLockPtr lock = getScopedLock();
-        boost::unordered_set<std::string> contactObjectNames;
+        std::unordered_set<std::string> contactObjectNames;
 
         // this seems stupid and it is, but that is abstract interfaces for you.
         for (auto& sensor : sensors)
         {
-            ContactSensorPtr contactSensor = boost::dynamic_pointer_cast<ContactSensor>(sensor);
+            ContactSensorPtr contactSensor = std::dynamic_pointer_cast<ContactSensor>(sensor);
 
             if (contactSensor)
             {
@@ -691,7 +695,7 @@ namespace SimDynamics
 
         DynamicsWorldPtr world = DynamicsWorld::GetWorld();
         std::vector<SimDynamics::DynamicsEngine::DynamicsContactInfo> contacts = world->getEngine()->getContacts();
-        boost::unordered_map<std::string, VirtualRobot::ContactSensor::ContactFrame> frameMap;
+        std::unordered_map<std::string, VirtualRobot::ContactSensor::ContactFrame> frameMap;
 
         for (auto& contact : contacts)
         {
@@ -733,7 +737,7 @@ namespace SimDynamics
         // Update forces and torques
         for (auto& sensor : sensors)
         {
-            ForceTorqueSensorPtr ftSensor = boost::dynamic_pointer_cast<ForceTorqueSensor>(sensor);
+            ForceTorqueSensorPtr ftSensor = std::dynamic_pointer_cast<ForceTorqueSensor>(sensor);
 
             if (ftSensor)
             {
@@ -749,7 +753,7 @@ namespace SimDynamics
             }
             else
             {
-                ContactSensorPtr contactSensor = boost::dynamic_pointer_cast<ContactSensor>(sensor);
+                ContactSensorPtr contactSensor = std::dynamic_pointer_cast<ContactSensor>(sensor);
 
                 if (contactSensor)
                 {
@@ -849,7 +853,7 @@ namespace SimDynamics
             return result;
         }
 
-        BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(object);
+        BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(object);
 
         if (!bo)
         {
@@ -866,7 +870,7 @@ namespace SimDynamics
             while (nodeA && !drn)
             {
                 SceneObjectPtr ts = nodeA->getParent();
-                nodeA = boost::dynamic_pointer_cast<RobotNode>(ts);
+                nodeA = std::dynamic_pointer_cast<RobotNode>(ts);
 
                 if (nodeA)
                 {
@@ -881,7 +885,7 @@ namespace SimDynamics
             }
         }
 
-        BulletObjectPtr bdrn = boost::dynamic_pointer_cast<BulletObject>(drn);
+        BulletObjectPtr bdrn = std::dynamic_pointer_cast<BulletObject>(drn);
 
         if (!bo)
         {
@@ -890,8 +894,8 @@ namespace SimDynamics
         }
 
         // create bullet joint
-        boost::shared_ptr<btRigidBody> btBody1 = bdrn->getRigidBody();
-        boost::shared_ptr<btRigidBody> btBody2 = bo->getRigidBody();
+        std::shared_ptr<btRigidBody> btBody1 = bdrn->getRigidBody();
+        std::shared_ptr<btRigidBody> btBody2 = bo->getRigidBody();
 
         Eigen::Matrix4f coordSystemNode1 = bdrn->getComGlobal(); // todo: what if joint is not at 0 ?!
         Eigen::Matrix4f coordSystemNode2 = bo->getComGlobal();
@@ -915,7 +919,7 @@ namespace SimDynamics
         com2.block(0,3,3,1) = -drn2->getCom();
         anchor_inNode2 = com2 * anchor_inNode2;*/
 
-        boost::shared_ptr<btTypedConstraint> jointbt = createFixedJoint(btBody1, btBody2, anchor_inNode1, anchor_inNode2);
+        std::shared_ptr<btTypedConstraint> jointbt = createFixedJoint(btBody1, btBody2, anchor_inNode1, anchor_inNode2);
 
         result.reset(new LinkInfo());
         result->nodeA = nodeA;
@@ -955,7 +959,7 @@ namespace SimDynamics
             return false;
         }
 
-        BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(object);
+        BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(object);
 
         if (!bo)
         {
@@ -1062,14 +1066,14 @@ namespace SimDynamics
 
         if (rn->isRotationalJoint())
         {
-            boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(link.joint);
+            std::shared_ptr<btHingeConstraint> hinge = std::dynamic_pointer_cast<btHingeConstraint>(link.joint);
             VR_ASSERT(hinge);
 
             return (hinge->getHingeAngle() - link.jointValueOffset); // inverted joint direction in bullet
         }
         else if (rn->isTranslationalJoint())
         {
-            boost::shared_ptr<btSliderConstraint> slider = boost::dynamic_pointer_cast<btSliderConstraint>(link.joint);
+            std::shared_ptr<btSliderConstraint> slider = std::dynamic_pointer_cast<btSliderConstraint>(link.joint);
             VR_ASSERT(slider);
 
             return (slider->getLinearPos() - link.jointValueOffset) * 1000 / BulletObject::ScaleFactor; // m -> mm
@@ -1095,7 +1099,7 @@ namespace SimDynamics
 
         if (rn->isRotationalJoint())
         {
-            boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(link.joint);
+            std::shared_ptr<btHingeConstraint> hinge = std::dynamic_pointer_cast<btHingeConstraint>(link.joint);
 #ifdef SIMOX_USES_OLD_BULLET
             return hinge->getMotorTargetVelosity();
 #else
@@ -1104,7 +1108,7 @@ namespace SimDynamics
         }
         else if (rn->isTranslationalJoint())
         {
-            boost::shared_ptr<btSliderConstraint> slider = boost::dynamic_pointer_cast<btSliderConstraint>(link.joint);
+            std::shared_ptr<btSliderConstraint> slider = std::dynamic_pointer_cast<btSliderConstraint>(link.joint);
 
             return slider->getTargetLinMotorVelocity() * 1000; // / BulletObject::ScaleFactor; m -> mm
         }
@@ -1125,11 +1129,11 @@ namespace SimDynamics
         if (rn->isRotationalJoint())
         {
             LinkInfo link = getLink(rn);
-            boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(link.joint);
+            std::shared_ptr<btHingeConstraint> hinge = std::dynamic_pointer_cast<btHingeConstraint>(link.joint);
 
             VR_ASSERT(hinge);
 
-            boost::shared_ptr<RobotNodeRevolute> rnRevJoint = boost::dynamic_pointer_cast<RobotNodeRevolute>(link.nodeJoint);
+            std::shared_ptr<RobotNodeRevolute> rnRevJoint = std::dynamic_pointer_cast<RobotNodeRevolute>(link.nodeJoint);
 
             Eigen::Vector3f deltaVel = link.dynNode2->getAngularVelocity() - link.dynNode1->getAngularVelocity();
             double speed = deltaVel.dot(rnRevJoint->getJointRotationAxis());
@@ -1138,11 +1142,11 @@ namespace SimDynamics
         else if (rn->isTranslationalJoint())
         {
             LinkInfo link = getLink(rn);
-            boost::shared_ptr<btSliderConstraint> slider = boost::dynamic_pointer_cast<btSliderConstraint>(link.joint);
+            std::shared_ptr<btSliderConstraint> slider = std::dynamic_pointer_cast<btSliderConstraint>(link.joint);
 
             VR_ASSERT(slider);
 
-            boost::shared_ptr<RobotNodePrismatic> rnPrisJoint = boost::dynamic_pointer_cast<RobotNodePrismatic>(link.nodeJoint);
+            std::shared_ptr<RobotNodePrismatic> rnPrisJoint = std::dynamic_pointer_cast<RobotNodePrismatic>(link.nodeJoint);
 
             Eigen::Vector3f jointDirection = rnPrisJoint->getGlobalPose().block<3, 3>(0, 0) * rnPrisJoint->getJointTranslationDirectionJointCoordSystem();
             Eigen::Vector3f deltaVel = (link.dynNode2->getLinearVelocity() - link.dynNode1->getLinearVelocity());
@@ -1249,7 +1253,7 @@ namespace SimDynamics
     Eigen::Matrix4f BulletRobot::getComGlobal(const VirtualRobot::RobotNodePtr& rn)
     {
         MutexLockPtr lock = getScopedLock();
-        BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(rn));
+        BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(rn));
 
         if (!bo)
         {
@@ -1269,7 +1273,7 @@ namespace SimDynamics
         for (unsigned int i = 0; i < set->getSize(); i++)
         {
             VirtualRobot::RobotNodePtr node = (*set)[i];
-            BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
+            BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
             Eigen::Matrix4f pose = bo->getComGlobal();
             com += node->getMass() * pose.block(0, 3, 3, 1);
             totalMass += node->getMass();
@@ -1288,7 +1292,7 @@ namespace SimDynamics
         for (unsigned int i = 0; i < set->getSize(); i++)
         {
             VirtualRobot::RobotNodePtr node = (*set)[i];
-            BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
+            BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
             Eigen::Vector3f vel = bo->getLinearVelocity();
 
             if (boost::math::isnan(vel(0)) || boost::math::isnan(vel(1)) || boost::math::isnan(vel(2)))
@@ -1326,7 +1330,7 @@ namespace SimDynamics
         for (unsigned int i = 0; i < set->getSize(); i++)
         {
             VirtualRobot::RobotNodePtr node = (*set)[i];
-            BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
+            BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
             Eigen::Vector3f vel = bo->getLinearVelocity() / 1000.0  * BulletObject::ScaleFactor;
 
             linMomentum += node->getMass() * vel;
@@ -1343,13 +1347,13 @@ namespace SimDynamics
         for (unsigned int i = 0; i < set->getSize(); i++)
         {
             VirtualRobot::RobotNodePtr node = (*set)[i];
-            BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
+            BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
             Eigen::Vector3f vel = bo->getLinearVelocity() / 1000.0  * BulletObject::ScaleFactor;
             Eigen::Vector3f ang = bo->getAngularVelocity() / 1000.0  * BulletObject::ScaleFactor;
             Eigen::Vector3f com = bo->getComGlobal().block(0, 3, 3, 1) / 1000.0  * BulletObject::ScaleFactor;
             double mass = node->getMass();
 
-            boost::shared_ptr<btRigidBody> body = bo->getRigidBody();
+            std::shared_ptr<btRigidBody> body = bo->getRigidBody();
             Eigen::Matrix3f intertiaWorld = BulletEngine::getRotMatrix(body->getInvInertiaTensorWorld()).inverse().block(0, 0, 3, 3);
 
             angMomentum += com.cross(mass * vel) + intertiaWorld * ang;
@@ -1368,13 +1372,13 @@ namespace SimDynamics
         for (unsigned int i = 0; i < set->getSize(); i++)
         {
             VirtualRobot::RobotNodePtr node = (*set)[i];
-            BulletObjectPtr bo = boost::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
+            BulletObjectPtr bo = std::dynamic_pointer_cast<BulletObject>(getDynamicsRobotNode(node));
             Eigen::Vector3f bodyVel = bo->getLinearVelocity() / 1000.0  * BulletObject::ScaleFactor;
             Eigen::Vector3f ang = bo->getAngularVelocity() / 1000.0  * BulletObject::ScaleFactor;
             Eigen::Vector3f bodyCoM = bo->getComGlobal().block(0, 3, 3, 1) / 1000.0  * BulletObject::ScaleFactor;
             double mass = node->getMass();
 
-            boost::shared_ptr<btRigidBody> body = bo->getRigidBody();
+            std::shared_ptr<btRigidBody> body = bo->getRigidBody();
 
             btVector3 invIntertiaDiag = body->getInvInertiaDiagLocal();
             Eigen::Matrix3f intertiaLocal = Eigen::Matrix3f::Zero();
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h
index efc5b49e60716a21840f1afa881e9f03ff3a8e85..cc877825e6cb5190cf6e6e187098657912d436df 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h
@@ -54,11 +54,11 @@ namespace SimDynamics
             BulletObjectPtr dynNode1; // parent
             BulletObjectPtr dynNode2; // child
             std::vector< std::pair<DynamicsObjectPtr, DynamicsObjectPtr> > disabledCollisionPairs;
-            boost::shared_ptr<btTypedConstraint> joint;
+            std::shared_ptr<btTypedConstraint> joint;
             double jointValueOffset; // offset simox -> bullet joint values
         };
 
-        typedef boost::shared_ptr<LinkInfo> LinkInfoPtr;
+        typedef std::shared_ptr<LinkInfo> LinkInfoPtr;
 
         /**
          * @brief The force torque output needs to be activated before use
@@ -229,15 +229,15 @@ namespace SimDynamics
         std::vector<LinkInfo> links;
 
         btScalar bulletMaxMotorImulse;
-        boost::shared_ptr<btTypedConstraint> createFixedJoint(boost::shared_ptr<btRigidBody> btBody1, boost::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2);
-        boost::shared_ptr<btTypedConstraint> createHingeJoint(boost::shared_ptr<btRigidBody> btBody1, boost::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& coordSystemNode1, Eigen::Matrix4f& coordSystemNode2,  Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2, Eigen::Vector3f& axisGlobal, Eigen::Vector3f& axisLocal, Eigen::Matrix4f& coordSystemJoint, double limMinBT, double limMaxBT);
-        boost::shared_ptr<btTypedConstraint> createTranslationalJoint(boost::shared_ptr<btRigidBody> btBody1, boost::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& coordSystemNode1, Eigen::Matrix4f& coordSystemNode2, Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2, Eigen::Vector3f& directionLocal, Eigen::Matrix4f& coordSystemJoint, double limMinBT, double limMaxBT);
+        std::shared_ptr<btTypedConstraint> createFixedJoint(std::shared_ptr<btRigidBody> btBody1, std::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2);
+        std::shared_ptr<btTypedConstraint> createHingeJoint(std::shared_ptr<btRigidBody> btBody1, std::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& coordSystemNode1, Eigen::Matrix4f& coordSystemNode2,  Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2, Eigen::Vector3f& axisGlobal, Eigen::Vector3f& axisLocal, Eigen::Matrix4f& coordSystemJoint, double limMinBT, double limMaxBT);
+        std::shared_ptr<btTypedConstraint> createTranslationalJoint(std::shared_ptr<btRigidBody> btBody1, std::shared_ptr<btRigidBody> btBody2, Eigen::Matrix4f& coordSystemNode1, Eigen::Matrix4f& coordSystemNode2, Eigen::Matrix4f& anchor_inNode1, Eigen::Matrix4f& anchor_inNode2, Eigen::Vector3f& directionLocal, Eigen::Matrix4f& coordSystemJoint, double limMinBT, double limMaxBT);
 
 
         bool ignoreTranslationalJoints;
     };
 
-    typedef boost::shared_ptr<BulletRobot> BulletRobotPtr;
+    typedef std::shared_ptr<BulletRobot> BulletRobotPtr;
 
 } // namespace SimDynamics
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobotLogger.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobotLogger.h
index e546f00ad4888c85224da7a85dd408449b4d9899..744c5675c11389d9ae9a3d976cb41476a4bc8105 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobotLogger.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobotLogger.h
@@ -84,7 +84,7 @@ namespace SimDynamics
         void log(btScalar dt);
     };
 
-    typedef boost::shared_ptr<BulletRobotLogger> BulletRobotLoggerPtr;
+    typedef std::shared_ptr<BulletRobotLogger> BulletRobotLoggerPtr;
 
 }
 
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/SimoxMotionState.cpp b/SimDynamics/DynamicsEngine/BulletEngine/SimoxMotionState.cpp
index ce9f4a0bc3c0cd470bb257729dac2a8207e7ee41..25a877cd7b4a86516a42495ae7e25da4e0bf3f54 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/SimoxMotionState.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/SimoxMotionState.cpp
@@ -27,7 +27,7 @@ namespace SimDynamics
         _graphicsTransfrom.setIdentity();
         _comOffset.setIdentity();
         Eigen::Vector3f com = sceneObject->getCoMLocal();
-        RobotNodePtr rn = boost::dynamic_pointer_cast<RobotNode>(sceneObject);
+        RobotNodePtr rn = std::dynamic_pointer_cast<RobotNode>(sceneObject);
 
         if (rn)
         {
@@ -128,7 +128,7 @@ namespace SimDynamics
             RobotNodePtr rn = robotNodeActuator->getRobotNode();
             DynamicsWorldPtr w = DynamicsWorld::GetWorld();
             DynamicsRobotPtr dr = w->getEngine()->getRobot(rn->getRobot());
-            BulletRobotPtr bdr = boost::dynamic_pointer_cast<BulletRobot>(dr);
+            BulletRobotPtr bdr = std::dynamic_pointer_cast<BulletRobot>(dr);
 
             if (bdr)
             {
diff --git a/SimDynamics/DynamicsEngine/DynamicsEngine.cpp b/SimDynamics/DynamicsEngine/DynamicsEngine.cpp
index 102fb07de64ea562533ead15b10c51109410a6dc..2e4f97af485dc7553f92bf3e0f610ee048e59b22 100644
--- a/SimDynamics/DynamicsEngine/DynamicsEngine.cpp
+++ b/SimDynamics/DynamicsEngine/DynamicsEngine.cpp
@@ -5,7 +5,7 @@
 namespace SimDynamics
 {
 
-    DynamicsEngine::DynamicsEngine(boost::shared_ptr <boost::recursive_mutex> engineMutex)
+    DynamicsEngine::DynamicsEngine(std::shared_ptr <std::recursive_mutex> engineMutex)
     {
         floorPos.setZero();
         floorUp.setZero();
@@ -43,7 +43,7 @@ namespace SimDynamics
         return true;
     }
 
-    void DynamicsEngine::setMutex(boost::shared_ptr<boost::recursive_mutex> engineMutex)
+    void DynamicsEngine::setMutex(std::shared_ptr<std::recursive_mutex> engineMutex)
     {
         engineMutexPtr = engineMutex;
     }
@@ -407,11 +407,11 @@ namespace SimDynamics
 
     DynamicsEngine::MutexLockPtr DynamicsEngine::getScopedLock()
     {
-        boost::shared_ptr< boost::recursive_mutex::scoped_lock > scoped_lock;
+        std::shared_ptr< std::scoped_lock<std::recursive_mutex> > scoped_lock;
 
         if (engineMutexPtr)
         {
-            scoped_lock.reset(new boost::recursive_mutex::scoped_lock(*engineMutexPtr));
+            scoped_lock.reset(new std::scoped_lock<std::recursive_mutex>(*engineMutexPtr));
         }
 
         return scoped_lock;
diff --git a/SimDynamics/DynamicsEngine/DynamicsEngine.h b/SimDynamics/DynamicsEngine/DynamicsEngine.h
index 5d6a1dbabfea3a76d0caaec145501f8139b2e4b7..c1d856dca3b7f11e1fb1de40868ae26e83338337 100644
--- a/SimDynamics/DynamicsEngine/DynamicsEngine.h
+++ b/SimDynamics/DynamicsEngine/DynamicsEngine.h
@@ -47,7 +47,7 @@ namespace SimDynamics
     };
 
 
-    typedef boost::shared_ptr<DynamicsEngineConfig> DynamicsEngineConfigPtr;
+    typedef std::shared_ptr<DynamicsEngineConfig> DynamicsEngineConfigPtr;
 
     /*!
         An interface class to encapsulates all calls to the underlying physics engine.
@@ -62,7 +62,7 @@ namespace SimDynamics
             Constructor
             \param engineMutex Optionally, all engine access methods can be protected by an external mutex. If not set, an internal mutex is creeated.
         */
-        DynamicsEngine(boost::shared_ptr <boost::recursive_mutex> engineMutex = boost::shared_ptr<boost::recursive_mutex>());
+        DynamicsEngine(std::shared_ptr <std::recursive_mutex> engineMutex = std::shared_ptr<std::recursive_mutex>());
 
         /*!
         */
@@ -73,7 +73,7 @@ namespace SimDynamics
         */
         virtual bool init(DynamicsEngineConfigPtr config);
 
-        void setMutex(boost::shared_ptr <boost::recursive_mutex> engineMutex);
+        void setMutex(std::shared_ptr <std::recursive_mutex> engineMutex);
 
         Eigen::Vector3f getGravity();
 
@@ -183,7 +183,7 @@ namespace SimDynamics
         */
         virtual void activateAllObjects();
 
-        typedef boost::shared_ptr< boost::recursive_mutex::scoped_lock > MutexLockPtr;
+        typedef std::shared_ptr< std::scoped_lock<std::recursive_mutex> > MutexLockPtr;
 
         /*!
             This lock can be used to protect data access. It locks the mutex until deletion.
@@ -218,11 +218,11 @@ namespace SimDynamics
         double floorExtendMM;
         double floorDepthMM;
 
-        boost::shared_ptr <boost::recursive_mutex> engineMutexPtr;
+        std::shared_ptr <std::recursive_mutex> engineMutexPtr;
 
     };
 
-    typedef boost::shared_ptr<DynamicsEngine> DynamicsEnginePtr;
+    typedef std::shared_ptr<DynamicsEngine> DynamicsEnginePtr;
 
 
 } // namespace SimDynamics
diff --git a/SimDynamics/DynamicsEngine/DynamicsEngineFactory.h b/SimDynamics/DynamicsEngine/DynamicsEngineFactory.h
index 99b709d3bf0b47204261707133987e0a2b232e8d..21b6cab39740d90170037b7a9f37ccf2888c6191 100644
--- a/SimDynamics/DynamicsEngine/DynamicsEngineFactory.h
+++ b/SimDynamics/DynamicsEngine/DynamicsEngineFactory.h
@@ -67,7 +67,7 @@ namespace SimDynamics
 
     };
 
-    typedef boost::shared_ptr<DynamicsEngineFactory> DynamicsEngineFactoryPtr;
+    typedef std::shared_ptr<DynamicsEngineFactory> DynamicsEngineFactoryPtr;
 
 } // namespace SimDynamics
 
diff --git a/SimDynamics/DynamicsEngine/DynamicsObject.cpp b/SimDynamics/DynamicsEngine/DynamicsObject.cpp
index b4e44b9f63b174605bbee6c80b26fdf2ab53926f..44a1ab3e9f013560a90a1cc96c0aee89089ac38e 100644
--- a/SimDynamics/DynamicsEngine/DynamicsObject.cpp
+++ b/SimDynamics/DynamicsEngine/DynamicsObject.cpp
@@ -92,7 +92,7 @@ namespace SimDynamics
 
     }
 
-    void DynamicsObject::setMutex(boost::shared_ptr<boost::recursive_mutex> engineMutexPtr)
+    void DynamicsObject::setMutex(std::shared_ptr<std::recursive_mutex> engineMutexPtr)
     {
         this->engineMutexPtr = engineMutexPtr;
     }
@@ -109,11 +109,11 @@ namespace SimDynamics
 
     DynamicsObject::MutexLockPtr DynamicsObject::getScopedLock()
     {
-        boost::shared_ptr< boost::recursive_mutex::scoped_lock > scoped_lock;
+        std::shared_ptr< std::scoped_lock<std::recursive_mutex> > scoped_lock;
 
         if (engineMutexPtr)
         {
-            scoped_lock.reset(new boost::recursive_mutex::scoped_lock(*engineMutexPtr));
+            scoped_lock.reset(new std::scoped_lock<std::recursive_mutex>(*engineMutexPtr));
         }
 
         return scoped_lock;
diff --git a/SimDynamics/DynamicsEngine/DynamicsObject.h b/SimDynamics/DynamicsEngine/DynamicsObject.h
index dca07943f217aca53137c015e43b09eadd68979d..ad8a32556126f4102a7618406d677a8debd8e9fc 100644
--- a/SimDynamics/DynamicsEngine/DynamicsObject.h
+++ b/SimDynamics/DynamicsEngine/DynamicsObject.h
@@ -25,6 +25,8 @@
 #include "../SimDynamics.h"
 #include <VirtualRobot/SceneObject.h>
 
+#include <mutex>
+
 
 namespace SimDynamics
 {
@@ -83,7 +85,7 @@ namespace SimDynamics
         virtual void applyTorque(const Eigen::Vector3f& torque);
 
         //! If set, all actions are protected with this mutex
-        virtual void setMutex(boost::shared_ptr <boost::recursive_mutex> engineMutexPtr);
+        virtual void setMutex(std::shared_ptr <std::recursive_mutex> engineMutexPtr);
 
         virtual void setSimType(VirtualRobot::SceneObject::Physics::SimulationType s);
 
@@ -93,7 +95,7 @@ namespace SimDynamics
         virtual void activate();
 
 
-        typedef boost::shared_ptr< boost::recursive_mutex::scoped_lock > MutexLockPtr;
+        typedef std::shared_ptr< std::scoped_lock<std::recursive_mutex> > MutexLockPtr;
         /*!
             This lock can be used to protect data access. It locks the mutex until deletion.
             If no mutex was specified, an empty lock will be returned which does not protect the engine calls (this is the standard behavior).
@@ -114,11 +116,11 @@ namespace SimDynamics
 
         VirtualRobot::SceneObjectPtr sceneObject;
 
-        boost::shared_ptr <boost::recursive_mutex> engineMutexPtr;
+        std::shared_ptr <std::recursive_mutex> engineMutexPtr;
 
     };
 
-    typedef boost::shared_ptr<DynamicsObject> DynamicsObjectPtr;
+    typedef std::shared_ptr<DynamicsObject> DynamicsObjectPtr;
 
 } // namespace SimDynamics
 
diff --git a/SimDynamics/DynamicsEngine/DynamicsRobot.cpp b/SimDynamics/DynamicsEngine/DynamicsRobot.cpp
index ad3ac8b517fedf0fe75eaecb3a25e4e7c7493f2d..5d3fd8be637844dc9d28362ec8225e5b7268c17f 100644
--- a/SimDynamics/DynamicsEngine/DynamicsRobot.cpp
+++ b/SimDynamics/DynamicsEngine/DynamicsRobot.cpp
@@ -407,7 +407,7 @@ namespace SimDynamics
         }
     }
 
-    void DynamicsRobot::setMutex(boost::shared_ptr<boost::recursive_mutex> engineMutexPtr)
+    void DynamicsRobot::setMutex(std::shared_ptr<std::recursive_mutex> engineMutexPtr)
     {
         this->engineMutexPtr = engineMutexPtr;
     }
@@ -429,11 +429,11 @@ namespace SimDynamics
 
     DynamicsRobot::MutexLockPtr DynamicsRobot::getScopedLock()
     {
-        boost::shared_ptr< boost::recursive_mutex::scoped_lock > scoped_lock;
+        std::shared_ptr< std::scoped_lock<std::recursive_mutex> > scoped_lock;
 
         if (engineMutexPtr)
         {
-            scoped_lock.reset(new boost::recursive_mutex::scoped_lock(*engineMutexPtr));
+            scoped_lock.reset(new std::scoped_lock<std::recursive_mutex>(*engineMutexPtr));
         }
 
         return scoped_lock;
diff --git a/SimDynamics/DynamicsEngine/DynamicsRobot.h b/SimDynamics/DynamicsEngine/DynamicsRobot.h
index 600f02ce0e1565a08c938cf1587226b6aa799c32..870c8708966de738718015f3436b57d8b78919ea 100644
--- a/SimDynamics/DynamicsEngine/DynamicsRobot.h
+++ b/SimDynamics/DynamicsEngine/DynamicsRobot.h
@@ -113,12 +113,12 @@ namespace SimDynamics
         virtual void setGlobalPose(const Eigen::Matrix4f& gp);
 
         //! If set, all actions are protected with this mutex
-        virtual void setMutex(boost::shared_ptr <boost::recursive_mutex> engineMutexPtr);
+        virtual void setMutex(std::shared_ptr <std::recursive_mutex> engineMutexPtr);
 
         //! can be used to access the internal controllers
         std::map<VirtualRobot::RobotNodePtr, VelocityMotorController>& getControllers();
 
-        typedef boost::shared_ptr< boost::recursive_mutex::scoped_lock > MutexLockPtr;
+        typedef std::shared_ptr< std::scoped_lock<std::recursive_mutex> > MutexLockPtr;
         /*!
             This lock can be used to protect data access. It locks the mutex until deletion.
             If no mutex was specified, an empty lock will be returned which does not protect the engine calls (this is the standard behavior).
@@ -183,10 +183,10 @@ namespace SimDynamics
         float PID_i = 0.f;
         float PID_d = 0.f;
 
-        boost::shared_ptr <boost::recursive_mutex> engineMutexPtr;
+        std::shared_ptr <std::recursive_mutex> engineMutexPtr;
     };
 
-    typedef boost::shared_ptr<DynamicsRobot> DynamicsRobotPtr;
+    typedef std::shared_ptr<DynamicsRobot> DynamicsRobotPtr;
 
 } // namespace SimDynamics
 
diff --git a/SimDynamics/DynamicsWorld.cpp b/SimDynamics/DynamicsWorld.cpp
index f0d954f591c716269c3208bdc6c079024023a9a0..1f9ae255a7f862fe362d8d84bd81f00a8136ec53 100644
--- a/SimDynamics/DynamicsWorld.cpp
+++ b/SimDynamics/DynamicsWorld.cpp
@@ -9,7 +9,7 @@ namespace SimDynamics
 
     namespace
     {
-        boost::mutex mutex;
+        std::mutex mutex;
     }
 
     DynamicsWorldPtr DynamicsWorld::world;
@@ -22,7 +22,7 @@ namespace SimDynamics
 
     DynamicsWorld::Cleanup::~Cleanup()
     {
-        boost::lock_guard<boost::mutex> lock(mutex);
+        std::scoped_lock lock(mutex);
         DynamicsWorld::world.reset();
     }
 
@@ -49,7 +49,7 @@ namespace SimDynamics
 
         if (true)
         {
-            boost::lock_guard<boost::mutex> lock(mutex);
+            std::scoped_lock lock(mutex);
 
             if (!world)
             {
diff --git a/SimDynamics/SimDynamics.h b/SimDynamics/SimDynamics.h
index 9dac7ea128f1423e5a968384fe44d2d6ad7da091..9fc63dc46c115d92e38f057493df8581a24da261 100644
--- a/SimDynamics/SimDynamics.h
+++ b/SimDynamics/SimDynamics.h
@@ -74,7 +74,7 @@ namespace SimDynamics
 
     class DynamicsWorld;
 
-    typedef boost::shared_ptr<DynamicsWorld> DynamicsWorldPtr;
+    typedef std::shared_ptr<DynamicsWorld> DynamicsWorldPtr;
 
 
 #define SIMDYNAMICS_INFO VR_INFO
diff --git a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
index 56822fe3f7b9bbefc8f6811edb1029110e9639c1..661cc3a839b14451842da54ac3331b6d03ee06f0 100644
--- a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
+++ b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
@@ -450,7 +450,7 @@ void SimDynamicsWindow::updateJointInfo()
     }
 
     SimDynamics::DynamicsObjectPtr dynRN = dynamicsRobot->getDynamicsRobotNode(rn);
-    SimDynamics::BulletObjectPtr bulletRN = boost::dynamic_pointer_cast<SimDynamics::BulletObject>(dynRN);
+    SimDynamics::BulletObjectPtr bulletRN = std::dynamic_pointer_cast<SimDynamics::BulletObject>(dynRN);
 
     if (bulletRN)
     {
@@ -461,7 +461,7 @@ void SimDynamicsWindow::updateJointInfo()
 
     }
 
-    BulletRobotPtr bulletRobot = boost::dynamic_pointer_cast<SimDynamics::BulletRobot>(dynamicsRobot);
+    BulletRobotPtr bulletRobot = std::dynamic_pointer_cast<SimDynamics::BulletRobot>(dynamicsRobot);
 
     if (rn && bulletRobot && bulletRobot->hasLink(rn))
     {
diff --git a/VirtualRobot/AbstractFactoryMethod.h b/VirtualRobot/AbstractFactoryMethod.h
index 52ecf0d0bddae4862413ebf6286e442b2a2c42bc..04e374fdfb25bf65c75c4ef627f9be86ee917384 100644
--- a/VirtualRobot/AbstractFactoryMethod.h
+++ b/VirtualRobot/AbstractFactoryMethod.h
@@ -7,6 +7,7 @@
 
 #pragma once
 
+#include <memory>
 #include <vector>
 #include <string>
 #include <map>
@@ -30,19 +31,19 @@ public:
     * The function pointer type of subclass initialisation functions.
     * This matches the createInstance method.
     */
-    typedef boost::shared_ptr<Base> (*initialisationFunction)(constructorArg);
+    typedef std::shared_ptr<Base> (*initialisationFunction)(constructorArg);
 
     /**
     * Function which can be used to retrieve an object specified by string name.
     */
-    static boost::shared_ptr<Base> fromName(const std::string& name, constructorArg params)
+    static std::shared_ptr<Base> fromName(const std::string& name, constructorArg params)
     {
         if (subTypes()->find(name) == subTypes()->end())
         {
-            return boost::shared_ptr<Base>();
+            return std::shared_ptr<Base>();
         }
 
-        boost::shared_ptr<Base> instance = (*subTypes())[name](params);
+        std::shared_ptr<Base> instance = (*subTypes())[name](params);
         instance->setDescription(name);
         return instance;
     }
@@ -50,14 +51,14 @@ public:
     /**
     * Function which can be used to retrieve the first registered object.
     */
-    static boost::shared_ptr<Base> first(constructorArg params)
+    static std::shared_ptr<Base> first(constructorArg params)
     {
         if (subTypes()->size() == 0)
         {
-            return boost::shared_ptr<Base>();
+            return std::shared_ptr<Base>();
         }
 
-        boost::shared_ptr<Base> instance = (*subTypes()).begin()->second(params);
+        std::shared_ptr<Base> instance = (*subTypes()).begin()->second(params);
         instance->setDescription((*subTypes()).begin()->first);
         return instance;
     }
@@ -76,9 +77,9 @@ public:
     * It calls the constructor and returns a shared_ptr to the resulting
     * object.
     */
-    static boost::shared_ptr<Base> createInstance(constructorArg)
+    static std::shared_ptr<Base> createInstance(constructorArg)
     {
-        return boost::shared_ptr<Base>();
+        return std::shared_ptr<Base>();
     }
 
     /**
@@ -140,9 +141,9 @@ private:
     * before use. This can only be guaranteed through a static local variable
     * in a function.
     */
-    static boost::shared_ptr<std::map<std::string, initialisationFunction> > subTypes()
+    static std::shared_ptr<std::map<std::string, initialisationFunction> > subTypes()
     {
-        static boost::shared_ptr<std::map<std::string, initialisationFunction> > subTypes(new std::map<std::string, initialisationFunction>);
+        static std::shared_ptr<std::map<std::string, initialisationFunction> > subTypes(new std::map<std::string, initialisationFunction>);
 
         return subTypes;
     }
diff --git a/VirtualRobot/BoundingBox.cpp b/VirtualRobot/BoundingBox.cpp
index ed141169eefa94aea9167139e9d094bcdb0257ca..7996cc3a95f3f5af598d468ec2313c04c4574835 100644
--- a/VirtualRobot/BoundingBox.cpp
+++ b/VirtualRobot/BoundingBox.cpp
@@ -69,11 +69,11 @@ namespace VirtualRobot
 
     void BoundingBox::print()
     {
-        cout << "* Bounding Box\n";
-        std::streamsize pr = cout.precision(2);
-        cout << "** min <" << min(0) << "," << min(1) << "," << min(2) << ">\n";
-        cout << "** max <" << max(0) << "," << max(1) << "," << max(2) << ">\n";
-        cout.precision(pr);
+        std::cout << "* Bounding Box\n";
+        std::streamsize pr = std::cout.precision(2);
+        std::cout << "** min <" << min(0) << "," << min(1) << "," << min(2) << ">\n";
+        std::cout << "** max <" << max(0) << "," << max(1) << "," << max(2) << ">\n";
+        std::cout.precision(pr);
 
     }
 
diff --git a/VirtualRobot/CollisionDetection/CDManager.h b/VirtualRobot/CollisionDetection/CDManager.h
index d3a5ddb0152338b77dc944095ec1b6042ea43b6f..00019635ea568fa6c926e25bfe41e0763cc1bacc 100644
--- a/VirtualRobot/CollisionDetection/CDManager.h
+++ b/VirtualRobot/CollisionDetection/CDManager.h
@@ -77,9 +77,9 @@ namespace VirtualRobot
         void addCollisionModelPair(SceneObjectPtr m1, SceneObjectPtr m2);
         template<class SetT>
         typename std::enable_if<std::is_base_of<SceneObjectSet, SetT>::value>::type
-        addCollisionModelPair(const boost::shared_ptr<SetT>& m1, const boost::shared_ptr<SetT>& m2)
+        addCollisionModelPair(const std::shared_ptr<SetT>& m1, const std::shared_ptr<SetT>& m2)
         {
-            addCollisionModelPair(boost::dynamic_pointer_cast<SceneObjectSet>(m1), boost::dynamic_pointer_cast<SceneObjectSet>(m2));
+            addCollisionModelPair(std::dynamic_pointer_cast<SceneObjectSet>(m1), std::dynamic_pointer_cast<SceneObjectSet>(m2));
         }
 
         /*!
diff --git a/VirtualRobot/CollisionDetection/CollisionChecker.cpp b/VirtualRobot/CollisionDetection/CollisionChecker.cpp
index 1debc32b94ef00a30a5aa04144b20dabb88010a8..36c11c7dd09d22c761370ae64e3613c593ac97f0 100644
--- a/VirtualRobot/CollisionDetection/CollisionChecker.cpp
+++ b/VirtualRobot/CollisionDetection/CollisionChecker.cpp
@@ -23,17 +23,18 @@
 
 namespace VirtualRobot
 {
+    using std::endl;
 
     namespace
     {
-        boost::mutex mutex;
+        std::mutex mutex;
     }
 
     CollisionCheckerPtr CollisionChecker::globalCollisionChecker;
 
     CollisionChecker::Cleanup::~Cleanup()
     {
-        boost::lock_guard<boost::mutex> lock(mutex);
+        std::scoped_lock lock(mutex);
         CollisionChecker::globalCollisionChecker.reset();
     }
 
@@ -44,7 +45,7 @@ namespace VirtualRobot
 
         if (true)
         {
-            boost::lock_guard<boost::mutex> lock(mutex);
+            std::scoped_lock lock(mutex);
 
             if (!globalCollisionChecker)
             {
@@ -96,7 +97,7 @@ namespace VirtualRobot
     float CollisionChecker::calculateDistance(SceneObjectPtr model1, SceneObjectSetPtr model2)
     {
         VR_ASSERT(model1 && model2);
-        RobotPtr r = boost::dynamic_pointer_cast<Robot>(model1);
+        RobotPtr r = std::dynamic_pointer_cast<Robot>(model1);
 
         if (r)
         {
@@ -112,8 +113,8 @@ namespace VirtualRobot
     float CollisionChecker::calculateDistance(SceneObjectPtr model1, SceneObjectPtr model2)
     {
         VR_ASSERT(model1 && model2);
-        RobotPtr r = boost::dynamic_pointer_cast<Robot>(model1);
-        RobotPtr r2 = boost::dynamic_pointer_cast<Robot>(model2);
+        RobotPtr r = std::dynamic_pointer_cast<Robot>(model1);
+        RobotPtr r2 = std::dynamic_pointer_cast<Robot>(model2);
 
         if (r && r2)
         {
@@ -141,7 +142,7 @@ namespace VirtualRobot
     float CollisionChecker::calculateDistance(SceneObjectPtr model1, SceneObjectSetPtr model2, Eigen::Vector3f& P1, Eigen::Vector3f& P2, int* trID1, int* trID2)
     {
         VR_ASSERT(model1 && model2);
-        RobotPtr r = boost::dynamic_pointer_cast<Robot>(model1);
+        RobotPtr r = std::dynamic_pointer_cast<Robot>(model1);
 
         if (r)
         {
@@ -157,8 +158,8 @@ namespace VirtualRobot
     float CollisionChecker::calculateDistance(SceneObjectPtr model1, SceneObjectPtr model2, Eigen::Vector3f& P1, Eigen::Vector3f& P2, int* trID1, int* trID2)
     {
         VR_ASSERT(model1 && model2);
-        RobotPtr r = boost::dynamic_pointer_cast<Robot>(model1);
-        RobotPtr r2 = boost::dynamic_pointer_cast<Robot>(model2);
+        RobotPtr r = std::dynamic_pointer_cast<Robot>(model1);
+        RobotPtr r2 = std::dynamic_pointer_cast<Robot>(model2);
 
         if (r && r2)
         {
@@ -194,7 +195,7 @@ namespace VirtualRobot
 
         if (colModels1.size() == 0 || colModels2.size() == 0)
         {
-            VR_WARNING << "no internal data..." << endl;
+            VR_WARNING << "no internal data..." << std::endl;
             return -1.0f;
         }
 
@@ -372,7 +373,7 @@ namespace VirtualRobot
     bool CollisionChecker::checkCollision(SceneObjectPtr model1, SceneObjectSetPtr model2)
     {
         VR_ASSERT(model1 && model2);
-        RobotPtr r = boost::dynamic_pointer_cast<Robot>(model1);
+        RobotPtr r = std::dynamic_pointer_cast<Robot>(model1);
 
         if (r)
         {
@@ -435,8 +436,8 @@ namespace VirtualRobot
     bool CollisionChecker::checkCollision(SceneObjectPtr model1, SceneObjectPtr model2)
     {
         VR_ASSERT(model1 && model2);
-        RobotPtr r = boost::dynamic_pointer_cast<Robot>(model1);
-        RobotPtr r2 = boost::dynamic_pointer_cast<Robot>(model2);
+        RobotPtr r = std::dynamic_pointer_cast<Robot>(model1);
+        RobotPtr r2 = std::dynamic_pointer_cast<Robot>(model2);
 
         if (r && r2)
         {
diff --git a/VirtualRobot/CollisionDetection/CollisionChecker.h b/VirtualRobot/CollisionDetection/CollisionChecker.h
index 8d64ffdeb56460f9ae30b5a56bb34aef4298e134..fc7b94a0f85a274a3849116d5684e96e17d3d00b 100644
--- a/VirtualRobot/CollisionDetection/CollisionChecker.h
+++ b/VirtualRobot/CollisionDetection/CollisionChecker.h
@@ -48,7 +48,7 @@ namespace VirtualRobot
 
 
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT CollisionChecker : public boost::enable_shared_from_this<CollisionChecker>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT CollisionChecker : public std::enable_shared_from_this<CollisionChecker>
     {
     public:
 
@@ -186,12 +186,12 @@ namespace VirtualRobot
         static bool IsSupported_Multithreading_MultipleColCheckers();
 
 #if defined(VR_COLLISION_DETECTION_PQP)
-        boost::shared_ptr<CollisionCheckerPQP> getCollisionCheckerImplementation()
+        std::shared_ptr<CollisionCheckerPQP> getCollisionCheckerImplementation()
         {
             return collisionCheckerImplementation;
         }
 #else
-        boost::shared_ptr<CollisionCheckerDummy> getCollisionCheckerImplementation()
+        std::shared_ptr<CollisionCheckerDummy> getCollisionCheckerImplementation()
         {
             return collisionCheckerImplementation;
         }
@@ -219,9 +219,9 @@ namespace VirtualRobot
 
 
 #if defined(VR_COLLISION_DETECTION_PQP)
-        boost::shared_ptr<CollisionCheckerPQP> collisionCheckerImplementation;
+        std::shared_ptr<CollisionCheckerPQP> collisionCheckerImplementation;
 #else
-        boost::shared_ptr<CollisionCheckerDummy> collisionCheckerImplementation;
+        std::shared_ptr<CollisionCheckerDummy> collisionCheckerImplementation;
 #endif
     };
 } // namespace VirtualRobot
diff --git a/VirtualRobot/CollisionDetection/CollisionModel.cpp b/VirtualRobot/CollisionDetection/CollisionModel.cpp
index d585f4905e8afcbb1de35190d3478d40b3748a89..a9c706837154f8d3b01bf657ead3a98c81ebabbd 100644
--- a/VirtualRobot/CollisionDetection/CollisionModel.cpp
+++ b/VirtualRobot/CollisionDetection/CollisionModel.cpp
@@ -4,12 +4,17 @@
 #include "../Visualization/TriMeshModel.h"
 #include "../Visualization/VisualizationNode.h"
 #include "../XML/BaseIO.h"
+
+#include <boost/assert.hpp>
+
+#include <filesystem>
 #include <algorithm>
 
 
 
 namespace VirtualRobot
 {
+    using std::endl;
 
     CollisionModel::CollisionModel(VisualizationNodePtr visu, const std::string& name, CollisionCheckerPtr colChecker, int id, float margin)
     {
@@ -59,7 +64,7 @@ namespace VirtualRobot
         {
             VR_WARNING << "internal collision model is NULL for " << name << endl;
         }
-        collisionModelImplementation = boost::dynamic_pointer_cast<InternalCollisionModel>(collisionModel->clone(false));
+        collisionModelImplementation = std::dynamic_pointer_cast<InternalCollisionModel>(collisionModel->clone(false));
         VR_ASSERT(collisionModelImplementation->getPQPModel());
         setVisualization(visu);
     }
diff --git a/VirtualRobot/CollisionDetection/CollisionModel.h b/VirtualRobot/CollisionDetection/CollisionModel.h
index 20e6085bc51ad9a13201bdc5d732ea91d8369b1e..b2e0319d853e4689cb85709cacf493f8ef2d1a29 100644
--- a/VirtualRobot/CollisionDetection/CollisionModel.h
+++ b/VirtualRobot/CollisionDetection/CollisionModel.h
@@ -44,7 +44,7 @@ namespace VirtualRobot
 #else
     typedef CollisionModelDummy InternalCollisionModel;
 #endif
-    typedef boost::shared_ptr< InternalCollisionModel > InternalCollisionModelPtr;
+    typedef std::shared_ptr< InternalCollisionModel > InternalCollisionModelPtr;
     class CollisionChecker;
 
     /*!
@@ -104,12 +104,12 @@ namespace VirtualRobot
         }
 
 #if defined(VR_COLLISION_DETECTION_PQP)
-        const boost::shared_ptr< CollisionModelPQP >& getCollisionModelImplementation()
+        const std::shared_ptr< CollisionModelPQP >& getCollisionModelImplementation()
         {
             return collisionModelImplementation;
         }
 #else
-        const boost::shared_ptr< CollisionModelDummy >& getCollisionModelImplementation()
+        const std::shared_ptr< CollisionModelDummy >& getCollisionModelImplementation()
         {
             return collisionModelImplementation;
         }
@@ -202,9 +202,9 @@ namespace VirtualRobot
 
 
 #if defined(VR_COLLISION_DETECTION_PQP)
-        boost::shared_ptr< CollisionModelPQP > collisionModelImplementation;
+        std::shared_ptr< CollisionModelPQP > collisionModelImplementation;
 #else
-        boost::shared_ptr< CollisionModelDummy > collisionModelImplementation;
+        std::shared_ptr< CollisionModelDummy > collisionModelImplementation;
 #endif
     };
 
diff --git a/VirtualRobot/CollisionDetection/CollisionModelImplementation.h b/VirtualRobot/CollisionDetection/CollisionModelImplementation.h
index 85bb588ad7ea3cdd0ac392642c4ffa8f51e97994..e24b63c4d431421132a57d2ecb0b87c81b4d3fe1 100644
--- a/VirtualRobot/CollisionDetection/CollisionModelImplementation.h
+++ b/VirtualRobot/CollisionDetection/CollisionModelImplementation.h
@@ -24,6 +24,7 @@
 
 #include "../VirtualRobot.h"
 
+#include <iostream>
 #include <string>
 #include <vector>
 #include <map>
@@ -73,7 +74,7 @@ namespace VirtualRobot
 
         virtual void print()
         {
-            cout << "Dummy Collision Model Implementation..." << endl;
+            std::cout << "Dummy Collision Model Implementation..." << std::endl;
         };
 
         TriMeshModelPtr getTriMeshModel()
@@ -82,7 +83,7 @@ namespace VirtualRobot
         }
 
 
-        virtual boost::shared_ptr<CollisionModelImplementation> clone(bool deepCopy = false) const = 0;
+        virtual std::shared_ptr<CollisionModelImplementation> clone(bool deepCopy = false) const = 0;
     protected:
 
         //! delete all data
diff --git a/VirtualRobot/CollisionDetection/Dummy/CollisionModelDummy.h b/VirtualRobot/CollisionDetection/Dummy/CollisionModelDummy.h
index f788774fa86964a8c3610324a3a0bbdb39ac834d..9ee71e7acca935bee860fc9a5032b5ac586010dd 100644
--- a/VirtualRobot/CollisionDetection/Dummy/CollisionModelDummy.h
+++ b/VirtualRobot/CollisionDetection/Dummy/CollisionModelDummy.h
@@ -50,7 +50,7 @@ namespace VirtualRobot
          Returns number of triangles used for building the collision model
          */
         //virtual int BuildColModel(std::map<SoNode*,int> &mIVIDMapping, std::vector<int> & vStoreIDs, SoSeparator *pAddIVModel);
-        virtual boost::shared_ptr<CollisionModelImplementation> clone(bool deepCopy = false) const{}
+        virtual std::shared_ptr<CollisionModelImplementation> clone(bool deepCopy = false) const{}
     protected:
 
         //! delete all data
diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.cpp b/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.cpp
index 77f8617a93d83fad2662c2dddbbd40f16270e700..dece193fd4b9d76cee7550dd3d8fe559c63fce82 100644
--- a/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.cpp
+++ b/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.cpp
@@ -10,6 +10,8 @@
 
 #include <VirtualRobot/Visualization/TriMeshModel.h>
 
+#include <boost/assert.hpp>
+
 ///
 /// \brief Computes the intersection line between two triangles V and U
 /// \param V0 Vertex 0 of triangle V
@@ -87,8 +89,8 @@ namespace VirtualRobot
 
     float CollisionCheckerPQP::calculateDistance(const CollisionModelPtr& model1, const CollisionModelPtr& model2, Eigen::Vector3f& P1, Eigen::Vector3f& P2, int* trID1, int* trID2)
     {
-        boost::shared_ptr<PQP::PQP_Model> m1 = model1->getCollisionModelImplementation()->getPQPModel();
-        boost::shared_ptr<PQP::PQP_Model> m2 = model2->getCollisionModelImplementation()->getPQPModel();
+        std::shared_ptr<PQP::PQP_Model> m1 = model1->getCollisionModelImplementation()->getPQPModel();
+        std::shared_ptr<PQP::PQP_Model> m2 = model2->getCollisionModelImplementation()->getPQPModel();
         VR_ASSERT_MESSAGE(m1 && m2, "NULL data in ColChecker!");
 
         float res = getMinDistance(m1, m2, model1->getCollisionModelImplementation()->getGlobalPose(), model2->getCollisionModelImplementation()->getGlobalPose(), P1, P2, trID1, trID2);
@@ -109,8 +111,8 @@ namespace VirtualRobot
         const auto& Impl2 = model2->getCollisionModelImplementation();
         BOOST_ASSERT(Impl1);
         BOOST_ASSERT(Impl2);
-        const boost::shared_ptr<PQP::PQP_Model>& m1 = Impl1->getPQPModel();
-        const boost::shared_ptr<PQP::PQP_Model>& m2 = Impl2->getPQPModel();
+        const std::shared_ptr<PQP::PQP_Model>& m1 = Impl1->getPQPModel();
+        const std::shared_ptr<PQP::PQP_Model>& m2 = Impl2->getPQPModel();
         BOOST_ASSERT_MSG(m1, "NULL data in ColChecker in m1!");
         BOOST_ASSERT_MSG(m2, "NULL data in ColChecker in m2!");
 
@@ -155,7 +157,7 @@ namespace VirtualRobot
     {
         BOOST_ASSERT(model1);
         BOOST_ASSERT(model1->getCollisionModelImplementation());
-        boost::shared_ptr<PQP::PQP_Model> m1 = model1->getCollisionModelImplementation()->getPQPModel();
+        std::shared_ptr<PQP::PQP_Model> m1 = model1->getCollisionModelImplementation()->getPQPModel();
         VR_ASSERT_MESSAGE(m1, "NULL data in ColChecker!");
 
         PQP::PQP_REAL R1[3][3];
@@ -196,8 +198,8 @@ namespace VirtualRobot
         BOOST_ASSERT(model1->getCollisionModelImplementation());
         BOOST_ASSERT(model2);
         BOOST_ASSERT(model2->getCollisionModelImplementation());
-        boost::shared_ptr<PQP::PQP_Model> m1 = model1->getCollisionModelImplementation()->getPQPModel();
-        boost::shared_ptr<PQP::PQP_Model> m2 = model2->getCollisionModelImplementation()->getPQPModel();
+        std::shared_ptr<PQP::PQP_Model> m1 = model1->getCollisionModelImplementation()->getPQPModel();
+        std::shared_ptr<PQP::PQP_Model> m2 = model2->getCollisionModelImplementation()->getPQPModel();
 
         VR_ASSERT_MESSAGE(m1, "NULL data in ColChecker!");
         VR_ASSERT_MESSAGE(m2, "NULL data in ColChecker!");
@@ -345,7 +347,7 @@ namespace VirtualRobot
 
 
     // returns min distance between the objects
-    float CollisionCheckerPQP::getMinDistance(boost::shared_ptr<PQP::PQP_Model> m1, boost::shared_ptr<PQP::PQP_Model> m2, const Eigen::Matrix4f& mat1, const Eigen::Matrix4f& mat2)
+    float CollisionCheckerPQP::getMinDistance(std::shared_ptr<PQP::PQP_Model> m1, std::shared_ptr<PQP::PQP_Model> m2, const Eigen::Matrix4f& mat1, const Eigen::Matrix4f& mat2)
     {
         PQP::PQP_DistanceResult result;
         CollisionCheckerPQP::GetPQPDistance(m1, m2, mat1, mat2, result);
@@ -355,7 +357,7 @@ namespace VirtualRobot
 
 
     // returns min distance between the objects
-    float CollisionCheckerPQP::getMinDistance(boost::shared_ptr<PQP::PQP_Model> m1, boost::shared_ptr<PQP::PQP_Model> m2, const Eigen::Matrix4f& mat1, const Eigen::Matrix4f& mat2, Eigen::Vector3f& storeP1, Eigen::Vector3f& storeP2, int* storeID1, int* storeID2)
+    float CollisionCheckerPQP::getMinDistance(std::shared_ptr<PQP::PQP_Model> m1, std::shared_ptr<PQP::PQP_Model> m2, const Eigen::Matrix4f& mat1, const Eigen::Matrix4f& mat2, Eigen::Vector3f& storeP1, Eigen::Vector3f& storeP2, int* storeID1, int* storeID2)
     {
         VR_ASSERT_MESSAGE(m1 && m2, "NULL data in ColChecker!");
 
@@ -387,7 +389,7 @@ namespace VirtualRobot
     }
 
 
-    void CollisionCheckerPQP::GetPQPDistance(const boost::shared_ptr<PQP::PQP_Model>& model1, const boost::shared_ptr<PQP::PQP_Model>& model2, const Eigen::Matrix4f& matrix1, const Eigen::Matrix4f& matrix2, PQP::PQP_DistanceResult& pqpResult)
+    void CollisionCheckerPQP::GetPQPDistance(const std::shared_ptr<PQP::PQP_Model>& model1, const std::shared_ptr<PQP::PQP_Model>& model2, const Eigen::Matrix4f& matrix1, const Eigen::Matrix4f& matrix2, PQP::PQP_DistanceResult& pqpResult)
     {
         VR_ASSERT_MESSAGE(pqpChecker, "NULL data in ColChecker!");
 
diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.h b/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.h
index f11f1f4891b5781c765bb8f2a5851f2aa119f308..0185238fbc3b91f8f44cb6699127a1e2b29d3e2c 100644
--- a/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.h
+++ b/VirtualRobot/CollisionDetection/PQP/CollisionCheckerPQP.h
@@ -63,10 +63,10 @@ namespace VirtualRobot
         //bool CheckContinuousCollision (CollisionModel *model1, Eigen::Matrix4f &mGoalPose1, CollisionModel *model2, Eigen::Matrix4f &mGoalPose2, float &fStoreTOC);
 
 
-        float getMinDistance(boost::shared_ptr<PQP::PQP_Model> m1, boost::shared_ptr<PQP::PQP_Model> m2, const Eigen::Matrix4f& mat1, const Eigen::Matrix4f& mat2);
-        float getMinDistance(boost::shared_ptr<PQP::PQP_Model> m1, boost::shared_ptr<PQP::PQP_Model> m2, const Eigen::Matrix4f& mat1, const Eigen::Matrix4f& mat2, Eigen::Vector3f& storeP1, Eigen::Vector3f& storeP2, int* storeID1, int* storeID2);
+        float getMinDistance(std::shared_ptr<PQP::PQP_Model> m1, std::shared_ptr<PQP::PQP_Model> m2, const Eigen::Matrix4f& mat1, const Eigen::Matrix4f& mat2);
+        float getMinDistance(std::shared_ptr<PQP::PQP_Model> m1, std::shared_ptr<PQP::PQP_Model> m2, const Eigen::Matrix4f& mat1, const Eigen::Matrix4f& mat2, Eigen::Vector3f& storeP1, Eigen::Vector3f& storeP2, int* storeID1, int* storeID2);
 
-        void GetPQPDistance(const boost::shared_ptr<PQP::PQP_Model>& model1, const boost::shared_ptr<PQP::PQP_Model>& model2, const Eigen::Matrix4f& matrix1, const Eigen::Matrix4f& matrix2, PQP::PQP_DistanceResult& pqpResult);
+        void GetPQPDistance(const std::shared_ptr<PQP::PQP_Model>& model1, const std::shared_ptr<PQP::PQP_Model>& model2, const Eigen::Matrix4f& matrix1, const Eigen::Matrix4f& matrix2, PQP::PQP_DistanceResult& pqpResult);
 
 
         /*!
diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp
index 8110ffe78affa04cc9f55b1c439523a2ae68f3f3..8de15d9d514a66001220a6a4adcdc10b088a73bf 100644
--- a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp
+++ b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp
@@ -18,7 +18,7 @@ namespace VirtualRobot
 
         if (!colChecker)
         {
-            VR_WARNING << "no col checker..." << endl;
+            VR_WARNING << "no col checker...\n";
         }
         else
         {
@@ -48,7 +48,7 @@ namespace VirtualRobot
     {
         if (!modelData)
         {
-            VR_WARNING << "no model data in PQP!" << endl;
+            VR_WARNING << "no model data in PQP!\n";
             return;
         }
 
@@ -82,11 +82,11 @@ namespace VirtualRobot
 
     void CollisionModelPQP::print()
     {
-        cout << "   CollisionModelPQP: ";
+        std::cout << "   CollisionModelPQP: ";
 
         if (pqpModel)
         {
-            cout << pqpModel->num_tris << " triangles." << endl;
+            std::cout << pqpModel->num_tris << " triangles.\n";
             float mi[3];
             float ma[3];
 
@@ -133,21 +133,21 @@ namespace VirtualRobot
                     }
                 }
 
-                cout << "    Min point: (" << mi[0] << "," << mi[1] << "," << mi[2] << ")" << endl;
-                cout << "    Max point: (" << ma[0] << "," << ma[1] << "," << ma[2] << ")" << endl;
+                std::cout << "    Min point: (" << mi[0] << "," << mi[1] << "," << mi[2] << ")\n";
+                std::cout << "    Max point: (" << ma[0] << "," << ma[1] << "," << ma[2] << ")\n";
             }
         }
         else
         {
-            cout << "no model." << endl;
+            std::cout << "no model.\n";
         }
 
-        cout << endl;
+        std::cout << std::endl;
     }
 
-    boost::shared_ptr<CollisionModelImplementation> CollisionModelPQP::clone(bool deepCopy) const
+    std::shared_ptr<CollisionModelImplementation> CollisionModelPQP::clone(bool deepCopy) const
     {
-        boost::shared_ptr<CollisionModelPQP> p(new CollisionModelPQP(*this));
+        std::shared_ptr<CollisionModelPQP> p(new CollisionModelPQP(*this));
         if(deepCopy)
         {
             p->createPQPModel();
diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h
index b52131210484d051df798298e599e8e28610a278..6abce4f2b8cec1cd4413f58914240d098c8b36cd 100644
--- a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h
+++ b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h
@@ -56,13 +56,13 @@ namespace VirtualRobot
         */
         ~CollisionModelPQP() override;
 
-        const boost::shared_ptr<PQP::PQP_Model>& getPQPModel()
+        const std::shared_ptr<PQP::PQP_Model>& getPQPModel()
         {
             return pqpModel;
         }
 
         void print() override;
-        boost::shared_ptr<CollisionModelImplementation> clone(bool deepCopy = false) const override;
+        std::shared_ptr<CollisionModelImplementation> clone(bool deepCopy = false) const override;
     protected:
         CollisionModelPQP(const CollisionModelPQP& orig);
 
@@ -70,9 +70,9 @@ namespace VirtualRobot
         void destroyData() override;
         void createPQPModel();
 
-        boost::shared_ptr<PQP::PQP_Model> pqpModel;
+        std::shared_ptr<PQP::PQP_Model> pqpModel;
 
-        boost::shared_ptr<CollisionCheckerPQP> colCheckerPQP;
+        std::shared_ptr<CollisionCheckerPQP> colCheckerPQP;
     };
 
 } // namespace
diff --git a/VirtualRobot/Compression/CompressionBZip2.cpp b/VirtualRobot/Compression/CompressionBZip2.cpp
index ba36132548241816eb55f356e474b462695b7995..59bf64a16bd39ac485aebf24c6bc1aa7e5f37f9b 100644
--- a/VirtualRobot/Compression/CompressionBZip2.cpp
+++ b/VirtualRobot/Compression/CompressionBZip2.cpp
@@ -236,7 +236,8 @@
 
 namespace VirtualRobot
 {
-
+    using std::cout;
+    using std::endl;
 
     const CompressionBZip2::UInt32 CompressionBZip2::BZ2_crc32Table[256] =
     {
diff --git a/VirtualRobot/Compression/CompressionBZip2.h b/VirtualRobot/Compression/CompressionBZip2.h
index 70e0c95a83c82e9f289073980f6982458a3e8d98..449d1f35563206f016ad78bc0e1c1ae3a9899b64 100644
--- a/VirtualRobot/Compression/CompressionBZip2.h
+++ b/VirtualRobot/Compression/CompressionBZip2.h
@@ -500,7 +500,7 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<CompressionBZip2> CompressionBZip2Ptr;
+    typedef std::shared_ptr<CompressionBZip2> CompressionBZip2Ptr;
 
 } // namespace
 
diff --git a/VirtualRobot/Compression/CompressionRLE.cpp b/VirtualRobot/Compression/CompressionRLE.cpp
index 5ac51514c682ddcd191b0a048d456f6390c9d4f4..677547cb41423fb5dd45a19447410be494e86630 100644
--- a/VirtualRobot/Compression/CompressionRLE.cpp
+++ b/VirtualRobot/Compression/CompressionRLE.cpp
@@ -70,7 +70,7 @@
 namespace VirtualRobot
 {
 
-    boost::mutex CompressionRLE::mutex;
+    std::mutex CompressionRLE::mutex;
 
     /*************************************************************************
     *                           INTERNAL FUNCTIONS                           *
@@ -168,7 +168,7 @@ namespace VirtualRobot
                                      unsigned int insize)
     {
         // lock our mutex as long we are in the scope of this method
-        boost::mutex::scoped_lock lock(mutex);
+        std::scoped_lock lock(mutex);
 
         unsigned char byte1, byte2, marker;
         unsigned int  inpos, outpos, count, i, histogram[ 256 ];
@@ -290,7 +290,7 @@ namespace VirtualRobot
                                         unsigned int insize)
     {
         // lock our mutex as long we are in the scope of this method
-        boost::mutex::scoped_lock lock(mutex);
+        std::scoped_lock lock(mutex);
 
         unsigned char marker, symbol;
         unsigned int  i, inpos, outpos, count;
diff --git a/VirtualRobot/Compression/CompressionRLE.h b/VirtualRobot/Compression/CompressionRLE.h
index 936d9831c5dafdc1f678e9a6ffec2e5f93b744a6..727edfe26e1246c6739ff27abd484ed951fa613d 100644
--- a/VirtualRobot/Compression/CompressionRLE.h
+++ b/VirtualRobot/Compression/CompressionRLE.h
@@ -26,7 +26,7 @@
 
 #include "../VirtualRobot.h"
 
-
+#include <mutex>
 
 namespace VirtualRobot
 {
@@ -58,7 +58,7 @@ namespace VirtualRobot
         static void _RLE_WriteRep(unsigned char* out, unsigned int* outpos, unsigned char marker, unsigned char symbol, unsigned int count);
         static void _RLE_WriteNonRep(unsigned char* out, unsigned int* outpos, unsigned char marker, unsigned char symbol);
 
-        static boost::mutex mutex;
+        static std::mutex mutex;
     };
 
 } // namespace VirtualRobot
diff --git a/VirtualRobot/Dynamics/Dynamics.cpp b/VirtualRobot/Dynamics/Dynamics.cpp
index 1f69003649b63e6e9025e01b6a23fb104a928dbf..476d33d74d3e8ef904459bfbb235fed64cdd37d3 100644
--- a/VirtualRobot/Dynamics/Dynamics.cpp
+++ b/VirtualRobot/Dynamics/Dynamics.cpp
@@ -29,6 +29,9 @@ using std::cin;
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
+
     VirtualRobot::Dynamics::Dynamics(RobotNodeSetPtr rns, RobotNodeSetPtr rnsBodies, bool verbose) : rns(rns), rnsBodies(rnsBodies), verbose(verbose)
     {
         if (!rns)
@@ -37,7 +40,7 @@ namespace VirtualRobot
         }
         VERBOSE_OUT << "joint values:\n" << rns->getJointValuesEigen() << endl;
         gravity = RigidBodyDynamics::Math::Vector3d(0, 0, -9.81);
-        model = boost::shared_ptr<RigidBodyDynamics::Model>(new RigidBodyDynamics::Model());
+        model = std::shared_ptr<RigidBodyDynamics::Model>(new RigidBodyDynamics::Model());
 
         model->gravity = gravity;
 
@@ -204,7 +207,7 @@ namespace VirtualRobot
         verbose = value;
     }
 
-    boost::shared_ptr<RigidBodyDynamics::Model> Dynamics::getModel() const
+    std::shared_ptr<RigidBodyDynamics::Model> Dynamics::getModel() const
     {
         return model;
     }
@@ -217,9 +220,9 @@ namespace VirtualRobot
             return RobotNodePtr();
         }
 
-        BOOST_FOREACH(SceneObjectPtr child, node->getChildren())
+        for (SceneObjectPtr const& child : node->getChildren())
         {
-            RobotNodePtr childPtr = boost::dynamic_pointer_cast<RobotNode>(child);
+            RobotNodePtr childPtr = std::dynamic_pointer_cast<RobotNode>(child);
 
             if (childPtr != 0 &&                    // existing
                 childPtr->getMass() > 0 &&      // has mass
@@ -229,9 +232,9 @@ namespace VirtualRobot
                 return childPtr;
             }
         }
-        BOOST_FOREACH(SceneObjectPtr child, node->getChildren())
+        for (SceneObjectPtr const& child : node->getChildren())
         {
-            RobotNodePtr rnPtr = boost::dynamic_pointer_cast<RobotNode>(child);
+            RobotNodePtr rnPtr = std::dynamic_pointer_cast<RobotNode>(child);
             RobotNodePtr childPtr;
 
             if (rnPtr && !rnPtr->isRotationalJoint()) // break recursion if child is rot joint
@@ -252,7 +255,7 @@ namespace VirtualRobot
         std::set<RobotNodePtr> result;
         for (auto& obj : node->getChildren())
         {
-            auto node = boost::dynamic_pointer_cast<VirtualRobot::RobotNode>(obj);
+            auto node = std::dynamic_pointer_cast<VirtualRobot::RobotNode>(obj);
 
             if (node && nodeSet->hasRobotNode(node))
             {
@@ -272,7 +275,7 @@ namespace VirtualRobot
     }
 
     // rbdl: (trafo->joint->body) -> (trafo->joint->body) -> (trafo->joint->body) ...
-    void Dynamics::toRBDLRecursive(boost::shared_ptr<RigidBodyDynamics::Model> model, RobotNodePtr node, Eigen::Matrix4f accumulatedTransformPreJoint, Eigen::Matrix4f accumulatedTransformPostJoint, RobotNodePtr jointNode, int parentID)
+    void Dynamics::toRBDLRecursive(std::shared_ptr<RigidBodyDynamics::Model> model, RobotNodePtr node, Eigen::Matrix4f accumulatedTransformPreJoint, Eigen::Matrix4f accumulatedTransformPostJoint, RobotNodePtr jointNode, int parentID)
     {
         VR_ASSERT(model);
         VR_ASSERT(node);
@@ -332,7 +335,7 @@ namespace VirtualRobot
             if (jointNode && jointNode->isRotationalJoint())
             {
                 RigidBodyDynamics::JointType joint_type = RigidBodyDynamics::JointTypeRevolute;
-                boost::shared_ptr<RobotNodeRevolute> rev = boost::dynamic_pointer_cast<RobotNodeRevolute>(jointNode);
+                std::shared_ptr<RobotNodeRevolute> rev = std::dynamic_pointer_cast<RobotNodeRevolute>(jointNode);
                 VR_ASSERT(rev);
                 RigidBodyDynamics::Math::Vector3d joint_axis = rev->getJointRotationAxisInJointCoordSystem().cast<double>();
 
@@ -343,7 +346,7 @@ namespace VirtualRobot
             else if (jointNode && jointNode->isTranslationalJoint())
             {
                 RigidBodyDynamics::JointType joint_type = RigidBodyDynamics::JointTypePrismatic;
-                boost::shared_ptr<RobotNodePrismatic> prism = boost::dynamic_pointer_cast<RobotNodePrismatic>(jointNode);
+                std::shared_ptr<RobotNodePrismatic> prism = std::dynamic_pointer_cast<RobotNodePrismatic>(jointNode);
                 RigidBodyDynamics::Math::Vector3d joint_axis = prism->getJointTranslationDirectionJointCoordSystem().cast<double>();
 
                 joint = RigidBodyDynamics::Joint(joint_type, joint_axis);
@@ -401,9 +404,9 @@ namespace VirtualRobot
 
         std::vector<SceneObjectPtr> children = node->getChildren();
 
-        BOOST_FOREACH(SceneObjectPtr child, children)
+        for (SceneObjectPtr const& child : children)
         {
-            boost::shared_ptr<RobotNode> childRobotNode = boost::dynamic_pointer_cast<RobotNode>(child);
+            std::shared_ptr<RobotNode> childRobotNode = std::dynamic_pointer_cast<RobotNode>(child);
 
             if (childRobotNode) // if cast returns 0 pointer, child is a sensor and can be omitted. also, child must be contained in the robotnodeset
             {
@@ -421,7 +424,7 @@ namespace VirtualRobot
 
 
 
-    void Dynamics::toRBDL(boost::shared_ptr<RigidBodyDynamics::Model> model, RobotNodePtr node, RobotNodeSetPtr nodeSet, RobotNodePtr parentNode, int parentID)
+    void Dynamics::toRBDL(std::shared_ptr<RigidBodyDynamics::Model> model, RobotNodePtr node, RobotNodeSetPtr nodeSet, RobotNodePtr parentNode, int parentID)
     {
         VERBOSE_OUT << "#######ADDING NODE " << node->getName() << endl;
         RobotNodePtr physicsFromChild;
@@ -464,7 +467,7 @@ namespace VirtualRobot
         if (node->isRotationalJoint())
         {
             RigidBodyDynamics::JointType joint_type = RigidBodyDynamics::JointTypeRevolute;
-            boost::shared_ptr<RobotNodeRevolute> rev = boost::dynamic_pointer_cast<RobotNodeRevolute>(node);
+            std::shared_ptr<RobotNodeRevolute> rev = std::dynamic_pointer_cast<RobotNodeRevolute>(node);
             RigidBodyDynamics::Math::Vector3d joint_axis = rev->getJointRotationAxisInJointCoordSystem().cast<double>();
 
             joint = RigidBodyDynamics::Joint(joint_type, joint_axis);
@@ -474,7 +477,7 @@ namespace VirtualRobot
         else if (node->isTranslationalJoint())
         {
             RigidBodyDynamics::JointType joint_type = RigidBodyDynamics::JointTypePrismatic;
-            boost::shared_ptr<RobotNodePrismatic> prism = boost::dynamic_pointer_cast<RobotNodePrismatic>(node);
+            std::shared_ptr<RobotNodePrismatic> prism = std::dynamic_pointer_cast<RobotNodePrismatic>(node);
             RigidBodyDynamics::Math::Vector3d joint_axis = prism->getJointTranslationDirectionJointCoordSystem().cast<double>();
 
             joint = RigidBodyDynamics::Joint(joint_type, joint_axis);
@@ -518,35 +521,6 @@ namespace VirtualRobot
             }
         }
 
-        //    std::vector<SceneObjectPtr> children;
-
-
-        //    // pick correct children to proceed the recursion
-        //    if (physicsFromChild != 0)
-        //    {
-        //        children = physicsFromChild->getChildren();
-        //    }
-        //    else
-        //    {
-        //        children = node->getChildren();
-        //    }
-
-        //    BOOST_FOREACH(SceneObjectPtr child, children)
-        //    {
-        //        boost::shared_ptr<RobotNode> childRobotNode = boost::dynamic_pointer_cast<RobotNode>(child);
-
-        //        if (childRobotNode && Dynamics::rns->hasRobotNode(childRobotNode)) // if cast returns 0 pointer, child is a sensor and can be omitted. also, child must be contained in the robotnodeset
-        //        {
-        //            if (joint.mJointType == RigidBodyDynamics::JointTypeFixed) // if current node is fixed, make its parent the parent of the next recursion step and thereby skip it
-        //            {
-        //                node = parentNode;
-        //            }
-
-        //            toRBDL(model, childRobotNode, rns, node, nodeID);
-
-        //        }
-        //    }
-
         return;
     }
 }
diff --git a/VirtualRobot/Dynamics/Dynamics.h b/VirtualRobot/Dynamics/Dynamics.h
index 604ad3af806822c7f09933632cb786d2f7e13ce3..ce411bbc723500afb22254b74195c528f4f7bda9 100644
--- a/VirtualRobot/Dynamics/Dynamics.h
+++ b/VirtualRobot/Dynamics/Dynamics.h
@@ -61,12 +61,12 @@ namespace VirtualRobot
         bool getVerbose() const;
         void setVerbose(bool value);
 
-        boost::shared_ptr<RigidBodyDynamics::Model> getModel() const;
+        std::shared_ptr<RigidBodyDynamics::Model> getModel() const;
 
     protected:
         RobotNodeSetPtr rns;
         RobotNodeSetPtr rnsBodies;
-        boost::shared_ptr<RigidBodyDynamics::Model> model;
+        std::shared_ptr<RigidBodyDynamics::Model> model;
         Eigen::Vector3d gravity;
         std::map<std::string,  int> identifierMap;
         bool verbose = false;
@@ -75,11 +75,11 @@ namespace VirtualRobot
         RobotNodePtr checkForConnectedMass(RobotNodePtr node);
         std::set<RobotNodePtr> getChildrenWithMass(const RobotNodePtr& node, const RobotNodeSetPtr &nodeSet) const;
     private:
-        void toRBDL(boost::shared_ptr<RigidBodyDynamics::Model> model, RobotNodePtr node, RobotNodeSetPtr nodeSet, RobotNodePtr parentNode = RobotNodePtr(),  int parentID = 0);
-        void toRBDLRecursive(boost::shared_ptr<RigidBodyDynamics::Model> model, RobotNodePtr currentNode, Eigen::Matrix4f accumulatedTransformPreJoint, Eigen::Matrix4f accumulatedTransformPostJoint, RobotNodePtr jointNode = RobotNodePtr(), int parentID = 0);
+        void toRBDL(std::shared_ptr<RigidBodyDynamics::Model> model, RobotNodePtr node, RobotNodeSetPtr nodeSet, RobotNodePtr parentNode = RobotNodePtr(),  int parentID = 0);
+        void toRBDLRecursive(std::shared_ptr<RigidBodyDynamics::Model> model, RobotNodePtr currentNode, Eigen::Matrix4f accumulatedTransformPreJoint, Eigen::Matrix4f accumulatedTransformPostJoint, RobotNodePtr jointNode = RobotNodePtr(), int parentID = 0);
 
     };
 
-    typedef boost::shared_ptr<Dynamics> DynamicsPtr;
+    typedef std::shared_ptr<Dynamics> DynamicsPtr;
 }
 
diff --git a/VirtualRobot/Dynamics/tests/DynamicsRBDLTest.cpp b/VirtualRobot/Dynamics/tests/DynamicsRBDLTest.cpp
index c1bf2d961fbe675a2374d30c2691129fb087f2e6..040ef6caeb83b9a83c418651d6d65ba8e81ef38a 100644
--- a/VirtualRobot/Dynamics/tests/DynamicsRBDLTest.cpp
+++ b/VirtualRobot/Dynamics/tests/DynamicsRBDLTest.cpp
@@ -12,6 +12,7 @@
 #include <VirtualRobot/XML/RobotIO.h>
 #include <VirtualRobot/Robot.h>
 #include <VirtualRobot/RobotNodeSet.h>
+
 #include <Eigen/Core>
 
 #include <rbdl/SpatialAlgebraOperators.h>
@@ -49,7 +50,7 @@ BOOST_AUTO_TEST_CASE(testRBDLTransformationOrientation)
                      jointB, RigidBodyDynamics::Body(), "bodyB");
 
     Eigen::Vector3d positionInBodyB = CalcBaseToBodyCoordinates(model, Eigen::Vector2d::Zero(), 1, Eigen::Vector3d(1,0,0));
-    std::cout << "rotation: position in bodyB\n" << positionInBodyB << endl;
+    std::cout << "rotation: position in bodyB\n" << positionInBodyB << std::endl;
 
 }
 
@@ -74,7 +75,7 @@ BOOST_AUTO_TEST_CASE(testRBDLTransformationTranslation)
                      jointB, RigidBodyDynamics::Body(), "bodyB");
 
     Eigen::Vector3d positionInBodyB = CalcBaseToBodyCoordinates(model, Eigen::Vector2d::Zero(), 1, Eigen::Vector3d(0,0,0));
-    std::cout << "translation: position in bodyB\n" << positionInBodyB << endl;
+    std::cout << "translation: position in bodyB\n" << positionInBodyB << std::endl;
 
 }
 
@@ -119,9 +120,9 @@ BOOST_AUTO_TEST_CASE(testRBDLConvertSimpleRobot)
     auto base = robot->getRobotNode("Base");
     auto j1 = robot->getRobotNode("Joint1");
     Eigen::Vector3f vec(1,0,0);
-    std::cout << "base to j1:\n" << MathTools::eigen4f2rpy(base->getTransformationTo(j1)) << endl;
+    std::cout << "base to j1:\n" << MathTools::eigen4f2rpy(base->getTransformationTo(j1)) << std::endl;
 
-    std::cout << "position\n" << vec << " in j1:\n" << j1->transformTo(base,vec) << endl;
+    std::cout << "position\n" << vec << " in j1:\n" << j1->transformTo(base,vec) << std::endl;
 
     // Check if Virtual Robot Result for gravity torque is the same as computated with RBDL
     Dynamics dynamics(rns, rns);
diff --git a/VirtualRobot/EndEffector/EndEffector.cpp b/VirtualRobot/EndEffector/EndEffector.cpp
index 6eecb5dbc5d630a3bf548ae4872943a7bca8787d..401bd69aad155813e770682344b314d2a4a77483 100644
--- a/VirtualRobot/EndEffector/EndEffector.cpp
+++ b/VirtualRobot/EndEffector/EndEffector.cpp
@@ -18,6 +18,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     EndEffector::EndEffector(const std::string& nameString, const std::vector<EndEffectorActorPtr>& actorsVector, const std::vector<RobotNodePtr>& staticPartVector, RobotNodePtr baseNodePtr, RobotNodePtr tcpNodePtr, RobotNodePtr gcpNodePtr, std::vector< RobotConfigPtr > preshapes) :
         name(nameString),
diff --git a/VirtualRobot/EndEffector/EndEffector.h b/VirtualRobot/EndEffector/EndEffector.h
index 63d36f08daf279b7748aa465f498009e0bda23c6..2ec5d949bbb5e651b49d3c0f1b4e3d9214e48652 100644
--- a/VirtualRobot/EndEffector/EndEffector.h
+++ b/VirtualRobot/EndEffector/EndEffector.h
@@ -33,7 +33,7 @@ namespace VirtualRobot
 {
     class EndEffectorActor;
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT EndEffector : public boost::enable_shared_from_this<EndEffector>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT EndEffector : public std::enable_shared_from_this<EndEffector>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
diff --git a/VirtualRobot/EndEffector/EndEffectorActor.cpp b/VirtualRobot/EndEffector/EndEffectorActor.cpp
index 3637834f4cdc34ae1a199fe43942a425553e3332..8e8bcecc025337908f1ee9e3bf0fb697af28699a 100644
--- a/VirtualRobot/EndEffector/EndEffectorActor.cpp
+++ b/VirtualRobot/EndEffector/EndEffectorActor.cpp
@@ -18,6 +18,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     EndEffectorActor::EndEffectorActor(const std::string& name, const std::vector< ActorDefinition >& a, CollisionCheckerPtr colChecker) :
         name(name),
@@ -138,7 +140,7 @@ namespace VirtualRobot
                 {
                     for (auto& node : eef->getStatics())
                     {
-                        SceneObjectPtr so = boost::dynamic_pointer_cast<SceneObject>(node);
+                        SceneObjectPtr so = std::dynamic_pointer_cast<SceneObject>(node);
 
                         //(don't store contacts)
                         //if( isColliding(eef,so,newContacts,eStatic) )
@@ -284,7 +286,7 @@ namespace VirtualRobot
     {
         for (auto& actor : actors)
         {
-            SceneObjectPtr so = boost::dynamic_pointer_cast<SceneObject>(actor.robotNode);
+            SceneObjectPtr so = std::dynamic_pointer_cast<SceneObject>(actor.robotNode);
 
             if ((actor.colMode & eActors) && obstacle->isColliding(so))
             {
@@ -314,7 +316,7 @@ namespace VirtualRobot
 
         for (auto& obstacleStatic : obstacleStatics)
         {
-            SceneObjectPtr so = boost::dynamic_pointer_cast<SceneObject>(obstacleStatic);
+            SceneObjectPtr so = std::dynamic_pointer_cast<SceneObject>(obstacleStatic);
 
             if (isColliding(so, EndEffectorActor::eStatic))
             {
@@ -344,7 +346,7 @@ namespace VirtualRobot
 
         for (auto& obstacleStatic : obstacleStatics)
         {
-            SceneObjectPtr so = boost::dynamic_pointer_cast<SceneObject>(obstacleStatic);
+            SceneObjectPtr so = std::dynamic_pointer_cast<SceneObject>(obstacleStatic);
 
             if (isColliding(eef, so, storeContacts, EndEffectorActor::eStatic))
             {
@@ -359,7 +361,7 @@ namespace VirtualRobot
     {
         for (auto& actor : actors)
         {
-            SceneObjectPtr so = boost::dynamic_pointer_cast<SceneObject>(actor.robotNode);
+            SceneObjectPtr so = std::dynamic_pointer_cast<SceneObject>(actor.robotNode);
 
             if ((actor.colMode & eActors) && obstacle->isColliding(eef, so, storeContacts))
             {
diff --git a/VirtualRobot/EndEffector/EndEffectorActor.h b/VirtualRobot/EndEffector/EndEffectorActor.h
index 1380c11680a6c3fdf8dc5ce5f7742411a79a7709..27b1e8389df8cfededfec24cbc32d9b83345cfba 100644
--- a/VirtualRobot/EndEffector/EndEffectorActor.h
+++ b/VirtualRobot/EndEffector/EndEffectorActor.h
@@ -30,7 +30,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT EndEffectorActor : public boost::enable_shared_from_this<EndEffectorActor>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT EndEffectorActor : public std::enable_shared_from_this<EndEffectorActor>
     {
     public:
         enum CollisionMode
diff --git a/VirtualRobot/Grasping/Grasp.cpp b/VirtualRobot/Grasping/Grasp.cpp
index 4fd984cf28eb048284b993e70f0e107f77b16a2f..82d0da061327fe3d7ebf5782449df68aa0d6ba4a 100644
--- a/VirtualRobot/Grasping/Grasp.cpp
+++ b/VirtualRobot/Grasping/Grasp.cpp
@@ -7,7 +7,8 @@
 
 namespace VirtualRobot
 {
-
+    using std::cout;
+    using std::endl;
 
     Grasp::Grasp(const std::string& name, const std::string& robotType, const std::string& eef,
                  const Eigen::Matrix4f& poseInTCPCoordSystem, const std::string& creation,
diff --git a/VirtualRobot/Grasping/GraspEditor/GraspEditorWindow.cpp b/VirtualRobot/Grasping/GraspEditor/GraspEditorWindow.cpp
index 0acd4063e7044db0faa303e95f3341d49f7759e9..9a597b05b9f9ebdeebb4ae8214dc35bd2f0b06dc 100644
--- a/VirtualRobot/Grasping/GraspEditor/GraspEditorWindow.cpp
+++ b/VirtualRobot/Grasping/GraspEditor/GraspEditorWindow.cpp
@@ -281,7 +281,7 @@ namespace VirtualRobot
         {
 
             SoNode* visualisationNode = nullptr;
-            boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject = object->getVisualization<CoinVisualization>(colModel);
+            std::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject = object->getVisualization<CoinVisualization>(colModel);
             if (visualizationObject)
             {
                 visualisationNode = visualizationObject->getCoinVisualization();
diff --git a/VirtualRobot/Grasping/GraspEditor/GraspEditorWindow.h b/VirtualRobot/Grasping/GraspEditor/GraspEditorWindow.h
index 5f10e7eaf697eea69f48356dbbe8d01d5d8f48b3..d6b5461ff6e4fa273b196395459ea96706f0e929 100644
--- a/VirtualRobot/Grasping/GraspEditor/GraspEditorWindow.h
+++ b/VirtualRobot/Grasping/GraspEditor/GraspEditorWindow.h
@@ -124,8 +124,8 @@ namespace VirtualRobot
         SoTimerSensor* timer;
 
 
-        boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot;
-        boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject;
+        std::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot;
+        std::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject;
     };
 
 }
diff --git a/VirtualRobot/Grasping/GraspSet.cpp b/VirtualRobot/Grasping/GraspSet.cpp
index 9ab01520221eb9032db3b522bd0ddbfd514767a9..3b18a40359221570203e3f5f29f88ef7b148057e 100644
--- a/VirtualRobot/Grasping/GraspSet.cpp
+++ b/VirtualRobot/Grasping/GraspSet.cpp
@@ -9,7 +9,8 @@
 
 namespace VirtualRobot
 {
-
+    using std::cout;
+    using std::endl;
 
     GraspSet::GraspSet(const std::string& name, const std::string& robotType, const std::string& eef, const std::vector< GraspPtr >& grasps)
         : grasps(grasps), name(name), robotType(robotType), eef(eef)
diff --git a/VirtualRobot/IK/AdvancedIKSolver.cpp b/VirtualRobot/IK/AdvancedIKSolver.cpp
index 019ce818b1e1f4fb0f0ac7596734ed8c8219025d..fecb0ee8759bddbc656ebfdeceb12d3ee1d492f6 100644
--- a/VirtualRobot/IK/AdvancedIKSolver.cpp
+++ b/VirtualRobot/IK/AdvancedIKSolver.cpp
@@ -21,6 +21,7 @@
 
 namespace VirtualRobot
 {
+    using std::endl;
 
     AdvancedIKSolver::AdvancedIKSolver(RobotNodeSetPtr rns) :
         IKSolver(), rns(rns)
@@ -46,7 +47,7 @@ namespace VirtualRobot
 
     void AdvancedIKSolver::collisionDetection(ObstaclePtr avoidCollisionsWith)
     {
-        SceneObjectPtr so = boost::dynamic_pointer_cast<SceneObject>(avoidCollisionsWith);
+        SceneObjectPtr so = std::dynamic_pointer_cast<SceneObject>(avoidCollisionsWith);
         collisionDetection(so);
     }
 
diff --git a/VirtualRobot/IK/AdvancedIKSolver.h b/VirtualRobot/IK/AdvancedIKSolver.h
index 25537c3ae7b7da96b05cb1a5e80b8e8347aefac3..94efcf211ded3938af9704ca85859c3c9d0799bb 100644
--- a/VirtualRobot/IK/AdvancedIKSolver.h
+++ b/VirtualRobot/IK/AdvancedIKSolver.h
@@ -42,7 +42,7 @@ namespace VirtualRobot
     * Can consider reachability information.
     * Can handle ManipulationObjects and associated grasping information.
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT AdvancedIKSolver : public IKSolver, public boost::enable_shared_from_this<AdvancedIKSolver>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT AdvancedIKSolver : public IKSolver, public std::enable_shared_from_this<AdvancedIKSolver>
     {
     public:
 
@@ -164,6 +164,6 @@ namespace VirtualRobot
         bool verbose;
     };
 
-    typedef boost::shared_ptr<AdvancedIKSolver> AdvancedIKSolverPtr;
+    typedef std::shared_ptr<AdvancedIKSolver> AdvancedIKSolverPtr;
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/CoMIK.cpp b/VirtualRobot/IK/CoMIK.cpp
index d68aef43422ba3966183b955ed3e7c00595c9f5c..49305a979d218d94ee568fefa0a0a50c76172e68 100644
--- a/VirtualRobot/IK/CoMIK.cpp
+++ b/VirtualRobot/IK/CoMIK.cpp
@@ -5,10 +5,15 @@
 #include "../VirtualRobotException.h"
 #include "../Robot.h"
 
+#include <Eigen/Geometry>
+
 #include <cfloat>
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
+
     CoMIK::CoMIK(RobotNodeSetPtr rnsJoints, RobotNodeSetPtr rnsBodies, RobotNodePtr coordSystem, int dimensions)
         : JacobiProvider(rnsJoints), coordSystem(coordSystem)
     {
@@ -67,8 +72,8 @@ namespace VirtualRobot
                 if (dof->isRotationalJoint())
                 {
                     // get axis
-                    boost::shared_ptr<RobotNodeRevolute> revolute
-                        = boost::dynamic_pointer_cast<RobotNodeRevolute>(dof);
+                    std::shared_ptr<RobotNodeRevolute> revolute
+                        = std::dynamic_pointer_cast<RobotNodeRevolute>(dof);
                     THROW_VR_EXCEPTION_IF(!revolute, "Internal error: expecting revolute joint");
                     // todo: find a better way of handling different joint types
                     Eigen::Vector3f axis = revolute->getJointRotationAxis(coordSystem);
@@ -89,8 +94,8 @@ namespace VirtualRobot
                 else if (dof->isTranslationalJoint())
                 {
                     // -> prismatic joint
-                    boost::shared_ptr<RobotNodePrismatic> prismatic
-                        = boost::dynamic_pointer_cast<RobotNodePrismatic>(dof);
+                    std::shared_ptr<RobotNodePrismatic> prismatic
+                        = std::dynamic_pointer_cast<RobotNodePrismatic>(dof);
                     THROW_VR_EXCEPTION_IF(!prismatic, "Internal error: expecting prismatic joint");
                     // todo: find a better way of handling different joint types
                     Eigen::Vector3f axis = prismatic->getJointTranslationDirection(coordSystem);
diff --git a/VirtualRobot/IK/CoMIK.h b/VirtualRobot/IK/CoMIK.h
index 2011f44faf89f9e87b1e132f25fdac8d6d825e59..1ed5866fdb6291432eef31394103119e3c850e6f 100644
--- a/VirtualRobot/IK/CoMIK.h
+++ b/VirtualRobot/IK/CoMIK.h
@@ -34,7 +34,7 @@ namespace VirtualRobot
 {
     class VIRTUAL_ROBOT_IMPORT_EXPORT CoMIK :
         public JacobiProvider,
-        public boost::enable_shared_from_this<CoMIK>
+        public std::enable_shared_from_this<CoMIK>
     {
     public:
         /*!
@@ -83,7 +83,7 @@ namespace VirtualRobot
     };
 
 
-    typedef boost::shared_ptr<CoMIK> CoMIKPtr;
+    typedef std::shared_ptr<CoMIK> CoMIKPtr;
 
 }
 
diff --git a/VirtualRobot/IK/ConstrainedHierarchicalIK.h b/VirtualRobot/IK/ConstrainedHierarchicalIK.h
index d161607db687782f5b69c043513dab0f51e09d4a..695fb39b4459ea8a64ed4e87f36b4fbad975c7fe 100644
--- a/VirtualRobot/IK/ConstrainedHierarchicalIK.h
+++ b/VirtualRobot/IK/ConstrainedHierarchicalIK.h
@@ -29,7 +29,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT ConstrainedHierarchicalIK : public ConstrainedIK, public boost::enable_shared_from_this<ConstrainedHierarchicalIK>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT ConstrainedHierarchicalIK : public ConstrainedIK, public std::enable_shared_from_this<ConstrainedHierarchicalIK>
     {
     public:
         ConstrainedHierarchicalIK(RobotPtr& robot, const RobotNodeSetPtr& nodeSet, float stepSize = 0.2f, int maxIterations = 1000, float stall_epsilon = 0.0001, float raise_epsilon = 0.1);
@@ -47,6 +47,6 @@ namespace VirtualRobot
         Eigen::VectorXf lastDelta;
     };
 
-    typedef boost::shared_ptr<ConstrainedHierarchicalIK> ConstrainedHierarchicalIKPtr;
+    typedef std::shared_ptr<ConstrainedHierarchicalIK> ConstrainedHierarchicalIKPtr;
 }
 
diff --git a/VirtualRobot/IK/ConstrainedIK.cpp b/VirtualRobot/IK/ConstrainedIK.cpp
index 0613fd9be8c1f57438e9e8dc0a8ab153b3789595..b0a9c0d5cee64723b68cf5860536b32e1ee5ce50 100644
--- a/VirtualRobot/IK/ConstrainedIK.cpp
+++ b/VirtualRobot/IK/ConstrainedIK.cpp
@@ -2,6 +2,9 @@
 
 using namespace VirtualRobot;
 
+using std::cout;
+using std::endl;
+
 ConstrainedIK::ConstrainedIK(RobotPtr& robot, const RobotNodeSetPtr& nodeSet, int maxIterations, float stall_epsilon, float raise_epsilon, bool reduceRobot) :
     originalRobot(robot),
     nodeSet(nodeSet),
@@ -179,7 +182,7 @@ void ConstrainedIK::getUnitableNodes(const RobotNodePtr &robotNode, const RobotN
             std::vector<SceneObjectPtr> children = robotNode->getChildren();
             for (auto &child : children)
             {
-                RobotNodePtr childRobotNode = boost::dynamic_pointer_cast<RobotNode>(child);
+                RobotNodePtr childRobotNode = std::dynamic_pointer_cast<RobotNode>(child);
                 if (childRobotNode)
                 {
                     getUnitableNodes(childRobotNode, nodeSet, unitable);
diff --git a/VirtualRobot/IK/ConstrainedIK.h b/VirtualRobot/IK/ConstrainedIK.h
index af3978c0fde6224d6091313352065131cde52b6e..c465219fb497e2eb07dbf301d6867d683169ede6 100644
--- a/VirtualRobot/IK/ConstrainedIK.h
+++ b/VirtualRobot/IK/ConstrainedIK.h
@@ -30,7 +30,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT ConstrainedIK : public boost::enable_shared_from_this<ConstrainedIK>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT ConstrainedIK : public std::enable_shared_from_this<ConstrainedIK>
     {
     public:
         enum SeedType
@@ -90,6 +90,6 @@ namespace VirtualRobot
         float raiseEpsilon;
     };
 
-    typedef boost::shared_ptr<ConstrainedIK> ConstrainedIKPtr;
+    typedef std::shared_ptr<ConstrainedIK> ConstrainedIKPtr;
 }
 
diff --git a/VirtualRobot/IK/ConstrainedOptimizationIK.h b/VirtualRobot/IK/ConstrainedOptimizationIK.h
index c6543764b7c5be9e2f47177c7fcf0f42d6826adf..b82527aec430bad487309b67031d88da91ac5c19 100644
--- a/VirtualRobot/IK/ConstrainedOptimizationIK.h
+++ b/VirtualRobot/IK/ConstrainedOptimizationIK.h
@@ -34,9 +34,9 @@ namespace nlopt
 
 namespace VirtualRobot
 {
-    typedef boost::shared_ptr<nlopt::opt> OptimizerPtr;
+    typedef std::shared_ptr<nlopt::opt> OptimizerPtr;
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT ConstrainedOptimizationIK : public ConstrainedIK, public boost::enable_shared_from_this<ConstrainedOptimizationIK>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT ConstrainedOptimizationIK : public ConstrainedIK, public std::enable_shared_from_this<ConstrainedOptimizationIK>
     {
     public:
         ConstrainedOptimizationIK(RobotPtr& robot, const RobotNodeSetPtr& nodeSet, float timeout = 0.5, float globalTolerance = std::numeric_limits<float>::quiet_NaN());
@@ -99,7 +99,7 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<ConstrainedOptimizationIK> ConstrainedOptimizationIKPtr;
+    typedef std::shared_ptr<ConstrainedOptimizationIK> ConstrainedOptimizationIKPtr;
 }
 
 
diff --git a/VirtualRobot/IK/ConstrainedStackedIK.h b/VirtualRobot/IK/ConstrainedStackedIK.h
index 12a0f1cb76a59e3cf15652bad53b1ef36c4ea8d4..cd54c81a6dc2f6e2cf9a6743c1595fafd642571c 100644
--- a/VirtualRobot/IK/ConstrainedStackedIK.h
+++ b/VirtualRobot/IK/ConstrainedStackedIK.h
@@ -29,7 +29,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT ConstrainedStackedIK : public ConstrainedIK, public boost::enable_shared_from_this<ConstrainedStackedIK>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT ConstrainedStackedIK : public ConstrainedIK, public std::enable_shared_from_this<ConstrainedStackedIK>
     {
     public:
         ConstrainedStackedIK(RobotPtr& robot, const RobotNodeSetPtr& nodeSet, float stepSize = 0.2f, int maxIterations = 1000,
@@ -50,6 +50,6 @@ namespace VirtualRobot
         float stepSize;
     };
 
-    typedef boost::shared_ptr<ConstrainedStackedIK> ConstrainedStackedIKPtr;
+    typedef std::shared_ptr<ConstrainedStackedIK> ConstrainedStackedIKPtr;
 }
 
diff --git a/VirtualRobot/IK/Constraint.h b/VirtualRobot/IK/Constraint.h
index 807ad4d881bc16aeb9e9aa3bc9f2ca8786b5e2c6..2aee19a9414958388d1d116ce4cc95d22b61f896 100644
--- a/VirtualRobot/IK/Constraint.h
+++ b/VirtualRobot/IK/Constraint.h
@@ -40,7 +40,7 @@ namespace VirtualRobot
             bool soft;
     };
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT Constraint : public JacobiProvider, public boost::enable_shared_from_this<Constraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT Constraint : public JacobiProvider, public std::enable_shared_from_this<Constraint>
     {
     public:
         Constraint(const RobotNodeSetPtr& nodeSet);
@@ -95,6 +95,6 @@ namespace VirtualRobot
         float optimizationFunctionFactor;
     };
 
-    typedef boost::shared_ptr<Constraint> ConstraintPtr;
+    typedef std::shared_ptr<Constraint> ConstraintPtr;
 }
 
diff --git a/VirtualRobot/IK/DifferentialIK.cpp b/VirtualRobot/IK/DifferentialIK.cpp
index 31aff3cf205cc3034c17a8d2be7a070c8b1c8577..af52842fd5ec30d279319ccdc446b881072eb213 100644
--- a/VirtualRobot/IK/DifferentialIK.cpp
+++ b/VirtualRobot/IK/DifferentialIK.cpp
@@ -7,6 +7,9 @@
 #include "../VirtualRobotException.h"
 #include "../CollisionDetection/CollisionChecker.h"
 
+#include <boost/math/special_functions/fpclassify.hpp>
+
+#include <Eigen/Geometry>
 
 #include <algorithm>
 #include <cfloat>
@@ -15,6 +18,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     DifferentialIK::DifferentialIK(RobotNodeSetPtr _rns, RobotNodePtr _coordSystem, JacobiProvider::InverseJacobiMethod invJacMethod, float invParam) :
         JacobiProvider(_rns, invJacMethod), invParam(invParam), coordSystem(_coordSystem), nRows(0)
@@ -62,7 +67,7 @@ namespace VirtualRobot
         this->tolerancePosition[tcp] = tolerancePosition;
         this->toleranceRotation[tcp] = toleranceRotation;
 
-        RobotNodePtr tcpRN = boost::dynamic_pointer_cast<RobotNode>(tcp);
+        RobotNodePtr tcpRN = std::dynamic_pointer_cast<RobotNode>(tcp);
 
         if (!tcpRN)
         {
@@ -72,7 +77,7 @@ namespace VirtualRobot
                 return;
             }
 
-            tcpRN = boost::dynamic_pointer_cast<RobotNode>(tcp->getParent());
+            tcpRN = std::dynamic_pointer_cast<RobotNode>(tcp->getParent());
 
             if (!tcpRN)
             {
@@ -329,7 +334,7 @@ namespace VirtualRobot
 
         //  THROW_VR_EXCEPTION_IF(!tcp,boost::format("No tcp defined in node set \"%1%\" of robot %2% (DifferentialIK::%3% )") % this->rns->getName() % this->rns->getRobot()->getName() % BOOST_CURRENT_FUNCTION);
 
-        RobotNodePtr tcpRN = boost::dynamic_pointer_cast<RobotNode>(tcp);
+        RobotNodePtr tcpRN = std::dynamic_pointer_cast<RobotNode>(tcp);
 
         if (!tcpRN)
         {
@@ -340,7 +345,7 @@ namespace VirtualRobot
                 return;
             }
 
-            tcpRN = boost::dynamic_pointer_cast<RobotNode>(tcp->getParent());
+            tcpRN = std::dynamic_pointer_cast<RobotNode>(tcp->getParent());
 
             if (!tcpRN)
             {
@@ -382,8 +387,8 @@ namespace VirtualRobot
                 if (dof->isRotationalJoint())
                 {
                     // get axis
-                    boost::shared_ptr<RobotNodeRevolute> revolute
-                        = boost::dynamic_pointer_cast<RobotNodeRevolute>(dof);
+                    std::shared_ptr<RobotNodeRevolute> revolute
+                        = std::dynamic_pointer_cast<RobotNodeRevolute>(dof);
                     THROW_VR_EXCEPTION_IF(!revolute, "Internal error: expecting revolute joint");
                     // todo: find a better way of handling different joint types
                     axis = revolute->getJointRotationAxis(coordSystem);
@@ -422,8 +427,8 @@ namespace VirtualRobot
                 else if (dof->isTranslationalJoint())
                 {
                     // -> prismatic joint
-                    boost::shared_ptr<RobotNodePrismatic> prismatic
-                        = boost::dynamic_pointer_cast<RobotNodePrismatic>(dof);
+                    std::shared_ptr<RobotNodePrismatic> prismatic
+                        = std::dynamic_pointer_cast<RobotNodePrismatic>(dof);
                     THROW_VR_EXCEPTION_IF(!prismatic, "Internal error: expecting prismatic joint");
                     // todo: find a better way of handling different joint types
                     axis = prismatic->getJointTranslationDirection(coordSystem);
@@ -609,7 +614,7 @@ namespace VirtualRobot
 
         for (auto tcp : tcp_set)
         {
-            RobotNodePtr tcpRN = boost::dynamic_pointer_cast<RobotNode>(tcp);
+            RobotNodePtr tcpRN = std::dynamic_pointer_cast<RobotNode>(tcp);
 
             if (!tcpRN)
             {
diff --git a/VirtualRobot/IK/DifferentialIK.h b/VirtualRobot/IK/DifferentialIK.h
index 183396e0d58480e71ad214237c046d9aa93cfb22..f8f847e2b73d4c8a578a7700eccac8b7cd7fd9f3 100644
--- a/VirtualRobot/IK/DifferentialIK.h
+++ b/VirtualRobot/IK/DifferentialIK.h
@@ -104,7 +104,7 @@ namespace VirtualRobot
         @endcode
     */
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT DifferentialIK : public JacobiProvider, public boost::enable_shared_from_this<DifferentialIK>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT DifferentialIK : public JacobiProvider, public std::enable_shared_from_this<DifferentialIK>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -335,6 +335,6 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<DifferentialIK> DifferentialIKPtr;
+    typedef std::shared_ptr<DifferentialIK> DifferentialIKPtr;
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/FeetPosture.h b/VirtualRobot/IK/FeetPosture.h
index 5ef6f7d9f5786a7db2d66f69323b68193944d7f4..4da49eb1f3d8866998883395219cc1551c805a60 100644
--- a/VirtualRobot/IK/FeetPosture.h
+++ b/VirtualRobot/IK/FeetPosture.h
@@ -37,7 +37,7 @@ namespace VirtualRobot
             * The TCPs of both feet
             * the Cartesian relation of both feet when applying the posture
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT FeetPosture : public boost::enable_shared_from_this<FeetPosture>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT FeetPosture : public std::enable_shared_from_this<FeetPosture>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -88,7 +88,7 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<FeetPosture> FeetPosturePtr;
+    typedef std::shared_ptr<FeetPosture> FeetPosturePtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/GazeIK.cpp b/VirtualRobot/IK/GazeIK.cpp
index bd66a54c81eee8e7b4b2bb57ad3909c45e6a14dc..dcf833bb5ad6cfc2a9b0d6a58d07b5c2b99a9e4a 100644
--- a/VirtualRobot/IK/GazeIK.cpp
+++ b/VirtualRobot/IK/GazeIK.cpp
@@ -4,6 +4,8 @@
 #include <VirtualRobot/RobotNodeSet.h>
 #include <VirtualRobot/Random.h>
 
+#include <boost/math/special_functions/fpclassify.hpp>
+
 #include <algorithm>
 #include <cfloat>
 
diff --git a/VirtualRobot/IK/GazeIK.h b/VirtualRobot/IK/GazeIK.h
index d3ea8fce2a23ddff991aa860460079e80eb75046..0b96c62f8c906ab3cd53bd11b7db776485ffb035 100644
--- a/VirtualRobot/IK/GazeIK.h
+++ b/VirtualRobot/IK/GazeIK.h
@@ -40,7 +40,7 @@ namespace VirtualRobot
         of the end point is at the requested gaze position.
         By default joint limit avoidance is considered as secondary task in order to generate more naturally looking configurations.
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT GazeIK : public boost::enable_shared_from_this<GazeIK>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT GazeIK : public std::enable_shared_from_this<GazeIK>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -109,7 +109,7 @@ namespace VirtualRobot
         bool verbose;
     };
 
-    typedef boost::shared_ptr<GazeIK> GazeIKPtr;
+    typedef std::shared_ptr<GazeIK> GazeIKPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/GenericIKSolver.h b/VirtualRobot/IK/GenericIKSolver.h
index 27cad396023a31b19518a5cf2ba4c10876be25ce..7d45161b1371866f4b66a5268cffaedca0a1f0f9 100644
--- a/VirtualRobot/IK/GenericIKSolver.h
+++ b/VirtualRobot/IK/GenericIKSolver.h
@@ -90,6 +90,6 @@ namespace VirtualRobot
         float initialTranslationalJointValue;
     };
 
-    typedef boost::shared_ptr<GenericIKSolver> GenericIKSolverPtr;
+    typedef std::shared_ptr<GenericIKSolver> GenericIKSolverPtr;
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/HierarchicalIK.h b/VirtualRobot/IK/HierarchicalIK.h
index 69ed14c246f3a6629f3b3a96c1a8d5ea6899adaa..a1ed207daa75f8bc8e2e95ed9de0647c67776368 100644
--- a/VirtualRobot/IK/HierarchicalIK.h
+++ b/VirtualRobot/IK/HierarchicalIK.h
@@ -41,7 +41,7 @@ namespace VirtualRobot
         Advanced Robotics, 1991. 'Robots in Unstructured Environments', 91 ICAR., Fifth International Conference on
 
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT HierarchicalIK : public boost::enable_shared_from_this<HierarchicalIK>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT HierarchicalIK : public std::enable_shared_from_this<HierarchicalIK>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -68,7 +68,7 @@ namespace VirtualRobot
         JacobiProvider::InverseJacobiMethod method;
     };
 
-    typedef boost::shared_ptr<HierarchicalIK> HierarchicalIKPtr;
+    typedef std::shared_ptr<HierarchicalIK> HierarchicalIKPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/HierarchicalIKSolver.h b/VirtualRobot/IK/HierarchicalIKSolver.h
index 17edbc86af2b4c3cbaeaf68f6fd4a23108ebeed2..70ac0ba0def48f147dbcc6017063c3578e130b73 100644
--- a/VirtualRobot/IK/HierarchicalIKSolver.h
+++ b/VirtualRobot/IK/HierarchicalIKSolver.h
@@ -4,7 +4,7 @@
 
 using namespace VirtualRobot;
 
-class HierarchicalIKSolver : public HierarchicalIK, public boost::enable_shared_from_this<HierarchicalIKSolver>
+class HierarchicalIKSolver : public HierarchicalIK, public std::enable_shared_from_this<HierarchicalIKSolver>
 {
 
 public:
@@ -20,4 +20,4 @@ protected:
     std::vector<JacobiProviderPtr> jacobies;
 };
 
-typedef boost::shared_ptr<HierarchicalIKSolver> HierarchicalIKSolverPtr;
+typedef std::shared_ptr<HierarchicalIKSolver> HierarchicalIKSolverPtr;
diff --git a/VirtualRobot/IK/IKSolver.h b/VirtualRobot/IK/IKSolver.h
index 0653eb0e0969a7bc37e186d17dbdd6c29cd939c2..e09a5e74685d85ef53a55733f7b003019c660eaf 100644
--- a/VirtualRobot/IK/IKSolver.h
+++ b/VirtualRobot/IK/IKSolver.h
@@ -36,7 +36,7 @@ namespace VirtualRobot
     /*!
         Abstract IK solver interface.
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT IKSolver : public boost::enable_shared_from_this<IKSolver>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT IKSolver : public std::enable_shared_from_this<IKSolver>
     {
     public:
 
@@ -57,7 +57,7 @@ namespace VirtualRobot
         IKSolver();
     };
 
-    typedef boost::shared_ptr<IKSolver> IKSolverPtr;
+    typedef std::shared_ptr<IKSolver> IKSolverPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/JacobiProvider.cpp b/VirtualRobot/IK/JacobiProvider.cpp
index 93f894bd38f42ec6c52dd3ffc1f5d1a894a97307..169056b97083c27f48e9f71aa0cedd763faf727c 100644
--- a/VirtualRobot/IK/JacobiProvider.cpp
+++ b/VirtualRobot/IK/JacobiProvider.cpp
@@ -9,6 +9,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     JacobiProvider::JacobiProvider(RobotNodeSetPtr rns, InverseJacobiMethod invJacMethod) :
         name("JacobiProvvider"), rns(rns), inverseMethod(invJacMethod)
diff --git a/VirtualRobot/IK/JacobiProvider.h b/VirtualRobot/IK/JacobiProvider.h
index a7ed6f7c97a6c946232c662205acfce08a4c0634..99b8bb21a6caf31980ad27fdc09a9e8f08afb547 100644
--- a/VirtualRobot/IK/JacobiProvider.h
+++ b/VirtualRobot/IK/JacobiProvider.h
@@ -34,7 +34,7 @@ namespace VirtualRobot
 {
 
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT JacobiProvider : public boost::enable_shared_from_this<JacobiProvider>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT JacobiProvider : public std::enable_shared_from_this<JacobiProvider>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -120,6 +120,6 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<JacobiProvider> JacobiProviderPtr;
+    typedef std::shared_ptr<JacobiProvider> JacobiProviderPtr;
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/JointLimitAvoidanceJacobi.h b/VirtualRobot/IK/JointLimitAvoidanceJacobi.h
index 681a09f8f50a98f169ba189ee82d0d20ee6eb010..c38c0f66039a25a5da406dbc8acc7120d6c81d25 100644
--- a/VirtualRobot/IK/JointLimitAvoidanceJacobi.h
+++ b/VirtualRobot/IK/JointLimitAvoidanceJacobi.h
@@ -33,7 +33,7 @@ namespace VirtualRobot
     /*!
             This class creates a dummy Jacobian matrix (identity) that can be used to specify a joint space task (e.g. a joint limit avoidance task)
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT JointLimitAvoidanceJacobi : public VirtualRobot::JacobiProvider, public boost::enable_shared_from_this<JointLimitAvoidanceJacobi>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT JointLimitAvoidanceJacobi : public VirtualRobot::JacobiProvider, public std::enable_shared_from_this<JointLimitAvoidanceJacobi>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -59,7 +59,7 @@ namespace VirtualRobot
         std::vector<RobotNodePtr> nodes;
     };
 
-    typedef boost::shared_ptr<JointLimitAvoidanceJacobi> JointLimitAvoidanceJacobiPtr;
+    typedef std::shared_ptr<JointLimitAvoidanceJacobi> JointLimitAvoidanceJacobiPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/PoseQualityExtendedManipulability.cpp b/VirtualRobot/IK/PoseQualityExtendedManipulability.cpp
index e886a5c6e3054b21886b50753151c88f992a617f..0b230abc8d8b747efc1f40adddf68ae6c7824cf7 100644
--- a/VirtualRobot/IK/PoseQualityExtendedManipulability.cpp
+++ b/VirtualRobot/IK/PoseQualityExtendedManipulability.cpp
@@ -1,6 +1,8 @@
 
 #include "PoseQualityExtendedManipulability.h"
 
+#include <boost/math/special_functions/fpclassify.hpp>
+
 #include <Eigen/Geometry>
 #include <Eigen/Dense>
 #include <cfloat>
diff --git a/VirtualRobot/IK/PoseQualityExtendedManipulability.h b/VirtualRobot/IK/PoseQualityExtendedManipulability.h
index 2cbb32b296f3095b613231f216fe6469cf42af61..a1cfac8c145236c68e2db147cb2842eade6cc2ca 100644
--- a/VirtualRobot/IK/PoseQualityExtendedManipulability.h
+++ b/VirtualRobot/IK/PoseQualityExtendedManipulability.h
@@ -186,7 +186,7 @@ namespace VirtualRobot
         std::vector<RobotNodePtr> joints;
     };
 
-    typedef boost::shared_ptr<PoseQualityExtendedManipulability> PoseQualityExtendedManipulabilityPtr;
+    typedef std::shared_ptr<PoseQualityExtendedManipulability> PoseQualityExtendedManipulabilityPtr;
 
 }
 
diff --git a/VirtualRobot/IK/StackedIK.h b/VirtualRobot/IK/StackedIK.h
index 1f7741f7b7c04d85c1e85867dbb2954c7d6604bb..b4355ef56b00a2cde778ee9fc19066cdb6e2b121 100644
--- a/VirtualRobot/IK/StackedIK.h
+++ b/VirtualRobot/IK/StackedIK.h
@@ -31,7 +31,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT StackedIK : public boost::enable_shared_from_this<StackedIK>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT StackedIK : public std::enable_shared_from_this<StackedIK>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -50,7 +50,7 @@ namespace VirtualRobot
         bool verbose;
     };
 
-    typedef boost::shared_ptr<StackedIK> StackedIKPtr;
+    typedef std::shared_ptr<StackedIK> StackedIKPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/SupportPolygon.h b/VirtualRobot/IK/SupportPolygon.h
index 5f1de5edca33347f7fc70ba7705198866cfab766..b30df174d427508c630c44ef0af00c9bfac4cb8e 100644
--- a/VirtualRobot/IK/SupportPolygon.h
+++ b/VirtualRobot/IK/SupportPolygon.h
@@ -37,7 +37,7 @@ namespace VirtualRobot
             In this implementation, contacts are defined as all surface points of the passed collision models which have
             a distance to MathTools::FloorPlane that is lower than 5mm.
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT SupportPolygon : public boost::enable_shared_from_this<SupportPolygon>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT SupportPolygon : public std::enable_shared_from_this<SupportPolygon>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -73,7 +73,7 @@ namespace VirtualRobot
         MathTools::ConvexHull2DPtr suportPolygonFloor;
     };
 
-    typedef boost::shared_ptr<SupportPolygon> SupportPolygonPtr;
+    typedef std::shared_ptr<SupportPolygon> SupportPolygonPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/IK/constraints/BalanceConstraint.cpp b/VirtualRobot/IK/constraints/BalanceConstraint.cpp
index 9a4bb5229241e5b9293faaa2b097548ed1cf2586..ab399f1a275beccef6650986280b9a132cfa78a9 100644
--- a/VirtualRobot/IK/constraints/BalanceConstraint.cpp
+++ b/VirtualRobot/IK/constraints/BalanceConstraint.cpp
@@ -27,6 +27,9 @@
 
 using namespace VirtualRobot;
 
+using std::cout;
+using std::endl;
+
 BalanceConstraintOptimizationFunction::BalanceConstraintOptimizationFunction(const SupportPolygonPtr &supportPolygon) :
     supportPolygon(supportPolygon)
 {
diff --git a/VirtualRobot/IK/constraints/BalanceConstraint.h b/VirtualRobot/IK/constraints/BalanceConstraint.h
index be1846ef1016613a5ab9fc21720029c48897176d..e3ad38d15105e3beaee32e937b65f96f4dfc5c61 100644
--- a/VirtualRobot/IK/constraints/BalanceConstraint.h
+++ b/VirtualRobot/IK/constraints/BalanceConstraint.h
@@ -55,9 +55,9 @@ namespace VirtualRobot
         std::vector<Eigen::Matrix2f> matrices;
         std::vector<Eigen::Vector2f> displacements;
     };
-    typedef boost::shared_ptr<BalanceConstraintOptimizationFunction> BalanceConstraintOptimizationFunctionPtr;
+    typedef std::shared_ptr<BalanceConstraintOptimizationFunction> BalanceConstraintOptimizationFunctionPtr;
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT BalanceConstraint : public Constraint, public boost::enable_shared_from_this<BalanceConstraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT BalanceConstraint : public Constraint, public std::enable_shared_from_this<BalanceConstraint>
     {
     public:
         BalanceConstraint(const RobotPtr& robot, const RobotNodeSetPtr& joints, const RobotNodeSetPtr& bodies, const SceneObjectSetPtr& contactNodes,
@@ -108,6 +108,6 @@ namespace VirtualRobot
         BalanceConstraintOptimizationFunctionPtr differnentiableStability;
     };
 
-    typedef boost::shared_ptr<BalanceConstraint> BalanceConstraintPtr;
+    typedef std::shared_ptr<BalanceConstraint> BalanceConstraintPtr;
 }
 
diff --git a/VirtualRobot/IK/constraints/CoMConstraint.h b/VirtualRobot/IK/constraints/CoMConstraint.h
index 856931508f2b814c7aeb0848ef97e0c532e65137..d41667c81d9d8dc6cfc2b12dcf64a52e2590c2a7 100644
--- a/VirtualRobot/IK/constraints/CoMConstraint.h
+++ b/VirtualRobot/IK/constraints/CoMConstraint.h
@@ -29,7 +29,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT CoMConstraint : public Constraint, public boost::enable_shared_from_this<CoMConstraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT CoMConstraint : public Constraint, public std::enable_shared_from_this<CoMConstraint>
     {
     public:
         CoMConstraint(const RobotPtr& robot, const RobotNodeSetPtr& joints, const RobotNodeSetPtr& bodies, const Eigen::Vector3f& target, float tolerance);
@@ -53,7 +53,7 @@ namespace VirtualRobot
         float tolerance;
     };
 
-    typedef boost::shared_ptr<CoMConstraint> CoMConstraintPtr;
+    typedef std::shared_ptr<CoMConstraint> CoMConstraintPtr;
 }
 
 
diff --git a/VirtualRobot/IK/constraints/JointLimitAvoidanceConstraint.h b/VirtualRobot/IK/constraints/JointLimitAvoidanceConstraint.h
index b11716b7229c14f70ca85ab33a5a831863097cee..6a4512d0c7c07d039a3d00c35ce1ef99e538c10d 100644
--- a/VirtualRobot/IK/constraints/JointLimitAvoidanceConstraint.h
+++ b/VirtualRobot/IK/constraints/JointLimitAvoidanceConstraint.h
@@ -28,7 +28,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT JointLimitAvoidanceConstraint : public ReferenceConfigurationConstraint, public boost::enable_shared_from_this<JointLimitAvoidanceConstraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT JointLimitAvoidanceConstraint : public ReferenceConfigurationConstraint, public std::enable_shared_from_this<JointLimitAvoidanceConstraint>
     {
     public:
         JointLimitAvoidanceConstraint(const RobotPtr& robot, const RobotNodeSetPtr& nodeSet);
@@ -37,6 +37,6 @@ namespace VirtualRobot
         Eigen::VectorXf optimizationGradient(unsigned int) override;
     };
 
-    typedef boost::shared_ptr<JointLimitAvoidanceConstraint> JointLimitAvoidanceConstraintPtr;
+    typedef std::shared_ptr<JointLimitAvoidanceConstraint> JointLimitAvoidanceConstraintPtr;
 }
 
diff --git a/VirtualRobot/IK/constraints/OrientationConstraint.h b/VirtualRobot/IK/constraints/OrientationConstraint.h
index 2341be55487b791cd49d6172f851907898f42179..934936a939069a45a9c18fd0146f5b3ad0085dad 100644
--- a/VirtualRobot/IK/constraints/OrientationConstraint.h
+++ b/VirtualRobot/IK/constraints/OrientationConstraint.h
@@ -29,7 +29,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT OrientationConstraint : public Constraint, public boost::enable_shared_from_this<OrientationConstraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT OrientationConstraint : public Constraint, public std::enable_shared_from_this<OrientationConstraint>
     {
     public:
         OrientationConstraint(const RobotPtr& robot, const RobotNodeSetPtr& nodeSet, const SceneObjectPtr& eef, const Eigen::Matrix3f& target,
@@ -51,7 +51,7 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<OrientationConstraint> OrientationConstraintPtr;
+    typedef std::shared_ptr<OrientationConstraint> OrientationConstraintPtr;
 }
 
 
diff --git a/VirtualRobot/IK/constraints/PoseConstraint.h b/VirtualRobot/IK/constraints/PoseConstraint.h
index 8b59a0240e94b8c4dfaddc442d273d786f7a5d6a..c8bfd209683e80c4cbe0200cd47cccc8322ee7a0 100644
--- a/VirtualRobot/IK/constraints/PoseConstraint.h
+++ b/VirtualRobot/IK/constraints/PoseConstraint.h
@@ -29,7 +29,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT PoseConstraint : public Constraint, public boost::enable_shared_from_this<PoseConstraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT PoseConstraint : public Constraint, public std::enable_shared_from_this<PoseConstraint>
     {
     public:
         PoseConstraint(const RobotPtr& robot, const RobotNodeSetPtr& nodeSet, const SceneObjectPtr& eef, const Eigen::Matrix4f& target,
@@ -79,6 +79,6 @@ namespace VirtualRobot
         float posRotTradeoff;
     };
 
-    typedef boost::shared_ptr<PoseConstraint> PoseConstraintPtr;
+    typedef std::shared_ptr<PoseConstraint> PoseConstraintPtr;
 }
 
diff --git a/VirtualRobot/IK/constraints/PositionConstraint.h b/VirtualRobot/IK/constraints/PositionConstraint.h
index accfd43211085660664aa6c6796f48bc0e84f8f8..604ce674ca715908e8966d8f0c972afeb92d6d95 100644
--- a/VirtualRobot/IK/constraints/PositionConstraint.h
+++ b/VirtualRobot/IK/constraints/PositionConstraint.h
@@ -29,7 +29,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT PositionConstraint : public Constraint, public boost::enable_shared_from_this<PositionConstraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT PositionConstraint : public Constraint, public std::enable_shared_from_this<PositionConstraint>
     {
     public:
         PositionConstraint(const RobotPtr& robot, const RobotNodeSetPtr& nodeSet, const SceneObjectPtr& eef, const Eigen::Vector3f& target,
@@ -52,7 +52,7 @@ namespace VirtualRobot
         float tolerance;
     };
 
-    typedef boost::shared_ptr<PositionConstraint> PositionConstraintPtr;
+    typedef std::shared_ptr<PositionConstraint> PositionConstraintPtr;
 }
 
 
diff --git a/VirtualRobot/IK/constraints/ReferenceConfigurationConstraint.h b/VirtualRobot/IK/constraints/ReferenceConfigurationConstraint.h
index d33a50e47166627402a659ab79f3d35d8027661f..8a0f5ab46cd46602496cec58bf57871f1d7284cd 100644
--- a/VirtualRobot/IK/constraints/ReferenceConfigurationConstraint.h
+++ b/VirtualRobot/IK/constraints/ReferenceConfigurationConstraint.h
@@ -27,7 +27,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT ReferenceConfigurationConstraint : public Constraint, public boost::enable_shared_from_this<ReferenceConfigurationConstraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT ReferenceConfigurationConstraint : public Constraint, public std::enable_shared_from_this<ReferenceConfigurationConstraint>
     {
     public:
         ReferenceConfigurationConstraint(const RobotPtr& robot, const RobotNodeSetPtr& nodeSet);
@@ -45,6 +45,6 @@ namespace VirtualRobot
         Eigen::VectorXf reference;
     };
 
-    typedef boost::shared_ptr<ReferenceConfigurationConstraint> ReferenceConfigurationConstraintPtr;
+    typedef std::shared_ptr<ReferenceConfigurationConstraint> ReferenceConfigurationConstraintPtr;
 }
 
diff --git a/VirtualRobot/IK/constraints/TSRConstraint.h b/VirtualRobot/IK/constraints/TSRConstraint.h
index b4acaeebe033e8bedd3ecb6f865462f69b4e2d4e..55ed76c9e1a9e31531af65171d38a9f6618ff407 100644
--- a/VirtualRobot/IK/constraints/TSRConstraint.h
+++ b/VirtualRobot/IK/constraints/TSRConstraint.h
@@ -28,7 +28,7 @@
 
 namespace VirtualRobot
 {
-    class VIRTUAL_ROBOT_IMPORT_EXPORT TSRConstraint : public Constraint, public boost::enable_shared_from_this<TSRConstraint>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT TSRConstraint : public Constraint, public std::enable_shared_from_this<TSRConstraint>
     {
     public:
         TSRConstraint(const RobotPtr& robot, const RobotNodeSetPtr& nodeSet, const RobotNodePtr& eef,
@@ -74,6 +74,6 @@ namespace VirtualRobot
         Eigen::VectorXf scalingVec;
     };
 
-    typedef boost::shared_ptr<TSRConstraint> TSRConstraintPtr;
+    typedef std::shared_ptr<TSRConstraint> TSRConstraintPtr;
 }
 
diff --git a/VirtualRobot/Import/COLLADA-light/ColladaSimox.cpp b/VirtualRobot/Import/COLLADA-light/ColladaSimox.cpp
index 9e114dc4537659923240d966eab5fa471252216e..e5733d7a20fa3e471547d8b05b92674d35fea9a7 100644
--- a/VirtualRobot/Import/COLLADA-light/ColladaSimox.cpp
+++ b/VirtualRobot/Import/COLLADA-light/ColladaSimox.cpp
@@ -8,6 +8,8 @@
 #include "inventor.h"
 #include "ColladaSimox.h"
 
+#include <boost/foreach.hpp>
+
 #include <Eigen/Dense>
 #include <Eigen/Geometry>
 
diff --git a/VirtualRobot/Import/COLLADA-light/collada.cpp b/VirtualRobot/Import/COLLADA-light/collada.cpp
index b785b4a12aa1d417479e464d873f85a46595f2b8..18e70fe78d7909b316b52691842544f27172cd60 100644
--- a/VirtualRobot/Import/COLLADA-light/collada.cpp
+++ b/VirtualRobot/Import/COLLADA-light/collada.cpp
@@ -45,7 +45,9 @@
 #include <cmath>
 
 
-
+#include <boost/algorithm/string.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
 
 
 #ifdef TIMER_DEBUG
@@ -71,6 +73,36 @@ using namespace std;
 namespace Collada
 {
 
+    template<>
+    std::vector<int> getVector(std::string text)
+    {
+        std::vector<std::string> splitted;
+        boost::algorithm::trim(text);
+        std::vector<int> result;
+        boost::algorithm::split(splitted, text, boost::algorithm::is_space());
+        for (std::string const& number : splitted)
+        {
+            result.push_back(boost::lexical_cast<int>(number));
+        }
+
+        return result;
+    }
+
+    template<>
+    std::vector<float> getVector(std::string text)
+    {
+        std::vector<std::string> splitted;
+        boost::algorithm::trim(text);
+        std::vector<float> result;
+        boost::algorithm::split(splitted, text, boost::algorithm::is_space());
+        for (std::string const& number : splitted)
+        {
+            result.push_back(boost::lexical_cast<float>(number));
+        }
+
+        return result;
+    }
+
     std::ostream& operator<<(std::ostream& os, const ColladaRobotNode& node)
     {
         //std::cout
diff --git a/VirtualRobot/Import/COLLADA-light/collada.h b/VirtualRobot/Import/COLLADA-light/collada.h
index b68872c80fe5bde4e2408383c5ecffb83e709ba6..e9fd30e221479667a3e83739a0ee4ea0e93f0ea9 100644
--- a/VirtualRobot/Import/COLLADA-light/collada.h
+++ b/VirtualRobot/Import/COLLADA-light/collada.h
@@ -4,14 +4,7 @@
 #include "pugixml/pugixml.hpp"
 #include <map>
 #include <vector>
-
-#ifndef Q_MOC_RUN
-#include <boost/shared_ptr.hpp>
-#include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/foreach.hpp>
-#endif
-
+#include <memory>
 
 #define COLLADA_IMPORT_USE_SENSORS
 
@@ -22,7 +15,7 @@ namespace Collada
     typedef std::vector<pugi::xml_node> XmlNodeVector;
 
     struct ColladaRobotNode;
-    typedef boost::shared_ptr<ColladaRobotNode> ColladaRobotNodePtr;
+    typedef std::shared_ptr<ColladaRobotNode> ColladaRobotNodePtr;
     typedef std::vector<ColladaRobotNodePtr> ColladaRobotNodeSet;
     typedef std::map<pugi::xml_node, ColladaRobotNodePtr> StructureMap;
     typedef std::map<pugi::xml_node, pugi::xml_node> XmlMap;
@@ -60,7 +53,7 @@ namespace Collada
         StructureMap structureMap;
         XmlMap physicsMap;
     };
-    typedef boost::shared_ptr<ColladaWalker> ColladaWalkerPtr;
+    typedef std::shared_ptr<ColladaWalker> ColladaWalkerPtr;
 
 
     class ColladaRobot
@@ -108,20 +101,7 @@ namespace Collada
 
     /// Obtains a vector by casting each of the strings values (separated by spaces)
     template<typename T>
-    std::vector<T> getVector(std::string text)
-    {
-        std::vector<std::string> splitted;
-        boost::algorithm::trim(text);
-        std::vector<T> result;
-        boost::algorithm::split(splitted, text, boost::algorithm::is_space());
-        BOOST_FOREACH(std::string number, splitted)
-        {
-            result.push_back(boost::lexical_cast<T>(number));
-        }
-
-
-        return result;
-    }
+    std::vector<T> getVector(std::string text);
 
     template<typename T>
     struct TraversalStack
diff --git a/VirtualRobot/Import/COLLADA-light/inventor.cpp b/VirtualRobot/Import/COLLADA-light/inventor.cpp
index aa44832ee1e182e4eaf99dc49287b1b1e811842e..8619d9ccbd34d8e64a2e518014cd6e7964637510 100644
--- a/VirtualRobot/Import/COLLADA-light/inventor.cpp
+++ b/VirtualRobot/Import/COLLADA-light/inventor.cpp
@@ -20,6 +20,8 @@
 
 #include <Inventor/actions/SoGetBoundingBoxAction.h>
 
+#include <boost/lexical_cast.hpp>
+
 #include <iostream>
 
 #ifdef TIMER_DEBUG
@@ -121,7 +123,7 @@ namespace Collada
         if (this->parent)
         {
             cout << "Parent of " << this->name << " is " << this->parent->name << endl;
-            boost::dynamic_pointer_cast<InventorRobotNode>(this->parent)->visualization->addChild(this->visualization);
+            std::dynamic_pointer_cast<InventorRobotNode>(this->parent)->visualization->addChild(this->visualization);
         }
         else
         {
@@ -129,7 +131,7 @@ namespace Collada
             root->addChild(this->visualization);
         }
 
-        BOOST_FOREACH(pugi::xml_node node, this->preJoint)
+        for (pugi::xml_node const& node : this->preJoint)
         {
             addTransform(this->preJointTransformation, node);
         }
@@ -172,7 +174,7 @@ namespace Collada
     std::map<std::string, std::vector<float> > addMaterials(const pugi::xml_node& igeometry)
     {
         std::map<std::string, std::vector<float> > colormap;
-        BOOST_FOREACH(pugi::xpath_node imaterial, igeometry.select_nodes(".//instance_material"))
+        for (pugi::xpath_node const& imaterial : igeometry.select_nodes(".//instance_material"))
         {
             std::vector<float> diffuse_color = {0.5, 0.5, 0.5, 1};
             std::string symbol = imaterial.node().attribute("symbol").value();
@@ -219,7 +221,7 @@ namespace Collada
             //                return;
         }
 
-        BOOST_FOREACH(pugi::xpath_node polylist, mesh.select_nodes(".//polylist"))
+        for (pugi::xpath_node const& polylist : mesh.select_nodes(".//polylist"))
         {
             //std::cout << "id: " << geometry.attribute("id").value() << std::endl;
             std::vector<float> color;
@@ -343,7 +345,7 @@ namespace Collada
 
         if (structureMap.count(node))
         {
-            stack.back() = boost::dynamic_pointer_cast<InventorRobotNode>(structureMap[node])->visualization;
+            stack.back() = std::dynamic_pointer_cast<InventorRobotNode>(structureMap[node])->visualization;
             parents.push_back(structureMap[node]);
         }
         else
@@ -362,21 +364,21 @@ namespace Collada
     void InventorRobot::addCollisionModel(ColladaRobotNodePtr robotNode, pugi::xml_node RigidBodyNode)
     {
 
-        boost::shared_ptr<InventorRobotNode> inventorRobotNode = boost::dynamic_pointer_cast<InventorRobotNode>(robotNode);
+        std::shared_ptr<InventorRobotNode> inventorRobotNode = std::dynamic_pointer_cast<InventorRobotNode>(robotNode);
         SoSeparator* rigidBodySep = new SoSeparator;
         inventorRobotNode->collisionModel->addChild(rigidBodySep);
         // An additional Separator is necessary if there are multiple rigid bodies attached to the same joint
 
 
-        BOOST_FOREACH(pugi::xpath_node transformation, RigidBodyNode.select_nodes(".//mass_frame/translate|.//mass_frame/rotate"))
-        addTransform(rigidBodySep, transformation.node());
+        for (pugi::xpath_node const& transformation : RigidBodyNode.select_nodes(".//mass_frame/translate|.//mass_frame/rotate"))
+            addTransform(rigidBodySep, transformation.node());
 
-        BOOST_FOREACH(pugi::xpath_node shape, RigidBodyNode.select_nodes(".//shape"))
+        for (pugi::xpath_node const& shape : RigidBodyNode.select_nodes(".//shape"))
         {
             SoSeparator* separator  = new SoSeparator;
             rigidBodySep->addChild(separator);
-            BOOST_FOREACH(pugi::xpath_node transformation, shape.node().select_nodes(".//translate|.//rotate"))
-            addTransform(separator, transformation.node());
+            for (pugi::xpath_node const& transformation : shape.node().select_nodes(".//translate|.//rotate"))
+                addTransform(separator, transformation.node());
             addGeometry(separator, shape.node().child("instance_geometry"));
         }
     }
diff --git a/VirtualRobot/Import/MeshImport/AssimpReader.cpp b/VirtualRobot/Import/MeshImport/AssimpReader.cpp
index f8bb5c6fa47d3b29b1d46b85a420486215b2d99b..dbe01e17a72418dbae2b7d59aa3d7a3e12f36e34 100644
--- a/VirtualRobot/Import/MeshImport/AssimpReader.cpp
+++ b/VirtualRobot/Import/MeshImport/AssimpReader.cpp
@@ -206,7 +206,7 @@ namespace VirtualRobot
 
     TriMeshModelPtr AssimpReader::readFileAsTriMesh(const std::string& filename)
     {
-        auto tri = boost::make_shared<TriMeshModel>();
+        auto tri = std::make_shared<TriMeshModel>();
         if (!readFileAsTriMesh(filename, tri))
         {
             return nullptr;
@@ -216,7 +216,7 @@ namespace VirtualRobot
 
     TriMeshModelPtr AssimpReader::readBufferAsTriMesh(const std::string_view& v)
     {
-        auto tri = boost::make_shared<TriMeshModel>();
+        auto tri = std::make_shared<TriMeshModel>();
         if (!readBufferAsTriMesh(v, tri))
         {
             return nullptr;
@@ -228,7 +228,7 @@ namespace VirtualRobot
     {
         if (auto tri = readFileAsTriMesh(filename))
         {
-            return boost::make_shared<ManipulationObject>(name, tri, filename);
+            return std::make_shared<ManipulationObject>(name, tri, filename);
         }
         return nullptr;
     }
@@ -236,7 +236,7 @@ namespace VirtualRobot
     {
         if (auto tri = readBufferAsTriMesh(v))
         {
-            return boost::make_shared<ManipulationObject>(name, tri);
+            return std::make_shared<ManipulationObject>(name, tri);
         }
         return nullptr;
     }
diff --git a/VirtualRobot/Import/MeshImport/AssimpReader.h b/VirtualRobot/Import/MeshImport/AssimpReader.h
index b995052eb6c43f6014e3739d2cf9ac8d3559b79e..1de2490d988788f7bbf8acdcb03ac65a777bd6a4 100644
--- a/VirtualRobot/Import/MeshImport/AssimpReader.h
+++ b/VirtualRobot/Import/MeshImport/AssimpReader.h
@@ -4,6 +4,7 @@
 
 #include <stdio.h>
 #include <string>
+#include <cfloat>
 
 struct aiScene;
 
@@ -53,6 +54,6 @@ namespace VirtualRobot
         ResultMetaData resultMetaData;
     };
 
-    typedef boost::shared_ptr<AssimpReader> AssimpReaderPtr;
+    typedef std::shared_ptr<AssimpReader> AssimpReaderPtr;
 }
 
diff --git a/VirtualRobot/Import/RobotImporterFactory.cpp b/VirtualRobot/Import/RobotImporterFactory.cpp
index bd6997e27c02d73c7fa968e106d067acbc4e9c7a..562125064ec1650bcf9c47e646cd4272be1f7228 100644
--- a/VirtualRobot/Import/RobotImporterFactory.cpp
+++ b/VirtualRobot/Import/RobotImporterFactory.cpp
@@ -23,7 +23,7 @@
 #include "RobotImporterFactory.h"
 #include <Eigen/Core>
 
-
+#include <boost/algorithm/string/join.hpp>
 
 
 using namespace std;
@@ -34,7 +34,7 @@ namespace VirtualRobot
     string RobotImporterFactory::getAllFileFilters()
     {
         vector<string> filter;
-        BOOST_FOREACH(string subclass, RobotImporterFactory::getSubclassList())
+        for (string const& subclass : RobotImporterFactory::getSubclassList())
         {
             filter.push_back(RobotImporterFactory::fromName(subclass, NULL)->getFileFilter());
         }
@@ -44,7 +44,7 @@ namespace VirtualRobot
     string RobotImporterFactory::getAllExtensions()
     {
         vector<string> filter;
-        BOOST_FOREACH(string subclass, RobotImporterFactory::getSubclassList())
+        for (string const& subclass : RobotImporterFactory::getSubclassList())
         {
             string extension = RobotImporterFactory::fromName(subclass, NULL)->getFileExtension();
             filter.push_back("*." + extension);
@@ -54,7 +54,7 @@ namespace VirtualRobot
 
     RobotImporterFactoryPtr RobotImporterFactory::fromFileExtension(string type, void* params)
     {
-        BOOST_FOREACH(string subclass, RobotImporterFactory::getSubclassList())
+        for (string const& subclass : RobotImporterFactory::getSubclassList())
         {
             string subclassType = RobotImporterFactory::fromName(subclass, NULL)->getFileExtension();
 
diff --git a/VirtualRobot/Import/RobotImporterFactory.h b/VirtualRobot/Import/RobotImporterFactory.h
index 0cee424b2006fece18ad2e5392aba73de71557ed..3e97f6a378d572037d07a0411738975fc51d7dac 100644
--- a/VirtualRobot/Import/RobotImporterFactory.h
+++ b/VirtualRobot/Import/RobotImporterFactory.h
@@ -45,7 +45,7 @@ namespace VirtualRobot
          Other importers (e.g. collada) have to be selected during project setup.
     */
     class RobotImporterFactory;
-    typedef boost::shared_ptr<RobotImporterFactory> RobotImporterFactoryPtr;
+    typedef std::shared_ptr<RobotImporterFactory> RobotImporterFactoryPtr;
     class VIRTUAL_ROBOT_IMPORT_EXPORT RobotImporterFactory  : public AbstractFactoryMethod<RobotImporterFactory, void*>
     {
     public:
diff --git a/VirtualRobot/Import/SimoxCOLLADAFactory.cpp b/VirtualRobot/Import/SimoxCOLLADAFactory.cpp
index 49329820e2effae86c54e264bfd8104c72cf7c86..d7c9512ebbe7310f79617195ad306472ca011760 100644
--- a/VirtualRobot/Import/SimoxCOLLADAFactory.cpp
+++ b/VirtualRobot/Import/SimoxCOLLADAFactory.cpp
@@ -28,14 +28,14 @@ namespace VirtualRobot
         }
         catch (VirtualRobotException& e)
         {
-            cout << " ERROR while creating robot (exception)" << endl;
-            cout << e.what();
+            std::cout << " ERROR while creating robot (exception)" << std::endl;
+            std::cout << e.what();
             return robot;
         }
 
         if (!robot)
         {
-            VR_ERROR << " ERROR while loading robot from file:" << filename << endl;
+            VR_ERROR << " ERROR while loading robot from file:" << filename << std::endl;
         }
 
         return robot;
@@ -69,9 +69,9 @@ namespace VirtualRobot
     /**
      * \return new instance of SimoxCOLLADAFactory.
      */
-    boost::shared_ptr<RobotImporterFactory> SimoxCOLLADAFactory::createInstance(void*)
+    std::shared_ptr<RobotImporterFactory> SimoxCOLLADAFactory::createInstance(void*)
     {
-        boost::shared_ptr<SimoxCOLLADAFactory> COLLADAFactory(new SimoxCOLLADAFactory());
+        std::shared_ptr<SimoxCOLLADAFactory> COLLADAFactory(new SimoxCOLLADAFactory());
         return COLLADAFactory;
     }
 
diff --git a/VirtualRobot/Import/SimoxCOLLADAFactory.h b/VirtualRobot/Import/SimoxCOLLADAFactory.h
index 39108ed7e9c6c89c8c8ce38a18f541800db350a9..18336bea0f3a640c1e79f5d96799d9bdb8b76201 100644
--- a/VirtualRobot/Import/SimoxCOLLADAFactory.h
+++ b/VirtualRobot/Import/SimoxCOLLADAFactory.h
@@ -44,7 +44,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<RobotImporterFactory> createInstance(void*);
+        static std::shared_ptr<RobotImporterFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
 
diff --git a/VirtualRobot/Import/SimoxXMLFactory.cpp b/VirtualRobot/Import/SimoxXMLFactory.cpp
index 15028dfb933c6e3256e4c60153048ad0cfbb055b..b0f409bf83246124f3898550afd5d5c4c40c66f3 100644
--- a/VirtualRobot/Import/SimoxXMLFactory.cpp
+++ b/VirtualRobot/Import/SimoxXMLFactory.cpp
@@ -7,6 +7,7 @@
 
 namespace VirtualRobot
 {
+    using std::endl;
 
     SimoxXMLFactory::SimoxXMLFactory()
     = default;
@@ -57,9 +58,9 @@ namespace VirtualRobot
     /**
      * \return new instance of SimoxXMLFactory.
      */
-    boost::shared_ptr<RobotImporterFactory> SimoxXMLFactory::createInstance(void*)
+    std::shared_ptr<RobotImporterFactory> SimoxXMLFactory::createInstance(void*)
     {
-        boost::shared_ptr<SimoxXMLFactory> xmlFactory(new SimoxXMLFactory());
+        std::shared_ptr<SimoxXMLFactory> xmlFactory(new SimoxXMLFactory());
         return xmlFactory;
     }
 
diff --git a/VirtualRobot/Import/SimoxXMLFactory.h b/VirtualRobot/Import/SimoxXMLFactory.h
index a271f356157296b28718211538752498d7b28425..b3de2221be733ccd254903fc65d774c0584f9536 100644
--- a/VirtualRobot/Import/SimoxXMLFactory.h
+++ b/VirtualRobot/Import/SimoxXMLFactory.h
@@ -44,7 +44,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<RobotImporterFactory> createInstance(void*);
+        static std::shared_ptr<RobotImporterFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
 
diff --git a/VirtualRobot/Import/URDF/SimoxURDFFactory.cpp b/VirtualRobot/Import/URDF/SimoxURDFFactory.cpp
index 0f80bbf279ba4a5e83469cd1c7e0f9b846fd0171..8db9b77606a86666df519b7319626009fdb012bd 100644
--- a/VirtualRobot/Import/URDF/SimoxURDFFactory.cpp
+++ b/VirtualRobot/Import/URDF/SimoxURDFFactory.cpp
@@ -1,6 +1,7 @@
 #include "SimoxURDFFactory.h"
 
 #include <assert.h>
+#include <filesystem>
 #include <iostream>
 #include <map>
 #include <stack>
@@ -82,9 +83,9 @@ namespace VirtualRobot
     /**
      * \return new instance of SimoxURDFFactory.
      */
-    boost::shared_ptr<RobotImporterFactory> SimoxURDFFactory::createInstance(void*)
+    std::shared_ptr<RobotImporterFactory> SimoxURDFFactory::createInstance(void*)
     {
-        boost::shared_ptr<SimoxURDFFactory> URDFFactory(new SimoxURDFFactory());
+        std::shared_ptr<SimoxURDFFactory> URDFFactory(new SimoxURDFFactory());
         return URDFFactory;
     }
 
@@ -206,7 +207,7 @@ namespace VirtualRobot
 
         const float scale = 1000.0f; // mm
         VirtualRobot::VisualizationNodePtr res;
-        boost::shared_ptr<VisualizationFactory> factory = CoinVisualizationFactory::createInstance(NULL);
+        std::shared_ptr<VisualizationFactory> factory = CoinVisualizationFactory::createInstance(NULL);
 
         if (!g)
         {
@@ -217,14 +218,14 @@ namespace VirtualRobot
         {
             case urdf::Geometry::BOX:
             {
-                std::shared_ptr<urdf::Box> b = boost::dynamic_pointer_cast<urdf::Box>(g);
+                std::shared_ptr<urdf::Box> b = std::dynamic_pointer_cast<urdf::Box>(g);
                 res = factory->createBox(b->dim.x * scale, b->dim.y * scale, b->dim.z * scale);
             }
             break;
 
             case urdf::Geometry::SPHERE:
             {
-                std::shared_ptr<urdf::Sphere> s = boost::dynamic_pointer_cast<urdf::Sphere>(g);
+                std::shared_ptr<urdf::Sphere> s = std::dynamic_pointer_cast<urdf::Sphere>(g);
                 res = factory->createSphere(s->radius * scale);
             }
             break;
@@ -232,7 +233,7 @@ namespace VirtualRobot
 
             case urdf::Geometry::CYLINDER:
             {
-                std::shared_ptr<urdf::Cylinder> c = boost::dynamic_pointer_cast<urdf::Cylinder>(g);
+                std::shared_ptr<urdf::Cylinder> c = std::dynamic_pointer_cast<urdf::Cylinder>(g);
                 res = factory->createCylinder(c->radius * scale, c->length * scale);
 
             }
@@ -240,7 +241,7 @@ namespace VirtualRobot
 
             case urdf::Geometry::MESH:
             {
-                std::shared_ptr<urdf::Mesh> m = boost::dynamic_pointer_cast<urdf::Mesh>(g);
+                std::shared_ptr<urdf::Mesh> m = std::dynamic_pointer_cast<urdf::Mesh>(g);
                 std::string filename = getFilename(m->filename, basePath);
                 res = factory->getVisualizationFromFile(filename, false, m->scale.x, m->scale.y, m->scale.z);
             }
@@ -267,7 +268,7 @@ namespace VirtualRobot
     VisualizationNodePtr SimoxURDFFactory::convertVisuArray(std::vector<std::shared_ptr<urdf::Collision> > visu_array, const string& basePath)
     {
         VirtualRobot::VisualizationNodePtr res;
-        boost::shared_ptr<VisualizationFactory> factory = CoinVisualizationFactory::createInstance(NULL);
+        std::shared_ptr<VisualizationFactory> factory = CoinVisualizationFactory::createInstance(NULL);
 
         if (visu_array.size() == 0)
         {
@@ -290,7 +291,7 @@ namespace VirtualRobot
     VisualizationNodePtr SimoxURDFFactory::convertVisuArray(std::vector<std::shared_ptr<urdf::Visual> > visu_array, const string& basePath)
     {
         VirtualRobot::VisualizationNodePtr res;
-        boost::shared_ptr<VisualizationFactory> factory = CoinVisualizationFactory::createInstance(NULL);
+        std::shared_ptr<VisualizationFactory> factory = CoinVisualizationFactory::createInstance(NULL);
 
         if (visu_array.size() == 0)
         {
diff --git a/VirtualRobot/Import/URDF/SimoxURDFFactory.h b/VirtualRobot/Import/URDF/SimoxURDFFactory.h
index ef166910578e10a99adbe09c9bcc6cb641ced2b1..f6c5e1b212589d6ec3a1a72b0acbe92316d70c97 100644
--- a/VirtualRobot/Import/URDF/SimoxURDFFactory.h
+++ b/VirtualRobot/Import/URDF/SimoxURDFFactory.h
@@ -63,7 +63,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<RobotImporterFactory> createInstance(void*);
+        static std::shared_ptr<RobotImporterFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
 
diff --git a/VirtualRobot/LinkedCoordinate.cpp b/VirtualRobot/LinkedCoordinate.cpp
index 7ebbe6fc929381e57a9227ce6cf335575e195233..ceba0c6da039ea6b338d47cdf0286d353a5d1973 100644
--- a/VirtualRobot/LinkedCoordinate.cpp
+++ b/VirtualRobot/LinkedCoordinate.cpp
@@ -1,6 +1,8 @@
 #include "LinkedCoordinate.h"
 #include "Robot.h"
 
+#include <boost/format.hpp>
+
 
 using namespace VirtualRobot;
 using namespace std;
diff --git a/VirtualRobot/ManipulationObject.cpp b/VirtualRobot/ManipulationObject.cpp
index b8552ce0e17e8f6610b36b341e32fd4889d81ec3..aae4771262d0b99125277cada2a0fd462927c272 100644
--- a/VirtualRobot/ManipulationObject.cpp
+++ b/VirtualRobot/ManipulationObject.cpp
@@ -7,6 +7,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     ManipulationObject::ManipulationObject(const std::string& name, VisualizationNodePtr visualization, CollisionModelPtr collisionModel, const SceneObject::Physics& p, CollisionCheckerPtr colChecker)
         : Obstacle(name, visualization, collisionModel, p, colChecker)
diff --git a/VirtualRobot/MathTools.cpp b/VirtualRobot/MathTools.cpp
index 30989790f5d1942afa0a452efc95bd60330c655a..60100a95b081217550e860ce6f17a6a0ad65b242 100644
--- a/VirtualRobot/MathTools.cpp
+++ b/VirtualRobot/MathTools.cpp
@@ -10,6 +10,7 @@
 
 #include <VirtualRobot/Random.h>
 
+#include <boost/math/special_functions/fpclassify.hpp>
 
 #include <Eigen/Geometry>
 
@@ -18,6 +19,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     /*
     void MathTools::Quat2RPY(float *PosQuat, float *storeResult)
diff --git a/VirtualRobot/MathTools.h b/VirtualRobot/MathTools.h
index 91576c632f64dd130f8f5e3cb876a3ed7f4355e4..3203192d4041365d7210008f220c71c4aef80600 100644
--- a/VirtualRobot/MathTools.h
+++ b/VirtualRobot/MathTools.h
@@ -643,7 +643,7 @@ namespace VirtualRobot
             std::vector<Eigen::Vector2f> vertices;
             std::vector<Segment2D> segments;
         };
-        typedef boost::shared_ptr<ConvexHull2D> ConvexHull2DPtr;
+        typedef std::shared_ptr<ConvexHull2D> ConvexHull2DPtr;
 
         struct ConvexHull3D
         {
@@ -654,7 +654,7 @@ namespace VirtualRobot
             Eigen::Vector3f center;
             float maxDistFacetCenter; // maximum distance of faces to center
         };
-        typedef boost::shared_ptr<ConvexHull3D> ConvexHull3DPtr;
+        typedef std::shared_ptr<ConvexHull3D> ConvexHull3DPtr;
 
         struct ConvexHull6D
         {
@@ -663,7 +663,7 @@ namespace VirtualRobot
             float volume;
             ContactPoint center;
         };
-        typedef boost::shared_ptr<ConvexHull6D> ConvexHull6DPtr;
+        typedef std::shared_ptr<ConvexHull6D> ConvexHull6DPtr;
 
 
         // Copyright 2001, softSurfer (www.softsurfer.com)
diff --git a/VirtualRobot/Nodes/CameraSensor.cpp b/VirtualRobot/Nodes/CameraSensor.cpp
index 297a80123b4bbaad96a35cffbe17616b7904af7e..4d5132d2a71d8880eb6f1cf12049ebb6ce0a6e73 100644
--- a/VirtualRobot/Nodes/CameraSensor.cpp
+++ b/VirtualRobot/Nodes/CameraSensor.cpp
@@ -24,7 +24,7 @@ namespace VirtualRobot
     {
         if (printDecoration)
         {
-            cout << "******** CameraSensor ********" << endl;
+            std::cout << "******** CameraSensor ********" << std::endl;
         }
 
         Sensor::print(printChildren, false);
@@ -52,18 +52,18 @@ namespace VirtualRobot
             pre += t;
         }
 
-        ss << pre << "<Sensor type='" << CameraSensorFactory::getName() << "' name='" << name << "'>" << endl;
+        ss << pre << "<Sensor type='" << CameraSensorFactory::getName() << "' name='" << name << "'>" << std::endl;
         std::string pre2 = pre + t;
-        ss << pre << "<Transform>" << endl;
+        ss << pre << "<Transform>" << std::endl;
         ss << BaseIO::toXML(rnTransformation, pre2);
-        ss << pre << "</Transform>" << endl;
+        ss << pre << "</Transform>" << std::endl;
 
         if (visualizationModel)
         {
             ss << visualizationModel->toXML(modelPath, tabs + 1);
         }
 
-        ss << pre << "</Sensor>" << endl;
+        ss << pre << "</Sensor>" << std::endl;
         return ss.str();
     }
 
diff --git a/VirtualRobot/Nodes/CameraSensor.h b/VirtualRobot/Nodes/CameraSensor.h
index 681a171444064c6ba8aee0db72ed6b2af0570476..6250bd9a2634b83caf75cff1c6599a7e2a738a33 100644
--- a/VirtualRobot/Nodes/CameraSensor.h
+++ b/VirtualRobot/Nodes/CameraSensor.h
@@ -29,7 +29,7 @@ namespace VirtualRobot
 {
 
     class CameraSensor;
-    typedef boost::shared_ptr<CameraSensor> CameraSensorPtr;
+    typedef std::shared_ptr<CameraSensor> CameraSensorPtr;
 
 
     /*!
diff --git a/VirtualRobot/Nodes/CameraSensorFactory.cpp b/VirtualRobot/Nodes/CameraSensorFactory.cpp
index a667d1e2e718876251b80b6d580375faf36cfd55..aa57f8fc188f5e24689c9f2c991b9cf3a38d5d26 100644
--- a/VirtualRobot/Nodes/CameraSensorFactory.cpp
+++ b/VirtualRobot/Nodes/CameraSensorFactory.cpp
@@ -9,6 +9,7 @@
 
 namespace VirtualRobot
 {
+    using std::endl;
 
     CameraSensorFactory::CameraSensorFactory()
     = default;
@@ -110,9 +111,9 @@ namespace VirtualRobot
     /**
      * \return new instance of CameraSensorFactory.
      */
-    boost::shared_ptr<SensorFactory> CameraSensorFactory::createInstance(void*)
+    std::shared_ptr<SensorFactory> CameraSensorFactory::createInstance(void*)
     {
-        boost::shared_ptr<CameraSensorFactory> psFactory(new CameraSensorFactory());
+        std::shared_ptr<CameraSensorFactory> psFactory(new CameraSensorFactory());
         return psFactory;
     }
 
diff --git a/VirtualRobot/Nodes/CameraSensorFactory.h b/VirtualRobot/Nodes/CameraSensorFactory.h
index bded9e076bfa439315db3f92af41fe09fa27080c..e902f37c83dd68e93d06687e031e20694c021eb0 100644
--- a/VirtualRobot/Nodes/CameraSensorFactory.h
+++ b/VirtualRobot/Nodes/CameraSensorFactory.h
@@ -51,7 +51,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<SensorFactory> createInstance(void*);
+        static std::shared_ptr<SensorFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
     };
diff --git a/VirtualRobot/Nodes/ConditionedLock.h b/VirtualRobot/Nodes/ConditionedLock.h
index 1ac7f7e54e4799815dfcef311dd7007b19668cd0..e39920f510b33cdeab52b1ec63df6f9535722d26 100755
--- a/VirtualRobot/Nodes/ConditionedLock.h
+++ b/VirtualRobot/Nodes/ConditionedLock.h
@@ -1,6 +1,7 @@
 #pragma once
 
-
+#include <memory>
+#include <mutex>
 
 template <class T>
 class ConditionedLock
@@ -9,8 +10,8 @@ private:
     T _lock;
     bool _enabled;
 public:
-    ConditionedLock(boost::recursive_mutex&   mutex, bool enabled) :
-        _lock(mutex, boost::defer_lock), _enabled(enabled)
+    ConditionedLock(std::recursive_mutex&   mutex, bool enabled) :
+        _lock(mutex, std::defer_lock), _enabled(enabled)
     {
         if (_enabled)
         {
@@ -26,10 +27,10 @@ public:
     }
 };
 
-typedef ConditionedLock<boost::unique_lock<boost::recursive_mutex> > ReadLock;
-typedef ConditionedLock<boost::unique_lock<boost::recursive_mutex> > WriteLock;
+typedef ConditionedLock<std::unique_lock<std::recursive_mutex> > ReadLock;
+typedef ConditionedLock<std::unique_lock<std::recursive_mutex> > WriteLock;
 //typedef ConditionedLock<boost::shared_lock<boost::shared_mutex> > ReadLock;
 //typedef ConditionedLock<boost::unique_lock<boost::shared_mutex> > WriteLock;
-typedef boost::shared_ptr< ReadLock > ReadLockPtr;
-typedef boost::shared_ptr< WriteLock > WriteLockPtr;
+typedef std::shared_ptr< ReadLock > ReadLockPtr;
+typedef std::shared_ptr< WriteLock > WriteLockPtr;
 
diff --git a/VirtualRobot/Nodes/ContactSensor.cpp b/VirtualRobot/Nodes/ContactSensor.cpp
index 48bffdc9695be35f49680b9544bafa8d983f9397..391e6792d6d5eb4e306614130159a06431449919 100644
--- a/VirtualRobot/Nodes/ContactSensor.cpp
+++ b/VirtualRobot/Nodes/ContactSensor.cpp
@@ -21,7 +21,7 @@ namespace VirtualRobot
     {
         if (printDecoration)
         {
-            cout << "******** ContactSensor ********" << endl;
+            std::cout << "******** ContactSensor ********" << std::endl;
         }
 
         Sensor::print(printChildren, false);
@@ -45,7 +45,7 @@ namespace VirtualRobot
             pre += t;
         }
 
-        ss << pre << "<Sensor type='" << ContactSensorFactory::getName() << "'/>" << endl;
+        ss << pre << "<Sensor type='" << ContactSensorFactory::getName() << "'/>" << std::endl;
         std::string pre2 = pre + t;
 
         return ss.str();
diff --git a/VirtualRobot/Nodes/ContactSensor.h b/VirtualRobot/Nodes/ContactSensor.h
index 1f9d41b9d2d8976baa38a63eb2290aaa72475a32..3a0137846027e791ad183db3fd2f06900da459a9 100644
--- a/VirtualRobot/Nodes/ContactSensor.h
+++ b/VirtualRobot/Nodes/ContactSensor.h
@@ -28,7 +28,7 @@ namespace VirtualRobot
 {
 
     class ContactSensor;
-    typedef boost::shared_ptr<ContactSensor> ContactSensorPtr;
+    typedef std::shared_ptr<ContactSensor> ContactSensorPtr;
 
     /*!
      *  This ia a contact sensor that reports all contact points with other objects.
diff --git a/VirtualRobot/Nodes/ContactSensorFactory.cpp b/VirtualRobot/Nodes/ContactSensorFactory.cpp
index 1b1fac58d67ca595f92e16c7fa5150de57ff9b25..2cc94d5d47d6851d718944055384da4aab0294cd 100644
--- a/VirtualRobot/Nodes/ContactSensorFactory.cpp
+++ b/VirtualRobot/Nodes/ContactSensorFactory.cpp
@@ -63,7 +63,7 @@ namespace VirtualRobot
         {
             std::string nodeName = BaseIO::getLowerCase(nodeXML->name());
             {
-                THROW_VR_EXCEPTION("XML definition <" << nodeName << "> not supported in Sensor <" << sensorName << ">." << endl);
+                THROW_VR_EXCEPTION("XML definition <" << nodeName << "> not supported in Sensor <" << sensorName << ">." << std::endl);
             }
 
             nodeXML = nodeXML->next_sibling();
@@ -93,9 +93,9 @@ namespace VirtualRobot
     /**
      * \return new instance of ContactSensorFactory.
      */
-    boost::shared_ptr<SensorFactory> ContactSensorFactory::createInstance(void*)
+    std::shared_ptr<SensorFactory> ContactSensorFactory::createInstance(void*)
     {
-        boost::shared_ptr<ContactSensorFactory> psFactory(new ContactSensorFactory());
+        std::shared_ptr<ContactSensorFactory> psFactory(new ContactSensorFactory());
         return psFactory;
     }
 
diff --git a/VirtualRobot/Nodes/ContactSensorFactory.h b/VirtualRobot/Nodes/ContactSensorFactory.h
index 38cb4d24eab49a7693203281734f51a95b0a37df..dca2df91218d1714068223af05559c401a632f45 100644
--- a/VirtualRobot/Nodes/ContactSensorFactory.h
+++ b/VirtualRobot/Nodes/ContactSensorFactory.h
@@ -50,7 +50,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<SensorFactory> createInstance(void*);
+        static std::shared_ptr<SensorFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
     };
diff --git a/VirtualRobot/Nodes/ForceTorqueSensor.cpp b/VirtualRobot/Nodes/ForceTorqueSensor.cpp
index a6c6f7195961714ca482367cea3bd7ea5d5cecb7..959a68bd5dac42a5851a93cc4a97aee20b6ddf0e 100644
--- a/VirtualRobot/Nodes/ForceTorqueSensor.cpp
+++ b/VirtualRobot/Nodes/ForceTorqueSensor.cpp
@@ -5,6 +5,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     ForceTorqueSensor::ForceTorqueSensor(RobotNodeWeakPtr robotNode,
                                          const std::string& name,
diff --git a/VirtualRobot/Nodes/ForceTorqueSensor.h b/VirtualRobot/Nodes/ForceTorqueSensor.h
index 2eb0934973057c16b5769bd5ee24b2bd66d2503e..7e86af9e76a38939dccb20fa3309e9d98e2abae8 100644
--- a/VirtualRobot/Nodes/ForceTorqueSensor.h
+++ b/VirtualRobot/Nodes/ForceTorqueSensor.h
@@ -29,7 +29,7 @@ namespace VirtualRobot
 {
 
     class ForceTorqueSensor;
-    typedef boost::shared_ptr<ForceTorqueSensor> ForceTorqueSensorPtr;
+    typedef std::shared_ptr<ForceTorqueSensor> ForceTorqueSensorPtr;
 
 
     /*!
@@ -88,7 +88,7 @@ namespace VirtualRobot
         Eigen::VectorXf forceTorqueValues;
     };
 
-    typedef boost::shared_ptr<ForceTorqueSensor> ForceTorqueSensorPtr;
+    typedef std::shared_ptr<ForceTorqueSensor> ForceTorqueSensorPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Nodes/ForceTorqueSensorFactory.cpp b/VirtualRobot/Nodes/ForceTorqueSensorFactory.cpp
index 4958aed4b1fff7a27b8173886c9e9cafbfca95fc..e11d57aa16ae3c890fe1dc3e984c6bf35f5313f1 100644
--- a/VirtualRobot/Nodes/ForceTorqueSensorFactory.cpp
+++ b/VirtualRobot/Nodes/ForceTorqueSensorFactory.cpp
@@ -9,6 +9,7 @@
 
 namespace VirtualRobot
 {
+    using std::endl;
 
     ForceTorqueSensorFactory::ForceTorqueSensorFactory()
     = default;
@@ -110,9 +111,9 @@ namespace VirtualRobot
     /**
      * \return new instance of ForceTorqueSensorFactory.
      */
-    boost::shared_ptr<SensorFactory> ForceTorqueSensorFactory::createInstance(void*)
+    std::shared_ptr<SensorFactory> ForceTorqueSensorFactory::createInstance(void*)
     {
-        boost::shared_ptr<ForceTorqueSensorFactory> psFactory(new ForceTorqueSensorFactory());
+        std::shared_ptr<ForceTorqueSensorFactory> psFactory(new ForceTorqueSensorFactory());
         return psFactory;
     }
 
diff --git a/VirtualRobot/Nodes/ForceTorqueSensorFactory.h b/VirtualRobot/Nodes/ForceTorqueSensorFactory.h
index b7feb84ffd2d93ef695f690e249461b7db2e9677..129c29595b729b408b5be75110165f39054cf3cd 100644
--- a/VirtualRobot/Nodes/ForceTorqueSensorFactory.h
+++ b/VirtualRobot/Nodes/ForceTorqueSensorFactory.h
@@ -49,7 +49,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<SensorFactory> createInstance(void*);
+        static std::shared_ptr<SensorFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
     };
diff --git a/VirtualRobot/Nodes/PositionSensor.cpp b/VirtualRobot/Nodes/PositionSensor.cpp
index fb16be5e084dd002de30879a682c13382b7b29a9..bb9e21656a1acfede1b9e7fda506368e36e8f83c 100644
--- a/VirtualRobot/Nodes/PositionSensor.cpp
+++ b/VirtualRobot/Nodes/PositionSensor.cpp
@@ -25,7 +25,7 @@ namespace VirtualRobot
     {
         if (printDecoration)
         {
-            cout << "******** PositionSensor ********" << endl;
+            std::cout << "******** PositionSensor ********" << std::endl;
         }
 
         Sensor::print(printChildren, false);
@@ -53,19 +53,19 @@ namespace VirtualRobot
             pre += t;
         }
 
-        ss << pre << "<Sensor type='" << PositionSensorFactory::getName() << "' name='" << name << "'>" << endl;
+        ss << pre << "<Sensor type='" << PositionSensorFactory::getName() << "' name='" << name << "'>" << std::endl;
         std::string pre2 = pre + t;
         std::string pre3 = pre2 + t;
-        ss << pre2 << "<Transform>" << endl;
+        ss << pre2 << "<Transform>" << std::endl;
         ss << BaseIO::toXML(rnTransformation, pre3);
-        ss << pre2 << "</Transform>" << endl;
+        ss << pre2 << "</Transform>" << std::endl;
 
         if (visualizationModel)
         {
             ss << visualizationModel->toXML(modelPath, tabs + 1);
         }
 
-        ss << pre << "</Sensor>" << endl;
+        ss << pre << "</Sensor>" << std::endl;
         return ss.str();
     }
 
diff --git a/VirtualRobot/Nodes/PositionSensor.h b/VirtualRobot/Nodes/PositionSensor.h
index ec9cc149ff82294153a5dabd58a58bf45779a571..9c7b80032c63e02731b52e12f0c04ef9c755e0ee 100644
--- a/VirtualRobot/Nodes/PositionSensor.h
+++ b/VirtualRobot/Nodes/PositionSensor.h
@@ -29,7 +29,7 @@ namespace VirtualRobot
 {
 
     class PositionSensor;
-    typedef boost::shared_ptr<PositionSensor> PositionSensorPtr;
+    typedef std::shared_ptr<PositionSensor> PositionSensorPtr;
 
 
     /*!
@@ -77,7 +77,7 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<PositionSensor> PositionSensorPtr;
+    typedef std::shared_ptr<PositionSensor> PositionSensorPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Nodes/PositionSensorFactory.cpp b/VirtualRobot/Nodes/PositionSensorFactory.cpp
index 532bb418bbcbe99641231100ea6bbb28a4c5a065..f97a9bc10c3a983910cba73559adb44e77f22b90 100644
--- a/VirtualRobot/Nodes/PositionSensorFactory.cpp
+++ b/VirtualRobot/Nodes/PositionSensorFactory.cpp
@@ -67,7 +67,7 @@ namespace VirtualRobot
             {
                 if (loadMode == RobotIO::eFull)
                 {
-                    THROW_VR_EXCEPTION_IF(visuProcessed, "Two visualization tags defined in Sensor '" << sensorName << "'." << endl);
+                    THROW_VR_EXCEPTION_IF(visuProcessed, "Two visualization tags defined in Sensor '" << sensorName << "'." << std::endl);
                     visualizationNode = BaseIO::processVisualizationTag(nodeXML, sensorName, basePath, useAsColModel);
                     visuProcessed = true;
                 }// else silently ignore tag
@@ -78,7 +78,7 @@ namespace VirtualRobot
             }
             else
             {
-                THROW_VR_EXCEPTION("XML definition <" << nodeName << "> not supported in Sensor <" << sensorName << ">." << endl);
+                THROW_VR_EXCEPTION("XML definition <" << nodeName << "> not supported in Sensor <" << sensorName << ">." << std::endl);
             }
 
             nodeXML = nodeXML->next_sibling();
@@ -110,9 +110,9 @@ namespace VirtualRobot
     /**
      * \return new instance of PositionSensorFactory.
      */
-    boost::shared_ptr<SensorFactory> PositionSensorFactory::createInstance(void*)
+    std::shared_ptr<SensorFactory> PositionSensorFactory::createInstance(void*)
     {
-        boost::shared_ptr<PositionSensorFactory> psFactory(new PositionSensorFactory());
+        std::shared_ptr<PositionSensorFactory> psFactory(new PositionSensorFactory());
         return psFactory;
     }
 
diff --git a/VirtualRobot/Nodes/PositionSensorFactory.h b/VirtualRobot/Nodes/PositionSensorFactory.h
index 25f97ce35ad640516563a1bb6dbd9b5e76c2a0c7..ce6c71fa2ab8827739bb5bce64422aa4f0b442c9 100644
--- a/VirtualRobot/Nodes/PositionSensorFactory.h
+++ b/VirtualRobot/Nodes/PositionSensorFactory.h
@@ -51,7 +51,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<SensorFactory> createInstance(void*);
+        static std::shared_ptr<SensorFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
     };
diff --git a/VirtualRobot/Nodes/RobotNode.cpp b/VirtualRobot/Nodes/RobotNode.cpp
index 42fb3f5550a50c939a60262aa950167793e91a99..ddf4d11304064c1c32c371f9ef4a7fc527ae201c 100644
--- a/VirtualRobot/Nodes/RobotNode.cpp
+++ b/VirtualRobot/Nodes/RobotNode.cpp
@@ -12,12 +12,15 @@
 #include <iomanip>
 #include <boost/optional/optional_io.hpp>
 #include <algorithm>
+#include <filesystem>
 #include "../math/Helpers.h"
 
 #include <Eigen/Core>
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     RobotNode::RobotNode(RobotWeakPtr rob,
                          const std::string& name,
@@ -66,9 +69,9 @@ namespace VirtualRobot
         THROW_VR_EXCEPTION_IF(!rob, "Could not init RobotNode without robot");
 
         // robot
-        if (!rob->hasRobotNode(boost::static_pointer_cast<RobotNode>(shared_from_this())))
+        if (!rob->hasRobotNode(std::static_pointer_cast<RobotNode>(shared_from_this())))
         {
-            rob->registerRobotNode(boost::static_pointer_cast<RobotNode>(shared_from_this()));
+            rob->registerRobotNode(std::static_pointer_cast<RobotNode>(shared_from_this()));
         }
 
         // update visualization of coordinate systems
@@ -311,7 +314,7 @@ namespace VirtualRobot
 
     void RobotNode::copyPoseFrom(const SceneObjectPtr& sceneobj)
     {
-        RobotNodePtr other = boost::dynamic_pointer_cast<RobotNode>(sceneobj);
+        RobotNodePtr other = std::dynamic_pointer_cast<RobotNode>(sceneobj);
         THROW_VR_EXCEPTION_IF(!other, "The given SceneObject is no RobotNode");
         copyPoseFrom(other);
     }
@@ -348,13 +351,13 @@ namespace VirtualRobot
 
     void RobotNode::collectAllRobotNodes(std::vector< RobotNodePtr >& storeNodes)
     {
-        storeNodes.push_back(boost::static_pointer_cast<RobotNode>(shared_from_this()));
+        storeNodes.push_back(std::static_pointer_cast<RobotNode>(shared_from_this()));
 
         std::vector< SceneObjectPtr > children = this->getChildren();
 
         for (size_t i = 0; i < children.size(); i++)
         {
-            RobotNodePtr n = boost::dynamic_pointer_cast<RobotNode>(children[i]);
+            RobotNodePtr n = std::dynamic_pointer_cast<RobotNode>(children[i]);
 
             if (n)
             {
@@ -560,7 +563,7 @@ namespace VirtualRobot
 
             for (size_t i = 0; i < children.size(); i++)
             {
-                RobotNodePtr n = boost::dynamic_pointer_cast<RobotNode>(children[i]);
+                RobotNodePtr n = std::dynamic_pointer_cast<RobotNode>(children[i]);
 
                 if (n)
                 {
@@ -573,7 +576,7 @@ namespace VirtualRobot
                 }
                 else
                 {
-                    SensorPtr s =  boost::dynamic_pointer_cast<Sensor>(children[i]);
+                    SensorPtr s =  std::dynamic_pointer_cast<Sensor>(children[i]);
 
                     if (s)
                     {
@@ -758,7 +761,7 @@ namespace VirtualRobot
         std::string attachName2("RobotNodeStructureJoint");
         std::string attachName3("RobotNodeStructurePost");
         SceneObjectPtr par = getParent();
-        RobotNodePtr parRN = boost::dynamic_pointer_cast<RobotNode>(par);
+        RobotNodePtr parRN = std::dynamic_pointer_cast<RobotNode>(par);
 
         // need to add "pre" visualization to parent node!
         if (parRN && parRN->getVisualization())
@@ -848,7 +851,7 @@ namespace VirtualRobot
 
         for (unsigned int i = 0; i < rn.size(); i++)
         {
-            if (rn[i]->hasChild(boost::static_pointer_cast<SceneObject>(shared_from_this()), true))
+            if (rn[i]->hasChild(std::static_pointer_cast<SceneObject>(shared_from_this()), true))
             {
                 result.push_back(rn[i]);
             }
@@ -906,7 +909,7 @@ namespace VirtualRobot
 
         if (!parent || parent == rob)
         {
-            if (rob && rob->getRootNode() == boost::static_pointer_cast<RobotNode>(shared_from_this()))
+            if (rob && rob->getRootNode() == std::static_pointer_cast<RobotNode>(shared_from_this()))
             {
                 Eigen::Matrix4f gpPre = globalPose * getLocalTransformation().inverse();
                 rob->setGlobalPose(gpPre, false);
@@ -1090,7 +1093,7 @@ namespace VirtualRobot
         for (size_t i = 0; i < children.size(); i++)
         {
             // check if child is a RobotNode
-            RobotNodePtr crn = boost::dynamic_pointer_cast<RobotNode>(children[i]);
+            RobotNodePtr crn = std::dynamic_pointer_cast<RobotNode>(children[i]);
 
             if (crn)
             {
diff --git a/VirtualRobot/Nodes/RobotNodeActuator.h b/VirtualRobot/Nodes/RobotNodeActuator.h
index 4eb325753218e2ff1131539b37b3175deabd2930..33713bc81f25615b100897e248fb089c05456a31 100644
--- a/VirtualRobot/Nodes/RobotNodeActuator.h
+++ b/VirtualRobot/Nodes/RobotNodeActuator.h
@@ -56,7 +56,7 @@ namespace VirtualRobot
     };
 
 
-    typedef boost::shared_ptr<RobotNodeActuator> RobotNodeActuatorPtr;
+    typedef std::shared_ptr<RobotNodeActuator> RobotNodeActuatorPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Nodes/RobotNodeFixed.cpp b/VirtualRobot/Nodes/RobotNodeFixed.cpp
index b7306251f0756553b32b292835acd02684518ea2..31f6103640b41ada56f63bfc6492086998719c8a 100644
--- a/VirtualRobot/Nodes/RobotNodeFixed.cpp
+++ b/VirtualRobot/Nodes/RobotNodeFixed.cpp
@@ -79,14 +79,14 @@ namespace VirtualRobot
     {
         if (printDecoration)
         {
-            cout << "******** RobotNodeFixed ********" << endl;
+            std::cout << "******** RobotNodeFixed ********" << std::endl;
         }
 
         RobotNode::print(false, false);
 
         if (printDecoration)
         {
-            cout << "******** End RobotNodeFixed ********" << endl;
+            std::cout << "******** End RobotNodeFixed ********" << std::endl;
         }
 
 
@@ -94,7 +94,8 @@ namespace VirtualRobot
 
         if (printChildren)
         {
-            std::for_each(children.begin(), children.end(), boost::bind(&SceneObject::print, _1, true, true));
+            std::for_each(children.begin(), children.end(), std::bind(&SceneObject::print,
+                                                                      std::placeholders::_1, true, true));
         }
     }
 
diff --git a/VirtualRobot/Nodes/RobotNodeFixedFactory.cpp b/VirtualRobot/Nodes/RobotNodeFixedFactory.cpp
index f6cef81580920d66abaffada7410c3434ba78a28..54ba6e07b5242c11238fed7ee186867fa8170ce2 100644
--- a/VirtualRobot/Nodes/RobotNodeFixedFactory.cpp
+++ b/VirtualRobot/Nodes/RobotNodeFixedFactory.cpp
@@ -62,9 +62,9 @@ namespace VirtualRobot
     /**
      * \return new instance of RobotNodeFixedFactory.
      */
-    boost::shared_ptr<RobotNodeFactory> RobotNodeFixedFactory::createInstance(void*)
+    std::shared_ptr<RobotNodeFactory> RobotNodeFixedFactory::createInstance(void*)
     {
-        boost::shared_ptr<RobotNodeFixedFactory> fixedNodeFactory(new RobotNodeFixedFactory());
+        std::shared_ptr<RobotNodeFixedFactory> fixedNodeFactory(new RobotNodeFixedFactory());
         return fixedNodeFactory;
     }
 
diff --git a/VirtualRobot/Nodes/RobotNodeFixedFactory.h b/VirtualRobot/Nodes/RobotNodeFixedFactory.h
index c07eeb9987d2c61d908e04a59027fe6f8b700b94..ab14072fdc0b662d6b882c2259bd68caeddadb5f 100644
--- a/VirtualRobot/Nodes/RobotNodeFixedFactory.h
+++ b/VirtualRobot/Nodes/RobotNodeFixedFactory.h
@@ -44,7 +44,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<RobotNodeFactory> createInstance(void*);
+        static std::shared_ptr<RobotNodeFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
     };
diff --git a/VirtualRobot/Nodes/RobotNodePrismatic.cpp b/VirtualRobot/Nodes/RobotNodePrismatic.cpp
index b5b86fda3aa7cde71bf22f819b910c38707ce751..a9a1c7c271bf8b2144f2c95f41b1338192bfff38 100644
--- a/VirtualRobot/Nodes/RobotNodePrismatic.cpp
+++ b/VirtualRobot/Nodes/RobotNodePrismatic.cpp
@@ -9,6 +9,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     RobotNodePrismatic::RobotNodePrismatic(RobotWeakPtr rob,
                                            const std::string& name,
@@ -135,7 +137,7 @@ namespace VirtualRobot
 
         if (printDecoration)
         {
-            cout << "******** RobotNodePrismatic ********" << endl;
+            std::cout << "******** RobotNodePrismatic ********" << std::endl;
         }
 
         RobotNode::print(false, false);
@@ -145,16 +147,16 @@ namespace VirtualRobot
 
         if (visuScaling)
         {
-            cout << visuScaleFactor[0] << ", " << visuScaleFactor[1] << "," << visuScaleFactor[2] << endl;
+            std::cout << visuScaleFactor[0] << ", " << visuScaleFactor[1] << "," << visuScaleFactor[2] << std::endl;
         }
         else
         {
-            cout << "disabled" << endl;
+            std::cout << "disabled" << std::endl;
         }
 
         if (printDecoration)
         {
-            cout << "******** End RobotNodePrismatic ********" << endl;
+            std::cout << "******** End RobotNodePrismatic ********" << std::endl;
         }
 
 
@@ -162,13 +164,14 @@ namespace VirtualRobot
 
         if (printChildren)
         {
-            std::for_each(children.begin(), children.end(), boost::bind(&SceneObject::print, _1, true, true));
+            std::for_each(children.begin(), children.end(), std::bind(&SceneObject::print,
+                                                                      std::placeholders::_1, true, true));
         }
     }
 
     RobotNodePtr RobotNodePrismatic::_clone(const RobotPtr newRobot, const VisualizationNodePtr visualizationModel, const CollisionModelPtr collisionModel, CollisionCheckerPtr colChecker, float scaling)
     {
-        boost::shared_ptr<RobotNodePrismatic> result;
+        std::shared_ptr<RobotNodePrismatic> result;
         ReadLockPtr lock = getRobot()->getReadLock();
         Physics p = physics.scale(scaling);
 
diff --git a/VirtualRobot/Nodes/RobotNodePrismatic.h b/VirtualRobot/Nodes/RobotNodePrismatic.h
index b239d3d0177c391b98a751224ea79a4766c27da6..19c8f3220988b64f1ef3623c775e4efb799eb25b 100644
--- a/VirtualRobot/Nodes/RobotNodePrismatic.h
+++ b/VirtualRobot/Nodes/RobotNodePrismatic.h
@@ -134,7 +134,7 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<RobotNodePrismatic> RobotNodePrismaticPtr;
+    typedef std::shared_ptr<RobotNodePrismatic> RobotNodePrismaticPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Nodes/RobotNodePrismaticFactory.cpp b/VirtualRobot/Nodes/RobotNodePrismaticFactory.cpp
index 4bb87ebdccb2c39e974d142d85716db8096e124a..f5cbeec7a9b8c9da5858c3718938dfbe8b700204 100644
--- a/VirtualRobot/Nodes/RobotNodePrismaticFactory.cpp
+++ b/VirtualRobot/Nodes/RobotNodePrismaticFactory.cpp
@@ -64,9 +64,9 @@ namespace VirtualRobot
     /**
      * \return new instance of RobotNodePrismaticFactory.
      */
-    boost::shared_ptr<RobotNodeFactory> RobotNodePrismaticFactory::createInstance(void*)
+    std::shared_ptr<RobotNodeFactory> RobotNodePrismaticFactory::createInstance(void*)
     {
-        boost::shared_ptr<RobotNodePrismaticFactory> prismaticNodeFactory(new RobotNodePrismaticFactory());
+        std::shared_ptr<RobotNodePrismaticFactory> prismaticNodeFactory(new RobotNodePrismaticFactory());
         return prismaticNodeFactory;
     }
 
diff --git a/VirtualRobot/Nodes/RobotNodePrismaticFactory.h b/VirtualRobot/Nodes/RobotNodePrismaticFactory.h
index 1228bce3c064611636da50ef3e31876aa838f0e9..fb375cd2f76ec644ffd801f850d4b8cdc2b42bbb 100644
--- a/VirtualRobot/Nodes/RobotNodePrismaticFactory.h
+++ b/VirtualRobot/Nodes/RobotNodePrismaticFactory.h
@@ -44,7 +44,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<RobotNodeFactory> createInstance(void*);
+        static std::shared_ptr<RobotNodeFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
     };
diff --git a/VirtualRobot/Nodes/RobotNodeRevolute.cpp b/VirtualRobot/Nodes/RobotNodeRevolute.cpp
index 4547b8475ebc0be7a0073e40a609dc3ffa3484cd..72f7a1134e5e51654cdafadb101c8c16f7aaa910 100644
--- a/VirtualRobot/Nodes/RobotNodeRevolute.cpp
+++ b/VirtualRobot/Nodes/RobotNodeRevolute.cpp
@@ -9,7 +9,8 @@
 
 namespace VirtualRobot
 {
-
+    using std::cout;
+    using std::endl;
 
     RobotNodeRevolute::RobotNodeRevolute(RobotWeakPtr rob,
                                          const std::string& name,
@@ -116,7 +117,8 @@ namespace VirtualRobot
 
         if (printChildren)
         {
-            std::for_each(children.begin(), children.end(), boost::bind(&SceneObject::print, _1, true, true));
+            std::for_each(children.begin(), children.end(), std::bind(&SceneObject::print,
+                                                                      std::placeholders::_1, true, true));
         }
     }
 
diff --git a/VirtualRobot/Nodes/RobotNodeRevolute.h b/VirtualRobot/Nodes/RobotNodeRevolute.h
index 5669b2bc4d85c3ef49b2a436d164293da97da975..6f02611dadf6f65af17f75db5e6c282eb6c9a941 100644
--- a/VirtualRobot/Nodes/RobotNodeRevolute.h
+++ b/VirtualRobot/Nodes/RobotNodeRevolute.h
@@ -140,7 +140,7 @@ namespace VirtualRobot
         Eigen::Matrix4f tmpRotMat;
     };
 
-    typedef boost::shared_ptr<RobotNodeRevolute> RobotNodeRevolutePtr;
+    typedef std::shared_ptr<RobotNodeRevolute> RobotNodeRevolutePtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Nodes/RobotNodeRevoluteFactory.cpp b/VirtualRobot/Nodes/RobotNodeRevoluteFactory.cpp
index 40e79deda46c94fa0cd3e7bda1f04e511379562c..5364c87b13c55cf3ed32a51081dad06167279f63 100644
--- a/VirtualRobot/Nodes/RobotNodeRevoluteFactory.cpp
+++ b/VirtualRobot/Nodes/RobotNodeRevoluteFactory.cpp
@@ -64,9 +64,9 @@ namespace VirtualRobot
     /**
      * \return new instance of RobotNodeRevoluteFactory.
      */
-    boost::shared_ptr<RobotNodeFactory> RobotNodeRevoluteFactory::createInstance(void*)
+    std::shared_ptr<RobotNodeFactory> RobotNodeRevoluteFactory::createInstance(void*)
     {
-        boost::shared_ptr<RobotNodeRevoluteFactory> revoluteNodeFactory(new RobotNodeRevoluteFactory());
+        std::shared_ptr<RobotNodeRevoluteFactory> revoluteNodeFactory(new RobotNodeRevoluteFactory());
         return revoluteNodeFactory;
     }
 
diff --git a/VirtualRobot/Nodes/RobotNodeRevoluteFactory.h b/VirtualRobot/Nodes/RobotNodeRevoluteFactory.h
index 16d060f63d48e0004b2d70f072dfdeb4401c3d4c..0dc52a37e80602b2607ff27884e8c721210fb2ec 100644
--- a/VirtualRobot/Nodes/RobotNodeRevoluteFactory.h
+++ b/VirtualRobot/Nodes/RobotNodeRevoluteFactory.h
@@ -42,7 +42,7 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<RobotNodeFactory> createInstance(void*);
+        static std::shared_ptr<RobotNodeFactory> createInstance(void*);
     private:
         static SubClassRegistry registry;
     };
diff --git a/VirtualRobot/Nodes/Sensor.cpp b/VirtualRobot/Nodes/Sensor.cpp
index 104abfc908c13eced2b80ed7a26d7a4e10f55a55..b116943ba6e161df9d1e92942e0fb52c7e14582c 100644
--- a/VirtualRobot/Nodes/Sensor.cpp
+++ b/VirtualRobot/Nodes/Sensor.cpp
@@ -10,6 +10,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     Sensor::Sensor(RobotNodeWeakPtr robotNode,
                    const std::string& name,
@@ -34,7 +36,7 @@ namespace VirtualRobot
         // robotnode
         if (!rn->hasSensor(name))
         {
-            rn->registerSensor(boost::static_pointer_cast<Sensor>(shared_from_this()));
+            rn->registerSensor(std::static_pointer_cast<Sensor>(shared_from_this()));
         }
 
         return SceneObject::initialize(parent, children);
diff --git a/VirtualRobot/Nodes/Sensor.h b/VirtualRobot/Nodes/Sensor.h
index bf9488ad0610a285d541cafe9e3e4ed3ee1cff25..803343adaf1e83c894bedc96d6f646c62f87b0d7 100644
--- a/VirtualRobot/Nodes/Sensor.h
+++ b/VirtualRobot/Nodes/Sensor.h
@@ -42,7 +42,7 @@ namespace VirtualRobot
 {
 
     class Sensor;
-    typedef boost::shared_ptr<Sensor> SensorPtr;
+    typedef std::shared_ptr<Sensor> SensorPtr;
 
 
     /*!
diff --git a/VirtualRobot/Nodes/SensorFactory.h b/VirtualRobot/Nodes/SensorFactory.h
index 2a1fd555e65ecb8b7caeff32110a277c71ee91e2..bb6c792816ab5b5b69d50620e501643295e38e64 100644
--- a/VirtualRobot/Nodes/SensorFactory.h
+++ b/VirtualRobot/Nodes/SensorFactory.h
@@ -71,7 +71,7 @@ namespace VirtualRobot
         }
     };
 
-    typedef boost::shared_ptr<SensorFactory> SensorFactoryPtr;
+    typedef std::shared_ptr<SensorFactory> SensorFactoryPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Obstacle.cpp b/VirtualRobot/Obstacle.cpp
index 27baf65350b5d248d45a209bc18f7b9b9c4c5ceb..34bf986f1632730671d0d2c1f6da77700f2b0c4e 100644
--- a/VirtualRobot/Obstacle.cpp
+++ b/VirtualRobot/Obstacle.cpp
@@ -9,6 +9,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     // obstacle models start with 20000
     int Obstacle::idCounter = 20000;
@@ -40,14 +42,14 @@ namespace VirtualRobot
     }
 
     Obstacle::Obstacle(const std::string& name, const TriMeshModelPtr& trimesh, const std::string& filename)
-        : Obstacle(TagTrimeshCtor{}, name, boost::make_shared<CoinVisualizationNode>(trimesh))
+        : Obstacle(TagTrimeshCtor{}, name, std::make_shared<CoinVisualizationNode>(trimesh))
     {
         getVisualization()->setFilename(filename, false);
         getCollisionModel()->getVisualization()->setFilename(filename, false);
     }
 
     Obstacle::Obstacle(TagTrimeshCtor, const std::string& name, const VisualizationNodePtr& vis)
-        : Obstacle(name, vis, boost::make_shared<CollisionModel>(vis))
+        : Obstacle(name, vis, std::make_shared<CollisionModel>(vis))
     {}
 
     Obstacle::~Obstacle() = default;
diff --git a/VirtualRobot/Primitive.cpp b/VirtualRobot/Primitive.cpp
index 4470226d7ed07787f20fb2ddd29dc0b9ae8adb75..b8d8559c7318d5a51b2c0c6959e7f4ac6d743d15 100644
--- a/VirtualRobot/Primitive.cpp
+++ b/VirtualRobot/Primitive.cpp
@@ -1,6 +1,7 @@
 #include "Primitive.h"
 #include "MathTools.h"
 
+#include <boost/format.hpp>
 
 namespace VirtualRobot
 {
diff --git a/VirtualRobot/Primitive.h b/VirtualRobot/Primitive.h
index 53097a76ab70acd94b3cc90437b7c68c310c1fa9..094f06a8d2b2f4aa189d709a59b03fc07d03b70d 100644
--- a/VirtualRobot/Primitive.h
+++ b/VirtualRobot/Primitive.h
@@ -60,7 +60,7 @@ namespace VirtualRobot
             std::string toXMLString(int tabs = 0) override;
         };
 
-        typedef boost::shared_ptr<Primitive> PrimitivePtr;
+        typedef std::shared_ptr<Primitive> PrimitivePtr;
 
     } //namespace Primitive
 } //namespace VirtualRobot
diff --git a/VirtualRobot/Robot.cpp b/VirtualRobot/Robot.cpp
index b4728bbaa22fe8e19459aa4cb20ab3894bf85111..f725ce465db7f0af97ebc10f64de2dccaee00225 100644
--- a/VirtualRobot/Robot.cpp
+++ b/VirtualRobot/Robot.cpp
@@ -10,6 +10,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     const RobotPtr Robot::NullPtr{nullptr};
     Robot::Robot(const std::string& name, const std::string& type)
@@ -510,11 +512,11 @@ namespace VirtualRobot
         }
     }
 
-    boost::shared_ptr<Robot> Robot::shared_from_this() const
+    std::shared_ptr<Robot> Robot::shared_from_this() const
     {
         auto sceneObject = SceneObject::shared_from_this();
-        boost::shared_ptr<const Robot> robotPtr = boost::static_pointer_cast<const Robot>(sceneObject);
-        boost::shared_ptr<Robot> result = boost::const_pointer_cast<Robot>(robotPtr);
+        std::shared_ptr<const Robot> robotPtr = std::static_pointer_cast<const Robot>(sceneObject);
+        std::shared_ptr<Robot> result = std::const_pointer_cast<Robot>(robotPtr);
         return result;
     }
 
diff --git a/VirtualRobot/Robot.h b/VirtualRobot/Robot.h
index 37f212272b2cb16f46dadc5fcc68645ddbd29bf0..00d973b4bd5b225c7eb9cf52a7c889eaa06ad5e0 100644
--- a/VirtualRobot/Robot.h
+++ b/VirtualRobot/Robot.h
@@ -89,12 +89,12 @@ namespace VirtualRobot
             \param visuType The visualization type (Full or Collision model)
             \param sensors Add sensors models to the visualization.
             Example usage:
-             boost::shared_ptr<VirtualRobot::CoinVisualization> visualization = robot->getVisualization<CoinVisualization>();
+             std::shared_ptr<VirtualRobot::CoinVisualization> visualization = robot->getVisualization<CoinVisualization>();
              SoNode* visualisationNode = NULL;
              if (visualization)
                  visualisationNode = visualization->getCoinVisualization();
         */
-        template <typename T> boost::shared_ptr<T> getVisualization(SceneObject::VisualizationType visuType = SceneObject::Full, bool sensors = true);
+        template <typename T> std::shared_ptr<T> getVisualization(SceneObject::VisualizationType visuType = SceneObject::Full, bool sensors = true);
         /*!
             Shows the structure of the robot
         */
@@ -134,8 +134,8 @@ namespace VirtualRobot
         void setUpdateVisualization(bool enable) override;
         void setUpdateCollisionModel(bool enable) override;
 
-        boost::shared_ptr<Robot> shared_from_this() const;
-        //boost::shared_ptr<Robot> shared_from_this() const { return boost::static_pointer_cast<Robot>(SceneObject::shared_from_this()); }
+        std::shared_ptr<Robot> shared_from_this() const;
+        //std::shared_ptr<Robot> shared_from_this() const { return boost::static_pointer_cast<Robot>(SceneObject::shared_from_this()); }
 
         /*!
             get the complete setup of all robot nodes
@@ -365,9 +365,9 @@ namespace VirtualRobot
         virtual SensorPtr getSensor(const std::string& name);
 
         template<class SensorType>
-        boost::shared_ptr<SensorType> getSensor(const std::string& name)
+        std::shared_ptr<SensorType> getSensor(const std::string& name)
         {
-            return boost::dynamic_pointer_cast<SensorType>(getSensor(name));
+            return std::dynamic_pointer_cast<SensorType>(getSensor(name));
         }
 
         /*!
@@ -376,16 +376,16 @@ namespace VirtualRobot
         virtual std::vector<SensorPtr> getSensors();
 
         template<class SensorType>
-        std::vector<boost::shared_ptr<SensorType> > getSensors()
+        std::vector<std::shared_ptr<SensorType> > getSensors()
         {
-            std::vector<boost::shared_ptr<SensorType> > result;
+            std::vector<std::shared_ptr<SensorType> > result;
             std::vector<SensorPtr> sensors = getSensors();
             result.reserve(sensors.size());
             for (std::size_t i = 0; i < sensors.size(); ++i)
             {
                 if (dynamic_cast<SensorType*>(sensors.at(i).get()))
                 {
-                    result.push_back(boost::static_pointer_cast<SensorType>(sensors.at(i)));
+                    result.push_back(std::static_pointer_cast<SensorType>(sensors.at(i)));
                 }
             }
             return result;
@@ -429,7 +429,7 @@ namespace VirtualRobot
 
         bool updateVisualization;
 
-        mutable boost::recursive_mutex mutex;
+        mutable std::recursive_mutex mutex;
         bool use_mutex;
         bool propagatingJointValuesEnabled = true;
 
@@ -444,10 +444,10 @@ namespace VirtualRobot
      * A compile time error is thrown if a different class type is used as template argument.
      */
     template <typename T>
-    boost::shared_ptr<T> Robot::getVisualization(SceneObject::VisualizationType visuType, bool sensors)
+    std::shared_ptr<T> Robot::getVisualization(SceneObject::VisualizationType visuType, bool sensors)
     {
-        const bool IS_SUBCLASS_OF_VISUALIZATION = ::boost::is_base_of<Visualization, T>::value;
-        BOOST_MPL_ASSERT_MSG(IS_SUBCLASS_OF_VISUALIZATION, TEMPLATE_PARAMETER_FOR_VirtualRobot_getVisualization_MUST_BT_A_SUBCLASS_OF_VirtualRobot__Visualization, (T));
+        static_assert(::std::is_base_of_v<Visualization, T>,
+                "TEMPLATE_PARAMETER_FOR_VirtualRobot_getVisualization_MUST_BT_A_SUBCLASS_OF_VirtualRobot__Visualization");
         std::vector<RobotNodePtr> collectedRobotNodes;
         getRobotNodes(collectedRobotNodes);
         std::vector<VisualizationNodePtr> collectedVisualizationNodes;
@@ -467,7 +467,7 @@ namespace VirtualRobot
             }
         }
 
-        boost::shared_ptr<T> visualization(new T(collectedVisualizationNodes));
+        std::shared_ptr<T> visualization(new T(collectedVisualizationNodes));
         return visualization;
     }
 
diff --git a/VirtualRobot/RobotConfig.cpp b/VirtualRobot/RobotConfig.cpp
index 542fb7122a92c1b06a3f4c515c6bc8302c51afa5..b5591c6bbe83c77bcc674dbd82cfee396f96fc77 100644
--- a/VirtualRobot/RobotConfig.cpp
+++ b/VirtualRobot/RobotConfig.cpp
@@ -6,6 +6,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     RobotConfig::RobotConfig(RobotWeakPtr robot, const std::string& name)
         : name(name),
diff --git a/VirtualRobot/RobotFactory.cpp b/VirtualRobot/RobotFactory.cpp
index 392fe1d24aab46244574ea32304b448096e458aa..25badc37fed5ea11be6e6ff8b648a992b3bbfc47 100644
--- a/VirtualRobot/RobotFactory.cpp
+++ b/VirtualRobot/RobotFactory.cpp
@@ -11,13 +11,15 @@
 #include "Visualization//VisualizationFactory.h"
 #include "VirtualRobotException.h"
 
+#include <boost/assert.hpp>
 
 #include <algorithm>
 #include <deque>
 
 namespace VirtualRobot
 {
-
+    using std::cout;
+    using std::endl;
 
     RobotFactory::RobotFactory()
     = default;
@@ -139,7 +141,7 @@ namespace VirtualRobot
             RobotTreeEdge currentEdge = edges.front();
             edges.pop_front();
 
-            RobotNodePtr parent = boost::dynamic_pointer_cast<RobotNode>(currentEdge.second->getParent());
+            RobotNodePtr parent = std::dynamic_pointer_cast<RobotNode>(currentEdge.second->getParent());
 
             std::vector<SceneObjectPtr> children = currentEdge.second->getChildren();
             RobotFactory::robotNodeDef rnDef;
@@ -163,7 +165,7 @@ namespace VirtualRobot
             {
                 if (i != currentEdge.first)
                 {
-                    RobotNodePtr childNode = boost::dynamic_pointer_cast<RobotNode>(i);
+                    RobotNodePtr childNode = std::dynamic_pointer_cast<RobotNode>(i);
 
                     // not a robot node
                     if (!childNode)
@@ -240,7 +242,7 @@ namespace VirtualRobot
         {
             currentNodeName = rn->getName();
             nodes.push_back(currentNodeName);
-            rn = boost::dynamic_pointer_cast<RobotNode>(rn->getParent());
+            rn = std::dynamic_pointer_cast<RobotNode>(rn->getParent());
         }
 
         if (!rn)
@@ -460,7 +462,7 @@ namespace VirtualRobot
 
                     for (auto cc : childChildren)
                     {
-                        SensorPtr cs = boost::dynamic_pointer_cast<Sensor>(cc);
+                        SensorPtr cs = std::dynamic_pointer_cast<Sensor>(cc);
 
                         if (cs)
                         {
@@ -492,7 +494,7 @@ namespace VirtualRobot
 
                     for (auto cc : childChildren)
                     {
-                        SensorPtr cs = boost::dynamic_pointer_cast<Sensor>(cc);
+                        SensorPtr cs = std::dynamic_pointer_cast<Sensor>(cc);
 
                         if (cs)
                         {
@@ -523,13 +525,13 @@ namespace VirtualRobot
             VR_ASSERT(inv_it != directionInversion.end());
             if (inv_it->second)
             {
-                RobotNodeRevolutePtr rotJoint = boost::dynamic_pointer_cast<RobotNodeRevolute>(it->first);
+                RobotNodeRevolutePtr rotJoint = std::dynamic_pointer_cast<RobotNodeRevolute>(it->first);
                 if (rotJoint)
                 {
                     rotJoint->jointRotationAxis *= -1.0f;
                 }
 
-                RobotNodePrismaticPtr prismaticJoint = boost::dynamic_pointer_cast<RobotNodePrismatic>(it->first);
+                RobotNodePrismaticPtr prismaticJoint = std::dynamic_pointer_cast<RobotNodePrismatic>(it->first);
                 if (prismaticJoint)
                 {
                     prismaticJoint->jointTranslationDirection *= -1.0f;
@@ -605,7 +607,7 @@ namespace VirtualRobot
 
         for (auto c : children)
         {
-            RobotNodePtr cRN = boost::dynamic_pointer_cast<RobotNode>(c);
+            RobotNodePtr cRN = std::dynamic_pointer_cast<RobotNode>(c);
 
             if (cRN && cRN != nodeExclude)
             {
@@ -623,8 +625,8 @@ namespace VirtualRobot
 
         for (auto c : children)
         {
-            SensorPtr cS = boost::dynamic_pointer_cast<Sensor>(c);
-            RobotNodePtr cRN = boost::dynamic_pointer_cast<RobotNode>(c);
+            SensorPtr cS = std::dynamic_pointer_cast<Sensor>(c);
+            RobotNodePtr cRN = std::dynamic_pointer_cast<RobotNode>(c);
 
             if (cS)
             {
@@ -845,7 +847,7 @@ namespace VirtualRobot
             std::vector<SceneObjectPtr> c = rn->getChildren();
             for (const auto & j : c)
             {
-                SensorPtr s = boost::dynamic_pointer_cast<Sensor>(j);
+                SensorPtr s = std::dynamic_pointer_cast<Sensor>(j);
                 if (s)
                     childSensorNodes.push_back(s);
             }
@@ -946,7 +948,7 @@ namespace VirtualRobot
         {
             if (std::find(uniteWithAllChildren.begin(), uniteWithAllChildren.end(), i->getName()) != uniteWithAllChildren.end())
             {
-                RobotNodePtr currentRN = boost::dynamic_pointer_cast<RobotNode>(i);
+                RobotNodePtr currentRN = std::dynamic_pointer_cast<RobotNode>(i);
                 THROW_VR_EXCEPTION_IF(!currentRN, "Only RN allowed in list");
                 RobotNodePtr currentRNClone = currentRN->clone(robot, false, currentNodeClone);
 
@@ -964,7 +966,7 @@ namespace VirtualRobot
             }
             else
             {
-                RobotNodePtr currentRN = boost::dynamic_pointer_cast<RobotNode>(i);
+                RobotNodePtr currentRN = std::dynamic_pointer_cast<RobotNode>(i);
                 if (currentRN)
                 {
                     RobotNodePtr currentRNClone = currentRN->clone(robot, false, currentNodeClone);
@@ -972,7 +974,7 @@ namespace VirtualRobot
                 }
                 else
                 {
-                    SensorPtr s = boost::dynamic_pointer_cast<Sensor>(i);
+                    SensorPtr s = std::dynamic_pointer_cast<Sensor>(i);
                     if (s)
                     {
                         s->clone(currentNodeClone);
diff --git a/VirtualRobot/RobotNodeSet.cpp b/VirtualRobot/RobotNodeSet.cpp
index 0b2c16f16391a8bfdeea9f6e48e5f8178eac31c2..7cfe7accd1a7507f138da21e4b1fe34db34a1bf1 100644
--- a/VirtualRobot/RobotNodeSet.cpp
+++ b/VirtualRobot/RobotNodeSet.cpp
@@ -6,10 +6,14 @@
 #include "VirtualRobotException.h"
 #include "CollisionDetection/CollisionChecker.h"
 
+#include <boost/mem_fn.hpp>
+
 #include <algorithm>
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     RobotNodeSet::RobotNodeSet(const std::string& name,
                                RobotWeakPtr r,
@@ -62,7 +66,7 @@ namespace VirtualRobot
         // now, the objects are stored in the parent's (SceneObjectSet) data structure, so that the methods of SceneObjectSet do work
         for (const auto& robotNode : robotNodes)
         {
-            SceneObjectPtr cm = boost::dynamic_pointer_cast<SceneObject>(robotNode);
+            SceneObjectPtr cm = std::dynamic_pointer_cast<SceneObject>(robotNode);
 
             if (cm)
             {
diff --git a/VirtualRobot/RobotNodeSet.h b/VirtualRobot/RobotNodeSet.h
index 2cafd715d4dd98efa7d06292e5ed865e8426ece6..9c5f4e3b14b4c024944e3f46e2bf00135d2e665b 100644
--- a/VirtualRobot/RobotNodeSet.h
+++ b/VirtualRobot/RobotNodeSet.h
@@ -38,7 +38,7 @@ namespace VirtualRobot
         - the kinematic root (the topmost RobotNode of the Robot's kinematic tree that has to be updated in order to update all covered RobotNodes)
         - the Tool Center point (TCP)
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT RobotNodeSet : public SceneObjectSet, public boost::enable_shared_from_this<RobotNodeSet>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT RobotNodeSet : public SceneObjectSet, public std::enable_shared_from_this<RobotNodeSet>
     {
     public:
         typedef std::vector<RobotNodePtr> NodeContainerT;
diff --git a/VirtualRobot/RuntimeEnvironment.cpp b/VirtualRobot/RuntimeEnvironment.cpp
index 1c0873b9547805c30d8b38a90874a6c1cf86e453..9807c297ce063bc4a662ad18141843e9f3ebadfe 100644
--- a/VirtualRobot/RuntimeEnvironment.cpp
+++ b/VirtualRobot/RuntimeEnvironment.cpp
@@ -8,9 +8,17 @@
 #include "VirtualRobotException.h"
 #include "Visualization/VisualizationFactory.h"
 
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
+
+#include <filesystem>
+
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
+
     bool RuntimeEnvironment::pathInitialized = false;
 
     std::string RuntimeEnvironment::caption = "Simox runtime options";
diff --git a/VirtualRobot/RuntimeEnvironment.h b/VirtualRobot/RuntimeEnvironment.h
index 0bb705d58afb76fbf6f4b3301b33acb3c61d00ab..6a4b9a941cc64796388d23c7b32c099554204606 100644
--- a/VirtualRobot/RuntimeEnvironment.h
+++ b/VirtualRobot/RuntimeEnvironment.h
@@ -28,6 +28,10 @@
 #include <set>
 #include <string>
 #include <vector>
+#include <iostream>
+
+#include <boost/program_options.hpp>
+#include <boost/core/demangle.hpp>
 
 #include <Eigen/Core>
 
diff --git a/VirtualRobot/Scene.cpp b/VirtualRobot/Scene.cpp
index eaa2bb3989fcec274b316e81c8bc02ae4d500500..7f49e3da4fec6b9619f52c9c4f1215f8e2534db3 100644
--- a/VirtualRobot/Scene.cpp
+++ b/VirtualRobot/Scene.cpp
@@ -8,8 +8,8 @@
 
 namespace VirtualRobot
 {
-
-
+    using std::cout;
+    using std::endl;
 
     Scene::Scene(const std::string& name)
         : name(name)
diff --git a/VirtualRobot/Scene.h b/VirtualRobot/Scene.h
index ba11e9fc9aa3a5a8627b3fd8151ce9beef48c65d..8a098521e11b586cf25a66fc615f57b84b0a5d63 100644
--- a/VirtualRobot/Scene.h
+++ b/VirtualRobot/Scene.h
@@ -178,12 +178,12 @@ namespace VirtualRobot
         /*!
             Retrieve a visualization in the given format.
             Example usage:
-             boost::shared_ptr<VirtualRobot::CoinVisualization> visualization = scene->getVisualization<CoinVisualization>();
+             std::shared_ptr<VirtualRobot::CoinVisualization> visualization = scene->getVisualization<CoinVisualization>();
              SoNode* visualisationNode = NULL;
              if (visualization)
                  visualisationNode = visualization->getCoinVisualization();
         */
-        template <typename T> boost::shared_ptr<T> getVisualization(SceneObject::VisualizationType visuType = SceneObject::Full, bool addRobots = true, bool addObstacles = true, bool addManipulationObjects = true, bool addTrajectories = true, bool addSceneObjectSets = true);
+        template <typename T> std::shared_ptr<T> getVisualization(SceneObject::VisualizationType visuType = SceneObject::Full, bool addRobots = true, bool addObstacles = true, bool addManipulationObjects = true, bool addTrajectories = true, bool addSceneObjectSets = true);
 
 
 
@@ -213,10 +213,10 @@ namespace VirtualRobot
      * A compile time error is thrown if a different class type is used as template argument.
      */
     template <typename T>
-    boost::shared_ptr<T> Scene::getVisualization(SceneObject::VisualizationType visuType, bool addRobots, bool addObstacles, bool addManipulationObjects, bool addTrajectories, bool addSceneObjectSets)
+    std::shared_ptr<T> Scene::getVisualization(SceneObject::VisualizationType visuType, bool addRobots, bool addObstacles, bool addManipulationObjects, bool addTrajectories, bool addSceneObjectSets)
     {
-        const bool IS_SUBCLASS_OF_VISUALIZATION = ::boost::is_base_of<Visualization, T>::value;
-        BOOST_MPL_ASSERT_MSG(IS_SUBCLASS_OF_VISUALIZATION, TEMPLATE_PARAMETER_FOR_VirtualRobot_getVisualization_MUST_BT_A_SUBCLASS_OF_VirtualRobot__Visualization, (T));
+        static_assert(::std::is_base_of_v<Visualization, T>,
+                "TEMPLATE_PARAMETER_FOR_VirtualRobot_getVisualization_MUST_BT_A_SUBCLASS_OF_VirtualRobot__Visualization");
         std::vector<VisualizationNodePtr> collectedVisualizationNodes;
 
         if (addRobots)
@@ -281,7 +281,7 @@ namespace VirtualRobot
             }
         }
 
-        boost::shared_ptr<T> visualization(new T(collectedVisualizationNodes));
+        std::shared_ptr<T> visualization(new T(collectedVisualizationNodes));
         return visualization;
     }
 
diff --git a/VirtualRobot/SceneObject.cpp b/VirtualRobot/SceneObject.cpp
index 886c7dececec5bb3643dc44019c50e15df2e9222..224caa0563ad4f2104106192c9e32b683d356781 100644
--- a/VirtualRobot/SceneObject.cpp
+++ b/VirtualRobot/SceneObject.cpp
@@ -9,6 +9,7 @@
 #include "Robot.h"
 #include <cmath>
 #include <algorithm>
+#include <filesystem>
 #include <Eigen/Dense>
 #include "math/Helpers.h"
 
@@ -16,7 +17,8 @@
 
 namespace VirtualRobot
 {
-
+    using std::cout;
+    using std::endl;
 
     SceneObject::SceneObject(const std::string& name, VisualizationNodePtr visualization /*= VisualizationNodePtr()*/, CollisionModelPtr collisionModel /*= CollisionModelPtr()*/, const Physics& p /*= Physics()*/, CollisionCheckerPtr colChecker /*= CollisionCheckerPtr()*/)
     {
diff --git a/VirtualRobot/SceneObject.h b/VirtualRobot/SceneObject.h
index 7020de388c598fa41e88afc50dfdd0c984e560b2..24fad0f0d563e0f78eb008ce0ef84609213d4968 100644
--- a/VirtualRobot/SceneObject.h
+++ b/VirtualRobot/SceneObject.h
@@ -26,20 +26,21 @@
 #include "VirtualRobotException.h"
 #include "VirtualRobot.h"
 #include "Visualization/VisualizationNode.h"
+
 #include <Eigen/Core>
 #include <Eigen/Geometry>
+
+#include <type_traits>
 #include <string>
 #include <iomanip>
 #include <vector>
 
 
-
-
 namespace VirtualRobot
 {
     class Robot;
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT SceneObject : public boost::enable_shared_from_this<SceneObject>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT SceneObject : public std::enable_shared_from_this<SceneObject>
     {
         friend class RobotFactory;
     public:
@@ -322,14 +323,14 @@ namespace VirtualRobot
         /*!
             Retrieve a visualization in the given format.
             Example usage:
-             boost::shared_ptr<VirtualRobot::CoinVisualization> visualization = robot->getVisualization<CoinVisualization>();
+             std::shared_ptr<VirtualRobot::CoinVisualization> visualization = robot->getVisualization<CoinVisualization>();
              SoNode* visualisationNode = NULL;
              if (visualization)
                  visualisationNode = visualization->getCoinVisualization();
 
             @see CoinVisualizationFactory::getCoinVisualization() for convenient access!
         */
-        template <typename T> boost::shared_ptr<T> getVisualization(SceneObject::VisualizationType visuType = SceneObject::Full);
+        template <typename T> std::shared_ptr<T> getVisualization(SceneObject::VisualizationType visuType = SceneObject::Full);
 
         /*!
           Convenient method for highlighting the visualization of this object.
@@ -447,11 +448,11 @@ namespace VirtualRobot
      * A compile time error is thrown if a different class type is used as template argument.
      */
     template <typename T>
-    boost::shared_ptr<T> SceneObject::getVisualization(SceneObject::VisualizationType visuType)
+    std::shared_ptr<T> SceneObject::getVisualization(SceneObject::VisualizationType visuType)
     {
-        const bool IS_SUBCLASS_OF_VISUALIZATION = ::boost::is_base_of<Visualization, T>::value;
-        BOOST_MPL_ASSERT_MSG(IS_SUBCLASS_OF_VISUALIZATION, TEMPLATE_PARAMETER_FOR_VirtualRobot_getVisualization_MUST_BT_A_SUBCLASS_OF_VirtualRobot__Visualization, (T));
-        boost::shared_ptr<T> visualization(new T(getVisualization(visuType)));
+        static_assert(::std::is_base_of_v<Visualization, T>,
+                "TEMPLATE_PARAMETER_FOR_VirtualRobot_getVisualization_MUST_BT_A_SUBCLASS_OF_VirtualRobot__Visualization");
+        std::shared_ptr<T> visualization(new T(getVisualization(visuType)));
         return visualization;
     }
 
diff --git a/VirtualRobot/SceneObjectSet.cpp b/VirtualRobot/SceneObjectSet.cpp
index f41cc4cf8e778fdd786ef59583298a69c7ef684a..00aed81823a740479fcd676b0c9f97725109b2ab 100644
--- a/VirtualRobot/SceneObjectSet.cpp
+++ b/VirtualRobot/SceneObjectSet.cpp
@@ -10,6 +10,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     //----------------------------------------------------------------------
     // class SceneObjectSet constructor
@@ -119,7 +121,7 @@ namespace VirtualRobot
     {
         for (auto& robotNode : robotNodes)
         {
-            SceneObjectPtr cm = boost::dynamic_pointer_cast<SceneObject>(robotNode);
+            SceneObjectPtr cm = std::dynamic_pointer_cast<SceneObject>(robotNode);
 
             if (cm)
             {
@@ -152,7 +154,7 @@ namespace VirtualRobot
     {
         for (auto& mobj : mos)
         {
-            SceneObjectPtr so = boost::dynamic_pointer_cast<SceneObject>(mobj);
+            SceneObjectPtr so = std::dynamic_pointer_cast<SceneObject>(mobj);
             addSceneObject(so);
         }
     }
diff --git a/VirtualRobot/SphereApproximator.cpp b/VirtualRobot/SphereApproximator.cpp
index 2160a2ca13ae9f6ddffeb32e98b359ae2fe56b9d..2519cf8ee9ec294aa18e489885445c9a821634aa 100644
--- a/VirtualRobot/SphereApproximator.cpp
+++ b/VirtualRobot/SphereApproximator.cpp
@@ -12,6 +12,8 @@
 #include <iostream>
 #include "VirtualRobot/Visualization/TriMeshModel.h"
 
+#include <Eigen/Geometry>
+
 using namespace std;
 
 namespace VirtualRobot
diff --git a/VirtualRobot/Tools/Gravity.cpp b/VirtualRobot/Tools/Gravity.cpp
index c9ac4c6d367c2251bd4090d65c834735679928b4..34cfc41fef122130549312252edcf43f81f97195 100644
--- a/VirtualRobot/Tools/Gravity.cpp
+++ b/VirtualRobot/Tools/Gravity.cpp
@@ -5,6 +5,8 @@
 #include "../RobotNodeSet.h"
 #include "../Robot.h"
 
+#include <Eigen/Geometry>
+
 using namespace VirtualRobot;
 
 Gravity::Gravity(VirtualRobot::RobotPtr robot, VirtualRobot::RobotNodeSetPtr rnsJoints, VirtualRobot::RobotNodeSetPtr rnsBodies) :
@@ -143,7 +145,7 @@ void Gravity::GravityData::init(SceneObjectPtr node, const std::vector<RobotNode
     this->node = node;
     dataVec.resize(joints.size());
 
-    RobotNodePtr thisNode = boost::dynamic_pointer_cast<RobotNode>(node);
+    RobotNodePtr thisNode = std::dynamic_pointer_cast<RobotNode>(node);
     for (size_t i = 0; i < joints.size(); ++i) {
         if(thisNode == joints.at(i)){
             computeTorque = true;
@@ -166,7 +168,7 @@ void Gravity::GravityData::init(SceneObjectPtr node, const std::vector<RobotNode
         GravityDataPtr data;
         data = GravityData::create(child, joints, bodies, dataVec);
         children[child->getName()] = data;
-        auto childNode = boost::dynamic_pointer_cast<RobotNode>(child);
+        auto childNode = std::dynamic_pointer_cast<RobotNode>(child);
         //                    VR_INFO << "adding child mass sum: " << child->getName() << " : " << data->massSum << std::endl;
         massSum += data->massSum;
     }
@@ -201,7 +203,7 @@ void Gravity::GravityData::computeCoMAndTorque(Eigen::Vector3f &comPositionGloba
 //        VR_INFO << "CoM of " << node->getName() << ": " << node->getCoMGlobal() << " accumulated CoM: " << comPositionGlobal << "\nmass: " << node->getMass() << " massSum: " << massSum << std::endl;
     if(computeTorque)
     {
-        VirtualRobot::RobotNodeRevolutePtr rnRevolute = boost::dynamic_pointer_cast<VirtualRobot::RobotNodeRevolute>(node);
+        VirtualRobot::RobotNodeRevolutePtr rnRevolute = std::dynamic_pointer_cast<VirtualRobot::RobotNodeRevolute>(node);
         Eigen::Vector3f axisGlobal = rnRevolute->getJointRotationAxis();
         VirtualRobot::MathTools::BaseLine<Eigen::Vector3f> l(node->getGlobalPose().block<3,1>(0,3), axisGlobal);
         Eigen::Vector3f pointOnAxis = VirtualRobot::MathTools::nearestPointOnLine<Eigen::Vector3f>(l, comPositionGlobal);
diff --git a/VirtualRobot/Tools/Gravity.h b/VirtualRobot/Tools/Gravity.h
index c55f6e9f83f1825130a47cb9efde769a1774b1a3..fd5ac46c9f8ff49a1103a8166af01366cc0b0a9c 100644
--- a/VirtualRobot/Tools/Gravity.h
+++ b/VirtualRobot/Tools/Gravity.h
@@ -25,6 +25,9 @@
 
 #include "../VirtualRobot.h"
 
+#include <string>
+#include <map>
+
 namespace VirtualRobot
 {
     class Gravity
@@ -45,8 +48,8 @@ namespace VirtualRobot
         std::map<std::string, float> getMasses();
     protected:
         struct GravityData;
-        typedef boost::shared_ptr<GravityData> GravityDataPtr;
-        struct GravityData : boost::enable_shared_from_this<GravityData>
+        typedef std::shared_ptr<GravityData> GravityDataPtr;
+        struct GravityData : std::enable_shared_from_this<GravityData>
         {
             GravityData();
             static GravityDataPtr create(SceneObjectPtr node, const std::vector<VirtualRobot::RobotNodePtr> &joints, const std::vector<VirtualRobot::RobotNodePtr> &bodies, std::vector<GravityDataPtr> &dataVec);
@@ -74,7 +77,7 @@ namespace VirtualRobot
         std::vector<VirtualRobot::RobotNodePtr> nodesBodies;
     };
 
-    typedef boost::shared_ptr<Gravity> GravityPtr;
+    typedef std::shared_ptr<Gravity> GravityPtr;
 
 
 }
diff --git a/VirtualRobot/Trajectory.cpp b/VirtualRobot/Trajectory.cpp
index 976896e517af646bc6679796e109312effb181b0..8cf4dfc5908c6e648a1a56cea308e2653fd2ca5f 100644
--- a/VirtualRobot/Trajectory.cpp
+++ b/VirtualRobot/Trajectory.cpp
@@ -6,6 +6,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     Trajectory::Trajectory(RobotNodeSetPtr rns, const std::string& name)
         : rns(rns), name(name)
diff --git a/VirtualRobot/Trajectory.h b/VirtualRobot/Trajectory.h
index 301da6b2eec1f114d7962f88302fa369752cc7ec..79a793135dfa403d1e759b114c1745087ded1be9 100644
--- a/VirtualRobot/Trajectory.h
+++ b/VirtualRobot/Trajectory.h
@@ -35,7 +35,7 @@ namespace VirtualRobot
     /*!
         A representation of a trajectory in joint space, associated with a RobotNodeSet.
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT Trajectory : public boost::enable_shared_from_this<Trajectory>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT Trajectory : public std::enable_shared_from_this<Trajectory>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
diff --git a/VirtualRobot/VirtualRobot.cpp b/VirtualRobot/VirtualRobot.cpp
index 5a6ca674067b379bf8c8d5951a81480e713af6d4..b6d660846dbcfd599b4cb74e27c77f9b4d2cbf2d 100644
--- a/VirtualRobot/VirtualRobot.cpp
+++ b/VirtualRobot/VirtualRobot.cpp
@@ -21,7 +21,7 @@ namespace VirtualRobot
     void init(int &argc, char* argv[], const std::string &appName)
     {
         globalAppName = appName;
-        boost::shared_ptr<VisualizationFactory> v = VisualizationFactory::first(NULL);
+        std::shared_ptr<VisualizationFactory> v = VisualizationFactory::first(NULL);
         if (v)
         {
             v->init(argc, argv, globalAppName);
diff --git a/VirtualRobot/VirtualRobot.h b/VirtualRobot/VirtualRobot.h
index 142bf505fbd615e06cb97e30c05b466287f1f14a..bf48e18bb729b5d6c8539fc84ecd842e5d43069a 100644
--- a/VirtualRobot/VirtualRobot.h
+++ b/VirtualRobot/VirtualRobot.h
@@ -109,53 +109,12 @@
 
 #include <SimoxUtility/EigenStdVector.h>
 
-#ifndef Q_MOC_RUN // workaround for some bug in some QT/boost versions
-#include <boost/shared_ptr.hpp>
-#include <boost/assert.hpp>
-#include <boost/weak_ptr.hpp>
-#include <boost/thread.hpp>
-#include <boost/pointer_cast.hpp>
-#include <boost/enable_shared_from_this.hpp>
-#include <boost/thread/shared_mutex.hpp>
-#include <boost/type_traits/is_base_of.hpp>
-#include <boost/bind.hpp>
-#include <filesystem>
-#include <boost/mem_fn.hpp>
-#include <boost/foreach.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/algorithm/string.hpp>
-#include <boost/program_options.hpp>
-#include <boost/math/special_functions/fpclassify.hpp>
-#include <boost/version.hpp>
-#include <boost/format.hpp>
-#include <boost/mpl/assert.hpp>
-#include <boost/thread/recursive_mutex.hpp>
-#include <boost/unordered_set.hpp>
-#include <boost/unordered_map.hpp>
-#include <boost/current_function.hpp>
-#endif
-
+#include <memory>
 
-#include <iostream>
-#include <sstream>
-#include <cmath>
-
-//#ifdef _DEBUG
-//#ifdef WIN32
-// ENABLE MEMORY LEAK CHECKING FOR WINDOWS
-//#define _CRTDBG_MAP_ALLOC
-//#include <stdlib.h>
-//#include <crtdbg.h>
-//#endif
-//#endif
 
 namespace VirtualRobot
 {
 
-    // only valid within the VirtualRobot namespace
-    using std::cout;
-    using std::endl;
-
     class CoMIK;
     class DifferentialIK;
     class HierarchicalIK;
@@ -204,55 +163,55 @@ namespace VirtualRobot
     class ContactSensor;
     class LocalRobot;
 
-    typedef boost::shared_ptr<CoMIK> CoMIKPtr;
-    typedef boost::shared_ptr<HierarchicalIK> HierarchicalIKPtr;
-    typedef boost::shared_ptr<DifferentialIK> DifferentialIKPtr;
-    typedef boost::shared_ptr<Constraint> ConstraintPtr;
-    typedef boost::shared_ptr<TSRConstraint> TSRConstraintPtr;
-    typedef boost::shared_ptr<BalanceConstraint> BalanceConstraintPtr;
-    typedef boost::shared_ptr<PoseConstraint> PoseConstraintPtr;
-    typedef boost::shared_ptr<PositionConstraint> PositionConstraintPtr;
-    typedef boost::shared_ptr<OrientationConstraint> OrientationConstraintPtr;
-    typedef boost::shared_ptr<RobotNode> RobotNodePtr;
-    typedef boost::shared_ptr<SupportPolygon> SupportPolygonPtr;
-    typedef boost::shared_ptr<RobotNodeRevolute> RobotNodeRevolutePtr;
-    typedef boost::shared_ptr<RobotNodeSet> RobotNodeSetPtr;
-    typedef boost::shared_ptr<KinematicChain> KinematicChainPtr;
-    typedef boost::weak_ptr<RobotNode> RobotNodeWeakPtr;
-    typedef boost::shared_ptr<RobotNodeFactory> RobotNodeFactoryPtr;
-    typedef boost::shared_ptr<Robot> RobotPtr;
-    typedef boost::weak_ptr<Robot> RobotWeakPtr;
-    typedef boost::shared_ptr<EndEffector> EndEffectorPtr;
-    typedef boost::shared_ptr<EndEffectorActor> EndEffectorActorPtr;
-    typedef boost::shared_ptr<CollisionModel> CollisionModelPtr;
-    typedef boost::shared_ptr<CollisionChecker> CollisionCheckerPtr;
-    typedef boost::shared_ptr<SceneObjectSet> SceneObjectSetPtr;
-    typedef boost::shared_ptr<TriMeshModel> TriMeshModelPtr;
-    typedef boost::shared_ptr<SceneObject> SceneObjectPtr;
-    typedef boost::weak_ptr<SceneObject> SceneObjectWeakPtr;
-    typedef boost::shared_ptr<Obstacle> ObstaclePtr;
-    typedef boost::shared_ptr<Visualization> VisualizationPtr;
-    typedef boost::shared_ptr<VisualizationNode> VisualizationNodePtr;
-    typedef boost::shared_ptr<VisualizationFactory> VisualizationFactoryPtr;
-    typedef boost::shared_ptr<WorkspaceData> WorkspaceDataPtr;
-    typedef boost::shared_ptr<WorkspaceDataArray> WorkspaceDataArrayPtr;
-    typedef boost::shared_ptr<WorkspaceRepresentation> WorkspaceRepresentationPtr;
-    typedef boost::shared_ptr<Reachability> ReachabilityPtr;
-    typedef boost::shared_ptr<Scene> ScenePtr;
-    typedef boost::shared_ptr<RobotConfig> RobotConfigPtr;
-    typedef boost::shared_ptr<Grasp> GraspPtr;
-    typedef boost::shared_ptr<GraspSet> GraspSetPtr;
-    typedef boost::shared_ptr<ManipulationObject> ManipulationObjectPtr;
-    typedef boost::shared_ptr<CDManager> CDManagerPtr;
-    typedef boost::shared_ptr<PoseQualityMeasurement> PoseQualityMeasurementPtr;
-    typedef boost::shared_ptr<PoseQualityManipulability> PoseQualityManipulabilityPtr;
-    typedef boost::shared_ptr<Trajectory> TrajectoryPtr;
-    typedef boost::shared_ptr<SphereApproximator> SphereApproximatorPtr;
-    typedef boost::shared_ptr<BasicGraspQualityMeasure> BasicGraspQualityMeasurePtr;
-    typedef boost::shared_ptr<WorkspaceGrid> WorkspaceGridPtr;
-    typedef boost::shared_ptr<ForceTorqueSensor> ForceTorqueSensorPtr;
-    typedef boost::shared_ptr<ContactSensor> ContactSensorPtr;
-    typedef boost::shared_ptr<LocalRobot> LocalRobotPtr;
+    typedef std::shared_ptr<CoMIK> CoMIKPtr;
+    typedef std::shared_ptr<HierarchicalIK> HierarchicalIKPtr;
+    typedef std::shared_ptr<DifferentialIK> DifferentialIKPtr;
+    typedef std::shared_ptr<Constraint> ConstraintPtr;
+    typedef std::shared_ptr<TSRConstraint> TSRConstraintPtr;
+    typedef std::shared_ptr<BalanceConstraint> BalanceConstraintPtr;
+    typedef std::shared_ptr<PoseConstraint> PoseConstraintPtr;
+    typedef std::shared_ptr<PositionConstraint> PositionConstraintPtr;
+    typedef std::shared_ptr<OrientationConstraint> OrientationConstraintPtr;
+    typedef std::shared_ptr<RobotNode> RobotNodePtr;
+    typedef std::shared_ptr<SupportPolygon> SupportPolygonPtr;
+    typedef std::shared_ptr<RobotNodeRevolute> RobotNodeRevolutePtr;
+    typedef std::shared_ptr<RobotNodeSet> RobotNodeSetPtr;
+    typedef std::shared_ptr<KinematicChain> KinematicChainPtr;
+    typedef std::weak_ptr<RobotNode> RobotNodeWeakPtr;
+    typedef std::shared_ptr<RobotNodeFactory> RobotNodeFactoryPtr;
+    typedef std::shared_ptr<Robot> RobotPtr;
+    typedef std::weak_ptr<Robot> RobotWeakPtr;
+    typedef std::shared_ptr<EndEffector> EndEffectorPtr;
+    typedef std::shared_ptr<EndEffectorActor> EndEffectorActorPtr;
+    typedef std::shared_ptr<CollisionModel> CollisionModelPtr;
+    typedef std::shared_ptr<CollisionChecker> CollisionCheckerPtr;
+    typedef std::shared_ptr<SceneObjectSet> SceneObjectSetPtr;
+    typedef std::shared_ptr<TriMeshModel> TriMeshModelPtr;
+    typedef std::shared_ptr<SceneObject> SceneObjectPtr;
+    typedef std::weak_ptr<SceneObject> SceneObjectWeakPtr;
+    typedef std::shared_ptr<Obstacle> ObstaclePtr;
+    typedef std::shared_ptr<Visualization> VisualizationPtr;
+    typedef std::shared_ptr<VisualizationNode> VisualizationNodePtr;
+    typedef std::shared_ptr<VisualizationFactory> VisualizationFactoryPtr;
+    typedef std::shared_ptr<WorkspaceData> WorkspaceDataPtr;
+    typedef std::shared_ptr<WorkspaceDataArray> WorkspaceDataArrayPtr;
+    typedef std::shared_ptr<WorkspaceRepresentation> WorkspaceRepresentationPtr;
+    typedef std::shared_ptr<Reachability> ReachabilityPtr;
+    typedef std::shared_ptr<Scene> ScenePtr;
+    typedef std::shared_ptr<RobotConfig> RobotConfigPtr;
+    typedef std::shared_ptr<Grasp> GraspPtr;
+    typedef std::shared_ptr<GraspSet> GraspSetPtr;
+    typedef std::shared_ptr<ManipulationObject> ManipulationObjectPtr;
+    typedef std::shared_ptr<CDManager> CDManagerPtr;
+    typedef std::shared_ptr<PoseQualityMeasurement> PoseQualityMeasurementPtr;
+    typedef std::shared_ptr<PoseQualityManipulability> PoseQualityManipulabilityPtr;
+    typedef std::shared_ptr<Trajectory> TrajectoryPtr;
+    typedef std::shared_ptr<SphereApproximator> SphereApproximatorPtr;
+    typedef std::shared_ptr<BasicGraspQualityMeasure> BasicGraspQualityMeasurePtr;
+    typedef std::shared_ptr<WorkspaceGrid> WorkspaceGridPtr;
+    typedef std::shared_ptr<ForceTorqueSensor> ForceTorqueSensorPtr;
+    typedef std::shared_ptr<ContactSensor> ContactSensorPtr;
+    typedef std::shared_ptr<LocalRobot> LocalRobotPtr;
 
     /*
      * Predefine for MathTools.h
@@ -275,9 +234,9 @@ namespace VirtualRobot
 
         typedef BaseLine<Eigen::Vector3f> Line;
         typedef BaseLine<Eigen::Vector2f> Line2D;
-        typedef boost::shared_ptr<ConvexHull2D> ConvexHull2DPtr;
-        typedef boost::shared_ptr<ConvexHull3D> ConvexHull3DPtr;
-        typedef boost::shared_ptr<ConvexHull6D> ConvexHull6DPtr;
+        typedef std::shared_ptr<ConvexHull2D> ConvexHull2DPtr;
+        typedef std::shared_ptr<ConvexHull3D> ConvexHull3DPtr;
+        typedef std::shared_ptr<ConvexHull6D> ConvexHull6DPtr;
 
    }
 
diff --git a/VirtualRobot/VirtualRobotException.h b/VirtualRobot/VirtualRobotException.h
index c1327df0c6b14530da9ca8a5aea27b85fa13da5e..cf4ed6c18777db0393582270f1eaef5a7f5b1b55 100644
--- a/VirtualRobot/VirtualRobotException.h
+++ b/VirtualRobot/VirtualRobotException.h
@@ -23,10 +23,14 @@
 #pragma once
 
 #include "VirtualRobot.h"
+
+#include <boost/current_function.hpp>
+
 #include <string>
 #include <iostream>
 #include <sstream>
 #include <stdexcept>
+
 #ifdef WIN32
 #pragma warning(disable:4275)
 #endif
diff --git a/VirtualRobot/VirtualRobotTest.h b/VirtualRobot/VirtualRobotTest.h
index 6d1dbeb7b0fd177d71fe1c383796c569a922d7a6..6d046eda289adaa4fbcae7ca92bac3609b25a370 100644
--- a/VirtualRobot/VirtualRobotTest.h
+++ b/VirtualRobot/VirtualRobotTest.h
@@ -27,6 +27,7 @@
 #include "VirtualRobot.h"
 #include <string>
 #include <fstream>
+#include <iostream>
 
 #ifndef WIN32
 struct OutputConfiguration
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualization.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualization.cpp
index ab0de471fd232bc3bd2c15774ec4a18b3f03cb7e..df4c91f161a54ecd72a67b4d5baeb054c2c3b0c0 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualization.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualization.cpp
@@ -22,6 +22,7 @@
 
 namespace VirtualRobot
 {
+    using std::endl;
 
     CoinVisualization::CoinVisualization(const VisualizationNodePtr visualizationNode) :
         Visualization(visualizationNode)
@@ -89,9 +90,9 @@ namespace VirtualRobot
 
         visuRoot->addChild(visualization);
 
-        BOOST_FOREACH(VisualizationNodePtr visualizationNode, visualizationNodes)
+        for (VisualizationNodePtr const& visualizationNode : visualizationNodes)
         {
-            boost::shared_ptr<CoinVisualizationNode> coinVisualizationNode = boost::dynamic_pointer_cast<CoinVisualizationNode>(visualizationNode);
+            std::shared_ptr<CoinVisualizationNode> coinVisualizationNode = std::dynamic_pointer_cast<CoinVisualizationNode>(visualizationNode);
 
             if (coinVisualizationNode && coinVisualizationNode->getCoinVisualization())
             {
@@ -145,7 +146,7 @@ namespace VirtualRobot
             return false;
         }
 
-        boost::shared_ptr<CoinVisualizationNode> coinVisualizationNode = boost::dynamic_pointer_cast<CoinVisualizationNode>(visualizationNode);
+        std::shared_ptr<CoinVisualizationNode> coinVisualizationNode = std::dynamic_pointer_cast<CoinVisualizationNode>(visualizationNode);
 
 
         if (coinVisualizationNode)
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualization.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualization.h
index 924d524b13b0f2c7e87388366afb6e21fbdad0b6..7c735553436faed26335bacffea33c5941108a6f 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualization.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualization.h
@@ -78,7 +78,7 @@ namespace VirtualRobot
         SoMaterial *color;
     };
 
-    typedef boost::shared_ptr<CoinVisualization> CoinVisualizationPtr;
+    typedef std::shared_ptr<CoinVisualization> CoinVisualizationPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
index fd15cb2590d7972d3529c1479c6480a4b57454e6..9293fa7f9316156a0479c7f5230a1d8bf67eaf29 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -94,8 +94,10 @@ namespace filesystem = std::filesystem;
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
-    boost::mutex CoinVisualizationFactory::globalTextureCacheMutex;
+    std::mutex CoinVisualizationFactory::globalTextureCacheMutex;
     CoinVisualizationFactory::TextureCacheMap CoinVisualizationFactory::globalTextureCache;
 
     CoinVisualizationFactory::CoinVisualizationFactory() = default;
@@ -179,7 +181,7 @@ namespace VirtualRobot
 
         if (primitive->type == Primitive::Box::TYPE)
         {
-            Primitive::Box* box = boost::dynamic_pointer_cast<Primitive::Box>(primitive).get();
+            Primitive::Box* box = std::dynamic_pointer_cast<Primitive::Box>(primitive).get();
             SoCube* soBox = new SoCube;
             soBox->width = box->width / 1000.f;
             soBox->height = box->height / 1000.f;
@@ -188,14 +190,14 @@ namespace VirtualRobot
         }
         else if (primitive->type == Primitive::Sphere::TYPE)
         {
-            Primitive::Sphere* sphere = boost::dynamic_pointer_cast<Primitive::Sphere>(primitive).get();
+            Primitive::Sphere* sphere = std::dynamic_pointer_cast<Primitive::Sphere>(primitive).get();
             SoSphere* soSphere = new SoSphere;
             soSphere->radius = sphere->radius / 1000.f;
             coinVisualization->addChild(soSphere);
         }
         else if (primitive->type == Primitive::Cylinder::TYPE)
         {
-            Primitive::Cylinder* cylinder = boost::dynamic_pointer_cast<Primitive::Cylinder>(primitive).get();
+            Primitive::Cylinder* cylinder = std::dynamic_pointer_cast<Primitive::Cylinder>(primitive).get();
             SoCylinder* soCylinder = new SoCylinder;
             soCylinder->radius = cylinder->radius / 1000.f;
             soCylinder->height = cylinder->height / 1000.f;
@@ -394,12 +396,12 @@ namespace VirtualRobot
 
     VisualizationPtr CoinVisualizationFactory::getVisualization(const std::vector<VisualizationNodePtr>& visus)
     {
-        return boost::make_shared<CoinVisualization>(visus);
+        return std::make_shared<CoinVisualization>(visus);
     }
 
     VisualizationPtr CoinVisualizationFactory::getVisualization(VisualizationNodePtr visu)
     {
-        return boost::make_shared<CoinVisualization>(visu);
+        return std::make_shared<CoinVisualization>(visu);
     }
 
     SoSeparator* CoinVisualizationFactory::CreateBoundingBox(SoNode* ivModel, bool wireFrame)
@@ -470,14 +472,14 @@ namespace VirtualRobot
     * \return new instance of CoinVisualizationFactory and call SoDB::init()
     * if it has not already been called.
     */
-    boost::shared_ptr<VisualizationFactory> CoinVisualizationFactory::createInstance(void*)
+    std::shared_ptr<VisualizationFactory> CoinVisualizationFactory::createInstance(void*)
     {
         if (!SoDB::isInitialized())
         {
             SoDB::init();
         }
 
-        boost::shared_ptr<CoinVisualizationFactory> coinFactory(new CoinVisualizationFactory());
+        std::shared_ptr<CoinVisualizationFactory> coinFactory(new CoinVisualizationFactory());
         return coinFactory;
     }
 
@@ -1100,7 +1102,7 @@ namespace VirtualRobot
         public:
             void dyingReference() override
             {
-                boost::mutex::scoped_lock lock(CoinVisualizationFactory::globalTextureCacheMutex);
+                std::scoped_lock lock(CoinVisualizationFactory::globalTextureCacheMutex);
                 CoinVisualizationFactory::globalTextureCache.erase(std::make_pair(filesize, path));
                 delete this;
             }
@@ -1120,7 +1122,7 @@ namespace VirtualRobot
         sa.apply(node);
         SoPathList& pl = sa.getPaths();
 
-        boost::mutex::scoped_lock lock(globalTextureCacheMutex);
+        std::scoped_lock lock(globalTextureCacheMutex);
         for (int i = 0; i < pl.getLength(); i++)
         {
             SoFullPath* p = (SoFullPath*) pl[i];
@@ -1392,7 +1394,7 @@ namespace VirtualRobot
             return new SoSeparator;
         }
 
-        boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot = robot->getVisualization<CoinVisualization>(visuType);
+        std::shared_ptr<VirtualRobot::CoinVisualization> visualizationRobot = robot->getVisualization<CoinVisualization>(visuType);
 
         if (visualizationRobot)
         {
@@ -1413,7 +1415,7 @@ namespace VirtualRobot
             return new SoSeparator;
         }
 
-        boost::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject = object->getVisualization<CoinVisualization>(visuType);
+        std::shared_ptr<VirtualRobot::CoinVisualization> visualizationObject = object->getVisualization<CoinVisualization>(visuType);
 
         if (visualizationObject)
         {
@@ -1430,7 +1432,7 @@ namespace VirtualRobot
 
     SoNode* CoinVisualizationFactory::getCoinVisualization(VisualizationNodePtr visu)
     {
-        boost::shared_ptr< CoinVisualizationNode > coinVisu(boost::dynamic_pointer_cast< CoinVisualizationNode >(visu));
+        std::shared_ptr< CoinVisualizationNode > coinVisu(std::dynamic_pointer_cast< CoinVisualizationNode >(visu));
 
         if (!coinVisu)
         {
@@ -2318,7 +2320,7 @@ namespace VirtualRobot
             torusCompletion = 0;
         }
         auto torusNode = createTorus(radius, tubeRadius, torusCompletion, colorR, colorG, colorB, transparency);
-        SoNode* torus = boost::dynamic_pointer_cast<CoinVisualizationNode>(torusNode)->getCoinVisualization();
+        SoNode* torus = std::dynamic_pointer_cast<CoinVisualizationNode>(torusNode)->getCoinVisualization();
 
         SoSeparator* s = new SoSeparator();
         s->ref();
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
index 5868ed1f3ced7a3927fd5d2039173ce4133b1adb..7f3f8fdc8f7152a7dd0be7ad5c65a25e981a65dd 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
@@ -39,9 +39,10 @@
 #include <Inventor/nodes/SoCamera.h>
 
 
-#include <string>
 #include <fstream>
+#include <string>
 #include <cmath>
+#include <mutex>
 
 namespace VirtualRobot
 {
@@ -457,15 +458,15 @@ namespace VirtualRobot
         // AbstractFactoryMethod
     public:
         static std::string getName();
-        static boost::shared_ptr<VisualizationFactory> createInstance(void*);
+        static std::shared_ptr<VisualizationFactory> createInstance(void*);
         typedef std::map<std::pair<size_t, std::string>, void*> TextureCacheMap;
     private:
         static SubClassRegistry registry;
-        static boost::mutex globalTextureCacheMutex;
+        static std::mutex globalTextureCacheMutex;
         static TextureCacheMap globalTextureCache;
     };
 
-    typedef boost::shared_ptr<CoinVisualizationFactory> CoinVisualizationFactoryPtr;
+    typedef std::shared_ptr<CoinVisualizationFactory> CoinVisualizationFactoryPtr;
 
 
 } // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
index 5148c3a8679f41a11da92ed823468fa9e14d5ae3..446d55856d4999acaf2b3edc627b4811cf050f57 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
@@ -31,6 +31,9 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
+
     CoinVisualizationNode::CoinVisualizationNode(TriMeshModelPtr tri):
         CoinVisualizationNode(CoinVisualizationFactory::getCoinVisualization(tri))
     {}
@@ -281,7 +284,7 @@ namespace VirtualRobot
     {
         VisualizationNode::attachVisualization(name, v);
 
-        boost::shared_ptr<CoinVisualizationNode> coinVisualizationNode = boost::dynamic_pointer_cast<CoinVisualizationNode>(v);
+        std::shared_ptr<CoinVisualizationNode> coinVisualizationNode = std::dynamic_pointer_cast<CoinVisualizationNode>(v);
 
         if (coinVisualizationNode && coinVisualizationNode->getCoinVisualization())
         {
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
index d3e37bc1579ea90c03480fe0b6a368b8549972e9..1ac5aac31f7720a0e1cb61c125c0884089d80822 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
@@ -121,7 +121,7 @@ namespace VirtualRobot
                                        const SoPrimitiveVertex* v3);
     };
 
-    typedef boost::shared_ptr<CoinVisualizationNode> CoinVisualizationNodePtr;
+    typedef std::shared_ptr<CoinVisualizationNode> CoinVisualizationNodePtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Visualization/TriMeshModel.cpp b/VirtualRobot/Visualization/TriMeshModel.cpp
index 73e47b49093f08b360a2f91a74f0bea369e03c17..1b97773172fd96e7abaa431df02fe13abd4a6374 100644
--- a/VirtualRobot/Visualization/TriMeshModel.cpp
+++ b/VirtualRobot/Visualization/TriMeshModel.cpp
@@ -8,16 +8,19 @@
 #include "../VirtualRobot.h"
 #include "../DataStructures/nanoflann.hpp"
 #include "../DataStructures/KdTreePointCloud.h"
+
 #include<Eigen/Geometry>
 
 #include <algorithm>
 #include <fstream>
 #include <iomanip>
+#include <set>
 
 
 namespace VirtualRobot
 {
-
+    using std::cout;
+    using std::endl;
 
     TriMeshModel::TriMeshModel() = default;
 
@@ -94,7 +97,7 @@ namespace VirtualRobot
         face.normal = normal;
         if (face.normal.hasNaN())
         {
-            VR_ERROR << "*** NANNNNNNNNNNNNNNNNNNNNN" << endl;
+            VR_ERROR << "*** NANNNNNNNNNNNNNNNNNNNNN" << std::endl;
         }
 
         this->addFace(face);
@@ -182,7 +185,7 @@ namespace VirtualRobot
     {
         if (std::isnan(vertex[0]) || std::isnan(vertex[1]) || std::isnan(vertex[2]))
         {
-            VR_ERROR << "NAN vertex added!!!" << endl;
+            VR_ERROR << "NAN vertex added!!!" << std::endl;
             return -1;
         }
         vertices.push_back(vertex);
diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h
index f1c055ccc96599e0f29f253da5b7bceae9149e69..4ba837ab2cba6d22638c70b0d9d2dc90f142314d 100644
--- a/VirtualRobot/Visualization/VisualizationFactory.h
+++ b/VirtualRobot/Visualization/VisualizationFactory.h
@@ -232,7 +232,7 @@ namespace VirtualRobot
         virtual void cleanup() {}
 
     };
-    typedef boost::shared_ptr<VisualizationFactory::Color> ColorPtr;
+    typedef std::shared_ptr<VisualizationFactory::Color> ColorPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Visualization/VisualizationNode.cpp b/VirtualRobot/Visualization/VisualizationNode.cpp
index 88da726b47dc4a1a00b571206cc0882093073466..8bd7c6a21d79a965537e1ebb042abc2318dd40a5 100644
--- a/VirtualRobot/Visualization/VisualizationNode.cpp
+++ b/VirtualRobot/Visualization/VisualizationNode.cpp
@@ -16,6 +16,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     VisualizationNode::VisualizationNode(const TriMeshModelPtr& triMeshModel) :
         triMeshModel{triMeshModel}
diff --git a/VirtualRobot/Workspace/Manipulability.cpp b/VirtualRobot/Workspace/Manipulability.cpp
index 1214f686cf252d390f9d77d5a306bc5f66bf690a..8c8dce689ca737408021f742e3009b4540a4e8de 100644
--- a/VirtualRobot/Workspace/Manipulability.cpp
+++ b/VirtualRobot/Workspace/Manipulability.cpp
@@ -22,7 +22,8 @@
 
 namespace VirtualRobot
 {
-
+    using std::cout;
+    using std::endl;
 
     Manipulability::Manipulability(RobotPtr robot) : WorkspaceRepresentation(robot)
     {
@@ -293,7 +294,7 @@ namespace VirtualRobot
         // init self dist
         if (considerSelfDist)
         {
-            PoseQualityExtendedManipulabilityPtr pqm = boost::dynamic_pointer_cast<PoseQualityExtendedManipulability>(measure);
+            PoseQualityExtendedManipulabilityPtr pqm = std::dynamic_pointer_cast<PoseQualityExtendedManipulability>(measure);
             if (pqm)
             {
                 VR_INFO << "Setting up self dist, alpha:" << selfDistAlpha << ", beta:" << selfDistBeta << endl;
@@ -351,7 +352,7 @@ namespace VirtualRobot
         // since 2.9: alpha and beta for self dist
         float selfDistA = 0.0f;
         float selfDistB = 0.0f;
-        PoseQualityExtendedManipulabilityPtr pqm = boost::dynamic_pointer_cast<PoseQualityExtendedManipulability>(measure);
+        PoseQualityExtendedManipulabilityPtr pqm = std::dynamic_pointer_cast<PoseQualityExtendedManipulability>(measure);
         if (pqm)
         {
             pqm->getSelfDistParameters(selfDistA, selfDistB);
diff --git a/VirtualRobot/Workspace/Manipulability.h b/VirtualRobot/Workspace/Manipulability.h
index f3192583d39f3f3f717bb6b7f64db4c7dbb5f2ff..dcf3d6a85eef66bee5c3bfceea867f41ac1d8cad 100644
--- a/VirtualRobot/Workspace/Manipulability.h
+++ b/VirtualRobot/Workspace/Manipulability.h
@@ -47,7 +47,7 @@ namespace VirtualRobot
             \see PoseQualityManipulability
             \see PoseQualityExtendedManipulability
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT Manipulability : public WorkspaceRepresentation, public boost::enable_shared_from_this<Manipulability>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT Manipulability : public WorkspaceRepresentation, public std::enable_shared_from_this<Manipulability>
     {
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW
@@ -204,7 +204,7 @@ namespace VirtualRobot
 
     };
 
-    typedef boost::shared_ptr<Manipulability> ManipulabilityPtr;
+    typedef std::shared_ptr<Manipulability> ManipulabilityPtr;
 
 } // namespace VirtualRobot
 
diff --git a/VirtualRobot/Workspace/Reachability.h b/VirtualRobot/Workspace/Reachability.h
index b8bb929bae8deaa771642a0201e4b5fd40543451..3594c8970d738015347ac9783cde50161c1bf70d 100644
--- a/VirtualRobot/Workspace/Reachability.h
+++ b/VirtualRobot/Workspace/Reachability.h
@@ -41,7 +41,7 @@ namespace VirtualRobot
             I.E. think of an arm of a humanoid where the reachability is linked to the shoulder.
             When the torso moves, the reachability also changes it's position according to the position of the shoulder.
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT Reachability : public WorkspaceRepresentation, public boost::enable_shared_from_this<Reachability>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT Reachability : public WorkspaceRepresentation, public std::enable_shared_from_this<Reachability>
     {
     public:
         friend class CoinVisualizationFactory;
diff --git a/VirtualRobot/Workspace/VoxelTree6D.hpp b/VirtualRobot/Workspace/VoxelTree6D.hpp
index c92d202b5e09da73adc7fc55671aa9181b08bf96..76349523f4598bdd357112ff08bc611fbecd7dd7 100644
--- a/VirtualRobot/Workspace/VoxelTree6D.hpp
+++ b/VirtualRobot/Workspace/VoxelTree6D.hpp
@@ -91,20 +91,20 @@ namespace VirtualRobot
 
             if (verbose)
             {
-                VR_INFO << "Creating Voxelized tree data structure. " << endl;
-                VR_INFO << "Extends (min/max/size):" << endl;
+                VR_INFO << "Creating Voxelized tree data structure. " << std::endl;
+                VR_INFO << "Extends (min/max/size):" << std::endl;
                 std::streamsize pr = std::cout.precision(2);
 
                 for (int i = 0; i < 6; i++)
                 {
-                    cout << std::fixed << minExtend[i] << "," << maxExtend[i] << " -> " << size[i] << endl;
+                    std::cout << std::fixed << minExtend[i] << "," << maxExtend[i] << " -> " << size[i] << std::endl;
                 }
 
                 std::cout << std::resetiosflags(std::ios::fixed);
                 std::cout.precision(pr);
-                VR_INFO << "discretizationTransl:" << discretizationTransl << ". Max translation levels:" << steps << endl;
-                VR_INFO << "discretizationRot:" << discretizationRot << ". Max rotation levels:" << steps2 << endl;
-                VR_INFO << "--> Max Levels:" << maxLevels << endl;
+                VR_INFO << "discretizationTransl:" << discretizationTransl << ". Max translation levels:" << steps << std::endl;
+                VR_INFO << "discretizationRot:" << discretizationRot << ". Max rotation levels:" << steps2 << std::endl;
+                VR_INFO << "--> Max Levels:" << maxLevels << std::endl;
             }
 
             THROW_VR_EXCEPTION_IF(steps <= 0, "Invalid parameters...");
diff --git a/VirtualRobot/Workspace/VoxelTree6DElement.hpp b/VirtualRobot/Workspace/VoxelTree6DElement.hpp
index fa3a707886f19922d6d8356107069ec303919b70..c025b938d7dff683c112b3105514e4eaa5c30471 100644
--- a/VirtualRobot/Workspace/VoxelTree6DElement.hpp
+++ b/VirtualRobot/Workspace/VoxelTree6DElement.hpp
@@ -24,6 +24,7 @@
 
 #include "../VirtualRobot.h"
 
+#include <iostream>
 #include <string>
 #include <vector>
 
@@ -58,7 +59,7 @@ namespace VirtualRobot
 
             if (level >= maxLevels)
             {
-                VR_ERROR << "Exceeding maxLevels?!" << endl;
+                VR_ERROR << "Exceeding maxLevels?!" << std::endl;
             }
         };
 
@@ -172,7 +173,7 @@ namespace VirtualRobot
 
             if (indx < 0)
             {
-                VR_ERROR << "Node do not cover this pos" << endl;
+                VR_ERROR << "Node do not cover this pos" << std::endl;
                 return NULL;
             }
 
@@ -208,13 +209,13 @@ namespace VirtualRobot
         {
             if (!covers(p))
             {
-                VR_ERROR << "Node do not cover this pos" << endl;
+                VR_ERROR << "Node do not cover this pos" << std::endl;
                 return -1;
             }
 
             if (leaf)
             {
-                VR_ERROR << "Node is already a leaf node?!" << endl;
+                VR_ERROR << "Node is already a leaf node?!" << std::endl;
                 return -1;
             }
 
@@ -239,7 +240,7 @@ namespace VirtualRobot
             // test, remove this
             if (res < 0 || res >= 64)
             {
-                VR_ERROR << "INTERNAL ERROR?!" << endl;
+                VR_ERROR << "INTERNAL ERROR?!" << std::endl;
                 return -1;
             }
 
diff --git a/VirtualRobot/Workspace/VoxelTreeND.hpp b/VirtualRobot/Workspace/VoxelTreeND.hpp
index b0b2e1400134737738336b58917878cb7acbc160..3aa640a9b83846dfff95ebeb3eab7ab58b3f86a0 100644
--- a/VirtualRobot/Workspace/VoxelTreeND.hpp
+++ b/VirtualRobot/Workspace/VoxelTreeND.hpp
@@ -119,19 +119,19 @@ namespace VirtualRobot
             //cout << "was (sqrt): " << tmp;
             if (verbose)
             {
-                VR_INFO << "Creating Voxelized tree data structure. " << endl;
-                VR_INFO << "Extends (min/max/size):" << endl;
+                VR_INFO << "Creating Voxelized tree data structure. " << std::endl;
+                VR_INFO << "Extends (min/max/size):" << std::endl;
                 std::streamsize pr = std::cout.precision(2);
 
                 for (unsigned int i = 0; i < N; i++)
                 {
-                    cout << std::fixed << minExtend[i] << "," << maxExtend[i] << " -> " << size[i] << endl;
-                    cout << std::fixed << "\tdiscretization:" << discretization[i] << ". Max leafs:" << (int)(size[i] / discretization[i] + 0.5f) << endl;
+                    std::cout << std::fixed << minExtend[i] << "," << maxExtend[i] << " -> " << size[i] << std::endl;
+                    std::cout << std::fixed << "\tdiscretization:" << discretization[i] << ". Max leafs:" << (int)(size[i] / discretization[i] + 0.5f) << std::endl;
                 }
 
                 std::cout << std::resetiosflags(std::ios::fixed);
                 std::cout.precision(pr);
-                VR_INFO << "--> Max Levels:" << maxLevels << endl;
+                VR_INFO << "--> Max Levels:" << maxLevels << std::endl;
             }
 
             THROW_VR_EXCEPTION_IF(maxLevels <= 0, "Invalid parameters...");
@@ -333,7 +333,7 @@ namespace VirtualRobot
 
                     if (static_cast<size_t>(n) != dataSize)
                     {
-                        VR_ERROR << "Invalid number of bytes?!" << endl;
+                        VR_ERROR << "Invalid number of bytes?!" << std::endl;
                         bzip2->close();
                         file.close();
                         delete tree;
@@ -380,7 +380,7 @@ namespace VirtualRobot
 
                     if (static_cast<size_t>(n) != dataSize)
                     {
-                        VR_ERROR << "Invalid number of bytes?!" << endl;
+                        VR_ERROR << "Invalid number of bytes?!" << std::endl;
                         bzip2->close();
                         file.close();
                         delete tree;
@@ -397,7 +397,7 @@ namespace VirtualRobot
 
                         if (static_cast<size_t>(n) != dataSize)
                         {
-                            VR_ERROR << "Invalid number of bytes?!" << endl;
+                            VR_ERROR << "Invalid number of bytes?!" << std::endl;
                             bzip2->close();
                             file.close();
                             delete tree;
@@ -413,7 +413,7 @@ namespace VirtualRobot
 
                         if (static_cast<size_t>(n) != dataSize)
                         {
-                            VR_ERROR << "Invalid number of bytes?!" << endl;
+                            VR_ERROR << "Invalid number of bytes?!" << std::endl;
                             bzip2->close();
                             file.close();
                             delete tree;
@@ -431,7 +431,7 @@ namespace VirtualRobot
                     //VoxelTreeNDElement<T,N> *e = idElementMapping[unsigned int(i+1)];
                     if (!e->read(d, idElementMapping))
                     {
-                        VR_ERROR << "Could not create element" << endl;
+                        VR_ERROR << "Could not create element" << std::endl;
                         bzip2->close();
                         file.close();
                         delete tree;
@@ -449,7 +449,7 @@ namespace VirtualRobot
             }
             catch (VirtualRobotException& e)
             {
-                VR_ERROR << e.what() << endl;
+                VR_ERROR << e.what() << std::endl;
                 file.close();
                 throw;
             }
@@ -519,7 +519,7 @@ namespace VirtualRobot
 
                     if (!e->write(d))
                     {
-                        VR_ERROR << "Could not convert data..." << endl;
+                        VR_ERROR << "Could not convert data..." << std::endl;
                         bzip2->close();
                         file.close();
                         return false;
@@ -575,7 +575,7 @@ namespace VirtualRobot
             }
             catch (VirtualRobotException& e)
             {
-                VR_ERROR << e.what() << endl;
+                VR_ERROR << e.what() << std::endl;
                 file.close();
                 throw;
             }
@@ -601,43 +601,43 @@ namespace VirtualRobot
 
         void print()
         {
-            cout << " **** VoxelTreeND ****" << endl;
-            cout << "N=" << N << endl;
-            cout << "max levels:" << maxLevels << endl;
-            cout << "Element Count:" << currentElementID - 1 << endl;
-            cout << "MinExtend:";
+            std::cout << " **** VoxelTreeND ****" << std::endl;
+            std::cout << "N=" << N << std::endl;
+            std::cout << "max levels:" << maxLevels << std::endl;
+            std::cout << "Element Count:" << currentElementID - 1 << std::endl;
+            std::cout << "MinExtend:";
 
             for (int i = 0; i < N; i++)
             {
-                cout << minExtend[i] << ",";
+                std::cout << minExtend[i] << ",";
             }
 
-            cout << endl;
-            cout << "MaxExtend:";
+            std::cout << std::endl;
+            std::cout << "MaxExtend:";
 
             for (int i = 0; i < N; i++)
             {
-                cout << maxExtend[i] << ",";
+                std::cout << maxExtend[i] << ",";
             }
 
-            cout << endl;
-            cout << "Size:";
+            std::cout << std::endl;
+            std::cout << "Size:";
 
             for (int i = 0; i < N; i++)
             {
-                cout << size[i] << ",";
+                std::cout << size[i] << ",";
             }
 
-            cout << endl;
-            cout << "Discretization:";
+            std::cout << std::endl;
+            std::cout << "Discretization:";
 
             for (int i = 0; i < N; i++)
             {
-                cout << discretization[i] << ",";
+                std::cout << discretization[i] << ",";
             }
 
-            cout << endl;
-            cout << " *********************" << endl;
+            std::cout << std::endl;
+            std::cout << " *********************" << std::endl;
         }
 
         int getMaxLevels()
@@ -670,7 +670,7 @@ namespace VirtualRobot
 
                 if (!currentElement || !currentElement->isLeaf())
                 {
-                    VR_ERROR << "Could not determine first leaf element" << endl;
+                    VR_ERROR << "Could not determine first leaf element" << std::endl;
                 }
                 else
                 {
@@ -698,7 +698,7 @@ namespace VirtualRobot
 
                 if (!currentElement->isLeaf())
                 {
-                    VR_ERROR << "not at leaf element..." << endl;
+                    VR_ERROR << "not at leaf element..." << std::endl;
                     return NULL;
                 }
 
@@ -738,7 +738,7 @@ namespace VirtualRobot
 
                 if (!currentElement || !currentElement->isLeaf())
                 {
-                    VR_ERROR << "Could not determine next leaf element" << endl;
+                    VR_ERROR << "Could not determine next leaf element" << std::endl;
                     return NULL;
                 }
                 else
@@ -757,14 +757,14 @@ namespace VirtualRobot
         protected:
             void printStack()
             {
-                cout << "Stack: [" << elementStack[0]->getLevel() << "]";
+                std::cout << "Stack: [" << elementStack[0]->getLevel() << "]";
 
                 for (size_t i = 0; i < idStack.size(); i++)
                 {
-                    cout << "->" << idStack[i] << " ->" << "[" << elementStack[i + 1]->getLevel() << "]";
+                    std::cout << "->" << idStack[i] << " ->" << "[" << elementStack[i + 1]->getLevel() << "]";
                 }
 
-                cout << endl;
+                std::cout << std::endl;
             }
 
             std::vector<VoxelTreeNDElement<T, N>*> elementStack;
diff --git a/VirtualRobot/Workspace/VoxelTreeNDElement.hpp b/VirtualRobot/Workspace/VoxelTreeNDElement.hpp
index c1cb4597c212454312ac703c589ed51f1359af5b..15d208192caaab599d73272faffe6343a9890cad 100644
--- a/VirtualRobot/Workspace/VoxelTreeNDElement.hpp
+++ b/VirtualRobot/Workspace/VoxelTreeNDElement.hpp
@@ -391,7 +391,7 @@ namespace VirtualRobot
                 }
                 else
                 {
-                    VR_ERROR << "Undefined entry ?!" << endl;
+                    VR_ERROR << "Undefined entry ?!" << std::endl;
                     return false;
                 }
             }
@@ -435,7 +435,7 @@ namespace VirtualRobot
 
                         if (it == idElementMapping.end())
                         {
-                            VR_ERROR << "Could not find Element with id " << data.children[i] << endl;
+                            VR_ERROR << "Could not find Element with id " << data.children[i] << std::endl;
                             return false;
                         }
                         else
@@ -463,14 +463,14 @@ namespace VirtualRobot
 
             if (indx < 0)
             {
-                VR_ERROR << "Node do not cover this pos:" << endl;
+                VR_ERROR << "Node do not cover this pos:" << std::endl;
 
                 for (unsigned int i = 0; i < N; i++)
                 {
-                    cout << p[i] << ",";
+                    std::cout << p[i] << ",";
                 }
 
-                cout << endl;
+                std::cout << std::endl;
                 return NULL;
             }
 
@@ -510,20 +510,20 @@ namespace VirtualRobot
         {
             if (!covers(p))
             {
-                VR_ERROR << "Node do not cover this pos" << endl;
+                VR_ERROR << "Node do not cover this pos" << std::endl;
 
                 for (unsigned int i = 0; i < N; i++)
                 {
-                    cout << p[i] << ",";
+                    std::cout << p[i] << ",";
                 }
 
-                cout << endl;
+                std::cout << std::endl;
                 return -1;
             }
 
             if (leaf)
             {
-                VR_ERROR << "Node is already a leaf node?!" << endl;
+                VR_ERROR << "Node is already a leaf node?!" << std::endl;
                 return -1;
             }
 
@@ -608,7 +608,7 @@ namespace VirtualRobot
             //this->maxLevels = maxLevels;
             if (level >= tree->getMaxLevels())
             {
-                VR_ERROR << "Exceeding maxLevels?!" << endl;
+                VR_ERROR << "Exceeding maxLevels?!" << std::endl;
             }
 
             if (!leaf)
diff --git a/VirtualRobot/Workspace/WorkspaceData.h b/VirtualRobot/Workspace/WorkspaceData.h
index b745b5987b4a7225322e40f76042efba85038227..cfcecc397e9e7eaed7d939e355296f7080df9fae 100644
--- a/VirtualRobot/Workspace/WorkspaceData.h
+++ b/VirtualRobot/Workspace/WorkspaceData.h
@@ -43,7 +43,7 @@ namespace VirtualRobot
         Internally unsigned char data types are used (0...255)
     */
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT WorkspaceData : public boost::enable_shared_from_this<WorkspaceData>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT WorkspaceData : public std::enable_shared_from_this<WorkspaceData>
     {
     public:
         virtual ~WorkspaceData() {}
diff --git a/VirtualRobot/Workspace/WorkspaceDataArray.cpp b/VirtualRobot/Workspace/WorkspaceDataArray.cpp
index 6fec27163df3169d6d57941eb2e1812dbfb3262b..3af2531746652127a8054de8838395e5c7bb799f 100644
--- a/VirtualRobot/Workspace/WorkspaceDataArray.cpp
+++ b/VirtualRobot/Workspace/WorkspaceDataArray.cpp
@@ -7,6 +7,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     WorkspaceDataArray::WorkspaceDataArray(unsigned int size1, unsigned int size2, unsigned int size3,
                                            unsigned int size4, unsigned int size5, unsigned int size6, bool adjustOnOverflow)
diff --git a/VirtualRobot/Workspace/WorkspaceDataArray.h b/VirtualRobot/Workspace/WorkspaceDataArray.h
index 1f8191ec8924fa473ce3b979c43cc8bd40138bc7..74a76183b3b02e931d00652827419b4f41c978b2 100644
--- a/VirtualRobot/Workspace/WorkspaceDataArray.h
+++ b/VirtualRobot/Workspace/WorkspaceDataArray.h
@@ -42,7 +42,7 @@ namespace VirtualRobot
         Stores a 6-dimensional array for the vertex data of a workspace representation.
         Internally unsigned char data types are used (0...255)
     */
-    class VIRTUAL_ROBOT_IMPORT_EXPORT WorkspaceDataArray : public WorkspaceData, public boost::enable_shared_from_this<WorkspaceDataArray>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT WorkspaceDataArray : public WorkspaceData, public std::enable_shared_from_this<WorkspaceDataArray>
     {
     public:
         /*!
diff --git a/VirtualRobot/Workspace/WorkspaceRepresentation.cpp b/VirtualRobot/Workspace/WorkspaceRepresentation.cpp
index 007d62d23bbf383e4498a456dfbf3a6759fef751..02b11124c2491157c1109e99775252598314a9b6 100644
--- a/VirtualRobot/Workspace/WorkspaceRepresentation.cpp
+++ b/VirtualRobot/Workspace/WorkspaceRepresentation.cpp
@@ -22,6 +22,8 @@
 
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
     WorkspaceRepresentation::WorkspaceRepresentation(RobotPtr robot)
     {
diff --git a/VirtualRobot/Workspace/WorkspaceRepresentation.h b/VirtualRobot/Workspace/WorkspaceRepresentation.h
index e879800dd7db3292f2dca88422c98f529e7dfb13..38ea7722a2ec9c83c0f8fe534b2a35f09f925f08 100644
--- a/VirtualRobot/Workspace/WorkspaceRepresentation.h
+++ b/VirtualRobot/Workspace/WorkspaceRepresentation.h
@@ -50,7 +50,7 @@ namespace VirtualRobot
             When the torso moves, the data representation also changes it's position according to the position of the shoulder.
     */
 
-    class VIRTUAL_ROBOT_IMPORT_EXPORT WorkspaceRepresentation : public boost::enable_shared_from_this<WorkspaceRepresentation>
+    class VIRTUAL_ROBOT_IMPORT_EXPORT WorkspaceRepresentation : public std::enable_shared_from_this<WorkspaceRepresentation>
     {
     public:
         friend class CoinVisualizationFactory;
@@ -296,7 +296,7 @@ namespace VirtualRobot
             float minBounds[2]; // in global coord system
             float maxBounds[2]; // in global coord system
         };
-        typedef boost::shared_ptr<WorkspaceCut2D> WorkspaceCut2DPtr;
+        typedef std::shared_ptr<WorkspaceCut2D> WorkspaceCut2DPtr;
 
         struct WorkspaceCut2DTransformation
         {
@@ -305,7 +305,7 @@ namespace VirtualRobot
             Eigen::Matrix4f transformation;
         };
 
-        typedef boost::shared_ptr<WorkspaceCut2DTransformation> WorkspaceCut2DTransformationPtr;
+        typedef std::shared_ptr<WorkspaceCut2DTransformation> WorkspaceCut2DTransformationPtr;
 
         /*!
             Create a horizontal cut through this workspace data. Therefore, the z component and the orientation of the reference pose (in global coordinate system) is used.
diff --git a/VirtualRobot/XML/BaseIO.cpp b/VirtualRobot/XML/BaseIO.cpp
index f3d2311ecc0ef10551b09f9b41d244310a49b8f3..35db93d88486929688098c30ce2858600b006e0e 100644
--- a/VirtualRobot/XML/BaseIO.cpp
+++ b/VirtualRobot/XML/BaseIO.cpp
@@ -14,11 +14,14 @@
 #include "../Visualization/VisualizationFactory.h"
 #include "rapidxml.hpp"
 
+#include <filesystem>
+
 namespace VirtualRobot
 {
+    using std::cout;
+    using std::endl;
 
-
-    boost::mutex BaseIO::mutex;
+    std::mutex BaseIO::mutex;
 
     BaseIO::BaseIO() = default;
 
diff --git a/VirtualRobot/XML/BaseIO.h b/VirtualRobot/XML/BaseIO.h
index 44f045109309399a0be7012f12b24dc8b3e75a00..046ba0e62797b3bc27bda2e870eebd5a8406ac73 100644
--- a/VirtualRobot/XML/BaseIO.h
+++ b/VirtualRobot/XML/BaseIO.h
@@ -109,7 +109,7 @@ namespace VirtualRobot
         virtual ~BaseIO();
 
 
-        static boost::mutex mutex;
+        static std::mutex mutex;
     };
 
 }
diff --git a/VirtualRobot/XML/FileIO.h b/VirtualRobot/XML/FileIO.h
index 85489fa1232cbca309d71e158b1c622254b3fe61..a4a839b275c4a1d261325ea705e68f6275df0431 100644
--- a/VirtualRobot/XML/FileIO.h
+++ b/VirtualRobot/XML/FileIO.h
@@ -26,6 +26,7 @@
 
 #include <vector>
 #include <fstream>
+#include <iostream>
 #include <stdint.h>
 
 namespace VirtualRobot
diff --git a/VirtualRobot/XML/RobotIO.cpp b/VirtualRobot/XML/RobotIO.cpp
index 0d1c70f12613418fd5f0dbf1306cedee2eb1453c..6125ed4697676291333c400faea4ae22c2e4be6b 100644
--- a/VirtualRobot/XML/RobotIO.cpp
+++ b/VirtualRobot/XML/RobotIO.cpp
@@ -25,7 +25,7 @@
 
 namespace VirtualRobot
 {
-
+    using std::endl;
 
     std::map<std::string, int> RobotIO::robot_name_counter;
 
@@ -583,7 +583,7 @@ namespace VirtualRobot
 
         if (scaleVisu)
         {
-            boost::shared_ptr<RobotNodePrismatic> rnPM = boost::dynamic_pointer_cast<RobotNodePrismatic>(robotNode);
+            std::shared_ptr<RobotNodePrismatic> rnPM = std::dynamic_pointer_cast<RobotNodePrismatic>(robotNode);
 
             if (rnPM)
             {
@@ -917,7 +917,7 @@ namespace VirtualRobot
 
         if (!attr)
         {
-            VR_WARNING << "Robot definition expects attribute 'type'" << endl;
+            VR_WARNING << "Robot definition expects attribute 'type'" << std::endl;
             robotType = "not set";
         }
         else
@@ -927,7 +927,7 @@ namespace VirtualRobot
 
         // check name counter
         {
-            boost::lock_guard<boost::mutex> lock(mutex);
+            std::scoped_lock lock(mutex);
 
             if (robot_name_counter.find(robotType) != robot_name_counter.end())
             {
@@ -946,7 +946,7 @@ namespace VirtualRobot
         {
             std::stringstream ss;
             {
-                boost::lock_guard<boost::mutex> lock(mutex);
+                std::scoped_lock lock(mutex);
 
                 if (robot_name_counter[robotType] == 1)
                 {
diff --git a/VirtualRobot/XML/SceneIO.cpp b/VirtualRobot/XML/SceneIO.cpp
index 8d589fc9fab2dfee4d7ad8e2bb91d176c7ab7fd6..de765e77790bd05b3232e486904a3a7a934484ca 100644
--- a/VirtualRobot/XML/SceneIO.cpp
+++ b/VirtualRobot/XML/SceneIO.cpp
@@ -11,7 +11,7 @@
 
 namespace VirtualRobot
 {
-
+    using std::endl;
 
     SceneIO::SceneIO()
         = default;
diff --git a/VirtualRobot/XML/mujoco/RobotMjcf.cpp b/VirtualRobot/XML/mujoco/RobotMjcf.cpp
index a07ff581f12637cc95a0f91d791d5f8c0beb9afb..0b84f0d2d5b09c74f91965ad0258f12fcab4ab5e 100644
--- a/VirtualRobot/XML/mujoco/RobotMjcf.cpp
+++ b/VirtualRobot/XML/mujoco/RobotMjcf.cpp
@@ -363,13 +363,13 @@ mjcf::Joint RobotMjcf::addNodeJoint(RobotNodePtr node, mjcf::Body body)
     Eigen::Vector3f axis;
     if (node->isRotationalJoint())
     {
-        RobotNodeRevolutePtr revolute = boost::dynamic_pointer_cast<RobotNodeRevolute>(node);
+        RobotNodeRevolutePtr revolute = std::dynamic_pointer_cast<RobotNodeRevolute>(node);
         VR_CHECK(revolute);
         axis = revolute->getJointRotationAxisInJointCoordSystem();
     }
     else if (node->isTranslationalJoint())
     {
-        RobotNodePrismaticPtr prismatic = boost::dynamic_pointer_cast<RobotNodePrismatic>(node);
+        RobotNodePrismaticPtr prismatic = std::dynamic_pointer_cast<RobotNodePrismatic>(node);
         VR_CHECK(prismatic);
         axis = prismatic->getJointTranslationDirectionJointCoordSystem();
     }
diff --git a/VirtualRobot/examples/CameraViewer/showCamWindow.h b/VirtualRobot/examples/CameraViewer/showCamWindow.h
index 013776076ca5626a8bb18b61a014b7033091fb76..7cf84e2e02656ab3f7c0365056ccd031c73aa72d 100644
--- a/VirtualRobot/examples/CameraViewer/showCamWindow.h
+++ b/VirtualRobot/examples/CameraViewer/showCamWindow.h
@@ -107,7 +107,7 @@ protected:
 
     bool useColModel;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization;
 
     struct DepthRenderData
     {
diff --git a/VirtualRobot/examples/ConstrainedIK/ConstrainedIKWindow.cpp b/VirtualRobot/examples/ConstrainedIK/ConstrainedIKWindow.cpp
index 3d9730cbd74c5c2e848edf89941407a4db01892e..ab8e664f0042bcc0c73a4a8d9b94acfcd1a605e2 100644
--- a/VirtualRobot/examples/ConstrainedIK/ConstrainedIKWindow.cpp
+++ b/VirtualRobot/examples/ConstrainedIK/ConstrainedIKWindow.cpp
@@ -164,7 +164,7 @@ void ConstrainedIKWindow::collisionModel()
 
     robotSep->removeAllChildren();
 
-    boost::shared_ptr<CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(SceneObject::Full);
+    std::shared_ptr<CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(SceneObject::Full);
     SoNode* visualisationNode = nullptr;
 
     if (visualization)
diff --git a/VirtualRobot/examples/GenericIK/GenericIKWindow.cpp b/VirtualRobot/examples/GenericIK/GenericIKWindow.cpp
index cae2e42480b53649a22406c82216dfd76dbe731f..31df44ea6bb5b596bb8d0997fe6dd596486d006a 100644
--- a/VirtualRobot/examples/GenericIK/GenericIKWindow.cpp
+++ b/VirtualRobot/examples/GenericIK/GenericIKWindow.cpp
@@ -194,7 +194,7 @@ void GenericIKWindow::collisionModel()
     useColModel = UI.checkBoxColModel->checkState() == Qt::Checked;
     SceneObject::VisualizationType colModel = useColModel ? SceneObject::Collision : SceneObject::Full;
 
-    boost::shared_ptr<CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(colModel);
+    std::shared_ptr<CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(colModel);
     SoNode* visualisationNode = nullptr;
 
     if (visualization)
@@ -304,7 +304,7 @@ void GenericIKWindow::selectKC(int nr)
 
     if (kc->getNode(kc->getSize() - 1)->isTranslationalJoint())
     {
-        ikGazeSolver.reset(new GazeIK(kc, boost::dynamic_pointer_cast<RobotNodePrismatic>(kc->getNode(kc->getSize() - 1))));
+        ikGazeSolver.reset(new GazeIK(kc, std::dynamic_pointer_cast<RobotNodePrismatic>(kc->getNode(kc->getSize() - 1))));
     }
     else
     {
diff --git a/VirtualRobot/examples/InverseDynamics/InverseDynamics.cpp b/VirtualRobot/examples/InverseDynamics/InverseDynamics.cpp
index 999dc2f353f594d84322ae054d52352a4a676fe9..6e052588a50089f14393a791c26af246b4e66a95 100644
--- a/VirtualRobot/examples/InverseDynamics/InverseDynamics.cpp
+++ b/VirtualRobot/examples/InverseDynamics/InverseDynamics.cpp
@@ -17,7 +17,7 @@ int main(int argc, char* argv[])
     std::string filename("robots/ArmarIII/ArmarIII.xml");
     VirtualRobot::RuntimeEnvironment::getDataFileAbsolute(filename);
     VirtualRobot::RuntimeEnvironment::processCommandLine(argc, argv);
-    cout << "Using robot at " << filename << endl;
+    cout << "Using robot at " << filename << std::endl;
     RobotPtr rob;
 
     try
@@ -26,7 +26,7 @@ int main(int argc, char* argv[])
     }
     catch (VirtualRobotException& e)
     {
-        cout << "Error: " << e.what() << endl;
+        cout << "Error: " << e.what() << std::endl;
         return -1;
     }
 
@@ -40,7 +40,7 @@ int main(int argc, char* argv[])
         Gravity g(rob, ns, bodyNs);
         for(auto& pair:g.getMasses())
         {
-            cout << pair.first <<": " << pair.second << endl;
+            std::cout << pair.first <<": " << pair.second << std::endl;
         }
         VirtualRobot::Dynamics dynamics = VirtualRobot::Dynamics(ns, bodyNs, true);
         dynamics.print();
@@ -91,30 +91,30 @@ int main(int argc, char* argv[])
         }
 
         Eigen::VectorXd invDyn = dynamics.getInverseDynamics(q, qdot, qddot);
-        cout << "Joint values:\n" << q << endl;
+        std::cout << "Joint values:\n" << q << std::endl;
         ns->setJointValues(q.cast<float>());
-        cout << "Joint values in VR:\n" << q << endl;
+        std::cout << "Joint values in VR:\n" << q << std::endl;
         std::vector<float> gravityVR;
         g.computeGravityTorque(gravityVR);
 
 //        cout << "joint torques from inverse dynamics: " << endl << invDyn << endl;
-        cout << "joint space inertia matrix: " << endl << dynamics.getInertiaMatrix(q) << endl;
-        cout << "joint space gravitational matrix:" << endl << dynamics.getGravityMatrix(q) << endl;
-        cout << "joint space VR gravity :" << endl;
+        std::cout << "joint space inertia matrix: " << std::endl << dynamics.getInertiaMatrix(q) << std::endl;
+        std::cout << "joint space gravitational matrix:" << std::endl << dynamics.getGravityMatrix(q) << std::endl;
+        std::cout << "joint space VR gravity :" << std::endl;
         int i=0;
         for(auto & val: gravityVR)
         {
-            cout << ns->getNode(i)->getName() << ": " << val << endl;
+            std::cout << ns->getNode(i)->getName() << ": " << val << std::endl;
             i++;
         }
-        cout << "joint space coriolis matrix:" << endl << dynamics.getCoriolisMatrix(q, qdot) << endl;
-        cout << "joint space accelerations from forward dynamics:" << endl << dynamics.getForwardDynamics(q, qdot, tau) << endl;
+        std::cout << "joint space coriolis matrix:" << std::endl << dynamics.getCoriolisMatrix(q, qdot) << std::endl;
+        std::cout << "joint space accelerations from forward dynamics:" << std::endl << dynamics.getForwardDynamics(q, qdot, tau) << std::endl;
 //        cout << "Identifier for Elbow R:" << endl << dynamics.getIdentifier("Elbow R") << endl;
 
     }
     else
     {
-        cout << " ERROR while creating robobt" << endl;
+        std::cout << " ERROR while creating robobt" << std::endl;
     }
 }
 
diff --git a/VirtualRobot/examples/Jacobi/JacobiWindow.cpp b/VirtualRobot/examples/Jacobi/JacobiWindow.cpp
index 63a3e436dd1b549c352271e3da02ebf156f41228..0b60a2ad6980b567e8e414bda194b7b444e32ba6 100644
--- a/VirtualRobot/examples/Jacobi/JacobiWindow.cpp
+++ b/VirtualRobot/examples/Jacobi/JacobiWindow.cpp
@@ -278,7 +278,7 @@ void JacobiWindow::collisionModel()
     useColModel = UI.checkBoxColModel->checkState() == Qt::Checked;
     SceneObject::VisualizationType colModel = useColModel ? SceneObject::Collision : SceneObject::Full;
 
-    boost::shared_ptr<CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(colModel);
+    std::shared_ptr<CoinVisualization> visualization = robot->getVisualization<CoinVisualization>(colModel);
     SoNode* visualisationNode = nullptr;
 
     if (visualization)
diff --git a/VirtualRobot/examples/ReachabilityMap/ReachabilityMapWindow.cpp b/VirtualRobot/examples/ReachabilityMap/ReachabilityMapWindow.cpp
index 57e9de4d9259d30425ba47d18ee6df94734d0b15..f507b950d891ab1a483f3fd6f24b391a50938bc6 100644
--- a/VirtualRobot/examples/ReachabilityMap/ReachabilityMapWindow.cpp
+++ b/VirtualRobot/examples/ReachabilityMap/ReachabilityMapWindow.cpp
@@ -337,7 +337,7 @@ void ReachabilityMapWindow::buildRobotVisu()
         return;
     }
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization = robot->getVisualization<CoinVisualization>();
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization = robot->getVisualization<CoinVisualization>();
     SoNode* visualisationNode = nullptr;
 
     if (visualization)
@@ -360,7 +360,7 @@ void ReachabilityMapWindow::buildObjectVisu()
         return;
     }
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization = graspObject->getVisualization<CoinVisualization>();
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization = graspObject->getVisualization<CoinVisualization>();
     SoNode* visualisationNode = nullptr;
 
     if (visualization)
diff --git a/VirtualRobot/examples/RobotViewer/showRobotWindow.cpp b/VirtualRobot/examples/RobotViewer/showRobotWindow.cpp
index 73968c30b35bbb582ea1450403aa47043c210a6b..571c4e5e7d54a3754a602c1872cfbefd33eb5bc9 100644
--- a/VirtualRobot/examples/RobotViewer/showRobotWindow.cpp
+++ b/VirtualRobot/examples/RobotViewer/showRobotWindow.cpp
@@ -19,6 +19,7 @@
 #include <Inventor/nodes/SoLightModel.h>
 #include <Inventor/nodes/SoUnits.h>
 #include <sstream>
+#include <filesystem>
 
 using namespace std;
 using namespace VirtualRobot;
diff --git a/VirtualRobot/examples/RobotViewer/showRobotWindow.h b/VirtualRobot/examples/RobotViewer/showRobotWindow.h
index 8c3963d000e128c60eac7b74284b7d102260429d..6d5b1f77105334e6fe504dda123f7794876035de 100644
--- a/VirtualRobot/examples/RobotViewer/showRobotWindow.h
+++ b/VirtualRobot/examples/RobotViewer/showRobotWindow.h
@@ -103,7 +103,7 @@ protected:
     bool physicsCoMEnabled;
     bool physicsInertiaEnabled;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization;
 
     void testPerformance(VirtualRobot::RobotPtr robot, VirtualRobot::RobotNodeSetPtr rns);
 };
diff --git a/VirtualRobot/examples/SceneViewer/showSceneWindow.cpp b/VirtualRobot/examples/SceneViewer/showSceneWindow.cpp
index 5b70afe6f033c1a6782bca7c6825486aeeef5494..8ceb192483c11c3c3dd45009107caadc551d6a5f 100644
--- a/VirtualRobot/examples/SceneViewer/showSceneWindow.cpp
+++ b/VirtualRobot/examples/SceneViewer/showSceneWindow.cpp
@@ -506,7 +506,7 @@ void showSceneWindow::selectObject(int nr)
     if (scene->hasManipulationObject(ob))
     {
         VirtualRobot::ManipulationObjectPtr mo = scene->getManipulationObject(ob);
-        currentObject = boost::dynamic_pointer_cast<SceneObject>(mo);
+        currentObject = std::dynamic_pointer_cast<SceneObject>(mo);
     }
 
     updateGrasps();
@@ -590,7 +590,7 @@ void showSceneWindow::updateGrasps()
     UI.comboBoxGrasp->clear();
     QString t("-");
     UI.comboBoxGrasp->addItem(t);
-    VirtualRobot::ManipulationObjectPtr mo = boost::dynamic_pointer_cast<ManipulationObject>(currentObject);
+    VirtualRobot::ManipulationObjectPtr mo = std::dynamic_pointer_cast<ManipulationObject>(currentObject);
 
     if (mo && currentEEF)
     {
diff --git a/VirtualRobot/examples/SceneViewer/showSceneWindow.h b/VirtualRobot/examples/SceneViewer/showSceneWindow.h
index a07397df95e792fb46c305b36bfdcc3f536110b7..299514f56fe668396ebe96a846ed109480216eac 100644
--- a/VirtualRobot/examples/SceneViewer/showSceneWindow.h
+++ b/VirtualRobot/examples/SceneViewer/showSceneWindow.h
@@ -91,6 +91,6 @@ protected:
     std::string sceneFile;
 
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization;
 };
 
diff --git a/VirtualRobot/examples/loadRobot/loadRobot.cpp b/VirtualRobot/examples/loadRobot/loadRobot.cpp
index 20cea817621c8c7bc1329af9add7c3e609d4288d..91b2c4edfc3144031c6211ad5dff0b27a59c8454 100644
--- a/VirtualRobot/examples/loadRobot/loadRobot.cpp
+++ b/VirtualRobot/examples/loadRobot/loadRobot.cpp
@@ -17,11 +17,11 @@ using namespace VirtualRobot;
 
 int main(int argc, char* argv[])
 {
-    boost::shared_ptr<Robot> robot = RobotFactory::createRobot("Robbi");
-    std::vector< boost::shared_ptr<RobotNode> > robotNodes;
+    std::shared_ptr<Robot> robot = RobotFactory::createRobot("Robbi");
+    std::vector< std::shared_ptr<RobotNode> > robotNodes;
     VirtualRobot::RobotNodeRevoluteFactory revoluteNodeFactory;
     DHParameter dhParameter(0, 0, 0, 0, true);
-    boost::shared_ptr<RobotNode> node1 = revoluteNodeFactory.createRobotNodeDH(robot, "RootNode", VisualizationNodePtr(), CollisionModelPtr(), (float) - M_PI, (float)M_PI, 0.0f, dhParameter);
+    std::shared_ptr<RobotNode> node1 = revoluteNodeFactory.createRobotNodeDH(robot, "RootNode", VisualizationNodePtr(), CollisionModelPtr(), (float) - M_PI, (float)M_PI, 0.0f, dhParameter);
     robotNodes.push_back(node1);
     std::map<RobotNodePtr, std::vector<std::string> > childrenMap;
     bool resInit = RobotFactory::initializeRobot(robot, robotNodes, childrenMap, node1);
diff --git a/VirtualRobot/examples/loadURDFRobot/loadURDFobot.cpp b/VirtualRobot/examples/loadURDFRobot/loadURDFobot.cpp
index ace7648eebd05d842c52284b8383e90a9a879f13..cd050cecb028bfdf5d3c3c7a7be8534e05ea1e82 100644
--- a/VirtualRobot/examples/loadURDFRobot/loadURDFobot.cpp
+++ b/VirtualRobot/examples/loadURDFRobot/loadURDFobot.cpp
@@ -9,6 +9,7 @@
 
 #include <string>
 #include <iostream>
+#include <filesystem>
 
 using std::cout;
 using std::endl;
diff --git a/VirtualRobot/examples/reachability/reachabilityWindow.cpp b/VirtualRobot/examples/reachability/reachabilityWindow.cpp
index 8a7c3dd8b56a097a075f44cc287c4be94b7ce065..c3ba44bec768c855b292b1eafe86f03a3c2c5317 100644
--- a/VirtualRobot/examples/reachability/reachabilityWindow.cpp
+++ b/VirtualRobot/examples/reachability/reachabilityWindow.cpp
@@ -592,7 +592,7 @@ void reachabilityWindow::createReach()
         if (measure != "Reachability")
         {
             reachSpace.reset(new Manipulability(robot));
-            ManipulabilityPtr manipSpace = boost::dynamic_pointer_cast<Manipulability>(reachSpace);
+            ManipulabilityPtr manipSpace = std::dynamic_pointer_cast<Manipulability>(reachSpace);
             manipSpace->setMaxManipulability(UICreate.doubleSpinBoxMaxManip->value());
         }
 
@@ -600,7 +600,7 @@ void reachabilityWindow::createReach()
 
         if (measure == "Ext. Manipulability")
         {
-            ManipulabilityPtr man = boost::dynamic_pointer_cast<Manipulability>(reachSpace);
+            ManipulabilityPtr man = std::dynamic_pointer_cast<Manipulability>(reachSpace);
             PoseQualityExtendedManipulabilityPtr manMeasure(new PoseQualityExtendedManipulability(currentRobotNodeSet));
             man->setManipulabilityMeasure(manMeasure);
             if (UICreate.checkBoxColDetecion->isChecked() && UICreate.checkBoxSelfDistance->isChecked())
@@ -792,7 +792,7 @@ void reachabilityWindow::updateQualityInfo()
     float poseManip = 1.0f;
     if (reachSpace)
     {
-        ManipulabilityPtr p = boost::dynamic_pointer_cast<Manipulability>(reachSpace);
+        ManipulabilityPtr p = std::dynamic_pointer_cast<Manipulability>(reachSpace);
         if (p)
         {
             reachManip = p->getManipulabilityAtPose(p->getTCP()->getGlobalPose());
diff --git a/VirtualRobot/examples/reachability/reachabilityWindow.h b/VirtualRobot/examples/reachability/reachabilityWindow.h
index 687898cf4134e6e57be04b1afcac671015841cc4..b359b15804f5eee5cea0e5ead80df2d0795d955a 100644
--- a/VirtualRobot/examples/reachability/reachabilityWindow.h
+++ b/VirtualRobot/examples/reachability/reachabilityWindow.h
@@ -118,6 +118,6 @@ protected:
     bool useColModel;
     //bool structureEnabled;
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization;
 };
 
diff --git a/VirtualRobot/examples/stability/stabilityDemo.cpp b/VirtualRobot/examples/stability/stabilityDemo.cpp
index 8f22787af0480799cb35c718530239a33698c0d6..76573e9e420398793c7db1999f6a7af49ec41591 100644
--- a/VirtualRobot/examples/stability/stabilityDemo.cpp
+++ b/VirtualRobot/examples/stability/stabilityDemo.cpp
@@ -7,7 +7,7 @@ int main(int argc, char* argv[])
 {
 
     VirtualRobot::init(argc, argv, "Stability Demo");
-    cout << " --- START --- " << endl;
+    std::cout << " --- START --- " << std::endl;
 
     //std::string filenameRob("robots/ArmarIII/ArmarIII.xml");
     std::string filenameRob("robots/iCub/iCub.xml");
@@ -17,7 +17,7 @@ int main(int argc, char* argv[])
     VirtualRobot::RuntimeEnvironment::processCommandLine(argc, argv);
     VirtualRobot::RuntimeEnvironment::print();
 
-    cout << " --- START --- " << endl;
+    std::cout << " --- START --- " << std::endl;
 
     if (VirtualRobot::RuntimeEnvironment::hasValue("robot"))
     {
@@ -29,7 +29,7 @@ int main(int argc, char* argv[])
         }
     }
 
-    cout << "Using robot at " << filenameRob << endl;
+    std::cout << "Using robot at " << filenameRob << std::endl;
 
     stabilityWindow rw(filenameRob);
     rw.main();
diff --git a/VirtualRobot/examples/stability/stabilityWindow.h b/VirtualRobot/examples/stability/stabilityWindow.h
index e4fdb4b358779309822ba6d2b35984e999ca7197..2a77816cc5b37e09289a01f5af3945b864d6740e 100644
--- a/VirtualRobot/examples/stability/stabilityWindow.h
+++ b/VirtualRobot/examples/stability/stabilityWindow.h
@@ -89,6 +89,6 @@ protected:
     bool useColModel;
 
 
-    boost::shared_ptr<VirtualRobot::CoinVisualization> visualization;
+    std::shared_ptr<VirtualRobot::CoinVisualization> visualization;
 };
 
diff --git a/VirtualRobot/math/AbstractFunctionR2R3.cpp b/VirtualRobot/math/AbstractFunctionR2R3.cpp
index ab9263e8b4a38ee661f7a09441e8b863455e9a4c..a0145003d8b74e169503848f26841022c9b6f496 100644
--- a/VirtualRobot/math/AbstractFunctionR2R3.cpp
+++ b/VirtualRobot/math/AbstractFunctionR2R3.cpp
@@ -24,6 +24,8 @@
 #include "Plane.h"
 #include <stdexcept>
 
+#include <Eigen/Geometry>
+
 
 namespace math
 {
diff --git a/VirtualRobot/math/Array3D.h b/VirtualRobot/math/Array3D.h
index f68665b3496d2689105ad993f15481cae7a4d926..9b5d6805c23e2bf7995e963a66c799be93df29ac 100644
--- a/VirtualRobot/math/Array3D.h
+++ b/VirtualRobot/math/Array3D.h
@@ -35,7 +35,7 @@ namespace math
         Array3D(int size) :
             size(size)
         {
-            data = boost::shared_ptr<std::vector<T>>(new std::vector<T>);
+            data = std::shared_ptr<std::vector<T>>(new std::vector<T>);
             data->resize(size*size*size);
         }
 
@@ -68,8 +68,7 @@ namespace math
         }
 
     private:
-        boost::shared_ptr<std::vector<T>> data;
-        //std::vector<T> data;
+        std::shared_ptr<std::vector<T>> data;
         int size;
     };
 }
diff --git a/VirtualRobot/math/CompositeFunctionR1R6.cpp b/VirtualRobot/math/CompositeFunctionR1R6.cpp
index e88e6fd0f72c70136337a86986e4947818b1cd8c..02b5207ae11b791f28e0dfff8b8cf1ed66de24dc 100644
--- a/VirtualRobot/math/CompositeFunctionR1R6.cpp
+++ b/VirtualRobot/math/CompositeFunctionR1R6.cpp
@@ -24,6 +24,8 @@
 #include "Line.h"
 #include "LinearInterpolatedOrientation.h"
 
+#include <Eigen/Geometry>
+
 
 namespace math
 {
@@ -86,7 +88,7 @@ namespace math
     CompositeFunctionR1R6Ptr CompositeFunctionR1R6::CreateLine(const Eigen::Vector3f& startPos, const Eigen::Vector3f& endPos, const Eigen::Quaternionf& ori, float startT, float endT)
     {
         LinePtr line(new Line(startPos, endPos - startPos));
-        boost::shared_ptr<ConstantOrientation> constOri(new ConstantOrientation(ori));
+        std::shared_ptr<ConstantOrientation> constOri(new ConstantOrientation(ori));
 
         CompositeFunctionR1R6Ptr func(new CompositeFunctionR1R6(line, constOri, startT, endT));
         return func;
diff --git a/VirtualRobot/math/GaussianImplicitSurface3D.cpp b/VirtualRobot/math/GaussianImplicitSurface3D.cpp
index dde3386e85c5f50740f23296166c933e5c44ca4b..5580a0f632736af2c6ee982855796d2d3de3905b 100644
--- a/VirtualRobot/math/GaussianImplicitSurface3D.cpp
+++ b/VirtualRobot/math/GaussianImplicitSurface3D.cpp
@@ -23,6 +23,7 @@
 #include <cmath>
 #include <iostream>
 
+#include <Eigen/QR>
 
 namespace math
 {
diff --git a/VirtualRobot/math/Helpers.cpp b/VirtualRobot/math/Helpers.cpp
index 464b6a6e8acceaa589d38581bf3f835b8f8948f6..72c04203a6a67846ac30e12184a4fb1931336f82 100644
--- a/VirtualRobot/math/Helpers.cpp
+++ b/VirtualRobot/math/Helpers.cpp
@@ -22,10 +22,12 @@
 #include "Helpers.h"
 #include "LinearInterpolatedOrientation.h"
 
-#include <stdexcept>
-
 #include <SimoxUtility/math/pose.h>
 
+#include <Eigen/Geometry>
+
+#include <stdexcept>
+
 
 namespace math
 {
diff --git a/VirtualRobot/math/Line.cpp b/VirtualRobot/math/Line.cpp
index d64121317ffc1a9a85dec2b26a47e18c48439b15..254c3a11ff8f49328ac3255b1979730171fc657b 100644
--- a/VirtualRobot/math/Line.cpp
+++ b/VirtualRobot/math/Line.cpp
@@ -25,6 +25,8 @@
 #include "float.h"
 #include "Helpers.h"
 
+#include <Eigen/Geometry>
+
 namespace math
 {
     Line::Line(Eigen::Vector3f pos, Eigen::Vector3f dir)
diff --git a/VirtualRobot/math/MarchingCubes.h b/VirtualRobot/math/MarchingCubes.h
index 1893fba18a9dcbbfc8acec38f63a83ba6e1f906d..ac706f92f35f22cb189347c9c6b8cb5575276fff 100644
--- a/VirtualRobot/math/MarchingCubes.h
+++ b/VirtualRobot/math/MarchingCubes.h
@@ -47,8 +47,8 @@ namespace math
               Eigen::Vector3f P[8];
       };
 
-      typedef boost::shared_ptr<Array3D<GridCell>> Array3DGridCellPtr;
-      typedef boost::shared_ptr<std::queue<Index3>> FringePtr;
+      typedef std::shared_ptr<Array3D<GridCell>> Array3DGridCellPtr;
+      typedef std::shared_ptr<std::queue<Index3>> FringePtr;
 
       int _size;
       GridCacheFloat3Ptr Gdata;
diff --git a/VirtualRobot/math/MathForwardDefinitions.h b/VirtualRobot/math/MathForwardDefinitions.h
index ece4c1e6bc56157537eb4fca30ab4ebf212bf6ed..ed12b0a73213611467ec66884b58b765b9120bf6 100644
--- a/VirtualRobot/math/MathForwardDefinitions.h
+++ b/VirtualRobot/math/MathForwardDefinitions.h
@@ -24,11 +24,9 @@
 //scale intern sizes to milimeters
 #define HAPTIC_EXPLORATION_SCALE 40
 
-#ifndef Q_MOC_RUN // workaround for some bug in some QT/boost versions
-#include <boost/shared_ptr.hpp>
-#endif
-#include <Eigen/Dense>
+#include <Eigen/Core>
 #include <stdexcept>
+#include <memory>
 #include <vector>
 
 
@@ -47,7 +45,7 @@ public:
     {
         if(!defined)
         {
-            throw std::exception("Value is not set");
+            throw std::runtime_error("Value is not set");
         }
         return value;
     }
@@ -67,63 +65,63 @@ namespace math
 {
     typedef Nullable<Eigen::Vector3f> Vec3Opt;
 
-    typedef boost::shared_ptr<class AbstractFunctionR1R2> AbstractFunctionR1R2Ptr;
-    typedef boost::shared_ptr<class Line> LinePtr;
-    typedef boost::shared_ptr<class LineStrip> LineStripPtr;
-    typedef boost::shared_ptr<class AbstractFunctionR1R3> AbstractFunctionR1R3Ptr;
-    typedef boost::shared_ptr<class AbstractFunctionR1R6> AbstractFunctionR1R6Ptr;
-    typedef boost::shared_ptr<class AbstractFunctionR2R3> AbstractFunctionR2R3Ptr;
-    typedef boost::shared_ptr<class AbstractFunctionR3R1> AbstractFunctionR3R1Ptr;
-    typedef boost::shared_ptr<class Contact> ContactPtr;
-    typedef boost::shared_ptr<class ContactList> ContactListPtr;
-    typedef boost::shared_ptr<class ImplicitPlane> ImplicitPlanePtr;
-    typedef boost::shared_ptr<class LineR2> LineR2Ptr;
-    typedef boost::shared_ptr<class Plane> PlanePtr;
-    typedef boost::shared_ptr<class Triangle> TrianglePtr;
-    typedef boost::shared_ptr<class SimpleAbstractFunctionR1R3> SimpleAbstractFunctionR1R3Ptr;
-    typedef boost::shared_ptr<class SimpleAbstractFunctionR1R6> SimpleAbstractFunctionR1R6Ptr;
-    typedef boost::shared_ptr<class SimpleAbstractFunctionR2R3> SimpleAbstractFunctionR2R3Ptr;
-    typedef boost::shared_ptr<class SimpleAbstractFunctionR3R1> SimpleAbstractFunctionR3R1Ptr;
-    typedef boost::shared_ptr<class LinearInterpolatedOrientation> LinearInterpolatedOrientationPtr;
-    typedef boost::shared_ptr<class LinearInterpolatedPose> LinearInterpolatedPosePtr;
-    typedef boost::shared_ptr<class AbstractFunctionR1Ori> AbstractFunctionR1OriPtr;
-    typedef boost::shared_ptr<class SimpleAbstractFunctionR1Ori> SimpleAbstractFunctionR1OriPtr;
-    typedef boost::shared_ptr<class CompositeFunctionR1R6> CompositeFunctionR1R6Ptr;
-    typedef boost::shared_ptr<class AbstractFunctionR1R6> AbstractFunctionR1R6Ptr;
-    typedef boost::shared_ptr<class ImplicitObjectModel> ImplicitObjectModelPtr;
-    typedef boost::shared_ptr<class HalfSpaceObjectModel> HalfSpaceObjectModelPtr;
-    typedef boost::shared_ptr<class HalfSpaceImplicitSurface3D> HalfSpaceImplicitSurface3DPtr;
-    typedef boost::shared_ptr<class GaussianObjectModel> GaussianObjectModelPtr;
-    typedef boost::shared_ptr<class GaussianObjectModelNormals> GaussianObjectModelNormalsPtr;
-    typedef boost::shared_ptr<class GaussianImplicitSurface3D> GaussianImplicitSurface3DPtr;
-    typedef boost::shared_ptr<class GaussianImplicitSurface3DNormals> GaussianImplicitSurface3DNormalsPtr;
-    typedef boost::shared_ptr<class GaussianImplicitSurface3DCombined> GaussianImplicitSurface3DCombinedPtr;
-    typedef boost::shared_ptr<class DataR3R1> DataR3R1Ptr;
-    typedef boost::shared_ptr<class DataR3R2> DataR3R2Ptr;
-    typedef boost::shared_ptr<class MarchingCubes> MarchingCubesPtr;
-    typedef boost::shared_ptr<class Bezier> BezierPtr;
-    typedef boost::shared_ptr<class LinearContinuedBezier> LinearContinuedBezierPtr;
-    typedef boost::shared_ptr<class Primitive> PrimitivePtr;
-    typedef boost::shared_ptr<struct Index3> Index3Ptr;
-    typedef boost::shared_ptr<class AbstractContactFeature> AbstractContactFeaturePtr;
-    typedef boost::shared_ptr<class BinContactFeature> BinContactFeaturePtr;
+    typedef std::shared_ptr<class AbstractFunctionR1R2> AbstractFunctionR1R2Ptr;
+    typedef std::shared_ptr<class Line> LinePtr;
+    typedef std::shared_ptr<class LineStrip> LineStripPtr;
+    typedef std::shared_ptr<class AbstractFunctionR1R3> AbstractFunctionR1R3Ptr;
+    typedef std::shared_ptr<class AbstractFunctionR1R6> AbstractFunctionR1R6Ptr;
+    typedef std::shared_ptr<class AbstractFunctionR2R3> AbstractFunctionR2R3Ptr;
+    typedef std::shared_ptr<class AbstractFunctionR3R1> AbstractFunctionR3R1Ptr;
+    typedef std::shared_ptr<class Contact> ContactPtr;
+    typedef std::shared_ptr<class ContactList> ContactListPtr;
+    typedef std::shared_ptr<class ImplicitPlane> ImplicitPlanePtr;
+    typedef std::shared_ptr<class LineR2> LineR2Ptr;
+    typedef std::shared_ptr<class Plane> PlanePtr;
+    typedef std::shared_ptr<class Triangle> TrianglePtr;
+    typedef std::shared_ptr<class SimpleAbstractFunctionR1R3> SimpleAbstractFunctionR1R3Ptr;
+    typedef std::shared_ptr<class SimpleAbstractFunctionR1R6> SimpleAbstractFunctionR1R6Ptr;
+    typedef std::shared_ptr<class SimpleAbstractFunctionR2R3> SimpleAbstractFunctionR2R3Ptr;
+    typedef std::shared_ptr<class SimpleAbstractFunctionR3R1> SimpleAbstractFunctionR3R1Ptr;
+    typedef std::shared_ptr<class LinearInterpolatedOrientation> LinearInterpolatedOrientationPtr;
+    typedef std::shared_ptr<class LinearInterpolatedPose> LinearInterpolatedPosePtr;
+    typedef std::shared_ptr<class AbstractFunctionR1Ori> AbstractFunctionR1OriPtr;
+    typedef std::shared_ptr<class SimpleAbstractFunctionR1Ori> SimpleAbstractFunctionR1OriPtr;
+    typedef std::shared_ptr<class CompositeFunctionR1R6> CompositeFunctionR1R6Ptr;
+    typedef std::shared_ptr<class AbstractFunctionR1R6> AbstractFunctionR1R6Ptr;
+    typedef std::shared_ptr<class ImplicitObjectModel> ImplicitObjectModelPtr;
+    typedef std::shared_ptr<class HalfSpaceObjectModel> HalfSpaceObjectModelPtr;
+    typedef std::shared_ptr<class HalfSpaceImplicitSurface3D> HalfSpaceImplicitSurface3DPtr;
+    typedef std::shared_ptr<class GaussianObjectModel> GaussianObjectModelPtr;
+    typedef std::shared_ptr<class GaussianObjectModelNormals> GaussianObjectModelNormalsPtr;
+    typedef std::shared_ptr<class GaussianImplicitSurface3D> GaussianImplicitSurface3DPtr;
+    typedef std::shared_ptr<class GaussianImplicitSurface3DNormals> GaussianImplicitSurface3DNormalsPtr;
+    typedef std::shared_ptr<class GaussianImplicitSurface3DCombined> GaussianImplicitSurface3DCombinedPtr;
+    typedef std::shared_ptr<class DataR3R1> DataR3R1Ptr;
+    typedef std::shared_ptr<class DataR3R2> DataR3R2Ptr;
+    typedef std::shared_ptr<class MarchingCubes> MarchingCubesPtr;
+    typedef std::shared_ptr<class Bezier> BezierPtr;
+    typedef std::shared_ptr<class LinearContinuedBezier> LinearContinuedBezierPtr;
+    typedef std::shared_ptr<class Primitive> PrimitivePtr;
+    typedef std::shared_ptr<struct Index3> Index3Ptr;
+    typedef std::shared_ptr<class AbstractContactFeature> AbstractContactFeaturePtr;
+    typedef std::shared_ptr<class BinContactFeature> BinContactFeaturePtr;
     template<class T> class Array3D;
-    typedef boost::shared_ptr<Array3D<float>> Array3DFloatPtr;
-    typedef boost::shared_ptr<Array3D<bool>> Array3DBoolPtr;
-    //typedef boost::shared_ptr<Array3D<>> Array3DPtr<T>;
-    typedef boost::shared_ptr<class VoronoiWeights> VoronoiWeightsPtr;
+    typedef std::shared_ptr<Array3D<float>> Array3DFloatPtr;
+    typedef std::shared_ptr<Array3D<bool>> Array3DBoolPtr;
+    //typedef std::shared_ptr<Array3D<>> Array3DPtr<T>;
+    typedef std::shared_ptr<class VoronoiWeights> VoronoiWeightsPtr;
     struct WeightedFloatAverage;
     class WeightedVec3Average;
 
-    typedef boost::shared_ptr<class Grid3D> Grid3DPtr;
-    typedef boost::shared_ptr<class GridCacheFloat3> GridCacheFloat3Ptr;
-    typedef boost::shared_ptr<class FeatureCluster> FeatureClusterPtr;
-    typedef boost::shared_ptr<class EdgeCluster> EdgeClusterPtr;
-    typedef boost::shared_ptr<class EdgePredictor> EdgePredictorPtr;
-    typedef boost::shared_ptr<class EdgeTracer> EdgeTracerPtr;
-    typedef boost::shared_ptr<std::vector<Eigen::Vector3f>> Vec3ListPtr;
-    typedef boost::shared_ptr<class Edge> EdgePtr;
-    typedef boost::shared_ptr<class EdgeFeature> EdgeFeaturePtr;
+    typedef std::shared_ptr<class Grid3D> Grid3DPtr;
+    typedef std::shared_ptr<class GridCacheFloat3> GridCacheFloat3Ptr;
+    typedef std::shared_ptr<class FeatureCluster> FeatureClusterPtr;
+    typedef std::shared_ptr<class EdgeCluster> EdgeClusterPtr;
+    typedef std::shared_ptr<class EdgePredictor> EdgePredictorPtr;
+    typedef std::shared_ptr<class EdgeTracer> EdgeTracerPtr;
+    typedef std::shared_ptr<std::vector<Eigen::Vector3f>> Vec3ListPtr;
+    typedef std::shared_ptr<class Edge> EdgePtr;
+    typedef std::shared_ptr<class EdgeFeature> EdgeFeaturePtr;
 
 
 }
@@ -131,24 +129,24 @@ namespace math
 namespace sim
 {
     class Simulation;
-    typedef boost::shared_ptr<Simulation> SimulationPtr;
+    typedef std::shared_ptr<Simulation> SimulationPtr;
     class HapticExplorationData;
-    typedef boost::shared_ptr<HapticExplorationData> HapticExplorationDataPtr;
+    typedef std::shared_ptr<HapticExplorationData> HapticExplorationDataPtr;
 
     namespace objects{
 
     class AbstractObject;
-    typedef boost::shared_ptr<AbstractObject> AbstractObjectPtr;
+    typedef std::shared_ptr<AbstractObject> AbstractObjectPtr;
     class ImplicitObject;
-    typedef boost::shared_ptr<ImplicitObject> ImplicitObjectPtr;
+    typedef std::shared_ptr<ImplicitObject> ImplicitObjectPtr;
     class InfiniteObject;
-    typedef boost::shared_ptr<InfiniteObject> InfiniteObjectPtr;
+    typedef std::shared_ptr<InfiniteObject> InfiniteObjectPtr;
     class CompositeObject;
-    typedef boost::shared_ptr<CompositeObject> CompositeObjectPtr;
+    typedef std::shared_ptr<CompositeObject> CompositeObjectPtr;
     class Sphere;
-    typedef boost::shared_ptr<Sphere> SpherePtr;
+    typedef std::shared_ptr<Sphere> SpherePtr;
     class TriangleMeshObject;
-    typedef boost::shared_ptr<TriangleMeshObject> TriangleMeshObjectPtr;
+    typedef std::shared_ptr<TriangleMeshObject> TriangleMeshObjectPtr;
 
 
 
@@ -159,19 +157,19 @@ namespace explorationControllers
 {
 
     class AbstractExplorationController;
-    typedef boost::shared_ptr<AbstractExplorationController> AbstractExplorationControllerPtr;
+    typedef std::shared_ptr<AbstractExplorationController> AbstractExplorationControllerPtr;
     class Heuristic;
-    typedef boost::shared_ptr<Heuristic> HeuristicPtr;
+    typedef std::shared_ptr<Heuristic> HeuristicPtr;
     class InitialApproach;
-    typedef boost::shared_ptr<InitialApproach> InitialApproachPtr;
+    typedef std::shared_ptr<InitialApproach> InitialApproachPtr;
     class LocalSearch;
-    typedef boost::shared_ptr<LocalSearch> LocalSearchPtr;
+    typedef std::shared_ptr<LocalSearch> LocalSearchPtr;
     class PossibleTarget;
-    typedef boost::shared_ptr<PossibleTarget> PossibleTargetPtr;
+    typedef std::shared_ptr<PossibleTarget> PossibleTargetPtr;
     class TrajectoryEdgeSearch;
-    typedef boost::shared_ptr<TrajectoryEdgeSearch> TrajectoryEdgeSearchPtr;
+    typedef std::shared_ptr<TrajectoryEdgeSearch> TrajectoryEdgeSearchPtr;
     class Target;
-    typedef boost::shared_ptr<Target> TargetPtr;
+    typedef std::shared_ptr<Target> TargetPtr;
 
 }
 
diff --git a/VirtualRobot/math/Plane.cpp b/VirtualRobot/math/Plane.cpp
index bcd7500f122bee0e68e093afaaaf7ecda8eb4f38..491a88978d7c1f925c13b55f7b6a29a914e19162 100644
--- a/VirtualRobot/math/Plane.cpp
+++ b/VirtualRobot/math/Plane.cpp
@@ -22,6 +22,8 @@
 #include "Plane.h"
 #include "Helpers.h"
 
+#include <Eigen/Geometry>
+
 namespace math
 {
     Plane::Plane(Eigen::Vector3f pos, Eigen::Vector3f dir1, Eigen::Vector3f dir2)
diff --git a/VirtualRobot/math/SimpleAbstractFunctionR1Ori.h b/VirtualRobot/math/SimpleAbstractFunctionR1Ori.h
index d655039ced217f9b3bb425df390d0fa16403f181..bf97e85d27cf1bb8fe4d224d85b9a5afdeb8f1b2 100644
--- a/VirtualRobot/math/SimpleAbstractFunctionR1Ori.h
+++ b/VirtualRobot/math/SimpleAbstractFunctionR1Ori.h
@@ -24,6 +24,8 @@
 #include "../VirtualRobot.h"
 #include "MathForwardDefinitions.h"
 
+#include <Eigen/Geometry>
+
 namespace math
 {
     class VIRTUAL_ROBOT_IMPORT_EXPORT SimpleAbstractFunctionR1Ori
diff --git a/VirtualRobot/math/SimpleAbstractFunctionR1R6.h b/VirtualRobot/math/SimpleAbstractFunctionR1R6.h
index eb6f3179b4d310e5184b0e718e18e7100f08974c..3602b4492366b0505da67f14e2e8e21eed0de2ef 100644
--- a/VirtualRobot/math/SimpleAbstractFunctionR1R6.h
+++ b/VirtualRobot/math/SimpleAbstractFunctionR1R6.h
@@ -24,6 +24,8 @@
 #include "../VirtualRobot.h"
 #include "MathForwardDefinitions.h"
 
+#include <Eigen/Geometry>
+
 namespace math
 {
     class VIRTUAL_ROBOT_IMPORT_EXPORT SimpleAbstractFunctionR1R6
diff --git a/VirtualRobot/math/Triangle.cpp b/VirtualRobot/math/Triangle.cpp
index 860afd1d2651f68bb515db66ada1ac8db928958a..7207809d03b6bc7ef142eb82dc2e760fa9dcc424 100644
--- a/VirtualRobot/math/Triangle.cpp
+++ b/VirtualRobot/math/Triangle.cpp
@@ -21,6 +21,8 @@
 
 #include "Triangle.h"
 
+#include <Eigen/Geometry>
+
 namespace math
 {
     Triangle::Triangle()
diff --git a/VirtualRobot/tests/MathHelpersTest.cpp b/VirtualRobot/tests/MathHelpersTest.cpp
index 2682b8723eb57d69a857d5def658b0d381d57a51..2b8705c3d83bcaae0b74d9427091e2b8c38f2103 100644
--- a/VirtualRobot/tests/MathHelpersTest.cpp
+++ b/VirtualRobot/tests/MathHelpersTest.cpp
@@ -8,6 +8,9 @@
 
 #include <VirtualRobot/VirtualRobotTest.h>
 #include <VirtualRobot/math/Helpers.h>
+
+#include <Eigen/Geometry>
+
 #include <string>
 #include <stdio.h>
 #include <random>
diff --git a/VirtualRobot/tests/PQP_optimization.cpp b/VirtualRobot/tests/PQP_optimization.cpp
index a10e6b80b1c977e176cff12ac1d0efeb09668dd3..42bad22a3467ea4d4fe52f8250e003eae17867ef 100644
--- a/VirtualRobot/tests/PQP_optimization.cpp
+++ b/VirtualRobot/tests/PQP_optimization.cpp
@@ -9,6 +9,8 @@
 #include <random>
 #include <chrono>
 
+#include <Eigen/Geometry>
+
 #include <VirtualRobot/VirtualRobotTest.h>
 #include <VirtualRobot/CollisionDetection/PQP/PQP++/OBB_Disjoint.h>
 #include <VirtualRobot/MathTools.h>
diff --git a/VirtualRobot/tests/VirtualRobotGazeIKTest.cpp b/VirtualRobot/tests/VirtualRobotGazeIKTest.cpp
index c4833b268d1a93f9b715991b5ef017d8e2789c05..a4835b0dae8e163d309e1d34c5e6dbf4797ce473 100644
--- a/VirtualRobot/tests/VirtualRobotGazeIKTest.cpp
+++ b/VirtualRobot/tests/VirtualRobotGazeIKTest.cpp
@@ -141,7 +141,7 @@ BOOST_AUTO_TEST_CASE(testGazeIK)
     const std::string nodeTransName = "VirtualCentralGaze";
     VirtualRobot::RobotNodeSetPtr rns = rob->getRobotNodeSet(rnsName);
     VirtualRobot::RobotNodePtr node = rob->getRobotNode(nodeTransName);
-    VirtualRobot::RobotNodePrismaticPtr nodeTrans = boost::dynamic_pointer_cast<VirtualRobot::RobotNodePrismatic>(node);
+    VirtualRobot::RobotNodePrismaticPtr nodeTrans = std::dynamic_pointer_cast<VirtualRobot::RobotNodePrismatic>(node);
 
     BOOST_REQUIRE(rns);
     BOOST_REQUIRE(nodeTrans);
diff --git a/VirtualRobot/tests/VirtualRobotRobotTest.cpp b/VirtualRobot/tests/VirtualRobotRobotTest.cpp
index 0997cc0c927929d5e25277c11d7aa8ef1c185b21..4ffeb593db24b90c22abf8661f43e174a938fce3 100644
--- a/VirtualRobot/tests/VirtualRobotRobotTest.cpp
+++ b/VirtualRobot/tests/VirtualRobotRobotTest.cpp
@@ -400,7 +400,7 @@ BOOST_AUTO_TEST_CASE(testVirtualRobotToXML)
 
     // check sensor
     BOOST_REQUIRE(rn2->hasSensor("sensor2"));
-    VirtualRobot::PositionSensorPtr ps = boost::dynamic_pointer_cast<VirtualRobot::PositionSensor>(rn2->getSensor("sensor2"));
+    VirtualRobot::PositionSensorPtr ps = std::dynamic_pointer_cast<VirtualRobot::PositionSensor>(rn2->getSensor("sensor2"));
     BOOST_REQUIRE(ps);
     Eigen::Matrix4f p = ps->getGlobalPose();
     Eigen::Matrix4f p2 = Eigen::Matrix4f::Identity();
@@ -443,7 +443,7 @@ BOOST_AUTO_TEST_CASE(testVirtualRobotToXML)
 
     // check sensor
     BOOST_REQUIRE(rn2->hasSensor("sensor2"));
-    ps = boost::dynamic_pointer_cast<VirtualRobot::PositionSensor>(rn2->getSensor("sensor2"));
+    ps = std::dynamic_pointer_cast<VirtualRobot::PositionSensor>(rn2->getSensor("sensor2"));
     BOOST_REQUIRE(ps);
     p = ps->getGlobalPose();
     p2 = Eigen::Matrix4f::Identity();
diff --git a/VirtualRobot/tests/VirtualRobotSensorTest.cpp b/VirtualRobot/tests/VirtualRobotSensorTest.cpp
index bea0ba43823a817d1320f0864f3d5c97369328cb..cec3785f60cad8fab1525ae0e62cf1cd88ddcc73 100644
--- a/VirtualRobot/tests/VirtualRobotSensorTest.cpp
+++ b/VirtualRobot/tests/VirtualRobotSensorTest.cpp
@@ -38,7 +38,7 @@ BOOST_AUTO_TEST_CASE(testPositionSensor)
     BOOST_REQUIRE(rn);
     BOOST_REQUIRE(rn->hasSensor("sensor1"));
 
-    VirtualRobot::PositionSensorPtr ps = boost::dynamic_pointer_cast<VirtualRobot::PositionSensor>(rn->getSensor("sensor1"));
+    VirtualRobot::PositionSensorPtr ps = std::dynamic_pointer_cast<VirtualRobot::PositionSensor>(rn->getSensor("sensor1"));
     BOOST_REQUIRE(ps);
 
     Eigen::Matrix4f p = ps->getGlobalPose();
diff --git a/VirtualRobot/tests/VirtualRobotThreadsafetyTest.cpp b/VirtualRobot/tests/VirtualRobotThreadsafetyTest.cpp
index d1584083b968b1d581165cfaec2375496f0ca230..8db9008775332890b851d68e96fd4bf508cced49 100644
--- a/VirtualRobot/tests/VirtualRobotThreadsafetyTest.cpp
+++ b/VirtualRobot/tests/VirtualRobotThreadsafetyTest.cpp
@@ -14,6 +14,8 @@
 #include <VirtualRobot/Nodes/RobotNode.h>
 #include <string>
 
+#include <boost/thread.hpp>
+
 
 #include <Eigen/Core>
 #include <Eigen/Geometry>