diff --git a/Examples/LaparoscopicCamera/CMakeLists.txt b/Examples/LaparoscopicCamera/CMakeLists.txt
index b3765e32144dfd6ea2695c7944de214b8d2c65ad..85fd56d0e8c7acd59ccba7cc1fe47e4e2dd2deae 100644
--- a/Examples/LaparoscopicCamera/CMakeLists.txt
+++ b/Examples/LaparoscopicCamera/CMakeLists.txt
@@ -24,8 +24,8 @@ if(NOT EXISTS ${${APP}_DATA})
     file(MAKE_DIRECTORY ${${APP}_DATA})
 endif()
 
-set(FILE_URL http://midas3.kitware.com/midas/download/item/318830/CameraNavAppData.tar)
-set(FILE_SHA1 ef20afc9043178a4b9e2245560702f82168261fa)
+set(FILE_URL http://midas3.kitware.com/midas/download/item/318840/CameraNavAppData.tar)
+set(FILE_SHA1 6032b3f2779f9fd479e67bf22b5a4fd6bbf13e11)
 set(LOCAL_FILE ${EXAMPLES_DATA}/CameraNavAppData.tar)
 
 
@@ -33,8 +33,8 @@ midas_download(${FILE_URL} ${FILE_SHA1} ${LOCAL_FILE})
 
 # Extract data
 set(DATA
-    ${${APP}_DATA}/Target-marker.vtk
-    ${${APP}_DATA}/Target.vtk
+    ${${APP}_DATA}/target.png
+    ${${APP}_DATA}/viewfinder.png
 )
 
 add_custom_command(
diff --git a/Examples/LaparoscopicCamera/main.cpp b/Examples/LaparoscopicCamera/main.cpp
index 59c2748827a323211f1ed375cbf8ceb0b11e6244..a1e08608bc20b9deae568dc2a8532a1448d8aff4 100644
--- a/Examples/LaparoscopicCamera/main.cpp
+++ b/Examples/LaparoscopicCamera/main.cpp
@@ -23,27 +23,37 @@
 #include "VTKRendering/VTKViewer.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>
+// Screenshot
+#include <vtkObjectFactory.h>
 #include <vtkInteractorStyleTrackballCamera.h>
 #include <vtkRenderWindowInteractor.h>
 #include <vtkRenderWindow.h>
-#include <vtkObjectFactory.h>
+#include <vtkWindowToImageFilter.h>
+#include <vtkPNGWriter.h>
+// 2d overlay
+#include <vtkPNGReader.h>
+#include <vtkImageResize.h>
+#include <vtkImageTranslateExtent.h>
+#include <vtkImageMapper.h>
+#include <vtkActor2D.h>
+#include <vtkRendererCollection.h>
+#include <vtkRenderer.h>
 
 #define SPACE_EXPLORER_DEVICE true
 
+const float X = 8;
+const float Y = 6;
+const float Z = 6;
+const float pY = 0.25;
+const float pZ = 0.25;
+const double radius = 3.0;
+const double scaling = 0.15;
+const double planeWidth = 10;
+const int overlaySize = 400;
 
 // Define custom interaction style
-class ScreenCaptureKeyPressEvent : public vtkInteractorStyleTrackballCamera
+class ScreenCaptureInteractorStyle : public vtkInteractorStyleTrackballCamera
 {
 public:
     struct screenShotData
@@ -69,8 +79,8 @@ public:
         ~screenShotData(){};
     };
 
-    static ScreenCaptureKeyPressEvent* New();
-    vtkTypeMacro(ScreenCaptureKeyPressEvent, vtkInteractorStyleTrackballCamera);
+    static ScreenCaptureInteractorStyle* New();
+    vtkTypeMacro(ScreenCaptureInteractorStyle, vtkInteractorStyleTrackballCamera);
 
     virtual void OnKeyPress()
     {
@@ -122,105 +132,157 @@ private:
 
     std::shared_ptr<screenShotData> screenCaptureData;
 };
-vtkStandardNewMacro(ScreenCaptureKeyPressEvent);
+vtkStandardNewMacro(ScreenCaptureInteractorStyle);
 
 ///
 /// \brief Create camera navigation scene
 ///
 bool createCameraNavigationScene(
-    std::shared_ptr<SDK> sdk,
-    const char* fileName,
-    const char* fileNameTarget)
+    std::shared_ptr<Scene> scene,
+    const char* targetFileName)
 {
+
     //-------------------------------------------------------
-    // Create plane
+    // Lights
     //-------------------------------------------------------
-    auto staticSimulator = std::make_shared<DefaultSimulator>(sdk->getErrorLog());
-
-    // create a static plane scene object of given normal and position
-    auto staticObject = std::make_shared<StaticSceneObject>();
-
-    auto plane = std::make_shared<PlaneCollisionModel>(
-        core::Vec3d(0.0, -0.01, 0.0),
-        core::Vec3d(0.0, 1.0, 0.0));
-
-    plane->getPlaneModel()->setWidth(5);
-    staticObject->setModel(plane);
-
-    auto planeRendDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS);
-
-    planeRendDetail->setAmbientColor(Color(0.4, 0.4, 0.4, 1.0));
-    planeRendDetail->setDiffuseColor(Color(0.4, 0.4, 0.4, 1.0));
-    planeRendDetail->setSpecularColor(Color(0.4, 0.4, 0.4, 1.0));
-    planeRendDetail->setShininess(50.0);
+    auto light1 = Light::getDefaultLighting();
+    light1->lightPos.setPosition(core::Vec3d(-25.0, 10.0, 10.0));
+    scene->addLight(light1);
 
-    plane->getPlaneModel()->setRenderDetail(planeRendDetail);
+    auto light2 = Light::getDefaultLighting();
+    light2->lightPos.setPosition(core::Vec3d(25.0, 10.0, 10.0));
+    scene->addLight(light2);
 
-    sdk->getScene(0)->addSceneObject(staticObject);
+    auto light3 = Light::getDefaultLighting();
+    light3->lightPos.setPosition(core::Vec3d(0.0, 25.0, 0.0));
+    scene->addLight(light3);
 
     //-------------------------------------------------------
-    // Create target blocks
+    // Plane
     //-------------------------------------------------------
 
-    Color grey(0.32, 0.32, 0.32, 1.0);
+    Color planeColor(0.4, 0.4, 0.4, 1.0);
 
-    auto meshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS);
+    auto planeRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS);
+    planeRenderDetail->setAmbientColor(planeColor);
+    planeRenderDetail->setDiffuseColor(planeColor);
+    planeRenderDetail->setSpecularColor(planeColor);
+    planeRenderDetail->setShininess(50.0);
 
