diff --git a/Examples/Audio/AudioExample.cpp b/Examples/Audio/AudioExample.cpp
index 9b0a0b249b27120a56b0add6175bd932d48fbfb4..8924f88f5f4e193930e39737dfe719941bf48adf 100644
--- a/Examples/Audio/AudioExample.cpp
+++ b/Examples/Audio/AudioExample.cpp
@@ -116,9 +116,9 @@ playMusic(const std::string& filename)
 int
 main()
 {
-    auto logger = Logger::getInstance();
-    logger->addFileSink("audio-Example", "./");
-    logger->addStdoutSink();
+    Logger& logger = Logger::getInstance();
+    logger.addFileSink("audio-Example", "./");
+    logger.addStdoutSink();
 
     #ifndef iMSTK_AUDIO_ENABLED
     LOG(INFO) << "Audio not enabled at build time\n";
diff --git a/Examples/PBD/PBDCollisionStairs/CMakeLists.txt b/Examples/PBD/PBDCollisionStairs/CMakeLists.txt
index dae12cd242ea1bc951b823818a3371900d0b1a00..c0c0bf8fc598af7500482dcb3023681a556d4e33 100644
--- a/Examples/PBD/PBDCollisionStairs/CMakeLists.txt
+++ b/Examples/PBD/PBDCollisionStairs/CMakeLists.txt
@@ -31,11 +31,4 @@ SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES FOLDER Examples/PBD)
 #-----------------------------------------------------------------------------
 # Link libraries to executable
 #-----------------------------------------------------------------------------
-target_link_libraries(${PROJECT_NAME} SimulationManager apiUtilities)
-
-#-----------------------------------------------------------------------------
-# Set MSVC working directory to the install/bin directory
-#-----------------------------------------------------------------------------
-if(MSVC) # Configure running executable out of MSVC
-  set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${iMSTK_INSTALL_BIN_DIR}")
-endif()
+target_link_libraries(${PROJECT_NAME} SimulationManager apiUtilities)
\ No newline at end of file
diff --git a/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp b/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp
index 9dc0b77c76c340005ef92458f48365d4fed1cbda..7e2cfeb60941c4df613a7ccfb049fdb195ecb9a0 100644
--- a/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp
+++ b/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp
@@ -36,57 +36,58 @@
 using namespace imstk;
 
 // Creates a non-manifold top part of a staircase
