diff --git a/Examples/AVMNidus/main.cpp b/Examples/AVMNidus/main.cpp
index f5bacc52c5b65638a3ff9b6c5b6eba11cf950778..0e56984773508e84ed3510169e318e0bbf599c91 100644
--- a/Examples/AVMNidus/main.cpp
+++ b/Examples/AVMNidus/main.cpp
@@ -46,8 +46,6 @@
 #include "VTKRendering/InitVTKRendering.h"
 #include "IO/IOMesh.h"
 
-#include <vtkShader.h>
-
 int main(int ac, char **av)
 {
     std::string configFile = "./nidus.config";
@@ -59,140 +57,64 @@ int main(int ac, char **av)
     InitVTKRendering();
     InitIODelegates();
 
-    Matrix33d mat;
-
     //-------------------------------------------------------
     // 1. Create an instance of the SimMedTK framework/SDK
     // 2. Create viewer
     // 3. Create default scene (scene 0)
     //-------------------------------------------------------
     auto sdk = SDK::createStandardSDK();
+    auto sdkSimulator = sdk->getSimulator();
 
     //-------------------------------------------------------
     // Create scene actor 1:  fem scene object + fem simulator
     //-------------------------------------------------------
-
     // create a FEM simulator
-   // auto femSimulator = std::make_shared<VegaFemSimulator>(sdk->getErrorLog());
+    auto femSimulator = std::make_shared<VegaFemSimulator>(sdk->getErrorLog());
 
     // create a Vega based FEM object and attach it to the fem simulator
-    //auto femObject = std::make_shared<VegaFemSceneObject>(sdk->getErrorLog(),configFile);
-
-    auto meshRenderDetail = std::make_shared<RenderDetail>(//SIMMEDTK_RENDER_WIREFRAME |
-                                                             //| SIMMEDTK_RENDER_VERTICES
-                                                             SIMMEDTK_RENDER_FACES | SIMMEDTK_RENDER_NORMALS
-                                                              );
-    meshRenderDetail->setAmbientColor(Color(0.2,0.2,0.2,1.0));
-    meshRenderDetail->setDiffuseColor(Color::colorGray);
-    meshRenderDetail->setSpecularColor(Color(1.0, 1.0, 1.0,0.5));
-    meshRenderDetail->setShininess(20.0);
-
-    // Set shader porograms
-
-	//meshRenderDetail->addShaderProgram(vtkShader::Vertex,"shaders/wet_vert.glsl","wetshader");
-	//meshRenderDetail->addShaderProgram(vtkShader::Fragment,"shaders/wet_frag.glsl","wetshader");
-	Shaders::createShader("wetshader", "shaders/wet_vert.glsl", "shaders/wet_frag.glsl", "");
-    meshRenderDetail->addShaderProgram("wetshader");
-	//meshRenderDetail->addTexture("decal", "textures/metal1.bmp", "textureDecal", "wetshader");
-	//meshRenderDetail->addTexture("bump", "textures/metalbump.jpg", "textureBump", "wetshader");
-	
-  meshRenderDetail->addTexture("decal", "textures/brainx.bmp", "textureDecal", "wetshader");
-  meshRenderDetail->addTexture("bump", "textures/metalbump.jpg", "textureBump", "wetshader");
+    auto femObject = std::make_shared<VegaFemSceneObject>(sdk->getErrorLog(),configFile);
 
-
-	auto planeMeshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES | SIMMEDTK_RENDER_NORMALS);
-	planeMeshRenderDetail->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0));
-	planeMeshRenderDetail->setDiffuseColor(Color::colorGray);
-	planeMeshRenderDetail->setSpecularColor(Color(1.0, 1.0, 1.0, 0.5));
-	planeMeshRenderDetail->setShininess(20.0);
-
-	// Set shader porograms
-	planeMeshRenderDetail->addShaderProgram("wetshader");
-	planeMeshRenderDetail->addTexture("decal", "textures/brain_outside.jpg", "textureDecal", "wetshader");
-	planeMeshRenderDetail->addTexture("bump", "textures/metalbump.jpg", "textureBump", "wetshader");
+    sdk->addSceneActor(femObject, femSimulator);
+    sdkSimulator->registerObjectSimulator(femSimulator);
 	
