diff --git a/Examples/LaparoscopicCamera/CustomKeyPressEvent.cpp b/Examples/LaparoscopicCamera/CustomKeyPressEvent.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..315950ee23f9674b3ab5f65239c675fce362232c
--- /dev/null
+++ b/Examples/LaparoscopicCamera/CustomKeyPressEvent.cpp
@@ -0,0 +1,7 @@
+// VTK includes
+#include "VTKRendering/initVTKRendering.h"
+#include "VTKRendering/VTKViewer.h"
+#include "vtkWindowToImageFilter.h"
+#include "vtkPNGWriter.h"
+#include "vtkAxis.h"
+#include "vtkNew.h"
diff --git a/Examples/LaparoscopicCamera/main.cpp b/Examples/LaparoscopicCamera/main.cpp
index 84bb3046209d2e16f7426a194541a8963a03a836..5da4ace3a69fe50304c192d045651a6a7f9667ce 100644
--- a/Examples/LaparoscopicCamera/main.cpp
+++ b/Examples/LaparoscopicCamera/main.cpp
@@ -8,7 +8,7 @@
 #include <string>
 #include <cmath>
 
-// Core SimMedTK includes
+// Core iMSTK includes
 #include "Core/SDK.h"
 #include "Core/StaticSceneObject.h"
 #include "Devices/VRPNForceDevice.h"
@@ -19,23 +19,111 @@
 #include "Collision/PlaneCollisionModel.h"
 #include "Collision/MeshCollisionModel.h"
 #include "IO/initIO.h"
-
-// VTK includes
 #include "VTKRendering/initVTKRendering.h"
 #include "VTKRendering/VTKViewer.h"
-#include "vtkWindowToImageFilter.h"
-#include "vtkPNGWriter.h"
-#include "vtkChartXY.h"
-#include "vtkContextScene.h"
-#include "vtkContextActor.h"
-#include "vtkFloatArray.h"
-#include "vtkPlotPoints.h"
-#include "vtkTable.h"
-#include "vtkAxis.h"
-#include "vtkNew.h"
+
+// VTK includes
+#include <vtkWindowToImageFilter.h>
+#include <vtkPNGWriter.h>
+#include <vtkChartXY.h>
+#include <vtkContextScene.h>
+#include <vtkContextActor.h>
+#include <vtkFloatArray.h>
+#include <vtkPlotPoints.h>
+#include <vtkTable.h>
+#include <vtkAxis.h>
+#include <vtkNew.h>
+#include <vtkSmartPointer.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderWindow.h>
+#include <vtkObjectFactory.h>
 
 #define SPACE_EXPLORER_DEVICE true
 
