diff --git a/CMakeLists.txt b/CMakeLists.txt
index 445623f709958c2cb2f8f3db471b6b5b40aa5a4c..231b2c55bf183b677172d7f2624ab5d44c2d8e90 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -253,6 +253,7 @@ add_subdirectory(Geometry)
 add_subdirectory(Mesh)
 add_subdirectory(RenderDelegates)
 add_subdirectory(Rendering)
+add_subdirectory(VtkRendering)
 add_subdirectory(Simulators)
 add_subdirectory(VirtualTools)
 add_subdirectory(Examples)
diff --git a/Collision/SurfaceTree.hpp b/Collision/SurfaceTree.hpp
index 70c2a653b8132a59e524afc0eca3141afe2dfe85..8e8cdf9acb3e1c48221356d3cf2c68f76f319043 100644
--- a/Collision/SurfaceTree.hpp
+++ b/Collision/SurfaceTree.hpp
@@ -25,7 +25,7 @@
 #define SM_SMSURFACETREE_HPP
 
 // SimMedTK includes
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 #include "Collision/SurfaceTreeIterator.h"
 #include "Event/KeyboardEvent.h"
 #include "Core/Factory.h"
diff --git a/Collision/UnitTests/MeshCollisionModelSpec.cpp b/Collision/UnitTests/MeshCollisionModelSpec.cpp
index 5624647d8c8c01716ccb1f61c09b8b3155d57ff0..dca190123149399eb0ae5b9a9651f9c95126d1de 100644
--- a/Collision/UnitTests/MeshCollisionModelSpec.cpp
+++ b/Collision/UnitTests/MeshCollisionModelSpec.cpp
@@ -54,7 +54,7 @@ go_bandit([](){
             mesh->initVertexArrays(4);
             mesh->initTriangleArrays(2);
 
-            core::StdVector3d vertices;
+            std::vector<core::Vec3d> vertices;
             vertices.emplace_back(1.0,2.0,-1.0);
             vertices.emplace_back(2.0,3.0,1.0);
             vertices.emplace_back(2.0,1.0,-1.0);
@@ -101,7 +101,7 @@ go_bandit([](){
             mesh->initVertexArrays(4);
             mesh->initTriangleArrays(2);
 
-            core::StdVector3d vertices;
+            std::vector<core::Vec3d> vertices;
             vertices.emplace_back(1.0,2.0,-1.0);
             vertices.emplace_back(2.0,3.0,1.0);
             vertices.emplace_back(2.0,1.0,-1.0);
@@ -147,7 +147,7 @@ go_bandit([](){
             mesh->initVertexArrays(4);
             mesh->initTriangleArrays(2);
 
-            core::StdVector3d vertices;
+            std::vector<core::Vec3d> vertices;
             vertices.emplace_back(1.0,2.0,-1.0);
             vertices.emplace_back(2.0,3.0,1.0);
             vertices.emplace_back(2.0,1.0,-1.0);
diff --git a/Collision/UnitTests/MeshToMeshCollisionSpec.cpp b/Collision/UnitTests/MeshToMeshCollisionSpec.cpp
index 2337f28fff1728d84fae230c89e62de3300ed947..ffc56f6b09f95bceacddd40a05d559e83ac163b5 100644
--- a/Collision/UnitTests/MeshToMeshCollisionSpec.cpp
+++ b/Collision/UnitTests/MeshToMeshCollisionSpec.cpp
@@ -31,7 +31,7 @@
 
 using namespace bandit;
 
-std::shared_ptr<MeshCollisionModel> getModel(const core::StdVector3d &vertices)
+std::shared_ptr<MeshCollisionModel> getModel(const std::vector<core::Vec3d> &vertices)
 {
     std::shared_ptr<MeshCollisionModel> model = std::make_shared<MeshCollisionModel>();
     std::shared_ptr<Mesh> mesh = std::make_shared<SurfaceMesh>();
@@ -72,12 +72,12 @@ go_bandit([](){
         it("performs collision detection ", []() {
             std::unique_ptr<CollisionDetection> meshToMeshCollision = make_unique<MeshToMeshCollision>();
 
-            core::StdVector3d verticesA;
+            std::vector<core::Vec3d> verticesA;
             verticesA.emplace_back(1.0,2.0,0);
             verticesA.emplace_back(2.0,3.0,0);
             verticesA.emplace_back(2.0,1.0,0);
 
-            core::StdVector3d verticesB;
+            std::vector<core::Vec3d> verticesB;
             verticesB.emplace_back(1.0,2.0,0.5);
             verticesB.emplace_back(2.0,3.0,0);
             verticesB.emplace_back(2.0,1.0,0);
diff --git a/Core/CoreClass.h b/Core/CoreClass.h
index 52c0884bb5babf74b8e055bc5216fa090f8f84ab..3377be14e94c53c0cbe22f147ce714e97bfc39ac 100644
--- a/Core/CoreClass.h
+++ b/Core/CoreClass.h
@@ -40,7 +40,7 @@ class SDK;
 class CoreClass;
 class RenderDelegate;
 class ObjectSimulator;
-class Viewer;
+class OpenGLViewer;
 
 /// \brief simulator calls object and sends this structure
 struct SimulationParam
diff --git a/Core/DataStructures.hpp b/Core/DataStructures.hpp
index f33235b03a40d80c2c14cc6812bbf069e94f2e77..601422978e50b233b7a0e6ec78aa8ced5bfd4e6a 100644
--- a/Core/DataStructures.hpp
+++ b/Core/DataStructures.hpp
@@ -24,6 +24,8 @@
 #ifndef SMDATASTUCTURES_HPP
 #define SMDATASTUCTURES_HPP
 
+#include <iostream>
+
 template<typename T>
 EntryList<T>::EntryList()
 {
diff --git a/Core/Geometry.h b/Core/Geometry.h
index 5db7788ba31ac72a74c7bcd9a830421cd66a78f1..afec193e1ec6d29c211002020a21999b428bf958 100644
--- a/Core/Geometry.h
+++ b/Core/Geometry.h
@@ -30,7 +30,7 @@
 #include "Core/Matrix.h"
 
 #include "Core/Factory.h"
-#include "Rendering/GLRenderer.h"
+#include "Rendering/OpenGLRenderer.h"
 #include "RenderDelegate.h"
 
 //forward declaration
diff --git a/Core/ObjectSimulator.cpp b/Core/ObjectSimulator.cpp
index 546ddbbf63007fc11ef1a76a514170a6670e977b..b06d9c19fcadc8aea7b289dc6f8e4b90a9667057 100644
--- a/Core/ObjectSimulator.cpp
+++ b/Core/ObjectSimulator.cpp
@@ -23,7 +23,7 @@
 
 #include "Core/ObjectSimulator.h"
 #include "Core/SDK.h"
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 
 ObjectSimulator::ObjectSimulator(std::shared_ptr<ErrorLog> p_log)
 {
diff --git a/Core/SDK.h b/Core/SDK.h
index 53406d0114babe974bee7c2264bf114b314b353e..572eb0c099a853613ee32d5f0aceeb481212ebfb 100644
--- a/Core/SDK.h
+++ b/Core/SDK.h
@@ -32,7 +32,7 @@
 #include "Core/Module.h"
 #include "Core/DataStructures.h"
 #include "Core/MakeUnique.h"
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 
 /// \brief maximum entities in the framework
 #define SIMMEDTK_SDK_MAXMESHES 100
diff --git a/Core/Scene.h b/Core/Scene.h
index 8828ade30f9f9b0616aa0da563e8362274ff1fcd..6f5219919497be2cd27ae24f0ed0b6f90a1103fb 100644
--- a/Core/Scene.h
+++ b/Core/Scene.h
@@ -143,6 +143,11 @@ public:
     /// \brief adds the objects in the local scene storage
     void copySceneToLocal(SceneLocal &p_local);
 
+    const std::vector<std::shared_ptr<SceneObject>> &getSceneObjects() const
+    {
+        return sceneObjects;
+    }
+
 private:
     std::shared_ptr<Camera> camera;                           //Camera for the scene
     std::vector<std::shared_ptr<Light> > lights;              //Lights in the scene
diff --git a/Core/SceneObject.cpp b/Core/SceneObject.cpp
index 319187bb9431104044c71fbfaee0d37382aa4697..812466d562ce65121bc07fdc3f2bbfc73273df54 100644
--- a/Core/SceneObject.cpp
+++ b/Core/SceneObject.cpp
@@ -77,7 +77,7 @@ UnifiedId::Pointer SceneObject::getObjectUnifiedID()
     return std::make_shared<UnifiedId>();
 }
 
-core::StdVector3d & SceneObject::getLocalVertices()
+std::vector<core::Vec3d> & SceneObject::getLocalVertices()
 {
     return localVertices;
 }
diff --git a/Core/SceneObject.h b/Core/SceneObject.h
index 6714da957dac59a66f9263b6fff273e88df48fa9..247a7d35259c3a0d1cef410e57efa886945d9860 100644
--- a/Core/SceneObject.h
+++ b/Core/SceneObject.h
@@ -53,7 +53,7 @@ class SceneObject : public CoreClass
 {
     friend class SDK;
     friend class ViewerBase;
-    friend class Viewer;
+    friend class OpenGLViewer;
     friend class Scene;
     friend class ObjectSimulator;
 
@@ -101,7 +101,7 @@ public:
     /// \brief get unified object id
     UnifiedId::Pointer getObjectUnifiedID();
 
-    core::StdVector3d &getLocalVertices();
+    std::vector<core::Vec3d> &getLocalVertices();
 
     ObjectInitFlags &getFlags();
 
@@ -128,7 +128,7 @@ protected:
 private:
     std::shared_ptr<ObjectSimulator> objectSim; // object simulator that will simulate the object
     std::shared_ptr<CustomRenderer> customRender;
-    core::StdVector3d localVertices; // local copy of vertices
+    std::vector<core::Vec3d> localVertices; // local copy of vertices
     ObjectInitFlags flags;
 };
 
diff --git a/Core/ViewerBase.cpp b/Core/ViewerBase.cpp
index db2e9d6ddbe2976d2f3dce587038004e6a61dd2a..956a0ff4e1eff6177a2584283b07af0342db857d 100644
--- a/Core/ViewerBase.cpp
+++ b/Core/ViewerBase.cpp
@@ -68,11 +68,11 @@ void ViewerBase::setUnlimitedFPS(bool p_enableFPS)
 
 void ViewerBase::initObjects()
 {
-    for (size_t i = 0; i < objectList.size(); i++)
+    for (const auto &i : this->objectList)
     {
-        if (objectList[i]->getType() != core::ClassType::Shader)
+        if (i->getType() != core::ClassType::Shader)
         {
-            objectList[i]->initDraw();
+            i->initDraw();
         }
         else
         {
@@ -89,9 +89,8 @@ void ViewerBase::initScenes()
         SceneLocal sceneLocal;
 
         scene->initLights();
-        scene->copySceneToLocal(sceneLocal);
 
-        for (auto sceneObject: sceneLocal.sceneObjects)
+        for (const auto &sceneObject : scene->getSceneObjects())
         {
             //initialize the custom Render if there is any
             if ( sceneObject->customRender != nullptr && sceneObject->getType() != core::ClassType::Shader )
@@ -157,23 +156,28 @@ void ViewerBase::processRenderOperation(const RenderOperation &p_rop)
     }
 }
 
-void ViewerBase::registerScene(std::shared_ptr<Scene> p_scene,
-                             RenderTargetType p_target,
-                             const std::string &p_fboName)
+void ViewerBase::registerScene(std::shared_ptr<Scene> scene,
+                             RenderTargetType target,
+                             const std::string &fboName)
 {
-    RenderOperation rop;
+    if(!scene)
+    {
+        std::cerr << "Error: unvalid scene." << std::endl;
+        return;
+    }
 
-    //sanity checks
-    assert(p_scene);
-    if (p_target == SMRENDERTARGET_FBO)
+    if (target == SMRENDERTARGET_FBO && fboName.length() == 0)
     {
-        assert(p_fboName != "");
+        std::cerr << "Error: unvalid FBO name." << std::endl;
+        return;
     }
 
-    rop.target = p_target;
-    rop.scene = p_scene;
+    RenderOperation rop;
+
+    rop.target = target;
+    rop.scene = scene;
 
-    rop.fboName = p_fboName;
+    rop.fboName = fboName;
 
     renderOperations.push_back(rop);
 }
diff --git a/Core/ViewerBase.h b/Core/ViewerBase.h
index 98f0dc60cc19d9b19a94b342ef569432478c066d..abbbd7fe9e34d6f9d3ef6f117e52cfb0d14ab004 100644
--- a/Core/ViewerBase.h
+++ b/Core/ViewerBase.h
@@ -58,10 +58,15 @@ enum RenderTargetType
 struct RenderOperation
 {
     RenderOperation();
+    RenderOperation(std::shared_ptr<Scene> s,  const RenderTargetType &t, const std::string &fbName) :
+        scene(s),
+        target(t),
+        fboName(fbName)
+    {}
     std::shared_ptr<Scene> scene; ///< The scene full of objects to render
     FrameBuffer *fbo; ///< Only required if rendering to FBO, specifies the FBO to render to
-    std::string fboName; ///< Only required if rendering to FBO, named reference to look up the FBO pointer
     RenderTargetType target; ///< Specifies where the rendered result should be placed see RenderTargetType
+    std::string fboName; ///< Only required if rendering to FBO, named reference to look up the FBO pointer
 };
 
 struct FboListItem
@@ -100,6 +105,16 @@ public:
 
     float globalAxisLength;
 
+    /// \brief for exit viewer
+    virtual void exitViewer() = 0;
+    /// \brief add text for display
+    virtual void addText(std::string p_tag) = 0;
+    /// \brief update text
+    virtual void updateText(std::string p_tag, std::string p_string) = 0;
+    virtual void updateText(int p_handle, std::string p_string) = 0;
+    /// \brief enable/disable VSync
+    virtual void setVSync(bool sync) = 0;
+
     virtual int height(void);
     virtual int width(void);
     virtual float aspectRatio(void);
@@ -109,23 +124,14 @@ public:
     ViewerBase();
     /// \brief initialization for viewer
     virtual void init() override;
-    /// \brief for exit viewer
-    virtual void exitViewer() = 0;
     /// \brief add object for rendering
     virtual void addObject(std::shared_ptr<CoreClass> object);
-    /// \brief add text for display
-    virtual void addText(std::string p_tag) = 0;
-    /// \brief update text
-    virtual void updateText(std::string p_tag, std::string p_string) = 0;
-    virtual void updateText(int p_handle, std::string p_string) = 0;
     /// \brief change window resolution
     virtual void setScreenResolution(int p_width, int p_height);
     /// \brief set the window title
     virtual void setWindowTitle(const std::string &str);
-    /// \brief enable/disable VSync
-    virtual void setVSync(bool sync) = 0;
     /// \brief Registers a scene for rendering with the viewer
-    virtual void registerScene(std::shared_ptr<Scene> p_scene, RenderTargetType p_target, const std::string &p_fboName);
+    virtual void registerScene(std::shared_ptr<Scene> scene, RenderTargetType target, const std::string &fboName = "");
     /// \brief Adds an FBO to the viewer to allow rendering to it.
     ///
     /// \detail The FBO will be created an initialized in the viewer.
@@ -147,40 +153,41 @@ public:
     Color defaultSpecularColor;
 
 protected:
+    /// \brief Renders the render operation to screen
+    virtual void renderToScreen(const RenderOperation &p_rop) = 0;
+    /// \brief Renders the render operation to an FBO
+    virtual void renderToFBO(const RenderOperation &p_rop) = 0;
     /// \brief Initializes rendering system (e.g., OpenGL) capabilities and flags
     virtual void initRenderingCapabilities() = 0;
-    /// \brief Initializes the internal objectList
-    virtual void initObjects();
-    /// \brief Initializes FBOs, textures, shaders and VAOs
-    virtual void initResources() = 0;
-    /// \brief Initializes scenes in the sceneList
-    virtual void initScenes();
     /// \brief Initilizes the rendering system (e.g., OpenGL) context, and window containing it
     virtual void initRenderingContext() = 0;
     /// \brief Cleans up after initGLContext()
     virtual void destroyRenderingContext() = 0;
-    /// \brief Cleanup function called on exit to ensure resources are cleaned up
-    virtual void cleanUp();
-    /// \brief Renders the internal sceneList
-    void renderSceneList();
-    /// \brief Processes a render operation
-    virtual void processRenderOperation(const RenderOperation &p_rop);
+    /// \brief Initializes FBOs, textures, shaders and VAOs
+    virtual void initResources() = 0;
     /// \brief Processes viewerRenderDetail options
     virtual void processViewerOptions() = 0;
     /// \brief Process window events and render as the major part of an event loop
     virtual void processWindowEvents() = 0;
-    /// \brief Renders the render operation to screen
-    virtual void renderToScreen(const RenderOperation &p_rop) = 0;
-    /// \brief Renders the render operation to an FBO
-    virtual void renderToFBO(const RenderOperation &p_rop) = 0;
     /// \brief Set the color and other viewer defaults
     virtual void setToDefaults() = 0;
+    /// \brief render depth texture for debugging
+    virtual void renderTextureOnView() = 0;
+
+    /// \brief Initializes the internal objectList
+    virtual void initObjects();
+    /// \brief Initializes scenes in the sceneList
+    virtual void initScenes();
+    /// \brief Cleanup function called on exit to ensure resources are cleaned up
+    virtual void cleanUp();
+    /// \brief Renders the internal sceneList
+    void renderSceneList();
+    /// \brief Processes a render operation
+    virtual void processRenderOperation(const RenderOperation &p_rop);
     /// \brief draw routines
     virtual void render();
     /// \brief adjust  rendering FPS
     void adjustFPS();
-    /// \brief render depth texture for debugging
-    virtual void renderTextureOnView() = 0;
     /// \brief initialize, run the event loop (processWindowEvents) and clean up.
     virtual void exec();
 };
diff --git a/Devices/PhantomInterface.cpp b/Devices/PhantomInterface.cpp
index ab2e2a199718b3bc466ea5eb9d3014d3ab6c036d..1ddd0973da32584732c2b93b8e2955f35539d15d 100644
--- a/Devices/PhantomInterface.cpp
+++ b/Devices/PhantomInterface.cpp
@@ -22,7 +22,7 @@
 //---------------------------------------------------------------------------
 
 #include "Devices/PhantomInterface.h"
-#include "Rendering/GLRenderer.h"
+#include "Rendering/OpenGLRenderer.h"
 #include "Core/Timer.h"
 #include <iostream>
 
diff --git a/Examples/AlphaMap/AlphaMappingExample.h b/Examples/AlphaMap/AlphaMappingExample.h
index a1dbc6527dfd60bcbd619bc5f4fb6fb13d3eaf80..6955c60c91697801ec5592c77e3c507fd46d9c2d 100644
--- a/Examples/AlphaMap/AlphaMappingExample.h
+++ b/Examples/AlphaMap/AlphaMappingExample.h
@@ -43,7 +43,7 @@ public:
     StaticSceneObject  *object1;
     SDK* simmedtkSDK;
     Scene *scene1;
-    Viewer *viewer;
+    OpenGLViewer *viewer;
 
     PhantomInterface* hapticInterface;
     smHapticCameraTrans *motionTrans;
diff --git a/Examples/AudioExample/AudioExample.cpp b/Examples/AudioExample/AudioExample.cpp
index 0fe50450f358d0081d0fb27a9765241d16e759c9..cd707686c673e554736dd4f3bbaefc4936f93c0f 100644
--- a/Examples/AudioExample/AudioExample.cpp
+++ b/Examples/AudioExample/AudioExample.cpp
@@ -89,7 +89,7 @@ void AudioKeyboardController::handleEvent(std::shared_ptr<core::Event> event)
 void runAudioExample()
 {
     std::shared_ptr<SDK> sdk;
-    std::shared_ptr<Viewer> viewer;
+    std::shared_ptr<OpenGLViewer> viewer;
     std::shared_ptr<Audio> sound;
     std::shared_ptr<AudioKeyboardController> audioCtl;
 
@@ -97,7 +97,7 @@ void runAudioExample()
     sdk = SDK::getInstance();
 
     //Create a viewer to see the scene through
-    viewer = std::make_shared<Viewer>();
+    viewer = std::make_shared<OpenGLViewer>();
     sdk->addViewer(viewer);
 
     //Create the audio controller
diff --git a/Examples/CollisionDetectionBVH/CollisionDetectionBVH.cpp b/Examples/CollisionDetectionBVH/CollisionDetectionBVH.cpp
index e39bd22e75caabbaedc3df31bfb465a5dcf054f2..10549ccc7542f9e47c697c7db09de71e80978240 100644
--- a/Examples/CollisionDetectionBVH/CollisionDetectionBVH.cpp
+++ b/Examples/CollisionDetectionBVH/CollisionDetectionBVH.cpp
@@ -43,7 +43,7 @@ CollisionDetectionBVH::CollisionDetectionBVH()
     scene = sdk->createScene();
 
     // Create viewer
-    viewer = std::make_shared<Viewer>();
+    viewer = std::make_shared<OpenGLViewer>();
 
     // Add our viewer to the SDK
     sdk->addViewer(viewer);
diff --git a/Examples/CollisionDetectionBVH/CollisionDetectionBVH.h b/Examples/CollisionDetectionBVH/CollisionDetectionBVH.h
index 64acfbfd785b7c30c9d162eed371b436fcbbfe53..a42937d4bdbe6f937f27fe63d4c1d32f115380f4 100644
--- a/Examples/CollisionDetectionBVH/CollisionDetectionBVH.h
+++ b/Examples/CollisionDetectionBVH/CollisionDetectionBVH.h
@@ -39,7 +39,7 @@
 #include "Simulators/DummySimulator.h"
 #include "Collision/MeshCollisionModel.h"
 #include "Collision/MeshToMeshCollision.h"
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 
 class CollisionDetectionBVH: public SimulationMain
 {
@@ -56,7 +56,7 @@ public:
     std::shared_ptr<StaticSceneObject>    modelA;
     std::shared_ptr<StaticSceneObject>    modelB;
     std::shared_ptr<Scene>                scene;
-    std::shared_ptr<Viewer>               viewer;
+    std::shared_ptr<OpenGLViewer>               viewer;
     std::shared_ptr<DummySimulator>       defaultSimulator;
     std::shared_ptr<Simulator>            simulator;
     std::shared_ptr<MeshToMeshCollision>  collisionDetection;
diff --git a/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.cpp b/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.cpp
index c18c50207c5e4d8a6432ac74fbbe8569766782dc..b3e8fe02bd35f93f21a925dba6bebc2aef0fc994 100644
--- a/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.cpp
+++ b/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.cpp
@@ -42,7 +42,7 @@ CollisionDetectionSpatialHashing::CollisionDetectionSpatialHashing()
     scene = sdk->createScene();
 
     // Create viewer
-    viewer = std::make_shared<Viewer>();
+    viewer = std::make_shared<OpenGLViewer>();
 
     // Add our viewer to the SDK
     sdk->addViewer(viewer);
diff --git a/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.h b/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.h
index 377cf405b6ea0b50a885f687b0b243ae78339d69..1e93016b893fed9d2ccd3b8de53d5c251e35e930 100644
--- a/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.h
+++ b/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.h
@@ -38,7 +38,7 @@
 #include "Core/SceneObject.h"
 #include "Simulators/DummySimulator.h"
 #include "Collision/SpatialHashCollision.h"
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 
 class CollisionDetectionSpatialHashing: public SimulationMain
 {
@@ -56,7 +56,7 @@ public:
     std::shared_ptr<StaticSceneObject>    modelA;
     std::shared_ptr<StaticSceneObject>    modelB;
     std::shared_ptr<Scene>                scene;
-    std::shared_ptr<Viewer>               viewer;
+    std::shared_ptr<OpenGLViewer>               viewer;
     std::shared_ptr<DummySimulator>       defaultSimulator;
     std::shared_ptr<Simulator>            simulator;
     std::shared_ptr<SpatialHashCollision> spatialHashing;
diff --git a/Examples/MultipleObjects/MultipleObjects.h b/Examples/MultipleObjects/MultipleObjects.h
index 5769334c23612d6a3cbf19301fe17eddd6c4654a..db5c9c582d208c2a13db4c10ad09399370ca1675 100644
--- a/Examples/MultipleObjects/MultipleObjects.h
+++ b/Examples/MultipleObjects/MultipleObjects.h
@@ -29,6 +29,6 @@
 #include "Core/ErrorLog.h"
 #include "Core/CoreClass.h"
 #include "Core/SDK.h"
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 
 #endif
\ No newline at end of file
diff --git a/Examples/renderCube/main.cpp b/Examples/renderCube/main.cpp
index 5720501e04db6bc4819687c189d1a768f87f9ecc..7a883b837e8e7b7e9203382640862a5d133fda6b 100644
--- a/Examples/renderCube/main.cpp
+++ b/Examples/renderCube/main.cpp
@@ -36,7 +36,7 @@ int main()
 {
     SIMMEDTK_REGISTER_RENDER_DELEGATES();
     std::shared_ptr<SDK> sdk;
-    std::shared_ptr<Viewer> viewer;
+    std::shared_ptr<OpenGLViewer> viewer;
     std::shared_ptr<Scene> scene1;
     std::shared_ptr<Light> light;
     std::shared_ptr<Camera> sceneCamera;
@@ -51,7 +51,7 @@ int main()
     scene1 = sdk->createScene();
 
     //Create a viewer to see the scene through
-    viewer = std::make_shared<Viewer>();
+    viewer = std::make_shared<OpenGLViewer>();
     sdk->addViewer(viewer);
 
     //Create the camera controller
diff --git a/Examples/renderCubeToTexture/main.cpp b/Examples/renderCubeToTexture/main.cpp
index c8938c5c0417c287911fe42aa4f73ac1c79e770e..463a7207f3e68bdf808643b13ebe6958f6a18947 100644
--- a/Examples/renderCubeToTexture/main.cpp
+++ b/Examples/renderCubeToTexture/main.cpp
@@ -33,7 +33,7 @@
 int main()
 {
     std::shared_ptr<SDK> sdk;
-    std::shared_ptr<Viewer> viewer;
+    std::shared_ptr<OpenGLViewer> viewer;
     std::shared_ptr<Scene> scene1, scene2;
     std::shared_ptr<Light> light1, light2;
     std::shared_ptr<Camera> sceneCamera1, sceneCamera2;
@@ -49,7 +49,7 @@ int main()
     scene2 = sdk->createScene(); //external scene containing square with scene1 mapped to it
 
     //Create a viewer to see the scene through
-    viewer = std::make_shared<Viewer>();
+    viewer = std::make_shared<OpenGLViewer>();
     sdk->addViewer(viewer);
 
     //Create the camera controller
diff --git a/Examples/vegaFem/main.cpp b/Examples/vegaFem/main.cpp
index f97380e10ab8acd0c3b952c18b0ce5f7103227dc..d218624eb9c068ac127794423ffe79b163246606 100644
--- a/Examples/vegaFem/main.cpp
+++ b/Examples/vegaFem/main.cpp
@@ -26,7 +26,7 @@
 #include "Core/ErrorLog.h"
 #include "Core/CoreClass.h"
 #include "Core/SDK.h"
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 #include "Core/SceneObject.h"
 
 // Include required types scene objects
@@ -60,7 +60,7 @@ int main()
     std::shared_ptr<VegaFemSimulator> femSimulator;
     std::shared_ptr<DummySimulator> staticSimulator;
     std::shared_ptr<PlaneCollisionModel> plane;
-    std::shared_ptr<Viewer> viewer;
+    std::shared_ptr<OpenGLViewer> viewer;
     std::shared_ptr<Scene> scene;
     std::shared_ptr<Light> light;
     std::shared_ptr<Camera> sceneCamera;
@@ -161,7 +161,7 @@ int main()
     //-------------------------------------------------------
     // Customize the viewer
     //-------------------------------------------------------
-    viewer = std::dynamic_pointer_cast<Viewer>(sdk->getViewerInstance());
+    viewer = std::dynamic_pointer_cast<OpenGLViewer>(sdk->getViewerInstance());
 
     viewer->viewerRenderDetail = viewer->viewerRenderDetail |
                                 SIMMEDTK_VIEWERRENDER_FADEBACKGROUND |
diff --git a/Geometry/MeshModel.cpp b/Geometry/MeshModel.cpp
index 62006068023b7607682fe916be1d932b87d90e73..c947dc0f4782a13e0126531b0ff9002cb9e69b67 100644
--- a/Geometry/MeshModel.cpp
+++ b/Geometry/MeshModel.cpp
@@ -71,7 +71,7 @@ std::array<core::Vec3d,3> MeshModel::getTrianglePositions(size_t i) const
 
     return vertices;
 }
-const core::StdVector3d& MeshModel::getVertices() const
+const std::vector<core::Vec3d>& MeshModel::getVertices() const
 {
     return mesh->getVertices();
 }
diff --git a/Geometry/MeshModel.h b/Geometry/MeshModel.h
index 256e73599f576af5d7d75f388401522348abd4fc..1f718f27b16c0b8f43cfc427b7a1d5301e192fda 100644
--- a/Geometry/MeshModel.h
+++ b/Geometry/MeshModel.h
@@ -80,7 +80,7 @@ public:
     ///
     /// @brief Returns array of vertices
     ///
-    const core::StdVector3d &getVertices() const;
+    const std::vector<core::Vec3d> &getVertices() const;
 
     ///
     /// @brief Draw this mesh
diff --git a/Geometry/UnitTests/MeshModelSpec.cpp b/Geometry/UnitTests/MeshModelSpec.cpp
index 0a358c4194f23f340ebb4e6410c694a820c8463d..f09a0992586da0cbd0b76dd9ed01b864526c1d15 100644
--- a/Geometry/UnitTests/MeshModelSpec.cpp
+++ b/Geometry/UnitTests/MeshModelSpec.cpp
@@ -28,7 +28,7 @@
 
 using namespace bandit;
 
-std::shared_ptr<MeshModel> getModel(const core::StdVector3d &vertices)
+std::shared_ptr<MeshModel> getModel(const std::vector<core::Vec3d> &vertices)
 {
     std::shared_ptr<MeshModel> model = std::make_shared<MeshModel>();
     std::shared_ptr<Mesh> mesh = std::make_shared<SurfaceMesh>();
@@ -61,7 +61,7 @@ go_bandit([](){
         });
         it("can access mesh vertices", []() {
 
-            core::StdVector3d vertices;
+            std::vector<core::Vec3d> vertices;
             vertices.emplace_back(1.0,2.0,0);
             vertices.emplace_back(2.0,3.0,0);
             vertices.emplace_back(2.0,1.0,0);
@@ -75,7 +75,7 @@ go_bandit([](){
         });
         it("can access mesh face normals", []() {
 
-            core::StdVector3d vertices;
+            std::vector<core::Vec3d> vertices;
             vertices.emplace_back(1.0,2.0,0);
             vertices.emplace_back(2.0,3.0,0);
             vertices.emplace_back(2.0,1.0,0);
diff --git a/Mesh/Mesh.cpp b/Mesh/Mesh.cpp
index f4234d7a2fdb71f7d8d678bfbda5acf556e84dba..97a013d92b7207d9ff691ca11862cb1870f7ccc6 100644
--- a/Mesh/Mesh.cpp
+++ b/Mesh/Mesh.cpp
@@ -29,9 +29,10 @@
 #include "objMesh.h"
 
 // SimMedTK includes
-#include "Rendering/GLRenderer.h"
-#include "Rendering/Viewer.h"
 #include "Core/Factory.h"
+#include "Rendering/OpenGLRenderer.h"
+#include "Rendering/TextureManager.h"
+#include "Rendering/OpenGLViewer.h"
 
 BaseMesh::BaseMesh()
 {
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 3fa4b1f6e957576db9129546f0f9d0274dcfc1e0..3a9ca5bcd2d587a7f2d88e696df4e1c48e18d87e 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -48,9 +48,6 @@ struct Tetrahedra;
 struct Edge;
 
 
-
-class Shader;
-
 /// \brief !!
 struct TextureAttachment
 {
@@ -95,7 +92,12 @@ public:
     /// \brief update the original texture vertices with the current
     void updateOriginalVertsWithCurrent();
 
-    const core::StdVector3d &getVertices() const
+    const std::vector<core::Vec3d> &getVertices() const
+    {
+        return this->vertices;
+    }
+
+    std::vector<core::Vec3d> &getVertices()
     {
         return this->vertices;
     }
@@ -109,8 +111,8 @@ public:
     CollisionGroup collisionGroup; ///< !!
     GLint renderingID; ///< !!
     std::shared_ptr<ErrorLog> log; ///< record the log
-    core::StdVector3d vertices; ///< vertices co-ordinate data at time t
-    core::StdVector3d origVerts; ///< vertices co-ordinate data at time t=0
+    std::vector<core::Vec3d> vertices; ///< vertices co-ordinate data at time t
+    std::vector<core::Vec3d> origVerts; ///< vertices co-ordinate data at time t=0
     int  nbrVertices; ///< number of vertices
     AABB aabb; ///< Axis aligned bounding box
     bool isTextureCoordAvailable; ///< true if the texture co-ordinate is available
diff --git a/Mesh/VegaVolumetricMesh.cpp b/Mesh/VegaVolumetricMesh.cpp
index eddd762ee245ca9b13979ff11547495a264e8189..b9569ceb0bea1082e606ebadb23fef3b3600ee39 100644
--- a/Mesh/VegaVolumetricMesh.cpp
+++ b/Mesh/VegaVolumetricMesh.cpp
@@ -67,7 +67,7 @@ size_t VegaVolumetricMesh::getNumberOfElements() const
 }
 void VegaVolumetricMesh::attachSurfaceMesh(std::shared_ptr<SurfaceMesh> surfaceMesh, const double &radius)
 {
-    const core::StdVector3d &meshVertices = surfaceMesh->getVertices();
+    const std::vector<core::Vec3d> &meshVertices = surfaceMesh->getVertices();
 
     int numElementVertices = this->mesh->getNumElementVertices();
     size_t surfaceMeshSize = meshVertices.size();
diff --git a/Mesh/VolumeMesh.h b/Mesh/VolumeMesh.h
index dce21b47389aa3828289a1cdd6cc89d7772f370a..f28be24dd897dd8b451cd434d205be19898680fd 100644
--- a/Mesh/VolumeMesh.h
+++ b/Mesh/VolumeMesh.h
@@ -86,7 +86,7 @@ public:
     int nbrTetra; ///< number of tetrahedra
     int nbrNodes; ///< total number of nodes of the volume mesh
     std::shared_ptr<ErrorLog> log_VM; ///< log the errors with volume mesh class
-    core::StdVector3d nodes; ///< data of nodal co-ordinates
+    std::vector<core::Vec3d> nodes; ///< data of nodal co-ordinates
     std::vector<Tetrahedra> tetra; ///< tetrahedra data
     std::vector<int> surfaceNodeIndex; ///<
     std::vector<bool> fixed; ///< indicates if the node is fixed or not
diff --git a/RenderDelegates/MeshRenderDelegate.cpp b/RenderDelegates/MeshRenderDelegate.cpp
index 18497a87784df3e69e63ca6fecfb137233a021a4..b47090017f0ba8f1488f1a77ed51703038a7b6a0 100644
--- a/RenderDelegates/MeshRenderDelegate.cpp
+++ b/RenderDelegates/MeshRenderDelegate.cpp
@@ -40,11 +40,11 @@ void MeshRenderDelegate::draw() const
     return;
 
   auto mesh = std::dynamic_pointer_cast<Mesh>(geom->shared_from_this());
-  GLRenderer::drawSurfaceMeshTriangles(mesh, geom->getRenderDetail());
+  OpenGLRenderer::drawSurfaceMeshTriangles(mesh, geom->getRenderDetail());
 
   if (geom->getRenderDetail()->renderType & SIMMEDTK_RENDER_NORMALS)
     {
-    GLRenderer::drawNormals(mesh,
+    OpenGLRenderer::drawNormals(mesh,
       geom->getRenderDetail()->normalColor,
       geom->getRenderDetail()->normalLength);
     }
diff --git a/RenderDelegates/PlaneRenderDelegate.cpp b/RenderDelegates/PlaneRenderDelegate.cpp
index e6dbdfda39bc7ef462b2f973f9e2c6d8958a72cf..b03a855b1902b0e71862cff5e6eefe7ac3144b27 100644
--- a/RenderDelegates/PlaneRenderDelegate.cpp
+++ b/RenderDelegates/PlaneRenderDelegate.cpp
@@ -33,7 +33,7 @@ public:
 
 void PlaneRenderDelegate::draw() const
 {
-  GLRenderer::draw(*this->getSourceGeometryAs<Plane>());
+  OpenGLRenderer::draw(*this->getSourceGeometryAs<Plane>());
 //         if (this->movedOrRotated)
 //         {
 //             updateDrawPoints();
diff --git a/Rendering/CMakeLists.txt b/Rendering/CMakeLists.txt
index 477dfde0902d49e96b37789c4ae9f4e4307f7c24..3d28a8a042c5c5428ef7c02d70b2ad54afddd4e2 100644
--- a/Rendering/CMakeLists.txt
+++ b/Rendering/CMakeLists.txt
@@ -5,18 +5,18 @@ simmedtk_add_library(Rendering
     FrameBuffer.cpp
     GLUtils.cpp
     MetalShader.cpp
-    GLRenderer.cpp
+    OpenGLRenderer.cpp
     Shader.cpp
     SceneTextureShader.cpp
     TextureManager.cpp
     VAO.cpp
     VBO.cpp
-    Viewer.cpp
+    OpenGLViewer.cpp
   PUBLIC_HEADERS
     ConfigRendering.h
     CustomRenderer.h
     FrameBuffer.h
-    GLRenderer.h
+    OpenGLRenderer.h
     GLUtils.h
     MetalShader.h
     SceneTextureShader.h
@@ -24,7 +24,7 @@ simmedtk_add_library(Rendering
     TextureManager.h
     VAO.h
     VBO.h
-    Viewer.h
+    OpenGLViewer.h
 )
 
 target_link_libraries(Rendering
diff --git a/Rendering/FrameBuffer.cpp b/Rendering/FrameBuffer.cpp
index a98a6fc18f09aa3b5190ffcee7f38a143cdd2840..c2dfbf1422c38b214e633a00bd2968663b8a68c1 100644
--- a/Rendering/FrameBuffer.cpp
+++ b/Rendering/FrameBuffer.cpp
@@ -26,7 +26,7 @@
 #include <string.h>
 #include "Core/Config.h"
 #include "Rendering/TextureManager.h"
-#include "Rendering/GLRenderer.h"
+#include "Rendering/OpenGLRenderer.h"
 
 bool FrameBuffer::checkStatus()
 {
diff --git a/Rendering/MetalShader.cpp b/Rendering/MetalShader.cpp
index d9f7e781ad9a029b5c7d7666162e9f0edbe3bf8b..06ecfe41ad17133bc01e32c67c937eb28104f52b 100644
--- a/Rendering/MetalShader.cpp
+++ b/Rendering/MetalShader.cpp
@@ -23,6 +23,8 @@
 
 // SimMedTK includes
 #include "Rendering/MetalShader.h"
+
+#include "Rendering/TextureManager.h"
 #include "Core/Event.h"
 #include "Core/SDK.h"
 #include "Event/KeyboardEvent.h"
diff --git a/Rendering/OculusViewer.cpp b/Rendering/OculusViewer.cpp
index 4b856ae18b3b92c3079c4a5fbf52d8a50c7300dd..f74be02fd9065c9c36f92006353b44af531a57ce 100644
--- a/Rendering/OculusViewer.cpp
+++ b/Rendering/OculusViewer.cpp
@@ -24,7 +24,7 @@
 #include <iostream>
 
 #include "Rendering/OculusViewer.h"
-#include "Rendering/GLRenderer.h"
+#include "Rendering/OpenGLRenderer.h"
 #include "Core/Quaternion.h"
 
 #ifdef _WIN32 || WIN32
@@ -56,7 +56,7 @@ static unsigned int next_pow2(unsigned int x)
     return x + 1;
 }
 
-OculusViewer::OculusViewer() : Viewer()
+OculusViewer::OculusViewer() : OpenGLViewer()
 {
     hmd = nullptr;
     fbWidth = 0;
@@ -196,7 +196,7 @@ void OculusViewer::renderToScreen(const RenderOperation &p_rop)
         view = trans * view;
 
         //Render Scene
-        GLRenderer::renderScene(p_rop.scene, proj, view);
+        OpenGLRenderer::renderScene(p_rop.scene, proj, view);
     }
     //after drawing both eyes into the texture render target, revert to
     // drawing directly to the display, and we call ovrHmd_EndFrame, to let the
diff --git a/Rendering/OculusViewer.h b/Rendering/OculusViewer.h
index c9a3900b22789c7cfe7e16997985dd2649681a3f..b4a2c15b1ed3692330a640e3c6cb01d4af62696d 100644
--- a/Rendering/OculusViewer.h
+++ b/Rendering/OculusViewer.h
@@ -25,14 +25,14 @@
 #define SMOCULUSVIEWER_H
 
 // SimMedTK includes
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 
 // OculusSDK includes
 #include <OVR_CAPI_GL.h>
 
 /// \brief This viewer class allows content to be rendered to an Oculus Rift
 ///
-class OculusViewer : public Viewer
+class OculusViewer : public OpenGLViewer
 {
 public:
     OculusViewer();
diff --git a/Rendering/GLRenderer.cpp b/Rendering/OpenGLRenderer.cpp
similarity index 94%
rename from Rendering/GLRenderer.cpp
rename to Rendering/OpenGLRenderer.cpp
index 63d842a4256cbb6266032290851ef88cab9e760f..18fc86b370cb7cd27d0ca838848a986a76f6459a 100644
--- a/Rendering/GLRenderer.cpp
+++ b/Rendering/OpenGLRenderer.cpp
@@ -21,24 +21,25 @@
 // Contact:
 //---------------------------------------------------------------------------
 
-#include "Rendering/GLRenderer.h"
+#include "Rendering/OpenGLRenderer.h"
 #include "Mesh/Mesh.h"
 #include "Core/DataStructures.h"
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 #include "Core/Quaternion.h"
 #include "Rendering/VAO.h"
+#include "Rendering/TextureManager.h"
 
 #ifndef _MSC_VER
 #  pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 #endif
 
-GLRenderer::GLRenderer()
+OpenGLRenderer::OpenGLRenderer()
 {
 
 }
 
 #if 0
-void GLRenderer::drawLineMesh(std::shared_ptr<LineMesh> p_lineMesh, std::shared_ptr<RenderDetail> renderDetail)
+void OpenGLRenderer::drawLineMesh(std::shared_ptr<LineMesh> p_lineMesh, std::shared_ptr<RenderDetail> renderDetail)
 {
     static core::Vec3d origin(0, 0, 0);
     static core::Vec3d xAxis(1, 0, 0);
@@ -173,7 +174,7 @@ void GLRenderer::drawLineMesh(std::shared_ptr<LineMesh> p_lineMesh, std::shared_
 }
 #endif // 0
 
-void GLRenderer::drawSurfaceMeshTriangles(
+void OpenGLRenderer::drawSurfaceMeshTriangles(
     std::shared_ptr<Mesh> p_surfaceMesh,
     std::shared_ptr<RenderDetail> renderDetail)
 {
@@ -301,7 +302,7 @@ void GLRenderer::drawSurfaceMeshTriangles(
     glLineWidth(1.0);
 }
 
-void GLRenderer::drawNormals(std::shared_ptr<Mesh> p_mesh, Color p_color, float length)
+void OpenGLRenderer::drawNormals(std::shared_ptr<Mesh> p_mesh, Color p_color, float length)
 {
 
     glDisable(GL_LIGHTING);
@@ -332,13 +333,13 @@ void GLRenderer::drawNormals(std::shared_ptr<Mesh> p_mesh, Color p_color, float
     glEnable(GL_LIGHTING);
 }
 
-void GLRenderer::beginTriangles()
+void OpenGLRenderer::beginTriangles()
 {
 
     glBegin(GL_TRIANGLES);
 }
 
-void GLRenderer::drawTriangle(core::Vec3d &p_1, core::Vec3d &p_2, core::Vec3d &p_3)
+void OpenGLRenderer::drawTriangle(core::Vec3d &p_1, core::Vec3d &p_2, core::Vec3d &p_3)
 {
 
     glVertex3dv(p_1.data());
@@ -346,13 +347,13 @@ void GLRenderer::drawTriangle(core::Vec3d &p_1, core::Vec3d &p_2, core::Vec3d &p
     glVertex3dv(p_3.data());
 }
 
-void GLRenderer::endTriangles()
+void OpenGLRenderer::endTriangles()
 {
 
     glEnd();
 }
 
-void GLRenderer::draw(AABB &aabb, Color p_color)
+void OpenGLRenderer::draw(AABB &aabb, Color p_color)
 {
 
     glPushAttrib(GL_LIGHTING_BIT);
@@ -404,7 +405,7 @@ void GLRenderer::draw(AABB &aabb, Color p_color)
     glPopAttrib();
 }
 
-void GLRenderer::drawArrow(const core::Vec3f &start, const core::Vec3f &end, const float D)
+void OpenGLRenderer::drawArrow(const core::Vec3f &start, const core::Vec3f &end, const float D)
 {
     float x = end[0] - start[0];
     float y = end[1] - start[1];
@@ -457,7 +458,7 @@ void GLRenderer::drawArrow(const core::Vec3f &start, const core::Vec3f &end, con
 
 }
 
-void GLRenderer::drawAxes(const float length)
+void OpenGLRenderer::drawAxes(const float length)
 {
     glDisable(GL_LIGHTING);
 
@@ -483,7 +484,7 @@ void GLRenderer::drawAxes(const float length)
     glEnable(GL_LIGHTING);
 }
 
-void GLRenderer::drawAxes(const Matrix33f &rotMat, const core::Vec3f &pos, const float length)
+void OpenGLRenderer::drawAxes(const Matrix33f &rotMat, const core::Vec3f &pos, const float length)
 {
     glDisable(GL_LIGHTING);
 
@@ -513,7 +514,7 @@ void GLRenderer::drawAxes(const Matrix33f &rotMat, const core::Vec3f &pos, const
     glEnable(GL_LIGHTING);
 }
 
-void GLRenderer::draw(Plane &p_plane, float p_scale, Color p_color)
+void OpenGLRenderer::draw(Plane &p_plane, float p_scale, Color p_color)
 {
 
     double angle;
@@ -549,7 +550,7 @@ void GLRenderer::draw(Plane &p_plane, float p_scale, Color p_color)
     glEnable(GL_LIGHTING);
 }
 
-void GLRenderer::renderScene(std::shared_ptr<Scene> p_scene)
+void OpenGLRenderer::renderScene(std::shared_ptr<Scene> p_scene)
 {
     assert(p_scene);
 
@@ -559,7 +560,7 @@ void GLRenderer::renderScene(std::shared_ptr<Scene> p_scene)
     renderScene(p_scene, proj, view);
 }
 
-void GLRenderer::renderScene(std::shared_ptr<Scene> p_scene,
+void OpenGLRenderer::renderScene(std::shared_ptr<Scene> p_scene,
                                const Matrix44f &p_proj,
                                const Matrix44f &p_view)
 {
@@ -595,7 +596,7 @@ void GLRenderer::renderScene(std::shared_ptr<Scene> p_scene,
     glPopMatrix();
 }
 
-void GLRenderer::renderSceneObject(std::shared_ptr<SceneObject> p_sceneObject)
+void OpenGLRenderer::renderSceneObject(std::shared_ptr<SceneObject> p_sceneObject)
 {
     RenderDetail::Ptr detail = p_sceneObject->getRenderDetail();
     if (!detail || detail->getRenderType() & SIMMEDTK_RENDER_NONE)
diff --git a/Rendering/GLRenderer.h b/Rendering/OpenGLRenderer.h
similarity index 94%
rename from Rendering/GLRenderer.h
rename to Rendering/OpenGLRenderer.h
index 307466be302946d5158e786a36bdc1335b1e7d82..fc425d4d4e59c9e23fe6f8eb43bd1cf9a8bead47 100644
--- a/Rendering/GLRenderer.h
+++ b/Rendering/OpenGLRenderer.h
@@ -36,17 +36,17 @@
 class Mesh;
 class AABB;
 class LineMesh;
-class Viewer;
+class OpenGLViewer;
 class Plane;
 class Scene;
 
 struct RenderDetail;
 /// \brief gl rendering utilities
-class GLRenderer: public CoreClass
+class OpenGLRenderer: public CoreClass
 {
 public:
     /// \brief constructor
-    GLRenderer();
+    OpenGLRenderer();
 
     /// \brief draws surface mesh with given rendertdail and draw paramters
     static void drawSurfaceMeshTriangles(std::shared_ptr<Mesh> p_surfaceMesh, std::shared_ptr<RenderDetail> renderDetail);
@@ -58,7 +58,7 @@ public:
     static void drawLineMesh(std::shared_ptr<LineMesh> p_lineMesh, std::shared_ptr<RenderDetail> renderDetail);
 
     /// \brief draw coordinate system
-    static void drawCoordSystem(std::shared_ptr<Viewer> viewer, std::string p_name, core::Vec3d p_pos, core::Vec3d dirX, core::Vec3d dirY, core::Vec3d dirZ);
+    static void drawCoordSystem(std::shared_ptr<OpenGLViewer> viewer, std::string p_name, core::Vec3d p_pos, core::Vec3d dirX, core::Vec3d dirY, core::Vec3d dirZ);
 
     /// \brief begin rendering triangle
     static void beginTriangles();
diff --git a/Rendering/Viewer.cpp b/Rendering/OpenGLViewer.cpp
similarity index 85%
rename from Rendering/Viewer.cpp
rename to Rendering/OpenGLViewer.cpp
index b5a06bd6e3ff0edbc1cdd405350361710292c723..13ac00571f3e45188996ec45ec8e94a0ee1c5a9e 100644
--- a/Rendering/Viewer.cpp
+++ b/Rendering/OpenGLViewer.cpp
@@ -21,50 +21,49 @@
 // Contact:
 //---------------------------------------------------------------------------
 
-#include "Rendering/Viewer.h"
-#include "Core/IOStream.h"
-#include "Rendering/GLRenderer.h"
-#include "Rendering/Shader.h"
-#include "Core/DataStructures.h"
-#include "Rendering/VBO.h"
-#include "Rendering/VAO.h"
-#include "External/tree.hh"
+#include "Rendering/OpenGLViewer.h"
 
 #include "Core/EventHandler.h"
+#include "Core/IOStream.h"
 #include "Event/KeyboardEvent.h"
+#include "Event/KeySFMLInterface.h"
 #include "Event/MouseButtonEvent.h"
 #include "Event/MouseMoveEvent.h"
-#include "Event/KeySFMLInterface.h"
-
+#include "Rendering/OpenGLRenderer.h"
+#include "Rendering/Shader.h"
+#include "Rendering/VAO.h"
+#include "Rendering/VBO.h"
+#include "Rendering/TextureManager.h"
+#include "Rendering/FrameBuffer.h"
 
 #ifdef __linux__
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <GL/glxew.h>
-#include <GL/glxext.h>
-#include <GL/glx.h>
+#   include <X11/Xlib.h>
+#   include <X11/Xutil.h>
+#   include <GL/glxew.h>
+#   include <GL/glxext.h>
+#   include <GL/glx.h>
 #endif
 
 #ifdef _WIN32
 typedef bool (APIENTRY *PFNWGLSWAPINTERVALFARPROC)(int);
 #endif
 
-void Viewer::setVSync(bool sync)
+void OpenGLViewer::setVSync(bool sync)
 {
   this->sfmlWindow->setVerticalSyncEnabled(sync);
 }
 
-Viewer::Viewer()
+OpenGLViewer::OpenGLViewer()
 {
   this->windowOutput = std::make_shared<OpenGLWindowStream>();
 }
 
-void Viewer::exitViewer()
+void OpenGLViewer::exitViewer()
 {
 }
 
 /// \brief Initializes OpenGL capabilities and flags
-void Viewer::initRenderingCapabilities()
+void OpenGLViewer::initRenderingCapabilities()
 {
     //use multiple fragment samples in computing the final color of a pixel
     glEnable(GL_MULTISAMPLE);
@@ -98,7 +97,7 @@ void Viewer::initRenderingCapabilities()
 }
 
 /// \brief Initializes FBOs, textures, shaders and VAOs
-void Viewer::initResources()
+void OpenGLViewer::initResources()
 {
     TextureManager::initGLTextures();
     Shader::initGLShaders();
@@ -108,7 +107,7 @@ void Viewer::initResources()
 }
 
 /// \brief Initializes the OpenGL context, and window containing it
-void Viewer::initRenderingContext()
+void OpenGLViewer::initRenderingContext()
 {
 
     // Init OpenGL context
@@ -139,13 +138,13 @@ void Viewer::initRenderingContext()
 }
 
 /// \brief Cleans up after initGLContext()
-void Viewer::destroyRenderingContext()
+void OpenGLViewer::destroyRenderingContext()
 {
     //nothing to do
 }
 
 /// \brief render depth texture for debugging
-void Viewer::renderTextureOnView()
+void OpenGLViewer::renderTextureOnView()
 {
 
     glPushAttrib(GL_TEXTURE_BIT | GL_VIEWPORT_BIT | GL_LIGHTING_BIT);
@@ -184,7 +183,7 @@ void Viewer::renderTextureOnView()
 /// \param p_depthTex A texture that will contain the fbo's depth texture.
 /// \param p_width The width of the fbo
 /// \param p_height The height of the fbo
-void Viewer::addFBO(const std::string &p_fboName,
+void OpenGLViewer::addFBO(const std::string &p_fboName,
                       Texture *p_colorTex,
                       Texture *p_depthTex,
                       unsigned int p_width, unsigned int p_height)
@@ -207,7 +206,7 @@ void Viewer::addFBO(const std::string &p_fboName,
 }
 
 /// \brief Initializes the FBOs in the FBO list
-void Viewer::initFboListItems()
+void OpenGLViewer::initFboListItems()
 {
     for (size_t i = 0; i < this->fboListItems.size(); i++)
     {
@@ -234,7 +233,7 @@ void Viewer::initFboListItems()
 }
 
 /// \brief Destroys all the FBOs in the FBO list
-void Viewer::destroyFboListItems()
+void OpenGLViewer::destroyFboListItems()
 {
     for (size_t i = 0; i < this->fboListItems.size(); i++)
     {
@@ -247,7 +246,7 @@ void Viewer::destroyFboListItems()
 }
 
 /// \brief Processes viewerRenderDetail options
-void Viewer::processViewerOptions()
+void OpenGLViewer::processViewerOptions()
 {
     if (viewerRenderDetail & SIMMEDTK_VIEWERRENDER_FADEBACKGROUND)
     {
@@ -256,7 +255,7 @@ void Viewer::processViewerOptions()
 }
 
 ///\brief Render and then process window events until the event queue is empty.
-void Viewer::processWindowEvents()
+void OpenGLViewer::processWindowEvents()
 {
   sf::Event event;
   this->render();
@@ -265,7 +264,7 @@ void Viewer::processWindowEvents()
 }
 
 /// \brief Renders the render operation to an FBO
-void Viewer::renderToFBO(const RenderOperation &p_rop)
+void OpenGLViewer::renderToFBO(const RenderOperation &p_rop)
 {
     assert(p_rop.fbo);
     //Enable FBO for rendering
@@ -276,13 +275,13 @@ void Viewer::renderToFBO(const RenderOperation &p_rop)
 
     processViewerOptions();
     //Render Scene
-     GLRenderer::renderScene(p_rop.scene);
+     OpenGLRenderer::renderScene(p_rop.scene);
     //Disable FBO
     p_rop.fbo->disable();
 }
 
 /// \brief Renders the render operation to screen
-void Viewer::renderToScreen(const RenderOperation &p_rop)
+void OpenGLViewer::renderToScreen(const RenderOperation &p_rop)
 {
     //Setup Viewport & Clear buffers
     glViewport(0, 0, this->width(), this->height());
@@ -290,7 +289,7 @@ void Viewer::renderToScreen(const RenderOperation &p_rop)
 
     processViewerOptions();
     //Render Scene
-    GLRenderer::renderScene(p_rop.scene);
+    OpenGLRenderer::renderScene(p_rop.scene);
 
     //Render axis
     if (viewerRenderDetail & SIMMEDTK_VIEWERRENDER_GLOBAL_AXIS)
@@ -309,7 +308,7 @@ void Viewer::renderToScreen(const RenderOperation &p_rop)
         p_rop.scene->enableLights();
         p_rop.scene->placeLights();
 
-        GLRenderer::drawAxes(this->globalAxisLength);
+        OpenGLRenderer::drawAxes(this->globalAxisLength);
 
         p_rop.scene->disableLights();
 
@@ -321,30 +320,8 @@ void Viewer::renderToScreen(const RenderOperation &p_rop)
     }
 }
 
-/// \brief Registers a scene for rendering with the viewer
-void Viewer::registerScene(std::shared_ptr<Scene> p_scene,
-                             RenderTargetType p_target,
-                             const std::string &p_fboName)
-{
-    RenderOperation rop;
-
-    //sanity checks
-    assert(p_scene);
-    if (p_target == SMRENDERTARGET_FBO)
-    {
-        assert(p_fboName != "");
-    }
-
-    rop.target = p_target;
-    rop.scene = p_scene;
-
-    rop.fboName = p_fboName;
-
-    renderOperations.push_back(rop);
-}
-
 /// \brief Set the color and other viewer defaults
-void Viewer::setToDefaults()
+void OpenGLViewer::setToDefaults()
 {
     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, defaultDiffuseColor.toGLColor());
     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, defaultSpecularColor.toGLColor());
@@ -353,7 +330,7 @@ void Viewer::setToDefaults()
 }
 
 /// \brief Called at the beginning of each frame by the module
-void Viewer::beginFrame()
+void OpenGLViewer::beginFrame()
 {
     if (terminateExecution == true)
     {
@@ -364,12 +341,12 @@ void Viewer::beginFrame()
 }
 
 ///\brief Called at the end of each frame by the module
-void Viewer::endFrame()
+void OpenGLViewer::endFrame()
 {
     this->sfmlWindow->display(); //swaps buffers
 }
 
-void Viewer::processSFMLEvents(const sf::Event& p_event)
+void OpenGLViewer::processSFMLEvents(const sf::Event& p_event)
 {
     switch(p_event.type)
     {
@@ -428,41 +405,41 @@ void Viewer::processSFMLEvents(const sf::Event& p_event)
     }
 }
 
-void Viewer::addObject(std::shared_ptr<CoreClass> object)
+void OpenGLViewer::addObject(std::shared_ptr<CoreClass> object)
 {
 
     SDK::getInstance()->addRef(object);
     objectList.push_back(object);
 }
 
-void Viewer::handleEvent(std::shared_ptr<core::Event> /*p_event*/ )
+void OpenGLViewer::handleEvent(std::shared_ptr<core::Event> /*p_event*/ )
 {
 
 }
 
-void Viewer::addText(std::string p_tag)
+void OpenGLViewer::addText(std::string p_tag)
 {
 
     windowOutput->addText(p_tag, std::string(""));
 }
 
-void Viewer::updateText(std::string p_tag, std::string p_string)
+void OpenGLViewer::updateText(std::string p_tag, std::string p_string)
 {
 
     windowOutput->updateText(p_tag, p_string);
 }
-void Viewer::updateText(int p_handle, std::string p_string)
+void OpenGLViewer::updateText(int p_handle, std::string p_string)
 {
 
     windowOutput->updateText(p_handle, p_string);
 }
 
-void Viewer::setWindowTitle(const std::string &str)
+void OpenGLViewer::setWindowTitle(const std::string &str)
 {
     windowTitle = str;
 }
 
-void Viewer::cleanUp()
+void OpenGLViewer::cleanUp()
 {
     destroyFboListItems();
     destroyRenderingContext();
@@ -473,6 +450,7 @@ void Viewer::cleanUp()
 
 SIMMEDTK_BEGIN_DYNAMIC_LOADER()
   SIMMEDTK_BEGIN_ONLOAD(register_rendering_viewer)
-    SIMMEDTK_REGISTER_CLASS(CoreClass,ViewerBase,Viewer,100);
+    SIMMEDTK_REGISTER_CLASS(CoreClass,ViewerBase,OpenGLViewer,100);
   SIMMEDTK_FINISH_ONLOAD()
+OpenGLViewer::~OpenGLViewer() {}
 SIMMEDTK_FINISH_DYNAMIC_LOADER()
diff --git a/Rendering/Viewer.h b/Rendering/OpenGLViewer.h
similarity index 85%
rename from Rendering/Viewer.h
rename to Rendering/OpenGLViewer.h
index f9e878638fb638067be83e836908598e037602f0..1885fc7cd97e76a0f71cf96e438fbaa61f90b333 100644
--- a/Rendering/Viewer.h
+++ b/Rendering/OpenGLViewer.h
@@ -29,29 +29,18 @@
 
 // SimMedTK includes
 #include "Core/ViewerBase.h"
-#include "Rendering/Shader.h"
-#include "Rendering/GLUtils.h"
-#include "Rendering/VBO.h"
-#include "Simulators/PBDSceneObject.h"
-#include "Core/DataStructures.h"
-#include "Simulators/StylusObject.h"
-#include "Rendering/FrameBuffer.h"
-#include "Rendering/Camera.h"
 
 //forward declaration
 class OpenGLWindowStream;
 
 /// \brief Handles all rendering routines.
-class Viewer : public ViewerBase
+class OpenGLViewer : public ViewerBase
 {
 public:
-    std::unique_ptr<sf::Context> sfmlContext;
-    std::unique_ptr<sf::Window> sfmlWindow;
-
-    std::shared_ptr<OpenGLWindowStream> windowOutput;
-
     /// \brief default constructor
-    Viewer();
+    OpenGLViewer();
+    ~OpenGLViewer();
+
     /// \brief for exit viewer
     virtual void exitViewer() override;
     /// \brief add object for rendering
@@ -67,15 +56,11 @@ public:
     void setWindowTitle(const std::string &str);
     /// \brief enable/disable VSync
     virtual void setVSync(bool sync) override;
-    virtual void registerScene(std::shared_ptr<Scene> p_scene, RenderTargetType p_target, const std::string &p_fboName);
     virtual void addFBO(const std::string &p_fboName,
-                Texture *p_colorTex, Texture *p_depthTex,
-                unsigned int p_width, unsigned int p_height);
-
-    std::string windowTitle;
-    Color defaultDiffuseColor;
-    Color defaultAmbientColor;
-    Color defaultSpecularColor;
+                        Texture *p_colorTex,
+                        Texture *p_depthTex,
+                        unsigned int p_width,
+                        unsigned int p_height);
 
 protected:
     virtual void initRenderingCapabilities() override;
@@ -91,8 +76,6 @@ protected:
     virtual void processWindowEvents() override;
     virtual void renderToScreen(const RenderOperation &p_rop) override;
     virtual void renderToFBO(const RenderOperation &p_rop) override;
-    virtual void initFboListItems();
-    virtual void destroyFboListItems();
     virtual void setToDefaults() override;
     virtual void beginFrame() override;
     virtual void endFrame() override;
@@ -100,7 +83,18 @@ protected:
     /// \brief  event handler
     virtual void handleEvent(std::shared_ptr<core::Event> p_event) override;
     /// \brief processes an SFML event
+    virtual void initFboListItems();
+    virtual void destroyFboListItems();
     void processSFMLEvents(const sf::Event& p_event);
+
+private:
+    std::unique_ptr<sf::Context> sfmlContext;
+    std::unique_ptr<sf::Window> sfmlWindow;
+    std::shared_ptr<OpenGLWindowStream> windowOutput;
+    std::string windowTitle;
+    Color defaultDiffuseColor;
+    Color defaultAmbientColor;
+    Color defaultSpecularColor;
 };
 
 #endif
diff --git a/Rendering/VAO.cpp b/Rendering/VAO.cpp
index 9880bf06f00336a37b8eaf1da8dedf17bbf751c5..1773d9f6eab0e93af6f4e9c7bcc6d414fc0ebed8 100644
--- a/Rendering/VAO.cpp
+++ b/Rendering/VAO.cpp
@@ -23,7 +23,7 @@
 
 #include "Rendering/VAO.h"
 #include "Rendering/Shader.h"
-#include "Rendering/Viewer.h"
+#include "Rendering/OpenGLViewer.h"
 
 std::unordered_map<int, std::shared_ptr<VAO>> VAO::VAOs;
 
diff --git a/Simulators/PBDObjectSimulator.cpp b/Simulators/PBDObjectSimulator.cpp
index 4ed303677769bb330d48f488911fb1ed62a73f5f..79a391052f1bb09d37ccc814a107423262f40178 100644
--- a/Simulators/PBDObjectSimulator.cpp
+++ b/Simulators/PBDObjectSimulator.cpp
@@ -23,7 +23,7 @@
 
 #include "Simulators/PBDSceneObject.h"
 #include "Simulators/PBDObjectSimulator.h"
-#include "Rendering/GLRenderer.h"
+#include "Rendering/OpenGLRenderer.h"
 
 void PBDObjectSimulator::draw()
 {
@@ -33,7 +33,7 @@ void PBDObjectSimulator::draw()
     for (size_t i = 0; i < objectsSimulated.size(); i++)
     {
         sceneObject = std::static_pointer_cast<PBDSurfaceSceneObject>(objectsSimulated[i]);
-        GLRenderer::draw(sceneObject->mesh->aabb);
+        OpenGLRenderer::draw(sceneObject->mesh->aabb);
     }
 }
 PBDObjectSimulator::PBDObjectSimulator( std::shared_ptr<ErrorLog> p_errorLog ) : ObjectSimulator( p_errorLog )
@@ -99,7 +99,7 @@ void PBDObjectSimulator::run()
         if ( sceneObj->getType() == core::ClassType::PbdSurfaceSceneObject )
         {
             pbdSurfaceSceneObject = std::static_pointer_cast<PBDSurfaceSceneObject>(sceneObj);
-            core::StdVector3d &vertices = pbdSurfaceSceneObject->getLocalVertices();
+            std::vector<core::Vec3d> &vertices = pbdSurfaceSceneObject->getLocalVertices();
 
             if ( !pbdSurfaceSceneObject->getFlags().isSimulatorInit )
             {
diff --git a/Simulators/PBDSceneObject.h b/Simulators/PBDSceneObject.h
index f0736300b0cdef30abef1eedcd4307cf2f19649b..26b362bcaf7585a8d45b3a2a1f6478d56d46b336 100644
--- a/Simulators/PBDSceneObject.h
+++ b/Simulators/PBDSceneObject.h
@@ -55,9 +55,9 @@ public:
     float Damp; ///< damping values
     int nbrMass; ///< number of masses
     int **massIdx; ///< !!
-    core::StdVector3d P; ///< !! position
-    core::StdVector3d V; ///< !! velocity
-    core::StdVector3d exF; ///< external force
+    std::vector<core::Vec3d> P; ///< !! position
+    std::vector<core::Vec3d> V; ///< !! velocity
+    std::vector<core::Vec3d> exF; ///< external force
     int nbrSpr; ///< !! number of spheres
     float *L0; ///< !! Initial length
     bool *fixedMass; ///< true if masses are fixed
diff --git a/VtkRendering/CMakeLists.txt b/VtkRendering/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..07ec5789549b14afb46b2a3c05b5ed87d27c0947
--- /dev/null
+++ b/VtkRendering/CMakeLists.txt
@@ -0,0 +1,34 @@
+
+find_package(VTK REQUIRED)
+
+include(${VTK_USE_FILE})
+
+simmedtk_add_library(VtkRendering
+  SOURCES
+    VtkViewer.cpp
+    VtkMeshRenderDelegate.cpp
+  PUBLIC_HEADERS
+    VtkViewer.h
+)
+set(PRIVATE_LIBS
+    PRIVATE
+        Core
+        Mesh)
+if(VTK_LIBRARIES)
+    target_link_libraries(VtkRendering
+    PUBLIC
+        ${VTK_LIBRARIES}
+    ${PRIVATE_LIBS}
+    )
+else()
+    target_link_libraries(VtkRendering
+    PUBLIC
+        vtkHybrid
+    ${PRIVATE_LIBS}
+    )
+
+endif()
+
+if(BUILD_TESTING)
+  add_subdirectory(UnitTests)
+endif()
diff --git a/VtkRendering/MeshNodalCoordinates.h b/VtkRendering/MeshNodalCoordinates.h
new file mode 100644
index 0000000000000000000000000000000000000000..0447ada485804895eaa74c40b0cc08dbe01730c5
--- /dev/null
+++ b/VtkRendering/MeshNodalCoordinates.h
@@ -0,0 +1,124 @@
+// This file is part of the SimMedTK project.
+// Copyright (c) Center for Modeling, Simulation, and 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
+//
+// 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.
+//
+//---------------------------------------------------------------------------
+//
+// Authors:
+//
+// Contact:
+//---------------------------------------------------------------------------
+
+
+#ifndef MESHNODALCOORDINATES_H
+#define MESHNODALCOORDINATES_H
+
+#include "vtkMappedDataArray.h"
+#include "vtkIOExodusModule.h" // For export macro
+
+#include "vtkTypeTemplate.h" // For templated vtkObject API
+#include "vtkObjectFactory.h" // for vtkStandardNewMacro
+
+// SimMedTK includes
+#include "Core/Vector.h"
+
+// STL includes
+#include <array>
+
+template <class Scalar>
+class MeshNodalCoordinates:
+    public vtkTypeTemplate<MeshNodalCoordinates<Scalar>, vtkMappedDataArray<Scalar>>
+{
+public:
+    vtkMappedDataArrayNewInstanceMacro(MeshNodalCoordinates<Scalar>)
+    static MeshNodalCoordinates *New();
+    virtual void PrintSelf(ostream &os, vtkIndent indent);
+
+    // Description:
+    // Set the raw scalar arrays for the coordinate set. This class takes
+    // ownership of the arrays and deletes them with delete[].
+    void SetVertexArray(std::vector<Vector3<Scalar>> &vertices);
+
+    // Reimplemented virtuals -- see superclasses for descriptions:
+    void Initialize();
+    void GetTuples(vtkIdList *ptIds, vtkAbstractArray *output);
+    void GetTuples(vtkIdType p1, vtkIdType p2, vtkAbstractArray *output);
+    void Squeeze();
+    vtkArrayIterator *NewIterator();
+    vtkIdType LookupValue(vtkVariant value);
+    void LookupValue(vtkVariant value, vtkIdList *ids);
+    vtkVariant GetVariantValue(vtkIdType idx);
+    void ClearLookup();
+    double* GetTuple(vtkIdType i);
+    void GetTuple(vtkIdType i, double *tuple);
+    vtkIdType LookupTypedValue(Scalar value);
+    void LookupTypedValue(Scalar value, vtkIdList *ids);
+    Scalar GetValue(vtkIdType idx);
+    Scalar& GetValueReference(vtkIdType idx);
+    void GetTupleValue(vtkIdType idx, Scalar *t);
+
+    // Description:
+    // This container is read only -- this method does nothing but print a
+    // warning.
+    int Allocate(vtkIdType sz, vtkIdType ext);
+    int Resize(vtkIdType numTuples);
+    void SetNumberOfTuples(vtkIdType number);
+    void SetTuple(vtkIdType i, vtkIdType j, vtkAbstractArray *source);
+    void SetTuple(vtkIdType i, const float *source);
+    void SetTuple(vtkIdType i, const double *source);
+    void InsertTuple(vtkIdType i, vtkIdType j, vtkAbstractArray *source);
+    void InsertTuple(vtkIdType i, const float *source);
+    void InsertTuple(vtkIdType i, const double *source);
+    void InsertTuples(vtkIdList *dstIds, vtkIdList *srcIds,
+                      vtkAbstractArray *source);
+    void InsertTuples(vtkIdType dstStart, vtkIdType n, vtkIdType srcStart,
+                      vtkAbstractArray* source);
+    vtkIdType InsertNextTuple(vtkIdType j, vtkAbstractArray *source);
+    vtkIdType InsertNextTuple(const float *source);
+    vtkIdType InsertNextTuple(const double *source);
+    void DeepCopy(vtkAbstractArray *aa);
+    void DeepCopy(vtkDataArray *da);
+    void InterpolateTuple(vtkIdType i, vtkIdList *ptIndices,
+                          vtkAbstractArray* source,  double* weights);
+    void InterpolateTuple(vtkIdType i, vtkIdType id1, vtkAbstractArray *source1,
+                          vtkIdType id2, vtkAbstractArray *source2, double t);
+    void SetVariantValue(vtkIdType idx, vtkVariant value);
+    void RemoveTuple(vtkIdType id);
+    void RemoveFirstTuple();
+    void RemoveLastTuple();
+    void SetTupleValue(vtkIdType i, const Scalar *t);
+    void InsertTupleValue(vtkIdType i, const Scalar *t);
+    vtkIdType InsertNextTupleValue(const Scalar *t);
+    void SetValue(vtkIdType idx, Scalar value);
+    vtkIdType InsertNextValue(Scalar v);
+    void InsertValue(vtkIdType idx, Scalar v);
+
+protected:
+    MeshNodalCoordinates();
+    ~MeshNodalCoordinates();
+
+    std::vector<Vector3<Scalar>> *vertexArray;
+
+private:
+    MeshNodalCoordinates(const MeshNodalCoordinates &); // Not implemented.
+    void operator=(const MeshNodalCoordinates &); // Not implemented.
+
+    vtkIdType Lookup(const Scalar &val, vtkIdType startIndex);
+    std::array<double,3> TempDoubleArray;
+};
+
+#include "MeshNodalCoordinates.txx"
+
+#endif // MESHNODALCOORDINATES_H
diff --git a/VtkRendering/MeshNodalCoordinates.txx b/VtkRendering/MeshNodalCoordinates.txx
new file mode 100644
index 0000000000000000000000000000000000000000..5eb27e58c6948150893721db9572e56517534f0a
--- /dev/null
+++ b/VtkRendering/MeshNodalCoordinates.txx
@@ -0,0 +1,509 @@
+/*
+ * // This file is part of the SimMedTK project.
+ * // Copyright (c) Center for Modeling, Simulation, and 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
+ * //
+ * // 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.
+ * //
+ * //---------------------------------------------------------------------------
+ * //
+ * // Authors:
+ * //
+ * // Contact:
+ * //---------------------------------------------------------------------------
+ */
+
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    MeshNodalCoordinates.txx
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "MeshNodalCoordinates.h"
+
+#include "vtkIdList.h"
+#include "vtkObjectFactory.h"
+#include "vtkVariant.h"
+#include "vtkVariantCast.h"
+
+//------------------------------------------------------------------------------
+// Can't use vtkStandardNewMacro with a template.
+template <class Scalar> MeshNodalCoordinates<Scalar> *
+MeshNodalCoordinates<Scalar>::New()
+{
+    VTK_STANDARD_NEW_BODY(MeshNodalCoordinates<Scalar>)
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::PrintSelf(ostream &os, vtkIndent indent)
+{
+    this->MeshNodalCoordinates<Scalar>::Superclass::PrintSelf(
+        os, indent);
+
+    os << indent << "vertexArray : " << this->vertexArray << std::endl;
+    os << "TempDoubleArray : " << &this->TempDoubleArray << std::endl;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::Initialize()
+{
+    this->vertexArray = nullptr;
+    this->MaxId = -1;
+    this->Size = 0;
+    this->NumberOfComponents = 1;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::GetTuples(vtkIdList *ptIds, vtkAbstractArray *output)
+{
+    vtkDataArray *outArray = vtkDataArray::FastDownCast(output);
+    if(!outArray)
+    {
+        vtkWarningMacro( << "Input is not a vtkDataArray");
+        return;
+    }
+
+    vtkIdType numTuples = ptIds->GetNumberOfIds();
+
+    outArray->SetNumberOfComponents(this->NumberOfComponents);
+    outArray->SetNumberOfTuples(numTuples);
+
+    const vtkIdType numPoints = ptIds->GetNumberOfIds();
+    for(vtkIdType i = 0; i < numPoints; ++i)
+    {
+        outArray->SetTuple(i, this->GetTuple(ptIds->GetId(i)));
+    }
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::GetTuples(vtkIdType p1, vtkIdType p2, vtkAbstractArray *output)
+{
+    vtkDataArray *outArray = vtkDataArray::FastDownCast(output);
+    if(!outArray)
+    {
+        vtkErrorMacro( << "Input is not a vtkDataArray");
+        return;
+    }
+
+    if(outArray->GetNumberOfComponents() != this->GetNumberOfComponents())
+    {
+        vtkErrorMacro( << "Incorrect number of components in input array.");
+        return;
+    }
+
+    for(vtkIdType outArrayTupleId = 0; p1 <= p2; ++p1)
+    {
+        outArray->SetTuple(outArrayTupleId++, this->GetTuple(p1));
+    }
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::Squeeze()
+{
+    // noop
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkArrayIterator*
+MeshNodalCoordinates<Scalar>::NewIterator()
+{
+    vtkErrorMacro( << "Not implemented.");
+    return NULL;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar>
+::LookupValue(vtkVariant value)
+{
+    bool valid = true;
+    Scalar val = vtkVariantCast<Scalar>(value, &valid);
+    if(valid)
+    {
+        return this->Lookup(val, 0);
+    }
+    return -1;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::LookupValue(vtkVariant value, vtkIdList *ids)
+{
+    bool valid = true;
+    Scalar val = vtkVariantCast<Scalar>(value, &valid);
+    ids->Reset();
+    if(valid)
+    {
+        vtkIdType index = 0;
+        while((index = this->Lookup(val, index)) >= 0)
+        {
+            ids->InsertNextId(index++);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkVariant MeshNodalCoordinates<Scalar>
+::GetVariantValue(vtkIdType idx)
+{
+    return vtkVariant(this->GetValueReference(idx));
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::ClearLookup()
+{
+    // no-op, no fast lookup implemented.
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> double* MeshNodalCoordinates<Scalar>
+::GetTuple(vtkIdType i)
+{
+    this->GetTuple(i, this->TempDoubleArray.data());
+    return this->TempDoubleArray.data();
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::GetTuple(vtkIdType i, double *tuple)
+{
+    tuple[0] = static_cast<double>((*this->vertexArray)[i](0));
+    tuple[1] = static_cast<double>((*this->vertexArray)[i](1));
+    tuple[2] = static_cast<double>((*this->vertexArray)[i](2));
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar>
+::LookupTypedValue(Scalar value)
+{
+    return this->Lookup(value, 0);
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::LookupTypedValue(Scalar value, vtkIdList *ids)
+{
+    ids->Reset();
+    vtkIdType index = 0;
+    while((index = this->Lookup(value, index)) >= 0)
+    {
+        ids->InsertNextId(index++);
+    }
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> Scalar MeshNodalCoordinates<Scalar>
+::GetValue(vtkIdType idx)
+{
+    return this->GetValueReference(idx);
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> Scalar& MeshNodalCoordinates<Scalar>
+::GetValueReference(vtkIdType idx)
+{
+    const vtkIdType tuple = idx / this->NumberOfComponents;
+    const vtkIdType comp = idx % this->NumberOfComponents;
+    switch(comp)
+    {
+        case 0:
+            return (*this->vertexArray)[tuple](0);
+        case 1:
+            return (*this->vertexArray)[tuple](1);
+        case 2:
+            return (*this->vertexArray)[tuple](2);
+        default:
+            vtkErrorMacro( << "Invalid number of components.");
+            static Scalar dummy(0);
+            return dummy;
+    }
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::GetTupleValue(vtkIdType tupleId, Scalar *tuple)
+{
+    tuple[0] = (*this->vertexArray)[tupleId](0);
+    tuple[1] = (*this->vertexArray)[tupleId](1);
+    tuple[2] = (*this->vertexArray)[tupleId](2);
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> int MeshNodalCoordinates<Scalar>
+::Allocate(vtkIdType, vtkIdType)
+{
+    vtkErrorMacro("Read only container.")
+    return 0;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> int MeshNodalCoordinates<Scalar>
+::Resize(vtkIdType)
+{
+    vtkErrorMacro("Read only container.")
+    return 0;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::SetNumberOfTuples(vtkIdType)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::SetTuple(vtkIdType, vtkIdType, vtkAbstractArray *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::SetTuple(vtkIdType, const float *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::SetTuple(vtkIdType, const double *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::InsertTuple(vtkIdType, vtkIdType, vtkAbstractArray *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::InsertTuple(vtkIdType, const float *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::InsertTuple(vtkIdType, const double *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::InsertTuples(vtkIdList *, vtkIdList *, vtkAbstractArray *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar>
+::InsertNextTuple(vtkIdType, vtkAbstractArray *)
+{
+    vtkErrorMacro("Read only container.")
+    return -1;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar>
+::InsertNextTuple(const float *)
+{
+
+    vtkErrorMacro("Read only container.")
+    return -1;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar>
+::InsertNextTuple(const double *)
+{
+    vtkErrorMacro("Read only container.")
+    return -1;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::DeepCopy(vtkAbstractArray *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::DeepCopy(vtkDataArray *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::InterpolateTuple(vtkIdType, vtkIdList *, vtkAbstractArray *, double *)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::InterpolateTuple(vtkIdType, vtkIdType, vtkAbstractArray*, vtkIdType,
+                   vtkAbstractArray*, double)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::SetVariantValue(vtkIdType, vtkVariant)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::RemoveTuple(vtkIdType)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::RemoveFirstTuple()
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::RemoveLastTuple()
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::SetTupleValue(vtkIdType, const Scalar*)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::InsertTupleValue(vtkIdType, const Scalar*)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar>
+::InsertNextTupleValue(const Scalar *)
+{
+    vtkErrorMacro("Read only container.")
+    return -1;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::SetValue(vtkIdType, Scalar)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar>
+::InsertNextValue(Scalar)
+{
+    vtkErrorMacro("Read only container.")
+    return -1;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::InsertValue(vtkIdType, Scalar)
+{
+    vtkErrorMacro("Read only container.")
+    return;
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> MeshNodalCoordinates<Scalar>
+::MeshNodalCoordinates()
+{
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> MeshNodalCoordinates<Scalar>
+::~MeshNodalCoordinates()
+{
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> void MeshNodalCoordinates<Scalar>
+::SetVertexArray(std::vector<Vector3<Scalar>> &vertices)
+{
+    Initialize();
+    this->NumberOfComponents = 3;
+    this->Size = this->NumberOfComponents * vertices.size();
+    this->MaxId = this->Size - 1;
+    this->vertexArray = &vertices;
+    this->Modified();
+}
+
+//------------------------------------------------------------------------------
+template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar>
+::Lookup(const Scalar &val, vtkIdType index)
+{
+    while(index <= this->MaxId)
+    {
+        if(this->GetValueReference(index++) == val)
+        {
+            return index;
+        }
+    }
+    return -1;
+}
diff --git a/VtkRendering/UnitTests/CMakeLists.txt b/VtkRendering/UnitTests/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d561fcb59c523a984bb0509a7ce4495df23c6cfa
--- /dev/null
+++ b/VtkRendering/UnitTests/CMakeLists.txt
@@ -0,0 +1,11 @@
+set(Module VtkRendering)
+
+add_executable(${Module}UnitTestRunner
+  ${BANDIT_RUNNER}
+  MeshNodalCoordinatesSpec.cpp
+)
+
+target_compile_options(${Module}UnitTestRunner PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wno-old-style-cast -Wno-multichar -Wno-type-limits>)
+target_link_libraries(${Module}UnitTestRunner Core Mesh VtkRendering)
+simple_test(${Module} --reporter=xunit)
+
diff --git a/VtkRendering/UnitTests/MeshNodalCoordinatesSpec.cpp b/VtkRendering/UnitTests/MeshNodalCoordinatesSpec.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..37dc63144c47f739ba375a3a04bb9d15efc022b2
--- /dev/null
+++ b/VtkRendering/UnitTests/MeshNodalCoordinatesSpec.cpp
@@ -0,0 +1,45 @@
+// This file is part of the SimMedTK project.
+// Copyright (c) Center for Modeling, Simulation, and 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
+//
+// 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.
+//
+//---------------------------------------------------------------------------
+//
+// Authors:
+//
+// Contact:
+//---------------------------------------------------------------------------
+
+#include <memory>
+
+// VTK includes
+#include <vtkNew.h>
+#include <vtkSmartPointer.h>
+
+// SimMedTK includes
+#include "../MeshNodalCoordinates.h"
+
+#include <bandit/bandit.h>
+using namespace bandit;
+
+go_bandit([](){
+
+    describe("VTK mapped array.", []() {
+        it("constructs", []() {
+            vtkNew<MeshNodalCoordinates<double>> meshMapper;
+            AssertThat(meshMapper.GetPointer() != nullptr, IsTrue());
+        });
+    });
+});
+
diff --git a/VtkRendering/VtkMeshRenderDelegate.cpp b/VtkRendering/VtkMeshRenderDelegate.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..785fe1288df3bd7f0550de4a159105f5d3eab41f
--- /dev/null
+++ b/VtkRendering/VtkMeshRenderDelegate.cpp
@@ -0,0 +1,133 @@
+// This file is part of the SimMedTK project.
+// Copyright (c) Center for Modeling, Simulation, and 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
+//
+// 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.
+//
+//---------------------------------------------------------------------------
+//
+// Authors:
+//
+// Contact:
+//---------------------------------------------------------------------------
+
+#include <memory>
+
+#include "Core/Geometry.h"
+#include "Core/RenderDelegate.h"
+#include "Core/Factory.h"
+#include "Mesh/Mesh.h"
+
+#include "VtkRendering/MeshNodalCoordinates.h"
+#include "VtkRendering/VtkRenderDelegate.h"
+
+// Vtk incudes
+#include <vtkSmartPointer.h>
+#include <vtkNew.h>
+#include <vtkActor.h>
+#include <vtkUnstructuredGrid.h>
+#include <vtkDataSetMapper.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPoints.h>
+#include <vtkCellArray.h>
+#include <vtkGeometryFilter.h>
+#include <vtkPolyDataNormals.h>
+
+
+class MeshRenderDelegate : public VtkRenderDelegate
+{
+public:
+    MeshRenderDelegate();
+    virtual bool isTargetTextured() const override;
+
+    vtkActor *getActor() const;
+    void init();
+
+private:
+    vtkSmartPointer<vtkActor> actor;
+    vtkSmartPointer<MeshNodalCoordinates<double>> mappedData;
+    vtkSmartPointer<vtkMapper> mapper;
+};
+
+MeshRenderDelegate::MeshRenderDelegate()
+{
+    actor = vtkActor::New();
+    mappedData = MeshNodalCoordinates<double>::New();
+
+    vtkNew<vtkUnstructuredGrid> unstructuredMesh;
+    vtkNew<vtkPoints> vertices;
+    vtkNew<vtkCellArray> triangles;
+
+    auto geom = this->getSourceGeometryAs<Mesh>();
+    if (!geom)
+    {
+        return;
+    }
+
+    auto mesh = std::dynamic_pointer_cast<Mesh>(geom->shared_from_this());
+
+    mappedData->SetVertexArray(mesh->getVertices());
+
+    for(int i = 0; i < mesh->nbrTriangles; ++i)
+    {
+        vtkIdType    cell[3];
+        cell[0] = mesh->triangles[i].vert[0];
+        cell[1] = mesh->triangles[i].vert[1];
+        cell[2] = mesh->triangles[i].vert[2];
+        triangles->InsertNextCell(3,cell);
+    }
+
+    vertices->SetNumberOfPoints(mesh->getVertices().size());
+    vertices->SetData(mappedData.Get());
+    unstructuredMesh->SetPoints(vertices.GetPointer());
+    unstructuredMesh->SetCells(VTK_TRIANGLE,triangles.GetPointer());
+
+    if (geom->getRenderDetail()->renderType & SIMMEDTK_RENDER_NORMALS)
+    {
+        vtkSmartPointer<vtkGeometryFilter> geometry = vtkGeometryFilter::New();
+        geometry->SetInputData(unstructuredMesh.GetPointer());
+
+        vtkSmartPointer<vtkPolyDataNormals> normals = vtkPolyDataNormals::New();
+        normals->SetInputConnection(geometry->GetOutputPort());
+
+        mapper = vtkPolyDataMapper::New();
+        mapper->SetInputConnection(normals->GetOutputPort());
+    }
+    else
+    {
+        mapper = vtkDataSetMapper::New();
+        mapper->SetInputDataObject(unstructuredMesh.GetPointer());
+    }
+
+    actor->SetMapper(mapper);
+}
+
+bool MeshRenderDelegate::isTargetTextured() const
+{
+    auto geom = this->getSourceGeometryAs<Mesh>();
+    if (!geom)
+        return false;
+
+    return geom->isMeshTextured();
+}
+
+vtkActor *MeshRenderDelegate::getActor() const
+{
+    return this->actor.GetPointer();
+}
+
+SIMMEDTK_BEGIN_DYNAMIC_LOADER()
+SIMMEDTK_BEGIN_ONLOAD(register_mesh_render_delegate)
+    SIMMEDTK_REGISTER_CLASS(RenderDelegate,RenderDelegate,MeshRenderDelegate,300);
+SIMMEDTK_FINISH_ONLOAD()
+SIMMEDTK_FINISH_DYNAMIC_LOADER()
diff --git a/VtkRendering/VtkRenderDelegate.h b/VtkRendering/VtkRenderDelegate.h
new file mode 100644
index 0000000000000000000000000000000000000000..454c4e513d9eef0dde1507b58b84a308a2ab1fe8
--- /dev/null
+++ b/VtkRendering/VtkRenderDelegate.h
@@ -0,0 +1,14 @@
+#ifndef VTKRENDERABLE_H
+#define VTKRENDERABLE_H
+
+#include "Core/RenderDelegate.h"
+
+class vtkActor;
+
+class VtkRenderDelegate : public RenderDelegate
+{
+public:
+    virtual vtkActor *getActor() const = 0;
+};
+
+#endif // SMRENDERABLE_H
diff --git a/VtkRendering/VtkViewer.cpp b/VtkRendering/VtkViewer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ff6d1be164fd4912baa7ac91459ce686640b4781
--- /dev/null
+++ b/VtkRendering/VtkViewer.cpp
@@ -0,0 +1,119 @@
+/*
+ * // This file is part of the SimMedTK project.
+ * // Copyright (c) Center for Modeling, Simulation, and 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
+ * //
+ * // 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.
+ * //
+ * //---------------------------------------------------------------------------
+ * //
+ * // Authors:
+ * //
+ * // Contact:
+ * //---------------------------------------------------------------------------
+ */
+
+#include "VtkRendering/VtkViewer.h"
+#include "VtkRendering/VtkRenderDelegate.h"
+
+///
+/// \brief Wrapper to the vtkRendering pipeline
+///
+class VtkViewer::VtkRenderer
+{
+public:
+    VtkRenderer(std::shared_ptr<VtkViewer> activeViewer) :
+        viewer(activeViewer),
+        renderWindow(vtkRenderWindow::New()),
+        renderWindowInteractor(vtkRenderWindowInteractor::New())
+    {
+    }
+
+    vtkSmartPointer<vtkRenderWindow> get() const
+    {
+        return this->renderWindow;
+    }
+
+    void render()
+    {
+        this->viewer->adjustFPS();
+        this->renderWindow->Render();
+        this->renderWindowInteractor->Start();
+    }
+
+    void initRenderingContext()
+    {
+        // Create a new renderer and add actors to it.
+        vtkNew<vtkRenderer> renderer;
+        if (viewer->viewerRenderDetail & SIMMEDTK_VIEWERRENDER_FULLSCREEN)
+        {
+            this->renderWindow->FullScreenOn();
+        }
+
+        this->renderWindowInteractor->SetRenderWindow(renderWindow);
+
+        // The actors are obtained from VtkRenderDelegates
+        std::shared_ptr<VtkRenderDelegate> delegate;
+        for(auto &ro : this->viewer->renderOperations)
+        {
+            for(const auto &object : ro.scene->getSceneObject())
+            {
+                delegate = std::static_pointer_cast<VtkRenderDelegate>(object->getRenderDelegate());
+                if (delegate)
+                {
+                    renderer->AddActor(delegate->getActor());
+                }
+            }
+        }
+        if(renderer->GetActors()->GetNumberOfItems() > 0)
+        {
+            this->renderWindow->AddRenderer(renderer.GetPointer());
+        }
+    }
+
+private:
+    std::shared_ptr<VtkViewer> viewer;
+    vtkSmartPointer<vtkRenderWindow> renderWindow;
+    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor;
+};
+
+VtkViewer::VtkViewer(const VtkViewer& /*other*/)
+{
+}
+
+VtkViewer::~VtkViewer()
+{
+}
+
+void VtkViewer::initRenderingContext()
+{
+    this->init();
+    this->renderer->initRenderingContext();
+}
+void VtkViewer::exec()
+{
+    this->render();
+}
+void VtkViewer::render()
+{
+    if(viewerRenderDetail & SIMMEDTK_VIEWERRENDER_DISABLE)
+    {
+        return;
+    }
+
+    beginModule();
+
+    this->renderer->render();
+
+    endModule();
+}
diff --git a/VtkRendering/VtkViewer.h b/VtkRendering/VtkViewer.h
new file mode 100644
index 0000000000000000000000000000000000000000..77f8df7b9dc3af9899bc1e7bf7549f5387eb98c2
--- /dev/null
+++ b/VtkRendering/VtkViewer.h
@@ -0,0 +1,138 @@
+// This file is part of the SimMedTK project.
+// Copyright (c) Center for Modeling, Simulation, and 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
+//
+// 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.
+//
+//---------------------------------------------------------------------------
+//
+// Authors:
+//
+// Contact:
+//---------------------------------------------------------------------------
+
+#ifndef VTKVIEWER_H
+#define VTKVIEWER_H
+
+#include "Core/ViewerBase.h"
+#include "Core/MakeUnique.h"
+
+// VTK includes
+#include <vtkNew.h>
+#include <vtkSmartPointer.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderWindowInteractor.h>
+
+class VtkViewer : public ViewerBase
+{
+
+public:
+    VtkViewer() : renderer(make_unique<VtkRenderer>(safeDownCast<VtkViewer>()))
+    {
+    }
+
+    ~VtkViewer();
+
+    bool operator==(const VtkViewer& other) const;
+    VtkViewer(const VtkViewer& other);
+    VtkViewer& operator=(const VtkViewer& other);
+
+public:
+    ///
+    /// \brief Execute when exit viewer
+    ///
+    virtual void exitViewer(){}
+
+    ///
+    /// \brief add text for display
+    ///
+    virtual void addText(std::string /*tag*/){}
+
+    ///
+    /// \brief update text
+    ///
+    virtual void updateText(std::string /*tag*/, std::string /*string*/){}
+
+    ///
+    /// \brief update text
+    ///
+    virtual void updateText(int /*handle*/, std::string /*string*/){}
+
+    ///
+    /// \brief enable/disable VSync
+    ///
+    virtual void setVSync(bool /*sync*/){}
+
+protected:
+    ///
+    /// \brief Renders the render operation to screen
+    ///
+    virtual void renderToScreen(const RenderOperation &/*rop*/){}
+
+    ///
+    /// \brief Renders the render operation to an FBO
+    ///
+    virtual void renderToFBO(const RenderOperation &/*rop*/){}
+
+    ///
+    /// \brief Initializes rendering system (e.g., OpenGL) capabilities and flags
+    ///
+    virtual void initRenderingCapabilities(){}
+
+    ///
+    /// \brief Initilizes the rendering system (e.g., OpenGL) context, and window containing it
+    virtual void initRenderingContext();
+
+    ///
+    /// \brief Cleans up after initGLContext()
+    ///
+    virtual void destroyRenderingContext(){}
+
+    ///
+    /// \brief Initializes FBOs, textures, shaders and VAOs
+    ///
+    virtual void initResources(){}
+
+    ///
+    /// \brief Processes viewerRenderDetail options
+    ///
+    virtual void processViewerOptions(){}
+
+    ///
+    /// \brief Process window events and render as the major part of an event loop
+    ///
+    virtual void processWindowEvents(){}
+
+    ///
+    /// \brief Set the color and other viewer defaults
+    ///
+    virtual void setToDefaults(){}
+
+    ///
+    /// \brief render depth texture for debugging
+    ///
+    virtual void renderTextureOnView(){}
+
+    virtual void exec();
+
+
+    void render();
+
+private:
+    class VtkRenderer;
+    std::unique_ptr<VtkRenderer> renderer;
+};
+
+
+#endif // VTKVIEWER_H