-
-   // auto renderingMesh = femObject->getVolumetricMesh()->getRenderingMesh();
-   /* if(renderingMesh)
-    {
-        renderingMesh->setRenderDetail(meshRenderDetail);
-    }
-
-    sdk->addSceneActor(femObject, femSimulator);*/
-
     //-------------------------------------------------------
     // Create scene actor 2:  plane + dummy simulator
     //-------------------------------------------------------
     // Create dummy simulator
     auto staticSimulator = std::make_shared<DefaultSimulator>(sdk->getErrorLog());
 
-    // create a static plane scene object of given normal and position
-    //auto staticObject = std::make_shared<StaticSceneObject>();
-
-    //auto plane = std::make_shared<PlaneCollisionModel>(core::Vec3d(0.0, 0.0, -35.0),
-      //                                            core::Vec3d(0.0, 0.0, 1.0));
+    // Create a static plane scene object of given normal and position
+    auto staticObject = std::make_shared<StaticSceneObject>();
 
-    //staticObject->setModel(plane);
-    //sdk->addSceneActor(staticObject, staticSimulator);
+    auto plane = std::make_shared<PlaneCollisionModel>(core::Vec3d(0.0, 0.0, -35.0),
+                                                  core::Vec3d(0.0, 0.0, 1.0));
 
-    //-------------------------------------------------------
-    // Register both object simulators
-    //-------------------------------------------------------
-    auto sdkSimulator = sdk->getSimulator();
-    //sdkSimulator->registerObjectSimulator(femSimulator);
+    staticObject->setModel(plane);
+    sdk->addSceneActor(staticObject, staticSimulator);
 
     //-------------------------------------------------------
     // Enable collision between scene actors 1 and 2
     //-------------------------------------------------------
-    //auto meshModel = std::make_shared<MeshCollisionModel>();
-
-    //meshModel->setMesh(femObject->getVolumetricMesh()->getAttachedMesh(0));
+    auto meshModel = std::make_shared<MeshCollisionModel>();
+    meshModel->setMesh(femObject->getVolumetricMesh()->getAttachedMesh(0));
 
-    //auto planeMeshCollisionPairs = std::make_shared<CollisionPair>();
+    auto planeMeshCollisionPairs = std::make_shared<CollisionPair>();
+    planeMeshCollisionPairs->setModels(meshModel, plane);
 
-    //planeMeshCollisionPairs->setModels(meshModel, plane);
+    sdkSimulator->addCollisionPair(planeMeshCollisionPairs);
 
-    //sdkSimulator->addCollisionPair(planeMeshCollisionPairs);
+    auto planeToMeshCollisionDetection = std::make_shared<PlaneToMeshCollision>();
 
-    //auto planeToMeshCollisionDetection = std::make_shared<PlaneToMeshCollision>();
-
-    //sdkSimulator->registerCollisionDetection(planeToMeshCollisionDetection);
+    sdkSimulator->registerCollisionDetection(planeToMeshCollisionDetection);
 
     //-------------------------------------------------------
     // Enable contact handling between scene actors 1 and 2
     //-------------------------------------------------------
-    //auto planeToMeshContact = std::make_shared<PenaltyContactFemToStatic>(false);
-
-    //planeToMeshContact->setCollisionPairs(planeMeshCollisionPairs);
-
-    //planeToMeshContact->setSceneObjects(staticObject, femObject);
-
-    //sdkSimulator->registerContactHandling(planeToMeshContact);
-
-
-
-	auto cubeModel = std::make_shared<MeshModel>();
-	//cubeModel->load("models/blade2.obj");
-	//cubeModel->load("models/brain.obj");
-	cubeModel->load("models/brain.3ds");
-
-	//cubeModel->load("models/blade.3ds");
-	
-	//cubeModel->getMesh()->scale(Eigen::UniformScaling<double>(10.0));
-	cubeModel->setRenderDetail(meshRenderDetail);
+    auto planeToMeshContact = std::make_shared<PenaltyContactFemToStatic>(false);
+    planeToMeshContact->setCollisionPairs(planeMeshCollisionPairs);
+    planeToMeshContact->setSceneObjects(staticObject, femObject);
 
