diff --git a/Source/Geometry/imstkGeometry.cpp b/Source/Geometry/imstkGeometry.cpp
index 0f08f9950cbb33f3b18ce846575b3b100334f8ce..1e70f992e902dd1a7768dd9bb7610036ee5da687 100644
--- a/Source/Geometry/imstkGeometry.cpp
+++ b/Source/Geometry/imstkGeometry.cpp
@@ -270,5 +270,4 @@ Geometry::isVisible() const
 {
     return m_isVisible;
 }
-
 } // imstk
diff --git a/Source/Materials/imstkTexture.cpp b/Source/Materials/imstkTexture.cpp
index bf7490991c9333b9c3c86d8a627c45799f48cd4e..5be1e4b0e11040a5c6d47537b8b2ac7e4fe061ea 100644
--- a/Source/Materials/imstkTexture.cpp
+++ b/Source/Materials/imstkTexture.cpp
@@ -58,5 +58,4 @@ Texture::getAnisotropyFactor()
 {
     return m_anisotropyFactor;
 }
-
 }
\ No newline at end of file
diff --git a/Source/Rendering/VulkanRenderer/imstkVulkanRenderer.cpp b/Source/Rendering/VulkanRenderer/imstkVulkanRenderer.cpp
index 9e0464dda281bb73caddfd3dfecfe200b684cdff..706fd2e4146d6225172843f5ed7045e5163e6b0b 100644
--- a/Source/Rendering/VulkanRenderer/imstkVulkanRenderer.cpp
+++ b/Source/Rendering/VulkanRenderer/imstkVulkanRenderer.cpp
@@ -734,7 +734,7 @@ VulkanRenderer::renderFrame()
 
             if (m_renderDelegates[renderDelegateIndex]->getGeometry()->getType() == Geometry::Type::DecalPool
                 || !m_renderDelegates[renderDelegateIndex]->getGeometry()->getRenderMaterial()->getCastsShadows()
-                || !m_renderDelegates[renderDelegateIndex]->getGeometry()->isVisible()) 
+                || !m_renderDelegates[renderDelegateIndex]->getGeometry()->isVisible())
             {
                 continue;
             }
diff --git a/Source/SceneElements/Objects/imstkSceneObject.cpp b/Source/SceneElements/Objects/imstkSceneObject.cpp
index 7c9764f39da9e228797e2082f0cc2be76c6a21e8..25d935a22c7a75ab7123d133add398162ed60d5f 100644
--- a/Source/SceneElements/Objects/imstkSceneObject.cpp
+++ b/Source/SceneElements/Objects/imstkSceneObject.cpp
@@ -67,5 +67,4 @@ SceneObject::setName(const std::string& name)
 {
     m_name = name;
 }
-
 } // imstk
diff --git a/Source/SimulationManager/CMakeLists.txt b/Source/SimulationManager/CMakeLists.txt
index 038d56e49da3284dd6d2bb2c20ed79d5063cc9bc..c3e89331ee2e82e80b0c1052b7dc5590d124f0d6 100644
--- a/Source/SimulationManager/CMakeLists.txt
+++ b/Source/SimulationManager/CMakeLists.txt
@@ -14,13 +14,13 @@ set(VTK_CPP_FILES
 
 set(VULKAN_H_FILES
     VulkanRenderer/imstkVulkanInteractorStyle.h
-    VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.h
+    VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.h
     VulkanRenderer/imstkVulkanScreenCaptureUtility.h
     VulkanRenderer/imstkVulkanViewer.h)
 
 set(VULKAN_CPP_FILES
     VulkanRenderer/imstkVulkanInteractorStyle.cpp
-    VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.cpp
+    VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.cpp
     VulkanRenderer/imstkVulkanScreenCaptureUtility.cpp
     VulkanRenderer/imstkVulkanViewer.cpp)
 
diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.cpp b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.cpp
index 3be52b8a6ddfac2ed0a58f5fe150b5626144efb3..385d53f99ae4ea4ab530753bc3c335264eb91f00 100644
--- a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.cpp
+++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.cpp
@@ -40,6 +40,8 @@ VulkanInteractorStyle::OnTimer()
     {
         return;
     }
+
+    VulkanBaseInteractorStyle::OnTimer();
 }
 
 void
