diff --git a/Base/Collision/CMakeLists.txt b/Base/Collision/CMakeLists.txt
index 5322eb1b193f659ba3f65c0168bb259e7a952272..b7aafdff75390daf58e7008c9dab557a3cd3db86 100644
--- a/Base/Collision/CMakeLists.txt
+++ b/Base/Collision/CMakeLists.txt
@@ -7,6 +7,7 @@ imstk_add_library( Collision
     SCCD
     Geometry
     SceneElements
+    DynamicalModels
   )
 
 #-----------------------------------------------------------------------------
diff --git a/Base/Collision/CollisionHandling/imstkPickingCH.h b/Base/Collision/CollisionHandling/imstkPickingCH.h
index 88113eba1e36bb98674a442d875677e8032dae26..2465706ef8dfac5b1cbd83f24210df8659674f64 100644
--- a/Base/Collision/CollisionHandling/imstkPickingCH.h
+++ b/Base/Collision/CollisionHandling/imstkPickingCH.h
@@ -71,6 +71,7 @@ public:
     ///
     void addPickConstraints(std::shared_ptr<DeformableObject> deformableObj);
 
+    ///
     /// \brief Get the vector denoting the filter
     ///
     void setDynamicLinearProjectors(std::vector<LinearProjectionConstraint>* f)
@@ -78,6 +79,7 @@ public:
         m_DynamicLinearProjConstraints = f;
     }
 
+    ///
     /// \brief Get the vector denoting the filter
     ///
     std::vector<LinearProjectionConstraint>& getDynamicLinearProjectors()
diff --git a/Examples/Sandbox/main.cpp b/Examples/Sandbox/main.cpp
index 15b3441535d02e203de6acb89ce6db55fbe9b07f..b96ed3cc820d90d79a4baf9b2f6f3cd8ae4fc48e 100644
--- a/Examples/Sandbox/main.cpp
+++ b/Examples/Sandbox/main.cpp
@@ -32,6 +32,7 @@
 // Objects
 #include "imstkForceModelConfig.h"
 #include "imstkFEMDeformableBodyModel.h"
+#include "imstkDynamicObject.h"
 #include "imstkDeformableObject.h"
 #include "imstkSceneObject.h"
 #include "imstkLight.h"
@@ -77,6 +78,7 @@
 #include "imstkVirtualCouplingCH.h"
 #include "imstkMeshToSpherePickingCD.h"
 #include "imstkPickingCH.h"
+#include "imstkBoneDrillingCH.h"
 
 // logger
 #include "g3log/g3log.hpp"
@@ -133,6 +135,7 @@ void testCapsule();
 void testVirtualCoupling();
 void testGeometryTransforms();
 void testPicking();
+void testBoneDrilling();
 
 int main()
 {
@@ -204,6 +207,7 @@ int main()
     //testScenesManagement();
     //testVectorPlotters();
     //testVirtualCoupling();
+    testBoneDrilling();
 
 
     return 0;
@@ -2577,6 +2581,7 @@ void testGeometryTransforms()
     sdk->startSimulation(false);
 }
 
+
 void testPicking()
 {
     // SDK and Scene
@@ -2587,7 +2592,7 @@ void testPicking()
     // Create plane visual scene object
     //----------------------------------------------------------
     auto planeObj = apiutils::createVisualAnalyticalSceneObject(
-    imstk::Geometry::Type::Plane, scene, "VisualPlane", 100, Vec3d(0., -20., 0.));
+        imstk::Geometry::Type::Plane, scene, "VisualPlane", 100, Vec3d(0., -20., 0.));
 
     //----------------------------------------------------------
     // Create Nidus FE deformable scene object
@@ -2705,3 +2710,70 @@ void testPicking()
     sdk->setCurrentScene(scene);
     sdk->startSimulation(true);
 }
+
+
+void testBoneDrilling()
+{
+    // SDK and Scene
+    auto sdk = std::make_shared<imstk::SimulationManager>();
+    auto scene = sdk->createNewScene("BoneDrilling");
+
+    // Add virtual coupling object in the scene.
+#ifdef iMSTK_USE_OPENHAPTICS
+
+    // Device clients
+    auto client = std::make_shared<imstk::HDAPIDeviceClient>("Default Device");
+
+    // Device Server
+    auto server = std::make_shared<imstk::HDAPIDeviceServer>();
+    server->addDeviceClient(client);
+    sdk->addModule(server);
+
+    // Device tracker
+    auto deviceTracker = std::make_shared<imstk::DeviceTracker>(client);
+
+    // Create bone scene object
+    // Load the mesh
+    auto tetMesh = imstk::MeshIO::read(iMSTK_DATA_ROOT"/asianDragon/asianDragon.veg");
+    if (!tetMesh)
+    {
+        LOG(WARNING) << "Could not read mesh from file.";
+        return;
+    }
+    auto bone = std::make_shared<CollidingObject>("Bone");
+    bone->setCollidingGeometry(tetMesh);
+    bone->setVisualGeometry(tetMesh);
+    scene->addSceneObject(bone);
+
+    // Create a virtual coupling object: Drill
+    auto drillVisualGeom = std::make_shared<imstk::Sphere>();
+    drillVisualGeom->setRadius(3.);
+    auto drillCollidingGeom = std::make_shared<imstk::Sphere>();
+    drillCollidingGeom->setRadius(3.);
+    auto drill = std::make_shared<CollidingObject>("Drill");
+    drill->setCollidingGeometry(drillCollidingGeom);
+    drill->setVisualGeometry(drillVisualGeom);
+    scene->addSceneObject(drill);
+
+    // Create and add virtual coupling object controller in the scene
+    auto objController = std::make_shared<imstk::SceneObjectController>(drill, deviceTracker);
+    scene->addObjectController(objController);
+
+    // Create a collision graph
+    auto graph = scene->getCollisionGraph();
+    auto pair = graph->addInteractionPair(bone,
+                                          drill,
+                                          CollisionDetection::Type::MeshToSphere,
+                                          CollisionHandling::Type::BoneDrilling,
+                                          CollisionHandling::Type::None);
+
+#endif
+
+    //Run
+    auto cam = scene->getCamera();
+    cam->setPosition(imstk::Vec3d(0, 0, 15));
+
+    sdk->setCurrentScene(scene);
+    sdk->startSimulation(false);
+}
+