diff --git a/Base/Core/imstkLogger.cpp b/Base/Core/imstkLogger.cpp
index 665cbd13baf7670e0ca814606fab7933ba1b5f95..d12ff629ee36af68bb157c09730da10d3d09bdd5 100644
--- a/Base/Core/imstkLogger.cpp
+++ b/Base/Core/imstkLogger.cpp
@@ -26,7 +26,7 @@ namespace imstk
 {
 Logger::Logger(std::string filename)
 {
-    m_filename = filename + this->getCurrentTimeFormatted() + ".log";
+    m_filename = filename + "_" + this->getCurrentTimeFormatted() + ".log";
     m_mutex = new std::mutex();
     m_thread = new std::thread(Logger::eventLoop, this);
 }
@@ -83,9 +83,7 @@ void
 Logger::eventLoop(Logger * logger)
 {
     std::ofstream file(logger->m_filename);
-
-    char buffer[1024];
-    std::fill_n(buffer, 1024, '\0');
+    std::string buffer;
 
     while (logger->m_running) {
         std::unique_lock<std::mutex> ul(*logger->m_mutex);
@@ -98,13 +96,13 @@ Logger::eventLoop(Logger * logger)
             break;
         }
 
-        std::strcpy(buffer, logger->m_message.c_str());
+        buffer = logger->m_message;
         logger->m_changed = false;
 
         ul.unlock();
         logger->m_condition.notify_one();
 
-        file << buffer << "\n";
+        file << buffer;
     }
     file.close();
     logger->m_condition.notify_one();
@@ -113,6 +111,7 @@ Logger::eventLoop(Logger * logger)
 void
 Logger::log(std::string message, bool prependTime /* = false */)
 {
+    m_message = "";
     if (prependTime)
     {
         m_message = this->getCurrentTimeFormatted() + " ";
diff --git a/Base/Core/imstkLogger.h b/Base/Core/imstkLogger.h
index 222bf492eca785ce0d08f1cd2f1e1aa099c23e41..fb132c9d199507e4ec24b6add4e650468cb2f1b3 100644
--- a/Base/Core/imstkLogger.h
+++ b/Base/Core/imstkLogger.h
@@ -49,7 +49,7 @@ public:
     /// \params filename this name will be used in the file name of the log file
     ///
     Logger(std::string filename);
-    ~Logger();
+    virtual ~Logger();
 
     ///
     /// \brief Log one line.
@@ -94,6 +94,11 @@ public:
     ///
     void shutdown();
 
+    ///
+    /// \brief Get the file name
+    ///
+    inline std::string getFileName() const { return m_filename; }
+
 private:
     static std::string getCurrentTimeFormatted();
 
diff --git a/Base/SceneElements/Controllers/imstkSceneObjectController.cpp b/Base/SceneElements/Controllers/imstkSceneObjectController.cpp
index b57d2811bcf4fb54d26dde4c598f4829cb12759e..b33fe31e71bf54062e755798e8d0739b11f79993 100644
--- a/Base/SceneElements/Controllers/imstkSceneObjectController.cpp
+++ b/Base/SceneElements/Controllers/imstkSceneObjectController.cpp
@@ -49,6 +49,11 @@ SceneObjectController::updateControlledObjects()
         }
     }
 
+    if (m_updateCallback)
+    {
+        m_updateCallback(this);
+    }
+
     // Update colliding geometry
     m_sceneObject->getMasterGeometry()->setTranslation(m_trackingController->getPosition());
     m_sceneObject->getMasterGeometry()->setRotation(m_trackingController->getRotation());
diff --git a/Base/SceneElements/Controllers/imstkSceneObjectController.h b/Base/SceneElements/Controllers/imstkSceneObjectController.h
index 8b9d86e443e037d441b97c56ffc54e463f490280..a4bf690194661adbe200ddce65865a7458fddf25 100644
--- a/Base/SceneElements/Controllers/imstkSceneObjectController.h
+++ b/Base/SceneElements/Controllers/imstkSceneObjectController.h
@@ -37,6 +37,7 @@ namespace imstk
 ///
 class SceneObjectController : public SceneObjectControllerBase
 {
+    using ControllerCallbackFunction = std::function<void(SceneObjectController* hdapiClient)>;
 public:
     ///
     /// \brief Constructor
@@ -83,9 +84,16 @@ public:
     inline std::shared_ptr<DeviceTracker> getTrackingController() const { return m_trackingController; }
     inline void setTrackingController(std::shared_ptr<DeviceTracker> controller) { m_trackingController = controller; }
 
+    ///
+    /// \brief Setting custom behavior functions
+    ///
+    inline void setUpdateCallback(ControllerCallbackFunction foo) { m_updateCallback = foo; }
+
 protected:
     std::shared_ptr<DeviceTracker> m_trackingController; ///< Device tracker
     std::shared_ptr<SceneObject> m_sceneObject;          ///< SceneObject controlled by the Tracker
+    //Callback functions
+    ControllerCallbackFunction m_updateCallback;   ///> function callback preceding module update
 };
 } // imstk
 #endif // ifndef imstkSceneObjectController_h