diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Blade10.dae.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Blade10.dae.sha512
new file mode 100644
index 0000000000000000000000000000000000000000..01dc30b00c55a3b5c2fc4c20c55cc238ad061f13
--- /dev/null
+++ b/Data/Surgical Instruments/Scalpel/Scalpel_Blade10.dae.sha512	
@@ -0,0 +1 @@
+de81db98099d447f73a068553b91cf13b86067126a0f356248325cd9bbcdae466405b6eca7dce5b874de7dfc11979270fe53622437a3ee65b8182bd86e96c5b7
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Blade10.obj.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Blade10.obj.sha512
deleted file mode 100644
index 4d0197c17e91a3af9101aff5b126a33e527dee41..0000000000000000000000000000000000000000
--- a/Data/Surgical Instruments/Scalpel/Scalpel_Blade10.obj.sha512	
+++ /dev/null
@@ -1 +0,0 @@
-b3020f808f1589756d438d689bfde4ef673a3ab51f93f699bb7c16dbefc21fd48bdd5660810c509f5bfa4256bb4fa2aa8955c3b59ca011e24c72414890291616
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Blade10_Hull.stl.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Blade10_Hull.stl.sha512
deleted file mode 100644
index 034890c59bc0acf07d468a2df98bf4f7a7f59fcd..0000000000000000000000000000000000000000
--- a/Data/Surgical Instruments/Scalpel/Scalpel_Blade10_Hull.stl.sha512	
+++ /dev/null
@@ -1 +0,0 @@
-3314f75a94b2ea8b026053678f3754e5203dd90b35e80f99e4ae83f38957461b9ab0f4fbb60c94240f3e6622a99ee4a1929e8d98b29e02b894c03da9a716f4c9
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Blade11.dae.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Blade11.dae.sha512
new file mode 100644
index 0000000000000000000000000000000000000000..377bd0efebd20830a5ed958d286562783a986b92
--- /dev/null
+++ b/Data/Surgical Instruments/Scalpel/Scalpel_Blade11.dae.sha512	
@@ -0,0 +1 @@
+35de8f05bdb4e0ae0e93c4caea21d3644fdcaa59a607e2a1e6bbcda76e0dbeabf364ad39dbd747b3e2ee1776e9cc1a938903f0c216e64f6ceaec85e5a4c59e43
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Blade11.obj.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Blade11.obj.sha512
deleted file mode 100644
index 6f0e02f90ebf77c320736922db2c8a09e9ee35fb..0000000000000000000000000000000000000000
--- a/Data/Surgical Instruments/Scalpel/Scalpel_Blade11.obj.sha512	
+++ /dev/null
@@ -1 +0,0 @@
-a68a897914f25b37381a833da42e1efd6242f3f43b3f3be3d53662151e41819a3b467d86884e199933364a5e3e09fe3999dd763b8ee9282cdd9e664f9ba1cf66
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Blade15.dae.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Blade15.dae.sha512
new file mode 100644
index 0000000000000000000000000000000000000000..edc06ca89e9d05b803081cecf2a195ad22a9ff3f
--- /dev/null
+++ b/Data/Surgical Instruments/Scalpel/Scalpel_Blade15.dae.sha512	
@@ -0,0 +1 @@
+632f9e33d3279c8116ead86c785fb5758229b477169233f2eb92c3c7ebd796c0f68abdb18a5e0b10b42d6e540931319cc0a5419d8a57f5fab96c2ece0976a48b
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Blade15.obj.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Blade15.obj.sha512
deleted file mode 100644
index 85bace8d1d48801ab5bd52ac739552d7d6b66c8a..0000000000000000000000000000000000000000
--- a/Data/Surgical Instruments/Scalpel/Scalpel_Blade15.obj.sha512	
+++ /dev/null
@@ -1 +0,0 @@
-53c94e1d26114f36ad553fa6de26d6bdd1d9ccb7b693b4560ac25a520ce60f17fbd5819aba5d7c7580ca2c1875665439744b39f6f3a530138f2af9409a110f37
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Handle.dae.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Handle.dae.sha512
new file mode 100644
index 0000000000000000000000000000000000000000..b5a0ee44b9858925af65f662d2e6dd74aad8138c
--- /dev/null
+++ b/Data/Surgical Instruments/Scalpel/Scalpel_Handle.dae.sha512	
@@ -0,0 +1 @@
+1dfb0e86575555b41abfabdf456fc614036f7acfc7034456e17fe91e7c91d04b888d2084c425127bde4adf9b2d9e292d360682468f9839a6f7be53b9b44f7171
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Handle.obj.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Handle.obj.sha512
deleted file mode 100644
index 8e87f96ea38351bdcf2829fdb54a10d85ed1dd99..0000000000000000000000000000000000000000
--- a/Data/Surgical Instruments/Scalpel/Scalpel_Handle.obj.sha512	
+++ /dev/null
@@ -1 +0,0 @@
-5bfa843d28651bf9e1573d627434905ca7980541877c9a2aa3cd24d3c85f914245a416340de3d22cdeba73d641daf23d7aab9be753072c7c40e875f688ce506a
\ No newline at end of file
diff --git a/Data/Surgical Instruments/Scalpel/Scalpel_Hull_Subdivided.stl.sha512 b/Data/Surgical Instruments/Scalpel/Scalpel_Hull_Subdivided.stl.sha512
new file mode 100644
index 0000000000000000000000000000000000000000..030e837addcc86ed1ea53f3c23a4672e725fe622
--- /dev/null
+++ b/Data/Surgical Instruments/Scalpel/Scalpel_Hull_Subdivided.stl.sha512	
@@ -0,0 +1 @@
+43595d92c9f570a2a35f1bde65239335efc4ffb5625bd3416e0d5023b7e07b34f8e430e1d09c986a05cb8cdfc35e58d1813e969eed685b72f9865eaade52e1e0
\ No newline at end of file
diff --git a/Examples/Interactions/LevelSet-Rigid/LevelSet-RigidInteractionExample.cpp b/Examples/Interactions/LevelSet-Rigid/LevelSet-RigidInteractionExample.cpp
index 1b0360d8396cf4013dcd7adb7a26f704bb35384a..199f61cf451381135995bb6cb7a66e82b0eddb20 100644
--- a/Examples/Interactions/LevelSet-Rigid/LevelSet-RigidInteractionExample.cpp
+++ b/Examples/Interactions/LevelSet-Rigid/LevelSet-RigidInteractionExample.cpp
@@ -24,6 +24,7 @@
 #include "imstkHapticDeviceClient.h"
 #include "imstkHapticDeviceManager.h"
 #include "imstkImageData.h"
