diff --git a/Examples/LaparoscopicCamera/main.cpp b/Examples/LaparoscopicCamera/main.cpp
index ead6d80a16a327b79ee43cd63326f5f994652cf9..c45a079c7eb4af9b6d2f8b0f06cdf7485ae35918 100644
--- a/Examples/LaparoscopicCamera/main.cpp
+++ b/Examples/LaparoscopicCamera/main.cpp
@@ -52,11 +52,52 @@
 #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 "vtkNew.h"
+#include "vtkAxis.h"
 
 #define SPACE_EXPLORER_DEVICE true
 
+///
+/// \brief Create camera navigation scene
+///
 bool createCameraNavigationScene(std::shared_ptr<SDK> sdk, char* fileName)
 {
+    //-------------------------------------------------------
+    // Create scene actor 1:  plane
+    //-------------------------------------------------------
+    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_FACES);
+
+    Color grey(0.32, 0.32, 0.32, 1.0);
+
+    planeRendDetail->setAmbientColor(grey);
+    planeRendDetail->setDiffuseColor(grey);
+    planeRendDetail->setSpecularColor(grey);
+    planeRendDetail->setShininess(50.0);
+
+    plane->getPlaneModel()->setRenderDetail(planeRendDetail);
+
+    sdk->addSceneActor(staticObject, staticSimulator);
+
+    //-------------------------------------------------------
+    // Create targets
+    //-------------------------------------------------------
     auto meshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS);
 
     meshRenderDetail->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0));
@@ -89,82 +130,108 @@ bool createCameraNavigationScene(std::shared_ptr<SDK> sdk, char* fileName)
     return true;
 }
 
-int main(int ac, char** av)
+///
+///	 \brief Add a 2D overlay of target markers on a 3D scene
+///
+void add2DOverlay(std::shared_ptr<VTKViewer> vtkViewer)
 {
-    initVTKRendering();
-    initIODelegates();
-    const bool useVTKRenderer = true;
+    vtkNew<vtkChartXY> chart;
+    vtkNew<vtkContextScene> chartScene;
+    vtkNew<vtkContextActor> chartActor;
 
-    auto sdk = SDK::createStandardSDK();
+    // configure the chart
+    chart->SetAutoSize(true);
+    chart->SetSize(vtkRectf(0.0, 0.0, 300, 200));
 
-    //-------------------------------------------------------
-    // Create scene actor 1:  plane
-    //-------------------------------------------------------
-    auto staticSimulator = std::make_shared<DefaultSimulator>(sdk->getErrorLog());
+    chart->GetAxis(0)->SetGridVisible(false);
+    chart->GetAxis(1)->SetGridVisible(false);
 
-    // create a static plane scene object of given normal and position
-    auto staticObject = std::make_shared<StaticSceneObject>();
+    chart->GetAxis(0)->SetAxisVisible(false);
+    chart->GetAxis(1)->SetAxisVisible(false);
 
-    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);
-    if (ac > 2)
-      plane->getPlaneModel()->setWidth(atof(av[2]));
-    staticObject->setModel(plane);
+    chart->GetAxis(0)->SetTicksVisible(false);
+    chart->GetAxis(1)->SetTicksVisible(false);
 
-    auto planeRendDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES);
+    chart->GetAxis(0)->SetLabelsVisible(false);
+    chart->GetAxis(1)->SetLabelsVisible(false);
 
-    Color grey(0.32, 0.32, 0.32, 1.0);
+    chart->GetAxis(0)->SetTitle("");
+    chart->GetAxis(1)->SetTitle("");
 
-    planeRendDetail->setAmbientColor(grey);
-    planeRendDetail->setDiffuseColor(grey);
-    planeRendDetail->setSpecularColor(grey);
-    planeRendDetail->setShininess(50.0);
+    chartScene->AddItem(chart.GetPointer());
+    chartActor->SetScene(chartScene.GetPointer());
 
-    plane->getPlaneModel()->setRenderDetail(planeRendDetail);
+    //Add both to the renderer
+    vtkViewer->addChartActor(chartActor.GetPointer(), chartScene.GetPointer());
 