@@ -82,11 +84,11 @@ VulkanInteractorStyle::OnChar(int keyID, int type)
         }
     }
     else if (status != SimulationStatus::INACTIVE &&
-             (key == 'q' || key == 'Q' || key == 'e' || key == 'E')) // end Simulation
+             (key == 'q' || key == 'Q'))// || key == 'e' || key == 'E')) // end Simulation
     {
         m_simManager->endSimulation();
     }
-    else if (key == 'd' || key == 'D') // switch rendering mode
+    else if (key == 'f' || key == 'F')//(key == 'd' || key == 'D') // switch rendering mode
     {
         if (m_simManager->getViewer()->getRenderingMode() != Renderer::Mode::SIMULATION)
         {
diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.h b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.h
index d479ee80a28b70054890c79033ace450f90a07f0..b0889052a086cac192f9c2f572683c610ca97854 100644
--- a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.h
+++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.h
@@ -24,7 +24,7 @@
 
 #include "GLFW/glfw3.h"
 
-#include "imstkVulkanInteractorStyleTrackballCamera.h"
+#include "imstkVulkanInteractorStyleFreeCamera.h"
 #include "imstkInteractorStyle.h"
 
 #include <iostream>
@@ -37,7 +37,7 @@ namespace imstk
 class VulkanInteractorStyle;
 class VulkanViewer;
 
-using VulkanBaseInteractorStyle = VulkanInteractorStyleTrackballCamera;
+using VulkanBaseInteractorStyle = VulkanInteractorStyleFreeCamera;
 
 class VulkanInteractorStyle : public VulkanBaseInteractorStyle, public InteractorStyle
 {
diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.cpp b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7e999cd6d1a93c77cc211a71c1694e2b566de67e
--- /dev/null
+++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.cpp
@@ -0,0 +1,320 @@
+/*=========================================================================
+
+   Library: iMSTK
+
+   Copyright (c) Kitware, Inc. & Center for Modeling, Simulation,
+   & Imaging in Medicine, Rensselaer Polytechnic Institute.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0.txt
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+=========================================================================*/
+
+#include "imstkVulkanInteractorStyleFreeCamera.h"
+
+#include "imstkVulkanViewer.h"
+#include "imstkSimulationManager.h"
+
+namespace imstk
+{
+VulkanInteractorStyleFreeCamera::VulkanInteractorStyleFreeCamera()
+{
+}
+
+void
+VulkanInteractorStyleFreeCamera::setWindow(GLFWwindow * window, VulkanViewer * viewer)
+{
+    m_window = window;
+    m_viewer = viewer;
+
+    m_stopWatch.start();
+    glfwSetWindowUserPointer(window, (void *)this);
+
+    glfwSetKeyCallback(m_window, VulkanInteractorStyleFreeCamera::OnCharInterface);
+    glfwSetMouseButtonCallback(m_window, VulkanInteractorStyleFreeCamera::OnMouseButtonInterface);
+    glfwSetCursorPosCallback(m_window, VulkanInteractorStyleFreeCamera::OnMouseMoveInterface);
+    glfwSetScrollCallback(m_window, VulkanInteractorStyleFreeCamera::OnMouseWheelInterface);
+    glfwSetWindowSizeCallback(m_window, VulkanInteractorStyleFreeCamera::OnWindowResizeInterface);
+    glfwSetFramebufferSizeCallback(m_window, VulkanInteractorStyleFreeCamera::OnFramebuffersResizeInterface);
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnTimer()
+{
+    float speed = 0.0005f;
+
+    auto camera = m_simManager->getActiveScene()->getCamera();
+
+    // Initialize certain variables
+    if (!m_started)
+    {
+        m_lastFrameMode = m_viewer->getRenderingMode();
+        m_lastTime = m_stopWatch.getTimeElapsed();
+        m_mousePosLastNormalized[0] = m_mousePosNormalized[0];
+        m_mousePosLastNormalized[1] = m_mousePosNormalized[1];
+        m_started = true;
+    }
+
+    auto currentMode = m_viewer->getRenderingMode();
+
+    // Detect change to/from simulation and debug mode
+    if (m_lastFrameMode == Renderer::Mode::SIMULATION)
+    {
+        if (currentMode == Renderer::Mode::DEBUG)
+        {
+            m_simCameraPosition = camera->getPosition();
+            m_simCameraFocalPoint = camera->getFocalPoint();
+            camera->setPosition(m_simCameraPosition[0], m_simCameraFocalPoint[1], m_simCameraPosition[2]);
+            m_cameraAngle = 0;
+        }
+    }
+    else if (m_lastFrameMode = Renderer::Mode::DEBUG)
+    {
+        if (currentMode == Renderer::Mode::SIMULATION)
+        {
+            camera->setPosition(m_simCameraPosition);
+            camera->setFocalPoint(m_simCameraFocalPoint);
+        }
+    }
+
+    m_lastFrameMode = m_viewer->getRenderingMode();
+
+    // Extract variables/calculate derivatives
+    auto pos = camera->getPosition();
+    auto fp = camera->getFocalPoint();
+    auto dx = m_mousePosNormalized[0] - m_mousePosLastNormalized[0];
+    auto dy = m_mousePosNormalized[1] - m_mousePosLastNormalized[1];
+    auto direction = Vec3d(pos - fp);
+    direction.normalize();
+    auto yaw = atan2(pos[0] - fp[0], pos[2] - fp[2]);
+    auto xDirection = Vec3d(cos(yaw), 0, -sin(yaw));
+
+    auto currentTime = m_stopWatch.getTimeElapsed();
+    float dt = currentTime - m_lastTime; // For variable time-step
+
+    // Update for next frame
+    m_lastTime = currentTime;
+    m_mousePosLastNormalized[0] = m_mousePosNormalized[0];
+    m_mousePosLastNormalized[1] = m_mousePosNormalized[1];
+
+    // The following is only for movement mode
+    if (!(m_state & VulkanInteractorStyleFreeCamera::RIGHT_MOUSE_DOWN))
+    {
+        return;
+    }
+
+    auto angleTempOffset = Vec3d(fp - pos);
+    auto angleOffset = glm::vec4(angleTempOffset[0], angleTempOffset[1], angleTempOffset[2], 1);
+
+    // Prevents flipping camera at up and down view
+    float dCameraAngle = -4 * dy;
+    if (m_cameraAngle + dCameraAngle <= -PI_2 + 0.01)
+    {
+        dCameraAngle = -PI_2 - m_cameraAngle + 0.01;
+    }
+    else if (m_cameraAngle + dCameraAngle >= PI_2 - 0.01)
+    {
+        dCameraAngle = PI_2 - m_cameraAngle - 0.01;
+    }
+    m_cameraAngle += dCameraAngle;
+
+    // Rotational offset
+    auto xRotation = glm::rotate<float>(-4 * dx, glm::tvec3<float>(0.0f, 1.0f, 0.0f));
+    auto yRotation = glm::rotate<float>(dCameraAngle, glm::tvec3<float>(xDirection[0], 0, xDirection[2]));
+    angleOffset = xRotation * yRotation * angleOffset;
+    angleTempOffset[0] = angleOffset.x;
+    angleTempOffset[1] = angleOffset.y;
+    angleTempOffset[2] = angleOffset.z;
+
+    auto offset = Vec3d(0, 0, 0); // Position offset
+
+    // Controls
+    if (glfwGetKey(m_viewer->m_window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS)
+    {
+        speed *= 5;
+    }
+    if (glfwGetKey(m_viewer->m_window, GLFW_KEY_A) == GLFW_PRESS)
+    {
+        offset += xDirection * -speed * dt;
+    }
+    if (glfwGetKey(m_viewer->m_window, GLFW_KEY_D) == GLFW_PRESS)
+    {
+        offset += xDirection * speed * dt;
+    }
+    if (glfwGetKey(m_viewer->m_window, GLFW_KEY_W) == GLFW_PRESS)
+    {
+        offset += direction * -speed * dt;
+    }
+    if (glfwGetKey(m_viewer->m_window, GLFW_KEY_S) == GLFW_PRESS)
+    {
+        offset += direction * speed * dt;
+    }
+
+    camera->setPosition(pos + offset);
+    fp = angleTempOffset + camera->getPosition();
+    camera->setFocalPoint(fp);
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnCharInterface(GLFWwindow * window, int keyID, int code, int type, int extra)
+{
+    VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window);
+    style->OnChar(keyID, type);
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnMouseButtonInterface(GLFWwindow * window, int buttonID, int type, int extra)
+{
+    VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window);
+
+    switch (buttonID)
+    {
+    case GLFW_MOUSE_BUTTON_LEFT:
+        if (type == GLFW_PRESS)
+        {
+            style->OnLeftButtonDown();
+        }
+        else if (type == GLFW_RELEASE)
+        {
+            style->OnLeftButtonUp();
+        }
+        break;
+    case GLFW_MOUSE_BUTTON_RIGHT:
+        if (type == GLFW_PRESS)
+        {
+            style->OnRightButtonDown();
+        }
+        else if (type == GLFW_RELEASE)
+        {
+            style->OnRightButtonUp();
+        }
+        break;
+    case GLFW_MOUSE_BUTTON_MIDDLE:
+        if (type == GLFW_PRESS)
+        {
+            style->OnMiddleButtonDown();
+        }
+        else if (type == GLFW_RELEASE)
+        {
+            style->OnMiddleButtonUp();
+        }
+        break;
+    }
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnMouseMoveInterface(GLFWwindow * window, double x, double y)
+{
+    VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window);
+    style->OnMouseMove(x, y);
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnMouseWheelInterface(GLFWwindow * window, double x, double y)
+{
+    VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window);
+    if (y < 0)
+    {
+        style->OnMouseWheelBackward(y);
+    }
+    else
+    {
+        style->OnMouseWheelForward(y);
+    }
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnChar(int keyID, int type)
+{
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnMouseMove(double x, double y)
+{
+    m_mousePos[0] = x;
+    m_mousePos[1] = y;
+    m_mousePosNormalized[0] = x;
+    m_mousePosNormalized[1] = y;
+    this->normalizeCoordinate(m_mousePosNormalized[0], m_mousePosNormalized[1]);
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnLeftButtonDown()
+{
+    m_state |= VulkanInteractorStyleFreeCamera::LEFT_MOUSE_DOWN;
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnLeftButtonUp()
+{
+    m_state &= ~VulkanInteractorStyleFreeCamera::LEFT_MOUSE_DOWN;
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnMiddleButtonDown()
+{
+    m_state |= VulkanInteractorStyleFreeCamera::MIDDLE_MOUSE_DOWN;
+}
+
+void VulkanInteractorStyleFreeCamera::OnMiddleButtonUp()
+{
+    m_state &= ~VulkanInteractorStyleFreeCamera::MIDDLE_MOUSE_DOWN;
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnRightButtonDown()
+{
+    m_state |= VulkanInteractorStyleFreeCamera::RIGHT_MOUSE_DOWN;
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnRightButtonUp()
+{
+    m_state &= ~VulkanInteractorStyleFreeCamera::RIGHT_MOUSE_DOWN;
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnMouseWheelForward(double y)
+{
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnMouseWheelBackward(double y)
+{
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnWindowResizeInterface(GLFWwindow * window, int width, int height)
+{
+    VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window);
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnFramebuffersResizeInterface(GLFWwindow * window, int width, int height)
+{
+    VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window);
+    style->OnWindowResize(width, height);
+}
+
+void
+VulkanInteractorStyleFreeCamera::OnWindowResize(int width, int height)
+{
+    m_viewer->resizeWindow(width, height);
+}
+
+void
+VulkanInteractorStyleFreeCamera::normalizeCoordinate(double &x, double &y)
+{
+    x = (x - m_viewer->m_width / 2) / m_viewer->m_width;
+    y = (y - m_viewer->m_height / 2) / m_viewer->m_height;
+}
+}
\ No newline at end of file
diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.h b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.h
similarity index 66%
rename from Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.h
rename to Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.h
index 3171fb7a1f9d6163daa701735a06b8f63fe68060..a1b49e046741c71f534f75993d79236ef1334023 100644
--- a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.h
+++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.h
@@ -19,8 +19,8 @@
 
 =========================================================================*/
 
-#ifndef imstkVulkanInteractorStyleTrackballCamera_h
-#define imstkVulkanInteractorStyleTrackballCamera_h
+#ifndef imstkVulkanInteractorStyleFreeCamera_h
+#define imstkVulkanInteractorStyleFreeCamera_h
 
 #include "GLFW/glfw3.h"
 
@@ -28,16 +28,28 @@
 #include <unordered_map>
 #include <functional>
 
+#include "glm/glm.hpp"
+#include "glm/gtx/transform.hpp"
+
+#include "imstkMath.h"
+#include "imstkTimer.h"
+#include "imstkRenderer.h"
+
 namespace imstk
 {
 class VulkanViewer;
 class SimulationManager;
 
-class VulkanInteractorStyleTrackballCamera
+///
+/// \class VulkanInteractorStyleFreeCamera
+///
+/// \brief Default camera movement class
+///
+class VulkanInteractorStyleFreeCamera
 {
 public:
-    VulkanInteractorStyleTrackballCamera();
-    ~VulkanInteractorStyleTrackballCamera(){};
+    VulkanInteractorStyleFreeCamera();
+    ~VulkanInteractorStyleFreeCamera(){};
 
     void setWindow(GLFWwindow * window, VulkanViewer * viewer);
 
@@ -67,12 +79,15 @@ public:
 protected:
     friend class VulkanViewer;
 
+    ///
+    /// \brief Normalized coordinates in the context of the screen
+    ///
+    void normalizeCoordinate(double &x, double &y);
+
     GLFWwindow * m_window;
     SimulationManager * m_simManager;
     VulkanViewer * m_viewer;
 
-    double distance(double x, double y);
-
     // States
     enum
     {
@@ -81,11 +96,18 @@ protected:
         RIGHT_MOUSE_DOWN = 0x4
     };
 
-    double m_lastMouseX = 0;
-    double m_lastMouseY = 0;
+    double m_mousePos[2]; ///< Mouse position
+    double m_mousePosNormalized[2]; ///< Mouse position normalized
+    double m_mousePosLastNormalized[2]; ///< Last frame mouse position normalized
+
+    StopWatch m_stopWatch;
+    double m_lastTime = 0; ///< Last frame time
+    Vec3d m_simCameraPosition; ///< Saved simulation mode camera position
+    Vec3d m_simCameraFocalPoint; ///< Saved simulation mode camera focal point
+    float m_cameraAngle = 0; ///< Angle created by changes in vertical cursor position
+    Renderer::Mode m_lastFrameMode = Renderer::Mode::EMPTY; ///< Last frame mode
 
-    double m_mouseX = 0;
-    double m_mouseY = 0;
+    bool m_started = false; ///< Used to initialized variables
 
     unsigned int m_state = 0;
 };
diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.cpp b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.cpp
deleted file mode 100644
index 62e3988ea8d08d56ccf759ae295a5012c9e5254e..0000000000000000000000000000000000000000
--- a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-/*=========================================================================
-
-   Library: iMSTK
-
-   Copyright (c) Kitware, Inc. & Center for Modeling, Simulation,
-   & Imaging in Medicine, Rensselaer Polytechnic Institute.
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0.txt
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-=========================================================================*/
-
-#include "imstkVulkanInteractorStyleTrackballCamera.h"
-
-#include "imstkVulkanViewer.h"
-#include "imstkSimulationManager.h"
-
-namespace imstk
-{
-VulkanInteractorStyleTrackballCamera::VulkanInteractorStyleTrackballCamera()
-{
-}
-
-void
-VulkanInteractorStyleTrackballCamera::setWindow(GLFWwindow * window, VulkanViewer * viewer)
-{
-    m_window = window;
-    m_viewer = viewer;
-
-    glfwSetWindowUserPointer(window, (void *)this);
-
-    glfwSetKeyCallback(m_window, VulkanInteractorStyleTrackballCamera::OnCharInterface);
-    glfwSetMouseButtonCallback(m_window, VulkanInteractorStyleTrackballCamera::OnMouseButtonInterface);
-    glfwSetCursorPosCallback(m_window, VulkanInteractorStyleTrackballCamera::OnMouseMoveInterface);
-    glfwSetScrollCallback(m_window, VulkanInteractorStyleTrackballCamera::OnMouseWheelInterface);
-    glfwSetWindowSizeCallback(m_window, VulkanInteractorStyleTrackballCamera::OnWindowResizeInterface);
-    glfwSetFramebufferSizeCallback(m_window, VulkanInteractorStyleTrackballCamera::OnFramebuffersResizeInterface);
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnTimer()
-{
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnCharInterface(GLFWwindow * window, int keyID, int code, int type, int extra)
-{
-    VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window);
-    style->OnChar(keyID, type);
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnMouseButtonInterface(GLFWwindow * window, int buttonID, int type, int extra)
-{
-    VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window);
-
-    switch (buttonID)
-    {
-    case GLFW_MOUSE_BUTTON_LEFT:
-        if (type == GLFW_PRESS)
-        {
-            style->OnLeftButtonDown();
-        }
-        else if (type == GLFW_RELEASE)
-        {
-            style->OnLeftButtonUp();
-        }
-        break;
-    case GLFW_MOUSE_BUTTON_RIGHT:
-        if (type == GLFW_PRESS)
-        {
-            style->OnRightButtonDown();
-        }
-        else if (type == GLFW_RELEASE)
-        {
-            style->OnRightButtonUp();
-        }
-        break;
-    case GLFW_MOUSE_BUTTON_MIDDLE:
-        if (type == GLFW_PRESS)
-        {
-            style->OnMiddleButtonDown();
-        }
-        else if (type == GLFW_RELEASE)
-        {
-            style->OnMiddleButtonUp();
-        }
-        break;
-    }
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnMouseMoveInterface(GLFWwindow * window, double x, double y)
-{
-    VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window);
-    style->OnMouseMove(x, y);
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnMouseWheelInterface(GLFWwindow * window, double x, double y)
-{
-    VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window);
-    if (y < 0)
-    {
-        style->OnMouseWheelBackward(y);
-    }
-    else
-    {
-        style->OnMouseWheelForward(y);
-    }
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnChar(int keyID, int type)
-{
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnMouseMove(double x, double y)
-{
-    m_mouseX = (x - m_viewer->m_width / 2) / m_viewer->m_width;
-    m_mouseY = (y - m_viewer->m_height / 2) / m_viewer->m_height;
-    auto camera = m_simManager->getActiveScene()->getCamera();
-    auto offset = camera->getPosition() - camera->getFocalPoint();
-    auto dx = m_mouseX - m_lastMouseX;
-    auto dy = m_mouseY - m_lastMouseY;
-
-    if (m_state & VulkanInteractorStyleTrackballCamera::LEFT_MOUSE_DOWN)
-    {
-        double strength = distance(m_mouseX, m_mouseY);
-
-        auto convertedOffset = glm::vec3(offset.x(), offset.y(), offset.z());
-        glm::vec3 rotationAxis(0,1,0);
-        glm::mat4 rotation;
-        rotation = glm::rotate(rotation, -(float)dx, rotationAxis);
-        auto new_position = rotation * glm::vec4(offset.x(), offset.y(), offset.z(), 1);
-        imstk::Vec3d position(new_position[0], new_position[1], new_position[2]);
-        camera->setPosition(camera->getFocalPoint() + position);
-    }
-    else if (m_state & VulkanInteractorStyleTrackballCamera::MIDDLE_MOUSE_DOWN)
-    {
-        auto camera = m_simManager->getActiveScene()->getCamera();
-        auto eye = glm::tvec3<float>(camera->getPosition().x(), camera->getPosition().y(), camera->getPosition().z());
-        auto center = glm::tvec3<float>(camera->getFocalPoint().x(), camera->getFocalPoint().y(), camera->getFocalPoint().z());
-        auto up = glm::tvec3<float>(camera->getViewUp().x(), camera->getViewUp().y(), camera->getViewUp().z());
-
-        glm::mat4 cameraTranslationMatrix(1);
-        cameraTranslationMatrix = glm::translate(cameraTranslationMatrix, glm::tvec3<float>(-dx * 10, dy * 10, 0));
-        auto cameraMatrix = glm::inverse(glm::lookAt(eye, center, up));
-
-        auto new_position = cameraMatrix * cameraTranslationMatrix;
-        auto new_focal_point_offset = glm::mat3(cameraMatrix) * glm::vec3(cameraTranslationMatrix[3]);
-        imstk::Vec3d position(new_position[3][0], new_position[3][1], new_position[3][2]);
-        camera->setPosition(position);
-        auto new_focal_point = center + new_focal_point_offset;
-        camera->setFocalPoint(Vec3d(new_focal_point[0], new_focal_point[1], new_focal_point[2]));
-    }
-
-    m_lastMouseX = m_mouseX;
-    m_lastMouseY = m_mouseY;
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnLeftButtonDown()
-{
-    m_state |= VulkanInteractorStyleTrackballCamera::LEFT_MOUSE_DOWN;
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnLeftButtonUp()
-{
-    m_state &= ~VulkanInteractorStyleTrackballCamera::LEFT_MOUSE_DOWN;
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnMiddleButtonDown()
-{
-    m_state |= VulkanInteractorStyleTrackballCamera::MIDDLE_MOUSE_DOWN;
-}
-
-void VulkanInteractorStyleTrackballCamera::OnMiddleButtonUp()
-{
-    m_state &= ~VulkanInteractorStyleTrackballCamera::MIDDLE_MOUSE_DOWN;
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnRightButtonDown()
-{
-    m_state |= VulkanInteractorStyleTrackballCamera::RIGHT_MOUSE_DOWN;
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnRightButtonUp()
-{
-    m_state &= ~VulkanInteractorStyleTrackballCamera::RIGHT_MOUSE_DOWN;
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnMouseWheelForward(double y)
-{
-    auto camera = m_simManager->getActiveScene()->getCamera();
-
-    auto offset = camera->getPosition() - camera->getFocalPoint();
-
-    auto offsetx = -0.01 * offset.x() * y + camera->getPosition().x();
-    auto offsety = -0.01 * offset.y() * y + camera->getPosition().y();
-    auto offsetz = -0.01 * offset.z() * y + camera->getPosition().z();
-
-    camera->setPosition(Vec3d(offsetx, offsety, offsetz));
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnMouseWheelBackward(double y)
-{
-    auto camera = m_simManager->getActiveScene()->getCamera();
-
-    auto offset = camera->getPosition() - camera->getFocalPoint();
-
-    auto offsetx = -0.01 * offset.x() * y + camera->getPosition().x();
-    auto offsety = -0.01 * offset.y() * y + camera->getPosition().y();
-    auto offsetz = -0.01 * offset.z() * y + camera->getPosition().z();
-
-    camera->setPosition(Vec3d(offsetx, offsety, offsetz));
-}
-
-inline double
-VulkanInteractorStyleTrackballCamera::distance(double x, double y)
-{
-    return sqrt(x * x + y * y);
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnWindowResizeInterface(GLFWwindow * window, int width, int height)
-{
-    VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window);
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnFramebuffersResizeInterface(GLFWwindow * window, int width, int height)
-{
-    VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window);
-    style->OnWindowResize(width, height);
-}
-
-void
-VulkanInteractorStyleTrackballCamera::OnWindowResize(int width, int height)
-{
-    m_viewer->resizeWindow(width, height);
-}
-}
\ No newline at end of file
diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanViewer.h b/Source/SimulationManager/VulkanRenderer/imstkVulkanViewer.h
index 707af513b5f04f6f00a3dda22e56c91e739ff22d..eb1948a9df488b66d4a70146c1c7154a5348aa95 100644
--- a/Source/SimulationManager/VulkanRenderer/imstkVulkanViewer.h
+++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanViewer.h
@@ -90,7 +90,7 @@ public:
 
 protected:
     friend class VulkanInteractorStyle;
-    friend class VulkanInteractorStyleTrackballCamera;
+    friend class VulkanInteractorStyleFreeCamera;
 
     void setupWindow();
     void createWindow();