+#include "imstkIsometricMap.h"
 #include "imstkKeyboardSceneControl.h"
 #include "imstkLevelSetCH.h"
 #include "imstkLevelSetDeformableObject.h"
@@ -56,13 +57,14 @@ using namespace imstk::expiremental;
 /// \brief Creates a level set obj (poly rendering)
 ///
 std::shared_ptr<LevelSetDeformableObject>
-makeLevelsetObj(const std::string& name, std::shared_ptr<LocalMarchingCubes> isoExtract)
+makeLevelsetObj(const std::string& name, std::shared_ptr<LocalMarchingCubes> isoExtract, std::unordered_set<int>& chunksGenerated)
 {
     imstkNew<LevelSetDeformableObject> levelsetObj(name);
 
     std::shared_ptr<ImageData> initLvlsetImage = MeshIO::read<ImageData>(iMSTK_DATA_ROOT "/legs/femurBone_SDF.nii")->cast(IMSTK_DOUBLE);
     const Vec3d&               currSpacing     = initLvlsetImage->getSpacing();
-    initLvlsetImage->setSpacing(currSpacing * 0.001); // note: Anisotropic scaling invalidates SDF
+    // Note: Anistropic scaling would invalidate the SDF
+    initLvlsetImage->setSpacing(currSpacing * 0.001);
     initLvlsetImage->setOrigin(Vec3d(0.0, 0.8, 1.5));
 
     // Setup the Parameters
@@ -76,27 +78,35 @@ makeLevelsetObj(const std::string& name, std::shared_ptr<LocalMarchingCubes> iso
     model->setModelGeometry(initLvlsetImage);
     model->configure(lvlSetConfig);
 
+    // Too many chunks and you'll hit memory constraints quickly
+    // Too little chunks and the updates for a chunk will take too long
+    // The chunks must divide the image dimensions (image dim-1 must be divisible by # chunks)
     isoExtract->setInputImage(initLvlsetImage);
     isoExtract->setIsoValue(0.0);
-    isoExtract->setNumberOfChunks(Vec3i(16, 9, 9)); // Image dim-1 must be divisible by # chunks
+    isoExtract->setNumberOfChunks(Vec3i(32, 9, 9));
     isoExtract->update();
 
     srand(time(NULL));
 
-    for (int i = 0; i < 9 * 9 * 16; i++)
+    const Vec3i& numChunks = isoExtract->getNumberOfChunks();
+    for (int i = 0; i < numChunks[0] * numChunks[1] * numChunks[2]; i++)
     {
-        imstkNew<VisualModel>    surfMeshModel(isoExtract->getOutput(i));
-        imstkNew<RenderMaterial> material;
-        material->setDisplayMode(RenderMaterial::DisplayMode::Surface);
-        material->setLineWidth(4.0);
-        //material->setPointSize(0.001);
-        const double r = (rand() % 500) / 500.0;
-        const double g = (rand() % 500) / 500.0;
-        const double b = (rand() % 500) / 500.0;
-        material->setColor(Color(r, g, b));
-        material->setEdgeColor(Color::Color::Orange);
-        surfMeshModel->setRenderMaterial(material);
-        levelsetObj->addVisualModel(surfMeshModel);
+        auto surfMesh = std::dynamic_pointer_cast<SurfaceMesh>(isoExtract->getOutput(i));
+        if (surfMesh->getNumVertices() > 0 && chunksGenerated.count(i) == 0)
+        {
+            imstkNew<VisualModel>    surfMeshModel(isoExtract->getOutput(i));
+            imstkNew<RenderMaterial> material;
+            material->setDisplayMode(RenderMaterial::DisplayMode::Surface);
+            material->setLineWidth(4.0);
+            const double r = (rand() % 500) / 500.0;
+            const double g = (rand() % 500) / 500.0;
+            const double b = (rand() % 500) / 500.0;
+            material->setColor(Color(r, g, b));
+            material->setEdgeColor(Color::Color::Orange);
+            surfMeshModel->setRenderMaterial(material);
+            levelsetObj->addVisualModel(surfMeshModel);
+            chunksGenerated.insert(i);
+        }
     }
 
     // Setup the Object
@@ -124,26 +134,44 @@ makeRigidObj(const std::string& name)
     imstkNew<RigidObject2> rigidObj("Cube");
 
     {
-        auto toolMesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/Surgical Instruments/Scalpel/Scalpel_Blade10_Hull.stl");
+        auto toolMesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/Surgical Instruments/Scalpel/Scalpel_Hull_Subdivided.stl");
         toolMesh->rotate(Vec3d(0.0, 1.0, 0.0), 3.14, Geometry::TransformType::ApplyToData);
         toolMesh->rotate(Vec3d(1.0, 0.0, 0.0), -1.57, Geometry::TransformType::ApplyToData);
         toolMesh->scale(Vec3d(0.07, 0.07, 0.07), Geometry::TransformType::ApplyToData);
 
-        imstkNew<VisualModel>    visualModel(toolMesh);
-        imstkNew<RenderMaterial> mat;
-        mat->setDisplayMode(RenderMaterial::DisplayMode::Surface);
-        mat->setShadingModel(RenderMaterial::ShadingModel::PBR);
-        mat->setMetalness(0.9f);
-        mat->setRoughness(0.4f);
-        //mat->setDisplayMode(RenderMaterial::DisplayMode::Points);
-        //mat->setPointSize(15.0);
-        mat->setDiffuseColor(Color(0.7, 0.7, 0.7));
-        visualModel->setRenderMaterial(mat);
+        auto toolVisualMeshHandle = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/Surgical Instruments/Scalpel/Scalpel_Handle.dae");
+        toolVisualMeshHandle->rotate(Vec3d(0.0, 1.0, 0.0), 3.14, Geometry::TransformType::ApplyToData);
+        toolVisualMeshHandle->rotate(Vec3d(1.0, 0.0, 0.0), -1.57, Geometry::TransformType::ApplyToData);
+        toolVisualMeshHandle->scale(Vec3d(0.07, 0.07, 0.07), Geometry::TransformType::ApplyToData);
+
+        auto toolVisualMeshBlade = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/Surgical Instruments/Scalpel/Scalpel_Blade10.dae");
+        toolVisualMeshBlade->rotate(Vec3d(0.0, 1.0, 0.0), 3.14, Geometry::TransformType::ApplyToData);
+        toolVisualMeshBlade->rotate(Vec3d(1.0, 0.0, 0.0), -1.57, Geometry::TransformType::ApplyToData);
+        toolVisualMeshBlade->scale(Vec3d(0.07, 0.07, 0.07), Geometry::TransformType::ApplyToData);
+
+        imstkNew<RenderMaterial> toolMaterial;
+        toolMaterial->setDisplayMode(RenderMaterial::DisplayMode::Surface);
+        toolMaterial->setShadingModel(RenderMaterial::ShadingModel::PBR);
+        toolMaterial->setMetalness(0.9f);
+        toolMaterial->setRoughness(0.4f);
+        //toolMaterial->setDisplayMode(RenderMaterial::DisplayMode::Points);
+        //toolMaterial->setPointSize(15.0);
+        toolMaterial->setDiffuseColor(Color(0.7, 0.7, 0.7));
+
+        imstkNew<VisualModel> visualModel1(toolVisualMeshHandle);
+        visualModel1->setRenderMaterial(toolMaterial);
+        rigidObj->addVisualModel(visualModel1);
+
+        imstkNew<VisualModel> visualModel2(toolVisualMeshBlade);
+        visualModel2->setRenderMaterial(toolMaterial);
+        rigidObj->addVisualModel(visualModel2);
 
         // Create the object
-        rigidObj->addVisualModel(visualModel);
         rigidObj->setPhysicsGeometry(toolMesh);
         rigidObj->setCollidingGeometry(toolMesh);
+        rigidObj->setPhysicsToVisualMap(std::make_shared<IsometricMap>(toolMesh, toolVisualMeshHandle));
+        // Hack to add two maps
+        rigidObj->setPhysicsToCollidingMap(std::make_shared<IsometricMap>(toolMesh, toolVisualMeshBlade));
         rigidObj->setDynamicalModel(rbdModel);
         rigidObj->getRigidBody()->m_mass = 1000.0;
         //rigidObj->getRigidBody()->setInertiaFromPointSet(toolMesh, 0.01, false);
@@ -154,7 +182,9 @@ makeRigidObj(const std::string& name)
 }
 
 ///
-/// \brief This example demonstrates evolution of a levelset
+/// \brief This example demonstrates cutting a femur bone with a tool
+/// Some of the example parameters may need to be tweaked for differing
+/// systems
 ///
 int
 main()
@@ -165,7 +195,8 @@ main()
     imstkNew<Scene> scene("FemurCut");
 
     std::shared_ptr<LocalMarchingCubes>       isoExtract = std::make_shared<LocalMarchingCubes>();
-    std::shared_ptr<LevelSetDeformableObject> lvlSetObj  = makeLevelsetObj("LevelSetObj", isoExtract);
+    std::unordered_set<int>                   chunksGenerated; // Lazy generation of chunks
+    std::shared_ptr<LevelSetDeformableObject> lvlSetObj = makeLevelsetObj("LevelSetObj", isoExtract, chunksGenerated);
     scene->addSceneObject(lvlSetObj);
 
     std::shared_ptr<RigidObject2> rbdObj = makeRigidObj("RigidObj");
@@ -186,7 +217,7 @@ main()
     colHandlerA->setStiffness(0.0); // inelastic collision
     auto colHandlerB = std::dynamic_pointer_cast<LevelSetCH>(interaction->getCollisionHandlingB());
     colHandlerB->setLevelSetVelocityScaling(0.1);
-    colHandlerB->setKernel(5, 1.0);
+    colHandlerB->setKernel(3, 1.0);
     //colHandlerB->setLevelSetVelocityScaling(0.0); // Can't push the levelset
     colHandlerB->setUseProportionalVelocity(false);
     scene->getCollisionGraph()->addInteraction(interaction);
@@ -247,7 +278,30 @@ main()
         });
         connect<Event>(viewer, EventType::PreUpdate, [&](Event*)
         {
+            // Update any chunks that contain a voxel which was set modified
             isoExtract->update();
+
+            // Create meshes for chunks if they now contain vertices (and weren't already generated)
+            const Vec3i& numChunks = isoExtract->getNumberOfChunks();
+            for (int i = 0; i < numChunks[0] * numChunks[1] * numChunks[2]; i++)
+            {
+                auto surfMesh = std::dynamic_pointer_cast<SurfaceMesh>(isoExtract->getOutput(i));
+                if (surfMesh->getNumVertices() > 0 && chunksGenerated.count(i) == 0)
+                {
+                    imstkNew<VisualModel> surfMeshModel(isoExtract->getOutput(i));
+                    imstkNew<RenderMaterial> material;
+                    material->setDisplayMode(RenderMaterial::DisplayMode::Surface);
+                    material->setLineWidth(4.0);
+                    const double r = (rand() % 500) / 500.0;
+                    const double g = (rand() % 500) / 500.0;
+                    const double b = (rand() % 500) / 500.0;
+                    material->setColor(Color(r, g, b));
+                    material->setEdgeColor(Color::Color::Orange);
+                    surfMeshModel->setRenderMaterial(material);
+                    lvlSetObj->addVisualModel(surfMeshModel);
+                    chunksGenerated.insert(i);
+                }
+            }
         });
         connect<Event>(sceneManager, EventType::PostUpdate, [&](Event*)
         {
diff --git a/Examples/OpenVRController/OpenVRControllerExample.cpp b/Examples/OpenVRController/OpenVRControllerExample.cpp
index ed7d017bd4583e60c590190f30ae6917db49c5ed..166c86cbc109cf8322502e2d2911061cb48f8b00 100644
--- a/Examples/OpenVRController/OpenVRControllerExample.cpp
+++ b/Examples/OpenVRController/OpenVRControllerExample.cpp
@@ -42,7 +42,7 @@ std::shared_ptr<SceneObject>
 makeHandleObject()
 {
     imstkNew<SceneObject> scalpelHandle("ScalpelHandle");
-    auto                  toolHandleMesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/Surgical Instruments/Scalpel/Scalpel_Handle.obj");
+    auto                  toolHandleMesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/Surgical Instruments/Scalpel/Scalpel_Handle.dae");
     toolHandleMesh->translate(0.0, 0.0, 1.0, Geometry::TransformType::ApplyToData);
     toolHandleMesh->rotate(Vec3d(0.0, 1.0, 0.0), 3.14, Geometry::TransformType::ApplyToData);
     toolHandleMesh->rotate(Vec3d(1.0, 0.0, 0.0), -1.57, Geometry::TransformType::ApplyToData);
@@ -68,7 +68,7 @@ std::shared_ptr<SceneObject>
 makeBlade(std::string filename)
 {
     imstkNew<SceneObject> scalpelBlade(filename);
-    auto                  blade10Mesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/Surgical Instruments/Scalpel/" + filename + ".obj");
+    auto                  blade10Mesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/Surgical Instruments/Scalpel/" + filename + ".dae");
     blade10Mesh->translate(0.0, 0.0, 1.0, Geometry::TransformType::ApplyToData);
     blade10Mesh->rotate(Vec3d(0.0, 1.0, 0.0), 3.14, Geometry::TransformType::ApplyToData);
     blade10Mesh->rotate(Vec3d(1.0, 0.0, 0.0), -1.57, Geometry::TransformType::ApplyToData);
diff --git a/Source/Controllers/imstkRigidObjectController.cpp b/Source/Controllers/imstkRigidObjectController.cpp
index 14fde7296fe5c635b98f520de0237e455aad9e42..0b728cd1c55b50629a098438f3a97dde6c1abde6 100644
--- a/Source/Controllers/imstkRigidObjectController.cpp
+++ b/Source/Controllers/imstkRigidObjectController.cpp
@@ -132,9 +132,32 @@ RigidObjectController::applyForces()
         // Apply force back to device
         if (m_rigidObject != nullptr && m_useSpring)
         {
-            // Render only the spring force (not the other forces the body has)
-            const Vec3d force = fS * m_forceScaling;
-            m_deviceClient->setForce(-force);
+            const Vec3d force = -fS * m_forceScaling;
+            if (m_forceSmoothening)
+            {
+                m_forces.push_back(force);
+                if (m_forces.size() > m_smoothingKernelSize)
+                {
+                    m_forces.pop_front();
+                }
+
+                Vec3d avgForce = Vec3d(0.0, 0.0, 0.0);
+                int   count    = 0;
+                for (auto i : m_forces)
+                {
+                    avgForce += i;
+                    count++;
+                }
+                avgForce /= count;
+
+                // Render only the spring force (not the other forces the body has)
+                m_deviceClient->setForce(avgForce);
+            }
+            else
+            {
+                // Render only the spring force (not the other forces the body has)
+                m_deviceClient->setForce(force);
+            }
         }
     }
     else
diff --git a/Source/Controllers/imstkRigidObjectController.h b/Source/Controllers/imstkRigidObjectController.h
index c3921d40e5ef42385169c42be9ae5f36981c9a79..5e984cb9f4c2077667a80d4da554ad9e024f0760 100644
--- a/Source/Controllers/imstkRigidObjectController.h
+++ b/Source/Controllers/imstkRigidObjectController.h
@@ -91,6 +91,20 @@ public:
     bool getUseSpring() const { return m_useSpring; }
     void setUseSpring(const bool useSpring) { m_useSpring = useSpring; }
 
+    ///
+    /// \brief Set/Get whether to use force smoothening
+    /// Force smoothening averages the force used on the device over kernel size
+    ///
+    bool getUseForceSmoothening() const { return m_forceSmoothening; }
+    void setUseForceSmoothening(const bool useForceSmoothening) { m_forceSmoothening = useForceSmoothening; }
+
+    ///
+    /// \brief Set/Get the kernel size
+    /// \todo: Vary with dt as performance of program will effect the size/number of samples
+    ///
+    int getSmoothingKernelSize() const { return m_smoothingKernelSize; }
+    void setSmoothingKernelSize(const int kernelSize) { m_smoothingKernelSize = kernelSize; }
+
 public:
     ///
     /// \brief Update controlled scene object using latest tracking information
@@ -104,6 +118,7 @@ public:
 
 protected:
     std::shared_ptr<RigidObject2> m_rigidObject;
+    std::deque<Vec3d> m_forces;
 
     double m_linearKd  = 10000.0;                                ///> Damping coefficient, linear
     double m_angularKd = 300.0;                                  ///> Damping coefficient, rotational
@@ -115,6 +130,9 @@ protected:
 
     double m_forceScaling = 0.0000075;
     bool   m_useSpring    = true; ///> Controller has ability to toggle to from springs
+
+    bool m_forceSmoothening    = true;
+    int  m_smoothingKernelSize = 25;
 };
 }
 }