-    sdk->addSceneActor(staticObject, staticSimulator);
+    // Create a table with some points in it...
+    vtkNew<vtkTable> table;
 
-    //-------------------------------------------------------
-    // Create camera navigation scene
-    //-------------------------------------------------------
+    vtkNew<vtkFloatArray> arrX;
+    arrX->SetName("X Axis");
+    table->AddColumn(arrX.GetPointer());
 
-    createCameraNavigationScene(sdk, "./Target.vtk");
+    vtkNew<vtkFloatArray> arrC;
+    arrC->SetName("Cosine");
+    table->AddColumn(arrC.GetPointer());
 
-    //-------------------------------------------------------
-    // Set up the viewer
-    //-------------------------------------------------------
+    vtkNew<vtkFloatArray> arrS;
+    arrS->SetName("Sine");
+    table->AddColumn(arrS.GetPointer());
 
-    auto viewer = sdk->getViewerInstance();
+    vtkNew<vtkFloatArray> arrT;
+    arrT->SetName("Tan");
+    table->AddColumn(arrT.GetPointer());
 
-    viewer->setViewerRenderDetail(
-        SIMMEDTK_VIEWERRENDER_GLOBALAXIS
-        | SIMMEDTK_VIEWERRENDER_FADEBACKGROUND
-        | SIMMEDTK_DISABLE_MOUSE_INTERACTION
-        );
+    // 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 };
 
-    // Get Scene
-    auto scene = sdk->getScene(0);
-    viewer->registerScene(scene, SMRENDERTARGET_SCREEN, "Collision pipeline demo");
+    int s;
+    float radius = range / 6;
+    float inc = 2*radius / (numPoints - 1);
+    table->SetNumberOfRows(numPoints);
+    /*chart->GetAxis(0)->SetRange(xRange);
+    chart->GetAxis(1)->SetRange(yRange);*/
 
-    // Setup Scene lighting
-    auto light1 = Light::getDefaultLighting();
-    light1->lightPos.setPosition(core::Vec3d(-25.0, 10.0, 10.0));
-    scene->addLight(light1);
+    /*chart->GetAxis(0)->SetUnscaledRange(xRange);
+    chart->GetAxis(1)->SetUnscaledRange(yRange);*/
 
-    auto light2 = Light::getDefaultLighting();
-    light2->lightPos.setPosition(core::Vec3d(25.0, 10.0, 10.0));
-    scene->addLight(light2);
+    for (int i = 0; i < numPoints; ++i)
+    {
+        if (sin(i * 44 / (7 * numPoints)) < 0)
+            s = -1;
+        else
+            s = 1;
+
+        table->SetValue(i, 0, range / 2 + i*inc*s);
+        table->SetValue(i, 1, range / 2 + radius*cos(i * 22.0 / (7 * numPoints)));
+        table->SetValue(i, 2, range / 2 + radius*sin(i * 22.0 / (7 * numPoints)));
+    }
 
-    auto light3 = Light::getDefaultLighting();
-    light3->lightPos.setPosition(core::Vec3d(0.0, 25.0, 0.0));
-    scene->addLight(light3);
+    // Add multiple line plots, setting the colors etc
+    vtkPlot *points = chart->AddPlot(vtkChart::LINE);
+    points->SetInputData(table.GetPointer(), 2, 1);
+    points->SetColor(0, 0, 0, 255);
+    points->SetWidth(1.0);
+
+    /*vtkPlotPoints::SafeDownCast(points)->SetMarkerStyle(vtkPlotPoints::CROSS);
+    points = chart->AddPlot(vtkChart::LINE);
+    points->SetInputData(table.GetPointer(), 0, 2);
+    points->SetColor(0, 0, 0, 255);
+    points->SetWidth(1.0);*/
+}
+
+///
+/// \brief Create a Laparoscopic camera controller and connect
+/// it to the vtk viewer
+///
+std::shared_ptr<LaparoscopicCameraCoupler> addCameraController(std::shared_ptr<SDK> sdk)
+{
+    auto viewer = sdk->getViewerInstance();
 
-    //-------------------------------------------------------
-    // Create a Laparoscopic camera controller and connect
-    // it to the vtk viewer
-    //-------------------------------------------------------
     auto camClient = std::make_shared<VRPNForceDevice>();
     std::shared_ptr<VRPNDeviceServer> server;
     std::string input;
@@ -214,13 +281,64 @@ int main(int ac, char** av)
         sdk->registerModule(server);
     }
 