-static std::unique_ptr<SurfaceMesh> buildStairs(int nSteps, double width, double height, double depth)
+static std::unique_ptr<SurfaceMesh>
+buildStairs(int nSteps, double width, double height, double depth)
 {
-	// Build stair geometry
-	const double halfWidth = width * 0.5;
-	const double halfHeight = height * 0.5;
-	const double halfDepth = depth * 0.5;
-	const double dz = depth / static_cast<double>(nSteps);
-	const double dy = height / static_cast<double>(nSteps);
-
-	// Create vertices
-	StdVectorOfVec3d vertList;
-	// 4 verts per step, 2 back, then 2 bottom
-	vertList.reserve(nSteps * 4 + 4);
-	for (size_t i = 0; i < nSteps; i++)
-	{
-		const double z = static_cast<double>(dz * i) - halfDepth;
-		const double y1 = static_cast<double>(dy * i) - halfHeight;
-		vertList.push_back(Vec3d(-halfWidth, y1, z));
-		vertList.push_back(Vec3d(halfWidth, y1, z));
-
-		const double y2 = static_cast<double>(dy * (i + 1)) - halfHeight;
-		vertList.push_back(Vec3d(-halfWidth, y2, z));
-		vertList.push_back(Vec3d(halfWidth, y2, z));
-	}
-	{
-		const double z = static_cast<double>(dz * nSteps) - halfDepth;
-		const double yTop = static_cast<double>(dy * nSteps) - halfHeight;
-		vertList.push_back(Vec3d(-halfWidth, yTop, z));
-		vertList.push_back(Vec3d(halfWidth, yTop, z));
-
-		const double yBot = -halfHeight;
-		vertList.push_back(Vec3d(-halfWidth, yBot, z));
-		vertList.push_back(Vec3d(halfWidth, yBot, z));
-	}
-
-	// Create cells
-	std::vector<SurfaceMesh::TriangleArray> triangles;
-	// Create sides and tops of steps
-	for (std::size_t i = 0; i < nSteps; ++i)
-	{
-		// Stair front side
-		triangles.push_back({ { i * 4 + 3, i * 4 + 1, i * 4 } });
-		triangles.push_back({ { i * 4 + 2, i * 4 + 3, i * 4 } });
-		// Stair top
-		triangles.push_back({ { (i + 1) * 4, i * 4 + 3, i * 4 + 2 } });
-		triangles.push_back({ { (i + 1) * 4, (i + 1) * 4 + 1, i * 4 + 3 } });
-	}
-
-	std::unique_ptr<SurfaceMesh> stairMesh = std::make_unique<SurfaceMesh>();
-	stairMesh->initialize(vertList, triangles);
-	return stairMesh;
+    // Build stair geometry
+    const double halfWidth  = width * 0.5;
+    const double halfHeight = height * 0.5;
+    const double halfDepth  = depth * 0.5;
+    const double dz = depth / static_cast<double>(nSteps);
+    const double dy = height / static_cast<double>(nSteps);
+
+    // Create vertices
+    StdVectorOfVec3d vertList;
+    // 4 verts per step, 2 back, then 2 bottom
+    vertList.reserve(nSteps * 4 + 4);
+    for (size_t i = 0; i < nSteps; i++)
+    {
+        const double z  = static_cast<double>(dz * i) - halfDepth;
+        const double y1 = static_cast<double>(dy * i) - halfHeight;
+        vertList.push_back(Vec3d(-halfWidth, y1, z));
+        vertList.push_back(Vec3d(halfWidth, y1, z));
+
+        const double y2 = static_cast<double>(dy * (i + 1)) - halfHeight;
+        vertList.push_back(Vec3d(-halfWidth, y2, z));
+        vertList.push_back(Vec3d(halfWidth, y2, z));
+    }
+    {
+        const double z    = static_cast<double>(dz * nSteps) - halfDepth;
+        const double yTop = static_cast<double>(dy * nSteps) - halfHeight;
+        vertList.push_back(Vec3d(-halfWidth, yTop, z));
+        vertList.push_back(Vec3d(halfWidth, yTop, z));
+
+        const double yBot = -halfHeight;
+        vertList.push_back(Vec3d(-halfWidth, yBot, z));
+        vertList.push_back(Vec3d(halfWidth, yBot, z));
+    }
+
+    // Create cells
+    std::vector<SurfaceMesh::TriangleArray> triangles;
+    // Create sides and tops of steps
+    for (std::size_t i = 0; i < nSteps; ++i)
+    {
+        // Stair front side
+        triangles.push_back({ { i* 4 + 3, i* 4 + 1, i* 4 } });
+        triangles.push_back({ { i* 4 + 2, i* 4 + 3, i* 4 } });
+        // Stair top
+        triangles.push_back({ { (i + 1) * 4, i * 4 + 3, i * 4 + 2 } });
+        triangles.push_back({ { (i + 1) * 4, (i + 1) * 4 + 1, i * 4 + 3 } });
+    }
+
+    std::unique_ptr<SurfaceMesh> stairMesh = std::make_unique<SurfaceMesh>();
+    stairMesh->initialize(vertList, triangles);
+    return stairMesh;
 }
 
 ///