-	auto cube = std::make_shared<StaticSceneObject>();
-	cube->setModel(cubeModel);
-
-
-
-	auto planeModel = std::make_shared<MeshModel>();
-	//cubeModel->load("models/blade2.obj");
-	planeModel->load("models/plane.obj");
-	planeModel->setRenderDetail(planeMeshRenderDetail);
-
-	auto plane = std::make_shared<StaticSceneObject>();
-	plane->setModel(planeModel);
+    sdkSimulator->registerContactHandling(planeToMeshContact);
 
     //-------------------------------------------------------
     // Customize the viewer
@@ -205,13 +127,12 @@ int main(int ac, char **av)
 
     viewer->setGlobalAxisLength(0.8);
 
+    //-------------------------------------------------------
+    // Customize the scene
+    //-------------------------------------------------------
     // Get Scene
     auto scene = sdk->getScene(0);
     viewer->registerScene(scene);
-	
-	scene->addSceneObject(cube);
-	scene->addSceneObject(plane);
-
 
     // Setup Scene lighting
     auto light1 = Light::getDefaultLighting();
diff --git a/Examples/CMakeLists.txt b/Examples/CMakeLists.txt
index 3bf051f978b0694317db2330b893b4bdfbed2b3b..ff8e3d44f87b12c751ff3fd2e7990a0497d84025 100644
--- a/Examples/CMakeLists.txt
+++ b/Examples/CMakeLists.txt
@@ -26,3 +26,4 @@ endfunction()
 add_subdirectory(vegaFem)
 add_subdirectory(LaparoscopicCamera)
 add_subdirectory(AVMNidus)