-    // Enable screenshot
-    camController->enableScreenCapture();
-    vtkViewer->setScreenCaptureData(camController->getScreenCaptureData());
+    return camController;
+}
+
+int main(int ac, char** av)
+{
+    initVTKRendering();
+    initIODelegates();
+    const bool useVTKRenderer = true;
+
+    auto sdk = SDK::createStandardSDK();
+
+    // Create camera navigation scene
+    createCameraNavigationScene(sdk, "./Target.vtk");
 
     //-------------------------------------------------------
-    // Run the SDK
+    // Set up the viewer
     //-------------------------------------------------------
+
+    auto viewer = sdk->getViewerInstance();
+
+    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");
+
+    // Setup Scene lighting
+    auto light1 = Light::getDefaultLighting();
+    light1->lightPos.setPosition(core::Vec3d(-25.0, 10.0, 10.0));
+    scene->addLight(light1);
+
+    auto light2 = Light::getDefaultLighting();
+    light2->lightPos.setPosition(core::Vec3d(25.0, 10.0, 10.0));
+    scene->addLight(light2);
+
+    auto light3 = Light::getDefaultLighting();
+    light3->lightPos.setPosition(core::Vec3d(0.0, 25.0, 0.0));
+    scene->addLight(light3);
+
+    //-------------------------------------------------------
+
+    // add a camera controller
+    std::shared_ptr<LaparoscopicCameraCoupler> camController = addCameraController(sdk);
+
+    // Enable screenshot capture
+    //camController->enableScreenCapture();
+
+    std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer);
+    //vtkViewer->setScreenCaptureData(camController->getScreenCaptureData());
+
+    // Add a 2D overlay on the 3D scene
+    add2DOverlay(vtkViewer);
+
+    // Run the SDK
     sdk->run();
 
     //cleanup
diff --git a/VTKRendering/VTKViewer.cpp b/VTKRendering/VTKViewer.cpp
index 7fae7d5f370f5153c6139b35e9e7ba48e37e6b02..68e94871b349cbf34a75e0e07b90e5a24408968c 100644
--- a/VTKRendering/VTKViewer.cpp
+++ b/VTKRendering/VTKViewer.cpp
@@ -73,25 +73,25 @@ public:
                         updateCamera();
                     }
 
-                    if (this->screenCaptureData != nullptr)
-                    {
-                        if (this->screenCaptureData->triggerScreenCapture)
-                        {
-                            //this->screenCaptureData->windowToImageFilter->Update();
+                    //if (this->screenCaptureData != nullptr)
+                    //{
+                    //    if (this->screenCaptureData->triggerScreenCapture)
+                    //    {
+                    //        //this->screenCaptureData->windowToImageFilter->Update();
 
-                            std::string captureName = "screenShot-"
-                                + std::to_string(this->screenCaptureData->screenShotNumber)
-                                + ".png";
+                    //        std::string captureName = "screenShot-"
+                    //            + std::to_string(this->screenCaptureData->screenShotNumber)
+                    //            + ".png";
 
-                            this->screenCaptureData->pngWriter->SetFileName(
-                                captureName.data());
+                    //        this->screenCaptureData->pngWriter->SetFileName(
+                    //            captureName.data());
 
-                            this->screenCaptureData->pngWriter->Write();
+                    //        this->screenCaptureData->pngWriter->Write();
 
-                            this->screenCaptureData->screenShotNumber++;
-                            this->screenCaptureData->triggerScreenCapture = false;
-                        }
-                    }
+                    //        this->screenCaptureData->screenShotNumber++;
+                    //        this->screenCaptureData->triggerScreenCapture = false;
+                    //    }
+                    //}
 
                     this->renderWindow->Render();
                 }
