diff --git a/Base/SceneElements/Camera/imstkCamera.cpp b/Base/SceneElements/Camera/imstkCamera.cpp
index 0811c8c6c1621ece471e55976a1d9b33ecc65ee8..2762ea0ee7456ef8bad6dc0ccb26d65c3ed8e5c6 100644
--- a/Base/SceneElements/Camera/imstkCamera.cpp
+++ b/Base/SceneElements/Camera/imstkCamera.cpp
@@ -106,16 +106,9 @@ Camera::getController() const
 }
 
 std::shared_ptr<CameraController>
-Camera::setupController(std::shared_ptr<DeviceClient> deviceClient)
+Camera::setController(std::shared_ptr<CameraController> controller)
 {
-    if(m_controller == nullptr)
-    {
-        m_controller = std::make_shared<CameraController>(*this, deviceClient);
-    }
-    else
-    {
-        m_controller->setDeviceClient(deviceClient);
-    }
+    m_controller = controller;
     return m_controller;
 }
 } // imstk
diff --git a/Base/SceneElements/Camera/imstkCamera.h b/Base/SceneElements/Camera/imstkCamera.h
index b426206f8c17c445fc8f095477c453059e27a792..b0cda6d2642dafc6a28db06c6e42f48e0e19c157 100644
--- a/Base/SceneElements/Camera/imstkCamera.h
+++ b/Base/SceneElements/Camera/imstkCamera.h
@@ -110,7 +110,7 @@ public:
     ///
     /// \brief
     ///
-    std::shared_ptr<CameraController> setupController(std::shared_ptr<DeviceClient> deviceClient);
+    std::shared_ptr<CameraController> setController(std::shared_ptr<CameraController> controller);
 
 protected:
     std::shared_ptr<CameraController> m_controller;   ///>
diff --git a/Base/SceneElements/Controllers/imstkFLSCameraController.cpp b/Base/SceneElements/Controllers/imstkFLSCameraController.cpp
index 0aa0705269ae123d513859e9797d13b72a3c5234..fb866cf4ea50ecadb8b2f964eb09c5880a5729d8 100644
--- a/Base/SceneElements/Controllers/imstkFLSCameraController.cpp
+++ b/Base/SceneElements/Controllers/imstkFLSCameraController.cpp
@@ -76,7 +76,10 @@ FLSCameraController::getCameraAngulationTranslationOffset() const
 void
 FLSCameraController::runModule()
 {
-    this->setCameraHeadAngleOffset(arduinoClient->getRoll());
+    if (arduinoActive)
+    {
+      this->setCameraHeadAngleOffset(arduinoClient->getRoll() - m_rollOffset);
+    }
     auto roff = Quatd(Eigen::AngleAxisd(m_cameraHeadAngleOffset*PI / 180., Vec3d(0., 0., 1.)));
     roff *= m_cameraAngulationRotOffset;
     this->setCameraRotationOffset(roff);
diff --git a/Examples/Sandbox/main.cpp b/Examples/Sandbox/main.cpp
index 574a8c363ecb3f358427494cafacb26682e13588..a54023db998b558231d84d63eab86f6e46188c62 100644
--- a/Examples/Sandbox/main.cpp
+++ b/Examples/Sandbox/main.cpp
@@ -697,9 +697,11 @@ void testCameraController()
     cam->setPosition(imstk::Vec3d(0, 0, 10));
 
 #ifdef iMSTK_USE_OPENHAPTICS
+    
+    auto camControllerInput = std::make_shared<CameraController>(*cam, client);
 
     // Set camera controller
-    auto camController = cam->setupController(client);
+    auto camController = cam->setController(camControllerInput);
     //camController->setTranslationScaling(100);
     //LOG(INFO) << camController->getTranslationOffset(); // should be the same than initial cam position
     camController->setInversionFlags(imstk::CameraController::InvertFlag::rotY |