-    meshRenderDetail->setAmbientColor(grey);
-    meshRenderDetail->setDiffuseColor(grey);
-    meshRenderDetail->setSpecularColor(grey);
-    meshRenderDetail->setShininess(100.0);
+    auto planeModel = std::make_shared<PlaneCollisionModel>(
+          core::Vec3d(0.0, -0.01, 0.0),
+          core::Vec3d(0.0, 1.0, 0.0));
+    planeModel->getPlaneModel()->setRenderDetail(planeRenderDetail);
+    planeModel->getPlaneModel()->setWidth(planeWidth);
 
-    double radius = 3.0;
-    for (int i = 0; i < 6; i++)
-    {
-        auto staticBlock = std::make_shared<StaticSceneObject>();
+    auto planeObject = std::make_shared<StaticSceneObject>();
+    planeObject->setModel(planeModel);
 
-        auto targetBlock = std::make_shared<MeshCollisionModel>();
-        targetBlock->loadTriangleMesh(fileName);
-        targetBlock->getMesh()->scale(Eigen::UniformScaling<double>(0.15));//0.2
-        staticBlock->setModel(targetBlock);
-
-        targetBlock->setRenderDetail(meshRenderDetail);
-
-        sdk->getScene(0)->addSceneObject(staticBlock);
-
-        targetBlock->getMesh()->translate(Eigen::Translation3d(0, 0, -radius));
-
-        Eigen::Quaterniond q(cos(i*22.0/42), 0, sin(i*22.0/42), 0);
-        q.normalize();
-        targetBlock->getMesh()->rotate(q);
-    }
+    scene->addSceneObject(planeObject);
 
     //-------------------------------------------------------