diff --git a/Source/DynamicalModels/ObjectModels/imstkLevelSetModel.cpp b/Source/DynamicalModels/ObjectModels/imstkLevelSetModel.cpp
index e955ffc462cbf5c5b829201ff458f11ee252033f..b520cd84c35b49c6bfd280303108f4feea1d8466 100644
--- a/Source/DynamicalModels/ObjectModels/imstkLevelSetModel.cpp
+++ b/Source/DynamicalModels/ObjectModels/imstkLevelSetModel.cpp
@@ -43,7 +43,7 @@ LevelSetModel::LevelSetModel()
     };
 
     // By default the level set defines a function for evolving the distances, this can be removed in subclasses
-    m_evolveQuantitiesNodes.push_back(std::make_shared<TaskNode>(std::bind(&LevelSetModel::evolveDistanceField, this), "Evolve Distances"));
+    m_evolveQuantitiesNodes.push_back(std::make_shared<TaskNode>(std::bind(&LevelSetModel::evolve, this), "Evolve Distances"));
     m_taskGraph->addNode(m_evolveQuantitiesNodes.back());
     /// are all quantities evolved the same but with different force functions?
 }
@@ -109,14 +109,12 @@ LevelSetModel::configure(std::shared_ptr<LevelSetModelConfig> config)
 }
 
 void