@@ -340,7 +340,7 @@ public:
     vtkNew<vtkRenderWindow> renderWindow;
     vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
     std::shared_ptr<cameraConfigurationData> cameraControllerData;
-    std::shared_ptr<screenShotData> screenCaptureData;
+    //std::shared_ptr<screenShotData> screenCaptureData;
 };
 
 VTKViewer::VTKViewer() : renderer(Core::make_unique<VTKRenderer> (this))
@@ -382,15 +382,25 @@ void VTKViewer::setCameraControllerData(std::shared_ptr<cameraConfigurationData>
     renderer->cameraControllerData = camData;
 }
 
-void VTKViewer::setScreenCaptureData(std::shared_ptr<screenShotData> data)
+//void VTKViewer::setScreenCaptureData(std::shared_ptr<screenShotData> data)
+//{
+//    renderer->screenCaptureData = data;
+//
+//    renderer->screenCaptureData->windowToImageFilter->SetInput(
+//        this->renderer->getRenderWindow());
+//}
+
+void VTKViewer::addChartActor(vtkContextActor* chartActor, vtkContextScene* chartScene)
 {
-    renderer->screenCaptureData = data;
+    vtkRenderer* rendererVtk =
+        this->renderer->getRenderWindow()->GetRenderers()->GetFirstRenderer();
+
+    rendererVtk->AddActor(chartActor);
 
-    renderer->screenCaptureData->windowToImageFilter->SetInput(
-        this->renderer->getRenderWindow());
+    chartScene->SetRenderer(rendererVtk);
 }
 
-void VTKViewer::initRenderingContext()
+void VTKViewer::initResources()
 {
     this->renderer->addRenderer();
 }
diff --git a/VTKRendering/VTKViewer.h b/VTKRendering/VTKViewer.h
index 89bf5ffa986753f5e8d5758aeac6a65fc54b355e..3aaab8345ea30935e96870c63e5bc21fa703acd5 100644
--- a/VTKRendering/VTKViewer.h
+++ b/VTKRendering/VTKViewer.h
@@ -93,16 +93,14 @@ public:
     void setCameraControllerData(std::shared_ptr<cameraConfigurationData> camData);
 
 	///
-	/// \brief Set the data realted to screen capture
+	/// \brief Set the data related to screen capture
 	///
-    void setScreenCaptureData(std::shared_ptr<screenShotData> data);
+    //void setScreenCaptureData(std::shared_ptr<screenShotData> data);
 
     ///
     /// \brief Add chart actor to the renderer
     ///
-    void addChartActor(
-        std::shared_ptr<vtkContextActor> chartActor,
-        std::shared_ptr<vtkContextScene> chartScene);
+    void addChartActor(vtkContextActor* chartActor, vtkContextScene* chartScene);
 
 protected:
     ///
diff --git a/VirtualTools/LaparoscopicCameraCoupler.cpp b/VirtualTools/LaparoscopicCameraCoupler.cpp
index 54cec32f3df9aa15a68154424f3dd47b2789ac4d..2e64a6a8fd9eaa64cde030d3231946fe93fbbe1d 100644
--- a/VirtualTools/LaparoscopicCameraCoupler.cpp
+++ b/VirtualTools/LaparoscopicCameraCoupler.cpp
@@ -155,10 +155,10 @@ void LaparoscopicCameraCoupler::exec()
             this->terminate();
         }
 
-        if (this->inputDevice->getButton(0))
+        /*if (this->inputDevice->getButton(0))
         {
-            this->screenCaptureData->triggerScreenCapture = true;
-        }
+        this->screenCaptureData->triggerScreenCapture = true;
+        }*/
 
         std::this_thread::sleep_for(poolDelay);
     }
@@ -251,12 +251,12 @@ void LaparoscopicCameraCoupler::setBendingRadius(const double val)
     bendingRadius = val;
 }
 