-    // Create targets
+    // Blocks
     //-------------------------------------------------------
-    auto meshRenderDetail2 = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS);
 
-    meshRenderDetail2->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0));
-    meshRenderDetail2->setDiffuseColor(Color(0.8, 0.0, 0.0, 1.0));
-    meshRenderDetail2->setSpecularColor(Color(0.4, 0.4, 0.4, 1.0));
-    meshRenderDetail2->setShininess(100.0);
+    Color meshColor(0.32, 0.32, 0.32, 1.0);
+
+    std::shared_ptr<RenderDetail> targetRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_TEXTURE);
+    std::shared_ptr<RenderDetail> blockRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS);
+    blockRenderDetail->setAmbientColor(meshColor);
+    blockRenderDetail->setDiffuseColor(meshColor);
+    blockRenderDetail->setSpecularColor(meshColor);
+    blockRenderDetail->setShininess(100.0);
 
     for (int i = 0; i < 6; i++)
     {
-        auto staticTarget = std::make_shared<StaticSceneObject>();
-
-        auto targetModel = std::make_shared<MeshCollisionModel>();
-        targetModel->loadTriangleMesh(fileNameTarget);
-        targetModel->getMesh()->translate(Eigen::Translation3d(0, 0.02, 0.02));
-        targetModel->getMesh()->scale(Eigen::UniformScaling<double>(0.15));
-        staticTarget->setModel(targetModel);
-
-        targetModel->setRenderDetail(meshRenderDetail2);
-
-        sdk->getScene(0)->addSceneObject(staticTarget);
-
-        targetModel->getMesh()->translate(Eigen::Translation3d(0, 0, -radius));
-
-        Eigen::Quaterniond q(cos(i*22.0 / 42), 0, sin(i*22.0 / 42), 0);
+        // transformations
+        Eigen::UniformScaling<double> s(scaling);
+        Eigen::Translation3d t1(0, 0, -radius);
+        Eigen::Translation3d t2(0, 0, -radius+0.01);
+        Eigen::Quaterniond q(cos(i*22.0/42), 0, sin(i*22.0/42), 0);
         q.normalize();
+
+        // BLOCKS
+        // surface mesh
+        std::vector<core::Vec3d> blockPts = {core::Vec3d( X/2, 0, -Z/2), core::Vec3d( X/2, 0, Z/2),
+                                             core::Vec3d( -X/2, 0, Z/2), core::Vec3d( -X/2, 0, -Z/2),
+                                             core::Vec3d( -X/2, Y, -Z/2), core::Vec3d( X/2, Y, -Z/2),
+                                             core::Vec3d( -X/2, Y, Z*(pZ-0.5)), core::Vec3d( X/2, Y, Z*(pZ-0.5)),
+                                             core::Vec3d( -X/2, Y*pY, Z/2), core::Vec3d( X/2, Y*pY, Z/2)};
+        std::vector<std::array<size_t,3>> blockTriangles = {{{ 0, 1, 2}}, {{ 0, 2, 3}},
+                                                            {{ 0, 3, 4}}, {{ 5, 0, 4}},
+                                                            {{ 5, 4, 6}}, {{ 7, 5, 6}},
+                                                            {{ 6, 8, 9}}, {{ 6, 9, 7}},
+                                                            {{ 2, 1, 9}}, {{ 8, 2, 9}},
+                                                            {{ 3, 6, 4}}, {{ 3, 8, 6}},
+                                                            {{ 3, 2, 8}}, {{ 5, 7, 0}},
+                                                            {{ 7, 9, 0}}, {{ 9, 1, 0}}};
+        std::shared_ptr<SurfaceMesh> blockMesh = std::make_shared<SurfaceMesh>();
+        blockMesh->setVertices(blockPts);
+        blockMesh->setTriangles(blockTriangles);
+
+        // model
+        std::shared_ptr<MeshCollisionModel> blockModel = std::make_shared<MeshCollisionModel>();
+        blockModel->setMesh(blockMesh);
+        blockModel->setRenderDetail(blockRenderDetail);
+        blockModel->getMesh()->scale(s);
+        blockModel->getMesh()->translate(t1);
+        blockModel->getMesh()->rotate(q);
+
+        // object
+        std::shared_ptr<StaticSceneObject> blockObject = std::make_shared<StaticSceneObject>();
+        blockObject->setModel(blockModel);
+        scene->addSceneObject(blockObject);
+
+        // TARGETS
+        // surface mesh
+        core::Vec3d topLeftEdge(-X/2, Y, Z*(pZ-0.5));
+        core::Vec3d topRightEdge(X/2, Y, Z*(pZ-0.5));
+        core::Vec3d bottomLeftEdge(-X/2, Y*pY, Z/2);
+        core::Vec3d bottomRightEdge(X/2, Y*pY, Z/2);
+        std::vector<core::Vec3d> points = {topLeftEdge, topRightEdge, bottomLeftEdge, bottomRightEdge};
+        std::array<size_t, 3> tri1 = {{ 0, 1, 2}};
+        std::array<size_t, 3> tri2 = {{ 1, 2, 3}};
+        std::vector<std::array<size_t,3>> triArray = {tri1, tri2};
+        std::shared_ptr<SurfaceMesh> surfaceMesh = std::make_shared<SurfaceMesh>();
+        surfaceMesh->setVertices(points);
+        surfaceMesh->setTriangles(triArray);
+
+        // model
+        std::shared_ptr<MeshCollisionModel> targetModel = std::make_shared<MeshCollisionModel>();
+        targetModel->setMesh(surfaceMesh);
+        targetModel->setRenderDetail(targetRenderDetail);
+        targetModel->getMesh()->scale(s);
+        targetModel->getMesh()->translate(t2);
         targetModel->getMesh()->rotate(q);
+        targetModel->addTexture(targetFileName, "target");
+
+        // Texture Coordinates
+        double height = (bottomLeftEdge - topLeftEdge).norm();
+        double width = (bottomLeftEdge - bottomRightEdge).norm();
+        double dist = std::min(height, width);
+        double dx = 0.0, dy = 0.0;
+        if(dist == height)
+        {
+            double x_a = bottomLeftEdge[0];
+            double x_b = bottomRightEdge[0];
+            dx = std::abs((x_b-x_a-dist)/(2*dist));
+        }
+        else
+        {
+            double y_a = bottomLeftEdge[1];
+            double y_b = topLeftEdge[1];
+            dy = std::abs((y_b-y_a-dist)/(2*dist));
+        }
+        surfaceMesh->addTextureCoordinate(1.0+dx,-dy);
+        surfaceMesh->addTextureCoordinate(-dx,-dy);
+        surfaceMesh->addTextureCoordinate(1.0+dx,1.0+dy);
+        surfaceMesh->addTextureCoordinate(-dx,1.0+dy);
+
+        // object
+        std::shared_ptr<StaticSceneObject> targetObject = std::make_shared<StaticSceneObject>();
+        targetObject->setModel(targetModel);
+        scene->addSceneObject(targetObject);
     }
     return true;
 }