@@ -96,101 +97,101 @@ static std::unique_ptr<SurfaceMesh> buildStairs(int nSteps, double width, double
 int
 main()
 {
-	auto simManager = std::make_shared<SimulationManager>();
-	auto scene = simManager->createNewScene("PbdCollision");
-	scene->getCamera()->setPosition(0.0, 0.0, -30.0);
-	scene->getCamera()->setFocalPoint(0.0, 0.0, 0.0);
-
-	auto deformableObj = std::make_shared<PbdObject>("DeformableObj");
-	{
-		// Read in the dragon mesh
-		auto highResSurfMesh = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.obj"));
-		auto coarseTetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.veg"));
-		highResSurfMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData);
-		coarseTetMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData);
-		auto coarseSurfMesh = std::make_shared<SurfaceMesh>();
-		coarseTetMesh->extractSurfaceMesh(coarseSurfMesh, true);
-
-		// Setup parameters
-		auto pbdParams = std::make_shared<PBDModelConfig>();
-		pbdParams->m_YoungModulus = 1000.0;
-		pbdParams->m_PoissonRatio = 0.3;
-		pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet,
-			PbdFEMConstraint::MaterialType::StVK);
-		pbdParams->m_uniformMassValue = 1.0;
-		pbdParams->m_gravity = Vec3d(0, -10.0, 0);
-		pbdParams->m_DefaultDt = 0.01;
-		pbdParams->m_maxIter = 5;
-		pbdParams->m_proximity = 0.3;
-		pbdParams->m_contactStiffness = 0.1;
-
-		// Setup Model
-		auto pbdModel = std::make_shared<PbdModel>();
-		pbdModel->setModelGeometry(coarseTetMesh);
-		pbdModel->configure(pbdParams);
-
-		// Setup VisualModel
-		auto material = std::make_shared<RenderMaterial>();
-		material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
-		auto surfMeshModel = std::make_shared<VisualModel>(highResSurfMesh);
-		surfMeshModel->setRenderMaterial(material);
-
-		// Setup Object
-		deformableObj->addVisualModel(surfMeshModel);
-		deformableObj->setCollidingGeometry(coarseSurfMesh);
-		deformableObj->setPhysicsGeometry(coarseTetMesh);
-		deformableObj->setPhysicsToCollidingMap(std::make_shared<OneToOneMap>(coarseTetMesh, coarseSurfMesh));
-		deformableObj->setPhysicsToVisualMap(std::make_shared<TetraTriangleMap>(coarseTetMesh, highResSurfMesh));
-		deformableObj->setDynamicalModel(pbdModel);
-
-		// Add to scene
-		scene->addSceneObject(deformableObj);
-	}
-
-	auto stairObj = std::make_shared<PbdObject>("Floor");
-	{
-		std::shared_ptr<SurfaceMesh> stairMesh(std::move(buildStairs(15, 20.0, 10.0, 20.0)));
-
-		// Setup parameters
-		auto pbdParams2 = std::make_shared<PBDModelConfig>();
-		pbdParams2->m_uniformMassValue = 0.0;
-		pbdParams2->m_proximity = 0.1;
-		pbdParams2->m_contactStiffness = 1.0;
-		pbdParams2->m_maxIter = 0;
-
-		// Setup model
-		auto pbdModel2 = std::make_shared<PbdModel>();
-		pbdModel2->setModelGeometry(stairMesh);
-		pbdModel2->configure(pbdParams2);
-
-		// Setup VisualModel
-		auto stairMaterial = std::make_shared<RenderMaterial>();
-		stairMaterial->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
-		auto stairMeshModel = std::make_shared<VisualModel>(stairMesh);
-		stairMeshModel->setRenderMaterial(stairMaterial);
-
-		stairObj->addVisualModel(stairMeshModel);
-		stairObj->setDynamicalModel(pbdModel2);
-		stairObj->setCollidingGeometry(stairMesh);
-		stairObj->setVisualGeometry(stairMesh);
-		stairObj->setPhysicsGeometry(stairMesh);
-
-		scene->addSceneObject(stairObj);
-	}
-
-	// Collision
-	scene->getCollisionGraph()->addInteractionPair(deformableObj, stairObj,
-		CollisionDetection::Type::MeshToMeshBruteForce,
-		CollisionHandling::Type::PBD,
-		CollisionHandling::Type::None);
-
-	// Light
-	auto light = std::make_shared<DirectionalLight>("light");
-	light->setFocalPoint(Vec3d(5, -8, 5));
-	scene->addLight(light);
-
-	simManager->setActiveScene(scene);
-	simManager->start(SimulationStatus::Paused);
+    auto simManager = std::make_shared<SimulationManager>();
+    auto scene      = simManager->createNewScene("PbdCollision");
+    scene->getCamera()->setPosition(0.0, 0.0, -30.0);
+    scene->getCamera()->setFocalPoint(0.0, 0.0, 0.0);
+
+    auto deformableObj = std::make_shared<PbdObject>("DeformableObj");
+    {
+        // Read in the dragon mesh
+        auto highResSurfMesh = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.obj"));
+        auto coarseTetMesh   = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.veg"));
+        highResSurfMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData);
+        coarseTetMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData);
+        auto coarseSurfMesh = std::make_shared<SurfaceMesh>();
+        coarseTetMesh->extractSurfaceMesh(coarseSurfMesh, true);
+
+        // Setup parameters
+        auto pbdParams = std::make_shared<PBDModelConfig>();
+        pbdParams->m_YoungModulus = 1000.0;
+        pbdParams->m_PoissonRatio = 0.3;
+        pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet,
+                        PbdFEMConstraint::MaterialType::StVK);
+        pbdParams->m_uniformMassValue = 1.0;
+        pbdParams->m_gravity   = Vec3d(0, -10.0, 0);
+        pbdParams->m_DefaultDt = 0.01;
+        pbdParams->m_maxIter   = 5;
+        pbdParams->m_proximity = 0.3;
+        pbdParams->m_contactStiffness = 0.1;
+
+        // Setup Model
+        auto pbdModel = std::make_shared<PbdModel>();
+        pbdModel->setModelGeometry(coarseTetMesh);
+        pbdModel->configure(pbdParams);
+
+        // Setup VisualModel
+        auto material = std::make_shared<RenderMaterial>();
+        material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
+        auto surfMeshModel = std::make_shared<VisualModel>(highResSurfMesh);
+        surfMeshModel->setRenderMaterial(material);
+
+        // Setup Object
+        deformableObj->addVisualModel(surfMeshModel);
+        deformableObj->setCollidingGeometry(coarseSurfMesh);
+        deformableObj->setPhysicsGeometry(coarseTetMesh);
+        deformableObj->setPhysicsToCollidingMap(std::make_shared<OneToOneMap>(coarseTetMesh, coarseSurfMesh));
+        deformableObj->setPhysicsToVisualMap(std::make_shared<TetraTriangleMap>(coarseTetMesh, highResSurfMesh));
+        deformableObj->setDynamicalModel(pbdModel);
+
+        // Add to scene
+        scene->addSceneObject(deformableObj);
+    }
+
+    auto stairObj = std::make_shared<PbdObject>("Floor");
+    {
+        std::shared_ptr<SurfaceMesh> stairMesh(std::move(buildStairs(15, 20.0, 10.0, 20.0)));
+
+        // Setup parameters
+        auto pbdParams2 = std::make_shared<PBDModelConfig>();
+        pbdParams2->m_uniformMassValue = 0.0;
+        pbdParams2->m_proximity = 0.1;
+        pbdParams2->m_contactStiffness = 1.0;
+        pbdParams2->m_maxIter = 0;
+
+        // Setup model
+        auto pbdModel2 = std::make_shared<PbdModel>();
+        pbdModel2->setModelGeometry(stairMesh);
+        pbdModel2->configure(pbdParams2);
+
+        // Setup VisualModel
+        auto stairMaterial = std::make_shared<RenderMaterial>();
+        stairMaterial->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
+        auto stairMeshModel = std::make_shared<VisualModel>(stairMesh);
+        stairMeshModel->setRenderMaterial(stairMaterial);
+
+        stairObj->addVisualModel(stairMeshModel);
+        stairObj->setDynamicalModel(pbdModel2);
+        stairObj->setCollidingGeometry(stairMesh);
+        stairObj->setVisualGeometry(stairMesh);
+        stairObj->setPhysicsGeometry(stairMesh);
+
+        scene->addSceneObject(stairObj);
+    }
+
+    // Collision
+    scene->getCollisionGraph()->addInteractionPair(deformableObj, stairObj,
+                CollisionDetection::Type::MeshToMeshBruteForce,
+                CollisionHandling::Type::PBD,
+                CollisionHandling::Type::None);
+
+    // Light
+    auto light = std::make_shared<DirectionalLight>("light");
+    light->setFocalPoint(Vec3d(5, -8, 5));
+    scene->addLight(light);
+
+    simManager->setActiveScene(scene);
+    simManager->start(SimulationStatus::Paused);
 
     return 0;
 }