+add_subdirectory(Shaders)
diff --git a/Examples/Shaders/CMakeLists.txt b/Examples/Shaders/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..493c99c43081f0081dc7531e2a354ce968f95bef
--- /dev/null
+++ b/Examples/Shaders/CMakeLists.txt
@@ -0,0 +1,38 @@
+set(APP Shaders)
+
+include(${VTK_USE_FILE})
+
+add_executable(${APP} main.cpp)
+target_link_libraries(${APP}
+  Core
+  Geometry
+  VTKRendering
+  Rendering
+  Mesh
+  Event
+  IO
+  )
+
+set_target_properties(${APP}
+    PROPERTIES
+    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+)
+
+set(${APP}_DATA "${CMAKE_CURRENT_BINARY_DIR}")
+if(NOT EXISTS ${${APP}_DATA})
+    file(MAKE_DIRECTORY ${${APP}_DATA})
+endif()
+
+set(FILE_URL http://midas3.kitware.com/midas/download/item/318851/ShadersData.tar)
+set(FILE_SHA1 df719673804075b4505ea267b39e5cd68568f72c)
+set(LOCAL_FILE ${EXAMPLES_DATA}/ShadersData.tar)
+
+midas_download(${FILE_URL} ${FILE_SHA1} ${LOCAL_FILE})
+
+add_custom_command(
+    TARGET ${APP}
+    POST_BUILD
+    COMMAND ${CMAKE_COMMAND} -E tar xf ${LOCAL_FILE}
+    WORKING_DIRECTORY ${${APP}_DATA}
+    COMMENT "-- Unpacking ${LOCAL_FILE}"
+)
diff --git a/Examples/Shaders/main.cpp b/Examples/Shaders/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..29600b57be6ee4d965e6a23d0a3814569e553905
--- /dev/null
+++ b/Examples/Shaders/main.cpp
@@ -0,0 +1,134 @@
+// 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>
+
+// Core SimMedTK includes
+#include "Core/SDK.h"
+#include "Geometry/MeshModel.h"
+
+#include "IO/InitIO.h"
+#include "VTKRendering/InitVTKRendering.h"
+#include "IO/IOMesh.h"
+
+int main()
+{
+    InitVTKRendering();
+    InitIODelegates();
+
+    //-------------------------------------------------------
+    // 1. Create an instance of the SimMedTK framework/SDK
+    // 2. Create viewer
+    // 3. Create default scene (scene 0)
+    //-------------------------------------------------------
+    auto sdk = SDK::createStandardSDK();
+
+    //-------------------------------------------------------
+    // Customize the viewer
+    //-------------------------------------------------------
+    auto viewer = sdk->getViewerInstance();
+
+    viewer->viewerRenderDetail = viewer->viewerRenderDetail |
+                                SIMMEDTK_VIEWERRENDER_FADEBACKGROUND |
+                                SIMMEDTK_VIEWERRENDER_GLOBAL_AXIS;
+
+    viewer->setGlobalAxisLength(0.8);
+
+    //-------------------------------------------------------
+    // Setup Shaders and textures
+    //-------------------------------------------------------
+    Shaders::createShader("wetshader", "ShadersData/shaders/wet_vert.glsl", "ShadersData/shaders/wet_frag.glsl", "");
+
+    // Mesh render detail
+    auto meshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES | SIMMEDTK_RENDER_NORMALS );
+    meshRenderDetail->setAmbientColor(Color(0.2,0.2,0.2,1.0));
+    meshRenderDetail->setDiffuseColor(Color::colorGray);
+    meshRenderDetail->setSpecularColor(Color(1.0, 1.0, 1.0,0.5));
+    meshRenderDetail->setShininess(20.0);
+
+    meshRenderDetail->addShaderProgram("wetshader");
+    meshRenderDetail->addTexture("decal", "ShadersData/textures/brainx.bmp", "textureDecal", "wetshader");
+    meshRenderDetail->addTexture("bump", "ShadersData/textures/metalbump.jpg", "textureBump", "wetshader");
+
+    // Plane render detail
+    auto planeMeshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES | SIMMEDTK_RENDER_NORMALS);
+    planeMeshRenderDetail->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0));
+    planeMeshRenderDetail->setDiffuseColor(Color::colorGray);
+    planeMeshRenderDetail->setSpecularColor(Color(1.0, 1.0, 1.0, 0.5));
+    planeMeshRenderDetail->setShininess(20.0);
+
+    planeMeshRenderDetail->addShaderProgram("wetshader");
+    planeMeshRenderDetail->addTexture("decal", "ShadersData/textures/brain_outside.jpg", "textureDecal", "wetshader");
+    planeMeshRenderDetail->addTexture("bump", "ShadersData/textures/metalbump.jpg", "textureBump", "wetshader");
+
+    //-------------------------------------------------------
+    // Customize the scene
+    //-------------------------------------------------------
+    // Get Scene
+    auto scene = sdk->getScene(0);
+    viewer->registerScene(scene);
+
+    // Setup Cube
+    auto cubeModel = std::make_shared<MeshModel>();
+    cubeModel->load("ShadersData/models/brain.obj");
+    //cubeModel->load("ShadersData/models/brain.3ds");
+    cubeModel->setRenderDetail(meshRenderDetail);
+
+    auto cube = std::make_shared<StaticSceneObject>();
+    cube->setModel(cubeModel);
+    scene->addSceneObject(cube);
+
+    // Setup Plane
+    auto planeModel = std::make_shared<MeshModel>();
+    planeModel->load("ShadersData/models/plane.obj");
+    planeModel->setRenderDetail(planeMeshRenderDetail);
+
+    auto planeObject = std::make_shared<StaticSceneObject>();
+    planeObject->setModel(planeModel);
+    scene->addSceneObject(planeObject);
+
+    // Setup Scene lighting
+    auto light1 = Light::getDefaultLighting();
+    light1->lightPos.setPosition(core::Vec3d(-25.0, 10.0, 10.0));
+    scene->addLight(light1);
+
+    auto light2 = Light::getDefaultLighting();
+    light2->lightPos.setPosition(core::Vec3d(25.0, 10.0, 10.0));
+    scene->addLight(light2);
+
+    // Camera setup
+    auto sceneCamera = Camera::getDefaultCamera();
+    sceneCamera->setPos(-200,0,0);
+    sceneCamera->setZoom(.5);
+    scene->addCamera(sceneCamera);
+
+    //-------------------------------------------------------
+    // Run the SDK
+    //-------------------------------------------------------
+    sdk->run();
+
+    //cleanup
+    sdk->releaseScene(scene);
+
+    return 0;
+}