diff --git a/Examples/BoneShaving/BoneShavingExample.cpp b/Examples/BoneShaving/BoneShavingExample.cpp
index 41c4aa6eed5304e53be338bee5783e93be849c8c..ce8e3912fed516af4b1dd408759ab7c95a281626 100644
--- a/Examples/BoneShaving/BoneShavingExample.cpp
+++ b/Examples/BoneShaving/BoneShavingExample.cpp
@@ -22,6 +22,7 @@
 #include "imstkMath.h"
 #include "imstkTimer.h"
 #include "imstkSimulationManager.h"
+#include "imstkScene.h"
 
 // Objects
 #include "imstkSceneObject.h"
@@ -35,6 +36,7 @@
 #include "imstkMeshIO.h"
 
 // Devices and controllers
+#include "imstkDeviceTracker.h"
 #include "imstkHDAPIDeviceClient.h"
 #include "imstkHDAPIDeviceServer.h"
 #include "imstkSceneObjectController.h"
diff --git a/Examples/CameraController/CameraControllerExample.cpp b/Examples/CameraController/CameraControllerExample.cpp
index da96f62e0beee11831b748b9d506a3725072f074..8106d64527983b00f6e2bf9617dbae1733f6522b 100644
--- a/Examples/CameraController/CameraControllerExample.cpp
+++ b/Examples/CameraController/CameraControllerExample.cpp
@@ -24,6 +24,7 @@
 #include "imstkLight.h"
 #include "imstkCamera.h"
 #include "imstkMeshIO.h"
+#include "imstkScene.h"
 
 // Devices and controllers
 #include "imstkHDAPIDeviceClient.h"
@@ -31,6 +32,8 @@
 #include "imstkCameraController.h"
 #include "imstkCollisionGraph.h"
 
+#include "imstkScene.h"
+
 const std::string phantomOmni1Name = "Phantom1";
 
 using namespace imstk;
diff --git a/Examples/CollisionDetection/ManualCDWithOctree/ManualCDWithOctreeExample.cpp b/Examples/CollisionDetection/ManualCDWithOctree/ManualCDWithOctreeExample.cpp
index dd115aa62413604b5152d85803cecabf709918d1..b16814ba18a8bdc3c7b800e71cae0a08ea0a7e58 100644
--- a/Examples/CollisionDetection/ManualCDWithOctree/ManualCDWithOctreeExample.cpp
+++ b/Examples/CollisionDetection/ManualCDWithOctree/ManualCDWithOctreeExample.cpp
@@ -28,6 +28,14 @@
 #include "imstkTimer.h"
 #include "imstkVTKTextStatusManager.h"
 #include "imstkCollisionData.h"
+#include "imstkCamera.h"
+#include "imstkDebugRenderGeometry.h"
+#include "imstkCollidingObject.h"
+#include "imstkSceneManager.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkCollisionGraph.h"
+#include "imstkScene.h"
+#include "imstkVTKRenderer.h"
 
 // This is for collision detection between geometries
 #include "imstkOctreeBasedCD.h"
diff --git a/Examples/CreateEnclosingMesh/CreateEnclosingMesh.cpp b/Examples/CreateEnclosingMesh/CreateEnclosingMesh.cpp
index 9dd0dcacf256c22bf9a36c071e0ab9d36b211018..48e14db1b750d3d8eb4e8b8bf1df5d13c673e346 100644
--- a/Examples/CreateEnclosingMesh/CreateEnclosingMesh.cpp
+++ b/Examples/CreateEnclosingMesh/CreateEnclosingMesh.cpp
@@ -21,12 +21,15 @@
 
 #include "imstkSimulationManager.h"
 #include "imstkLight.h"
+#include "imstkCamera.h"
+#include "imstkCollisionGraph.h"
 #include "imstkAPIUtilities.h"
 #include "imstkSurfaceMesh.h"
 #include "imstkTetrahedralMesh.h"
 #include "imstkMeshIO.h"
 #include "imstkVTKMeshIO.h"
 #include "imstkGeometryUtilities.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/DebugRendering/DebugRenderingExample.cpp b/Examples/DebugRendering/DebugRenderingExample.cpp
index 5f1c084c1603aabfcf7f5f292667b14bb4ef2ff6..34510c7e26a717f4762cae13eea03201490b7b33 100644
--- a/Examples/DebugRendering/DebugRenderingExample.cpp
+++ b/Examples/DebugRendering/DebugRenderingExample.cpp
@@ -22,10 +22,15 @@
 #include "imstkSimulationManager.h"
 #include "imstkSceneObject.h"
 #include "imstkLight.h"
+#include "imstkCamera.h"
+#include "imstkSceneManager.h"
+#include "imstkCollisionGraph.h"
 #include "imstkDebugRenderGeometry.h"
 #include "imstkAPIUtilities.h"
 #include "imstkVTKViewer.h"
+#include "imstkVTKRenderer.h"
 #include "imstkVTKTextStatusManager.h"
+#include "imstkScene.h"
 
 #include <thread>
 #include <chrono>
diff --git a/Examples/DeformableBody/DeformableBodyExample.cpp b/Examples/DeformableBody/DeformableBodyExample.cpp
index d5d211e1a6a29594d849900d3c3f47ad8de669c7..03f9c3966eee5cadcce3e38c37df71d693498b70 100644
--- a/Examples/DeformableBody/DeformableBodyExample.cpp
+++ b/Examples/DeformableBody/DeformableBodyExample.cpp
@@ -33,6 +33,11 @@
 #include "imstkAPIUtilities.h"
 #include "imstkConjugateGradient.h"
 #include "imstkLight.h"
+#include "imstkCamera.h"
+#include "imstkFEMDeformableBodyModel.h"
+#include "imstkCollisionGraph.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/GeometryProcessing/GeometryProcessingExample.cpp b/Examples/GeometryProcessing/GeometryProcessingExample.cpp
index 9973b7f1f258aa77257a69c9980ca791a72690a6..7a7df7d819e4cca027de256c7439019c86049a2b 100644
--- a/Examples/GeometryProcessing/GeometryProcessingExample.cpp
+++ b/Examples/GeometryProcessing/GeometryProcessingExample.cpp
@@ -27,6 +27,12 @@
 #include "imstkCube.h"
 #include "imstkAPIUtilities.h"
 #include "imstkGeometryUtilities.h"
+#include "imstkCamera.h"
+#include "imstkMeshIO.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkTetrahedralMesh.h"
+#include "imstkCollisionGraph.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/GeometryTransforms/GeometryTransformsExample.cpp b/Examples/GeometryTransforms/GeometryTransformsExample.cpp
index 1c57c90746d250a998bc2345d91503e626d03e37..a2656b5e9b3b862633f9ac200d7554e7bc8d230e 100644
--- a/Examples/GeometryTransforms/GeometryTransformsExample.cpp
+++ b/Examples/GeometryTransforms/GeometryTransformsExample.cpp
@@ -20,6 +20,8 @@
 =========================================================================*/
 
 #include "imstkSimulationManager.h"
+#include "imstkSceneManager.h"
+#include "imstkCollisionGraph.h"
 #include "imstkSceneObject.h"
 #include "imstkCamera.h"
 #include "imstkLight.h"
@@ -27,6 +29,7 @@
 #include "imstkCylinder.h"
 #include "imstkCube.h"
 #include "imstkAPIUtilities.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/Graph/GraphExample.cpp b/Examples/Graph/GraphExample.cpp
index 7f2f65723b4c626d55190e2ad86c358dc820cda3..7dff368ab5dff171bca762583a999232736ef5dc 100644
--- a/Examples/Graph/GraphExample.cpp
+++ b/Examples/Graph/GraphExample.cpp
@@ -23,6 +23,7 @@
 #include "imstkTetrahedralMesh.h"
 #include "imstkMeshIO.h"
 #include "imstkAPIUtilities.h"
+#include "imstkSurfaceMesh.h"
 
 #include <iostream>
 
diff --git a/Examples/LineMesh/LineMeshExample.cpp b/Examples/LineMesh/LineMeshExample.cpp
index ab9b0ceaf624e5a984995efcd7a7aa5c0843033f..fd64ccea6c23256771bedfe08ec8d368368cf704 100644
--- a/Examples/LineMesh/LineMeshExample.cpp
+++ b/Examples/LineMesh/LineMeshExample.cpp
@@ -20,8 +20,11 @@
 =========================================================================*/
 
 #include "imstkSimulationManager.h"
+#include "imstkCollisionGraph.h"
 #include "imstkAPIUtilities.h"
+#include "imstkCamera.h"
 #include "imstkLineMesh.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/MultipleScenes/multipleScenes.cpp b/Examples/MultipleScenes/multipleScenes.cpp
index db2df2f3c23b7fe13d1a6a4dc3ffd896c37e05bf..0291b9fbf2eda88970a00fcc1c6edcbe99528618 100644
--- a/Examples/MultipleScenes/multipleScenes.cpp
+++ b/Examples/MultipleScenes/multipleScenes.cpp
@@ -24,6 +24,13 @@
 #include "imstkPbdObject.h"
 #include "imstkAPIUtilities.h"
 #include "imstkOneToOneMap.h"
+#include "imstkCamera.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkMeshIO.h"
+#include "imstkTetrahedralMesh.h"
+#include "imstkCollisionGraph.h"
+#include "imstkPlane.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/ObjectController/ObjectControllerExample.cpp b/Examples/ObjectController/ObjectControllerExample.cpp
index 7530a34845360125a120dedc2ba653affa7e5e63..1cc14e4dc36e8ab428d52425ac19be0e7d9fcf62 100644
--- a/Examples/ObjectController/ObjectControllerExample.cpp
+++ b/Examples/ObjectController/ObjectControllerExample.cpp
@@ -28,6 +28,8 @@
 #include "imstkHDAPIDeviceServer.h"
 #include "imstkSceneObjectController.h"
 #include "imstkCollisionGraph.h"
+#include "imstkDeviceTracker.h"
+#include "imstkScene.h"
 
 // global variables
 const std::string phantomOmni1Name = "Phantom1";
diff --git a/Examples/ObjectControllerDummyClient/ObjectCtrlDummyClientExample.cpp b/Examples/ObjectControllerDummyClient/ObjectCtrlDummyClientExample.cpp
index c86ad85491f21b922458aaadd4e4579af2fd1647..87b0344db7294d62036c282e0f9aa48bbfc39362 100644
--- a/Examples/ObjectControllerDummyClient/ObjectCtrlDummyClientExample.cpp
+++ b/Examples/ObjectControllerDummyClient/ObjectCtrlDummyClientExample.cpp
@@ -27,7 +27,9 @@
 #include "imstkSceneManager.h"
 #include "imstkCube.h"
 #include "imstkDummyClient.h"
+#include "imstkDeviceTracker.h"
 #include "imstkSceneObjectController.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/Octree/OctreeExample.cpp b/Examples/Octree/OctreeExample.cpp
index 99b41aff4be4d55a70f03710d8b837ee76970cce..512240c6f90dc8864684fcbdc46856fadffeb1ca 100644
--- a/Examples/Octree/OctreeExample.cpp
+++ b/Examples/Octree/OctreeExample.cpp
@@ -27,7 +27,13 @@
 #include "imstkVTKViewer.h"
 #include "imstkTimer.h"
 #include "imstkLight.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkSceneManager.h"
+#include "imstkCamera.h"
 #include "imstkVTKTextStatusManager.h"
+#include "imstkCollisionGraph.h"
+#include "imstkScene.h"
+#include "imstkVTKRenderer.h"
 
 #include <thread>
 #include <chrono>
diff --git a/Examples/PBD/PBDCloth/pbdClothExample.cpp b/Examples/PBD/PBDCloth/pbdClothExample.cpp
index 5245ceb52e70a546d7eaa74470cc6bb3132384dc..6ccbf0a2c89f9740e6a7acb728f518fcbe45dc02 100644
--- a/Examples/PBD/PBDCloth/pbdClothExample.cpp
+++ b/Examples/PBD/PBDCloth/pbdClothExample.cpp
@@ -23,7 +23,11 @@
 #include "imstkPbdModel.h"
 #include "imstkPbdObject.h"
 #include "imstkAPIUtilities.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkCollisionGraph.h"
+#include "imstkCamera.h"
 #include "imstkLight.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/PBD/PBDCollisionMultipleObjects/PBDCollisionMultipleObjectsExample.cpp b/Examples/PBD/PBDCollisionMultipleObjects/PBDCollisionMultipleObjectsExample.cpp
index eb75d2f54930f6803a105a27413b22bb9f0a659b..e620279b58b856420c1cfdea800110c2b56ec541 100644
--- a/Examples/PBD/PBDCollisionMultipleObjects/PBDCollisionMultipleObjectsExample.cpp
+++ b/Examples/PBD/PBDCollisionMultipleObjects/PBDCollisionMultipleObjectsExample.cpp
@@ -33,6 +33,8 @@
 #include "imstkPBDCollisionHandling.h"
 #include "imstkVTKTextStatusManager.h"
 #include "imstkCollisionData.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkScene.h"
 
 // Enable this macro to generate many dragons
 #define BIG_SCENE
diff --git a/Examples/PBD/PBDCollisionOneObject/PBDCollisionOneObjectExample.cpp b/Examples/PBD/PBDCollisionOneObject/PBDCollisionOneObjectExample.cpp
index 0bc4d5991684547749b3e37b2e2d4678161ada8d..8a09a5c06240b3ed929aab81c8a633bc92d492f8 100644
--- a/Examples/PBD/PBDCollisionOneObject/PBDCollisionOneObjectExample.cpp
+++ b/Examples/PBD/PBDCollisionOneObject/PBDCollisionOneObjectExample.cpp
@@ -31,6 +31,8 @@
 #include "imstkMeshToMeshBruteForceCD.h"
 #include "imstkPBDCollisionHandling.h"
 #include "imstkTetraTriangleMap.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp b/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp
index 9dc0b77c76c340005ef92458f48365d4fed1cbda..7ae559e88652416458b076e7f3ce0a8ce5d085e5 100644
--- a/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp
+++ b/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp
@@ -31,62 +31,65 @@
 #include "imstkTetrahedralMesh.h"
 #include "imstkTetraTriangleMap.h"
 #include "imstkCollisionGraph.h"
+#include "imstkSurfaceMesh.h"
 #include "imstkLight.h"
+#include "imstkScene.h"
 
 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 +99,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/PBD/PBDDeformableObject/PBD3DDeformableObject.cpp b/Examples/PBD/PBDDeformableObject/PBD3DDeformableObject.cpp
index 629cecac5e7c4b03a13c564df91836b0a8fc6390..46f8788b6b54fccf3b7dd14ddc1a6d2ad8deef7c 100644
--- a/Examples/PBD/PBDDeformableObject/PBD3DDeformableObject.cpp
+++ b/Examples/PBD/PBDDeformableObject/PBD3DDeformableObject.cpp
@@ -27,6 +27,13 @@
 #include "imstkOneToOneMap.h"
 #include "imstkAPIUtilities.h"
 #include "imstkTetraTriangleMap.h"
+#include "imstkCollisionGraph.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkCamera.h"
+#include "imstkPlane.h"
+#include "imstkScene.h"
+
+#include <array>
 
 using namespace imstk;
 
diff --git a/Examples/PBD/PBDFluids/PBDFluidsExample.cpp b/Examples/PBD/PBDFluids/PBDFluidsExample.cpp
index 9a285c370d1ab815fbf1b019fb863f2bbcee4900..50e7ee13eda3c6da3099944fbe69f8fe144f8ba2 100644
--- a/Examples/PBD/PBDFluids/PBDFluidsExample.cpp
+++ b/Examples/PBD/PBDFluids/PBDFluidsExample.cpp
@@ -29,6 +29,8 @@
 #include "imstkAPIUtilities.h"
 #include "imstkMeshToMeshBruteForceCD.h"
 #include "imstkPBDCollisionHandling.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/PBD/PBDString/pbdStringExample.cpp b/Examples/PBD/PBDString/pbdStringExample.cpp
index 20bd8b91bbf4ada411cead17c5a5c09c7a8e6f3e..94a4a4a414ce67453f1a8cf06d0a889317881e40 100644
--- a/Examples/PBD/PBDString/pbdStringExample.cpp
+++ b/Examples/PBD/PBDString/pbdStringExample.cpp
@@ -24,6 +24,10 @@
 #include "imstkPbdModel.h"
 #include "imstkPbdObject.h"
 #include "imstkSimulationManager.h"
+#include "imstkSceneManager.h"
+#include "imstkCollisionGraph.h"
+#include "imstkCamera.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/RCM/RCM.cpp b/Examples/RCM/RCM.cpp
index c31dec67dd7af09264264cb1f9134ed9463edd60..94b27287116c96e84695dcee86f61e792bfc1f4c 100644
--- a/Examples/RCM/RCM.cpp
+++ b/Examples/RCM/RCM.cpp
@@ -22,8 +22,10 @@
 #include "imstkMeshIO.h"
 #include "imstkTetrahedralMesh.h"
 #include "imstkGeometryUtilities.h"
+#include "imstkSurfaceMesh.h"
 #include "imstkLogger.h"
 #include "bandwidth.h"
+
 #include <thread>
 
 using namespace imstk;
diff --git a/Examples/Rendering/RenderingExample.cpp b/Examples/Rendering/RenderingExample.cpp
index ce5b2d6f3db74e39786a443760297b7565a96f27..2d5ff2a29ab7076931407164b754fcbef6588d48 100644
--- a/Examples/Rendering/RenderingExample.cpp
+++ b/Examples/Rendering/RenderingExample.cpp
@@ -22,8 +22,11 @@
 #include "imstkSimulationManager.h"
 #include "imstkAPIUtilities.h"
 #include "imstkVisualObjectImporter.h"
+#include "imstkCollisionGraph.h"
 #include "imstkIBLProbe.h"
+#include "imstkCamera.h"
 #include "imstkLight.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/RigidBodyDynamics/RigidBodyDynamicsExample.cpp b/Examples/RigidBodyDynamics/RigidBodyDynamicsExample.cpp
index afad4d60cdf2a567b5aed5f8a5e30c0c11f25b40..43495d0053c70c44b71c14afa97988cce58c53cc 100644
--- a/Examples/RigidBodyDynamics/RigidBodyDynamicsExample.cpp
+++ b/Examples/RigidBodyDynamics/RigidBodyDynamicsExample.cpp
@@ -32,6 +32,7 @@
 #include "imstkSphere.h"
 #include "imstkMeshIO.h"
 #include "imstkIsometricMap.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/RigidBodyVirtualCoupling/RigidBodyVirtualCouplingExample.cpp b/Examples/RigidBodyVirtualCoupling/RigidBodyVirtualCouplingExample.cpp
index e4e68a55c563854ca28431d86dbbb0a1b96fda0d..ee7b4dbdd6b0c041a06dbb75009e51b438235827 100644
--- a/Examples/RigidBodyVirtualCoupling/RigidBodyVirtualCouplingExample.cpp
+++ b/Examples/RigidBodyVirtualCoupling/RigidBodyVirtualCouplingExample.cpp
@@ -39,6 +39,8 @@
 #include "imstkCamera.h"
 #include "imstkRigidBodyModel.h"
 #include "imstkCollisionGraph.h"
+#include "imstkDeviceTracker.h"
+#include "imstkScene.h"
 
 // global variables
 const std::string phantomOmni1Name = "Default Device";
diff --git a/Examples/SPHFluid/Fluid.hpp b/Examples/SPHFluid/Fluid.hpp
index da03a8634416a3f1ef86f01459a78eaa2580461c..48ab27fa649601faa2a3d6ac349ea41c5f98038e 100644
--- a/Examples/SPHFluid/Fluid.hpp
+++ b/Examples/SPHFluid/Fluid.hpp
@@ -23,6 +23,8 @@
 #include "imstkSPHObject.h"
 #include "imstkSPHSolver.h"
 #include "imstkSPHModel.h"
+#include "imstkPointSet.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/SPHFluid/SPHFluidExample.hpp b/Examples/SPHFluid/SPHFluidExample.hpp
index abb660eb0ee104b3063a923583d2508be81b76d2..d86ee4588b9ee0e1336ced89d7331f447ecb1955 100644
--- a/Examples/SPHFluid/SPHFluidExample.hpp
+++ b/Examples/SPHFluid/SPHFluidExample.hpp
@@ -28,6 +28,9 @@
 #include "imstkPlane.h"
 #include "imstkSphere.h"
 #include "imstkVTKTextStatusManager.h"
+#include "imstkCollisionGraph.h"
+#include "imstkSceneManager.h"
+#include "imstkCamera.h"
 
 #include "Fluid.hpp"
 #include "Solid.hpp"
diff --git a/Examples/SceneManagement/SceneManagementExample.cpp b/Examples/SceneManagement/SceneManagementExample.cpp
index f22ff1f47c767507a58c45a101164b1fd31c176a..45418a5f9d8cd4ec668ac39e7da2267528f3ed41 100644
--- a/Examples/SceneManagement/SceneManagementExample.cpp
+++ b/Examples/SceneManagement/SceneManagementExample.cpp
@@ -22,6 +22,7 @@
 #include "imstkSimulationManager.h"
 #include "imstkCollisionGraph.h"
 #include "imstkCamera.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/Screenshot/ScreenshotExample.cpp b/Examples/Screenshot/ScreenshotExample.cpp
index 66bf43ec58277992c4f96fe6a5c0231108623f0a..b34ce731ddc63cf47514588b4766097ef0c6e3cb 100644
--- a/Examples/Screenshot/ScreenshotExample.cpp
+++ b/Examples/Screenshot/ScreenshotExample.cpp
@@ -27,6 +27,7 @@
 #include "imstkCube.h"
 #include "imstkSphere.h"
 #include "imstkPlane.h"
+#include "imstkScene.h"
 
 using namespace imstk;
 
