diff --git a/Base/Core/imstkLogUtility.cpp b/Base/Core/imstkLogger.cpp
similarity index 98%
rename from Base/Core/imstkLogUtility.cpp
rename to Base/Core/imstkLogger.cpp
index 0e8b94f79cc36f5a1c3312ac4e030897a4710218..e4b63d873c4f029e82f5373f357c5d5d1beca2d0 100644
--- a/Base/Core/imstkLogUtility.cpp
+++ b/Base/Core/imstkLogger.cpp
@@ -19,7 +19,7 @@
 
    =========================================================================*/
 
-#include "imstkLogUtility.h"
+#include "imstkLogger.h"
 
 namespace imstk {
 stdSink::FG_Color
diff --git a/Base/Core/imstkLogUtility.h b/Base/Core/imstkLogger.h
similarity index 100%
rename from Base/Core/imstkLogUtility.h
rename to Base/Core/imstkLogger.h
diff --git a/Base/Core/imstkModule.h b/Base/Core/imstkModule.h
index f6a743db722cf2ec11caeeebea3a83e99e8bac24..1ea938f8581424edbfd6f061860950b8003b550d 100644
--- a/Base/Core/imstkModule.h
+++ b/Base/Core/imstkModule.h
@@ -26,7 +26,9 @@
 #include <thread>
 #include <atomic>
 
-namespace imstk {
+namespace imstk 
+{
+
 enum class ModuleStatus
 {
     STARTING,
diff --git a/Base/Devices/imstkVRPNDeviceServer.h b/Base/Devices/imstkVRPNDeviceServer.h
index 12585100fe1022fbc69b2e6cfca16affffbfd81e..48d8901f2eb5bd7caf761efb87a53ed2a8f952b9 100644
--- a/Base/Devices/imstkVRPNDeviceServer.h
+++ b/Base/Devices/imstkVRPNDeviceServer.h
@@ -32,7 +32,8 @@
 #include "imstkModule.h"
 #include "imstkVRPNDeviceClient.h"
 
-namespace imstk {
+namespace imstk 
+{
 
 enum class DeviceType
 {
diff --git a/Base/Geometry/Map/imstkGeometryMap.h b/Base/Geometry/Map/imstkGeometryMap.h
index fd141857be6d3ac4e4439ea338ffc638b76172bd..fb67f1b65709433f86ba1b0e6907de61fd1cfc06 100644
--- a/Base/Geometry/Map/imstkGeometryMap.h
+++ b/Base/Geometry/Map/imstkGeometryMap.h
@@ -28,7 +28,8 @@
 #include "imstkGeometry.h"
 #include "g3log/g3log.hpp"
 
-namespace imstk {
+namespace imstk
+{
 
 ///
 /// \class GeometryMap
diff --git a/Base/Geometry/Map/imstkTetraTriangleMap.cpp b/Base/Geometry/Map/imstkTetraTriangleMap.cpp
index 9613ab3a5a82198477f6c3ae3f1ae68ee397a887..056473b36962ff41f80e3ddd19f395c56747f513 100644
--- a/Base/Geometry/Map/imstkTetraTriangleMap.cpp
+++ b/Base/Geometry/Map/imstkTetraTriangleMap.cpp
@@ -64,7 +64,7 @@ TetraTriangleMap::compute()
 void
 TetraTriangleMap::apply()
 {
-    // Check Map active
+    // Check if map is active
     if (!m_isActive)
     {
         LOG(WARNING) << "TetraTriangle map is not active";
diff --git a/Base/Geometry/Reader/imstkMeshReader.cpp b/Base/Geometry/Reader/imstkMeshReader.cpp
index c56d2301e3135eb10c9270e76d7600c0999461c3..c41f124dc23278759af2dd4385c1c505c6754131 100644
--- a/Base/Geometry/Reader/imstkMeshReader.cpp
+++ b/Base/Geometry/Reader/imstkMeshReader.cpp
@@ -38,18 +38,18 @@ MeshReader::read(const std::string& filePath)
         return nullptr;
     }
 
-    FileType meshType = MeshReader::getFileType(filePath);
+    MeshFileType meshType = MeshReader::getFileType(filePath);
     switch (meshType)
     {
-    case FileType::VTK :
-    case FileType::VTU :
-    case FileType::VTP :
-    case FileType::STL :
-    case FileType::PLY :
-    case FileType::OBJ :
+    case MeshFileType::VTK :
+    case MeshFileType::VTU :
+    case MeshFileType::VTP :
+    case MeshFileType::STL :
+    case MeshFileType::PLY :
+    case MeshFileType::OBJ :
         return VTKMeshReader::read(filePath, meshType);
         break;
-    case FileType::VEG :
+    case MeshFileType::VEG :
         return VegaMeshReader::read(filePath, meshType);
         break;
     }
@@ -65,10 +65,10 @@ MeshReader::fileExists(const std::string& file)
     return (stat(file.c_str(), &buf) == 0);
 }
 
-const MeshReader::FileType
+const MeshFileType
 MeshReader::getFileType(const std::string& filePath)
 {
-    FileType meshType = FileType::UNKNOWN;
+    MeshFileType meshType = MeshFileType::UNKNOWN;
 
     std::string extString = filePath.substr(filePath.find_last_of(".") + 1);
     if (extString.empty())
@@ -79,31 +79,31 @@ MeshReader::getFileType(const std::string& filePath)
 
     if (extString == "vtk" || extString == "VTK")
     {
-        meshType = FileType::VTK;
+        meshType = MeshFileType::VTK;
     }
     else if (extString == "vtp" || extString == "VTP")
     {
-        meshType = FileType::VTP;
+        meshType = MeshFileType::VTP;
     }
     else if (extString == "vtu" || extString == "VTU")
     {
-        meshType = FileType::VTU;
+        meshType = MeshFileType::VTU;
     }
     else if (extString == "obj" || extString == "OBJ")
     {
-        meshType = FileType::OBJ;
+        meshType = MeshFileType::OBJ;
     }
     else if (extString == "stl" || extString == "STL")
     {
-        meshType = FileType::STL;
+        meshType = MeshFileType::STL;
     }
     else if (extString == "ply" || extString == "PLY")
     {
-        meshType = FileType::PLY;
+        meshType = MeshFileType::PLY;
     }
     else if (extString == "veg" || extString == "VEG")
     {
-        meshType = FileType::VEG;
+        meshType = MeshFileType::VEG;
     }
     else
     {
diff --git a/Base/Geometry/Reader/imstkMeshReader.h b/Base/Geometry/Reader/imstkMeshReader.h
index 20d801d1ecdf900328cc9f585e1e316e54ea32ff..b8f6afb3f7223e5eb238e03ad0c4abadd27698a0 100644
--- a/Base/Geometry/Reader/imstkMeshReader.h
+++ b/Base/Geometry/Reader/imstkMeshReader.h
@@ -30,43 +30,45 @@
 
 namespace imstk {
 
+enum MeshFileType
+{
+    UNKNOWN,
+    VTK,
+    VTU,
+    VTP,
+    STL,
+    PLY,
+    OBJ,
+    VEG
+};
+
 ///
 /// \class MeshReader
 ///
-/// \brief
+/// \brief Mesh data reader
 ///
 class MeshReader
 {
 public:
 
-    enum FileType
-    {
-        UNKNOWN,
-        VTK,
-        VTU,
-        VTP,
-        STL,
-        PLY,
-        OBJ,
-        VEG
-    };
-
     MeshReader() = default;
     ~MeshReader() = default;
 
     ///
-    /// \brief read
+    /// \brief Read external file
     ///
     static std::shared_ptr<Mesh> read(const std::string& filePath);
 
     ///
-    /// \brief fileExists
+    /// \brief Returns true if the file exists, else false
     ///
     static bool fileExists(const std::string& file);
 
 protected:
-
-    static const FileType getFileType(const std::string& filePath);
+    ///
+    /// \brief Returns the type of the file
+    ///
+    static const MeshFileType getFileType(const std::string& filePath);
 
 };
 }
diff --git a/Base/Geometry/Reader/imstkVTKMeshReader.cpp b/Base/Geometry/Reader/imstkVTKMeshReader.cpp
index 04ad2dcf4393549013bb12c8e554e4e120c99d27..dbc7c18fdefb7c12e987c3ee6d84848cfaa7e88d 100644
--- a/Base/Geometry/Reader/imstkVTKMeshReader.cpp
+++ b/Base/Geometry/Reader/imstkVTKMeshReader.cpp
@@ -34,36 +34,36 @@
 
 namespace imstk {
 std::shared_ptr<Mesh>
-VTKMeshReader::read(const std::string& filePath, MeshReader::FileType meshType)
+VTKMeshReader::read(const std::string& filePath, MeshFileType meshType)
 {
     switch (meshType)
     {
-    case MeshReader::FileType::VTK :
+    case MeshFileType::VTK :
     {
         return VTKMeshReader::readVtkGenericFormatData<vtkGenericDataObjectReader>(filePath);
         break;
     }
-    case MeshReader::FileType::VTU :
+    case MeshFileType::VTU :
     {
         return VTKMeshReader::readVtkUnstructuredGrid<vtkXMLUnstructuredGridReader>(filePath);
         break;
     }
-    case MeshReader::FileType::VTP :
+    case MeshFileType::VTP :
     {
         return VTKMeshReader::readVtkPolyData<vtkXMLPolyDataReader>(filePath);
         break;
     }
-    case MeshReader::FileType::STL :
+    case MeshFileType::STL :
     {
         return VTKMeshReader::readVtkPolyData<vtkSTLReader>(filePath);
         break;
     }
-    case MeshReader::FileType::PLY :
+    case MeshFileType::PLY :
     {
         return VTKMeshReader::readVtkPolyData<vtkPLYReader>(filePath);
         break;
     }
-    case MeshReader::FileType::OBJ :
+    case MeshFileType::OBJ :
     {
         return VTKMeshReader::readVtkPolyData<vtkOBJReader>(filePath);
         break;
diff --git a/Base/Geometry/Reader/imstkVTKMeshReader.h b/Base/Geometry/Reader/imstkVTKMeshReader.h
index fa4131f17a077b0c92cba93dab01241cdd53f6cb..d62018fdbfff5d1921958a81874d14dd95671283 100644
--- a/Base/Geometry/Reader/imstkVTKMeshReader.h
+++ b/Base/Geometry/Reader/imstkVTKMeshReader.h
@@ -52,7 +52,7 @@ public:
     ///
     /// \brief
     ///
-    static std::shared_ptr<Mesh> read(const std::string& filePath, MeshReader::FileType meshType);
+    static std::shared_ptr<Mesh> read(const std::string& filePath, MeshFileType meshType);
 
 protected:
 
diff --git a/Base/Geometry/Reader/imstkVegaMeshReader.cpp b/Base/Geometry/Reader/imstkVegaMeshReader.cpp
index 1cef0bc099715e4b50b0ae840f2695503756143b..f8c7185d5d83d08dcc0b88cca726b19586b55b83 100644
--- a/Base/Geometry/Reader/imstkVegaMeshReader.cpp
+++ b/Base/Geometry/Reader/imstkVegaMeshReader.cpp
@@ -33,9 +33,9 @@
 
 namespace imstk{
 std::shared_ptr<VolumetricMesh>
-VegaMeshReader::read(const std::string& filePath, MeshReader::FileType meshType)
+VegaMeshReader::read(const std::string& filePath, MeshFileType meshType)
 {
-    if (meshType != MeshReader::FileType::VEG)
+    if (meshType != MeshFileType::VEG)
     {
         LOG(WARNING) << "VegaMeshReader::read error: file type not supported";
         return nullptr;
diff --git a/Base/Geometry/Reader/imstkVegaMeshReader.h b/Base/Geometry/Reader/imstkVegaMeshReader.h
index e5c1d93bb0b66af48c81c309bf097e0579f7c05b..9ff210464f026d2c1b450bd0d798c7720c234dc1 100644
--- a/Base/Geometry/Reader/imstkVegaMeshReader.h
+++ b/Base/Geometry/Reader/imstkVegaMeshReader.h
@@ -44,7 +44,7 @@ public:
     ///
     /// \brief
     ///
-    static std::shared_ptr<VolumetricMesh> read(const std::string& filePath, MeshReader::FileType meshType);
+    static std::shared_ptr<VolumetricMesh> read(const std::string& filePath, MeshFileType meshType);
 };
 }
 
diff --git a/Base/Scene/Object/imstkTimeIntegrator.h b/Base/Scene/Object/imstkTimeIntegrator.h
index 1a8c0df2eedd8193357b35a867c1f4483213987c..3f5367dca565284f6e1cd913f308a69d5124a533 100644
--- a/Base/Scene/Object/imstkTimeIntegrator.h
+++ b/Base/Scene/Object/imstkTimeIntegrator.h
@@ -25,7 +25,16 @@
 #include <array>
 #include "g3log/g3log.hpp"
 
-namespace imstk {
+namespace imstk
+{
+
+enum class TimeIntegratorType
+{
+    forwardEuler,
+    backwardEuler,
+    newmarkBeta,
+    centralDifference
+};
 
 ///
 /// \class TimeIntegrator
diff --git a/Base/Scene/imstkScene.h b/Base/Scene/imstkScene.h
index d9aba4b54faf4746a9e63df19112369b8fe8da2f..c88dc2f3cbc7b6fe65901ae46038ebf6b4205198 100644
--- a/Base/Scene/imstkScene.h
+++ b/Base/Scene/imstkScene.h
@@ -30,7 +30,9 @@
 #include "imstkCamera.h"
 #include "imstkCollisionGraph.h"
 
-namespace imstk {
+namespace imstk
+{
+
 class Scene
 {
     template<class T>
diff --git a/Base/SceneElements/Controllers/imstkTrackingController.h b/Base/SceneElements/Controllers/imstkTrackingController.h
index fcb3007734522760b0c7d439d351852136cad514..ad7eaf9acfff2a48865b71352d15815f73425787 100644
--- a/Base/SceneElements/Controllers/imstkTrackingController.h
+++ b/Base/SceneElements/Controllers/imstkTrackingController.h
@@ -29,6 +29,11 @@
 
 namespace imstk {
 
+///
+/// \class TrackingController
+///
+/// \brief This class reports external device's position and orientation with a given offset
+///
 class TrackingController
 {
 public:
@@ -43,6 +48,9 @@ public:
         rotZ   = 0x20
     };
 
+    ///
+    /// \brief Destructor
+    ///
     ~TrackingController() = default;
 
     ///
@@ -81,7 +89,9 @@ public:
     void setInversionFlags(unsigned char f);
 
 protected:
-
+    ///
+    /// \brief Constructor
+    ///
     TrackingController(std::shared_ptr<DeviceClient> deviceClient = nullptr, double scaling = 1.0) :
         m_deviceClient(deviceClient),
         m_scaling(scaling)
diff --git a/Base/SceneElements/Light/imstkLight.h b/Base/SceneElements/Light/imstkLight.h
index 8492ca1c8a29ce3650c3d86803a921b347425863..1bf96c8c4a6fcabc1cdae64f7a129f021190bb0d 100644
--- a/Base/SceneElements/Light/imstkLight.h
+++ b/Base/SceneElements/Light/imstkLight.h
@@ -30,7 +30,9 @@
 #include "imstkMath.h"
 #include "imstkColor.h"
 
-namespace imstk {
+namespace imstk
+{
+
 enum class LightType
 {
     SCENE_LIGHT,
diff --git a/Base/SceneElements/Objects/imstkSceneObject.cpp b/Base/SceneElements/Objects/imstkSceneObject.cpp
index 4ba45f9ccc2463659da681911795e861f1bae24d..5d19c22cc9905cf512d34188787c7973626d08e1 100644
--- a/Base/SceneElements/Objects/imstkSceneObject.cpp
+++ b/Base/SceneElements/Objects/imstkSceneObject.cpp
@@ -21,9 +21,9 @@
 
 #include "imstkSceneObject.h"
 
-#include "imstkGeometry.h"
+namespace imstk
+{
 
-namespace imstk {
 std::shared_ptr<Geometry>
 SceneObject::getVisualGeometry() const
 {
@@ -36,14 +36,14 @@ SceneObject::setVisualGeometry(std::shared_ptr<Geometry> geometry)
     m_visualGeometry = geometry;
 }
 
-const SceneObject::Type&
+const SceneObjectType&
 SceneObject::getType() const
 {
     return m_type;
 }
 
 void
-SceneObject::setType(Type type)
+SceneObject::setType(SceneObjectType type)
 {
     m_type = type;
 }
@@ -55,8 +55,32 @@ SceneObject::getName() const
 }
 
 void
-SceneObject::setName(std::string name)
+SceneObject::setName(const std::string& name)
 {
     m_name = name;
 }
+
+std::shared_ptr<Geometry>
+SceneObject::getCollidingGeometry() const
+{
+    return m_collidingGeometry;
+}
+
+void
+SceneObject::setCollidingGeometry(std::shared_ptr<Geometry> geometry)
+{
+    m_collidingGeometry = geometry;
+}
+
+std::shared_ptr<GeometryMap>
+SceneObject::getCollidingToVisualMap() const
+{
+    return m_collidingToVisualMap;
+}
+
+void
+SceneObject::setCollidingToVisualMap(std::shared_ptr<GeometryMap> map)
+{
+    m_collidingToVisualMap = map;
+}
 }
diff --git a/Base/SceneElements/Objects/imstkSceneObject.h b/Base/SceneElements/Objects/imstkSceneObject.h
index e1b4bd2cd1637ba9472863ceefebd27f546b234c..4fbb4a2b7c874ca5ed299e98a47034c2bdf47440 100644
--- a/Base/SceneElements/Objects/imstkSceneObject.h
+++ b/Base/SceneElements/Objects/imstkSceneObject.h
@@ -22,45 +22,87 @@
 #ifndef imstkSceneObject_h
 #define imstkSceneObject_h
 
+#include "imstkGeometry.h"
+#include "imstkGeometryMap.h"
+
 #include <memory>
 #include <string>
 
 namespace imstk {
 
-class Geometry;
+enum class SceneObjectType
+{
+    Static,
+    Dynamic,
+    Rigid,
+    Deformable,
+    VirtualTool,
+};
+
+//class Geometry;
+//class GeometryMap;
 
+///
+/// \class SceneObject
+///
+/// \brief Base class for all scene objects. A scene object can optionally be visible and
+/// collide with other scene objects. A object of the class is static.
+///
 class SceneObject
 {
 public:
 
-    enum class Type
-    {
-        Visual,
-        Static,
-        VirtualCoupling,
-        Rigid,
-        Deformable
-    };
-
+    ///
+    /// \brief Constructor
+    ///
     SceneObject(std::string name) : m_name(name) {}
 
+    ///
+    /// \brief Destructor
+    ///
     virtual ~SceneObject() = default;
 
-    const Type& getType() const;
+    ///
+    /// \brief Get the type of the object
+    ///
+    const SceneObjectType& getType() const;
 
+    ///
+    /// \brief Get/Set the custom name of the scene object
+    ///
     const std::string& getName() const;
-    void setName(std::string name);
+    void setName(const std::string& name);
 
+    ///
+    /// \brief Get/Set geometry used for viewing
+    ///
     std::shared_ptr<Geometry> getVisualGeometry() const;
     void setVisualGeometry(std::shared_ptr<Geometry> geometry);
 
+    ///
+    /// \brief Set/Get the geometry used for collisions
+    ///
+    std::shared_ptr<Geometry> getCollidingGeometry() const;
+    void setCollidingGeometry(std::shared_ptr<Geometry> geometry);
+
+    ///
+    /// \brief Set/Get the Colliding-to-Visual map
+    ///
+    std::shared_ptr<GeometryMap> getCollidingToVisualMap() const;
+    void setCollidingToVisualMap(std::shared_ptr<GeometryMap> map);
+
 protected:
+    ///
+    /// \brief Assigns the type of the object
+    ///
+    void setType(SceneObjectType type);
 
-    void setType(Type type);
+    SceneObjectType m_type = SceneObjectType::Static; ///> Type of the scene object
+    std::string m_name; ///> Custom name of the scene object
 
-    Type m_type = Type::Visual;
-    std::string m_name;
-    std::shared_ptr<Geometry> m_visualGeometry; ///> Geometry for rendering
+    std::shared_ptr<Geometry> m_visualGeometry;          ///> Geometry for rendering
+    std::shared_ptr<Geometry> m_collidingGeometry;       ///> Geometry for collisions
+    std::shared_ptr<GeometryMap> m_collidingToVisualMap; ///> Maps transformations to visual geometry
 };
 
 using VisualObject = SceneObject;
diff --git a/Base/SimulationManager/imstkSceneManager.cpp b/Base/SimulationManager/imstkSceneManager.cpp
index d402e0f37b0c3b38700308b51081061fd18a5553..8d87e2685ba3259e43f4599e96b64bdc4d68b7ca 100644
--- a/Base/SimulationManager/imstkSceneManager.cpp
+++ b/Base/SimulationManager/imstkSceneManager.cpp
@@ -22,7 +22,7 @@
 #include "imstkSceneManager.h"
 
 #include "imstkCameraController.h"
-#include "imstkVirtualCouplingObject.h"
+#include "imstkVirtualToolObject.h"
 
 #include "g3log/g3log.hpp"
 
@@ -46,7 +46,7 @@ SceneManager::initModule()
     // Init virtual coupling objects offsets
     for (auto obj : m_scene->getSceneObjects())
     {
-        if (auto virtualCoupling = std::dynamic_pointer_cast<VirtualCouplingObject>(obj))
+        if (auto virtualCoupling = std::dynamic_pointer_cast<VirtualToolObject>(obj))
         {
             virtualCoupling->initOffsets();
         }
@@ -66,7 +66,7 @@ SceneManager::runModule()
     // Update virtualCoupling objects based on devices
     for (auto obj : m_scene->getSceneObjects())
     {
-        if (auto virtualCoupling = std::dynamic_pointer_cast<VirtualCouplingObject>(obj))
+        if (auto virtualCoupling = std::dynamic_pointer_cast<VirtualToolObject>(obj))
         {
             virtualCoupling->updateFromDevice();
             virtualCoupling->applyForces();
diff --git a/Base/SimulationManager/imstkSimulationManager.h b/Base/SimulationManager/imstkSimulationManager.h
index d4cc1a29bcad96c50c2bdc1671e888cecc09fc56..3afc107cdebda032bfbab48ed40f6129eb75fc7b 100644
--- a/Base/SimulationManager/imstkSimulationManager.h
+++ b/Base/SimulationManager/imstkSimulationManager.h
@@ -32,7 +32,7 @@
 #include "imstkDeviceClient.h"
 #include "imstkSceneManager.h"
 #include "imstkViewer.h"
-#include "imstkLogUtility.h"
+#include "imstkLogger.h"
 
 namespace imstk {
 using SimulationStatus = ModuleStatus;
diff --git a/Examples/Sandbox/main.cpp b/Examples/Sandbox/main.cpp
index 53a4b176d67274334b5f5613733c718061e17c2a..aa159bb77fa1065e3dd7b79332f165cf5c86358b 100644
--- a/Examples/Sandbox/main.cpp
+++ b/Examples/Sandbox/main.cpp
@@ -10,8 +10,7 @@
 
 // Objects
 #include "imstkSceneObject.h"
-#include "imstkCollidingObject.h"
-#include "imstkVirtualCouplingObject.h"
+#include "imstkVirtualToolObject.h"
 #include "imstkLight.h"
 #include "imstkCamera.h"
 
@@ -254,7 +253,7 @@ void testTwoFalcons()
     auto sphere0Geom = std::make_shared<imstk::Sphere>();
     sphere0Geom->setPosition(imstk::Vec3d(16,4.5,0));
     sphere0Geom->scale(1);
-    auto sphere0Obj = std::make_shared<imstk::VirtualCouplingObject>("Sphere0", falcon0, 30);
+    auto sphere0Obj = std::make_shared<imstk::VirtualToolObject>("Sphere0", falcon0, 30);
     sphere0Obj->setVisualGeometry(sphere0Geom);
     sphere0Obj->setCollidingGeometry(sphere0Geom);
     scene->addSceneObject(sphere0Obj);
@@ -263,7 +262,7 @@ void testTwoFalcons()
     auto sphere1Geom = std::make_shared<imstk::Sphere>();
     sphere1Geom->setPosition(imstk::Vec3d(-16,4.5,0));
     sphere1Geom->scale(1);
-    auto sphere1Obj = std::make_shared<imstk::VirtualCouplingObject>("Sphere1", falcon1, 30);
+    auto sphere1Obj = std::make_shared<imstk::VirtualToolObject>("Sphere1", falcon1, 30);
     sphere1Obj->setVisualGeometry(sphere1Geom);
     sphere1Obj->setCollidingGeometry(sphere1Geom);
     scene->addSceneObject(sphere1Obj);