-LevelSetModel::evolveDistanceField()
+LevelSetModel::evolve()
 {
     auto         sdf       = std::dynamic_pointer_cast<SignedDistanceField>(m_mesh);
     auto         imageData = std::dynamic_pointer_cast<ImageData>(sdf->getImage());
     double*      imgPtr    = static_cast<double*>(imageData->getVoidPointer());
     const Vec3i& dim       = imageData->getDimensions();
-    //const Vec3d& spacing   = imageData->getSpacing();
-    //const Vec3d& origin    = imageData->getOrigin();
     const double dt = m_config->m_dt;
     //const double k  = m_config->m_k;
 
diff --git a/Source/DynamicalModels/ObjectModels/imstkLevelSetModel.h b/Source/DynamicalModels/ObjectModels/imstkLevelSetModel.h
index 01e2aae8d138193097bb033141bc7085ca00993a..7bae77b492198c970e8d18c3076b07b2170882a2 100644
--- a/Source/DynamicalModels/ObjectModels/imstkLevelSetModel.h
+++ b/Source/DynamicalModels/ObjectModels/imstkLevelSetModel.h
@@ -83,7 +83,7 @@ public:
     ///
     void configure(std::shared_ptr<LevelSetModelConfig> config);
 
-    virtual void evolveDistanceField();
+    virtual void evolve();
 
     void addImpulse(const Vec3i& coord, double f);
     void setImpulse(const Vec3i& coord, double f);
diff --git a/Source/GeometryMappers/imstkIsometricMap.cpp b/Source/GeometryMappers/imstkIsometricMap.cpp
index 9252f25a4a55b3143264ef20ca3ad3062196a216..d2b44f5524c5d76bf5d99be0902a0b6125024cc3 100644
--- a/Source/GeometryMappers/imstkIsometricMap.cpp
+++ b/Source/GeometryMappers/imstkIsometricMap.cpp
@@ -41,23 +41,6 @@ IsometricMap::apply()
         return;
     }
 