diff --git a/Examples/VirtualCoupling/VirtualCouplingExample.cpp b/Examples/VirtualCoupling/VirtualCouplingExample.cpp
index c4a65a2964f6ac6f8e28ba4caf5b2e05f2e4fe82..cce2bcbab236876fa738c15987234067b53a59e6 100644
--- a/Examples/VirtualCoupling/VirtualCouplingExample.cpp
+++ b/Examples/VirtualCoupling/VirtualCouplingExample.cpp
@@ -24,11 +24,13 @@
 #include "imstkHDAPIDeviceServer.h"
 #include "imstkHDAPIDeviceClient.h"
 #include "imstkSceneObjectController.h"
+#include "imstkDeviceTracker.h"
 #include "imstkCollisionGraph.h"
 #include "imstkLight.h"
 #include "imstkCamera.h"
 #include "imstkPlane.h"
 #include "imstkSphere.h"
+#include "imstkScene.h"
 
 // global variables
 const std::string phantomOmni1Name = "Phantom1";
diff --git a/Examples/VolumeRendering/VolumeRenderingExample.cpp b/Examples/VolumeRendering/VolumeRenderingExample.cpp
index b69fadc073ca3e35ef67cbba8882cbed03939e99..f5d5dff507d36730c65873e7fdc5b5ec83dd89a8 100644
--- a/Examples/VolumeRendering/VolumeRenderingExample.cpp
+++ b/Examples/VolumeRendering/VolumeRenderingExample.cpp
@@ -21,11 +21,16 @@
 
 // imstk
 #include "imstkAPIUtilities.h"
+#include "imstkCamera.h"
 #include "imstkMeshIO.h"
 #include "imstkSimulationManager.h"
 #include "imstkVolumeRenderMaterial.h"
 #include "imstkVolumeRenderMaterialPresets.h"
 #include "imstkVTKTextStatusManager.h"
+#include "imstkSceneManager.h"
+#include "imstkCollisionGraph.h"
+#include "imstkScene.h"
+#include "imstkVTKRenderer.h"
 
 // STL
 #include <sstream>
diff --git a/Source/Collision/CollisionDetection/imstkCollisionDetection.cpp b/Source/Collision/CollisionDetection/imstkCollisionDetection.cpp
index 520284ce2d92feffdfe9991784c60c0d575dace6..ed492025909620e3e8a5b0896dc9c705f333c161 100644
--- a/Source/Collision/CollisionDetection/imstkCollisionDetection.cpp
+++ b/Source/Collision/CollisionDetection/imstkCollisionDetection.cpp
@@ -90,6 +90,7 @@ CollisionDetection::makeCollisionDetectionObject(const Type
         IMSTK_CHECK_FOR_VALID_GEOMETRIES(pointset, capsule)
         return std::make_shared<PointSetToCapsuleCD>(pointset, capsule, colData);
     }
+#if 0
     case Type::PointSetToSpherePicking:
     {
         auto pointset = std::dynamic_pointer_cast<PointSet>(objA->getCollidingGeometry());
@@ -97,6 +98,7 @@ CollisionDetection::makeCollisionDetectionObject(const Type
         IMSTK_CHECK_FOR_VALID_GEOMETRIES(pointset, sphere)
         return std::make_shared<PointSetToSpherePickingCD>(pointset, sphere, colData);
     }
+#endif
     case Type::PointSetToSurfaceMesh:
     {
         const auto& geomA    = objA->getCollidingGeometry();
diff --git a/Source/Collision/CollisionDetection/imstkMeshToMeshBruteForceCD.cpp b/Source/Collision/CollisionDetection/imstkMeshToMeshBruteForceCD.cpp
index 2503edf23e772170dc5571aac1c86099ddf15168..bf3a503e5af0b4b87f7a4f3de6f49b433c5bc7a4 100644
--- a/Source/Collision/CollisionDetection/imstkMeshToMeshBruteForceCD.cpp
+++ b/Source/Collision/CollisionDetection/imstkMeshToMeshBruteForceCD.cpp
@@ -27,6 +27,7 @@
 #include "imstkPointSet.h"
 #include "imstkLineMesh.h"
 #include "imstkGeometry.h"
+#include "imstkColor.h"
 #include "imstkCollisionUtils.h"
 
 #include <g3log/g3log.hpp>
diff --git a/Source/Collision/CollisionDetection/imstkPointSetToSpherePickingCD.cpp b/Source/Collision/CollisionDetection/imstkPointSetToSpherePickingCD.cpp
index 95c5208079c5238b3846197c4f1b8d116f5d1659..b8780443e5cba53044bb01cb4b2cb40d2833a97e 100644
--- a/Source/Collision/CollisionDetection/imstkPointSetToSpherePickingCD.cpp
+++ b/Source/Collision/CollisionDetection/imstkPointSetToSpherePickingCD.cpp
@@ -18,7 +18,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 
 =========================================================================*/
-
+#if 0
 #include "imstkPointSetToSpherePickingCD.h"
 #include "imstkDeviceTracker.h"
 #include "imstkNarrowPhaseCD.h"
@@ -59,3 +59,4 @@ PointSetToSpherePickingCD::setDeviceTrackerAndButton(const std::shared_ptr<Devic
     m_deviceTracker = devTracker;
 }
 } // imstk
+#endif
\ No newline at end of file
diff --git a/Source/Collision/CollisionDetection/imstkPointSetToSpherePickingCD.h b/Source/Collision/CollisionDetection/imstkPointSetToSpherePickingCD.h
index f8528dd15eda21bd4dc3da25e90f23c8c3f0ab06..41e595360d9ff271f669ce5e306b8929d71b43d0 100644
--- a/Source/Collision/CollisionDetection/imstkPointSetToSpherePickingCD.h
+++ b/Source/Collision/CollisionDetection/imstkPointSetToSpherePickingCD.h
@@ -18,7 +18,7 @@
    limitations under the License.
 
    =========================================================================*/
-
+#if 0
 #pragma once
 
 #include "imstkCollisionDetection.h"
@@ -61,7 +61,8 @@ private:
     std::shared_ptr<PointSet> m_pointSet;
     std::shared_ptr<Sphere>   m_sphere;
 
-    std::shared_ptr<imstk::DeviceTracker> m_deviceTracker; ///> Device tracker to get the button status
+    std::shared_ptr<DeviceTracker> m_deviceTracker;        ///> Device tracker to get the button status
     unsigned int m_buttonId = 0;                           ///> button id
 };
 }
+#endif
\ No newline at end of file
diff --git a/Source/Collision/CollisionHandling/imstkBoneDrillingCH.cpp b/Source/Collision/CollisionHandling/imstkBoneDrillingCH.cpp
index d7fabcf036c221eef7759dfeb6530ac7da565d05..23578cc8e044cba3503441cedd47f2ea1b279762 100644
--- a/Source/Collision/CollisionHandling/imstkBoneDrillingCH.cpp
+++ b/Source/Collision/CollisionHandling/imstkBoneDrillingCH.cpp
@@ -20,7 +20,6 @@
 =========================================================================*/
 
 #include "imstkBoneDrillingCH.h"
-
 #include "imstkCollidingObject.h"
 #include "imstkTetrahedralMesh.h"
 #include "imstkCollisionData.h"
diff --git a/Source/Collision/CollisionHandling/imstkSPHCollisionHandling.h b/Source/Collision/CollisionHandling/imstkSPHCollisionHandling.h
index ad9179770057b32baabce0761a0be9a26a914beb..27a819f09668e4609b1c97dc48768c64b3060f0d 100644
--- a/Source/Collision/CollisionHandling/imstkSPHCollisionHandling.h
+++ b/Source/Collision/CollisionHandling/imstkSPHCollisionHandling.h
@@ -30,7 +30,8 @@ class SPHObject;
 class SPHCollisionHandling : public CollisionHandling
 {
 public:
-    SPHCollisionHandling(const Side& side, const std::shared_ptr<CollisionData>& colData,
+    SPHCollisionHandling(const Side&                             side,
+                         const std::shared_ptr<CollisionData>&   colData,
                          const std::shared_ptr<CollidingObject>& obj);
 
     SPHCollisionHandling() = delete;
diff --git a/Source/Collision/imstkPbdInteractionPair.cpp b/Source/Collision/imstkPbdInteractionPair.cpp
index cf2973dfcd89aa60d3dc38a921f9d6cb6cf5c4ea..e82b0fbd1c3b8ef5ea9f4ba14babff0e2da88349 100644
--- a/Source/Collision/imstkPbdInteractionPair.cpp
+++ b/Source/Collision/imstkPbdInteractionPair.cpp
@@ -26,6 +26,7 @@
 #include "imstkCollisionUtils.h"
 #include "imstkPbdModel.h"
 #include "imstkPbdObject.h"
+#include "imstkColor.h"
 #include "imstkPbdEdgeEdgeCollisionConstraint.h"
 #include "imstkPbdPointTriCollisionConstraint.h"
 
diff --git a/Source/Common/Parallel/imstkParallelUtils.h b/Source/Common/Parallel/imstkParallelUtils.h
index e7ba7fcaf02a338917323797ce3fdeda2f0679ce..61ebf911d2c5c4e1a3fa00820af3d8729fde407e 100644
--- a/Source/Common/Parallel/imstkParallelUtils.h
+++ b/Source/Common/Parallel/imstkParallelUtils.h
@@ -25,4 +25,4 @@
 #include "imstkParallelFor.h"
 #include "imstkParallelReduce.h"
 #include "imstkSpinLock.h"
-#include "imstkAtomicOperations.h"
+#include "imstkAtomicOperations.h"
\ No newline at end of file
diff --git a/Source/Common/Parallel/imstkThreadManager.cpp b/Source/Common/Parallel/imstkThreadManager.cpp
index 8687e460bbc0b7bc475519ba50f78340c6a0bdee..f242cc27b1a89efe0847044eec9d3a015a894dc9 100644
--- a/Source/Common/Parallel/imstkThreadManager.cpp
+++ b/Source/Common/Parallel/imstkThreadManager.cpp
@@ -20,6 +20,7 @@
 =========================================================================*/
 
 #include "imstkThreadManager.h"
+
 #include <g3log/g3log.hpp>
 
 namespace imstk
diff --git a/Source/Common/Utils/imstkTimer.h b/Source/Common/Utils/imstkTimer.h
index 563d0ba0625448fcedcfc3bdcdee1f3d442c1b7c..4621c0cf55c9a2b982b11753e45c31588f5e4887 100644
--- a/Source/Common/Utils/imstkTimer.h
+++ b/Source/Common/Utils/imstkTimer.h
@@ -55,7 +55,7 @@ public:
     ///
     /// \brief Constructor
     ///
-    StopWatch() {};
+    StopWatch() : state(TimerState::stopped) {};
 
     ///
     /// \brief Destructor
@@ -108,7 +108,7 @@ public:
     ///
     void printTimeElapsed(std::string const& name = std::string("noName"), const TimeUnitType unitType = TimeUnitType::milliSeconds);
 private:
-    TimerState state = TimerState::stopped;
+    TimerState state;
     std::vector<double>      lapTimes;
     std::vector<std::string> lapNames;
     std::chrono::high_resolution_clock::time_point wallClockTimeKeeper; ///> time keeper for wall clock time
@@ -125,7 +125,7 @@ public:
     ///
     /// \brief Constructor
     ///
-    CpuTimer() : StopWatch() {};
+    CpuTimer() : StopWatch(), cpuTimeKeeper(std::clock_t()) {};
 
     ///
     /// \brief Destructor
@@ -145,7 +145,7 @@ public:
     double getTimeElapsed(const TimeUnitType unitType = TimeUnitType::milliSeconds) override;
 
 private:
-    std::clock_t cpuTimeKeeper = std::clock_t(); ///> time keeper for cpu time
+    std::clock_t cpuTimeKeeper; ///> time keeper for cpu time
 };
 
 ///
@@ -159,7 +159,11 @@ public:
     ///
     /// \brief Constructor/Destructor
     ///
-    UPSCounter()  = default;
+    UPSCounter() :  m_timer(std::make_shared<StopWatch>()),
+        m_accumulatedTimer(0.),
+        m_ups(0),
+        m_updateCount(0) {};
+
     ~UPSCounter() = default;
 
     ///
@@ -184,10 +188,10 @@ public:
 
 protected:
 
-    std::shared_ptr<StopWatch> m_timer = std::make_shared<StopWatch>(); ///> Timer
+    std::shared_ptr<StopWatch> m_timer; ///> Timer
 
-    double       m_accumulatedTimer = 0.;                               ///> Accumulated time (always < 1 sec)
-    unsigned int m_ups = 0;                                             ///> Most up-to-date ups
-    unsigned int m_updateCount = 0;                                     ///> Current update count
+    double       m_accumulatedTimer;    ///> Accumulated time (always < 1 sec)
+    unsigned int m_ups;                 ///> Most up-to-date ups
+    unsigned int m_updateCount;         ///> Current update count
 };
 }
diff --git a/Source/Common/imstkModule.cpp b/Source/Common/imstkModule.cpp
index 33068e8bdb65f2b1f180659e74b95457bb3b574a..fc5fe70333c4d3e981777539f1d2834351f40fdc 100644
--- a/Source/Common/imstkModule.cpp
+++ b/Source/Common/imstkModule.cpp
@@ -21,9 +21,18 @@
 
 #include "imstkModule.h"
 #include "imstkMath.h"