@@ -228,175 +290,41 @@ bool createCameraNavigationScene(
 ///
 ///	 \brief Add a 2D overlay of target markers on a 3D scene
 ///
-void add2DOverlay(std::shared_ptr<VTKViewer> vtkViewer)
+void add2DOverlay(std::shared_ptr<VTKViewer> vtkViewer,
+                  const char* fileName)
 {
-    vtkNew<vtkChartXY> chart;
-    vtkNew<vtkContextScene> chartScene;
-    vtkNew<vtkContextActor> chartActor;
-
-    // configure the chart
-    chart->SetAutoSize(true);
-    chart->SetSize(vtkRectf(0.0, 0.0, 300, 200));
-
-    chart->GetAxis(0)->SetGridVisible(false);
-    chart->GetAxis(1)->SetGridVisible(false);
-
-    chart->GetAxis(0)->SetAxisVisible(false);
-    chart->GetAxis(1)->SetAxisVisible(false);
-
-    chart->GetAxis(0)->SetTicksVisible(false);
-    chart->GetAxis(1)->SetTicksVisible(false);
-
-    chart->GetAxis(0)->SetLabelsVisible(false);
-    chart->GetAxis(1)->SetLabelsVisible(false);
-
-    chart->GetAxis(0)->SetTitle("");
-    chart->GetAxis(1)->SetTitle("");
-
-    chartScene->AddItem(chart.GetPointer());
-    chartActor->SetScene(chartScene.GetPointer());
-
-    //Add both to the renderer
-    vtkViewer->addChartActor(chartActor.GetPointer(), chartScene.GetPointer());
-
-    //----------------------------------------------------
-    // Add data points representing the concentric circles
-    //----------------------------------------------------
-    vtkNew<vtkTable> table;
-
-    vtkNew<vtkFloatArray> circle1X;
-    circle1X->SetName("Circle 1 X");
-    table->AddColumn(circle1X.GetPointer());
-
-    vtkNew<vtkFloatArray> circle1Y;
-    circle1Y->SetName("Circle 1 Y");
-    table->AddColumn(circle1Y.GetPointer());
-
-    vtkNew<vtkFloatArray> circle2X;
-    circle2X->SetName("Circle 2 X");
-    table->AddColumn(circle2X.GetPointer());
-
-    vtkNew<vtkFloatArray> circle2Y;
-    circle2Y->SetName("Circle 2 Y");
-    table->AddColumn(circle2Y.GetPointer());
-
-    // Test charting with a few more points...
-    int numPoints = 100;
-    float range = 10.0;
-    double xRange[2] = { 0.0, range };
-    double yRange[2] = { 0.0, range };
-
-    chart->GetAxis(0)->SetRange(xRange);
-    chart->GetAxis(1)->SetRange(yRange);
-
-    /*chart->GetAxis(0)->SetUnscaledRange(xRange);
-    chart->GetAxis(1)->SetUnscaledRange(yRange);*/
-
-    table->SetNumberOfRows(numPoints + 1);
-
-    double radius1 = range / 8;
-    double radius2 = range / 10;
-    double theta;
-
-    for (int i = 0; i < numPoints; i++)
-    {
-        theta = 11.0 / 7 + i * 44.0 / (7 * numPoints);
-
-        table->SetValue(i, 0, range / 2 + radius1*cos(theta));
-        table->SetValue(i, 1, range / 2 + radius1*sin(theta));
-
-        table->SetValue(i, 2, range / 2 + radius2*cos(theta));
-        table->SetValue(i, 3, range / 2 + radius2*sin(theta));
-    }
-    theta = 11.0 / 7;
-    table->SetValue(numPoints, 0, range / 2 + radius1*cos(theta));
-    table->SetValue(numPoints, 1, range / 2 + radius1*sin(theta));
-    table->SetValue(numPoints, 2, range / 2 + radius2*cos(theta));
-    table->SetValue(numPoints, 3, range / 2 + radius2*sin(theta));
-
-    double lineWidth = 2.0;
-    vtkPlot *points1 = chart->AddPlot(vtkChart::LINE);
-    points1->SetInputData(table.GetPointer(), 0, 1);
-    points1->SetColor(1, 0, 0, 255);
-    points1->SetWidth(lineWidth);
-
-    vtkPlot *points2 = chart->AddPlot(vtkChart::LINE);
-    points2->SetInputData(table.GetPointer(), 2, 3);
-    points2->SetColor(1, 0, 0, 255);
-    points2->SetWidth(lineWidth);
-
-    //--------------------------------------------------
-    // Add data points representing the parallel lines
-    //--------------------------------------------------
-    vtkNew<vtkTable> table2;
-
-    vtkNew<vtkFloatArray> parallelLineTopX;
-    parallelLineTopX->SetName("parallel Line Top X");
-    table2->AddColumn(parallelLineTopX.GetPointer());
-
-    vtkNew<vtkFloatArray> parallelLineTopY;
-    parallelLineTopY->SetName("parallel Line Top Y");
-    table2->AddColumn(parallelLineTopY.GetPointer());
-
-    vtkNew<vtkFloatArray> parallelLineBottomX;
-    parallelLineBottomX->SetName("parallel Line Bottom X");
-    table2->AddColumn(parallelLineBottomX.GetPointer());
-
-    vtkNew<vtkFloatArray> parallelLineBottomY;
-    parallelLineBottomY->SetName("parallel Line Bottom Y");
-    table2->AddColumn(parallelLineBottomY.GetPointer());
-
-    table2->SetNumberOfRows(2);
-    double deltaTheta=0.07;
-
-    theta = 11.0 / 7 + (1 - deltaTheta)*11.0 / 7;
-    table2->SetValue(0, 0, range / 2 + radius1*cos(theta));
-    table2->SetValue(0, 1, range / 2 + radius1*sin(theta));
-
-    theta = deltaTheta*11.0 / 7;
-    table2->SetValue(1, 0, range / 2 + radius1*cos(theta));
-    table2->SetValue(1, 1, range / 2 + radius1*sin(theta));
-
-    theta = 11.0 / 7 + (1 + deltaTheta)*11.0 / 7;
-    table2->SetValue(0, 2, range / 2 + radius1*cos(theta));
-    table2->SetValue(0, 3, range / 2 + radius1*sin(theta));
-
-    theta = -deltaTheta*11.0 / 7;
-    table2->SetValue(1, 2, range / 2 + radius1*cos(theta));
-    table2->SetValue(1, 3, range / 2 + radius1*sin(theta));
-
-    vtkPlot *points3 = chart->AddPlot(vtkChart::LINE);
-    points3->SetInputData(table2.GetPointer(), 0, 1);
-    points3->SetColor(1, 0, 0, 255);
-    points3->SetWidth(lineWidth);
-
-    vtkPlot *points4 = chart->AddPlot(vtkChart::LINE);
-    points4->SetInputData(table2.GetPointer(), 2, 3);
-    points4->SetColor(1, 0, 0, 255);
-    points4->SetWidth(lineWidth);
-
-    //-----------------------------------------------------------
-    // Add data points to hack disabling the autoscaling of chart
-    //-----------------------------------------------------------
-    vtkNew<vtkTable> table3;
-
-    vtkNew<vtkFloatArray> cornerPointX;
-    cornerPointX->SetName("Corner point X");
-    table3->AddColumn(cornerPointX.GetPointer());
-
-    vtkNew<vtkFloatArray> cornerPointY;
-    cornerPointY->SetName("Corner point Y");
-    table3->AddColumn(cornerPointY.GetPointer());
-
-    table3->SetNumberOfRows(2);
-    table3->SetValue(0, 0, 0);
-    table3->SetValue(0, 1, 0);
-    table3->SetValue(1, 0, range);
-    table3->SetValue(1, 1, range);
-
-    vtkPlot *points5 = chart->AddPlot(vtkChart::POINTS);
-    points5->SetInputData(table3.GetPointer(), 0, 1);
-    points5->SetColor(255, 255, 255, 0);
+    // Read the image
+    vtkNew<vtkPNGReader> reader;
+    reader->SetFileName(fileName);
+    reader->Update();
+
+    int dim[3] = {overlaySize, overlaySize, 1};
+
+    // Resize image
+    vtkNew<vtkImageResize> resize;
+    resize->SetInputConnection(reader->GetOutputPort());
+    resize->SetOutputDimensions(dim);
+
+    // Translate image extent (origin to its center)
+    vtkNew<vtkImageTranslateExtent> translateExtent;
+    translateExtent->SetInputConnection(resize->GetOutputPort());
+    translateExtent->SetTranslation(-dim[0]/2,-dim[1]/2,0);
+
+    // Mapper
+    vtkNew<vtkImageMapper> imageMapper;
+    imageMapper->SetInputConnection(translateExtent->GetOutputPort());
+    imageMapper->SetColorWindow(255);
+    imageMapper->SetColorLevel(127);
+
+    // Actor
+    vtkNew<vtkActor2D> imageActor;
+    imageActor->SetMapper(imageMapper.GetPointer());
+    imageActor->GetPositionCoordinate()->SetCoordinateSystemToNormalizedDisplay();
+    imageActor->SetPosition(0.5, 0.5);
+
+    // Renderer
+    vtkRenderer* rendererVtk = vtkViewer->getRenderWindow()->GetRenderers()->GetFirstRenderer();
+    rendererVtk->AddActor2D(imageActor.GetPointer());
 }
 
 ///
@@ -433,8 +361,6 @@ std::shared_ptr<LaparoscopicCameraController> addCameraController(std::shared_pt
     auto camController = std::make_shared<LaparoscopicCameraController>(camClient);
     camController->setScalingFactor(40.0);
 
-    viewer->init(); // viewer should be initialized to be able to retrieve the camera
-
     std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer);
 
     vtkCamera* cam = vtkViewer->getVtkCamera();
@@ -464,58 +390,59 @@ int main()
     initVTKRendering();
     initIODelegates();
 
-    auto sdk = SDK::createStandardSDK();
-
-    // Create camera navigation scene
-    createCameraNavigationScene(sdk, "./Target.vtk", "./Target-marker.vtk");
+    std::shared_ptr<SDK> sdk = SDK::createStandardSDK();
 
     //-------------------------------------------------------
     // Set up the viewer
     //-------------------------------------------------------
 
-    auto viewer = sdk->getViewerInstance();
+    std::shared_ptr<ViewerBase> viewer = sdk->getViewerInstance();
+    std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer);
 
