diff --git a/Source/Scene/imstkScene.h b/Source/Scene/imstkScene.h
index 54b9254321a86585e8d3b785463045d1c60053b2..0ce822a0e20b9a60387522034476829d07bfd369 100644
--- a/Source/Scene/imstkScene.h
+++ b/Source/Scene/imstkScene.h
@@ -166,6 +166,12 @@ public:
     ///
     void reset();
 
+    ///
+    /// \brief Set/Get the FPS
+    ///
+    void setFPS(const size_t fps) { m_fps = fps; }
+    size_t getFPS() { return m_fps; }
+
 protected:
 
     std::string m_name; ///> Name of the scene
@@ -178,6 +184,8 @@ protected:
     std::vector<std::shared_ptr<SolverBase>> m_solvers;     ///> List of non-linear solvers
     std::vector<std::shared_ptr<SceneObjectControllerBase>> m_objectControllers; ///> List of controllers
 
+    size_t m_fps = 0;
+
     bool m_isInitialized = false;
 };
 } // imstk
diff --git a/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.cpp b/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.cpp
index 3619a7fd867303808013d38ce0e5ccb1a3d6e312..8320e15fd148cc447e523776538df9a324d4d9b5 100644
--- a/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.cpp
+++ b/Source/SimulationManager/VTKRenderer/imstkVTKInteractorStyle.cpp
@@ -83,18 +83,29 @@ VTKInteractorStyle::OnTimer()
 
     // Update framerate value display
     auto now = std::chrono::high_resolution_clock::now();
-    double fps = 1e6/(double)std::chrono::duration_cast<std::chrono::microseconds>(now - m_pre).count();
+    double fps = 1e6 / (double)std::chrono::duration_cast<std::chrono::microseconds>(now - m_pre).count();
     fps = 0.1 * fps + 0.9 * m_lastFps;
     m_lastFps = fps;
     int t = std::chrono::duration_cast<std::chrono::milliseconds>(now - m_lastFpsUpdate).count();
-    if (t > 100) //wait 100ms before updating displayed value
+    if (t > 250) //wait 250ms before updating displayed value
     {
-        std::string fpsStr = std::to_string((int)fps) + " fps";
-        m_fpsActor->SetInput(fpsStr.c_str());
+        std::string fpsVisualStr = "V: " + std::to_string((int)fps);
+
+        std::string fpsPhysicalStr;
+        if (m_simManager->getStatus() != SimulationStatus::PAUSED)
+        {
+            fpsPhysicalStr = "P: " + std::to_string((int)m_simManager->getActiveScene()->getFPS());
+        }
+        else
+        {
+            fpsPhysicalStr = "P: PAUSED";
+        }
+        m_fpsActor->SetInput((fpsVisualStr + std::string(" | ") + fpsPhysicalStr).c_str());
         m_lastFpsUpdate = now;
     }
     m_pre = now;
 
+
     // Render
     this->Interactor->Render();
     m_post = std::chrono::high_resolution_clock::now();
diff --git a/Source/SimulationManager/imstkSceneManager.cpp b/Source/SimulationManager/imstkSceneManager.cpp
index 3680dc528a0c4f87e476315e6a6e75050f571cf5..4b452a61a70fbf230b2acc9a30bc8ded3e37f550 100644
--- a/Source/SimulationManager/imstkSceneManager.cpp
+++ b/Source/SimulationManager/imstkSceneManager.cpp
@@ -180,6 +180,8 @@ SceneManager::runModule()
             }
         }
     }
+
+    m_scene->setFPS((size_t)(1./wwt.getTimeElapsed(StopWatch::TimeUnitType::seconds)));
 }
 
 void