+#include "imstkTimer.h"
 
 namespace imstk
 {
+Module::Module(const std::string& name, int loopDelay /*= 0*/) :
+    m_name(name),
+    m_frameCounter(std::make_shared<UPSCounter>()),
+    m_trackFPS(false),
+    m_loopDelay(loopDelay)
+{
+}
+
 void
 Module::start()
 {
diff --git a/Source/Common/imstkModule.h b/Source/Common/imstkModule.h
index 2ab9d3bd1b4590db75b1ed4face2f35089bda3f4..c8b8e2a2659954cfd528d495bba6d1895166e8d8 100644
--- a/Source/Common/imstkModule.h
+++ b/Source/Common/imstkModule.h
@@ -24,11 +24,11 @@
 #include <iostream>
 #include <atomic>
 #include <functional>
-#include "imstkLogger.h"
-#include "imstkTimer.h"
 
 namespace imstk
 {
+class UPSCounter;
+
 ///
 /// \brief Enumerations for the status of the module
 ///
@@ -55,9 +55,7 @@ public:
     ///
     /// \brief Constructor
     ///
-    Module(const std::string& name, int loopDelay = 0) :
-        m_name(name),
-        m_loopDelay(loopDelay) {}
+    Module(const std::string& name, int loopDelay = 0);
 
     ///
     /// \brief Destructor
@@ -144,19 +142,18 @@ protected:
     ///
     virtual void cleanUpModule() = 0;
 
-    CallbackFunction m_preInitCallback;                            ///> function callback preceding module initialization
-    CallbackFunction m_postInitCallback;                           ///> function callback following module initialization
-    CallbackFunction m_preUpdateCallback;                          ///> function callback preceding module update
-    CallbackFunction m_postUpdateCallback;                         ///> function callback following module update
-    CallbackFunction m_preCleanUpCallback;                         ///> function callback preceding module cleanup
-    CallbackFunction m_postCleanUpCallback;                        ///> function callback following module cleanup
-
-    std::atomic<ModuleStatus> m_status { ModuleStatus::Inactive }; ///> Module status
+    CallbackFunction m_preInitCallback;                              ///> function callback preceding module initialization
+    CallbackFunction m_postInitCallback;                             ///> function callback following module initialization
+    CallbackFunction m_preUpdateCallback;                            ///> function callback preceding module update
+    CallbackFunction m_postUpdateCallback;                           ///> function callback following module update
+    CallbackFunction m_preCleanUpCallback;                           ///> function callback preceding module cleanup
+    CallbackFunction m_postCleanUpCallback;                          ///> function callback following module cleanup
 
-    bool m_trackFPS = false;
-    std::shared_ptr<UPSCounter> m_frameCounter = std::make_shared<UPSCounter>();
+    std::atomic<ModuleStatus>   m_status { ModuleStatus::Inactive }; ///> Module status
+    std::shared_ptr<UPSCounter> m_frameCounter;
 
-    std::string m_name;                                            ///> Name of the module
-    double      m_loopDelay = 0;                                   ///> Loop delay
+    std::string m_name;      ///> Name of the module
+    double      m_loopDelay; ///> Loop delay
+    bool m_trackFPS;         ///> Flag to enable/diable FPS tracking
 };
 }
diff --git a/Source/Constraint/imstkLinearProjectionConstraint.cpp b/Source/Constraint/imstkLinearProjectionConstraint.cpp
index 1d93f3ba367a44e14548517986b0b3fab45456e9..65a9cbf2e7ae634851cf8901959de106f9e1ce0c 100644
--- a/Source/Constraint/imstkLinearProjectionConstraint.cpp
+++ b/Source/Constraint/imstkLinearProjectionConstraint.cpp
@@ -24,7 +24,11 @@
 namespace  imstk
 {
 LinearProjectionConstraint::
-LinearProjectionConstraint(const size_t& nodeId, const bool isFixed /*= false*/)
+LinearProjectionConstraint(const size_t& nodeId,
+                           const bool    isFixed /*= false*/) :
+    m_isFixedConstraint(false),
+    m_projection(Mat3d::Identity()),
+    m_value(Vec3d(0., 0., 0.))
 {
     m_nodeId = nodeId;
     if (isFixed)
diff --git a/Source/Constraint/imstkLinearProjectionConstraint.h b/Source/Constraint/imstkLinearProjectionConstraint.h
index 855266af3a514f2595490263489af33e5d5cf675..057dbe9ea38a30e3520f149f41fc863408240ba4 100644
--- a/Source/Constraint/imstkLinearProjectionConstraint.h
+++ b/Source/Constraint/imstkLinearProjectionConstraint.h
@@ -91,9 +91,9 @@ public:
     inline bool isFixed() const { return m_isFixedConstraint; }
 
 private:
-    size_t m_nodeId;                                ///> Node id
-    bool   m_isFixedConstraint = false;             ///> Flag to know if that node is fixed
-    Mat3d  m_projection = Mat3d::Identity();        ///> Orthogonal projector
-    Vec3d  m_value      = Vec3d(0., 0., 0.);        ///> Value in the subspace: range(I-m_projector)
+    size_t m_nodeId;            ///> Node id
+    bool   m_isFixedConstraint; ///> Flag to know if that node is fixed
+    Mat3d  m_projection;        ///> Orthogonal projector
+    Vec3d  m_value;             ///> Value in the subspace: range(I-m_projector)
 };
 } // imstk
diff --git a/Source/Controllers/imstkCameraController.cpp b/Source/Controllers/imstkCameraController.cpp
index d5fa2675c355a62c32a818659f6a0036564ad37d..5f2eabe19e2ea692e17e1370bcf8be53917c493b 100644
--- a/Source/Controllers/imstkCameraController.cpp
+++ b/Source/Controllers/imstkCameraController.cpp
@@ -20,14 +20,24 @@
 =========================================================================*/
 
 #include "imstkCameraController.h"
+#include "imstkMath.h"
 #include "imstkCamera.h"
+#include "imstkLogger.h"
 
 #include <utility>
 
-#include <g3log/g3log.hpp>
-
 namespace imstk
 {
+CameraController::CameraController(std::shared_ptr<Camera>       camera,
+                                   std::shared_ptr<DeviceClient> deviceClient) :
+    Module("Camera controller"),
+    m_camera(camera),
+    m_cameraTranslationOffset(WORLD_ORIGIN),
+    m_cameraRotationalOffset(Quatd::Identity()),
+    DeviceTracker(deviceClient)
+{
+}
+
 void
 CameraController::runModule()
 {
diff --git a/Source/Controllers/imstkCameraController.h b/Source/Controllers/imstkCameraController.h
index a9720c7879935492b28a62eac72b25f7f057cc4e..0cb899f40f8e78c87d5601c54e1557115b57d447 100644
--- a/Source/Controllers/imstkCameraController.h
+++ b/Source/Controllers/imstkCameraController.h
@@ -39,11 +39,7 @@ public:
     ///
     /// \brief
     ///
-    CameraController(std::shared_ptr<Camera>       camera,
-                     std::shared_ptr<DeviceClient> deviceClient) :
-        Module("Camera controller"),
-        m_camera(camera),
-        DeviceTracker(deviceClient) {}
+    CameraController(std::shared_ptr<Camera> camera, std::shared_ptr<DeviceClient> deviceClient);
 
     ///
     /// \brief
@@ -83,9 +79,9 @@ protected:
     ///
     void cleanUpModule() override {};
 
-    std::shared_ptr<Camera> m_camera;                    ///< Camera controlled by the external device
+    std::shared_ptr<Camera> m_camera;     ///< Camera controlled by the external device
 
-    Vec3d m_cameraTranslationOffset = WORLD_ORIGIN;      ///< Translation offset for the camera over tracking data
-    Quatd m_cameraRotationalOffset  = Quatd::Identity(); ///< camera head angle offset (in deg)
+    Vec3d m_cameraTranslationOffset;      ///< Translation offset for the camera over tracking data
+    Quatd m_cameraRotationalOffset;       ///< camera head angle offset (in deg)
 };
 } // imstk
diff --git a/Source/Controllers/imstkDeviceTracker.cpp b/Source/Controllers/imstkDeviceTracker.cpp
index d79d790b3815e78718eea3c6ff222253c1733bc8..7ed271c3423f2a69460d42d0caea063041907a54 100644
--- a/Source/Controllers/imstkDeviceTracker.cpp
+++ b/Source/Controllers/imstkDeviceTracker.cpp
@@ -19,14 +19,22 @@
 
 =========================================================================*/
 
+#include "imstkMath.h"
 #include "imstkDeviceTracker.h"
+#include "imstkDeviceClient.h"
+#include "imstkLogger.h"
 
 #include <utility>
 
-#include <g3log/g3log.hpp>
-
 namespace imstk
 {
+DeviceTracker::DeviceTracker(std::shared_ptr<DeviceClient> deviceClient) :
+    m_deviceClient(deviceClient),
+    m_translationOffset(WORLD_ORIGIN),
+    m_rotationOffset(Quatd::Identity())
+{
+}
+
 bool
 DeviceTracker::updateTrackingData()
 {
diff --git a/Source/Controllers/imstkDeviceTracker.h b/Source/Controllers/imstkDeviceTracker.h
index 86c80fbcd66dd3af699ade1c11ff01a82d5ba039..aca78be53703651f05a2da9e0385872649dbd32d 100644
--- a/Source/Controllers/imstkDeviceTracker.h
+++ b/Source/Controllers/imstkDeviceTracker.h
@@ -21,14 +21,12 @@
 
 #pragma once
 
-#include <memory>
-
-// imstk
 #include "imstkMath.h"
-#include "imstkDeviceClient.h"
 
 namespace imstk
 {
+class DeviceClient;
+
 ///
 /// \class DeviceTracker
 ///
@@ -51,8 +49,7 @@ public:
     ///
     /// \brief Constructor
     ///
-    explicit DeviceTracker(std::shared_ptr<DeviceClient> deviceClient) :
-        m_deviceClient(deviceClient) {}
+    explicit DeviceTracker(std::shared_ptr<DeviceClient> deviceClient);
 
     ///
     /// \brief Destructor
@@ -119,8 +116,8 @@ protected:
 
     std::shared_ptr<DeviceClient> m_deviceClient;          ///< Reports device tracking information
     double m_scaling = 1.0;                                ///< Scaling factor for physical to virtual translations
-    Vec3d  m_translationOffset  = WORLD_ORIGIN;            ///< Translation concatenated to the device translation
-    Quatd  m_rotationOffset     = Quatd::Identity();       ///< Rotation concatenated to the device rotation
+    Vec3d  m_translationOffset;                            ///< Translation concatenated to the device translation
+    Quatd  m_rotationOffset;                               ///< Rotation concatenated to the device rotation
     unsigned char m_invertFlags = 0x00;                    ///< Invert flags to be masked with DeviceTracker::InvertFlag
 
     Vec3d m_currentPos;
diff --git a/Source/Controllers/imstkLaparoscopicToolController.cpp b/Source/Controllers/imstkLaparoscopicToolController.cpp
index 04a4ce20143321644ff228c706bb3926c3ded033..f478a84817e5179a290b690b73fbb4afdadd82c1 100644
--- a/Source/Controllers/imstkLaparoscopicToolController.cpp
+++ b/Source/Controllers/imstkLaparoscopicToolController.cpp
@@ -21,14 +21,31 @@
 
 #include "imstkLaparoscopicToolController.h"
 #include "imstkCollidingObject.h"
+#include "imstkDeviceClient.h"
 #include "imstkGeometry.h"
 #include "imstkSceneObject.h"
 #include "imstkLogger.h"
+#include "imstkMath.h"
 
 #include <utility>
 
 namespace imstk
 {
+LaparoscopicToolController::LaparoscopicToolController(
+    std::shared_ptr<SceneObject>   shaft,
+    std::shared_ptr<SceneObject>   upperJaw,
+    std::shared_ptr<SceneObject>   lowerJaw,
+    std::shared_ptr<DeviceTracker> trackingController) :
+    SceneObjectControllerBase(),
+    m_trackingController(trackingController),
+    m_shaft(shaft),
+    m_upperJaw(upperJaw),
+    m_lowerJaw(lowerJaw),
+    m_jawRotationAxis(Vec3d(0, 1., 0))
+{
+    m_trackingController->getDeviceClient()->setButtonsEnabled(true);
+}
+
 void
 LaparoscopicToolController::updateControlledObjects()
 {
diff --git a/Source/Controllers/imstkLaparoscopicToolController.h b/Source/Controllers/imstkLaparoscopicToolController.h
index a67c92a17afeb2e983f476c470762d2c80f0e696..064c4b8e515ff0248501754e275408b9232aaa5a 100644
--- a/Source/Controllers/imstkLaparoscopicToolController.h
+++ b/Source/Controllers/imstkLaparoscopicToolController.h
@@ -23,7 +23,6 @@
 
 #include "imstkSceneObjectControllerBase.h"
 #include "imstkDeviceTracker.h"
-#include "imstkMath.h"
 
 namespace imstk
 {
@@ -47,14 +46,7 @@ public:
         std::shared_ptr<SceneObject>   shaft,
         std::shared_ptr<SceneObject>   upperJaw,
         std::shared_ptr<SceneObject>   lowerJaw,
-        std::shared_ptr<DeviceTracker> trackingController) :
-        m_trackingController(trackingController),
-        m_shaft(shaft),
-        m_upperJaw(upperJaw),
-        m_lowerJaw(lowerJaw)
-    {
-        m_trackingController->getDeviceClient()->setButtonsEnabled(true);
-    }
+        std::shared_ptr<DeviceTracker> trackingController);
 
     LaparoscopicToolController() = delete; //not allowed for now
 
@@ -121,6 +113,6 @@ protected:
     double m_change      = 6.0e-5;                       ///< Amount of change in jaw angle per frame
     double m_maxJawAngle = PI / 6.0;                     ///< Maximum angle of the jaws
 
-    Vec3d m_jawRotationAxis = Vec3d(0, 1., 0);           ///< Angle of the jaws
+    Vec3d m_jawRotationAxis;                             ///< Angle of the jaws
 };
 } // imstk
diff --git a/Source/Controllers/imstkSceneObjectController.cpp b/Source/Controllers/imstkSceneObjectController.cpp
index fc8df01a6fca366ee2a6249f2e16c1a7b8029e76..7056dcb7f7f92d77da5286d338714f0715a88895 100644
--- a/Source/Controllers/imstkSceneObjectController.cpp
+++ b/Source/Controllers/imstkSceneObjectController.cpp
@@ -20,7 +20,9 @@
 =========================================================================*/
 
 #include "imstkSceneObjectController.h"
+#include "imstkDeviceTracker.h"
 #include "imstkSceneObject.h"
+#include "imstkDeviceClient.h"
 #include "imstkCollidingObject.h"
 #include "imstkGeometry.h"
 
@@ -30,6 +32,11 @@
 
 namespace imstk
 {
+SceneObjectController::SceneObjectController(std::shared_ptr<SceneObject> sceneObject, std::shared_ptr<DeviceTracker> trackingController) :
+    m_trackingController(trackingController), m_sceneObject(sceneObject)
+{
+}
+
 void
 SceneObjectController::updateControlledObjects()
 {
@@ -60,4 +67,10 @@ SceneObjectController::applyForces()
         m_trackingController->getDeviceClient()->setForce(collidingObject->getForce());
     }
 }
+
+void
+SceneObjectController::setTrackerToOutOfDate()
+{
+    m_trackingController->setTrackerToOutOfDate();
+}
 } // imstk
diff --git a/Source/Controllers/imstkSceneObjectController.h b/Source/Controllers/imstkSceneObjectController.h
index ad37ca3d4c82eefd4ffbd144f2fb1175690c3bfb..9a35ead4c5a8c8b873c513abc7c3ebd3e03b16d2 100644
--- a/Source/Controllers/imstkSceneObjectController.h
+++ b/Source/Controllers/imstkSceneObjectController.h
@@ -22,7 +22,6 @@
 #pragma once
 
 #include "imstkSceneObjectControllerBase.h"
-#include "imstkDeviceTracker.h"
 
 #include <memory>
 #include <functional>
@@ -30,6 +29,7 @@
 namespace imstk
 {
 class SceneObject;
+class DeviceTracker;
 
 ///
 /// \class SceneObjectController
@@ -39,12 +39,12 @@ class SceneObject;
 class SceneObjectController : public SceneObjectControllerBase
 {
 using ControllerCallbackFunction = std::function<void (SceneObjectController* hdapiClient)>;
+
 public:
     ///
     /// \brief Constructor
     ///
-    SceneObjectController(std::shared_ptr<SceneObject> sceneObject, std::shared_ptr<DeviceTracker> trackingController) :
-        m_trackingController(trackingController), m_sceneObject(sceneObject) {}
+    SceneObjectController(std::shared_ptr<SceneObject> sceneObject, std::shared_ptr<DeviceTracker> trackingController);
 
     SceneObjectController() = delete;
 
@@ -66,7 +66,7 @@ public:
     ///
     /// \brief Sets the tracker to out-of-date
     ///
-    inline void setTrackerToOutOfDate() override { m_trackingController->setTrackerToOutOfDate(); }
+    void setTrackerToOutOfDate() override;
 
     ///
     /// \brief Get/Set controlled scene object
diff --git a/Source/DataStructures/imstkNeighborSearch.h b/Source/DataStructures/imstkNeighborSearch.h
index 2c687de19eb2fb121818619155bca0caa9b284c6..5cc349a1c46945e85b4b7821e6f6993522e758ab 100644
--- a/Source/DataStructures/imstkNeighborSearch.h
+++ b/Source/DataStructures/imstkNeighborSearch.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkMath.h"
 
 namespace imstk
diff --git a/Source/DataStructures/imstkSpatialHashTable.h b/Source/DataStructures/imstkSpatialHashTable.h
index 3d4c3ba5b036e8eb497c3a70329e598c0ce735ff..a49c62d7323ec2de628947c71aa5b4abca02fbd3 100644
--- a/Source/DataStructures/imstkSpatialHashTable.h
+++ b/Source/DataStructures/imstkSpatialHashTable.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include "imstkMath.h"
-
 namespace imstk
 {
 ///
diff --git a/Source/DataStructures/imstkSpatialHashTableSeparateChaining.h b/Source/DataStructures/imstkSpatialHashTableSeparateChaining.h
index 9d1b4a8a94d270176cea3837c5962cb445c27612..83292740955320e81563c0bb1652238db2d2132b 100644
--- a/Source/DataStructures/imstkSpatialHashTableSeparateChaining.h
+++ b/Source/DataStructures/imstkSpatialHashTableSeparateChaining.h
@@ -21,7 +21,6 @@
 
 #pragma once
 
-#include <memory>
 #include <unordered_set>
 
 #include "imstkMath.h"
diff --git a/Source/DataStructures/imstkUniformSpatialGrid.h b/Source/DataStructures/imstkUniformSpatialGrid.h
index f14f1f90a42a7e4576c437d0900f89a22748737b..449ac7b76212a87e75026890b06bf19c1600476c 100644
--- a/Source/DataStructures/imstkUniformSpatialGrid.h
+++ b/Source/DataStructures/imstkUniformSpatialGrid.h
@@ -22,7 +22,6 @@
 #pragma once
 
 #include <array>
-#include <vector>
 
 #include "imstkMath.h"
 #include "imstkLogger.h"
@@ -63,7 +62,7 @@ public:
     ///
     void initialize(const Vec3r& lowerCorner, const Vec3r& upperCorner, const Real cellSize)
     {
-        LOG_IF(FATAL, (cellSize <= 0)) << "Invalid cell size";
+        CHECK(cellSize > 0) << "Invalid cell size";
 
         m_LowerCorner = lowerCorner;
         m_UpperCorner = upperCorner;
@@ -78,7 +77,7 @@ public:
             m_NTotalCells  *= m_Resolution[i];
         }
 
-        LOG_IF(FATAL, (m_NTotalCells == 0)) << "Invalid grid size: [" +
+        CHECK(m_NTotalCells != 0) << "Invalid grid size: [" +
             std::to_string(m_LowerCorner[0]) + ", " + std::to_string(m_LowerCorner[1]) + ", " + std::to_string(m_LowerCorner[2]) + "] => " +
             std::to_string(m_UpperCorner[0]) + ", " + std::to_string(m_UpperCorner[1]) + ", " + std::to_string(m_UpperCorner[2]) + "], " +
             "cellSize = " + std::to_string(m_CellSize);
diff --git a/Source/Devices/imstkDeviceClient.cpp b/Source/Devices/imstkDeviceClient.cpp
index 9ef45ad2b020adb70191fe1e00bc0cba004e434e..6f7f5db5c0dc0202420355f9ce1d4000fb934302 100644
--- a/Source/Devices/imstkDeviceClient.cpp
+++ b/Source/Devices/imstkDeviceClient.cpp
@@ -25,6 +25,16 @@
 
 namespace imstk
 {
+DeviceClient::DeviceClient(const std::string& name, const std::string& ip) :
+    m_deviceName(name),
+    m_position(Vec3d::Zero()),
+    m_velocity(Vec3d::Zero()),
+    m_force(Vec3d::Zero()),
+    m_orientation(Quatd::Identity()),
+    m_ip(ip)
+{
+}
+
 const std::string&
 DeviceClient::getIp()
 {
diff --git a/Source/Devices/imstkDeviceClient.h b/Source/Devices/imstkDeviceClient.h
index 62637acb651d979700b642e02e5c371e696c4644..2f9bc39e7b554a322f391ced0f0e7a88c62a8991 100644
--- a/Source/Devices/imstkDeviceClient.h
+++ b/Source/Devices/imstkDeviceClient.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <map>
-
 #include "imstkMath.h"
 
 namespace imstk
@@ -100,9 +98,7 @@ protected:
     ///
     /// \brief Constructor
     ///
-    DeviceClient(const std::string& name, const std::string& ip) :
-        m_deviceName(name),
-        m_ip(ip) {}
+    DeviceClient(const std::string& name, const std::string& ip);
 
     std::string m_deviceName;                ///< Device Name
     std::string m_ip;                        ///< Connection device IP
@@ -112,10 +108,10 @@ protected:
     bool m_buttonsEnabled  = true;           ///< Buttons enabled if true
     bool m_forceEnabled    = false;          ///< Force enabled if true
 
-    Vec3d m_position    = Vec3d::Zero();     ///< Position of end effector
-    Vec3d m_velocity    = Vec3d::Zero();     ///< Linear velocity of end effector
-    Quatd m_orientation = Quatd::Identity(); ///< Orientation of the end effector
+    Vec3d m_position;                        ///< Position of end effector
+    Vec3d m_velocity;                        ///< Linear velocity of end effector
+    Quatd m_orientation;                     ///< Orientation of the end effector
     std::map<size_t, bool> m_buttons;        ///< Buttons: true = pressed/false = not pressed
-    Vec3d m_force = Vec3d::Zero();           ///< Force vector
+    Vec3d m_force;                           ///< Force vector
 };
 }
diff --git a/Source/Devices/imstkHDAPIDeviceClient.h b/Source/Devices/imstkHDAPIDeviceClient.h
index bd16f0da0dc68bda8be1cfa265ba1a242bcee6a5..c4d2ab3ae5a8dd8739356cccb864eb8fc33ffe56 100644
--- a/Source/Devices/imstkHDAPIDeviceClient.h
+++ b/Source/Devices/imstkHDAPIDeviceClient.h
@@ -24,14 +24,10 @@
 #ifndef imstkHDAPIDeviceClient_h
 #define imstkHDAPIDeviceClient_h
 
-#include <map>
-
 #include "imstkDeviceClient.h"
 
 #include <HD/hd.h>
 
-#include <memory>
-
 namespace imstk
 {
 struct HD_state
diff --git a/Source/Devices/imstkHDAPIDeviceServer.cpp b/Source/Devices/imstkHDAPIDeviceServer.cpp
index 0462c51c012c5fa474d100c1c32958442cfca58e..380a3a2a3ffcc7ab42b649d672d84d9eff3e4390 100644
--- a/Source/Devices/imstkHDAPIDeviceServer.cpp
+++ b/Source/Devices/imstkHDAPIDeviceServer.cpp
@@ -22,6 +22,7 @@
 #ifdef iMSTK_USE_OPENHAPTICS
 
 #include "imstkHDAPIDeviceServer.h"
+#include "imstkHDAPIDeviceClient.h"
 
 #include <HD/hd.h>
 
diff --git a/Source/Devices/imstkHDAPIDeviceServer.h b/Source/Devices/imstkHDAPIDeviceServer.h
index a94e955329467544b94a89a99296b74602defb0d..9d25aeece66471cb127818292ef24116952ee542 100644
--- a/Source/Devices/imstkHDAPIDeviceServer.h
+++ b/Source/Devices/imstkHDAPIDeviceServer.h
@@ -25,15 +25,13 @@
 #define imstkHDAPIDeviceServer_h
 
 #include <vector>
-#include <map>
-#include <typeinfo>
 
 // imstk
 #include "imstkModule.h"
-#include "imstkHDAPIDeviceClient.h"
 
 namespace imstk
 {
+class HDAPIDeviceClient;
 ///
 /// \class HDAPIDeviceServer
 /// \brief Devices server using HDAPI
diff --git a/Source/Devices/imstkVRPNArduinoDeviceClient.h b/Source/Devices/imstkVRPNArduinoDeviceClient.h
index 3d0b4abbf4d97b1f55a3031ca3d5f96b28f60a37..c47b61c752b094a32407b1773c3a3f416ebf7f81 100644
--- a/Source/Devices/imstkVRPNArduinoDeviceClient.h
+++ b/Source/Devices/imstkVRPNArduinoDeviceClient.h
@@ -21,13 +21,9 @@
 
 #pragma once
 
-#include <map>
-
 #include "imstkDeviceClient.h"
 #include "imstkModule.h"
 
-#include <memory>
-
 #include <vrpn_Configure.h>
 #include <vrpn_Analog.h>
 
@@ -46,8 +42,10 @@ public:
     ///
     VRPNArduinoDeviceClient(const std::string& deviceName, const std::string& ip) :
         DeviceClient(deviceName, ip),
-        Module(deviceName + "@" + ip)
-    {}
+        Module(deviceName + "@" + ip),
+        m_ypr(Vec3d::Zero()),
+        m_accel(Vec3d::Zero()),
+        m_roll(0) {}
 
     ///
     /// \brief Destructor
@@ -88,8 +86,8 @@ private:
     static void VRPN_CALLBACK analogChangeHandler(void* userData, const _vrpn_ANALOGCB a);
 
     std::shared_ptr<vrpn_Analog_Remote> m_vrpnAnalog;           //!< VRPN position/orientation interface
-    Vec3d m_ypr   = Vec3d::Zero();
-    Vec3d m_accel = Vec3d::Zero();
-    float m_roll  = 0;
+    Vec3d m_ypr;
+    Vec3d m_accel;
+    float m_roll;
 };
 }
diff --git a/Source/Devices/imstkVRPNDeviceClient.h b/Source/Devices/imstkVRPNDeviceClient.h
index 07f80bbf5725c6a97f776f1b1bbf526624e44310..ef641fecab24939268b4dbebe387a26259c768b1 100644
--- a/Source/Devices/imstkVRPNDeviceClient.h
+++ b/Source/Devices/imstkVRPNDeviceClient.h
@@ -21,13 +21,10 @@
 
 #pragma once
 
-#include <map>
-
 #include "imstkDeviceClient.h"
 #include "imstkModule.h"
 
-#include <memory>
-
+// vrpn includes
 #include <vrpn_Configure.h>
 #include <vrpn_Tracker.h>
 #include <vrpn_Analog.h>
diff --git a/Source/Devices/imstkVRPNDeviceServer.h b/Source/Devices/imstkVRPNDeviceServer.h
index e360d7086d3b574d89927e06e9d9c31e781a6c0d..430f6846f9e44db7e208af2a5fe70010ddd59ccd 100644
--- a/Source/Devices/imstkVRPNDeviceServer.h
+++ b/Source/Devices/imstkVRPNDeviceServer.h
@@ -23,7 +23,6 @@
 
 #include <vector>
 #include <map>
-#include <typeinfo>
 #include <string>
 
 // vrpn
diff --git a/Source/DynamicalModels/CMakeLists.txt b/Source/DynamicalModels/CMakeLists.txt
index e3168887a7f4aedf2ce81c3968dde33d2d87e0d1..adb258a712ff1998c80ac6c6b1e4e57a88e290b4 100644
--- a/Source/DynamicalModels/CMakeLists.txt
+++ b/Source/DynamicalModels/CMakeLists.txt
@@ -25,7 +25,7 @@ imstk_add_library( DynamicalModels
     VegaFEM::volumetricMesh
     PhysX
   )
-  
+ 
 #-----------------------------------------------------------------------------
 # Testing
 #-----------------------------------------------------------------------------
diff --git a/Source/DynamicalModels/InternalForceModel/imstkInternalForceModel.h b/Source/DynamicalModels/InternalForceModel/imstkInternalForceModel.h
index 9b9f5d8910323782118dc6d1f9d6844d51f6f304..c8b5e17c771d8514cb8ec3a9e6881e6dafe5f122 100644
--- a/Source/DynamicalModels/InternalForceModel/imstkInternalForceModel.h
+++ b/Source/DynamicalModels/InternalForceModel/imstkInternalForceModel.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include "imstkLogger.h"
-
 #include "imstkMath.h"
 #include "imstkInternalForceModelTypes.h"
 
diff --git a/Source/DynamicalModels/InternalForceModel/imstkLinearFEMForceModel.h b/Source/DynamicalModels/InternalForceModel/imstkLinearFEMForceModel.h
index aa6702f0d65a810e9c99c62b6a62e5f72a33a133..7282614a67f0c09ea4672acd4e7b19694f04df46 100644
--- a/Source/DynamicalModels/InternalForceModel/imstkLinearFEMForceModel.h
+++ b/Source/DynamicalModels/InternalForceModel/imstkLinearFEMForceModel.h
@@ -21,12 +21,9 @@
 
 #pragma once
 
-#include <memory>
-
-#include "imstkLogger.h"
-
 //imstk
 #include "imstkInternalForceModel.h"
+#include "imstkLogger.h"
 
 //vega
 #include "StVKInternalForces.h"
diff --git a/Source/DynamicalModels/InternalForceModel/imstkStVKForceModel.h b/Source/DynamicalModels/InternalForceModel/imstkStVKForceModel.h
index eea7a604c14a84db9ade641812cbaa25d5dfb371..7e06e4742866a938a2a06ed54bb4c0b844f35398 100644
--- a/Source/DynamicalModels/InternalForceModel/imstkStVKForceModel.h
+++ b/Source/DynamicalModels/InternalForceModel/imstkStVKForceModel.h
@@ -21,21 +21,18 @@
 
 #pragma once
 
-#include <memory>
-#include "imstkLogger.h"
-
 //imstk
 #include "imstkInternalForceModel.h"
+#include "imstkLogger.h"
 
+//vega
 #pragma warning( push )
 #pragma warning( disable : 4458 )
-//vega
 #include "StVKInternalForces.h"
 #pragma warning( pop )
 
 #include "StVKStiffnessMatrix.h"
 #include "StVKElementABCDLoader.h"
-
 #include "tetMesh.h"
 
 namespace imstk
diff --git a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdAreaConstraint.h b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdAreaConstraint.h
index 88eb5a15daaa61c12932ca36f9815916597694aa..03cd7b923b4a2e62eb4803fc820ed2132790f87e 100644
--- a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdAreaConstraint.h
+++ b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdAreaConstraint.h
@@ -46,9 +46,11 @@ public:
     ///
     /// \brief Initializes the area constraint
     ///
-    void initConstraint(PbdModel& model, const size_t& pIdx1,
-                        const size_t& pIdx2, const size_t& pIdx3,
-                        const double k = 2.5);
+    void initConstraint(PbdModel&     model,
+                        const size_t& pIdx1,
+                        const size_t& pIdx2,
+                        const size_t& pIdx3,
+                        const double  k = 2.5);
 
     ///
     /// \brief Solves the area constraint
diff --git a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdConstraint.h b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdConstraint.h
index 667fb3d68f226e0b87f8d0464208c81af446e221..d2ab09f2eb8131d6d6c04ea2bd0af5995d063277 100644
--- a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdConstraint.h
+++ b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdConstraint.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include "imstkMath.h"
+#include <vector>
 
 namespace imstk
 {
diff --git a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFEMConstraint.cpp b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFEMConstraint.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f9acfad1d5e7291c29bba6812e08ec843c25ec59
--- /dev/null
+++ b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFEMConstraint.cpp
@@ -0,0 +1,35 @@
+/*=========================================================================
+
+   Library: iMSTK
+
+   Copyright (c) Kitware, Inc. & Center for Modeling, Simulation,
+   & Imaging in Medicine, Rensselaer Polytechnic Institute.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0.txt
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=========================================================================*/
+
+#include "imstkPbdFEMConstraint.h"
+
+namespace imstk
+{
+PbdFEMConstraint::PbdFEMConstraint(const unsigned int cardinality,
+                                   MaterialType       mtype /*= MaterialType::StVK*/) :
+    PbdConstraint(),
+    m_elementVolume(0),
+    m_material(mtype),
+    m_invRestMat(Mat3d::Identity())
+{
+    m_vertexIds.resize(cardinality);
+}
+} // imstk
\ No newline at end of file
diff --git a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFEMConstraint.h b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFEMConstraint.h
index d6cd035f1ca547fb6aeb037d82bce7d14aaa6238..404cbc9f8fbcd7ca9a81e53386b2608d65e7b29d 100644
--- a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFEMConstraint.h
+++ b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFEMConstraint.h
@@ -22,6 +22,7 @@
 #pragma once
 
 #include "imstkPbdConstraint.h"
+#include "imstkMath.h"
 
 namespace imstk
 {
@@ -48,14 +49,10 @@ public:
     ///
     /// \brief Constructor
     ///
-    explicit PbdFEMConstraint(const unsigned int cardinality, MaterialType mtype = MaterialType::StVK) :
-        PbdConstraint(), m_material(mtype), m_invRestMat(Mat3d::Identity())
-    {
-        m_vertexIds.resize(cardinality);
-    }
+    explicit PbdFEMConstraint(const unsigned int cardinality, MaterialType mtype = MaterialType::StVK);
 
 public:
-    double       m_elementVolume = 0.; ///> Volume of the element
+    double       m_elementVolume;      ///> Volume of the element
     MaterialType m_material;           ///> Material type
     Mat3d m_invRestMat;                ///>
 };
diff --git a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp
index 354c10c992fd6d171d8e535db693457beb5bcebd..6d1b0e87c8af19e6af062591a44e30cc7409bc14 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 "imstkMath.h"
 
 namespace  imstk
 {
diff --git a/Source/DynamicalModels/ObjectModels/imstkPbdModel.cpp b/Source/DynamicalModels/ObjectModels/imstkPbdModel.cpp
index 36757eaae7aae9c61a715fb8a3c5869402360570..4d9715513c89c95acfac9f9728f70e7d97617689 100644
--- a/Source/DynamicalModels/ObjectModels/imstkPbdModel.cpp
+++ b/Source/DynamicalModels/ObjectModels/imstkPbdModel.cpp
@@ -35,8 +35,7 @@
 #include "imstkParallelUtils.h"
 #include "imstkGeometryUtilities.h"
 #include "imstkMeshIO.h"
-
-#include <g3log/g3log.hpp>
+#include "imstkColor.h"
 
 #include <unordered_map>
 
diff --git a/Source/DynamicalModels/ObjectModels/imstkRigidBodyModel.h b/Source/DynamicalModels/ObjectModels/imstkRigidBodyModel.h
index cfcd28f7dfe6f9a4241784b5f05e62c87685fa8f..b9d377d7bd34a1ece03e01dfd423c71ada8bbdf4 100644
--- a/Source/DynamicalModels/ObjectModels/imstkRigidBodyModel.h
+++ b/Source/DynamicalModels/ObjectModels/imstkRigidBodyModel.h
@@ -24,7 +24,6 @@
 
 #include "imstkDynamicalModel.h"
 #include "imstkRigidBodyState.h"
-#include "imstkSurfaceMesh.h"
 #include "imstkRigidBodyWorld.h"
 
 namespace imstk
diff --git a/Source/DynamicalModels/ObjectModels/imstkSPHModel.cpp b/Source/DynamicalModels/ObjectModels/imstkSPHModel.cpp
index 16f0653216561ddf09bc629a1dc17797e4e18244..ca91fa161179157371ec49e46d519426f85c2c32 100644
--- a/Source/DynamicalModels/ObjectModels/imstkSPHModel.cpp
+++ b/Source/DynamicalModels/ObjectModels/imstkSPHModel.cpp
@@ -21,7 +21,7 @@
 
 #include "imstkSPHModel.h"
 #include "imstkParallelUtils.h"
-#include <g3log/g3log.hpp>
+#include "imstkPointSet.h"
 
 namespace imstk
 {
diff --git a/Source/DynamicalModels/ObjectModels/imstkSPHModel.h b/Source/DynamicalModels/ObjectModels/imstkSPHModel.h
index 99ff71744d865f134d690eca0ddd367d55a3d391..d5cedcf23b8a2eabe9996d56bbaaed58cc5bae2d 100644
--- a/Source/DynamicalModels/ObjectModels/imstkSPHModel.h
+++ b/Source/DynamicalModels/ObjectModels/imstkSPHModel.h
@@ -21,7 +21,6 @@
 
 #pragma once
 
-#include "imstkPointSet.h"
 #include "imstkDynamicalModel.h"
 #include "imstkSPHState.h"
 #include "imstkSPHKernels.h"
@@ -29,6 +28,8 @@
 
 namespace imstk
 {
+class PointSet;
+
 ///
 /// \class SPHModelConfig
 /// \brief Class that holds the SPH model parameters
diff --git a/Source/DynamicalModels/ObjectStates/imstkPbdState.cpp b/Source/DynamicalModels/ObjectStates/imstkPbdState.cpp
index 3622b0f7df481f8f5001ac453bbefeba8445140d..4c06dc9f5a2b0df9df9bf4474a7e259c10f30f5a 100644
--- a/Source/DynamicalModels/ObjectStates/imstkPbdState.cpp
+++ b/Source/DynamicalModels/ObjectStates/imstkPbdState.cpp
@@ -20,6 +20,7 @@
 =========================================================================*/
 
 #include "imstkPbdState.h"
+#include "imstkPointSet.h"
 
 namespace imstk
 {
diff --git a/Source/DynamicalModels/ObjectStates/imstkPbdState.h b/Source/DynamicalModels/ObjectStates/imstkPbdState.h
index f740b186f349b349b0cc3270c426dc873d74bade..bcc2884edf0417daf9cf185002813c922f46a4e4 100644
--- a/Source/DynamicalModels/ObjectStates/imstkPbdState.h
+++ b/Source/DynamicalModels/ObjectStates/imstkPbdState.h
@@ -21,14 +21,11 @@
 
 #pragma once
 
-#include <Eigen/Dense>
-#include <vector>
-
-#include "imstkPointSet.h"
 #include "imstkMath.h"
 
 namespace imstk
 {
+class PointSet;
 ///
 /// \class PbdState
 ///
diff --git a/Source/DynamicalModels/ObjectStates/imstkSPHState.cpp b/Source/DynamicalModels/ObjectStates/imstkSPHState.cpp
index 47f9630960127c23aede1189e388ffd4a41121d6..67e52606bfff5514257d6ef02241053e88345d4d 100644
--- a/Source/DynamicalModels/ObjectStates/imstkSPHState.cpp
+++ b/Source/DynamicalModels/ObjectStates/imstkSPHState.cpp
@@ -20,7 +20,7 @@
 =========================================================================*/
 
 #include "imstkSPHState.h"
-#include <g3log/g3log.hpp>
+#include "imstkLogger.h"
 
 namespace imstk
 {
@@ -66,4 +66,64 @@ SPHSimulationState::initializeData()
     m_NeighborInfo.resize(numParticles);
     m_NeighborLists.resize(numParticles);
 }
+
+///
+/// \brief Get number of particles
+///
+size_t
+SPHSimulationState::getNumParticles() const
+{
+#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
+    LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
+#endif
+    return m_KinematicState->getNumParticles();
+}
+
+///
+/// \brief Returns the vector of all particle positions
+///
+StdVectorOfVec3r&
+SPHSimulationState::getPositions()
+{
+#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
+    LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
+#endif
+    return m_KinematicState->getPositions();
+}
+
+///
+/// \brief Returns the vector of all particle positions
+///
+const StdVectorOfVec3r&
+SPHSimulationState::getPositions() const
+{
+#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
+    LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
+#endif
+    return m_KinematicState->getPositions();
+}
+
+///
+/// \brief Returns the vector of all particle velocities
+///
+StdVectorOfVec3r&
+SPHSimulationState::getVelocities()
+{
+#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
+    LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
+#endif
+    return m_KinematicState->getVelocities();
+}
+
+///
+/// \brief Returns the vector of all particle velocities
+///
+const StdVectorOfVec3r&
+SPHSimulationState::getVelocities() const
+{
+#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
+    LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
+#endif
+    return m_KinematicState->getVelocities();
+}
 } // end namespace imstk
diff --git a/Source/DynamicalModels/ObjectStates/imstkSPHState.h b/Source/DynamicalModels/ObjectStates/imstkSPHState.h
index 486c5da615e891e8234a51192c2cfdf86f4e86f2..02cab0fe5fb9739322b90365222c3b742d994d65 100644
--- a/Source/DynamicalModels/ObjectStates/imstkSPHState.h
+++ b/Source/DynamicalModels/ObjectStates/imstkSPHState.h
@@ -21,11 +21,8 @@
 
 #pragma once
 
-#include <memory>
 #include "imstkMath.h"
 
-#include <g3log/g3log.hpp>
-
 namespace imstk
 {
 ///
@@ -107,64 +104,35 @@ public:
     void setBoundaryParticlePositions(const StdVectorOfVec3r& positions) { m_BDPositions = positions; }
 
     ///
-    /// \brief Initialize simulation variables, must be called after setKinematicState and (if applicable) after setBoundaryParticlePositions
+    /// \brief Initialize simulation variables, must be called after setKinematicState and (if applicable)
+    /// after setBoundaryParticlePositions
     ///
     void initializeData();
 
     ///
     /// \brief Get number of particles
     ///
-    size_t getNumParticles() const
-    {
-#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
-        LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
-#endif
-        return m_KinematicState->getNumParticles();
-    }
+    size_t getNumParticles() const;
 
     ///
     /// \brief Returns the vector of all particle positions
     ///
-    StdVectorOfVec3r& getPositions()
-    {
-#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
-        LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
-#endif
-        return m_KinematicState->getPositions();
-    }
+    StdVectorOfVec3r& getPositions();
 
     ///
     /// \brief Returns the vector of all particle positions
     ///
-    const StdVectorOfVec3r& getPositions() const
-    {
-#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
-        LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
-#endif
-        return m_KinematicState->getPositions();
-    }
+    const StdVectorOfVec3r& getPositions() const;
 
     ///
     /// \brief Returns the vector of all particle velocities
     ///
-    StdVectorOfVec3r& getVelocities()
-    {
-#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
-        LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
-#endif
-        return m_KinematicState->getVelocities();
-    }
+    StdVectorOfVec3r& getVelocities();
 
     ///
     /// \brief Returns the vector of all particle velocities
     ///
-    const StdVectorOfVec3r& getVelocities() const
-    {
-#if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG)
-        LOG_IF(FATAL, (!m_KinematicState)) << "Particle kinematic state has not been initialized";
-#endif
-        return m_KinematicState->getVelocities();
-    }
+    const StdVectorOfVec3r& getVelocities() const;
 
     ///
     /// \brief Returns the vector of all particle positions
diff --git a/Source/DynamicalModels/ObjectStates/imstkVectorizedState.h b/Source/DynamicalModels/ObjectStates/imstkVectorizedState.h
index 8380fc4cf7401731171adda03307a7450d54a3a0..524760a9e15189ce78ab89abc4b3fdf20f6409c0 100644
--- a/Source/DynamicalModels/ObjectStates/imstkVectorizedState.h
+++ b/Source/DynamicalModels/ObjectStates/imstkVectorizedState.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkMath.h"
 
 namespace imstk
diff --git a/Source/DynamicalModels/TimeIntegrators/imstkBackwardEuler.h b/Source/DynamicalModels/TimeIntegrators/imstkBackwardEuler.h
index b47ce161563f383147bcd8347013f7be204e1da2..29f1c4e57e490eef395dd5e6e33fb53e12668a8a 100644
--- a/Source/DynamicalModels/TimeIntegrators/imstkBackwardEuler.h
+++ b/Source/DynamicalModels/TimeIntegrators/imstkBackwardEuler.h
@@ -23,9 +23,6 @@
 
 #include "imstkTimeIntegrator.h"
 
-#include <array>
-#include "imstkLogger.h"
-
 namespace imstk
 {
 ///
diff --git a/Source/DynamicalModels/TimeIntegrators/imstkNewmarkBeta.h b/Source/DynamicalModels/TimeIntegrators/imstkNewmarkBeta.h
index 98288d09f526a1c0b0275907bdc1d8ad1c90dcec..15e97069ba3d4f26423bd746eb195148d6bea4f1 100644
--- a/Source/DynamicalModels/TimeIntegrators/imstkNewmarkBeta.h
+++ b/Source/DynamicalModels/TimeIntegrators/imstkNewmarkBeta.h
@@ -22,8 +22,6 @@
 #pragma once
 
 #include "imstkTimeIntegrator.h"
-
-#include <array>
 #include "imstkLogger.h"
 
 namespace imstk
diff --git a/Source/DynamicalModels/TimeIntegrators/imstkTimeIntegrator.h b/Source/DynamicalModels/TimeIntegrators/imstkTimeIntegrator.h
index 55caa21316b834acf0c5a54ff86fbd077f60478b..3a9a8ef67526315b20048967f2ad505d75f3525e 100644
--- a/Source/DynamicalModels/TimeIntegrators/imstkTimeIntegrator.h
+++ b/Source/DynamicalModels/TimeIntegrators/imstkTimeIntegrator.h
@@ -21,11 +21,6 @@
 
 #pragma once
 
-#include <array>
-#include "imstkLogger.h"
-
-#include "Eigen/Sparse"
-
 #include "imstkVectorizedState.h"
 
 namespace imstk
diff --git a/Source/Geometry/Analytic/imstkAnalyticalGeometry.cpp b/Source/Geometry/Analytic/imstkAnalyticalGeometry.cpp
index 9e7f4cb16b79370157c35204ae9ae6d0d964a3f3..b0fbb0da50ca990cd1044b886c31ff1db9151b9d 100644
--- a/Source/Geometry/Analytic/imstkAnalyticalGeometry.cpp
+++ b/Source/Geometry/Analytic/imstkAnalyticalGeometry.cpp
@@ -20,10 +20,16 @@
 =========================================================================*/
 
 #include "imstkAnalyticalGeometry.h"
+#include "imstkMath.h"
 #include "imstkLogger.h"
 
 namespace imstk
 {
+AnalyticalGeometry::AnalyticalGeometry(Type type, const std::string& name) : Geometry(type, name),
+    m_position(WORLD_ORIGIN), m_positionPostTransform(WORLD_ORIGIN), m_orientationAxis(UP_VECTOR), m_orientationAxisPostTransform(UP_VECTOR)
+{
+}
+
 void
 AnalyticalGeometry::print() const
 {
diff --git a/Source/Geometry/Analytic/imstkAnalyticalGeometry.h b/Source/Geometry/Analytic/imstkAnalyticalGeometry.h
index a8da2462ace88c46a19356fbddd0d2d78acb253d..d129df16332a7d1b02c4267c9713777fcda5157d 100644
--- a/Source/Geometry/Analytic/imstkAnalyticalGeometry.h
+++ b/Source/Geometry/Analytic/imstkAnalyticalGeometry.h
@@ -22,7 +22,6 @@
 #pragma once
 
 #include "imstkGeometry.h"
-#include "imstkMath.h"
 
 namespace imstk
 {
@@ -57,16 +56,16 @@ public:
 
 protected:
 
-    explicit AnalyticalGeometry(Type type, const std::string& name = std::string("")) : Geometry(type, name) {}
+    explicit AnalyticalGeometry(Type type, const std::string& name = std::string(""));
 
     void applyTranslation(const Vec3d t) override;
     void applyRotation(const Mat3d r) override;
     virtual void updatePostTransformData() const override;
 
-    Vec3d m_position = WORLD_ORIGIN;                          ///> position
-    mutable Vec3d m_positionPostTransform = WORLD_ORIGIN;     ///> position once transform applied
+    Vec3d m_position;                             ///> position
+    mutable Vec3d m_positionPostTransform;        ///> position once transform applied
 
-    Vec3d m_orientationAxis = UP_VECTOR;                      ///> orientation
-    mutable Vec3d m_orientationAxisPostTransform = UP_VECTOR; ///> orientation once transform applied
+    Vec3d m_orientationAxis;                      ///> orientation
+    mutable Vec3d m_orientationAxisPostTransform; ///> orientation once transform applied
 };
 } //imstk
diff --git a/Source/Geometry/Map/imstkGeometryMap.cpp b/Source/Geometry/Map/imstkGeometryMap.cpp
index 8f01b6e6b6709e75f06ac4067e4f8b1a30238786..aafb0af64e2019dd083846dc73cc97ad008909e3 100644
--- a/Source/Geometry/Map/imstkGeometryMap.cpp
+++ b/Source/Geometry/Map/imstkGeometryMap.cpp
@@ -99,4 +99,12 @@ GeometryMap::getSlave() const
 {
     return m_slave;
 }
+
+void
+GeometryMap::initialize()
+{
+    CHECK(this->isValid()) << "Map is invalid!";
+
+    this->compute();
+}
 } // imstk
diff --git a/Source/Geometry/Map/imstkGeometryMap.h b/Source/Geometry/Map/imstkGeometryMap.h
index 8f50efcc6866db35ec2e25ac56bd6006e4a0b1f8..19df6de82308c09548fa30bfabc31a3a83ba0981 100644
--- a/Source/Geometry/Map/imstkGeometryMap.h
+++ b/Source/Geometry/Map/imstkGeometryMap.h
@@ -22,7 +22,6 @@
 #pragma once
 
 #include "imstkGeometry.h"
-#include "imstkLogger.h"
 
 namespace imstk
 {
@@ -119,12 +118,7 @@ public:
     ///
     /// \brief Initialize the map
     ///
-    virtual void initialize()
-    {
-        LOG_IF(FATAL, (!this->isValid())) << "Map is invalid!";
-
-        this->compute();
-    }
+    virtual void initialize();
 
 protected:
 
@@ -138,7 +132,9 @@ protected:
     ///
     GeometryMap(const std::shared_ptr<Geometry> master,
                 const std::shared_ptr<Geometry> slave,
-                Type                            type) : m_type(type), m_isActive(true)
+                Type                            type) :
+        m_type(type),
+        m_isActive(true)
     {
         this->setMaster(master);
         this->setSlave(slave);
diff --git a/Source/Geometry/Map/imstkOneToOneMap.h b/Source/Geometry/Map/imstkOneToOneMap.h
index c79d0df63fd89f56b48f4744a75f6e974018b170..fbbb82fda3d0296672728dd7138b2f353a41da06 100644
--- a/Source/Geometry/Map/imstkOneToOneMap.h
+++ b/Source/Geometry/Map/imstkOneToOneMap.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <limits>
-
 // imstk
 #include "imstkGeometryMap.h"
 
diff --git a/Source/Geometry/Mesh/imstkHexahedralMesh.cpp b/Source/Geometry/Mesh/imstkHexahedralMesh.cpp
index 336a89f59aa2a3bb0068340b021b710b7344b4e3..42666b8e3a18d11e4bad6afebf2aabc15fa773ab 100644
--- a/Source/Geometry/Mesh/imstkHexahedralMesh.cpp
+++ b/Source/Geometry/Mesh/imstkHexahedralMesh.cpp
@@ -20,8 +20,11 @@
 =========================================================================*/
 
 #include "imstkHexahedralMesh.h"
+#include "imstkSurfaceMesh.h"
 #include "imstkLogger.h"
 
+#include <array>
+
 namespace imstk
 {
 void
diff --git a/Source/Geometry/Mesh/imstkLineMesh.cpp b/Source/Geometry/Mesh/imstkLineMesh.cpp
index 11d574ba48067777086c0aa133f73c2f587d0014..0ab7c7b683094b55a86e778c30173c74318ba3f2 100644
--- a/Source/Geometry/Mesh/imstkLineMesh.cpp
+++ b/Source/Geometry/Mesh/imstkLineMesh.cpp
@@ -21,6 +21,7 @@
 
 #include "imstkLineMesh.h"
 #include "imstkLogger.h"
+#include "imstkColor.h"
 
 namespace imstk
 {
diff --git a/Source/Geometry/Mesh/imstkLineMesh.h b/Source/Geometry/Mesh/imstkLineMesh.h
index 9420814dbb8f5f03dfe38c7b5c55abc80c3edf9b..905fc6cc0d483bae462da2f0888b4b8f67a67c1b 100644
--- a/Source/Geometry/Mesh/imstkLineMesh.h
+++ b/Source/Geometry/Mesh/imstkLineMesh.h
@@ -21,14 +21,14 @@
 
 #pragma once
 
-#include <memory>
 #include <array>
 
 #include "imstkPointSet.h"
-#include "imstkColor.h"
 
 namespace imstk
 {
+struct Color;
+
 ///
 /// \class LineMesh
 ///
diff --git a/Source/Geometry/Mesh/imstkSurfaceMesh.h b/Source/Geometry/Mesh/imstkSurfaceMesh.h
index a21e1646ea03fe2b71b88aa30fd5b370c0f75ba3..1c938d9922ba370d032fc5f3777b54411dd9a5a2 100644
--- a/Source/Geometry/Mesh/imstkSurfaceMesh.h
+++ b/Source/Geometry/Mesh/imstkSurfaceMesh.h
@@ -23,10 +23,7 @@
 
 // std library
 #include <array>
-#include <list>
 #include <set>
-#include <unordered_set>
-#include <memory>
 
 // imstk
 #include "imstkPointSet.h"
diff --git a/Source/Geometry/Mesh/imstkVolumetricMesh.cpp b/Source/Geometry/Mesh/imstkVolumetricMesh.cpp
index 163a29305ec95a0533992378bd313a2c08c1d339..ef3325f79084cf4076626fedea35dc7aa0f0d28e 100644
--- a/Source/Geometry/Mesh/imstkVolumetricMesh.cpp
+++ b/Source/Geometry/Mesh/imstkVolumetricMesh.cpp
@@ -20,8 +20,15 @@
 =========================================================================*/
 
 #include "imstkVolumetricMesh.h"
+#include "imstkSurfaceMesh.h"
 #include "imstkLogger.h"
 
+#pragma warning( push )
+#pragma warning( disable : 4458 )
+// Vega
+#include "volumetricMesh.h"
+#pragma warning( pop )
+
 namespace imstk
 {
 std::shared_ptr<SurfaceMesh>
diff --git a/Source/Geometry/Mesh/imstkVolumetricMesh.h b/Source/Geometry/Mesh/imstkVolumetricMesh.h
index dacee1fa664b0a8e3968c09a71e42056dd71a2dc..6b383f7cf1d8d49cd6fe69519998079c1f8cdda6 100644
--- a/Source/Geometry/Mesh/imstkVolumetricMesh.h
+++ b/Source/Geometry/Mesh/imstkVolumetricMesh.h
@@ -21,19 +21,13 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkPointSet.h"
-#include "imstkSurfaceMesh.h"
 
-#pragma warning( push )
-#pragma warning( disable : 4458 )
-// Vega
-#include "volumetricMesh.h"
-#pragma warning( pop )
+#include <memory>
 
 namespace imstk
 {
+class SurfaceMesh;
 ///
 /// \class VolumetricMesh
 ///
diff --git a/Source/Geometry/Particles/imstkRenderParticles.cpp b/Source/Geometry/Particles/imstkRenderParticles.cpp
index 94943afe5f3006b33172e760b728c823a0c8e6b9..44940b52bbbe5aed0349a1b7f2e240b6151ec96d 100644
--- a/Source/Geometry/Particles/imstkRenderParticles.cpp
+++ b/Source/Geometry/Particles/imstkRenderParticles.cpp
@@ -91,4 +91,22 @@ RenderParticles::getMaxNumParticles()
 {
     return m_maxNumParticles;
 }
+
+void
+RenderParticles::applyTranslation(const Vec3d t)
+{
+    LOG(WARNING) << "applyTranslation Not implemented!";
+}
+
+void
+RenderParticles::applyRotation(const Mat3d r)
+{
+    LOG(WARNING) << "applyRotation Not implemented!";
+}
+
+void
+RenderParticles::applyScaling(const double s)
+{
+    LOG(WARNING) << "applyScaling Not implemented!";
+}
 }
diff --git a/Source/Geometry/Particles/imstkRenderParticles.h b/Source/Geometry/Particles/imstkRenderParticles.h
index a74b91a8075a165125d63ecc441650a44b296770..3239da80f7d680fda415cc2e831c403f32451afe 100644
--- a/Source/Geometry/Particles/imstkRenderParticles.h
+++ b/Source/Geometry/Particles/imstkRenderParticles.h
@@ -28,7 +28,6 @@
 
 #include "imstkGeometry.h"
 #include "imstkMath.h"
-#include "imstkLogger.h"
 #include "imstkColor.h"
 
 namespace imstk
@@ -125,9 +124,9 @@ protected:
 
 #pragma warning( push )
 #pragma warning( disable : 4100 )
-    void applyTranslation(const Vec3d t) override { LOG(WARNING) << "applyTranslation Not implemented!"; }
-    void applyRotation(const Mat3d r) override { LOG(WARNING) << "applyRotation Not implemented!"; }
-    void applyScaling(const double s) override { LOG(WARNING) << "applyScaling Not implemented!"; }
+    void applyTranslation(const Vec3d t) override;
+    void applyRotation(const Mat3d r) override;
+    void applyScaling(const double s) override;
 #pragma warning( pop )
 
     virtual void updatePostTransformData() const override {}
diff --git a/Source/Geometry/Reader/imstkMSHMeshIO.cpp b/Source/Geometry/Reader/imstkMSHMeshIO.cpp
index 570481aff9420730be1cb63360bf0900394dd9c1..aaa879f956e8c18d51db46fcf617b3481a365d0a 100644
--- a/Source/Geometry/Reader/imstkMSHMeshIO.cpp
+++ b/Source/Geometry/Reader/imstkMSHMeshIO.cpp
@@ -22,6 +22,7 @@
 #include <fstream>
 #include <iostream>
 #include <algorithm>
+#include <array>
 
 #include "imstkMSHMeshIO.h"
 #include "imstkTetrahedralMesh.h"
diff --git a/Source/Geometry/Reader/imstkMeshIO.cpp b/Source/Geometry/Reader/imstkMeshIO.cpp
index cc5c206f52b4af867514494ce08a623674348cef..aad6421d3bde995f97b2fa9e62fa0bf4713db17e 100644
--- a/Source/Geometry/Reader/imstkMeshIO.cpp
+++ b/Source/Geometry/Reader/imstkMeshIO.cpp
@@ -26,6 +26,7 @@
 #include "imstkAssimpMeshIO.h"
 #include "imstkVegaMeshIO.h"
 #include "imstkMSHMeshIO.h"
+#include "imstkColor.h"
 
 #include "imstkSurfaceMesh.h"
 #include "imstkLineMesh.h"
diff --git a/Source/Geometry/Reader/imstkVTKMeshIO.cpp b/Source/Geometry/Reader/imstkVTKMeshIO.cpp
index 99d0f97eed3031b7b00dd85dbf74e2ab21d7f7b3..c0e7dcdad704a2691468db76e48291c45933bcfa 100644
--- a/Source/Geometry/Reader/imstkVTKMeshIO.cpp
+++ b/Source/Geometry/Reader/imstkVTKMeshIO.cpp
@@ -45,6 +45,7 @@
 #include "imstkTetrahedralMesh.h"
 #include "imstkHexahedralMesh.h"
 
+#include "imstkColor.h"
 #include "imstkLogger.h"
 
 namespace imstk
diff --git a/Source/Geometry/Reader/imstkVegaMeshIO.cpp b/Source/Geometry/Reader/imstkVegaMeshIO.cpp
index 86798a80e14c089a312a602674b84fa77bea93ed..e32252024e31e184b8944b882c9a6e900e0774a8 100644
--- a/Source/Geometry/Reader/imstkVegaMeshIO.cpp
+++ b/Source/Geometry/Reader/imstkVegaMeshIO.cpp
@@ -33,6 +33,8 @@
 
 #include "tetMesh.h"
 
+#include <array>
+
 namespace imstk
 {
 std::shared_ptr<VolumetricMesh>
diff --git a/Source/Geometry/imstkGeometry.cpp b/Source/Geometry/imstkGeometry.cpp
index e71c929c0c996d770d095cee6239580a14065d55..53839d11f48a63fb82187a0724aec7457398c0de 100644
--- a/Source/Geometry/imstkGeometry.cpp
+++ b/Source/Geometry/imstkGeometry.cpp
@@ -26,7 +26,7 @@
 namespace imstk
 {
 Geometry::Geometry(const Geometry::Type type, const std::string& name) :
-    m_type(type), m_name(name), m_geometryIndex(Geometry::getUniqueID())
+    m_type(type), m_name(name), m_geometryIndex(Geometry::getUniqueID()), m_transform(RigidTransform3d::Identity())
 {
     // If the geometry name is empty, enumerate it by name (which will not be duplicated)
     if (m_name.empty())
diff --git a/Source/Geometry/imstkGeometry.h b/Source/Geometry/imstkGeometry.h
index 545e713eca74fbf3b6fd4f71ef21a9861ff7ed45..6f732798dba32923c0240fc0178c1503a303c215 100644
--- a/Source/Geometry/imstkGeometry.h
+++ b/Source/Geometry/imstkGeometry.h
@@ -22,11 +22,15 @@
 #pragma once
 
 #include "imstkMath.h"
-#include "tbb/tbb.h"
+
+#include <tbb\concurrent_unordered_set.h>
 
 namespace imstk
 {
-namespace ParallelUtils { class SpinLock; }
+namespace ParallelUtils
+{
+class SpinLock;
+}
 
 ///
 /// \class Geometry
@@ -213,7 +217,7 @@ protected:
     bool m_transformModified = false;
     mutable bool m_transformApplied = true;
 
-    RigidTransform3d m_transform = RigidTransform3d::Identity(); ///> Transformation matrix
+    RigidTransform3d m_transform; ///> Transformation matrix
     double m_scaling = 1.0;
 };
 } //imstk
diff --git a/Source/Geometry/imstkGeometryUtilities.cpp b/Source/Geometry/imstkGeometryUtilities.cpp
index d93a54e09709dc68e30f794926c233707aa35c30..f33ae2b5a1e624097782300cf764e6b2fd73f983 100644
--- a/Source/Geometry/imstkGeometryUtilities.cpp
+++ b/Source/Geometry/imstkGeometryUtilities.cpp
@@ -25,6 +25,8 @@
 #include "imstkPointSet.h"
 #include "imstkSurfaceMesh.h"
 #include "imstkTetrahedralMesh.h"
+#include "imstkColor.h"
+
 #include <vtkAppendPolyData.h>
 #include <vtkCleanPolyData.h>
 #include <vtkDataSet.h>
diff --git a/Source/Rendering/Materials/imstkRenderMaterial.h b/Source/Rendering/Materials/imstkRenderMaterial.h
index e58b07e4d2c4a213c2aa7cefc6ed5d7f3bc17c65..a94d147e351f4878cbe15d26be0e277f664d4571 100644
--- a/Source/Rendering/Materials/imstkRenderMaterial.h
+++ b/Source/Rendering/Materials/imstkRenderMaterial.h
@@ -24,9 +24,6 @@
 #include "imstkColor.h"
 #include "imstkTextureManager.h"
 
-#include <memory>
-#include <vector>
-
 namespace imstk
 {
 class Texture;
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCapsuleRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCapsuleRenderDelegate.cpp
index 9fe8c2eee9020782e5f930ecc29a374b7f8b0c2d..adf5568b19d1764b67a632e9497ad87678fb958f 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCapsuleRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCapsuleRenderDelegate.cpp
@@ -20,8 +20,10 @@
 =========================================================================*/
 
 #include "imstkVTKCapsuleRenderDelegate.h"
+#include "imstkCapsule.h"
 
-#include "vtkCapsuleSource.h"
+#include <vtkTransformPolyDataFilter.h>
+#include <vtkCapsuleSource.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCapsuleRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCapsuleRenderDelegate.h
index 0ab268328c317db11d2c2fdc53a7bd15a94e8bac..009c6448bf7e930c55737a4b6f0236687afa024f 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCapsuleRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCapsuleRenderDelegate.h
@@ -21,12 +21,9 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
-#include "imstkCapsule.h"
 
-#include "vtkTransformPolyDataFilter.h"
+class vtkTransformPolyDataFilter;
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCubeRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCubeRenderDelegate.cpp
index e1c2e0981ad074f0da835ade2be5f3f8172f903d..3438fd138d5ad0991baaf527b5c2c42f4b275a6a 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCubeRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCubeRenderDelegate.cpp
@@ -20,7 +20,9 @@
 =========================================================================*/
 
 #include "imstkVTKCubeRenderDelegate.h"
+#include "imstkCube.h"
 
+#include "vtkTransformPolyDataFilter.h"
 #include "vtkCubeSource.h"
 
 namespace imstk
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCubeRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCubeRenderDelegate.h
index 5a4ea230588835786ccca05b16d74d23aec78c5a..d298ed443e303c9cee859bf1b7728c929f4542fb 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCubeRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCubeRenderDelegate.h
@@ -21,12 +21,9 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
-#include "imstkCube.h"
 
-#include "vtkTransformPolyDataFilter.h"
+class vtkTransformPolyDataFilter;
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCylinderRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCylinderRenderDelegate.cpp
index 4947eeee17582d1e307e543ea5cf7e6cd2f69386..11181f643867161e7713c0e2bcff197d20b9c2ef 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCylinderRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCylinderRenderDelegate.cpp
@@ -20,6 +20,10 @@
 =========================================================================*/
 
 #include "imstkVTKCylinderRenderDelegate.h"
+#include "imstkCylinder.h"
+
+#include <vtkTransformPolyDataFilter.h>
+#include <vtkCylinderSource.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCylinderRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCylinderRenderDelegate.h
index 22a7ca5ae50a055278bbb76d3476a0d8c5083ba6..c5d582ffc960a1209a5489cd5116b5d67e7844f6 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCylinderRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKCylinderRenderDelegate.h
@@ -21,14 +21,11 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
-#include "imstkCylinder.h"
 
-#include "vtkTransformPolyDataFilter.h"
+class vtkTransformPolyDataFilter;
+class vtkCylinderSource;
 
-#include "vtkCylinderSource.h"
 namespace imstk
 {
 ///
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKHexahedralMeshRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKHexahedralMeshRenderDelegate.cpp
index c84a7e9e2d9fab47e31e80682d2fdb102bf53c1c..2f8b69cdd1d5b60bd04641455fca7f8288d20700 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKHexahedralMeshRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKHexahedralMeshRenderDelegate.cpp
@@ -20,15 +20,16 @@
 =========================================================================*/
 
 #include "imstkVTKHexahedralMeshRenderDelegate.h"
-
 #include "imstkHexahedralMesh.h"
 
 #include <vtkUnstructuredGrid.h>
 #include <vtkDataSetMapper.h>
-#include <vtkPoints.h>
 #include <vtkDoubleArray.h>
 #include <vtkCellArray.h>
 #include <vtkProperty.h>
+#include <vtkPoints.h>
+
+#include <array>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKHexahedralMeshRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKHexahedralMeshRenderDelegate.h
index 6082fd0b056893256e1388554b915c89cc56b191..03ca039dced22adbefd822f283c7e7b37f460832 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKHexahedralMeshRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKHexahedralMeshRenderDelegate.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
 
 class vtkDoubleArray;
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKImageDataRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKImageDataRenderDelegate.cpp
index 58f8877a0a94d92eddfb28117d4709ca82e4db7c..58e753aeace62382aee020ce3e6bc46dd4cfde66 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKImageDataRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKImageDataRenderDelegate.cpp
@@ -20,13 +20,14 @@
 =========================================================================*/
 
 #include "imstkVTKImageDataRenderDelegate.h"
-
-#include "vtkTrivialProducer.h"
-#include "vtkVolumeProperty.h"
-#include "vtkColorTransferFunction.h"
-#include "vtkPiecewiseFunction.h"
-#include "vtkGPUVolumeRayCastMapper.h"
-#include "vtkImageData.h"
+#include "imstkImageData.h"
+
+#include <vtkGPUVolumeRayCastMapper.h>
+#include <vtkColorTransferFunction.h>
+#include <vtkPiecewiseFunction.h>
+#include <vtkTrivialProducer.h>
+#include <vtkVolumeProperty.h>
+#include <vtkImageData.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKImageDataRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKImageDataRenderDelegate.h
index 0dd71a964f8faa47564abf5682472937e2af710e..f13957ce7366033dfc001dd81c97c75ea6e85860 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKImageDataRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKImageDataRenderDelegate.h
@@ -22,10 +22,11 @@
 #pragma once
 
 #include "imstkVTKRenderDelegate.h"
-#include "imstkImageData.h"
 
 namespace imstk
 {
+class ImageData;
+
 ///
 /// \class ImageDataRenderDelegate
 ///
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKLineMeshRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKLineMeshRenderDelegate.cpp
index a4755cfe3bff20581c19da6099dbf212ea0e499e..3aadee943259637fd06e8302f04a702b2cd0ace9 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKLineMeshRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKLineMeshRenderDelegate.cpp
@@ -20,17 +20,18 @@
 =========================================================================*/
 
 #include "imstkVTKLineMeshRenderDelegate.h"
-
 #include "imstkLineMesh.h"
 
-#include <vtkLineSource.h>
+#include <vtkUnsignedCharArray.h>
+#include <vtkTrivialProducer.h>
 #include <vtkPolyDataMapper.h>
-#include <vtkPoints.h>
 #include <vtkDoubleArray.h>
 #include <vtkFloatArray.h>
+#include <vtkLineSource.h>
+#include <vtkPointData.h>
+#include <vtkPolyData.h>
+#include <vtkPoints.h>
 #include <vtkLine.h>
-#include <vtkTrivialProducer.h>
-#include <vtkUnsignedCharArray.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKLineMeshRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKLineMeshRenderDelegate.h
index a09b2d1fb633d1656bb3d11047752df9f921139f..6a40a0b4244344451eea3532c5ae65b3c3c2a3ce 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKLineMeshRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKLineMeshRenderDelegate.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
 
 class vtkDoubleArray;
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPlaneRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPlaneRenderDelegate.cpp
index d1177c75ff4aab6d30ee0219f5385b09c2716a0f..20ab1b0d839050a13f725a65a33c06fcb1e95f89 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPlaneRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPlaneRenderDelegate.cpp
@@ -20,8 +20,10 @@
 =========================================================================*/
 
 #include "imstkVTKPlaneRenderDelegate.h"
+#include "imstkPlane.h"
 
-#include "vtkPlaneSource.h"
+#include <vtkTransformPolyDataFilter.h>
+#include <vtkPlaneSource.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPlaneRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPlaneRenderDelegate.h
index 7afc394db02d7ecf571040ec5d4c71806d35ff9f..230bbb4b819e552ef96e7aaa78adcae36408abba 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPlaneRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPlaneRenderDelegate.h
@@ -21,15 +21,14 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
-#include "imstkPlane.h"
 
-#include "vtkTransformPolyDataFilter.h"
+class vtkTransformPolyDataFilter;
 
 namespace imstk
 {
+class Plane;
+
 ///
 /// \class PlaneRenderDelegate
 ///
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPointSetRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPointSetRenderDelegate.cpp
index e884e8b7d9165468b6367cfdd1572770a3f9db5c..7e8b09dde339bd0f0c271b63ed856f53551f190f 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPointSetRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPointSetRenderDelegate.cpp
@@ -22,10 +22,10 @@
 #include "imstkVTKPointSetRenderDelegate.h"
 #include "imstkPointSet.h"
 
-#include <vtkTrivialProducer.h>
-#include <vtkDoubleArray.h>
 #include <vtkVertexGlyphFilter.h>
+#include <vtkTrivialProducer.h>
 #include <vtkSphereSource.h>
+#include <vtkDoubleArray.h>
 #include <vtkGlyph3D.h>
 #include <vtkVersion.h>
 
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPointSetRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPointSetRenderDelegate.h
index b3f118cabf9f5fb3bde71d7d41b3c611ba07b06a..fb69387eb09561b4538a75707ed4e0720590a03d 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPointSetRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKPointSetRenderDelegate.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
 
 class vtkDoubleArray;
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKRenderDelegate.h
index 8886bc23c8adad30f0a895bac7e6e70de4e73313..4fed20cc4014ee08f535afa542eaa5e79b3d3fca 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKRenderDelegate.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkGeometry.h"
 #include "imstkRenderMaterial.h"
 #include "imstkVTKTextureDelegate.h"
@@ -31,14 +29,14 @@
 #include "imstkDebugRenderGeometry.h"
 #include "imstkVisualModel.h"
 
-#include "vtkSmartPointer.h"
-#include "vtkAlgorithmOutput.h"
-#include "vtkActor.h"
-#include "vtkPolyDataMapper.h"
-#include "vtkTransform.h"
-#include "vtkProperty.h"
-#include "vtkGPUVolumeRayCastMapper.h"
-#include "vtkVolume.h"
+#include <vtkSmartPointer.h>
+#include <vtkAlgorithmOutput.h>
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkTransform.h>
+#include <vtkProperty.h>
+#include <vtkGPUVolumeRayCastMapper.h>
+#include <vtkVolume.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSphereRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSphereRenderDelegate.cpp
index f893264eb3bdef81f5993653395eb4698a7c6404..33bbd38599d0490c28ff5f5cc8fc9570e0028e73 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSphereRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSphereRenderDelegate.cpp
@@ -20,8 +20,10 @@
 =========================================================================*/
 
 #include "imstkVTKSphereRenderDelegate.h"
+#include "imstkSphere.h"
 
-#include "vtkSphereSource.h"
+#include <vtkTransformPolyDataFilter.h>
+#include <vtkSphereSource.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSphereRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSphereRenderDelegate.h
index ef63b0cd7145dda9f6f735e9f0291c81df8bc181..01c54a121307cbb934e0e668969d0395b987e97e 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSphereRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSphereRenderDelegate.h
@@ -21,15 +21,13 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
-#include "imstkSphere.h"
 
-#include "vtkTransformPolyDataFilter.h"
+class vtkTransformPolyDataFilter;
 
 namespace imstk
 {
+class VisualModel;
 ///
 /// \class SphereRenderDelegate
 ///
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSurfaceMeshRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSurfaceMeshRenderDelegate.cpp
index 26886ede475b4e801585d11abb93be5846999dac..0ee4930d5a89b5006e522e19393f94e78e40eea2 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSurfaceMeshRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSurfaceMeshRenderDelegate.cpp
@@ -20,7 +20,8 @@
 =========================================================================*/
 
 #include "imstkVTKSurfaceMeshRenderDelegate.h"
-
+#include "imstkVTKTextureDelegate.h"
+#include "imstkTextureManager.h"
 #include "imstkSurfaceMesh.h"
 
 #include <vtkPolyData.h>
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSurfaceMeshRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSurfaceMeshRenderDelegate.h
index cfc97b20657186394ccd2f3d146e86e57158bf7c..3eb459c6a4a94151e8e7b023ddd3f4654bf19006 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSurfaceMeshRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKSurfaceMeshRenderDelegate.h
@@ -21,11 +21,7 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
-#include "imstkVTKTextureDelegate.h"
-#include "imstkTextureManager.h"
 
 class vtkDoubleArray;
 
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKTetrahedralMeshRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKTetrahedralMeshRenderDelegate.cpp
index 2f77c9f929c6dbd45904ff032417b41f22ff7c2f..82ea6aeeef273082a789cf7b3ff3fcb301378099 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKTetrahedralMeshRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKTetrahedralMeshRenderDelegate.cpp
@@ -20,20 +20,21 @@
 =========================================================================*/
 
 #include "imstkVTKTetrahedralMeshRenderDelegate.h"
-
 #include "imstkTetrahedralMesh.h"
 
 #include <vtkUnstructuredGrid.h>
 #include <vtkDataSetMapper.h>
-#include <vtkPoints.h>
 #include <vtkDoubleArray.h>
+#include <vtkFloatArray.h>
 #include <vtkCellArray.h>
+#include <vtkPointData.h>
 #include <vtkProperty.h>
 #include <vtkPolyData.h>
-#include <vtkPointData.h>
-#include <vtkFloatArray.h>
+#include <vtkPoints.h>
 #include <vtkNew.h>
 
+#include <array>
+
 namespace imstk
 {
 VTKTetrahedralMeshRenderDelegate::VTKTetrahedralMeshRenderDelegate(std::shared_ptr<VisualModel> visualModel) :
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKTetrahedralMeshRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKTetrahedralMeshRenderDelegate.h
index 4916f04a71dc08e854a07891a6f7872caf33b0c3..a11969e8715c4284ef91e920213d19f4cf745d3d 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKTetrahedralMeshRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKTetrahedralMeshRenderDelegate.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
 
 class vtkDoubleArray;
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugLinesRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugLinesRenderDelegate.cpp
index b3326aea9dd245a5731143f1443cfcbb97018d11..4053ff133fd2f7694289b7a1fd8ea9e625932a91 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugLinesRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugLinesRenderDelegate.cpp
@@ -22,16 +22,16 @@
 #include "imstkVTKdebugLinesRenderDelegate.h"
 #include "imstkSurfaceMesh.h"
 
-#include <vtkPolyData.h>
+#include <vtkOpenGLPolyDataMapper.h>
+#include <vtkTrivialProducer.h>
 #include <vtkPolyDataMapper.h>
-#include <vtkPoints.h>
 #include <vtkDoubleArray.h>
-#include <vtkCellArray.h>
 #include <vtkFloatArray.h>
+#include <vtkCellArray.h>
 #include <vtkPointData.h>
+#include <vtkPolyData.h>
 #include <vtkProperty.h>
-#include <vtkOpenGLPolyDataMapper.h>
-#include <vtkTrivialProducer.h>
+#include <vtkPoints.h>
 #include <vtkLine.h>
 
 namespace imstk
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugLinesRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugLinesRenderDelegate.h
index bedd7344b12231a86869e23cfe88cdefc6013e49..2724a83fd7cc15ccd745ef527600f7e64d25bf50 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugLinesRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugLinesRenderDelegate.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
 
 class vtkDoubleArray;
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugPointsRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugPointsRenderDelegate.cpp
index ccbc293927767b3f342807a8f9a48c61629a7597..8d9a73b246c871adcfa578ddc7bc271bc85e5df8 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugPointsRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugPointsRenderDelegate.cpp
@@ -20,22 +20,21 @@
 =========================================================================*/
 
 #include "imstkVTKdebugPointsRenderDelegate.h"
-
 #include "imstkSurfaceMesh.h"
 
-#include <vtkPolyData.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkPoints.h>
+#include <vtkOpenGLPolyDataMapper.h>
 #include <vtkTrivialProducer.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkSphereSource.h>
 #include <vtkDoubleArray.h>
-#include <vtkCellArray.h>
 #include <vtkFloatArray.h>
+#include <vtkCellArray.h>
 #include <vtkPointData.h>
+#include <vtkPolyData.h>
 #include <vtkPolyLine.h>
 #include <vtkProperty.h>
-#include <vtkSphereSource.h>
 #include <vtkGlyph3D.h>
-#include <vtkOpenGLPolyDataMapper.h>
+#include <vtkPoints.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugPointsRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugPointsRenderDelegate.h
index 7aef38f53e3974e50f83562c91fa4f0b1996e356..95925193b47eb5198d1fa4a1b0fce7d5a49f5834 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugPointsRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugPointsRenderDelegate.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
 
 class vtkDoubleArray;
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugTrianglesRenderDelegate.cpp b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugTrianglesRenderDelegate.cpp
index 1af58f53c91d36465ce99448e8f3c8bf154900e1..000c2db02b0558621eb071485d33d46c8fce6474 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugTrianglesRenderDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugTrianglesRenderDelegate.cpp
@@ -21,14 +21,14 @@
 
 #include "imstkVTKdebugTrianglesRenderDelegate.h"
 
-#include <vtkPolyData.h>
+#include <vtkTrivialProducer.h>
 #include <vtkPolyDataMapper.h>
 #include <vtkDoubleArray.h>
-#include <vtkCellArray.h>
 #include <vtkFloatArray.h>
+#include <vtkCellArray.h>
 #include <vtkPointData.h>
+#include <vtkPolyData.h>
 #include <vtkProperty.h>
-#include <vtkTrivialProducer.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugTrianglesRenderDelegate.h b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugTrianglesRenderDelegate.h
index f1b045fe0b477eaea61315a0cd103790e4351d45..3e856dccdb533df2011854db9f8906df9fcaca14 100644
--- a/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugTrianglesRenderDelegate.h
+++ b/Source/Rendering/VTKRenderer/RenderDelegate/imstkVTKdebugTrianglesRenderDelegate.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 #include "imstkVTKRenderDelegate.h"
 
 class vtkDoubleArray;
diff --git a/Source/Rendering/VTKRenderer/imstkVTKCustomPolyDataMapper.cpp b/Source/Rendering/VTKRenderer/imstkVTKCustomPolyDataMapper.cpp
index b6b1b838d0b37f96c88141246b502d3e4cbbc10a..47bda4b3bddbca577661dee8630a75041234af79 100644
--- a/Source/Rendering/VTKRenderer/imstkVTKCustomPolyDataMapper.cpp
+++ b/Source/Rendering/VTKRenderer/imstkVTKCustomPolyDataMapper.cpp
@@ -19,9 +19,37 @@
 
 =========================================================================*/
 
-#include "imstkVTKCustomPolyDataMapper.h"
+#include <fstream>
+#include <sstream>
 
-#include "vtkVersion.h"
+#include "imstkVTKCustomPolyDataMapper.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkGeometry.h"
+
+#include <vtkOpenGLVertexBufferObjectCache.h>
+#include <vtkOpenGLVertexBufferObjectGroup.h>
+#include <vtkOpenGLVertexBufferObject.h>
+#include <vtkOpenGLVertexArrayObject.h>
+#include <vtkOpenGLPolyDataMapper.h>
+#include <vtkOpenGLBufferObject.h>
+#include <vtkOpenGLRenderWindow.h>
+#include <vtkLightCollection.h>
+#include <vtkObjectFactory.h>
+#include <vtkShaderProgram.h>
+#include <vtkOpenGLTexture.h>
+#include <vtkRenderWindow.h>
+#include <vtkOpenGLCamera.h>
+#include <vtkOpenGLActor.h>
+#include <vtkOpenGLError.h>
+#include <vtkMatrix4x4.h>
+#include <vtkPointData.h>
+#include <vtkProperty.h>
+#include <vtkRenderer.h>
+#include <vtkPolyData.h>
+#include <vtkVersion.h>
+#include <vtkCamera.h>
+#include <vtkActor.h>
+#include <vtkLight.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/imstkVTKCustomPolyDataMapper.h b/Source/Rendering/VTKRenderer/imstkVTKCustomPolyDataMapper.h
index a5c9f3f10daf48858144efeff23e3f578426503d..858c94f8aa33f06fc7dc48650b2d778c95bb986c 100644
--- a/Source/Rendering/VTKRenderer/imstkVTKCustomPolyDataMapper.h
+++ b/Source/Rendering/VTKRenderer/imstkVTKCustomPolyDataMapper.h
@@ -21,36 +21,18 @@
 
 #pragma once
 
-#include <fstream>
-#include <sstream>
+#include "imstkRenderMaterial.h"
 
+#include "vtkSetGet.h"
 #include "vtkOpenGLPolyDataMapper.h"
-#include "vtkOpenGLBufferObject.h"
-#include "vtkObjectFactory.h"
-#include "vtkActor.h"
-#include "vtkProperty.h"
-#include "vtkOpenGLVertexArrayObject.h"
-#include "vtkOpenGLVertexBufferObject.h"
-#include "vtkOpenGLVertexBufferObjectCache.h"
-#include "vtkOpenGLVertexBufferObjectGroup.h"
-#include "vtkOpenGLRenderWindow.h"
-#include "vtkRenderWindow.h"
-#include "vtkShaderProgram.h"
-#include "vtkRenderer.h"
-#include "vtkCamera.h"
-#include "vtkMatrix4x4.h"
-#include "vtkOpenGLCamera.h"
-#include "vtkOpenGLActor.h"
-#include "vtkPolyData.h"
-#include "vtkPointData.h"
-#include "vtkLightCollection.h"
-#include "vtkLight.h"
-#include "vtkOpenGLTexture.h"
-#include "vtkOpenGLError.h"
-
-#include "imstkGeometry.h"
-#include "imstkSurfaceMesh.h"
-#include "imstkRenderMaterial.h"
+
+class vtkOpenGLPolyDataMapper;
+class vtkOpenGLBufferObject;
+class vtkOpenGLHelper;
+class vtkOpenGLHelper;
+class vtkRenderer;
+class vtkShader;
+class vtkActor;
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/imstkVTKRenderer.cpp b/Source/Rendering/VTKRenderer/imstkVTKRenderer.cpp
index 0c20aa9b893ef3f0fa78ad2b71fd10ec794edcdd..c90cb668e5f5c63600c5bee41da4abc1423efdfb 100644
--- a/Source/Rendering/VTKRenderer/imstkVTKRenderer.cpp
+++ b/Source/Rendering/VTKRenderer/imstkVTKRenderer.cpp
@@ -28,15 +28,18 @@
 #include "imstkVTKRenderDelegate.h"
 #include "imstkVTKSurfaceMeshRenderDelegate.h"
 #include "imstkLight.h"
-
-#include "vtkLightActor.h"
-#include "vtkCameraActor.h"
-#include "vtkAxesActor.h"
-#include "vtkCullerCollection.h"
-#include "vtkAxesActor.h"
-
 #include "imstkLogger.h"
 
+#include <vtkLightActor.h>
+#include <vtkCameraActor.h>
+#include <vtkAxesActor.h>
+#include <vtkCullerCollection.h>
+#include <vtkAxesActor.h>
+#include <vtkCamera.h>
+#include <vtkProp.h>
+#include <vtkLight.h>
+#include <vtkRenderer.h>
+
 namespace imstk
 {
 VTKRenderer::VTKRenderer(std::shared_ptr<Scene> scene, const bool enableVR) : m_scene(scene)
diff --git a/Source/Rendering/VTKRenderer/imstkVTKRenderer.h b/Source/Rendering/VTKRenderer/imstkVTKRenderer.h
index da45db103b25260055a524d1fff07f46bb924d1a..b93ad0af475d3dca505b94dbc5e3e20f454d12ca 100644
--- a/Source/Rendering/VTKRenderer/imstkVTKRenderer.h
+++ b/Source/Rendering/VTKRenderer/imstkVTKRenderer.h
@@ -21,30 +21,27 @@
 
 #pragma once
 
-#include <memory>
-#include <vector>
-
 #include "imstkMath.h"
 #include "imstkTextureManager.h"
 #include "imstkVTKTextureDelegate.h"
 #include "imstkRenderer.h"
 
-#include "vtkSmartPointer.h"
-#include "vtkRenderer.h"
-#include "vtkProp.h"
-#include "vtkCamera.h"
-#include "vtkLight.h"
+#include <vtkSmartPointer.h>
 
 #ifdef iMSTK_ENABLE_VR
-#include "vtkOpenVRRenderer.h"
-#include "vtkOpenVRCamera.h"
-#include "vtkOpenVRRenderWindow.h"
-#include "vtkOpenVRRenderWindowInteractor.h"
-#include "vtkInteractorStyle3D.h"
-#include "vtkOpenVROverlayInternal.h"
+#include <vtkOpenVRRenderer.h>
+#include <vtkOpenVRCamera.h>
+#include <vtkOpenVRRenderWindow.h>
+#include <vtkOpenVRRenderWindowInteractor.h>
+#include <vtkInteractorStyle3D.h>
+#include <vtkOpenVROverlayInternal.h>
 #endif
 
 class vtkAxesActor;
+class vtkCamera;
+class vtkProp;
+class vtkLight;
+class vtkRenderer;
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/imstkVTKTextureDelegate.cpp b/Source/Rendering/VTKRenderer/imstkVTKTextureDelegate.cpp
index 4690747903d163c2b353f82a6dc098640e43713d..6f2d1562e258cd523beaeeee0177d8a54c0f59b0 100644
--- a/Source/Rendering/VTKRenderer/imstkVTKTextureDelegate.cpp
+++ b/Source/Rendering/VTKRenderer/imstkVTKTextureDelegate.cpp
@@ -21,6 +21,14 @@
 
 #include "imstkVTKTextureDelegate.h"
 #include "imstkLogger.h"
+#include "imstkTexture.h"
+#include "imstkTextureDelegate.h"
+#include "imstkTextureManager.h"
+
+#include <vtkSmartPointer.h>
+#include <vtkImageReader2Factory.h>
+#include <vtkImageReader2.h>
+#include <vtkImageFlip.h>
 
 namespace imstk
 {
diff --git a/Source/Rendering/VTKRenderer/imstkVTKTextureDelegate.h b/Source/Rendering/VTKRenderer/imstkVTKTextureDelegate.h
index 329f9ea095e54d55cb26f5945e55a29861a11fb0..64509d28d6d13c71f7e32c870f52360727784a5c 100644
--- a/Source/Rendering/VTKRenderer/imstkVTKTextureDelegate.h
+++ b/Source/Rendering/VTKRenderer/imstkVTKTextureDelegate.h
@@ -21,18 +21,13 @@
 
 #pragma once
 
-#include "imstkTexture.h"
 #include "imstkTextureDelegate.h"
-#include "imstkTextureManager.h"
+
+//#include <string>
+//#include <memory>
 
 #include <vtkTexture.h>
 #include <vtkSmartPointer.h>
-#include <vtkImageReader2Factory.h>
-#include <vtkImageReader2.h>
-#include <vtkImageFlip.h>
-
-#include <string>
-#include <memory>
 
 namespace imstk
 {
diff --git a/Source/Rendering/imstkRenderer.h b/Source/Rendering/imstkRenderer.h
index 7340c2a6b4dc011c4816829d95ceee7192ddfbb9..60b913b2a5e870127380d4881983d3f9280d2656 100644
--- a/Source/Rendering/imstkRenderer.h
+++ b/Source/Rendering/imstkRenderer.h
@@ -23,8 +23,6 @@
 
 #include "imstkMath.h"
 
-#include <memory>
-
 namespace imstk
 {
 class Renderer
diff --git a/Source/Scene/SceneElements/Loader/imstkVisualObjectImporter.cpp b/Source/Scene/SceneElements/Loader/imstkVisualObjectImporter.cpp
index 0ed194502bf5878d3175f1cb88b54e4aa7f64692..3e138b610210623a8ee4770ec5c2505c62c26389 100644
--- a/Source/Scene/SceneElements/Loader/imstkVisualObjectImporter.cpp
+++ b/Source/Scene/SceneElements/Loader/imstkVisualObjectImporter.cpp
@@ -20,6 +20,7 @@
 =========================================================================*/
 
 #include "imstkVisualObjectImporter.h"
+#include "imstkRenderMaterial.h"
 
 #include "assimp/Importer.hpp"
 #include "assimp/mesh.h"
diff --git a/Source/Scene/SceneElements/Loader/imstkVisualObjectImporter.h b/Source/Scene/SceneElements/Loader/imstkVisualObjectImporter.h
index 8aa8cee5e02c768d945929bbabcf3c04b6532db0..e6579f26bfbabd38666cebc0c9603443390e1cef 100644
--- a/Source/Scene/SceneElements/Loader/imstkVisualObjectImporter.h
+++ b/Source/Scene/SceneElements/Loader/imstkVisualObjectImporter.h
@@ -28,6 +28,7 @@
 
 #include "imstkTexture.h"
 #include "imstkSceneObject.h"
+#include "imstkMath.h"
 
 namespace imstk
 {
diff --git a/Source/Scene/SceneElements/Objects/imstkCollidingObject.h b/Source/Scene/SceneElements/Objects/imstkCollidingObject.h
index 816049e049c26cbdfd8efad3a2d43f3bbb975cf8..dfe6e5e14c8c4fe4d11706088d08c6a8401a3417 100644
--- a/Source/Scene/SceneElements/Objects/imstkCollidingObject.h
+++ b/Source/Scene/SceneElements/Objects/imstkCollidingObject.h
@@ -22,6 +22,7 @@
 #pragma once
 
 #include "imstkSceneObject.h"
+#include "imstkMath.h"
 
 namespace imstk
 {
diff --git a/Source/Scene/SceneElements/Objects/imstkDeformableObject.cpp b/Source/Scene/SceneElements/Objects/imstkDeformableObject.cpp
index b211cbcabed068642f20533a5440a1c905af218b..cd760dd8a30aaf2e6aac4662701484e53a028a3b 100644
--- a/Source/Scene/SceneElements/Objects/imstkDeformableObject.cpp
+++ b/Source/Scene/SceneElements/Objects/imstkDeformableObject.cpp
@@ -21,6 +21,7 @@
 
 #include "imstkDeformableObject.h"
 #include "imstkFEMDeformableBodyModel.h"
+#include "imstkLogger.h"
 
 namespace imstk
 {
diff --git a/Source/Scene/SceneElements/Objects/imstkDynamicObject.cpp b/Source/Scene/SceneElements/Objects/imstkDynamicObject.cpp
index 0d5ba242cacec6264bbb35999b408f0250ed4c15..50d28d7b2ed4f744a3bcbd752cc506f5242af72a 100644
--- a/Source/Scene/SceneElements/Objects/imstkDynamicObject.cpp
+++ b/Source/Scene/SceneElements/Objects/imstkDynamicObject.cpp
@@ -22,6 +22,7 @@
 #include "imstkDynamicObject.h"
 #include "imstkGeometryMap.h"
 #include "imstkAbstractDynamicalModel.h"
+#include "imstkLogger.h"
 
 namespace imstk
 {
diff --git a/Source/Scene/SceneElements/Objects/imstkPbdObject.cpp b/Source/Scene/SceneElements/Objects/imstkPbdObject.cpp
index a578104d21da89e52cb16edfc5a3b3f26710cb9f..ae380e2f71d42a60afbbf080900b0f7d70ad8782 100644
--- a/Source/Scene/SceneElements/Objects/imstkPbdObject.cpp
+++ b/Source/Scene/SceneElements/Objects/imstkPbdObject.cpp
@@ -22,6 +22,7 @@
 #include "imstkPbdObject.h"
 #include "imstkGeometryMap.h"
 #include "imstkPbdModel.h"
+#include "imstkLogger.h"
 
 namespace imstk
 {
diff --git a/Source/Scene/SceneElements/Objects/imstkRigidObject.cpp b/Source/Scene/SceneElements/Objects/imstkRigidObject.cpp
index 64bf174f565cdc9e95df304d38777b79febc32d5..407520854b7fb416a8c924a1d2b758b6a99bd8c6 100644
--- a/Source/Scene/SceneElements/Objects/imstkRigidObject.cpp
+++ b/Source/Scene/SceneElements/Objects/imstkRigidObject.cpp
@@ -19,6 +19,7 @@
 
 =========================================================================*/
 #include "imstkRigidObject.h"
+#include "imstkLogger.h"
 
 namespace imstk
 {
diff --git a/Source/Scene/SceneElements/Objects/imstkSceneObject.h b/Source/Scene/SceneElements/Objects/imstkSceneObject.h
index 247f39940a7108d2d72dd9ecd6bd0c560625711f..6d1cb9eaeca15f764fbb7e01d08be180a6794ea9 100644
--- a/Source/Scene/SceneElements/Objects/imstkSceneObject.h
+++ b/Source/Scene/SceneElements/Objects/imstkSceneObject.h
@@ -24,6 +24,9 @@
 #include "imstkVisualModel.h"
 #include "imstkSceneEntity.h"
 
+#include <string>
+#include <vector>
+
 namespace imstk
 {
 class Geometry;
diff --git a/Source/Scene/SceneElements/Objects/imstkVisualModel.cpp b/Source/Scene/SceneElements/Objects/imstkVisualModel.cpp
index 70dfc1e72354476a869b71cb454518b577c79adb..14a94e2915a6d4632b39fecd4b2a40b2a042239e 100644
--- a/Source/Scene/SceneElements/Objects/imstkVisualModel.cpp
+++ b/Source/Scene/SceneElements/Objects/imstkVisualModel.cpp
@@ -20,10 +20,12 @@
 =========================================================================*/
 
 #include "imstkVisualModel.h"
+#include "imstkGeometry.h"
+#include "imstkRenderMaterial.h"
 
 namespace imstk
 {
-VisualModel::VisualModel(std::shared_ptr<Geometry> geometry) : m_geometry(geometry)
+VisualModel::VisualModel(std::shared_ptr<Geometry> geometry) : m_geometry(geometry), m_renderMaterial(std::make_shared<RenderMaterial>())
 {
 }
 
diff --git a/Source/Scene/SceneElements/Objects/imstkVisualModel.h b/Source/Scene/SceneElements/Objects/imstkVisualModel.h
index 5d482341930d74f0d4d4974172e8a0a5cc26db69..3b14f4824362b4d406e5e10ceeb077e9b1806801 100644
--- a/Source/Scene/SceneElements/Objects/imstkVisualModel.h
+++ b/Source/Scene/SceneElements/Objects/imstkVisualModel.h
@@ -23,11 +23,10 @@
 
 #include <memory>
 
-#include "imstkGeometry.h"
-#include "imstkRenderMaterial.h"
-
 namespace imstk
 {
+class Geometry;
+class RenderMaterial;
 ///
 /// \class VisualModel
 ///
@@ -68,8 +67,8 @@ protected:
     friend class VulkanRenderDelegate;
     friend class VTKRenderer;
 
-    std::shared_ptr<Geometry>       m_geometry       = nullptr;
-    std::shared_ptr<RenderMaterial> m_renderMaterial = std::make_shared<RenderMaterial>();
+    std::shared_ptr<Geometry>       m_geometry = nullptr;
+    std::shared_ptr<RenderMaterial> m_renderMaterial;
 
     bool m_isVisible = true;              ///< true if mesh is shown, false if mesh is hidden
     bool m_renderDelegateCreated = false; ///< true if RenderDelegate has been created
diff --git a/Source/Scene/imstkScene.cpp b/Source/Scene/imstkScene.cpp
index 4f0d42264afd76f8db1b49459e1e7470b4281799..2cafd96ba16d14780a8db4af98f3a3da11f8a1d9 100644
--- a/Source/Scene/imstkScene.cpp
+++ b/Source/Scene/imstkScene.cpp
@@ -23,6 +23,7 @@
 #include "imstkSceneObject.h"
 #include "imstkCameraController.h"
 #include "imstkSceneObjectControllerBase.h"
+#include "imstkCameraController.h"
 #include "imstkDebugRenderGeometry.h"
 #include "imstkDeformableObject.h"
 #include "imstkTimer.h"
diff --git a/Source/Scene/imstkScene.h b/Source/Scene/imstkScene.h
index aba1128dce3104633837ebb036191b03fd23ce15..4d3c43a384a88d2695896656f43b33fa97f5dcab 100644
--- a/Source/Scene/imstkScene.h
+++ b/Source/Scene/imstkScene.h
@@ -22,15 +22,13 @@
 #pragma once
 
 #include <unordered_map>
-#include <memory>
 #include <thread>
 #include <atomic>
 
-#include "imstkCameraController.h"
-
 namespace imstk
 {
 class SceneObjectControllerBase;
+class CameraController;
 class DebugRenderGeometry;
 class SceneObject;
 class SolverBase;
diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.cpp b/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.cpp
index b8ac964b4b9bddb72590d1f259a0c8a2ed4f2f2b..4dbbe40f9f620db31d77c151b640ebc0b2f895d9 100644
--- a/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.cpp
+++ b/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.cpp
@@ -24,7 +24,9 @@
 #include "imstkSimulationManager.h"
 #include "imstkVTKTextStatusManager.h"
 #include "imstkCollisionGraph.h"
+#include "imstkVTKRenderer.h"
 #include "imstkCamera.h"
+#include "imstkScene.h"
 
 // vtk
 #include "vtkObjectFactory.h"
diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.h b/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.h
index c98f212f7c4d4d33c595c57916d5311b17be1b62..d8d0a28f9684a09f8cc885f0eb1980432a33df20 100644
--- a/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.h
+++ b/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.h
@@ -21,10 +21,7 @@
 
 #pragma once
 
-#include <memory>
 #include <chrono>
-#include <unordered_map>
-#include <functional>
 
 #include "imstkInteractorStyle.h"
 
diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKScreenCaptureUtility.cpp b/Source/SimulationManager/VTKRenderer/imstkVTKScreenCaptureUtility.cpp
index 63e6f74e9f1d80543327631f0a6c202943bfed7b..cac4039bb4620b8df9a85bb61f02f9486e9f5e2f 100644
--- a/Source/SimulationManager/VTKRenderer/imstkVTKScreenCaptureUtility.cpp
+++ b/Source/SimulationManager/VTKRenderer/imstkVTKScreenCaptureUtility.cpp
@@ -20,7 +20,6 @@
 =========================================================================*/
 
 #include "imstkVTKScreenCaptureUtility.h"
-
 #include "imstkLogger.h"
 
 namespace imstk
diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKScreenCaptureUtility.h b/Source/SimulationManager/VTKRenderer/imstkVTKScreenCaptureUtility.h
index 4caa6718cd5f91a8eb8fec506ab0fc39c7038889..b6f2d92699ae7b72fd1ac1e160938678382d5770 100644
--- a/Source/SimulationManager/VTKRenderer/imstkVTKScreenCaptureUtility.h
+++ b/Source/SimulationManager/VTKRenderer/imstkVTKScreenCaptureUtility.h
@@ -23,10 +23,10 @@
 
 #include "imstkScreenCaptureUtility.h"
 
-#include "vtkNew.h"
-#include "vtkRenderWindow.h"
-#include "vtkWindowToImageFilter.h"
-#include "vtkPNGWriter.h"
+#include <vtkRenderWindow.h>
+#include <vtkWindowToImageFilter.h>
+#include <vtkPNGWriter.h>
+#include <vtkNew.h>
 
 #include <string>
 
diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKTextStatusManager.cpp b/Source/SimulationManager/VTKRenderer/imstkVTKTextStatusManager.cpp
index 0041e23a0a9c4d3862c992098c3fed8c8301dbac..2f5ca2738730ab2a61be419e2eb3a8416de834f1 100644
--- a/Source/SimulationManager/VTKRenderer/imstkVTKTextStatusManager.cpp
+++ b/Source/SimulationManager/VTKRenderer/imstkVTKTextStatusManager.cpp
@@ -27,6 +27,7 @@
 #include "imstkCamera.h"
 
 #include "vtkTextActor.h"
+#include "vtkRenderWindow.h"
 #include "vtkTextProperty.h"
 
 #include <algorithm>
diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKViewer.cpp b/Source/SimulationManager/VTKRenderer/imstkVTKViewer.cpp
index 23a34fb5e31a923fbc9ade99a899b122c346af73..aebb5e96daaebfb46f7ba3a6ff30053e0ed5028b 100644
--- a/Source/SimulationManager/VTKRenderer/imstkVTKViewer.cpp
+++ b/Source/SimulationManager/VTKRenderer/imstkVTKViewer.cpp
@@ -21,8 +21,16 @@
 
 #include "imstkVTKViewer.h"
 #include "imstkVTKRenderDelegate.h"
+#include "imstkVTKInteractorStyle.h"
 #include "imstkCollisionGraph.h"
+#include "imstkVTKRenderer.h"
 #include "imstkCamera.h"
+#include "imstkLogger.h"
+#include "imstkScene.h"
+
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderWindowInteractor.h>
 
 namespace imstk
 {
diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKViewer.h b/Source/SimulationManager/VTKRenderer/imstkVTKViewer.h
index 6eb78095e463ae01c63392ce2c5121183a1bc9d6..5f9c54531c9086394c52a4abd3883209325cb558 100644
--- a/Source/SimulationManager/VTKRenderer/imstkVTKViewer.h
+++ b/Source/SimulationManager/VTKRenderer/imstkVTKViewer.h
@@ -21,22 +21,9 @@
 
 #pragma once
 
-#include <memory>
-#include <unordered_map>
-
-#include "imstkLogger.h"
-
-#include "imstkScene.h"
-#include "imstkVTKRenderer.h"
-#include "imstkVTKInteractorStyle.h"
 #include "imstkVTKScreenCaptureUtility.h"
 #include "imstkViewer.h"
 #include "imstkVTKRenderDelegate.h"
-#include "vtkSmartPointer.h"
-#include "vtkRenderWindow.h"
-#include "vtkRenderWindowInteractor.h"
-
-//Screenshot utility
 #include "imstkVTKScreenCaptureUtility.h"
 
 #ifdef iMSTK_ENABLE_VR
@@ -45,10 +32,14 @@
 #include "vtkOpenVRRenderWindowInteractor.h"
 #endif
 
+class vtkRenderWindow;
+
 namespace imstk
 {
 class SimulationManager;
 class VTKTextStatusManager;
+class VTKInteractorStyle;
+class Scene;
 
 ///
 /// \class VTKViewer
diff --git a/Source/SimulationManager/imstkSceneManager.cpp b/Source/SimulationManager/imstkSceneManager.cpp
index 0b735df51be4c1e62c75cb822b7046c6278fea45..452fc8e52a21a7cd5ff31a1448f88b5117b9c501 100644
--- a/Source/SimulationManager/imstkSceneManager.cpp
+++ b/Source/SimulationManager/imstkSceneManager.cpp
@@ -20,6 +20,7 @@
 =========================================================================*/
 
 // imstk
+#include "imstkScene.h"
 #include "imstkSceneManager.h"
 //#include "imstkCameraController.h"
 #include "imstkCollisionGraph.h"
@@ -27,6 +28,12 @@
 
 namespace imstk
 {
+SceneManager::SceneManager(std::shared_ptr<Scene> scene) :
+    Module(scene->getName()),
+    m_scene(scene)
+{
+}
+
 void
 SceneManager::initModule()
 {
@@ -45,6 +52,12 @@ SceneManager::cleanUpModule()
     }*/
 }
 
+void
+SceneManager::runModule()
+{
+    m_scene->advance();
+};
+
 void
 SceneManager::startModuleInNewThread(std::shared_ptr<Module> module)
 {
diff --git a/Source/SimulationManager/imstkSceneManager.h b/Source/SimulationManager/imstkSceneManager.h
index 4dc9786841b9b7ce3387b8e7ce2858accd004c90..d055f7d272fdfdc2d1a7d225cf8fb1c10d3edc60 100644
--- a/Source/SimulationManager/imstkSceneManager.h
+++ b/Source/SimulationManager/imstkSceneManager.h
@@ -22,14 +22,13 @@
 #pragma once
 
 #include <unordered_map>
-#include <memory>
 #include <thread>
 
 #include "imstkModule.h"
-#include "imstkScene.h"
 
 namespace imstk
 {
+class Scene;
 ///
 /// \class SceneManager
 ///
@@ -41,9 +40,7 @@ public:
     ///
     /// \brief Constructor
     ///
-    explicit SceneManager(std::shared_ptr<Scene> scene) :
-        Module(scene->getName()),
-        m_scene(scene) {}
+    explicit SceneManager(std::shared_ptr<Scene> scene);
 
     ///
     /// \brief Destructor
@@ -64,7 +61,7 @@ protected:
     ///
     /// \brief Run the module
     ///
-    void runModule() override { m_scene->advance(); };
+    void runModule() override;
 
     ///
     /// \brief Clean up the module
diff --git a/Source/SimulationManager/imstkSimulationManager.cpp b/Source/SimulationManager/imstkSimulationManager.cpp
index dc254ed325eb70066adb50b510f74df9b060259b..154c7918168675421d1a7dade62088d55e3e510e 100644
--- a/Source/SimulationManager/imstkSimulationManager.cpp
+++ b/Source/SimulationManager/imstkSimulationManager.cpp
@@ -26,6 +26,8 @@
 #include "imstkSceneManager.h"
 #include "imstkViewer.h"
 #include "imstkTimer.h"
+#include "imstkLogger.h"
+#include "imstkScene.h"
 
 #include <string>
 
diff --git a/Source/SimulationManager/imstkSimulationManager.h b/Source/SimulationManager/imstkSimulationManager.h
index 513e48c8c851ceb0c1eb2786835748b28a450586..916db00af5febfe713c0de5640acb2db18acd9f7 100644
--- a/Source/SimulationManager/imstkSimulationManager.h
+++ b/Source/SimulationManager/imstkSimulationManager.h
@@ -21,14 +21,9 @@
 
 #pragma once
 
-//#include <unordered_map>
-//#include <vector>
-//#include <thread>
 #include <mutex>
-#include <memory>
 
 #include "imstkModule.h"
-#include "imstkLogger.h"
 
 #ifdef iMSTK_USE_Vulkan
 #include "imstkVulkanViewer.h"
@@ -40,6 +35,7 @@ namespace imstk
 {
 class SceneManager;
 class Scene;
+struct SceneConfig;
 class Viewer;
 
 using SimulationStatus = ModuleStatus;
diff --git a/Source/SimulationManager/imstkViewer.cpp b/Source/SimulationManager/imstkViewer.cpp
index ed98635e998244ce516bc0c13a29833423fb2dba..50c68d38bec6256b234dc6917994549098885264 100644
--- a/Source/SimulationManager/imstkViewer.cpp
+++ b/Source/SimulationManager/imstkViewer.cpp
@@ -20,11 +20,18 @@
 =========================================================================*/
 
 #include "imstkViewer.h"
+#include "imstkScene.h"
 #include "imstkCollisionGraph.h"
 #include "imstkCamera.h"
+#include "imstkScreenCaptureUtility.h"
+#include "imstkGUICanvas.h"
 
 namespace imstk
 {
+Viewer::Viewer() : m_canvas(std::make_shared<GUIOverlay::Canvas>())
+{
+}
+
 const std::shared_ptr<Scene>&
 Viewer::getActiveScene() const
 {
diff --git a/Source/SimulationManager/imstkViewer.h b/Source/SimulationManager/imstkViewer.h
index faa5d484f0fe0015cd89149239ea6c84e9973c37..9b2dc052218370e2fac952a0b1b7e0d07b8aa618 100644
--- a/Source/SimulationManager/imstkViewer.h
+++ b/Source/SimulationManager/imstkViewer.h
@@ -21,18 +21,18 @@
 
 #pragma once
 
-#include <memory>
-
-#include "imstkScene.h"
 #include "imstkRenderer.h"
-#include "imstkScreenCaptureUtility.h"
 #include "imstkInteractorStyle.h"
-#include "imstkGUICanvas.h"
 
 namespace imstk
 {
 class SimulationManager;
-
+class Scene;
+class ScreenCaptureUtility;
+namespace GUIOverlay
+{
+class Canvas;
+}
 ///
 /// \class Viewer
 ///
@@ -42,7 +42,7 @@ class Viewer
 {
 public:
 
-    Viewer() {}
+    Viewer();
     Viewer(SimulationManager*) {}
     virtual ~Viewer() = default;
 
@@ -136,6 +136,6 @@ protected:
     std::shared_ptr<ScreenCaptureUtility> m_screenCapturer; ///> Screen shot utility
 
     bool m_running = false;
-    std::shared_ptr<GUIOverlay::Canvas> m_canvas = std::make_shared<GUIOverlay::Canvas>();
+    std::shared_ptr<GUIOverlay::Canvas> m_canvas = nullptr;
 };
 }
diff --git a/Source/Solvers/imstkConjugateGradient.cpp b/Source/Solvers/imstkConjugateGradient.cpp
index bc89030b5b4d5224e8696fd42a3d2b50e49200a7..e9a575683310686a7f186761e7e4ebdb1d4e661b 100644
--- a/Source/Solvers/imstkConjugateGradient.cpp
+++ b/Source/Solvers/imstkConjugateGradient.cpp
@@ -20,8 +20,8 @@
 =========================================================================*/
 
 #include "imstkConjugateGradient.h"
-
-#include <iostream>
+#include "imstkLinearProjectionConstraint.h"
+#include "imstkLogger.h"
 
 namespace imstk
 {
diff --git a/Source/Solvers/imstkConjugateGradient.h b/Source/Solvers/imstkConjugateGradient.h
index 357e02e88f0b88f237d50cb9af3ce9d6a06091cd..16c3c7ec52ca29593ad778b2384782a4dc4fd2c8 100644
--- a/Source/Solvers/imstkConjugateGradient.h
+++ b/Source/Solvers/imstkConjugateGradient.h
@@ -21,10 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
-// iMSTK includes
-#include "imstkNonlinearSystem.h"
 #include "imstkIterativeLinearSolver.h"
 
 // Eigen includes
@@ -32,6 +28,7 @@
 
 namespace imstk
 {
+class LinearProjectionConstraint;
 ///
 /// \brief Conjugate gradient sparse linear solver for SPD matrices
 ///
diff --git a/Source/Solvers/imstkGaussSeidel.cpp b/Source/Solvers/imstkGaussSeidel.cpp
index c0504a6c174b8d703109ae6ed5cedc7f8cf7eaae..514fb4ca45fc5c32491d53d711e984344b1a25bd 100644
--- a/Source/Solvers/imstkGaussSeidel.cpp
+++ b/Source/Solvers/imstkGaussSeidel.cpp
@@ -20,6 +20,11 @@
 =========================================================================*/
 
 #include "imstkGaussSeidel.h"
+#include "imstkLogger.h"
+#include "imstkLinearProjectionConstraint.h"
+
+// Eigen includes
+#include <Eigen/IterativeLinearSolvers>
 
 namespace imstk
 {
diff --git a/Source/Solvers/imstkGaussSeidel.h b/Source/Solvers/imstkGaussSeidel.h
index 875338f37e9759c7d43927b856658291292bb783..4caf0cbf0a4fea7a1ab460667a4ceed43c27afe8 100644
--- a/Source/Solvers/imstkGaussSeidel.h
+++ b/Source/Solvers/imstkGaussSeidel.h
@@ -21,17 +21,13 @@
 
 #pragma once
 
-#include <memory>
-
 // iMSTK includes
-#include "imstkNonlinearSystem.h"
 #include "imstkIterativeLinearSolver.h"
 
-// Eigen includes
-#include <Eigen/IterativeLinearSolvers>
-
 namespace imstk
 {
+class LinearProjectionConstraint;
+
 ///
 /// \brief Gauss-Seidel sparse linear solver
 ///
diff --git a/Source/Solvers/imstkIterativeLinearSolver.cpp b/Source/Solvers/imstkIterativeLinearSolver.cpp
index d8da262760cd8b86a169990f47f79225b6349644..c287f23a5b09fd4c3fe12e3c4e7e703a25d4fe35 100644
--- a/Source/Solvers/imstkIterativeLinearSolver.cpp
+++ b/Source/Solvers/imstkIterativeLinearSolver.cpp
@@ -20,6 +20,7 @@
 =========================================================================*/
 
 #include "imstkIterativeLinearSolver.h"
+#include "imstkLogger.h"
 
 namespace imstk
 {
diff --git a/Source/Solvers/imstkJacobi.cpp b/Source/Solvers/imstkJacobi.cpp
index c86cf34bc530057905f6e15f7d2d553188ceb1e1..5d7d4714dda6f2d5ba4f794204f2440f3eaea5e0 100644
--- a/Source/Solvers/imstkJacobi.cpp
+++ b/Source/Solvers/imstkJacobi.cpp
@@ -20,6 +20,11 @@
 =========================================================================*/
 
 #include "imstkJacobi.h"
+#include "imstkLogger.h"
+#include "imstkLinearProjectionConstraint.h"
+
+// Eigen includes
+#include <Eigen/IterativeLinearSolvers>
 
 namespace imstk
 {
diff --git a/Source/Solvers/imstkJacobi.h b/Source/Solvers/imstkJacobi.h
index 22a76b792a26c807f927dfef7e44821803e9d6a1..7d1ee27070c6d0c3479dc459ae66fc24373ae822 100644
--- a/Source/Solvers/imstkJacobi.h
+++ b/Source/Solvers/imstkJacobi.h
@@ -21,17 +21,12 @@
 
 #pragma once
 
-#include <memory>
-
-// iMSTK includes
-#include "imstkNonlinearSystem.h"
 #include "imstkIterativeLinearSolver.h"
 
-// Eigen includes
-#include <Eigen/IterativeLinearSolvers>
-
 namespace imstk
 {
+class LinearProjectionConstraint;
+
 ///
 /// \brief Jacobi sparse linear solver
 ///
diff --git a/Source/Solvers/imstkLinearSolver.cpp b/Source/Solvers/imstkLinearSolver.cpp
index adb2fa3ddb58d497ced9f20e6cca8d3f8974e7e6..88e14c0714b70b29a5bec3aec7dade6a5a6f3e51 100644
--- a/Source/Solvers/imstkLinearSolver.cpp
+++ b/Source/Solvers/imstkLinearSolver.cpp
@@ -20,6 +20,7 @@
 =========================================================================*/
 
 #include "imstkLinearSolver.h"
+#include "imstkLogger.h"
 
 namespace imstk
 {
diff --git a/Source/Solvers/imstkLinearSolver.h b/Source/Solvers/imstkLinearSolver.h
index 1b3a230d5b75bacfa58ec30c02f9639d6f99bd09..e49596b25b1e3709cd5e7dbf3ebe36a753be2c37 100644
--- a/Source/Solvers/imstkLinearSolver.h
+++ b/Source/Solvers/imstkLinearSolver.h
@@ -25,8 +25,6 @@
 #include "imstkLinearSystem.h"
 #include "imstkMath.h"
 
-#include "imstkLogger.h"
-
 namespace imstk
 {
 ///
@@ -97,7 +95,7 @@ public:
     ///
     virtual void print() const
     {
-        LOG(INFO) << "Solver type (broad): Linear";
+        //LOG(INFO) << "Solver type (broad): Linear";
     };
 
     ///
diff --git a/Source/Solvers/imstkNewtonSolver.cpp b/Source/Solvers/imstkNewtonSolver.cpp
index 3cf60fb5760d0c7db9150f223888a423d9392d32..70fbb6074914cf7ca725f93f4f804d5f097c2280 100644
--- a/Source/Solvers/imstkNewtonSolver.cpp
+++ b/Source/Solvers/imstkNewtonSolver.cpp
@@ -24,6 +24,7 @@
 #include "imstkNewtonSolver.h"
 #include "imstkIterativeLinearSolver.h"
 #include "imstkConjugateGradient.h"
+#include "imstkLogger.h"
 
 namespace imstk
 {
diff --git a/Source/Solvers/imstkNonlinearSystem.h b/Source/Solvers/imstkNonlinearSystem.h
index bbe8368da5231218c4aa0c2fd487e6599395ca70..941387064002f836d9160338239a061a439a4019 100644
--- a/Source/Solvers/imstkNonlinearSystem.h
+++ b/Source/Solvers/imstkNonlinearSystem.h
@@ -21,11 +21,8 @@
 
 #pragma once
 
-#include <memory>
-#include <stdio.h>
-
 #include "imstkMath.h"
-#include "imstkLinearProjectionConstraint.h"
+//#include "imstkLinearProjectionConstraint.h"
 
 namespace imstk
 {
diff --git a/Source/Solvers/imstkSOR.cpp b/Source/Solvers/imstkSOR.cpp
index dd750932895aaac905a136adc54d13f46689563e..8e6c6f3a02f7df3b4de2db73e875604f080eed97 100644
--- a/Source/Solvers/imstkSOR.cpp
+++ b/Source/Solvers/imstkSOR.cpp
@@ -20,6 +20,8 @@
 =========================================================================*/
 
 #include "imstkSOR.h"
+#include "imstkLogger.h"
+#include "imstkLinearProjectionConstraint.h"
 
 namespace imstk
 {
diff --git a/Source/Solvers/imstkSOR.h b/Source/Solvers/imstkSOR.h
index 25f049239578a667e379a70ffbf0930f43ebe15d..f310b48bc70d1dde34f439fdf74cdf76864ade3d 100644
--- a/Source/Solvers/imstkSOR.h
+++ b/Source/Solvers/imstkSOR.h
@@ -21,8 +21,6 @@
 
 #pragma once
 
-#include <memory>
-
 // iMSTK includes
 #include "imstkNonlinearSystem.h"
 #include "imstkIterativeLinearSolver.h"
@@ -32,6 +30,8 @@
 
 namespace imstk
 {
+class LinearProjectionConstraint;
+
 ///
 /// \brief Successive Over Relaxation (SOR) sparse linear solver
 ///
diff --git a/Source/apiUtilities/imstkAPIUtilities.cpp b/Source/apiUtilities/imstkAPIUtilities.cpp
index 07ba9cb8cc54772ac1831fc88982843483884ac2..ef6930160251d2533a82d66a71c6ee7714b018a8 100644
--- a/Source/apiUtilities/imstkAPIUtilities.cpp
+++ b/Source/apiUtilities/imstkAPIUtilities.cpp
@@ -19,3 +19,240 @@
 
 =========================================================================*/
 #include "imstkAPIUtilities.h"
+
+// Objects
+#include "imstkFEMDeformableBodyModel.h"
+#include "imstkSceneObject.h"
+#include "imstkSceneManager.h"
+#include "imstkCollidingObject.h"
+#include "imstkScene.h"
+
+#include "imstkColor.h"
+
+// Solvers
+#include "imstkNonlinearSystem.h"
+
+// Geometry
+#include "imstkPlane.h"
+#include "imstkSphere.h"
+#include "imstkCapsule.h"
+#include "imstkCube.h"
+#include "imstkPointSet.h"
+#include "imstkSurfaceMesh.h"
+#include "imstkTetrahedralMesh.h"
+#include "imstkMeshIO.h"
+#include "imstkImageData.h"
+
+#include "imstkGraph.h"
+#include "imstkCollisionGraph.h"
+#include "imstkCamera.h"
+#include "imstkLinearProjectionConstraint.h"
+
+// logger
+#include "imstkLogger.h"
+#include "imstkTimer.h"
+
+namespace imstk
+{
+namespace apiutils
+{
+///
+/// \brief Create a analytical visual scene object that and add it to the scene
+///
+std::shared_ptr<VisualObject>
+createVisualAnalyticalSceneObject(Geometry::Type         type,
+                                  std::shared_ptr<Scene> scene,
+                                  const std::string&     objName,
+                                  const double           scale /* = 1.*/,
+                                  const Vec3d            t /*= Vec3d(0., 0., 0.)*/)
+{
+    CHECK(scene != nullptr) << "createVisualAnalyticalSceneObject: Scene is not valid!";
+    CHECK(!objName.empty()) << "createVisualAnalyticalSceneObject: Name is empty!";
+
+    std::shared_ptr<Geometry> geom;
+    switch (type)
+    {
+    case Geometry::Type::Sphere:
+        geom = std::make_shared<Sphere>();
+        break;
+
+    case Geometry::Type::Plane:
+        geom = std::make_shared<Plane>();
+        break;
+
+    case Geometry::Type::Cube:
+        geom = std::make_shared<Cube>();
+        break;
+
+    case Geometry::Type::Capsule:
+        geom = std::make_shared<Capsule>();
+        break;
+
+    case Geometry::Type::ImageData:
+        geom = std::make_shared<ImageData>();
+        break;
+
+    default:
+        LOG(WARNING) << "createVisualAnalyticalSceneObject: Scene object geometry type is not analytical!";
+        return nullptr;
+    }
+
+    geom->scale(scale, Geometry::TransformType::ApplyToData);
+    geom->translate(t, Geometry::TransformType::ApplyToData);
+
+    auto sceneObj = std::make_shared<VisualObject>(objName);
+    sceneObj->setVisualGeometry(geom);
+    scene->addSceneObject(sceneObj);
+
+    return sceneObj;
+}
+
+///
+/// \brief Create a analytical colliding scene object that and add it to the scene
+///
+std::shared_ptr<CollidingObject>
+createCollidingAnalyticalSceneObject(Geometry::Type         type,
+                                     std::shared_ptr<Scene> scene,
+                                     const std::string&     objName,
+                                     const double           scale /*= 1.*/,
+                                     const Vec3d            t /*= Vec3d(0., 0., 0.)*/)
+{
+    CHECK(scene != nullptr) << "createCollidingSphereSceneObject: Scene is not valid!";
+    CHECK(!objName.empty()) << "createCollidingAnalyticalSceneObject: Name is empty!";
+
+    std::shared_ptr<Geometry> geom;
+    switch (type)
+    {
+    case Geometry::Type::Sphere:
+        geom = std::make_shared<Sphere>();
+        break;
+
+    case Geometry::Type::Plane:
+        geom = std::make_shared<Plane>();
+        break;
+
+    case Geometry::Type::Cube:
+        geom = std::make_shared<Cube>();
+        break;
+
+    default:
+        LOG(WARNING) << "createCollidingAnalyticalSceneObject: Scene object geometry type is not analytical!";
+        return nullptr;
+    }
+
+    geom->scale(scale, Geometry::TransformType::ApplyToData);
+    geom->translate(t, Geometry::TransformType::ApplyToData);
+
+    auto sceneObj = std::make_shared<CollidingObject>(objName);
+    sceneObj->setVisualGeometry(geom);
+    sceneObj->setCollidingGeometry(geom);
+    scene->addSceneObject(sceneObj);
+
+    return sceneObj;
+}
+
+///
+/// \brief Read a mesh, create a visual scene object and add to the scene
+///
+std::shared_ptr<SceneObject>
+createAndAddVisualSceneObject(std::shared_ptr<Scene> scene,
+                              const std::string&     fileName,
+                              const std::string&     objectName)
+{
+    CHECK(scene != nullptr) << "createAndAddVisualSceneObject: Scene is not valid!";
+    CHECK(!fileName.empty()) << "createAndAddVisualSceneObject: Name is empty!";
+
+    auto mesh = MeshIO::read(fileName);
+    auto SurfaceMesh = std::dynamic_pointer_cast<imstk::SurfaceMesh>(mesh);
+
+    // Create object and add to scene
+    auto meshSceneObject = std::make_shared<VisualObject>("meshObject");
+    meshSceneObject->setVisualGeometry(SurfaceMesh);
+    meshSceneObject->setName(objectName);
+    scene->addSceneObject(meshSceneObject);
+
+    return meshSceneObject;
+}
+
+///
+/// \brief Create a non-linear system using FEM dynamic model
+///
+std::shared_ptr<NonLinearSystem>
+createNonLinearSystem(std::shared_ptr<FEMDeformableBodyModel> dynaModel)
+{
+    CHECK(dynaModel != nullptr) << "createNonLinearSystem: Dynamic model is not valid!";
+
+    auto nlSystem = std::make_shared<NonLinearSystem>(
+                dynaModel->getFunction(),
+                dynaModel->getFunctionGradient());
+
+    std::vector<LinearProjectionConstraint> linProj;
+    for (auto i : dynaModel->getFixNodeIds())
+    {
+        linProj.push_back(LinearProjectionConstraint(i, true));
+    }
+    nlSystem->setUnknownVector(dynaModel->getUnknownVec());
+    nlSystem->setUpdateFunction(dynaModel->getUpdateFunction());
+    nlSystem->setUpdatePreviousStatesFunction(dynaModel->getUpdatePrevStateFunction());
+
+    return nlSystem;
+}
+
+///
+/// \brief Print number of updates for second for a given scene
+///
+void
+printUPS(std::shared_ptr<SceneManager> sceneManager)
+{
+    if (!sceneManager)
+    {
+        LOG(WARNING) << "APIUtilities::printUPS - scene manager is not valid! Unable to print UPS";
+        return;
+    }
+
+    sceneManager->setPostUpdateCallback([&sceneManager](Module* module)
+            {
+                std::cout << "\r" << module->getName() << " running at "
+                          << sceneManager->getUPS() << " ups   " << std::flush;
+                });
+}
+
+std::shared_ptr<Graph>
+getMeshGraph(std::shared_ptr<PointSet> m)
+{
+    LOG(WARNING) << "The graph of a point set has no edges";
+
+    return std::make_shared<Graph>(m->getNumVertices());
+}
+
+std::shared_ptr<Graph>
+getMeshGraph(std::shared_ptr<SurfaceMesh> m)
+{
+    auto gMesh = std::make_shared<Graph>(m->getNumVertices());
+    for (auto tri : m->getTrianglesVertices())
+    {
+        gMesh->addEdge(tri[0], tri[1]);
+        gMesh->addEdge(tri[0], tri[2]);
+        gMesh->addEdge(tri[1], tri[2]);
+    }
+
+    return gMesh;
+}
+
+std::shared_ptr<Graph>
+getMeshGraph(std::shared_ptr<TetrahedralMesh> m)
+{
+    auto gMesh = std::make_shared<Graph>(m->getNumVertices());
+    for (auto tet : m->getTetrahedraVertices())
+    {
+        gMesh->addEdge(tet[0], tet[1]);
+        gMesh->addEdge(tet[0], tet[2]);
+        gMesh->addEdge(tet[0], tet[3]);
+        gMesh->addEdge(tet[1], tet[2]);
+        gMesh->addEdge(tet[1], tet[3]);
+        gMesh->addEdge(tet[2], tet[3]);
+    }
+    return gMesh;
+}
+}     //apiutils
+} // imstk
\ No newline at end of file
diff --git a/Source/apiUtilities/imstkAPIUtilities.h b/Source/apiUtilities/imstkAPIUtilities.h
index f6faf92c9bc9c8011421d2ea3de54f16a77a15f3..a13b953d01e3555e384094305c87e028d98665ef 100644
--- a/Source/apiUtilities/imstkAPIUtilities.h
+++ b/Source/apiUtilities/imstkAPIUtilities.h
@@ -21,235 +21,63 @@
 
 #pragma once
 
-// Objects
-#include "imstkFEMDeformableBodyModel.h"
+#include "imstkGeometry.h"
 #include "imstkSceneObject.h"
-#include "imstkSceneManager.h"
-#include "imstkCollidingObject.h"
-
-// Solvers
-#include "imstkNonlinearSystem.h"
-
-// Geometry
-#include "imstkPlane.h"
-#include "imstkSphere.h"
-#include "imstkCapsule.h"
-#include "imstkCube.h"
-#include "imstkPointSet.h"
-#include "imstkSurfaceMesh.h"
-#include "imstkTetrahedralMesh.h"
-#include "imstkMeshIO.h"
-#include "imstkImageData.h"
-
-#include "imstkGraph.h"
-#include "imstkCollisionGraph.h"
-#include "imstkCamera.h"
-
-// logger
-#include "imstkLogger.h"
-#include "imstkTimer.h"
+#include "imstkMath.h"
 
 namespace imstk
 {
+class TetrahedralMesh;
+class SurfaceMesh;
+class PointSet;
+class SceneManager;
+class Scene;
+class FEMDeformableBodyModel;
+class NonLinearSystem;
+class CollidingObject;
+class Graph;
+
 namespace apiutils
 {
 ///
 /// \brief Create a analytical visual scene object that and add it to the scene
 ///
-std::shared_ptr<VisualObject>
-createVisualAnalyticalSceneObject(Geometry::Type type,
-                                  std::shared_ptr<Scene> scene,
-                                  const std::string& objName,
-                                  const double scale = 1.,
-                                  const Vec3d t      = Vec3d(0., 0., 0.))
-{
-    CHECK(scene != nullptr) << "createVisualAnalyticalSceneObject: Scene is not valid!";
-    CHECK(!objName.empty()) << "createVisualAnalyticalSceneObject: Name is empty!";
-
-    std::shared_ptr<Geometry> geom;
-    switch (type)
-    {
-    case Geometry::Type::Sphere:
-        geom = std::make_shared<Sphere>();
-        break;
-
-    case Geometry::Type::Plane:
-        geom = std::make_shared<Plane>();
-        break;
-
-    case Geometry::Type::Cube:
-        geom = std::make_shared<Cube>();
-        break;
-
-    case Geometry::Type::Capsule:
-        geom = std::make_shared<Capsule>();
-        break;
-
-    case Geometry::Type::ImageData:
-        geom = std::make_shared<ImageData>();
-        break;
-
-    default:
-        LOG(WARNING) << "createVisualAnalyticalSceneObject: Scene object geometry type is not analytical!";
-        return nullptr;
-    }
-
-    geom->scale(scale, Geometry::TransformType::ApplyToData);
-    geom->translate(t, Geometry::TransformType::ApplyToData);
-
-    auto sceneObj = std::make_shared<VisualObject>(objName);
-    sceneObj->setVisualGeometry(geom);
-    scene->addSceneObject(sceneObj);
-
-    return sceneObj;
-}
+std::shared_ptr<VisualObject> createVisualAnalyticalSceneObject(Geometry::Type type,
+                                                                std::shared_ptr<Scene> scene,
+                                                                const std::string& objName,
+                                                                const double scale = 1.,
+                                                                const Vec3d t      = Vec3d(0., 0., 0.));
 
 ///
 /// \brief Create a analytical colliding scene object that and add it to the scene
 ///
-std::shared_ptr<CollidingObject>
-createCollidingAnalyticalSceneObject(Geometry::Type type,
-                                     std::shared_ptr<Scene> scene,
-                                     const std::string& objName,
-                                     const double scale = 1.,
-                                     const Vec3d t      = Vec3d(0., 0., 0.))
-{
-    CHECK(scene != nullptr) << "createCollidingSphereSceneObject: Scene is not valid!";
-    CHECK(!objName.empty()) << "createCollidingAnalyticalSceneObject: Name is empty!";
-
-    std::shared_ptr<Geometry> geom;
-    switch (type)
-    {
-    case Geometry::Type::Sphere:
-        geom = std::make_shared<Sphere>();
-        break;
-
-    case Geometry::Type::Plane:
-        geom = std::make_shared<Plane>();
-        break;
-
-    case Geometry::Type::Cube:
-        geom = std::make_shared<Cube>();
-        break;
-
-    default:
-        LOG(WARNING) << "createCollidingAnalyticalSceneObject: Scene object geometry type is not analytical!";
-        return nullptr;
-    }
-
-    geom->scale(scale, Geometry::TransformType::ApplyToData);
-    geom->translate(t, Geometry::TransformType::ApplyToData);
-
-    auto sceneObj = std::make_shared<CollidingObject>(objName);
-    sceneObj->setVisualGeometry(geom);
-    sceneObj->setCollidingGeometry(geom);
-    scene->addSceneObject(sceneObj);
-
-    return sceneObj;
-}
+std::shared_ptr<CollidingObject> createCollidingAnalyticalSceneObject(Geometry::Type type,
+                                                                      std::shared_ptr<Scene> scene,
+                                                                      const std::string& objName,
+                                                                      const double scale = 1.,
+                                                                      const Vec3d t      = Vec3d(0., 0., 0.));
 
 ///
 /// \brief Read a mesh, create a visual scene object and add to the scene
 ///
-std::shared_ptr<SceneObject>
-createAndAddVisualSceneObject(std::shared_ptr<Scene> scene,
-                              const std::string&     fileName,
-                              const std::string&     objectName)
-{
-    CHECK(scene != nullptr) << "createAndAddVisualSceneObject: Scene is not valid!";
-    CHECK(!fileName.empty()) << "createAndAddVisualSceneObject: Name is empty!";
-
-    auto mesh = MeshIO::read(fileName);
-    auto SurfaceMesh = std::dynamic_pointer_cast<imstk::SurfaceMesh>(mesh);
-
-    // Create object and add to scene
-    auto meshSceneObject = std::make_shared<VisualObject>("meshObject");
-    meshSceneObject->setVisualGeometry(SurfaceMesh);
-    meshSceneObject->setName(objectName);
-    scene->addSceneObject(meshSceneObject);
-
-    return meshSceneObject;
-}
+std::shared_ptr<SceneObject> createAndAddVisualSceneObject(std::shared_ptr<Scene> scene,
+                                                           const std::string&     fileName,
+                                                           const std::string&     objectName);
 
 ///
 /// \brief Create a non-linear system using FEM dynamic model
 ///
-std::shared_ptr<NonLinearSystem>
-createNonLinearSystem(std::shared_ptr<FEMDeformableBodyModel> dynaModel)
-{
-    CHECK(dynaModel != nullptr) << "createNonLinearSystem: Dynamic model is not valid!";
-
-    auto nlSystem = std::make_shared<NonLinearSystem>(
-        dynaModel->getFunction(),
-        dynaModel->getFunctionGradient());
-
-    std::vector<LinearProjectionConstraint> linProj;
-    for (auto i : dynaModel->getFixNodeIds())
-    {
-        linProj.push_back(LinearProjectionConstraint(i, true));
-    }
-    nlSystem->setUnknownVector(dynaModel->getUnknownVec());
-    nlSystem->setUpdateFunction(dynaModel->getUpdateFunction());
-    nlSystem->setUpdatePreviousStatesFunction(dynaModel->getUpdatePrevStateFunction());
-
-    return nlSystem;
-}
+std::shared_ptr<NonLinearSystem> createNonLinearSystem(std::shared_ptr<FEMDeformableBodyModel> dynaModel);
 
 ///
 /// \brief Print number of updates for second for a given scene
 ///
-void
-printUPS(std::shared_ptr<SceneManager> sceneManager)
-{
-    if (!sceneManager)
-    {
-        LOG(WARNING) << "APIUtilities::printUPS - scene manager is not valid! Unable to print UPS";
-        return;
-    }
-
-    sceneManager->setPostUpdateCallback([&sceneManager](Module* module)
-            {
-                std::cout << "\r" << module->getName() << " running at "
-                          << sceneManager->getUPS() << " ups   " << std::flush;
-    });
-}
-
-std::shared_ptr<Graph>
-getMeshGraph(std::shared_ptr<PointSet> m)
-{
-    LOG(WARNING) << "The graph of a point set has no edges";
+void printUPS(std::shared_ptr<SceneManager> sceneManager);
 
-    return std::make_shared<Graph>(m->getNumVertices());
-}
+std::shared_ptr<Graph> getMeshGraph(std::shared_ptr<PointSet> m);
 
-std::shared_ptr<Graph>
-getMeshGraph(std::shared_ptr<SurfaceMesh> m)
-{
-    auto gMesh = std::make_shared<Graph>(m->getNumVertices());
-    for (auto tri : m->getTrianglesVertices())
-    {
-        gMesh->addEdge(tri[0], tri[1]);
-        gMesh->addEdge(tri[0], tri[2]);
-        gMesh->addEdge(tri[1], tri[2]);
-    }
-
-    return gMesh;
-}
-
-std::shared_ptr<Graph>
-getMeshGraph(std::shared_ptr<TetrahedralMesh> m)
-{
-    auto gMesh = std::make_shared<Graph>(m->getNumVertices());
-    for (auto tet : m->getTetrahedraVertices())
-    {
-        gMesh->addEdge(tet[0], tet[1]);
-        gMesh->addEdge(tet[0], tet[2]);
-        gMesh->addEdge(tet[0], tet[3]);
-        gMesh->addEdge(tet[1], tet[2]);
-        gMesh->addEdge(tet[1], tet[3]);
-        gMesh->addEdge(tet[2], tet[3]);
-    }
-    return gMesh;
-}
+std::shared_ptr<Graph> getMeshGraph(std::shared_ptr<SurfaceMesh> m);
+
+std::shared_ptr<Graph> getMeshGraph(std::shared_ptr<TetrahedralMesh> m);
 } //apiutils
 } // imstk