-    // Set the follower mesh configuration to that of master
-    m_slave->setTranslation(m_master->getTranslation());
-    m_slave->setRotation(m_master->getRotation());
-
-    // Apply the offset transform
-    m_slave->transform(m_rigidTransform.matrix());
-}
-
-void
-IsometricMap::setTransform(const RigidTransform3d& affineTransform)
-{
-    m_rigidTransform = affineTransform;
-}
-
-const RigidTransform3d&
-IsometricMap::getTransform() const
-{
-    return m_rigidTransform;
+    m_slave->setTransform(m_master->getTransform());
 }
 } // imstk
diff --git a/Source/GeometryMappers/imstkIsometricMap.h b/Source/GeometryMappers/imstkIsometricMap.h
index f097b17fb7d5d9243942cbf249c1168e7b2c6c89..d5fe48cc9c263ea06e6f4ae9ec67866db42d5e34 100644
--- a/Source/GeometryMappers/imstkIsometricMap.h
+++ b/Source/GeometryMappers/imstkIsometricMap.h
@@ -39,22 +39,20 @@ public:
     /// \brief Constructor
     ///
     IsometricMap() :
-        GeometryMap(GeometryMap::Type::Isometric),
-        m_rigidTransform(RigidTransform3d::Identity())
-    {}
+        GeometryMap(GeometryMap::Type::Isometric)
+    { }
 
     ///
     /// \brief Constructor
     ///
     IsometricMap(std::shared_ptr<Geometry> master, std::shared_ptr<Geometry> slave) :