+
+// Define custom interaction style
+class ScreenCaptureKeyPressEvent : public vtkInteractorStyleTrackballCamera
+{
+public:
+    struct screenShotData
+    {
+        vtkNew<vtkWindowToImageFilter> windowToImageFilter;
+        vtkNew<vtkPNGWriter> pngWriter;
+        bool triggerScreenCapture;
+        int screenShotNumber;
+
+        screenShotData() : triggerScreenCapture(false), screenShotNumber(0)
+        {
+            windowToImageFilter->SetMagnification(1);
+
+            windowToImageFilter->SetInputBufferTypeToRGB();
+
+            windowToImageFilter->ReadFrontBufferOff();
+
+            windowToImageFilter->Update();
+
+            pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort());
+        };
+
+        ~screenShotData(){};
+    };
+
+    static ScreenCaptureKeyPressEvent* New();
+    vtkTypeMacro(ScreenCaptureKeyPressEvent, vtkInteractorStyleTrackballCamera);
+
+    virtual void OnKeyPress()
+    {
+        // Get the key press
+        vtkRenderWindowInteractor *rwi = this->Interactor;
+        std::string key = rwi->GetKeySym();
+
+        // Capture the screen
+        if (key == " ");// || key == "S")
+        {
+            this->screenCaptureData->triggerScreenCapture = true;
+
+            if (this->screenCaptureData != nullptr)
+            {
+                if (this->screenCaptureData->triggerScreenCapture)
+                {
+                    this->screenCaptureData->windowToImageFilter->Modified();
+
+                    std::string captureName = "screenShot-"
+                        + std::to_string(this->screenCaptureData->screenShotNumber)
+                        + ".png";
+
+                    this->screenCaptureData->pngWriter->SetFileName(
+                        captureName.data());
+
+                    this->screenCaptureData->pngWriter->Write();
+
+                    std::cout <<
+                        "Screen shot "<<
+                        this->screenCaptureData->screenShotNumber <<" saved.\n";
+
+                    this->screenCaptureData->screenShotNumber++;
+                    this->screenCaptureData->triggerScreenCapture = false;
+                }
+            }
+        }
+
+        // Forward events
+        vtkInteractorStyleTrackballCamera::OnKeyPress();
+    }
+
+    void initialize(vtkWindow* rw)
+    {
+        this->screenCaptureData = std::make_shared<screenShotData>();
+        this->screenCaptureData->windowToImageFilter->SetInput(rw);
+    };
+
+private:
+
+    std::shared_ptr<screenShotData> screenCaptureData;
+};
+vtkStandardNewMacro(ScreenCaptureKeyPressEvent);
+
 ///
 /// \brief Create camera navigation scene
 ///
@@ -413,15 +501,19 @@ int main(int ac, char** av)
 
     //-------------------------------------------------------
 
-    // Add a camera controller
-    std::shared_ptr<LaparoscopicCameraController> camController =
-        addCameraController(sdk);
+    std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer);
 
     // Enable screenshot capture
-    camController->enableScreenCapture();
+    auto style = vtkSmartPointer<ScreenCaptureKeyPressEvent>::New();
+    style->initialize(vtkViewer->getRenderWindow());
+    vtkViewer->getVtkRenderWindowInteractor()->SetInteractorStyle(style);
+    style->SetCurrentRenderer(vtkViewer->getVtkRenderer());
 
-    std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer);
-    vtkViewer->setScreenCaptureData(camController->getScreenCaptureData());
+    // Add a camera controller
+    // NOTE: This has to come after the ScreenCaptureKeyPressEvent initialization
+    // since for this to work the mouse events need disabled which are
+    // left as is after ScreenCaptureKeyPressEvent initialization
+    std::shared_ptr<LaparoscopicCameraController> camController = addCameraController(sdk);
 
     // Add a 2D overlay on the 3D scene
     add2DOverlay(vtkViewer);
diff --git a/VTKRendering/VTKViewer.cpp b/VTKRendering/VTKViewer.cpp
index 419dbb300e5e7bd5246b186d2037891bba51f03a..eded10a2fa209b7731710a4938cb7c78e8798fe1 100644
--- a/VTKRendering/VTKViewer.cpp
+++ b/VTKRendering/VTKViewer.cpp
@@ -41,6 +41,7 @@
 #include <vtkAxesActor.h>
 #include <vtkOrientationMarkerWidget.h>
 
+
 ///
 /// \brief Wrapper to the vtkRendering pipeline
 ///
@@ -74,25 +75,6 @@ public:
                         updateCamera();
                     }
 
-                    if (this->screenCaptureData != nullptr)
-                    {
-                        if (this->screenCaptureData->triggerScreenCapture)
-                        {
-                            this->screenCaptureData->windowToImageFilter->Modified();
-
-                            std::string captureName = "screenShot-"
-                                + std::to_string(this->screenCaptureData->screenShotNumber)
-                                + ".png";
-
-                            this->screenCaptureData->pngWriter->SetFileName(
-                                captureName.data());
-
-                            this->screenCaptureData->pngWriter->Write();
-
-                            this->screenCaptureData->screenShotNumber++;
-                            this->screenCaptureData->triggerScreenCapture = false;
-                        }
-                    }
                     this->renderWindow->Render();
                 }
                 break;