+    // Set Render details
     viewer->setViewerRenderDetail(
         SIMMEDTK_VIEWERRENDER_GLOBALAXIS
         | SIMMEDTK_VIEWERRENDER_FADEBACKGROUND
         | SIMMEDTK_DISABLE_MOUSE_INTERACTION
         );
 
-    // Get Scene
-    auto scene = sdk->getScene(0);
-    viewer->registerScene(scene, SMRENDERTARGET_SCREEN, "Collision pipeline demo");
+    //-------------------------------------------------------
+    // Set up the scene
+    //-------------------------------------------------------
 
-    // Setup Scene lighting
-    auto light1 = Light::getDefaultLighting();
-    light1->lightPos.setPosition(core::Vec3d(-25.0, 10.0, 10.0));
-    scene->addLight(light1);
+    std::shared_ptr<Scene> scene = sdk->getScene(0);
+    viewer->registerScene(scene, SMRENDERTARGET_SCREEN, "Collision pipeline demo");
 
-    auto light2 = Light::getDefaultLighting();
-    light2->lightPos.setPosition(core::Vec3d(25.0, 10.0, 10.0));
-    scene->addLight(light2);
+    // Create camera navigation scene
+    createCameraNavigationScene(scene, "./CameraNavAppData/target.png");
 