-        GeometryMap(master, slave, GeometryMap::Type::Isometric),
-        m_rigidTransform(RigidTransform3d::Identity())
-    {}
+        GeometryMap(master, slave, GeometryMap::Type::Isometric)
+    { }
 
     ///
     /// \brief Destructor
     ///
-    ~IsometricMap() = default;
+    ~IsometricMap() override = default;
 
     ///
     /// \brief Compute the map
@@ -72,20 +70,6 @@ public:
     inline bool isValid() const override
     {
         return true;
-    };
-
-    ///
-    /// \brief Set the transform
-    ///
-    void setTransform(const RigidTransform3d& affineTransform);
-
-    ///
-    /// \brief Get the transform
-    ///
-    const RigidTransform3d& getTransform() const;
-
-protected:
-
-    RigidTransform3d m_rigidTransform; ///> Rigid transform
+    }
 };
 } // imstk
diff --git a/Source/MeshIO/imstkMeshIO.cpp b/Source/MeshIO/imstkMeshIO.cpp
index adb53e471231d1af1bef5c04b788edb9194ebc2e..66419456bf554153958fbe50a28f1eba4e22b9ba 100644
--- a/Source/MeshIO/imstkMeshIO.cpp
+++ b/Source/MeshIO/imstkMeshIO.cpp
@@ -28,6 +28,7 @@
 #include "imstkVegaMeshIO.h"
 #include "imstkVTKMeshIO.h"
 
+#include <cctype>
 #include <sys/stat.h>
 #include <unordered_map>
 
diff --git a/Source/SceneEntities/Objects/imstkDynamicObject.cpp b/Source/SceneEntities/Objects/imstkDynamicObject.cpp
index a7af8bc391c74d4c2c2a93db8a85d3088817cbe7..fe6ed4453256d6348ef975ec739ed2c8a5ed7f8e 100644
--- a/Source/SceneEntities/Objects/imstkDynamicObject.cpp
+++ b/Source/SceneEntities/Objects/imstkDynamicObject.cpp
@@ -67,6 +67,7 @@ DynamicObject::updatePhysicsGeometry()
     if (m_physicsToCollidingGeomMap)
     {
         m_physicsToCollidingGeomMap->apply();
+        m_physicsToCollidingGeomMap->getSlave()->modified();
     }
 
     if (m_physicsGeometry != nullptr)