@@ -340,7 +322,6 @@ public:
     vtkNew<vtkRenderWindow> renderWindow;
     vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
     std::shared_ptr<cameraConfigurationData> cameraControllerData;
-    std::shared_ptr<screenShotData> screenCaptureData;
 };
 
 VTKViewer::VTKViewer() : renderer(Core::make_unique<VTKRenderer> (this))
@@ -371,6 +352,11 @@ void VTKViewer::render()
     this->endModule();
 }
 
+vtkRenderWindow* VTKViewer::getRenderWindow() const
+{
+    return this->renderer->getRenderWindow();
+}
+
 vtkCamera* VTKViewer::getVtkCamera()
 {
     return this->renderer->getRenderWindow()->GetRenderers()->
@@ -382,14 +368,14 @@ void VTKViewer::setCameraControllerData(std::shared_ptr<cameraConfigurationData>
     renderer->cameraControllerData = camData;
 }
 
-void VTKViewer::setScreenCaptureData(std::shared_ptr<screenShotData> data)
+vtkRenderer* VTKViewer::getVtkRenderer()
 {
-    renderer->screenCaptureData = data;
-
-    this->renderer->getRenderWindow()->SetAlphaBitPlanes(1);
+    return this->renderer->getRenderWindow()->GetRenderers()->GetFirstRenderer();
+}
 
-    renderer->screenCaptureData->windowToImageFilter->SetInput(
-        this->renderer->getRenderWindow());
+vtkRenderWindowInteractor* VTKViewer::getVtkRenderWindowInteractor()
+{
+    return this->renderer->renderWindowInteractor.GetPointer();
 }
 
 void VTKViewer::addChartActor(vtkContextActor* chartActor, vtkContextScene* chartScene)
diff --git a/VTKRendering/VTKViewer.h b/VTKRendering/VTKViewer.h
index a81a75afd47519014da465cb3ce38758ccae86c2..d124f8da1ddf4431ac009c451c4ce0f4cf99689d 100644
--- a/VTKRendering/VTKViewer.h
+++ b/VTKRendering/VTKViewer.h
@@ -24,12 +24,17 @@
 #ifndef VTKVIEWER_H
 #define VTKVIEWER_H
 
+
 #include "Core/ViewerBase.h"
 #include "VirtualTools/LaparoscopicCameraController.h"
 #include "vtkContextActor.h"
 #include "vtkContextScene.h"
+#include "vtkInteractorStyleTrackballCamera.h"
+#include "vtkRenderWindowInteractor.h"
 
 class vtkCamera;
+class vtkRenderWindowInteractor;
+class vtkRenderer;
 
 class VTKViewer : public ViewerBase
 {
@@ -93,15 +98,22 @@ public:
     void setCameraControllerData(std::shared_ptr<cameraConfigurationData> camData);
 
 	///
-	/// \brief Set the data related to screen capture
+	/// \brief
+	///
+    vtkRenderer* getVtkRenderer();
+
+	///
+	/// \brief
 	///
-    void setScreenCaptureData(std::shared_ptr<screenShotData> data);
+    vtkRenderWindowInteractor* getVtkRenderWindowInteractor();
 
     ///
     /// \brief Add chart actor to the renderer
     ///
     void addChartActor(vtkContextActor* chartActor, vtkContextScene* chartScene);
 
+    vtkRenderWindow* getRenderWindow() const;
+
 protected:
     ///
     /// \brief Renders the render operation to screen
@@ -156,7 +168,6 @@ protected:
     /// \brief Render scene
     ///
     void render() override;
-
 private:
     class VTKRenderer;
     std::unique_ptr<VTKRenderer> renderer;
diff --git a/VirtualTools/LaparoscopicCameraController.cpp b/VirtualTools/LaparoscopicCameraController.cpp
index a17f1d075138f71ccdd921e77ac513ae494de5cd..80a4142fd7c9694c649e1a88684955625c53576f 100644
--- a/VirtualTools/LaparoscopicCameraController.cpp
+++ b/VirtualTools/LaparoscopicCameraController.cpp
@@ -156,11 +156,6 @@ void LaparoscopicCameraController::exec()
             this->terminate();
         }
 
-        if (this->inputDevice->getButton(1))
-        {
-            this->screenCaptureData->triggerScreenCapture = true;
-        }
-
         std::this_thread::sleep_for(poolDelay);
     }
     this->inputDevice->closeDevice();