-std::shared_ptr<screenShotData> LaparoscopicCameraCoupler::getScreenCaptureData()
-{
-    return screenCaptureData;
-}
-
-void LaparoscopicCameraCoupler::enableScreenCapture()
-{
-    this->screenCaptureData = std::make_shared<screenShotData>();
-}
\ No newline at end of file
+//std::shared_ptr<screenShotData> LaparoscopicCameraCoupler::getScreenCaptureData()
+//{
+//    return screenCaptureData;
+//}
+//
+//void LaparoscopicCameraCoupler::enableScreenCapture()
+//{
+//    this->screenCaptureData = std::make_shared<screenShotData>();
+//}
\ No newline at end of file
diff --git a/VirtualTools/LaparoscopicCameraCoupler.h b/VirtualTools/LaparoscopicCameraCoupler.h
index a944016196381bfa9aceb747762a60e8f719f399..850afd0d1e46d415a5ac107fec512818e3e71f10 100644
--- a/VirtualTools/LaparoscopicCameraCoupler.h
+++ b/VirtualTools/LaparoscopicCameraCoupler.h
@@ -50,34 +50,34 @@ struct cameraConfigurationData
     ~cameraConfigurationData(){};
 };
 
-struct screenShotData
-{
-    std::shared_ptr<vtkWindowToImageFilter> windowToImageFilter;
-    std::shared_ptr<vtkPNGWriter> pngWriter;
-    bool triggerScreenCapture;
-    int screenShotNumber;
-
-    screenShotData() : triggerScreenCapture(false), screenShotNumber(0)
-    {
-        windowToImageFilter = std::make_shared<vtkWindowToImageFilter>();
-
-        windowToImageFilter->SetMagnification(3); //set the resolution of the output
-                                                  //image (3 times the current resolution
-                                                  // of vtk render window)
-
-        windowToImageFilter->SetInputBufferTypeToRGBA(); //also record the alpha
-                                                         // (transparency) channel
-
-        windowToImageFilter->ReadFrontBufferOff(); // read from the back buffer
-
-        windowToImageFilter->Update();
-
-        pngWriter = std::make_shared<vtkPNGWriter>();
-        pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort());
-    };
-
-    ~screenShotData(){};
-};
+//struct screenShotData
+//{
+//    std::shared_ptr<vtkWindowToImageFilter> windowToImageFilter;
+//    std::shared_ptr<vtkPNGWriter> pngWriter;
+//    bool triggerScreenCapture;
+//    int screenShotNumber;
+//
+//    screenShotData() : triggerScreenCapture(false), screenShotNumber(0)
+//    {
+//        windowToImageFilter = std::make_shared<vtkWindowToImageFilter>();
+//
+//        windowToImageFilter->SetMagnification(1); // set the resolution of the output
+//                                                  // image
+//
+//        windowToImageFilter->SetInputBufferTypeToRGBA(); // also record the alpha
+//                                                         // (transparency) channel
+//
+//        windowToImageFilter->ReadFrontBufferOff(); // read from the back buffer
+//
+//        windowToImageFilter->Update();
+//
+//        pngWriter = std::make_shared<vtkPNGWriter>();
+//
+//        pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort());
+//    };
+//
+//    ~screenShotData(){};
+//};
 
 class LaparoscopicCameraCoupler : public Module
 {
@@ -217,12 +217,12 @@ public:
     void setBendingRadius(const double val);
 
 	///
-	/// \brief
+	/// \brief Get the screen capture related data
 	///
-    std::shared_ptr<screenShotData> getScreenCaptureData();
+    //std::shared_ptr<screenShotData> getScreenCaptureData();
 
 	///
-	/// \brief
+	/// \brief Initializes screen capture capability
 	///
     void enableScreenCapture();
 
@@ -268,7 +268,7 @@ private:
 
     std::shared_ptr<cameraConfigurationData> cameraPosOrientData;//!< camera config data
 
-    std::shared_ptr<screenShotData> screenCaptureData;
+    //std::shared_ptr<screenShotData> screenCaptureData;
 
     std::shared_ptr<vtkWindowToImageFilter> windowToImageFilter;
 };