-    auto light3 = Light::getDefaultLighting();
-    light3->lightPos.setPosition(core::Vec3d(0.0, 25.0, 0.0));
-    scene->addLight(light3);
+    // Initialize viewer with scene objects
+    // NOTE : Needs to be done before VTK Add ons since
+    // init create the needed renderer in the VTKView
+    viewer->init();
 
     //-------------------------------------------------------
-
-    std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer);
+    // Add ons (VTK)
+    //-------------------------------------------------------
 
     // Enable screenshot capture
-    auto style = vtkSmartPointer<ScreenCaptureKeyPressEvent>::New();
+    vtkNew<ScreenCaptureInteractorStyle> style;
     style->initialize(vtkViewer->getRenderWindow());
-    vtkViewer->getVtkRenderWindowInteractor()->SetInteractorStyle(style);
+    vtkViewer->getVtkRenderWindowInteractor()->SetInteractorStyle(style.GetPointer());
     style->SetCurrentRenderer(vtkViewer->getVtkRenderer());
 
     // Add a camera controller
-    // NOTE: This has to come after the ScreenCaptureKeyPressEvent initialization
+    // NOTE: This has to come after the ScreenCaptureInteractorStyle initialization
     // since for this to work the mouse events need disabled which are
-    // left as is after ScreenCaptureKeyPressEvent initialization
+    // left as is after ScreenCaptureInteractorStyle initialization
     std::shared_ptr<LaparoscopicCameraController> camController = addCameraController(sdk);
 
     // Add a 2D overlay on the 3D scene
-    add2DOverlay(vtkViewer);
+    add2DOverlay(vtkViewer,"./CameraNavAppData/viewfinder.png");
+
+    //-------------------------------------------------------
+    // Start
+    //-------------------------------------------------------
 
     // Run the SDK
     sdk->run();