@@ -176,22 +171,22 @@ bool LaparoscopicCameraController::updateCamera()
         return false;
     }
 
-    if (this->inputDevice->getButton(0) && angleY < maxAngleY)
+    if (this->inputDevice->getButton(3) && angleY < maxAngleY)
     {
         angleY += deltaAngleXY;
     }
 
-    if (this->inputDevice->getButton(1) && angleY > minAngleY)
+    if (this->inputDevice->getButton(4) && angleY > minAngleY)
     {
         angleY -= deltaAngleXY;
     }
 
-    if (this->inputDevice->getButton(3) && angleX < maxAngleX)
+    if (this->inputDevice->getButton(0) && angleX < maxAngleX)
     {
         angleX += deltaAngleXY;
     }
 
-    if (this->inputDevice->getButton(4) && angleX > minAngleX)
+    if (this->inputDevice->getButton(1) && angleX > minAngleX)
     {
         angleX -= deltaAngleXY;
     }
@@ -250,14 +245,4 @@ double LaparoscopicCameraController::getBendingRadius() const
 void LaparoscopicCameraController::setBendingRadius(const double val)
 {
     bendingRadius = val;
-}
-
-std::shared_ptr<screenShotData> LaparoscopicCameraController::getScreenCaptureData()
-{
-    return screenCaptureData;
-}
-
-void LaparoscopicCameraController::enableScreenCapture()
-{
-    this->screenCaptureData = std::make_shared<screenShotData>();
 }
\ No newline at end of file
diff --git a/VirtualTools/LaparoscopicCameraController.h b/VirtualTools/LaparoscopicCameraController.h
index 9ba2560403d3bfa7f066b118d592de31b41920bb..f0e25e0766f2d631fcfe9659de906831a42ba0f6 100644
--- a/VirtualTools/LaparoscopicCameraController.h
+++ b/VirtualTools/LaparoscopicCameraController.h
@@ -51,29 +51,6 @@ struct cameraConfigurationData
     ~cameraConfigurationData(){};
 };
 
-struct screenShotData
-{
-    vtkNew<vtkWindowToImageFilter> windowToImageFilter;
-    vtkNew<vtkPNGWriter> pngWriter;
-    bool triggerScreenCapture;
-    int screenShotNumber;
-
-    screenShotData() : triggerScreenCapture(false), screenShotNumber(0)
-    {
-        windowToImageFilter->SetMagnification(1);
-
-        windowToImageFilter->SetInputBufferTypeToRGB();
-
-        windowToImageFilter->ReadFrontBufferOff();
-
-        windowToImageFilter->Update();
-
-        pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort());
-    };
-
-    ~screenShotData(){};
-};
-
 ///
 /// \class LaparoscopicCameraController
 ///
@@ -218,16 +195,6 @@ public:
     double getBendingRadius() const;
     void setBendingRadius(const double val);
 
-	///
-	/// \brief Get the screen capture related data
-	///
-    std::shared_ptr<screenShotData> getScreenCaptureData();
-
-	///
-	/// \brief Initializes screen capture capability
-	///
-    void enableScreenCapture();
-
     ///
     /// \brief Module overrides
     ///
@@ -271,10 +238,6 @@ private:
     double deltaAngleXY;
 
     std::shared_ptr<cameraConfigurationData> cameraPosOrientData;//!< camera config data
-
-    std::shared_ptr<screenShotData> screenCaptureData;
-
-    std::shared_ptr<vtkWindowToImageFilter> windowToImageFilter;
 };
 
 #endif // iSMTK_LAPAROSCOPIC_CAMERA_COUPLER_H