diff --git a/Examples/RCM/RCM.cpp b/Examples/RCM/RCM.cpp
index c31dec67dd7af09264264cb1f9134ed9463edd60..5a0bb50f4cd2088d563f5d9a48b68af84d1dc4c1 100644
--- a/Examples/RCM/RCM.cpp
+++ b/Examples/RCM/RCM.cpp
@@ -42,9 +42,9 @@ void testRCM(const std::vector<ElemConn>& conn, const size_t numVerts);
 int
 main(int argc, char** argv)
 {
-    auto logger = Logger::getInstance();
-    logger->addFileSink("rcm-Example", "./");
-    logger->addStdoutSink();
+    Logger& logger = Logger::getInstance();
+    logger.addFileSink("rcm-Example1", "./");
+    logger.addStdoutSink();
 
     // a 2D Cartesian mesh
     {
diff --git a/Source/Common/imstkLogger.cpp b/Source/Common/imstkLogger.cpp
index 419f3799090a5d1388e5ae32421b957389fb3baa..f8fb8252a4a7648645293b1c02bd97cc20a17860 100644
--- a/Source/Common/imstkLogger.cpp
+++ b/Source/Common/imstkLogger.cpp
@@ -26,9 +26,6 @@ limitations under the License.
 
 namespace imstk
 {
-Logger*    Logger::m_loggerInstance = NULL;
-std::mutex Logger::m_mutex;
-
 stdSink::FontColor
 stdSink::GetColor(const LEVELS level) const
 {
diff --git a/Source/Common/imstkLogger.h b/Source/Common/imstkLogger.h
index 698f89471950a13e99144ca9704de22b3e416577..487711ce43728762b8b480ad9693f17765b2669e 100644
--- a/Source/Common/imstkLogger.h
+++ b/Source/Common/imstkLogger.h
@@ -25,6 +25,8 @@ limitations under the License.
 
 #include "imstkDataLogger.h"
 
+#include <memory>
+
 namespace imstk
 {
 ///
@@ -69,25 +71,31 @@ using StdoutSinkHandle = g3::SinkHandle<stdSink>;
 ///
 /// \struct Logger
 ///
-/// \brief
+/// \brief lazy initialized singleton
 ///
 class Logger
 {
 public:
-    static Logger* getInstance()
+    static Logger& getInstance()
     {
-        std::lock_guard<std::mutex> myLock(m_mutex);
-        if (!m_loggerInstance)
+        // Thread safe in C++11 ("magic statics")
+        static Logger instance;
+
+        if (instance.m_g3logWorker == nullptr)
         {
-            m_loggerInstance = new Logger();
+            instance.initialize();
         }
-        return m_loggerInstance;
-    }
 
-    ~Logger() = default;
+        return instance;
+    }
 
-    //std::shared_ptr<g3::LogWorker> getLogWorker() { return m_g3logWorker; }
+    // Disable copy & move constructors & assignments
+    Logger(const Logger&) = delete;
+    Logger& operator=(const Logger&) = delete;
+    Logger(Logger&&) = delete;
+    Logger& operator=(Logger&&) = delete;
 
+public:
     ///
     /// \brief Add a sink that logs to standard output
     ///
@@ -98,16 +106,28 @@ public:
     ///
     std::unique_ptr<FileSinkHandle> addFileSink(const std::string& name, const std::string& path);
 
-private:
-    Logger() { initialize(); };
+    ///
+    /// \brief Add your own sink
+    ///
+    template<typename T, typename DefaultLogCall>
+    void addSink(std::unique_ptr<T> real_sink, DefaultLogCall call)
+    {
+        m_g3logWorker->addSink(std::move(real_sink), call);
+    }
 
     ///
     /// \brief Create and initialize the logger
     ///
     void initialize();
 
-    static Logger* m_loggerInstance;
+    ///
+    /// \brief Manual destruction of the logger members
+    ///
+    void destroy() { m_g3logWorker = nullptr; }
+
+private:
+    Logger() { initialize(); }
+
     std::shared_ptr<g3::LogWorker> m_g3logWorker;
-    static std::mutex m_mutex;
 };
 }
diff --git a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp
index 354c10c992fd6d171d8e535db693457beb5bcebd..d7eb96cea9e1f46d15e262e8a03a541df437c1a4 100644
--- a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp
+++ b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp
@@ -22,6 +22,7 @@
 #include "imstkPbdFETetConstraint.h"
 #include "imstkPbdModel.h"
 #include "imstkLogger.h"
+#include "imstkPbdModel.h"
 
 namespace  imstk
 {
diff --git a/Source/Geometry/Mesh/imstkPointSet.cpp b/Source/Geometry/Mesh/imstkPointSet.cpp
index 620d8d820ed5dc2b0a6ecf25249ea0d10ff0ab5a..4f0bd8530460c6a091f1d8e928bf34934dd6be10 100644
--- a/Source/Geometry/Mesh/imstkPointSet.cpp
+++ b/Source/Geometry/Mesh/imstkPointSet.cpp
@@ -160,7 +160,7 @@ PointSet::setVertexDisplacements(const StdVectorOfVec3d& diff)
 void
 PointSet::setVertexDisplacements(const Vectord& u)
 {
-    assert(u.size() == 3 * m_vertexPositions.size());
+    assert(static_cast<size_t>(u.size()) == 3 * m_vertexPositions.size());
     ParallelUtils::parallelFor(m_vertexPositions.size(),
         [&](const size_t i)
         {
diff --git a/Source/Geometry/Reader/imstkVTKMeshIO.cpp b/Source/Geometry/Reader/imstkVTKMeshIO.cpp
index 99d0f97eed3031b7b00dd85dbf74e2ab21d7f7b3..98c11b683a91b6553980288f106a5dfdc2609a75 100644
--- a/Source/Geometry/Reader/imstkVTKMeshIO.cpp
+++ b/Source/Geometry/Reader/imstkVTKMeshIO.cpp
@@ -104,11 +104,11 @@ VTKMeshIO::write(const std::shared_ptr<PointSet> imstkMesh, const std::string& f
         case MeshFileType::VTU:
             if (auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(vMesh))
             {
-                VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(tetMesh, filePath);
+                return VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(tetMesh, filePath);
             }
             else if (auto hexMesh = std::dynamic_pointer_cast<HexahedralMesh>(vMesh))
             {
-                VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(hexMesh, filePath);
+                return VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(hexMesh, filePath);
             }
             else
             {
@@ -118,11 +118,11 @@ VTKMeshIO::write(const std::shared_ptr<PointSet> imstkMesh, const std::string& f
         case MeshFileType::VTK:
             if (auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(vMesh))
             {
-                VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(tetMesh, filePath);
+                return VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(tetMesh, filePath);
             }
             else if (auto hexMesh = std::dynamic_pointer_cast<HexahedralMesh>(vMesh))
             {
-                VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(hexMesh, filePath);
+                return VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(hexMesh, filePath);
             }
             else
             {
@@ -181,7 +181,6 @@ VTKMeshIO::write(const std::shared_ptr<PointSet> imstkMesh, const std::string& f
         LOG(WARNING) << "VTKMeshIO::write error: the provided mesh is not a surface or volumetric mesh.";
         return false;
     }
-    return true;
 }
 
 template<typename ReaderType>
diff --git a/Source/SimulationManager/imstkSimulationManager.cpp b/Source/SimulationManager/imstkSimulationManager.cpp
index dc254ed325eb70066adb50b510f74df9b060259b..76de417d62e63286636e15512a2cf2b7e0eaf02f 100644
--- a/Source/SimulationManager/imstkSimulationManager.cpp
+++ b/Source/SimulationManager/imstkSimulationManager.cpp
@@ -36,15 +36,16 @@ namespace imstk
 SimulationManager::SimulationManager(const std::shared_ptr<simManagerConfig> config) : m_config(config)
 {
     // Initialize the logger and add optional sinks
-    auto logger = Logger::getInstance();
     if (config->enableFileLogging)
     {
-        m_fileSinkHandle = logger->addFileSink(m_config->logFilePrefix, m_config->logPath);
+        Logger& logger = Logger::getInstance();
+        m_fileSinkHandle = logger.addFileSink(m_config->logFilePrefix, m_config->logPath);
     }
 
     if (config->enableStdoutLogging)
     {
-        m_stdSinkHandle = logger->addStdoutSink();
+        Logger& logger = Logger::getInstance();
+        m_stdSinkHandle = logger.addStdoutSink();
     }
 
     // create viewer if the selected mode is 'rendering'