diff --git a/CMake/vtkiOS.cmake b/CMake/vtkiOS.cmake
index cf091e4b90616f6da417dcde77dbff0bf313f3d6..7dddaf884a7584768b3ed6d4456fb2d4add83ad4 100644
--- a/CMake/vtkiOS.cmake
+++ b/CMake/vtkiOS.cmake
@@ -82,7 +82,17 @@ mark_as_advanced(
 
 # expose some module options
 option(Module_vtkRenderingOpenGL2 "Include Polygonal Rendering Support" ON)
-option(Module_vtkInteractionWidgets "Include INteractionWidgets module" OFF)
+option(Module_vtkInteractionWidgets "Include InteractionWidgets module" OFF)
+option(Module_vtkIOXML "Include IO/XML Module" OFF)
+option(Module_vtkFiltersModeling "Turn on or off this module" OFF)
+option(Module_vtkFiltersSources "Turn on or off this module" OFF)
+option(Module_vtkIOGeometry "Turn on or off this module" OFF)
+option(Module_vtkIOLegacy "Turn on or off this module" OFF)
+option(Module_vtkIOImage "Turn on or off this module" OFF)
+option(Module_vtkIOPLY "Turn on or off this module" OFF)
+option(Module_vtkIOInfovis "Turn on or off this module" OFF)
+option(Module_vtkRenderingFreeType "Turn on or off this module" OFF)
+
 
 # add volume rendering option for ES 3.0
 if (OPENGL_ES_VERSION STREQUAL "3.0" AND Module_vtkRenderingOpenGL2)
@@ -105,21 +115,16 @@ set(ios_cmake_flags
   -DVTK_Group_Qt:BOOL=OFF
   -DVTK_Group_Tk:BOOL=OFF
   -DVTK_Group_Web:BOOL=OFF
-#  -DModule_vtkFiltersCore:BOOL=ON
-#  -DModule_vtkFiltersModeling:BOOL=ON
-#  -DModule_vtkFiltersSources:BOOL=ON
-#  -DModule_vtkFiltersGeometry:BOOL=ON
-#  -DModule_vtkIOGeometry:BOOL=ON
-#  -DModule_vtkIOLegacy:BOOL=ON
-#  -DModule_vtkIOImage:BOOL=ON
-#  -DModule_vtkIOPLY:BOOL=ON
-#  -DModule_vtkIOInfovis:BOOL=ON
-#  -DModule_vtkImagingCore:BOOL=ON
-#  -DModule_vtkInteractionStyle:BOOL=ON
-#  -DModule_vtkParallelCore:BOOL=ON
-#  -DModule_vtkRenderingFreeType:BOOL=OFF
   -DModule_vtkRenderingOpenGL2:BOOL=${Module_vtkRenderingOpenGL2}
   -DModule_vtkInteractionWidgets:BOOL=${Module_vtkInteractionWidgets}
+  -DModule_vtkFiltersModeling:BOOL=${Module_vtkFiltersModeling}
+  -DModule_vtkFiltersSources:BOOL=${Module_vtkFiltersSources}
+  -DModule_vtkIOGeometry:BOOL=${Module_vtkIOGeometry}
+  -DModule_vtkIOLegacy:BOOL=${Module_vtkIOLegacy}
+  -DModule_vtkIOImage:BOOL=${Module_vtkIOImage}
+  -DModule_vtkIOPLY:BOOL=${Module_vtkIOPLY}
+  -DModule_vtkIOInfovis:BOOL=${Module_vtkIOInfovis}
+  -DModule_vtkRenderingFreeType:BOOL=${Module_vtkRenderingFreeType}
 )
 
 if (Module_vtkRenderingOpenGL2)
@@ -150,6 +155,17 @@ macro(crosscompile target toolchain_file archs)
       -DCMAKE_INSTALL_PREFIX:PATH=${INSTALL_DIR}/${target}
       ${ios_cmake_flags}
   )
+  #
+  # add an INSTALL_ALLWAYS since we want it and cmake lacks it
+  #
+  ExternalProject_Get_Property(${target} binary_dir)
+  _ep_get_build_command(${target} INSTALL cmd)
+  ExternalProject_Add_Step(${target} always-install
+    COMMAND ${cmd}
+    WORKING_DIRECTORY ${binary_dir}
+    DEPENDEES build
+    ALWAYS 1
+    )
 endmacro()
 
 crosscompile(vtk-ios-simulator
diff --git a/Common/Core/vtkCommand.h b/Common/Core/vtkCommand.h
index 5692d890973c4c5ce294c3cccfddf98df60f4000..0f19db653d91f59a4560d9e03f905fe4797a0c6a 100644
--- a/Common/Core/vtkCommand.h
+++ b/Common/Core/vtkCommand.h
@@ -312,7 +312,19 @@
     _vtk_add_event(WindowIsDirectEvent)\
     _vtk_add_event(UncheckedPropertyModifiedEvent)\
     _vtk_add_event(UpdateShaderEvent)\
-    _vtk_add_event(MessageEvent)
+    _vtk_add_event(MessageEvent)\
+    _vtk_add_event(StartPinchEvent)\
+    _vtk_add_event(PinchEvent)\
+    _vtk_add_event(EndPinchEvent)\
+    _vtk_add_event(StartRotateEvent)\
+    _vtk_add_event(RotateEvent)\
+    _vtk_add_event(EndRotateEvent)\
+    _vtk_add_event(StartPanEvent)\
+    _vtk_add_event(PanEvent)\
+    _vtk_add_event(EndPanEvent)\
+    _vtk_add_event(TapEvent)\
+    _vtk_add_event(LongTapEvent)\
+    _vtk_add_event(SwipeEvent)
 
 #define vtkEventDeclarationMacro(_enum_name)\
   enum _enum_name{\
diff --git a/Examples/iOS/CMakeLists.txt b/Examples/iOS/CMakeLists.txt
index 2eb49ebf2a5cbbdbae5cef804382c8bbeacc6eed..0599629cf579852b1307e32810352cf3e2304e39 100644
--- a/Examples/iOS/CMakeLists.txt
+++ b/Examples/iOS/CMakeLists.txt
@@ -1,25 +1,27 @@
 # copy the example to the binary tree where they can be built manually using xcode
 
-if (TRUE)
-  add_custom_target(iOS-examples-rm ALL
-    COMMAND ${CMAKE_COMMAND} -E remove_directory
-            "${CMAKE_CURRENT_BINARY_DIR}/GLPaint"
-    COMMAND ${CMAKE_COMMAND} -E remove_directory
-            "${CMAKE_CURRENT_BINARY_DIR}/Surfaces")
+add_custom_target(iOS-examples-rm ALL
+  COMMAND ${CMAKE_COMMAND} -E remove_directory
+          "${CMAKE_CURRENT_BINARY_DIR}/GLPaint"
+  COMMAND ${CMAKE_COMMAND} -E remove_directory
+          "${CMAKE_CURRENT_BINARY_DIR}/Surfaces"
+  COMMAND ${CMAKE_COMMAND} -E remove_directory
+          "${CMAKE_CURRENT_BINARY_DIR}/VolumeRender"
+  COMMAND ${CMAKE_COMMAND} -E remove_directory
+          "${CMAKE_CURRENT_BINARY_DIR}/PlaneView")
 
-   add_custom_target(iOS-examples-copy ALL
-    COMMAND ${CMAKE_COMMAND} -E copy_directory
-            "${CMAKE_CURRENT_SOURCE_DIR}/GLPaint"
-            "${CMAKE_CURRENT_BINARY_DIR}/GLPaint"
-    COMMAND ${CMAKE_COMMAND} -E copy_directory
-            "${CMAKE_CURRENT_SOURCE_DIR}/Surfaces"
-            "${CMAKE_CURRENT_BINARY_DIR}/Surfaces")
+ add_custom_target(iOS-examples-copy ALL
+  COMMAND ${CMAKE_COMMAND} -E copy_directory
+          "${CMAKE_CURRENT_SOURCE_DIR}/GLPaint"
+          "${CMAKE_CURRENT_BINARY_DIR}/GLPaint"
+  COMMAND ${CMAKE_COMMAND} -E copy_directory
+          "${CMAKE_CURRENT_SOURCE_DIR}/Surfaces"
+          "${CMAKE_CURRENT_BINARY_DIR}/Surfaces"
+  COMMAND ${CMAKE_COMMAND} -E copy_directory
+          "${CMAKE_CURRENT_SOURCE_DIR}/VolumeRender"
+          "${CMAKE_CURRENT_BINARY_DIR}/VolumeRender"
+  COMMAND ${CMAKE_COMMAND} -E copy_directory
+          "${CMAKE_CURRENT_SOURCE_DIR}/PlaneView"
+          "${CMAKE_CURRENT_BINARY_DIR}/PlaneView")
 
-  add_dependencies(iOS-examples-copy iOS-examples-rm)
-else ()
-  add_subdirectory(MaceVTK/MaceVTK)
-  add_custom_target(iOS-examples-copy ALL
-    COMMAND ${CMAKE_COMMAND} -E copy_directory
-            "${CMAKE_CURRENT_SOURCE_DIR}/MaceVTK"
-            "${CMAKE_CURRENT_BINARY_DIR}/MaceVTK")
-endif ()
+add_dependencies(iOS-examples-copy iOS-examples-rm)
diff --git a/Examples/iOS/GLPaint.old/Classes/AppController.h b/Examples/iOS/GLPaint.old/Classes/AppController.h
deleted file mode 100644
index 5a215e531aeef88d52b631f7ac5fcba34d6cca37..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/AppController.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import <UIKit/UIKit.h>
-#import <GLKit/GLKit.h>
-
-@interface MyGLKViewController : GLKViewController
-
-@property (nonatomic, strong) UIWindow *window;
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Classes/AppController.mm b/Examples/iOS/GLPaint.old/Classes/AppController.mm
deleted file mode 100644
index 246a1f220d84bddd34c1c869c86e048c12baa551..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/AppController.mm
+++ /dev/null
@@ -1,126 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import "MyGLKViewController.h"
-
-@interface MyGLKViewController () {
-
-  vesKiwiViewerApp::Ptr mKiwiApp;
-
-  MyGestureHandler* mGestureHandler;
-}
-
-@property (strong, nonatomic) EAGLContext *context;
-
-- (void)tearDownGL;
-
-@end
-
-@implementation MyGLKViewController
-
-
-- (void)viewDidLoad
-{
-  [super viewDidLoad];
-
-  self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
-
-  if (!self.context) {
-      NSLog(@"Failed to create ES context");
-  }
-
-  GLKView *view = (GLKView *)self.view;
-  view.context = self.context;
-  view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
-  view.drawableMultisample = GLKViewDrawableMultisample4X;
-
-  [self initializeKiwiApp];
-  [self initializeGestureHandler];
-}
-
--(void) initializeKiwiApp
-{
-  [EAGLContext setCurrentContext:self.context];
-
-  std::string dataset = [[[NSBundle mainBundle] pathForResource:@"teapot" ofType:@"vtp"] UTF8String];
-
-  self->mKiwiApp = vesKiwiViewerApp::Ptr(new vesKiwiViewerApp);
-  self->mKiwiApp->initGL();
-  [self resizeView];
-  self->mKiwiApp->loadDataset(dataset);
-  self->mKiwiApp->resetView();
-}
-
--(void) initializeGestureHandler
-{
-  self->mGestureHandler = [[MyGestureHandler alloc] init];
-  self->mGestureHandler.view = self.view;
-  self->mGestureHandler.kiwiApp = self->mKiwiApp;
-  [self->mGestureHandler createGestureRecognizers];
-}
-
-- (void)dealloc
-{
-  [self tearDownGL];
-
-  if ([EAGLContext currentContext] == self.context) {
-      [EAGLContext setCurrentContext:nil];
-  }
-}
-
-- (void)didReceiveMemoryWarning
-{
-  [super didReceiveMemoryWarning];
-
-  if ([self isViewLoaded] && ([[self view] window] == nil)) {
-    self.view = nil;
-
-    [self tearDownGL];
-
-    if ([EAGLContext currentContext] == self.context) {
-        [EAGLContext setCurrentContext:nil];
-    }
-    self.context = nil;
-  }
-
-  // Dispose of any resources that can be recreated.
-}
-
-- (void)tearDownGL
-{
-  [EAGLContext setCurrentContext:self.context];
-
-  // free GL resources
-  // ...
-}
-
--(void) resizeView
-{
-  double scale = self.view.contentScaleFactor;
-  self->mKiwiApp->resizeView(self.view.bounds.size.width*scale, self.view.bounds.size.height*scale);
-}
-
-- (void)viewWillLayoutSubviews
-{
-  [self resizeView];
-}
-
-- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
-{
-  if (self->mKiwiApp && !self.paused) {
-    self->mKiwiApp->render();
-  }
-}
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Classes/AppDelegate.h b/Examples/iOS/GLPaint.old/Classes/AppDelegate.h
deleted file mode 100644
index 618bf67f5469cf8133deeaa4ad5e771fd794d8a0..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/AppDelegate.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-#import <UIKit/UIKit.h>
-
-@interface AppDelegate : UIResponder <UIApplicationDelegate>
-
-@property (strong, nonatomic) UIWindow *window;
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Classes/MyGLKViewController.h b/Examples/iOS/GLPaint.old/Classes/MyGLKViewController.h
deleted file mode 100644
index ce82e4e8ff00a1f38d8b1b2c690482d6dfa8a7ca..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/MyGLKViewController.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import <UIKit/UIKit.h>
-#import <GLKit/GLKit.h>
-
-// Note: This file should be includable by both pure Objective-C and Objective-C++ source files.
-// To achieve this, we use the neat technique below:
-#ifdef __cplusplus
-  // Forward declarations
-  class vtkIOSRenderWindow;
-  class vtkIOSRenderWindowInteractor;
-
-  // Type declarations
-  typedef vtkIOSRenderWindow *vtkIOSRenderWindowRef;
-  typedef vtkIOSRenderWindowInteractor *vtkIOSRenderWindowInteractorRef;
-#else
-  // Type declarations
-  typedef void *vtkIOSRenderWindowRef;
-  typedef void *vtkIOSRenderWindowInteractorRef;
-#endif
-
-@interface MyGLKViewController : GLKViewController
-{
-  @private
-  vtkIOSRenderWindowRef _myVTKRenderWindow;
-}
-
-@property (nonatomic, strong) UIWindow *window;
-
-- (vtkIOSRenderWindowRef)getVTKRenderWindow;
-- (void)setVTKRenderWindow:(vtkIOSRenderWindowRef)theVTKRenderWindow;
-
-- (vtkIOSRenderWindowInteractorRef)getInteractor;
-
-- (void)setupPipeline;
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Classes/MyGLKViewController.mm b/Examples/iOS/GLPaint.old/Classes/MyGLKViewController.mm
deleted file mode 100644
index 0842d61b9c0c6ff7833206e67464c28febaec1fc..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/MyGLKViewController.mm
+++ /dev/null
@@ -1,193 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import "MyGLKViewController.h"
-
-@interface MyGLKViewController () {
-
-  vesKiwiViewerApp::Ptr mKiwiApp;
-
-  MyGestureHandler* mGestureHandler;
-}
-
-@property (strong, nonatomic) EAGLContext *context;
-
-- (void)tearDownGL;
-
-@end
-
-@implementation MyGLKViewController
-
-//----------------------------------------------------------------------------
-- (vtkIOSRenderWindow *)getVTKRenderWindow
-{
-  return _myVTKRenderWindow;
-}
-
-//----------------------------------------------------------------------------
-- (void)setVTKRenderWindow:(vtkIOSRenderWindow *)theVTKRenderWindow
-{
-  _myVTKRenderWindow = theVTKRenderWindow;
-}
-
-//----------------------------------------------------------------------------
-- (vtkIOSRenderWindowInteractor *)getInteractor
-{
-  if (_myVTKRenderWindow)
-    {
-    return (vtkIOSRenderWindowInteractor *)_myVTKRenderWindow->GetInteractor();
-    }
-  else
-    {
-    return NULL;
-    }
-}
-
-- (void)setupPipeline
-{
-  vtkRenderingOpenGL2ObjectFactory *of = vtkRenderingOpenGL2ObjectFactory::New();
-  vtkObjectFactory::RegisterFactory(of);
-
-  vtkIOSRenderWindow *renWin = vtkIOSRenderWindow::New();
-  //renWin->DebugOn();
-  [self setVTKRenderWindow:renWin];
-
-  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
-  iren->SetRenderWindow(renWin);
-
-  vtkNew<vtkRenderer> renderer;
-  renWin->AddRenderer(renderer.Get());
-
-  vtkInteractorStyleMultiTouchCamera *ismt = vtkInteractorStyleMultiTouchCamera::New();
-  iren->SetInteractorStyle(ismt);
-  ismt->Delete();
-
-  vtkNew<vtkSphereSource> sphere;
-  sphere->SetThetaResolution(8);
-  sphere->SetPhiResolution(8);
-
-  vtkNew<vtkPolyDataMapper> sphereMapper;
-  sphereMapper->SetInputConnection(sphere->GetOutputPort());
-  vtkNew<vtkActor> sphereActor;
-  sphereActor->SetMapper(sphereMapper.Get());
-
-  vtkNew<vtkConeSource> cone;
-  cone->SetResolution(6);
-
-  vtkNew<vtkGlyph3D> glyph;
-  glyph->SetInputConnection(sphere->GetOutputPort());
-  glyph->SetSourceConnection(cone->GetOutputPort());
-  glyph->SetVectorModeToUseNormal();
-  glyph->SetScaleModeToScaleByVector();
-  glyph->SetScaleFactor(0.25);
-
-  vtkNew<vtkPolyDataMapper> spikeMapper;
-  spikeMapper->SetInputConnection(glyph->GetOutputPort());
-
-  vtkNew<vtkActor> spikeActor;
-  spikeActor->SetMapper(spikeMapper.Get());
-
-  renderer->AddActor(sphereActor.Get());
-  renderer->AddActor(spikeActor.Get());
-  renderer->SetBackground(0.4,0.5,0.6);
-}
-
-
-- (void)viewDidLoad
-{
-  [super viewDidLoad];
-
-  self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
-
-  if (!self.context) {
-      NSLog(@"Failed to create ES context");
-  }
-
-  GLKView *view = (GLKView *)self.view;
-  view.context = self.context;
-  view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
-  view.drawableMultisample = GLKViewDrawableMultisample4X;
-
-  // setup the vis pipeline
-  [self setupPipeline];
-
-  [self getVTKRenderWindow]->SetSize(backingWidth, backingHeight);
-  [self getVTKRenderWindow]->Render();
-}
-
--(void) initializeKiwiApp
-{
-  [EAGLContext setCurrentContext:self.context];
-
-  std::string dataset = [[[NSBundle mainBundle] pathForResource:@"teapot" ofType:@"vtp"] UTF8String];
-
-  self->mKiwiApp = vesKiwiViewerApp::Ptr(new vesKiwiViewerApp);
-  self->mKiwiApp->initGL();
-  [self resizeView];
-  self->mKiwiApp->loadDataset(dataset);
-  self->mKiwiApp->resetView();
-}
-
-- (void)dealloc
-{
-  [self tearDownGL];
-
-  if ([EAGLContext currentContext] == self.context) {
-      [EAGLContext setCurrentContext:nil];
-  }
-}
-
-- (void)didReceiveMemoryWarning
-{
-  [super didReceiveMemoryWarning];
-
-  if ([self isViewLoaded] && ([[self view] window] == nil)) {
-    self.view = nil;
-
-    [self tearDownGL];
-
-    if ([EAGLContext currentContext] == self.context) {
-        [EAGLContext setCurrentContext:nil];
-    }
-    self.context = nil;
-  }
-
-  // Dispose of any resources that can be recreated.
-}
-
-- (void)tearDownGL
-{
-  [EAGLContext setCurrentContext:self.context];
-
-  // free GL resources
-  // ...
-}
-
--(void) resizeView
-{
-  double scale = self.view.contentScaleFactor;
-  [self getVTKRenderWindow]->SetSize(self.view.bounds.size.width*scale, self.view.bounds.size.height*scale);
-}
-
-- (void)viewWillLayoutSubviews
-{
-  [self resizeView];
-}
-
-- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
-{
-  [self getVTKRenderWindow]->Render();
-}
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Classes/PaintingView.h b/Examples/iOS/GLPaint.old/Classes/PaintingView.h
deleted file mode 100644
index 32fbee74f6aa2c16d0e434503b3007839ec5a5ea..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/PaintingView.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import <vtkIOSGLView.h>
-
-//CLASS INTERFACES:
-
-@interface PaintingView : vtkIOSGLView
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Classes/PaintingView.mm b/Examples/iOS/GLPaint.old/Classes/PaintingView.mm
deleted file mode 100644
index 0cdf07f80c487090b81708ec8bd0ad33ba62ebd8..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/PaintingView.mm
+++ /dev/null
@@ -1,100 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import <QuartzCore/QuartzCore.h>
-#import <OpenGLES/EAGLDrawable.h>
-#import <GLKit/GLKit.h>
-
-#import "PaintingView.h"
-
-#include "vtkNew.h"
-#include "vtkActor.h"
-#include "vtkCamera.h"
-#include "vtkConeSource.h"
-#include "vtkDebugLeaks.h"
-#include "vtkGlyph3D.h"
-#include "vtkPolyData.h"
-#include "vtkPolyDataMapper.h"
-#include "vtkIOSRenderWindow.h"
-#include "vtkIOSRenderWindowInteractor.h"
-#include "vtkRenderer.h"
-#include "vtkSphereSource.h"
-#include "vtkCommand.h"
-#include "vtkInteractorStyleMultiTouchCamera.h"
-
-
-@interface PaintingView()
-{
-}
-
-@end
-
-@implementation PaintingView
-
-
-- (void)setupPipeline
-{
-  [super setupPipeline];
-
-  vtkIOSRenderWindowInteractor *interactor = [self getInteractor];
-  if (!interactor)
-    {
-    return;
-    }
-
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
-  vtkNew<vtkRenderer> renderer;
-  renWin->AddRenderer(renderer.Get());
-
-  vtkInteractorStyleMultiTouchCamera *ismt = vtkInteractorStyleMultiTouchCamera::New();
-  interactor->SetInteractorStyle(ismt);
-  ismt->Delete();
-
-  vtkNew<vtkSphereSource> sphere;
-  sphere->SetThetaResolution(8);
-  sphere->SetPhiResolution(8);
-
-  vtkNew<vtkPolyDataMapper> sphereMapper;
-  sphereMapper->SetInputConnection(sphere->GetOutputPort());
-  vtkNew<vtkActor> sphereActor;
-  sphereActor->SetMapper(sphereMapper.Get());
-
-  vtkNew<vtkConeSource> cone;
-  cone->SetResolution(6);
-
-  vtkNew<vtkGlyph3D> glyph;
-  glyph->SetInputConnection(sphere->GetOutputPort());
-  glyph->SetSourceConnection(cone->GetOutputPort());
-  glyph->SetVectorModeToUseNormal();
-  glyph->SetScaleModeToScaleByVector();
-  glyph->SetScaleFactor(0.25);
-
-  vtkNew<vtkPolyDataMapper> spikeMapper;
-  spikeMapper->SetInputConnection(glyph->GetOutputPort());
-
-  vtkNew<vtkActor> spikeActor;
-  spikeActor->SetMapper(spikeMapper.Get());
-
-  renderer->AddActor(sphereActor.Get());
-  renderer->AddActor(spikeActor.Get());
-  renderer->SetBackground(0.4,0.5,0.6);
-}
-
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Classes/PaintingViewController.h b/Examples/iOS/GLPaint.old/Classes/PaintingViewController.h
deleted file mode 100644
index 096e4a9a91d9e79de697d9b466bd1d775331af92..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/PaintingViewController.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import <UIKit/UIKit.h>
-
-@interface PaintingViewController : UIViewController
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Classes/PaintingViewController.mm b/Examples/iOS/GLPaint.old/Classes/PaintingViewController.mm
deleted file mode 100644
index d432a3af39d9899ca02cdf054d1738d0e3de9f17..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Classes/PaintingViewController.mm
+++ /dev/null
@@ -1,56 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import "PaintingViewController.h"
-#import "PaintingView.h"
-
-//CLASS IMPLEMENTATIONS:
-
-@interface PaintingViewController()
-{
-	CFTimeInterval		lastTime;
-}
-@end
-
-@implementation PaintingViewController
-
-- (void)viewDidLoad
-{
-  [super viewDidLoad];
-}
-
-- (void)viewDidAppear:(BOOL)animated
-{
-    [super viewDidAppear:animated];
-    [self becomeFirstResponder];
-}
-
-- (BOOL)canBecomeFirstResponder
-{
-    return YES;
-}
-
-// Release resources when they are no longer needed,
-- (void)dealloc
-{
-}
-
-// We do not support auto-rotation in this sample
-- (BOOL)shouldAutorotate
-{
-    return NO;
-}
-
-
-@end
diff --git a/Examples/iOS/GLPaint.old/Default-568h@2x.png b/Examples/iOS/GLPaint.old/Default-568h@2x.png
deleted file mode 100644
index e2b072ce4736211202602c7e0d78021733e8fe88..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Default-568h@2x.png and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/Default.png b/Examples/iOS/GLPaint.old/Default.png
deleted file mode 100644
index cfb0fb88f12cf8db85bb2d3278c8e53e291ff8c4..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Default.png and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/GLPaint-Info.plist b/Examples/iOS/GLPaint.old/GLPaint-Info.plist
deleted file mode 100644
index 236440a7408158a3d972f7afbd07a44a779362af..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/GLPaint-Info.plist
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleDisplayName</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundleExecutable</key>
-	<string>${EXECUTABLE_NAME}</string>
-	<key>CFBundleIconFile</key>
-	<string></string>
-	<key>CFBundleIdentifier</key>
-	<string>com.example.apple-samplecode.${PRODUCT_NAME:identifier}</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.13</string>
-	<key>LSRequiresIPhoneOS</key>
-	<true/>
-	<key>NSMainNibFile</key>
-	<string>MainWindow</string>
-	<key>UIStatusBarHidden</key>
-	<true/>
-	<key>UIViewControllerBasedStatusBarAppearance</key>
-	<false/>
-	<key>CFBundleIconFiles</key>
-	<array>
-		<string>Icon.png</string>
-		<string>Icon@2x.png</string>
-		<string>Icon-72.png</string>
-		<string>Icon-Small.png</string>
-		<string>Icon-Small-50.png</string>
-		<string>Icon-Small@2x.png</string>
-	</array>
-</dict>
-</plist>
diff --git a/Examples/iOS/GLPaint.old/GLPaint.xcodeproj/project.pbxproj b/Examples/iOS/GLPaint.old/GLPaint.xcodeproj/project.pbxproj
deleted file mode 100644
index eb516191489675b88867e9899cfc9b0e4f030abe..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/GLPaint.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,376 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		13328B8419C77700006A473C /* vtk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13328B8319C77700006A473C /* vtk.framework */; };
-		13328B8619C77938006A473C /* libstdc++.6.0.9.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 13328B8519C77938006A473C /* libstdc++.6.0.9.dylib */; };
-		1B8CA3120DC8E3A4002C657A /* AppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1B8CA30B0DC8E3A4002C657A /* AppController.mm */; };
-		1B8CA3130DC8E3A4002C657A /* PaintingView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1B8CA30D0DC8E3A4002C657A /* PaintingView.mm */; };
-		1BD0B6AB0DDCA9B800E538F8 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 1BD0B6AA0DDCA9B800E538F8 /* Default.png */; };
-		1D3623EC0D0F72F000981E51 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */; };
-		1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
-		1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
-		1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
-		2D500B940D5A79C200DBA0E3 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D500B920D5A79C200DBA0E3 /* OpenGLES.framework */; };
-		2D500B9A0D5A79CF00DBA0E3 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D500B990D5A79CF00DBA0E3 /* QuartzCore.framework */; };
-		AF7492AB1728A9E50013253B /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF7492A91728A9E50013253B /* MainWindow.xib */; };
-		AF7E20421728A2C600728423 /* PaintingViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF7E203F1728A2C600728423 /* PaintingViewController.xib */; };
-		AF7E20451728A54000728423 /* PaintingViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AF7E20441728A53F00728423 /* PaintingViewController.mm */; };
-		AF877F8617271F57002D08B8 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AF877F8517271F57002D08B8 /* Default-568h@2x.png */; };
-		AF877F9417272C2F002D08B8 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF877F9317272C2F002D08B8 /* GLKit.framework */; };
-		AFCEBA2111D96215001AA22A /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = AFCEBA1A11D96215001AA22A /* Icon-72.png */; };
-		AFCEBA2211D96215001AA22A /* Icon-Small-50.png in Resources */ = {isa = PBXBuildFile; fileRef = AFCEBA1B11D96215001AA22A /* Icon-Small-50.png */; };
-		AFCEBA2311D96215001AA22A /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = AFCEBA1C11D96215001AA22A /* Icon-Small.png */; };
-		AFCEBA2411D96215001AA22A /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFCEBA1D11D96215001AA22A /* Icon-Small@2x.png */; };
-		AFCEBA2511D96215001AA22A /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = AFCEBA1E11D96215001AA22A /* Icon.png */; };
-		AFCEBA2611D96215001AA22A /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFCEBA1F11D96215001AA22A /* Icon@2x.png */; };
-		AFCEBA2711D96215001AA22A /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = AFCEBA2011D96215001AA22A /* iTunesArtwork */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXFileReference section */
-		13328B8319C77700006A473C /* vtk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vtk.framework; path = ../../../vtkinstall/frameworks/vtk.framework; sourceTree = "<group>"; };
-		13328B8519C77938006A473C /* libstdc++.6.0.9.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.6.0.9.dylib"; path = "usr/lib/libstdc++.6.0.9.dylib"; sourceTree = SDKROOT; };
-		1B8CA30A0DC8E3A4002C657A /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppController.h; path = Classes/AppController.h; sourceTree = "<group>"; };
-		1B8CA30B0DC8E3A4002C657A /* AppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppController.mm; path = Classes/AppController.mm; sourceTree = "<group>"; };
-		1B8CA30C0DC8E3A4002C657A /* PaintingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PaintingView.h; path = Classes/PaintingView.h; sourceTree = "<group>"; };
-		1B8CA30D0DC8E3A4002C657A /* PaintingView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PaintingView.mm; path = Classes/PaintingView.mm; sourceTree = "<group>"; };
-		1BD0B6AA0DDCA9B800E538F8 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
-		1BEB7DB40DA5967E00271C96 /* ReadMe.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadMe.txt; sourceTree = "<group>"; };
-		1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
-		1D6058910D05DD3D006BFB54 /* GLPaint.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GLPaint.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
-		29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		2D500B920D5A79C200DBA0E3 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
-		2D500B990D5A79CF00DBA0E3 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
-		32CA4F630368D1EE00C91783 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = "<group>"; };
-		8D1107310486CEB800E47090 /* GLPaint-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GLPaint-Info.plist"; sourceTree = "<group>"; };
-		AF7492AA1728A9E50013253B /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow.xib; sourceTree = "<group>"; };
-		AF7E20401728A2C600728423 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/PaintingViewController.xib; sourceTree = "<group>"; };
-		AF7E20431728A53F00728423 /* PaintingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PaintingViewController.h; path = Classes/PaintingViewController.h; sourceTree = "<group>"; };
-		AF7E20441728A53F00728423 /* PaintingViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PaintingViewController.mm; path = Classes/PaintingViewController.mm; sourceTree = "<group>"; };
-		AF877F8517271F57002D08B8 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
-		AF877F9317272C2F002D08B8 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; };
-		AFCEBA1A11D96215001AA22A /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-72.png"; path = "Images/Icon-72.png"; sourceTree = "<group>"; };
-		AFCEBA1B11D96215001AA22A /* Icon-Small-50.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small-50.png"; path = "Images/Icon-Small-50.png"; sourceTree = "<group>"; };
-		AFCEBA1C11D96215001AA22A /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small.png"; path = "Images/Icon-Small.png"; sourceTree = "<group>"; };
-		AFCEBA1D11D96215001AA22A /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-Small@2x.png"; path = "Images/Icon-Small@2x.png"; sourceTree = "<group>"; };
-		AFCEBA1E11D96215001AA22A /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = Images/Icon.png; sourceTree = "<group>"; };
-		AFCEBA1F11D96215001AA22A /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "Images/Icon@2x.png"; sourceTree = "<group>"; };
-		AFCEBA2011D96215001AA22A /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; name = iTunesArtwork; path = Images/iTunesArtwork; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				13328B8619C77938006A473C /* libstdc++.6.0.9.dylib in Frameworks */,
-				13328B8419C77700006A473C /* vtk.framework in Frameworks */,
-				AF877F9417272C2F002D08B8 /* GLKit.framework in Frameworks */,
-				1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
-				1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
-				1D3623EC0D0F72F000981E51 /* CoreGraphics.framework in Frameworks */,
-				2D500B940D5A79C200DBA0E3 /* OpenGLES.framework in Frameworks */,
-				2D500B9A0D5A79CF00DBA0E3 /* QuartzCore.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		19C28FACFE9D520D11CA2CBB /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				1D6058910D05DD3D006BFB54 /* GLPaint.app */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
-			isa = PBXGroup;
-			children = (
-				1BEB7DB40DA5967E00271C96 /* ReadMe.txt */,
-				2D500B1D0D5A766B00DBA0E3 /* Classes */,
-				29B97315FDCFA39411CA2CEA /* Other Sources */,
-				29B97317FDCFA39411CA2CEA /* Resources */,
-				29B97323FDCFA39411CA2CEA /* Frameworks */,
-				19C28FACFE9D520D11CA2CBB /* Products */,
-			);
-			name = CustomTemplate;
-			sourceTree = "<group>";
-		};
-		29B97315FDCFA39411CA2CEA /* Other Sources */ = {
-			isa = PBXGroup;
-			children = (
-				32CA4F630368D1EE00C91783 /* Prefix.pch */,
-				29B97316FDCFA39411CA2CEA /* main.m */,
-			);
-			name = "Other Sources";
-			sourceTree = "<group>";
-		};
-		29B97317FDCFA39411CA2CEA /* Resources */ = {
-			isa = PBXGroup;
-			children = (
-				AF7492A91728A9E50013253B /* MainWindow.xib */,
-				AF7E203F1728A2C600728423 /* PaintingViewController.xib */,
-				AFCEBA1D11D96215001AA22A /* Icon-Small@2x.png */,
-				AFCEBA1A11D96215001AA22A /* Icon-72.png */,
-				AFCEBA1B11D96215001AA22A /* Icon-Small-50.png */,
-				AFCEBA1C11D96215001AA22A /* Icon-Small.png */,
-				AFCEBA1E11D96215001AA22A /* Icon.png */,
-				AFCEBA1F11D96215001AA22A /* Icon@2x.png */,
-				AFCEBA2011D96215001AA22A /* iTunesArtwork */,
-				1BD0B6AA0DDCA9B800E538F8 /* Default.png */,
-				AF877F8517271F57002D08B8 /* Default-568h@2x.png */,
-				8D1107310486CEB800E47090 /* GLPaint-Info.plist */,
-			);
-			name = Resources;
-			sourceTree = "<group>";
-		};
-		29B97323FDCFA39411CA2CEA /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				13328B8519C77938006A473C /* libstdc++.6.0.9.dylib */,
-				13328B8319C77700006A473C /* vtk.framework */,
-				AF877F9317272C2F002D08B8 /* GLKit.framework */,
-				1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */,
-				2D500B990D5A79CF00DBA0E3 /* QuartzCore.framework */,
-				2D500B920D5A79C200DBA0E3 /* OpenGLES.framework */,
-				1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
-				1D30AB110D05D00D00671497 /* Foundation.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
-		2D500B1D0D5A766B00DBA0E3 /* Classes */ = {
-			isa = PBXGroup;
-			children = (
-				1B8CA30A0DC8E3A4002C657A /* AppController.h */,
-				1B8CA30B0DC8E3A4002C657A /* AppController.mm */,
-				AF7E20431728A53F00728423 /* PaintingViewController.h */,
-				AF7E20441728A53F00728423 /* PaintingViewController.mm */,
-				1B8CA30C0DC8E3A4002C657A /* PaintingView.h */,
-				1B8CA30D0DC8E3A4002C657A /* PaintingView.mm */,
-			);
-			name = Classes;
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
-		1D6058900D05DD3D006BFB54 /* GLPaint */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "GLPaint" */;
-			buildPhases = (
-				1D60588D0D05DD3D006BFB54 /* Resources */,
-				1D60588E0D05DD3D006BFB54 /* Sources */,
-				1D60588F0D05DD3D006BFB54 /* Frameworks */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = GLPaint;
-			productName = foo;
-			productReference = 1D6058910D05DD3D006BFB54 /* GLPaint.app */;
-			productType = "com.apple.product-type.application";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		29B97313FDCFA39411CA2CEA /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				LastUpgradeCheck = 0510;
-			};
-			buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "GLPaint" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 1;
-			knownRegions = (
-				en,
-			);
-			mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				1D6058900D05DD3D006BFB54 /* GLPaint */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		1D60588D0D05DD3D006BFB54 /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1BD0B6AB0DDCA9B800E538F8 /* Default.png in Resources */,
-				AFCEBA2111D96215001AA22A /* Icon-72.png in Resources */,
-				AFCEBA2211D96215001AA22A /* Icon-Small-50.png in Resources */,
-				AFCEBA2311D96215001AA22A /* Icon-Small.png in Resources */,
-				AFCEBA2411D96215001AA22A /* Icon-Small@2x.png in Resources */,
-				AFCEBA2511D96215001AA22A /* Icon.png in Resources */,
-				AFCEBA2611D96215001AA22A /* Icon@2x.png in Resources */,
-				AFCEBA2711D96215001AA22A /* iTunesArtwork in Resources */,
-				AF877F8617271F57002D08B8 /* Default-568h@2x.png in Resources */,
-				AF7E20421728A2C600728423 /* PaintingViewController.xib in Resources */,
-				AF7492AB1728A9E50013253B /* MainWindow.xib in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		1D60588E0D05DD3D006BFB54 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				1D60589B0D05DD56006BFB54 /* main.m in Sources */,
-				1B8CA3120DC8E3A4002C657A /* AppController.mm in Sources */,
-				1B8CA3130DC8E3A4002C657A /* PaintingView.mm in Sources */,
-				AF7E20451728A54000728423 /* PaintingViewController.mm in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXVariantGroup section */
-		AF7492A91728A9E50013253B /* MainWindow.xib */ = {
-			isa = PBXVariantGroup;
-			children = (
-				AF7492AA1728A9E50013253B /* en */,
-			);
-			name = MainWindow.xib;
-			sourceTree = "<group>";
-		};
-		AF7E203F1728A2C600728423 /* PaintingViewController.xib */ = {
-			isa = PBXVariantGroup;
-			children = (
-				AF7E20401728A2C600728423 /* en */,
-			);
-			name = PaintingViewController.xib;
-			sourceTree = "<group>";
-		};
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
-		1D6058940D05DD3E006BFB54 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				COPY_PHASE_STRIP = NO;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = (
-					"$(inherited)",
-					../../../vtkinstall/frameworks,
-				);
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = Prefix.pch;
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
-					"../../../vtkinstall/include/vtk-6.2",
-				);
-				INFOPLIST_FILE = "GLPaint-Info.plist";
-				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
-				LIBRARY_SEARCH_PATHS = "$(inherited)";
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = GLPaint;
-				TARGETED_DEVICE_FAMILY = 1;
-				VALID_ARCHS = "armv7 armv7s arm64";
-				WARNING_CFLAGS = "-Wall";
-			};
-			name = Debug;
-		};
-		1D6058950D05DD3E006BFB54 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = (
-					"$(inherited)",
-					../../../vtkinstall/frameworks,
-				);
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = Prefix.pch;
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
-					"../../../vtkinstall/include/vtk-6.2",
-				);
-				INFOPLIST_FILE = "GLPaint-Info.plist";
-				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
-				LIBRARY_SEARCH_PATHS = "$(inherited)";
-				ONLY_ACTIVE_ARCH = YES;
-				PRODUCT_NAME = GLPaint;
-				TARGETED_DEVICE_FAMILY = 1;
-				VALID_ARCHS = "armv7 armv7s arm64";
-				WARNING_CFLAGS = "-Wall";
-			};
-			name = Release;
-		};
-		C01FCF4F08A954540054247B /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_PARAMETER = NO;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
-				ONLY_ACTIVE_ARCH = YES;
-				SDKROOT = iphoneos;
-			};
-			name = Debug;
-		};
-		C01FCF5008A954540054247B /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
-				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
-				SDKROOT = iphoneos;
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "GLPaint" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1D6058940D05DD3E006BFB54 /* Debug */,
-				1D6058950D05DD3E006BFB54 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		C01FCF4E08A954540054247B /* Build configuration list for PBXProject "GLPaint" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				C01FCF4F08A954540054247B /* Debug */,
-				C01FCF5008A954540054247B /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
-}
diff --git a/Examples/iOS/GLPaint.old/Images/Icon-72.png b/Examples/iOS/GLPaint.old/Images/Icon-72.png
deleted file mode 100644
index 0d5a653ccfbcb65f140ba07ecf0122dff8940442..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Images/Icon-72.png and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/Images/Icon-Small-50.png b/Examples/iOS/GLPaint.old/Images/Icon-Small-50.png
deleted file mode 100644
index dbc20a572a26a5ec04dc6ed841aac44450d585cd..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Images/Icon-Small-50.png and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/Images/Icon-Small.png b/Examples/iOS/GLPaint.old/Images/Icon-Small.png
deleted file mode 100644
index 5a0701f6a092573837debec6f0106710aa6a0bfc..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Images/Icon-Small.png and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/Images/Icon-Small@2x.png b/Examples/iOS/GLPaint.old/Images/Icon-Small@2x.png
deleted file mode 100644
index 50c9b89e709fd5f10944a95f9cc63e8bfac7d4ea..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Images/Icon-Small@2x.png and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/Images/Icon.png b/Examples/iOS/GLPaint.old/Images/Icon.png
deleted file mode 100644
index 64af926972841c317f988b26867a2eddf5e6bcf4..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Images/Icon.png and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/Images/Icon@2x.png b/Examples/iOS/GLPaint.old/Images/Icon@2x.png
deleted file mode 100644
index 9b73557834e69cd569b3595237af0941dc005558..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Images/Icon@2x.png and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/Images/iTunesArtwork b/Examples/iOS/GLPaint.old/Images/iTunesArtwork
deleted file mode 100644
index 6ad7a1ff8faa07205f8da34a66f4098b8d86b93f..0000000000000000000000000000000000000000
Binary files a/Examples/iOS/GLPaint.old/Images/iTunesArtwork and /dev/null differ
diff --git a/Examples/iOS/GLPaint.old/Prefix.pch b/Examples/iOS/GLPaint.old/Prefix.pch
deleted file mode 100644
index bb57e5f880471a25861e6c4b86efa8942ab4d20e..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/Prefix.pch
+++ /dev/null
@@ -1,6 +0,0 @@
-#import <TargetConditionals.h>
-
-
-#ifdef __OBJC__
-	#import <UIKit/UIKit.h>
-#endif
diff --git a/Examples/iOS/GLPaint.old/main.m b/Examples/iOS/GLPaint.old/main.m
deleted file mode 100644
index a9322aa7d80155c01db6aee6ed4fb42ffab2697d..0000000000000000000000000000000000000000
--- a/Examples/iOS/GLPaint.old/main.m
+++ /dev/null
@@ -1,23 +0,0 @@
-/*=========================================================================
-
-Program:   Visualization Toolkit
-
-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.
-
-=========================================================================*/
-
-#import <UIKit/UIKit.h>
-
-int main(int argc, char *argv[])
-{
-  @autoreleasepool {
-      int retVal = UIApplicationMain(argc, argv, nil, nil);
-      return retVal;
-  }
-}
diff --git a/Examples/iOS/GLPaint/Classes/MyGLKViewController.mm b/Examples/iOS/GLPaint/Classes/MyGLKViewController.mm
index 72565d96236cb09834291e47e19d2b16224f2bb1..588230100508e139c1c637aef207f0c2a3eadc3d 100644
--- a/Examples/iOS/GLPaint/Classes/MyGLKViewController.mm
+++ b/Examples/iOS/GLPaint/Classes/MyGLKViewController.mm
@@ -213,12 +213,6 @@ PURPOSE.  See the above copyright notice for more information.
     return;
     }
 
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
   CGRect bounds = [self.view bounds];
 
   // set the position for all contacts
@@ -244,7 +238,7 @@ PURPOSE.  See the above copyright notice for more information.
     {
     int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
     interactor->SetPointerIndex(index);
-    interactor->InvokeEvent(vtkCommand::LeftButtonPressEvent,NULL);
+    interactor->LeftButtonPressEvent();
     NSLog(@"Starting left mouse");
     }
 
@@ -261,12 +255,6 @@ PURPOSE.  See the above copyright notice for more information.
     return;
     }
 
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
   CGRect        bounds = [self.view bounds];
 
   // set the position for all contacts
@@ -290,7 +278,7 @@ PURPOSE.  See the above copyright notice for more information.
 
   // fire move event on last index
   interactor->SetPointerIndex(index);
-  interactor->InvokeEvent(vtkCommand::MouseMoveEvent,NULL);
+  interactor->MouseMoveEvent();
   //  NSLog(@"Moved left mouse");
 
   // Display the buffer
@@ -306,12 +294,6 @@ PURPOSE.  See the above copyright notice for more information.
     return;
     }
 
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
   CGRect        bounds = [self.view bounds];
   // set the position for all contacts
   NSSet *myTouches = [event touchesForView:self.view];
@@ -336,7 +318,7 @@ PURPOSE.  See the above copyright notice for more information.
     {
     int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
     interactor->SetPointerIndex(index);
-    interactor->InvokeEvent(vtkCommand::LeftButtonReleaseEvent,NULL);
+    interactor->LeftButtonReleaseEvent();
     interactor->ClearContact((size_t)(__bridge void *)touch);
     NSLog(@"lifting left mouse");
     }
@@ -354,12 +336,6 @@ PURPOSE.  See the above copyright notice for more information.
     return;
     }
 
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
   CGRect        bounds = [self.view bounds];
   UITouch*            touch = [[event touchesForView:self.view] anyObject];
   // Convert touch point from UIView referential to OpenGL one (upside-down flip)
@@ -370,7 +346,7 @@ PURPOSE.  See the above copyright notice for more information.
                                   (int)round(location.y),
                                   0, 0,
                                   0, 0);
-  interactor->InvokeEvent(vtkCommand::LeftButtonReleaseEvent,NULL);
+  interactor->LeftButtonReleaseEvent();
   // NSLog(@"Ended left mouse");
 
   // Display the buffer
diff --git a/Examples/iOS/PlaneView/PlaneView.xcodeproj/project.pbxproj b/Examples/iOS/PlaneView/PlaneView.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000000000000000000000000000000000..6bd0eb3d1967645b28be17da67128dec08784140
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView.xcodeproj/project.pbxproj
@@ -0,0 +1,347 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		1312F93D1C65005D0064AA4C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1312F93C1C65005D0064AA4C /* main.m */; };
+		1312F9401C65005D0064AA4C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1312F93F1C65005D0064AA4C /* AppDelegate.m */; };
+		1312F9471C65005D0064AA4C /* VTKViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1312F9461C65005D0064AA4C /* VTKViewController.mm */; };
+		1312F94A1C65005D0064AA4C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1312F9481C65005D0064AA4C /* Main.storyboard */; };
+		1312F94C1C65005D0064AA4C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1312F94B1C65005D0064AA4C /* Assets.xcassets */; };
+		1312F94F1C65005D0064AA4C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1312F94D1C65005D0064AA4C /* LaunchScreen.storyboard */; };
+		1312F9571C6502270064AA4C /* vtk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1312F9561C6502270064AA4C /* vtk.framework */; };
+		1312F9591C6503EC0064AA4C /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1312F9581C6503EC0064AA4C /* GLKit.framework */; };
+		1312F95F1C650B050064AA4C /* SettingsTableViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1312F95E1C650B050064AA4C /* SettingsTableViewController.mm */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		1312F9381C65005D0064AA4C /* PlaneView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PlaneView.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		1312F93C1C65005D0064AA4C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		1312F93E1C65005D0064AA4C /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		1312F93F1C65005D0064AA4C /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		1312F9451C65005D0064AA4C /* VTKViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VTKViewController.h; sourceTree = "<group>"; };
+		1312F9461C65005D0064AA4C /* VTKViewController.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; path = VTKViewController.mm; sourceTree = "<group>"; };
+		1312F9491C65005D0064AA4C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		1312F94B1C65005D0064AA4C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		1312F94E1C65005D0064AA4C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		1312F9501C65005D0064AA4C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		1312F9561C6502270064AA4C /* vtk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = vtk.framework; path = ../../../../../../install/vtk.framework; sourceTree = "<group>"; };
+		1312F9581C6503EC0064AA4C /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; };
+		1312F95D1C650B050064AA4C /* SettingsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsTableViewController.h; sourceTree = "<group>"; };
+		1312F95E1C650B050064AA4C /* SettingsTableViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SettingsTableViewController.mm; sourceTree = "<group>"; };
+		1312F9631C68EADF0064AA4C /* PlaneView.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PlaneView.entitlements; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		1312F9351C65005D0064AA4C /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1312F9591C6503EC0064AA4C /* GLKit.framework in Frameworks */,
+				1312F9571C6502270064AA4C /* vtk.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		1312F92F1C65005D0064AA4C = {
+			isa = PBXGroup;
+			children = (
+				1312F9581C6503EC0064AA4C /* GLKit.framework */,
+				1312F9561C6502270064AA4C /* vtk.framework */,
+				1312F93A1C65005D0064AA4C /* PlaneView */,
+				1312F9391C65005D0064AA4C /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		1312F9391C65005D0064AA4C /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				1312F9381C65005D0064AA4C /* PlaneView.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		1312F93A1C65005D0064AA4C /* PlaneView */ = {
+			isa = PBXGroup;
+			children = (
+				1312F9631C68EADF0064AA4C /* PlaneView.entitlements */,
+				1312F93E1C65005D0064AA4C /* AppDelegate.h */,
+				1312F93F1C65005D0064AA4C /* AppDelegate.m */,
+				1312F9451C65005D0064AA4C /* VTKViewController.h */,
+				1312F9461C65005D0064AA4C /* VTKViewController.mm */,
+				1312F9481C65005D0064AA4C /* Main.storyboard */,
+				1312F94B1C65005D0064AA4C /* Assets.xcassets */,
+				1312F94D1C65005D0064AA4C /* LaunchScreen.storyboard */,
+				1312F9501C65005D0064AA4C /* Info.plist */,
+				1312F93B1C65005D0064AA4C /* Supporting Files */,
+				1312F95D1C650B050064AA4C /* SettingsTableViewController.h */,
+				1312F95E1C650B050064AA4C /* SettingsTableViewController.mm */,
+			);
+			path = PlaneView;
+			sourceTree = "<group>";
+		};
+		1312F93B1C65005D0064AA4C /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				1312F93C1C65005D0064AA4C /* main.m */,
+			);
+			name = "Supporting Files";
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		1312F9371C65005D0064AA4C /* PlaneView */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 1312F9531C65005D0064AA4C /* Build configuration list for PBXNativeTarget "PlaneView" */;
+			buildPhases = (
+				1312F9341C65005D0064AA4C /* Sources */,
+				1312F9351C65005D0064AA4C /* Frameworks */,
+				1312F9361C65005D0064AA4C /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = PlaneView;
+			productName = PlaneView;
+			productReference = 1312F9381C65005D0064AA4C /* PlaneView.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		1312F9301C65005D0064AA4C /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				KnownAssetTags = (
+					enableProbeSwitch,
+				);
+				LastUpgradeCheck = 0720;
+				ORGANIZATIONNAME = "Kitware Inc.";
+				TargetAttributes = {
+					1312F9371C65005D0064AA4C = {
+						CreatedOnToolsVersion = 7.2;
+						DevelopmentTeam = W38PE5Y733;
+						SystemCapabilities = {
+							com.apple.iCloud = {
+								enabled = 1;
+							};
+						};
+					};
+				};
+			};
+			buildConfigurationList = 1312F9331C65005D0064AA4C /* Build configuration list for PBXProject "PlaneView" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 1312F92F1C65005D0064AA4C;
+			productRefGroup = 1312F9391C65005D0064AA4C /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				1312F9371C65005D0064AA4C /* PlaneView */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		1312F9361C65005D0064AA4C /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1312F94A1C65005D0064AA4C /* Main.storyboard in Resources */,
+				1312F94C1C65005D0064AA4C /* Assets.xcassets in Resources */,
+				1312F94F1C65005D0064AA4C /* LaunchScreen.storyboard in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		1312F9341C65005D0064AA4C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1312F95F1C650B050064AA4C /* SettingsTableViewController.mm in Sources */,
+				1312F9401C65005D0064AA4C /* AppDelegate.m in Sources */,
+				1312F9471C65005D0064AA4C /* VTKViewController.mm in Sources */,
+				1312F93D1C65005D0064AA4C /* main.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		1312F9481C65005D0064AA4C /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				1312F9491C65005D0064AA4C /* Base */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		1312F94D1C65005D0064AA4C /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				1312F94E1C65005D0064AA4C /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		1312F9511C65005D0064AA4C /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_BITCODE = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.1;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		1312F9521C65005D0064AA4C /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_BITCODE = NO;
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.1;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		1312F9541C65005D0064AA4C /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_ENTITLEMENTS = PlaneView/PlaneView.entitlements;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				FRAMEWORK_SEARCH_PATHS = ../../../../../../install;
+				HEADER_SEARCH_PATHS = ../../../../../../install/vtk.framework/Headers;
+				INFOPLIST_FILE = PlaneView/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = kitware.com.PlaneView;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE = "";
+			};
+			name = Debug;
+		};
+		1312F9551C65005D0064AA4C /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_ENTITLEMENTS = PlaneView/PlaneView.entitlements;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				FRAMEWORK_SEARCH_PATHS = ../../../../../../install;
+				HEADER_SEARCH_PATHS = ../../../../../../install/vtk.framework/Headers;
+				INFOPLIST_FILE = PlaneView/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = kitware.com.PlaneView;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE = "";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		1312F9331C65005D0064AA4C /* Build configuration list for PBXProject "PlaneView" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1312F9511C65005D0064AA4C /* Debug */,
+				1312F9521C65005D0064AA4C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1312F9531C65005D0064AA4C /* Build configuration list for PBXNativeTarget "PlaneView" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1312F9541C65005D0064AA4C /* Debug */,
+				1312F9551C65005D0064AA4C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 1312F9301C65005D0064AA4C /* Project object */;
+}
diff --git a/Examples/iOS/PlaneView/PlaneView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/iOS/PlaneView/PlaneView.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000000000000000000000000000000000..4271799eea0cc2f6b32ab724f9ce7923421c05c3
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:PlaneView.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/Examples/iOS/PlaneView/PlaneView/AppDelegate.h b/Examples/iOS/PlaneView/PlaneView/AppDelegate.h
new file mode 100644
index 0000000000000000000000000000000000000000..2bd4fbabbb05ae1d5a0a09db1befde5a338f3b83
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/AppDelegate.h
@@ -0,0 +1,21 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+
+  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.
+
+=========================================================================*/
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+
+@end
diff --git a/Examples/iOS/GLPaint.old/Classes/AppDelegate.mm b/Examples/iOS/PlaneView/PlaneView/AppDelegate.m
similarity index 71%
rename from Examples/iOS/GLPaint.old/Classes/AppDelegate.mm
rename to Examples/iOS/PlaneView/PlaneView/AppDelegate.m
index c9942063ad41abcf0d604e4c36140e81176c49ed..908340ca42df79dd052938c46f1641f546ade44d 100644
--- a/Examples/iOS/GLPaint.old/Classes/AppDelegate.mm
+++ b/Examples/iOS/PlaneView/PlaneView/AppDelegate.m
@@ -1,49 +1,49 @@
 /*=========================================================================
 
-Program:   Visualization Toolkit
+  Program:   Visualization Toolkit
 
-Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
-All rights reserved.
-See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+  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.
+     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.
 
 =========================================================================*/
 #import "AppDelegate.h"
 
+@interface AppDelegate ()
+
+@end
+
 @implementation AppDelegate
 
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
-{
-  return YES;
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+    // Override point for customization after application launch.
+    return YES;
 }
 
-- (void)applicationWillResignActive:(UIApplication *)application
-{
+- (void)applicationWillResignActive:(UIApplication *)application {
     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
     // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
 }
 
-- (void)applicationDidEnterBackground:(UIApplication *)application
-{
+- (void)applicationDidEnterBackground:(UIApplication *)application {
     // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
     // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
 }
 
-- (void)applicationWillEnterForeground:(UIApplication *)application
-{
+- (void)applicationWillEnterForeground:(UIApplication *)application {
     // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
 }
 
-- (void)applicationDidBecomeActive:(UIApplication *)application
-{
+- (void)applicationDidBecomeActive:(UIApplication *)application {
     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
 }
 
-- (void)applicationWillTerminate:(UIApplication *)application
-{
+- (void)applicationWillTerminate:(UIApplication *)application {
     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
 }
 
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..207c307dba9edfe090136bf5e1c0e6863c9c015b
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,128 @@
+{
+  "images" : [
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "filename" : "Icon-40.png"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "filename" : "Icon-40@2x.png"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "filename" : "Icon-60@2x.png"
+    },
+    {
+      "size" : "72x72",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "filename" : "Icon-72.png"
+    },
+    {
+      "size" : "72x72",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "filename" : "Icon-72@2x.png"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "filename" : "Icon-76.png"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "filename" : "Icon-76@2x.png"
+    },
+    {
+      "size" : "50x50",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "filename" : "Icon-Small-50.png"
+    },
+    {
+      "size" : "50x50",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "filename" : "Icon-Small-50@2x.png"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "scale" : "1x",
+      "filename" : "Icon-Small.png"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "filename" : "Icon-Small@2x.png"
+    },
+    {
+      "size" : "57x57",
+      "idiom" : "iphone",
+      "scale" : "1x",
+      "filename" : "Icon.png"
+    },
+    {
+      "size" : "57x57",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "filename" : "Icon@2x.png"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "filename" : "Icon-Small@3x.png"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "filename" : "Icon-40@3x.png"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "filename" : "Icon-60@3x.png"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "filename" : "Icon-40@2x.png"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "filename" : "Icon-Small.png"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "filename" : "Icon-Small@2x.png"
+    },
+    {
+      "size" : "83.5x83.5",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "filename" : "Icon-83.5@2x.png"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40.png
new file mode 100644
index 0000000000000000000000000000000000000000..4218047603d1e0b3e57d959c5932d822a6a98f0d
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..82d3b20201d5f8c679721b6ac681d381d8cbc787
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..e339c52d0986ec8e5d559e47244a9c438e98f379
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..e339c52d0986ec8e5d559e47244a9c438e98f379
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..e53f959df2af8b4fbbc560c5b6c813e913a8f23d
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-72.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-72.png
new file mode 100644
index 0000000000000000000000000000000000000000..12150e992249235a4144dde7cc5b7002a9a5f08c
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-72.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..121195a1a9e02c7f512a7bc722620720f9976866
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-76.png
new file mode 100644
index 0000000000000000000000000000000000000000..a53be6eff2415919b6b53630d8c0b3604e9c3d9c
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-76.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cff011d515819f5801107e840527a93faeb07805
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4a68c348cdc5984725c7386e992a2f952fafafb
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small-50.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small-50.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ea8ffe8224a2a7b4e3b208e50956aedf3da3f80
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small-50.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..717771f49d919d51f5ed8bff8f010e3303b9cd14
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c77c75265f0a3e1ae2e05a782b8ddecdabfb0a5
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a87820e047ee2abfb8fbe018da3ce57ffa15a93
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..043c031da2d676bb1fdcef337ddfd5485199fcd6
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..01d6ade414d6049821a6d29e5bffaedc084e9389
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..00ac4b89c1fd6362836fb233e38977610590bf13
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/AppIcon.appiconset/Icon@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/Contents.json b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..da4a164c918651cdd1e11dca5cc62c333f097601
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/Contents.json b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..74a9f245824ad8d3aa2bf8144d1801bcf958dff8
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "iOSapplication.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "iOSapplication@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "iOSapplication@2x-1.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication.png
new file mode 100644
index 0000000000000000000000000000000000000000..0fd17430872c6d6fd1a0f295746ea11bba727a10
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication@2x-1.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication@2x-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..12334baeeb2c1a37cb191da02c2f2df650f33cf4
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication@2x-1.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication@2x.png b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..12334baeeb2c1a37cb191da02c2f2df650f33cf4
Binary files /dev/null and b/Examples/iOS/PlaneView/PlaneView/Assets.xcassets/iOSapplication.imageset/iOSapplication@2x.png differ
diff --git a/Examples/iOS/PlaneView/PlaneView/Base.lproj/LaunchScreen.storyboard b/Examples/iOS/PlaneView/PlaneView/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000000000000000000000000000000000000..80a18d4eb43ad3bbe0163f7761c4bd255751706b
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+        <capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
+        <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
+                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
+                    </layoutGuides>
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PlaneView" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="39m-Qt-eOT">
+                                <rect key="frame" x="198" y="41" width="204" height="71"/>
+                                <fontDescription key="fontDescription" name="Papyrus" family="Papyrus" pointSize="46"/>
+                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="iOSapplication" translatesAutoresizingMaskIntoConstraints="NO" id="cYs-9q-FCr">
+                                <rect key="frame" x="120" y="120" width="360" height="360"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" secondItem="cYs-9q-FCr" secondAttribute="height" multiplier="1:1" id="R1o-6y-PuP"/>
+                                </constraints>
+                            </imageView>
+                        </subviews>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                        <constraints>
+                            <constraint firstItem="cYs-9q-FCr" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="0cC-KR-vUX"/>
+                            <constraint firstAttribute="trailingMargin" secondItem="cYs-9q-FCr" secondAttribute="trailing" constant="100" id="3Z0-gp-f1P"/>
+                            <constraint firstItem="cYs-9q-FCr" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="4RA-Ub-PDM"/>
+                            <constraint firstItem="39m-Qt-eOT" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="enT-ej-9Uv"/>
+                            <constraint firstItem="cYs-9q-FCr" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leadingMargin" constant="100" id="ggN-QW-qq5"/>
+                            <constraint firstItem="cYs-9q-FCr" firstAttribute="top" secondItem="39m-Qt-eOT" secondAttribute="bottom" constant="8" symbolic="YES" id="xE7-us-WNf"/>
+                        </constraints>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+    <resources>
+        <image name="iOSapplication" width="3458" height="3971"/>
+    </resources>
+</document>
diff --git a/Examples/iOS/PlaneView/PlaneView/Base.lproj/Main.storyboard b/Examples/iOS/PlaneView/PlaneView/Base.lproj/Main.storyboard
new file mode 100644
index 0000000000000000000000000000000000000000..e2f3bc061f1f7a12194f5691d56b385dffda5a24
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/Base.lproj/Main.storyboard
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vkc-8S-upc">
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+        <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="tXr-a1-R10">
+            <objects>
+                <viewController id="BV1-FR-VrT" customClass="VTKViewController" sceneMemberID="viewController">
+                    <layoutGuides>
+                        <viewControllerLayoutGuide type="top" id="8aa-yV-Osq"/>
+                        <viewControllerLayoutGuide type="bottom" id="qHh-Mt-9TT"/>
+                    </layoutGuides>
+                    <view key="view" multipleTouchEnabled="YES" contentMode="scaleToFill" id="3se-qz-xqx" customClass="GLKView">
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                    </view>
+                    <navigationItem key="navigationItem" id="vrs-Hu-1Xi">
+                        <barButtonItem key="rightBarButtonItem" title="Settings" id="3cG-W1-u9i">
+                            <connections>
+                                <segue destination="jel-Re-f5l" kind="show" id="bfo-wn-v8m"/>
+                            </connections>
+                        </barButtonItem>
+                    </navigationItem>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="SZV-WD-TEh" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-525" y="-972"/>
+        </scene>
+        <!--Settings Table View Controller-->
+        <scene sceneID="NEo-n6-rFe">
+            <objects>
+                <tableViewController id="jel-Re-f5l" customClass="SettingsTableViewController" sceneMemberID="viewController">
+                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="yO2-2e-3s6">
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                        <sections>
+                            <tableViewSection id="lOd-Pq-M4J">
+                                <cells>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="0Lb-Ec-dW2">
+                                        <rect key="frame" x="0.0" y="64" width="600" height="44"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="0Lb-Ec-dW2" id="8ka-hy-LXI">
+                                            <rect key="frame" x="0.0" y="0.0" width="600" height="43"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" semanticContentAttribute="forceLeftToRight" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable Probe" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="faA-Np-Pm9">
+                                                    <rect key="frame" x="8" y="11" width="102" height="21"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" restorationIdentifier="enableProbeSwitch" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="mPp-gD-cID">
+                                                    <rect key="frame" x="543" y="6" width="51" height="31"/>
+                                                    <connections>
+                                                        <action selector="EnableProbeChanged:" destination="jel-Re-f5l" eventType="valueChanged" id="Eog-W7-qnt"/>
+                                                    </connections>
+                                                </switch>
+                                            </subviews>
+                                            <constraints>
+                                                <constraint firstItem="faA-Np-Pm9" firstAttribute="centerY" secondItem="8ka-hy-LXI" secondAttribute="centerY" id="E8q-68-cz1"/>
+                                                <constraint firstItem="mPp-gD-cID" firstAttribute="centerY" secondItem="8ka-hy-LXI" secondAttribute="centerY" id="NkA-Js-XyG"/>
+                                                <constraint firstItem="faA-Np-Pm9" firstAttribute="leading" secondItem="8ka-hy-LXI" secondAttribute="leadingMargin" id="QYM-68-vbP"/>
+                                                <constraint firstItem="mPp-gD-cID" firstAttribute="trailing" secondItem="8ka-hy-LXI" secondAttribute="trailingMargin" id="wQt-o5-Bqk"/>
+                                            </constraints>
+                                        </tableViewCellContentView>
+                                    </tableViewCell>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="UZu-iR-iWC">
+                                        <rect key="frame" x="0.0" y="108" width="600" height="44"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="UZu-iR-iWC" id="6vk-8s-2hT">
+                                            <rect key="frame" x="0.0" y="0.0" width="600" height="43"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Load Data" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Z46-JN-15v">
+                                                    <rect key="frame" x="8" y="11" width="206" height="21"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="2v7-wh-jRL">
+                                                    <rect key="frame" x="550" y="11" width="22" height="22"/>
+                                                </button>
+                                            </subviews>
+                                        </tableViewCellContentView>
+                                    </tableViewCell>
+                                </cells>
+                            </tableViewSection>
+                        </sections>
+                        <connections>
+                            <outlet property="dataSource" destination="jel-Re-f5l" id="rqJ-PX-X7u"/>
+                            <outlet property="delegate" destination="jel-Re-f5l" id="EZx-qm-mJw"/>
+                        </connections>
+                    </tableView>
+                    <toolbarItems/>
+                    <simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
+                    <connections>
+                        <outlet property="enableprobeSwitch" destination="mPp-gD-cID" id="Slb-pR-hY8"/>
+                    </connections>
+                </tableViewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="TpG-oy-bNi" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="182" y="-972"/>
+        </scene>
+        <!--Navigation Controller-->
+        <scene sceneID="9aq-PP-qjI">
+            <objects>
+                <navigationController automaticallyAdjustsScrollViewInsets="NO" id="vkc-8S-upc" sceneMemberID="viewController">
+                    <toolbarItems/>
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="gwe-nZ-TSF">
+                        <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </navigationBar>
+                    <nil name="viewControllers"/>
+                    <connections>
+                        <segue destination="BV1-FR-VrT" kind="relationship" relationship="rootViewController" id="xDb-Jh-6sI"/>
+                    </connections>
+                </navigationController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="ZMm-1u-XNy" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-1265" y="-972"/>
+        </scene>
+    </scenes>
+</document>
diff --git a/Examples/iOS/PlaneView/PlaneView/Info.plist b/Examples/iOS/PlaneView/PlaneView/Info.plist
new file mode 100644
index 0000000000000000000000000000000000000000..5bbccac2826ab81bbfefcab19e844ebf29ff3122
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/Info.plist
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDocumentTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeIconFiles</key>
+			<array/>
+			<key>CFBundleTypeName</key>
+			<string>VTK Unstructured Grid</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>com.kitware.vtu</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeIconFiles</key>
+			<array/>
+			<key>CFBundleTypeName</key>
+			<string>VTK Structured Grid</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>com.kitware.vts</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeIconFiles</key>
+			<array/>
+			<key>CFBundleTypeName</key>
+			<string>VTK Rectlinear Grid</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>com.kitware.vtr</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeIconFiles</key>
+			<array/>
+			<key>CFBundleTypeName</key>
+			<string>VTK Image Data</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>com.kitware.vti</string>
+			</array>
+		</dict>
+	</array>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UIFileSharingEnabled</key>
+	<true/>
+	<key>UILaunchStoryboardName</key>
+	<string>LaunchScreen</string>
+	<key>UIMainStoryboardFile</key>
+	<string>Main</string>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>opengles-3</string>
+		<string>armv7</string>
+	</array>
+	<key>UIStatusBarHidden</key>
+	<true/>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UTImportedTypeDeclarations</key>
+	<array>
+		<dict>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+			</array>
+			<key>UTTypeDescription</key>
+			<string>VTK XML Unstructured Grid</string>
+			<key>UTTypeIdentifier</key>
+			<string>com.kitware.vtu</string>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>com.apple.ostype</key>
+				<string>VTU</string>
+				<key>public.filename-extension</key>
+				<array>
+					<string>vtu</string>
+				</array>
+			</dict>
+		</dict>
+		<dict>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+			</array>
+			<key>UTTypeDescription</key>
+			<string>VTK XML Structured Grid</string>
+			<key>UTTypeIdentifier</key>
+			<string>com.kitware.vts</string>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>com.apple.ostype</key>
+				<string>VTS</string>
+				<key>public.filename-extension</key>
+				<array>
+					<string>vts</string>
+				</array>
+			</dict>
+		</dict>
+		<dict>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+			</array>
+			<key>UTTypeDescription</key>
+			<string>VTK XML Rectilinear Grid</string>
+			<key>UTTypeIdentifier</key>
+			<string>com.kitware.vtr</string>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>com.apple.ostype</key>
+				<string>VTS</string>
+				<key>public.filename-extension</key>
+				<array>
+					<string>vtr</string>
+				</array>
+			</dict>
+		</dict>
+		<dict>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+			</array>
+			<key>UTTypeDescription</key>
+			<string>VTK XML Image Data</string>
+			<key>UTTypeIdentifier</key>
+			<string>com.kitware.vts</string>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>com.apple.ostype</key>
+				<string>VTI</string>
+				<key>public.filename-extension</key>
+				<array>
+					<string>vti</string>
+				</array>
+			</dict>
+		</dict>
+	</array>
+</dict>
+</plist>
diff --git a/Examples/iOS/PlaneView/PlaneView/PlaneView.entitlements b/Examples/iOS/PlaneView/PlaneView/PlaneView.entitlements
new file mode 100644
index 0000000000000000000000000000000000000000..bb42bb6ead0bc27f609db1f7a89e5b2d454fc90b
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/PlaneView.entitlements
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.developer.icloud-container-identifiers</key>
+	<array>
+		<string>iCloud.$(CFBundleIdentifier)</string>
+	</array>
+	<key>com.apple.developer.icloud-services</key>
+	<array>
+		<string>CloudDocuments</string>
+	</array>
+	<key>com.apple.developer.ubiquity-container-identifiers</key>
+	<array>
+		<string>iCloud.$(CFBundleIdentifier)</string>
+	</array>
+</dict>
+</plist>
diff --git a/Examples/iOS/PlaneView/PlaneView/SettingsTableViewController.h b/Examples/iOS/PlaneView/PlaneView/SettingsTableViewController.h
new file mode 100644
index 0000000000000000000000000000000000000000..629bdb9d981b0d4aadbdb826d91f699818f5d2ec
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/SettingsTableViewController.h
@@ -0,0 +1,18 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+
+  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.
+
+=========================================================================*/
+#import <UIKit/UIKit.h>
+
+@interface SettingsTableViewController : UITableViewController <UIDocumentPickerDelegate,UIDocumentMenuDelegate>
+
+@end
diff --git a/Examples/iOS/PlaneView/PlaneView/SettingsTableViewController.mm b/Examples/iOS/PlaneView/PlaneView/SettingsTableViewController.mm
new file mode 100644
index 0000000000000000000000000000000000000000..ea38980822a8ebf1f7240e561692dd51431255a5
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/SettingsTableViewController.mm
@@ -0,0 +1,156 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+
+  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.
+
+=========================================================================*/
+#import "SettingsTableViewController.h"
+#import "VTKViewController.h"
+
+@interface SettingsTableViewController ()
+
+@property (weak, nonatomic) IBOutlet UISwitch *enableprobeSwitch;
+
+@end
+
+@implementation SettingsTableViewController
+
+- (IBAction)EnableProbeChanged:(id)sender
+{
+  // Inside another ViewController
+  VTKViewController *vtkVC = (VTKViewController *)
+      [self.navigationController.viewControllers firstObject];
+  [vtkVC setProbeEnabled:[sender isOn]];
+}
+
+- (void)viewDidLoad
+{
+  [super viewDidLoad];
+
+  VTKViewController *vtkVC = (VTKViewController *)
+      [self.navigationController.viewControllers firstObject];
+  [self.enableprobeSwitch setOn:[vtkVC getProbeEnabled]];
+
+  // Uncomment the following line to preserve selection between presentations.
+  // self.clearsSelectionOnViewWillAppear = NO;
+
+  // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
+  // self.navigationItem.rightBarButtonItem = self.editButtonItem;
+}
+
+- (void)didReceiveMemoryWarning
+{
+  [super didReceiveMemoryWarning];
+  // Dispose of any resources that can be recreated.
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+  [tableView deselectRowAtIndexPath:indexPath animated:NO];
+
+  if (indexPath.row == 1)
+    {
+    UIDocumentMenuViewController *documentPicker =
+      [[UIDocumentMenuViewController alloc]
+        initWithDocumentTypes:@[@"com.kitware.vtu",@"com.kitware.vts",@"com.kitware.vtr",@"com.kitware.vti"]
+        inMode:UIDocumentPickerModeImport];
+    documentPicker.delegate = self;
+    documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
+    [self presentViewController:documentPicker animated:YES completion:nil];
+    }
+}
+
+- (void)documentMenu:(UIDocumentMenuViewController *)documentMenu
+  didPickDocumentPicker:(UIDocumentPickerViewController *)documentPicker
+{
+  documentPicker.delegate = self;
+  documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
+  [self presentViewController:documentPicker animated:YES completion:nil];
+}
+
+- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url
+{
+  if (controller.documentPickerMode == UIDocumentPickerModeImport)
+    {
+    NSString *alertMessage = [NSString stringWithFormat:@"Successfully imported %@", [url lastPathComponent]];
+    dispatch_async(dispatch_get_main_queue(), ^{
+      UIAlertController *alertController = [UIAlertController
+      alertControllerWithTitle:@"Import"
+      message:alertMessage
+      preferredStyle:UIAlertControllerStyleAlert];
+      [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil]];
+      [self presentViewController:alertController animated:YES completion:nil];
+      });
+
+    // pass the data to the mapper
+    VTKViewController *vtkVC = (VTKViewController *)
+        [self.navigationController.viewControllers firstObject];
+    [vtkVC setNewDataFile:url];
+    }
+}
+
+
+#pragma mark - Table view data source
+
+/*
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath];
+
+    // Configure the cell...
+
+    return cell;
+}
+*/
+
+/*
+// Override to support conditional editing of the table view.
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
+    // Return NO if you do not want the specified item to be editable.
+    return YES;
+}
+*/
+
+/*
+// Override to support editing the table view.
+- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (editingStyle == UITableViewCellEditingStyleDelete) {
+        // Delete the row from the data source
+        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
+    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
+        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
+    }
+}
+*/
+
+/*
+// Override to support rearranging the table view.
+- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
+}
+*/
+
+/*
+// Override to support conditional rearranging of the table view.
+- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
+    // Return NO if you do not want the item to be re-orderable.
+    return YES;
+}
+*/
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end
diff --git a/Examples/iOS/PlaneView/PlaneView/VTKViewController.h b/Examples/iOS/PlaneView/PlaneView/VTKViewController.h
new file mode 100644
index 0000000000000000000000000000000000000000..059005d7b9d58c5bd0ff20d24e7b8abf790db189
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/VTKViewController.h
@@ -0,0 +1,48 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+
+  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.
+
+=========================================================================*/
+
+#import <UIKit/UIKit.h>
+#import <GLKit/GLKit.h>
+
+// Forward declarations
+class vtkIOSRenderWindow;
+class vtkRenderer;
+class vtkIOSRenderWindowInteractor;
+class vtkPlaneWidget;
+class vtkPolyDataMapper;
+class vtkProbeFilter;
+class vtkTPWCallback;
+
+@interface VTKViewController : GLKViewController
+{
+@private
+  vtkIOSRenderWindow *RenderWindow;
+  vtkPlaneWidget *PlaneWidget;
+  vtkRenderer *Renderer;
+  vtkProbeFilter *Probe;
+  vtkPolyDataMapper *OutlineMapper;
+  vtkPolyDataMapper *ProbeMapper;
+  vtkTPWCallback *PlaneCallback;
+}
+
+@property (nonatomic, strong) UIWindow *window;
+
+- (void)setProbeEnabled:(bool)val;
+- (bool)getProbeEnabled;
+
+- (void)setNewDataFile:(NSURL *)url;
+
+- (vtkIOSRenderWindowInteractor *)getInteractor;
+
+@end
diff --git a/Examples/iOS/PlaneView/PlaneView/VTKViewController.mm b/Examples/iOS/PlaneView/PlaneView/VTKViewController.mm
new file mode 100644
index 0000000000000000000000000000000000000000..b5f7e4cb9d770606a514890550eccd608f87e5a7
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/VTKViewController.mm
@@ -0,0 +1,486 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+
+  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.
+
+=========================================================================*/
+#import "VTKViewController.h"
+
+#import <vtk/vtkActor.h>
+#import <vtk/vtkCamera.h>
+#import <vtk/vtkCommand.h>
+#import <vtk/vtkCommand.h>
+#import <vtk/vtkDebugLeaks.h>
+#import <vtk/vtkIOSRenderWindow.h>
+#import <vtk/vtkIOSRenderWindow.h>
+#import <vtk/vtkIOSRenderWindowInteractor.h>
+#import <vtk/vtkIOSRenderWindowInteractor.h>
+#import <vtk/vtkImageData.h>
+#import <vtk/vtkInteractorStyleMultiTouchCamera.h>
+#import <vtk/vtkNew.h>
+#import <vtk/vtkOutlineFilter.h>
+#import <vtk/vtkPlaneWidget.h>
+#import <vtk/vtkPolyData.h>
+#import <vtk/vtkPolyDataMapper.h>
+#import <vtk/vtkProbeFilter.h>
+#import <vtk/vtkRTAnalyticSource.h>
+#import <vtk/vtkRenderer.h>
+#import <vtk/vtkRenderingOpenGL2ObjectFactory.h>
+#import <vtk/vtkStructuredGridOutlineFilter.h>
+#import <vtk/vtkUnstructuredGrid.h>
+#import <vtk/vtkXMLImageDataReader.h>
+#import <vtk/vtkXMLRectilinearGridReader.h>
+#import <vtk/vtkXMLStructuredGridReader.h>
+#import <vtk/vtkXMLUnstructuredGridReader.h>
+
+// This does the actual work: updates the probe.
+// Callback for the interaction
+class vtkTPWCallback : public vtkCommand
+{
+public:
+  static vtkTPWCallback *New()
+  { return new vtkTPWCallback; }
+  virtual void Execute(vtkObject *caller, unsigned long, void*)
+    {
+    vtkPlaneWidget *planeWidget = reinterpret_cast<vtkPlaneWidget*>(caller);
+    planeWidget->GetPolyData(this->PolyData);
+    this->Actor->VisibilityOn();
+    }
+  vtkTPWCallback():PolyData(0),Actor(0) {}
+  vtkPolyData *PolyData;
+  vtkActor *Actor;
+};
+
+
+@interface VTKViewController ()
+{
+}
+
+@property (strong, nonatomic) EAGLContext *context;
+
+- (void)tearDownGL;
+
+@end
+
+@implementation VTKViewController
+
+- (void)setProbeEnabled:(bool)val
+{
+  self->PlaneWidget->SetEnabled(val ? 1 : 0);
+}
+
+- (bool)getProbeEnabled
+{
+  return (self->PlaneWidget->GetEnabled() ? true : false);
+}
+
+//----------------------------------------------------------------------------
+- (vtkIOSRenderWindowInteractor *)getInteractor
+{
+  if (self->RenderWindow)
+    {
+    return (vtkIOSRenderWindowInteractor *)self->RenderWindow->GetInteractor();
+    }
+  else
+    {
+    return NULL;
+    }
+}
+
+- (void)setupPipeline
+{
+  vtkRenderingOpenGL2ObjectFactory *of = vtkRenderingOpenGL2ObjectFactory::New();
+  vtkObjectFactory::RegisterFactory(of);
+
+  self->RenderWindow = vtkIOSRenderWindow::New();
+  self->Renderer = vtkRenderer::New();
+  self->RenderWindow->AddRenderer(self->Renderer);
+
+  // this example uses VTK's built in interaction but you could choose
+  // to use your own instead.
+  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
+  iren->SetRenderWindow(self->RenderWindow);
+
+  vtkInteractorStyleMultiTouchCamera *ismt = vtkInteractorStyleMultiTouchCamera::New();
+  iren->SetInteractorStyle(ismt);
+  ismt->Delete();
+
+  vtkNew<vtkPolyData> plane;
+  vtkNew<vtkRTAnalyticSource> wavelet;
+  wavelet->Update();
+
+  self->Probe = vtkProbeFilter::New();
+  self->Probe->SetInputData(plane.Get());
+  self->Probe->SetSourceData(wavelet->GetOutput());
+
+  self->ProbeMapper = vtkPolyDataMapper::New();
+  self->ProbeMapper->SetInputConnection(self->Probe->GetOutputPort());
+  double tmp[2];
+  wavelet->GetOutput()->GetScalarRange(tmp);
+  self->ProbeMapper->SetScalarRange(tmp[0], tmp[1]);
+
+  vtkNew<vtkActor> probeActor;
+  probeActor->SetMapper(self->ProbeMapper);
+  probeActor->VisibilityOff();
+
+  // An outline is shown for context.
+  vtkNew<vtkOutlineFilter> outline;
+  outline->SetInputData(wavelet->GetOutput());
+
+  self->OutlineMapper = vtkPolyDataMapper::New();
+  self->OutlineMapper->SetInputConnection(outline->GetOutputPort());
+
+  vtkNew<vtkActor> outlineActor;
+  outlineActor->SetMapper(self->OutlineMapper);
+
+  // The SetInteractor method is how 3D widgets are associated with the render
+  // window interactor. Internally, SetInteractor sets up a bunch of callbacks
+  // using the Command/Observer mechanism (AddObserver()).
+  self->PlaneCallback = vtkTPWCallback::New();
+  self->PlaneCallback->PolyData = plane.Get();
+  self->PlaneCallback->Actor = probeActor.Get();
+
+  // The plane widget is used probe the dataset.
+  vtkNew<vtkPlaneWidget> planeWidget;
+  planeWidget->SetInteractor(iren);
+  planeWidget->SetDefaultRenderer(self->Renderer);
+  planeWidget->SetInputData(wavelet->GetOutput());
+  planeWidget->NormalToXAxisOn();
+  planeWidget->SetResolution(30);
+  planeWidget->SetHandleSize(0.07);
+  planeWidget->SetRepresentationToOutline();
+  planeWidget->PlaceWidget();
+  planeWidget->AddObserver(vtkCommand::InteractionEvent,self->PlaneCallback);
+  planeWidget->On();
+  self->PlaneWidget = planeWidget.Get();
+  self->PlaneCallback->Execute(self->PlaneWidget,0,NULL);
+  planeWidget->Register(0);
+
+  self->Renderer->AddActor(outlineActor.Get());
+  self->Renderer->AddActor(probeActor.Get());
+  self->Renderer->SetBackground(0.3,0.5,0.4);
+}
+
+- (void)setNewDataFile:(NSURL *)url
+{
+  vtkXMLDataReader *reader = NULL;
+  vtkPolyDataAlgorithm *outline = NULL;
+
+  // setup the reader and outline filter based
+  // on data type
+  if ([url.pathExtension isEqual:@"vtu"])
+    {
+    reader = vtkXMLUnstructuredGridReader::New();
+    outline = vtkOutlineFilter::New();
+    }
+  if ([url.pathExtension isEqual:@"vts"])
+    {
+    reader = vtkXMLStructuredGridReader::New();
+    outline = vtkStructuredGridOutlineFilter::New();
+    }
+  if ([url.pathExtension isEqual:@"vtr"])
+    {
+    reader = vtkXMLRectilinearGridReader::New();
+    outline = vtkOutlineFilter::New();
+    }
+  if ([url.pathExtension isEqual:@"vti"])
+    {
+    reader = vtkXMLImageDataReader::New();
+    outline = vtkOutlineFilter::New();
+    }
+
+  if (!reader || !outline)
+    {
+    return;
+    }
+
+  reader->SetFileName([url.path cStringUsingEncoding:NSASCIIStringEncoding]);
+  reader->Update();
+  self->Probe->SetSourceData(reader->GetOutputDataObject(0));
+  double tmp[2];
+    vtkDataSet *ds = vtkDataSet::SafeDownCast(reader->GetOutputDataObject(0));
+    ds->GetScalarRange(tmp);
+  self->ProbeMapper->SetScalarRange(tmp[0], tmp[1]);
+  outline->SetInputData(ds);
+  self->OutlineMapper->SetInputConnection(outline->GetOutputPort(0));
+  self->PlaneWidget->SetInputData(ds);
+  self->PlaneWidget->PlaceWidget(ds->GetBounds());
+
+  self->PlaneCallback->Execute(self->PlaneWidget,0,NULL);
+
+  self->Renderer->ResetCamera();
+  self->RenderWindow->Render();
+  self->PlaneWidget->PlaceWidget(ds->GetBounds());
+  self->RenderWindow->Render();
+  reader->Delete();
+  outline->Delete();
+}
+
+- (void)viewDidLoad
+{
+  [super viewDidLoad];
+
+  self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
+
+  if (!self.context)
+    {
+    NSLog(@"Failed to create ES context");
+    return;
+    }
+
+  UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
+     initWithTarget:self action:@selector(handleTap:)];
+  tapRecognizer.numberOfTapsRequired = 2;
+  [self.view addGestureRecognizer:tapRecognizer];
+
+
+  GLKView *view = (GLKView *)self.view;
+  view.context = self.context;
+  view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
+  //view.drawableMultisample = GLKViewDrawableMultisample4X;
+
+  // setup the vis pipeline
+  [self setupPipeline];
+
+  [EAGLContext setCurrentContext:self.context];
+  [self resizeView];
+  self->RenderWindow->Render();
+}
+
+- (void)dealloc
+{
+  [self tearDownGL];
+
+  if ([EAGLContext currentContext] == self.context)
+    {
+    [EAGLContext setCurrentContext:nil];
+    }
+}
+
+- (void)didReceiveMemoryWarning
+{
+  [super didReceiveMemoryWarning];
+
+  if ([self isViewLoaded] && ([[self view] window] == nil))
+    {
+    self.view = nil;
+
+    [self tearDownGL];
+
+    if ([EAGLContext currentContext] == self.context)
+      {
+      [EAGLContext setCurrentContext:nil];
+      }
+    self.context = nil;
+    }
+    // Dispose of any resources that can be recreated.
+}
+
+- (void)tearDownGL
+{
+  [EAGLContext setCurrentContext:self.context];
+
+    // free GL resources
+    // ...
+}
+
+-(void) resizeView
+{
+  double scale = self.view.contentScaleFactor;
+  self->RenderWindow->SetSize(self.view.bounds.size.width*scale, self.view.bounds.size.height*scale);
+}
+
+- (void)viewWillLayoutSubviews
+{
+  [self resizeView];
+}
+
+- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
+{
+  self->RenderWindow->Render();
+}
+
+//=================================================================
+// this example uses VTK's built in interaction but you could choose
+// to use your own instead. The remaining methods forward touch events
+// to VTKs interactor.
+
+// Handles the start of a touch
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
+{
+  vtkIOSRenderWindowInteractor *interactor = [self getInteractor];
+  if (!interactor)
+    {
+    return;
+    }
+
+  CGRect bounds = [self.view bounds];
+  double scale = self.view.contentScaleFactor;
+
+  // set the position for all contacts
+  NSSet *myTouches = [event touchesForView:self.view];
+  for (UITouch *touch in myTouches)
+    {
+    // Convert touch point from UIView referential to OpenGL one (upside-down flip)
+    CGPoint location = [touch locationInView:self.view];
+    location.y = bounds.size.height - location.y;
+
+    int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
+    if (index < VTKI_MAX_POINTERS)
+      {
+      interactor->SetEventInformation((int)round(location.x*scale),
+                                  (int)round(location.y*scale),
+                                  0, 0,
+                                  0, 0, 0, index);
+      }
+    }
+
+  // handle begin events
+  for (UITouch *touch in touches)
+    {
+    int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
+    interactor->SetPointerIndex(index);
+    interactor->LeftButtonPressEvent();
+    NSLog(@"Starting left mouse %i",index);
+    }
+
+  // Display the buffer
+  [(GLKView *)self.view display];
+}
+
+// Handles the continuation of a touch.
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
+{
+  vtkIOSRenderWindowInteractor *interactor = [self getInteractor];
+  if (!interactor)
+    {
+    return;
+    }
+
+  CGRect        bounds = [self.view bounds];
+  double scale = self.view.contentScaleFactor;
+
+  // set the position for all contacts
+  int index = -1;
+  NSSet *myTouches = [event touchesForView:self.view];
+  for (UITouch *touch in myTouches)
+    {
+    // Convert touch point from UIView referential to OpenGL one (upside-down flip)
+    CGPoint location = [touch locationInView:self.view];
+    location.y = bounds.size.height - location.y;
+
+    index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
+    if (index < VTKI_MAX_POINTERS)
+      {
+      interactor->SetEventInformation((int)round(location.x*scale),
+                                  (int)round(location.y*scale),
+                                  0, 0,
+                                  0, 0, 0, index);
+      }
+    }
+
+  // fire move event on last index
+  if (index > -1)
+    {
+    interactor->SetPointerIndex(index);
+    interactor->MouseMoveEvent();
+    }
+
+  // Display the buffer
+  [(GLKView *)self.view display];
+}
+
+// Handles the end of a touch event when the touch is a tap.
+- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
+{
+  vtkIOSRenderWindowInteractor *interactor = [self getInteractor];
+  if (!interactor)
+    {
+    return;
+    }
+
+  CGRect        bounds = [self.view bounds];
+  double scale = self.view.contentScaleFactor;
+
+  // set the position for all contacts
+  NSSet *myTouches = [event touchesForView:self.view];
+  for (UITouch *touch in myTouches)
+    {
+    // Convert touch point from UIView referential to OpenGL one (upside-down flip)
+    CGPoint location = [touch locationInView:self.view];
+    location.y = bounds.size.height - location.y;
+
+    int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
+    if (index < VTKI_MAX_POINTERS)
+      {
+      interactor->SetEventInformation((int)round(location.x*scale),
+                                  (int)round(location.y*scale),
+                                  0, 0,
+                                  0, 0, 0, index);
+      }
+    }
+
+  // handle begin events
+  for (UITouch *touch in touches)
+    {
+    int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
+    interactor->SetPointerIndex(index);
+    interactor->LeftButtonReleaseEvent();
+    interactor->ClearContact((size_t)(__bridge void *)touch);
+    NSLog(@"lifting left mouse");
+    }
+
+  // Display the buffer
+  [(GLKView *)self.view display];
+}
+
+// Handles the end of a touch event.
+- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
+{
+  vtkIOSRenderWindowInteractor *interactor = [self getInteractor];
+  if (!interactor)
+    {
+    return;
+    }
+
+  CGRect        bounds = [self.view bounds];
+  double scale = self.view.contentScaleFactor;
+
+  for (UITouch *touch in touches)
+    {
+    int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
+    interactor->SetPointerIndex(index);
+    // Convert touch point from UIView referential to OpenGL one (upside-down flip)
+    CGPoint location = [touch locationInView:self.view];
+    location.y = bounds.size.height - location.y;
+    interactor->SetEventInformation((int)round(location.x*scale),
+                                    (int)round(location.y*scale),
+                                    0, 0,
+                                    0, 0);
+    interactor->LeftButtonReleaseEvent();
+    interactor->ClearContact((size_t)(__bridge void *)touch);
+    }
+}
+
+- (void)handleTap:(UITapGestureRecognizer *)sender
+{
+  if (sender.state == UIGestureRecognizerStateEnded)
+    {
+    vtkIOSRenderWindowInteractor *interactor = [self getInteractor];
+    if (!interactor)
+      {
+      return;
+      }
+    self->Renderer->ResetCamera();
+    self->RenderWindow->Render();
+    }
+}
+
+@end
diff --git a/Examples/iOS/PlaneView/PlaneView/main.m b/Examples/iOS/PlaneView/PlaneView/main.m
new file mode 100644
index 0000000000000000000000000000000000000000..2239888b4b70c736ed0fb2793a714ea6283c956e
--- /dev/null
+++ b/Examples/iOS/PlaneView/PlaneView/main.m
@@ -0,0 +1,16 @@
+//
+//  main.m
+//  PlaneView
+//
+//  Created by Ken Martin on 2/5/16.
+//  Copyright © 2016 Kitware Inc. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+    @autoreleasepool {
+        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+    }
+}
diff --git a/Examples/iOS/VolumeRender/Classes/MyGLKViewController.mm b/Examples/iOS/VolumeRender/Classes/MyGLKViewController.mm
index 07eee17cc77fc6de5c4d368310bcf88cf378a045..a3f90a3ccfe74b05f44f80d62889dd1ff4e78065 100644
--- a/Examples/iOS/VolumeRender/Classes/MyGLKViewController.mm
+++ b/Examples/iOS/VolumeRender/Classes/MyGLKViewController.mm
@@ -289,12 +289,6 @@ PURPOSE.  See the above copyright notice for more information.
     return;
     }
 
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
   CGRect bounds = [self.view bounds];
   double scale = self.view.contentScaleFactor;
 
@@ -326,7 +320,7 @@ PURPOSE.  See the above copyright notice for more information.
     int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
         vtkGenericWarningMacro("down touch  " << (size_t)(__bridge void *)touch << " index " << index);
     interactor->SetPointerIndex(index);
-    interactor->InvokeEvent(vtkCommand::LeftButtonPressEvent,NULL);
+    interactor->LeftButtonPressEvent();
     //NSLog(@"Starting left mouse");
     }
 
@@ -343,12 +337,6 @@ PURPOSE.  See the above copyright notice for more information.
     return;
     }
 
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
   CGRect bounds = [self.view bounds];
   double scale = self.view.contentScaleFactor;
 
@@ -377,7 +365,7 @@ PURPOSE.  See the above copyright notice for more information.
 
   // fire move event on last index
   interactor->SetPointerIndex(index);
-  interactor->InvokeEvent(vtkCommand::MouseMoveEvent,NULL);
+  interactor->MouseMoveEvent();
 NSLog(@"Moved left mouse");
 
   // Display the buffer
@@ -393,12 +381,6 @@ NSLog(@"Moved left mouse");
     return;
     }
 
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
   CGRect bounds = [self.view bounds];
   double scale = self.view.contentScaleFactor;
 
@@ -430,7 +412,7 @@ NSLog(@"Moved left mouse");
     int index = interactor->GetPointerIndexForContact((size_t)(__bridge void *)touch);
         vtkGenericWarningMacro("up touch  " << (size_t)(__bridge void *)touch << " index " << index);
     interactor->SetPointerIndex(index);
-    interactor->InvokeEvent(vtkCommand::LeftButtonReleaseEvent,NULL);
+    interactor->LeftButtonReleaseEvent();
     interactor->ClearContact((size_t)(__bridge void *)touch);
      // NSLog(@"lifting left mouse");
     }
@@ -448,12 +430,6 @@ NSLog(@"Moved left mouse");
     return;
     }
 
-  vtkIOSRenderWindow *renWin = [self getVTKRenderWindow];
-  if (!renWin)
-    {
-    return;
-    }
-
   CGRect bounds = [self.view bounds];
   double scale = self.view.contentScaleFactor;
 
@@ -470,7 +446,7 @@ NSLog(@"Moved left mouse");
                                   (int)round(location.y),
                                   0, 0,
                                   0, 0);
-  interactor->InvokeEvent(vtkCommand::LeftButtonReleaseEvent, NULL);
+  interactor->LeftButtonReleaseEvent();
   // NSLog(@"Ended left mouse");
 
   // Display the buffer
diff --git a/Examples/iOS/readme.txt b/Examples/iOS/readme.txt
index 753e7d53e068278636f787145c3b7eedc950b3c9..72ad9976b3db4e1fe58f73e119a7abd7c03e92dd 100644
--- a/Examples/iOS/readme.txt
+++ b/Examples/iOS/readme.txt
@@ -27,7 +27,11 @@ directory in vtkios ala cd vtkios; mkdir install
 Once the framework is built it will automatically be installed. Now you can
 try building an iOS application that uses the framework.
 
-* Start up XCode and load an example Xcode project from Examples/iOS. You will
+* Start up XCode and load an example Xcode project from Examples/iOS. They will
+* be located in
+
+<yourBinDir>/CMakeExternals/Build/vtk-ios-device-armv7/Examples/iOS
+
 * likely need to update a couple setting in the project to find the vtk fraework
 * and its header files. You may also get unresolved link errors related to the
 * c++ standard libaries. I have had to change the stdlib settings in XCode away
@@ -47,6 +51,6 @@ bit twitchy sometimes.
 The GLPaint example is a modified version of Apple's GLPaint example. So credit
 to them for the original example file and framework.
 
-The VolumeRender example requires OpenGL ES3 so it will only work on
-devices that support ES3, which I believe includes iphone 5s or later and
+The VolumeRender and PlaneView examples require OpenGL ES3 so it will only
+work on devices that support ES3, which includes iphone 5s or later and
 ipad Air or later
\ No newline at end of file
diff --git a/Interaction/Style/vtkInteractorStyleMultiTouchCamera.cxx b/Interaction/Style/vtkInteractorStyleMultiTouchCamera.cxx
index 2a63fd976cf94ce2a1258e0579c2e78641c66e48..db93c1ba142b3f6373b00a74243da1ebc3a3660b 100644
--- a/Interaction/Style/vtkInteractorStyleMultiTouchCamera.cxx
+++ b/Interaction/Style/vtkInteractorStyleMultiTouchCamera.cxx
@@ -27,12 +27,6 @@ vtkStandardNewMacro(vtkInteractorStyleMultiTouchCamera);
 //----------------------------------------------------------------------------
 vtkInteractorStyleMultiTouchCamera::vtkInteractorStyleMultiTouchCamera()
 {
-  this->MotionFactor   = 10.0;
-  this->PointersDownCount = 0;
-  for (int i = 0; i < VTKI_MAX_POINTERS; ++i)
-    {
-    this->PointersDown[i] = 0;
-    }
 }
 
 //----------------------------------------------------------------------------
@@ -41,215 +35,79 @@ vtkInteractorStyleMultiTouchCamera::~vtkInteractorStyleMultiTouchCamera()
 }
 
 //----------------------------------------------------------------------------
-void vtkInteractorStyleMultiTouchCamera::OnMouseMove()
+void vtkInteractorStyleMultiTouchCamera::OnRotate()
 {
   int pointer = this->Interactor->GetPointerIndex();
 
   this->FindPokedRenderer(this->Interactor->GetEventPositions(pointer)[0],
                           this->Interactor->GetEventPositions(pointer)[1]);
-  if (this->State == VTKIS_TWO_POINTER)
-    {
-    this->AdjustCamera();
-    this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
-    }
-  else
-    {
-    this->Superclass::OnMouseMove();
-    }
-}
-
-//----------------------------------------------------------------------------
-void vtkInteractorStyleMultiTouchCamera::OnLeftButtonDown()
-{
-  int pointer = this->Interactor->GetPointerIndex();
-
-  vtkDebugMacro("pointer index down for " << pointer);
-
-  // if it is already down ignore this event
-  if (this->PointersDown[pointer])
-    {
-    return;
-    }
-
-  this->FindPokedRenderer(this->Interactor->GetEventPositions(pointer)[0],
-                          this->Interactor->GetEventPositions(pointer)[1]);
-  if (this->CurrentRenderer == NULL)
-    {
-    return;
-    }
 
-  this->PointersDown[pointer] = 1;
-  this->PointersDownCount++;
-
-  // do the standard single pointer event handling
-  if (this->PointersDownCount == 1)
+  if ( this->CurrentRenderer == NULL )
     {
-    this->Superclass::OnLeftButtonDown();
     return;
     }
 
-  // if going from 1 to 2 pointers stop the one pointer action
-  if (this->PointersDownCount == 2)
-    {
-    this->LastState = this->State;
-    switch (this->State)
-      {
-      case VTKIS_DOLLY:
-        this->EndDolly();
-        break;
-
-      case VTKIS_PAN:
-        this->EndPan();
-        break;
-
-      case VTKIS_SPIN:
-        this->EndSpin();
-        break;
-
-      case VTKIS_ROTATE:
-        this->EndRotate();
-        break;
-      }
-    // start the multipointer action
-    this->StartTwoPointer();
-    return;
-    }
+  vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
+  camera->Roll( this->Interactor->GetRotation() - this->Interactor->GetLastRotation() );
 
-  // if going from 2 to 3 pointers stop the two pointer action
-  if (this->PointersDownCount == 3 && this->State == VTKIS_TWO_POINTER)
-    {
-    this->EndTwoPointer();
-    }
+  camera->OrthogonalizeViewUp();
 
+  this->Interactor->Render();
 }
 
+
 //----------------------------------------------------------------------------
-void vtkInteractorStyleMultiTouchCamera::OnLeftButtonUp()
+void vtkInteractorStyleMultiTouchCamera::OnPinch()
 {
   int pointer = this->Interactor->GetPointerIndex();
 
-  vtkDebugMacro("pointer index up for " << pointer);
+  this->FindPokedRenderer(this->Interactor->GetEventPositions(pointer)[0],
+                          this->Interactor->GetEventPositions(pointer)[1]);
 
-  // if it is already up, ignore this event
-  if (!this->PointersDown[pointer])
+  if ( this->CurrentRenderer == NULL )
     {
     return;
     }
 
-  this->PointersDownCount--;
-  this->PointersDown[pointer] = 0;
+  vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
 
-  // if we were just one pointer then do the usual handling
-  if (this->PointersDownCount == 0)
+  double dyf = this->Interactor->GetScale()/this->Interactor->GetLastScale();
+  if (camera->GetParallelProjection())
     {
-    this->Superclass::OnLeftButtonUp();
-    return;
+    camera->SetParallelScale(camera->GetParallelScale() / dyf);
     }
-
-  switch (this->State)
+  else
     {
-    case VTKIS_TWO_POINTER:
-      this->EndTwoPointer();
-      for (int i = 0; i < VTKI_MAX_POINTERS; ++i)
-        {
-        if (this->PointersDown[i] != 0)
-        this->Interactor->SetPointerIndex(i);
-        switch (this->LastState)
-          {
-          case VTKIS_DOLLY:
-            this->StartDolly();
-            break;
-
-          case VTKIS_PAN:
-            this->StartPan();
-            break;
-
-          case VTKIS_SPIN:
-            this->StartSpin();
-            break;
-
-          case VTKIS_ROTATE:
-            this->StartRotate();
-            break;
-          }
-        }
-      break;
+    camera->Dolly(dyf);
+    if (this->AutoAdjustCameraClippingRange)
+      {
+      this->CurrentRenderer->ResetCameraClippingRange();
+      }
     }
 
-  if ( this->Interactor )
+  if (this->Interactor->GetLightFollowCamera())
     {
-    this->ReleaseFocus();
+    this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
     }
+  this->Interactor->Render();
 }
 
-double distance2D(int *a, int *b)
-{
-  return sqrt((double)(a[0] - b[0])*(a[0] - b[0]) + (double)(a[1]-b[1])*(a[1]-b[1]));
-}
 
 //----------------------------------------------------------------------------
-void vtkInteractorStyleMultiTouchCamera::AdjustCamera()
+void vtkInteractorStyleMultiTouchCamera::OnPan()
 {
-  if ( this->CurrentRenderer == NULL )
-    {
-    return;
-    }
-
-  vtkRenderWindowInteractor *rwi = this->Interactor;
-
-  // OK we have two pointers, that means 4 constraints
-  // P1.x P1.y P2.x P2.y
-  //
-  // We use those 4 contraints to control:
-  // Zoom (variant is the distance between points - 1 DOF)
-  // Roll (variant is the angle formed by the line connecting the points - 1 DOF)
-  // Position (variant is the X,Y position of the midpoint of the line - 2 DOF)
-  //
-
+  int pointer = this->Interactor->GetPointerIndex();
 
-  // find the moving and non moving points
-  int eventPI = rwi->GetPointerIndex();
-  int otherPI = 0;
+  this->FindPokedRenderer(this->Interactor->GetEventPositions(pointer)[0],
+                          this->Interactor->GetEventPositions(pointer)[1]);
 
-  for (int i = 0; i < VTKI_MAX_POINTERS; ++i)
+  if ( this->CurrentRenderer == NULL )
     {
-    if (this->PointersDown[i] > 0 && i != eventPI)
-      {
-      otherPI = i;
-      break;
-      }
+    return;
     }
 
-  // compute roll - 1 DOF
-  double oldAngle =
-    vtkMath::DegreesFromRadians( atan2( (double)rwi->GetLastEventPositions(eventPI)[1] - rwi->GetLastEventPositions(otherPI)[1],
-                                        (double)rwi->GetLastEventPositions(eventPI)[0] - rwi->GetLastEventPositions(otherPI)[0] ) );
-
-  double newAngle =
-    vtkMath::DegreesFromRadians( atan2( (double)rwi->GetEventPositions(eventPI)[1] - rwi->GetEventPositions(otherPI)[1],
-                                        (double)rwi->GetEventPositions(eventPI)[0] - rwi->GetEventPositions(otherPI)[0] ) );
-
-
   vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
-  camera->Roll( newAngle - oldAngle );
-
-  // compute dolly/scale - 1 DOF
-  double oldDist = distance2D(rwi->GetLastEventPositions(otherPI), rwi->GetLastEventPositions(eventPI));
-  double newDist = distance2D(rwi->GetEventPositions(otherPI), rwi->GetEventPositions(eventPI));
-
-  double dyf = newDist/oldDist;
-  if (camera->GetParallelProjection())
-    {
-    camera->SetParallelScale(camera->GetParallelScale() / dyf);
-    }
-  else
-    {
-    camera->Dolly(dyf);
-    if (this->AutoAdjustCameraClippingRange)
-      {
-      this->CurrentRenderer->ResetCameraClippingRange();
-      }
-    }
+  vtkRenderWindowInteractor *rwi = this->Interactor;
 
   // handle panning - 2 DOF
   double viewFocus[4], focalDepth, viewPoint[3];
@@ -261,15 +119,17 @@ void vtkInteractorStyleMultiTouchCamera::AdjustCamera()
                               viewFocus);
   focalDepth = viewFocus[2];
 
-  this->ComputeDisplayToWorld((rwi->GetEventPositions(eventPI)[0] + rwi->GetEventPositions(otherPI)[0])/2.0,
-                              (rwi->GetEventPositions(eventPI)[1] + rwi->GetEventPositions(otherPI)[1])/2.0,
+  double *trans = this->Interactor->GetTranslation();
+  double *lastTrans = this->Interactor->GetLastTranslation();
+  this->ComputeDisplayToWorld(viewFocus[0] + trans[0] - lastTrans[0],
+                              viewFocus[1] + trans[1] - lastTrans[1],
                               focalDepth,
                               newPickPoint);
 
   // Has to recalc old mouse point since the viewport has moved,
   // so can't move it outside the loop
-  this->ComputeDisplayToWorld((rwi->GetLastEventPositions(eventPI)[0] + rwi->GetLastEventPositions(otherPI)[0])/2.0,
-                              (rwi->GetLastEventPositions(eventPI)[1] + rwi->GetLastEventPositions(otherPI)[1])/2.0,
+  this->ComputeDisplayToWorld(viewFocus[0],
+                              viewFocus[1],
                               focalDepth,
                               oldPickPoint);
 
@@ -302,5 +162,4 @@ void vtkInteractorStyleMultiTouchCamera::AdjustCamera()
 void vtkInteractorStyleMultiTouchCamera::PrintSelf(ostream& os, vtkIndent indent)
 {
   this->Superclass::PrintSelf(os,indent);
-  os << indent << "MotionFactor: " << this->MotionFactor << "\n";
 }
diff --git a/Interaction/Style/vtkInteractorStyleMultiTouchCamera.h b/Interaction/Style/vtkInteractorStyleMultiTouchCamera.h
index fec3be7cbfa55f65eeae3a4be8dc2ca5239c30b6..bde90c04081b318d4d5f956250bffc7eb9c5a0f6 100644
--- a/Interaction/Style/vtkInteractorStyleMultiTouchCamera.h
+++ b/Interaction/Style/vtkInteractorStyleMultiTouchCamera.h
@@ -12,14 +12,11 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkInteractorStyleMultiTouchCamera - interactive manipulation of the camera
+// .NAME vtkInteractorStyleMultiTouchCamera - multitouch manipulation of the camera
 // .SECTION Description
 // vtkInteractorStyleMultiTouchCamera allows the user to interactively
-// manipulate (rotate, pan, etc.) the camera, the viewpoint of the scene.  In
-// trackball interaction, the magnitude of the mouse motion is proportional
-// to the camera motion associated with a particular mouse binding. For
-// example, small left-button motions cause small changes in the rotation of
-// the camera around its focal point.
+// manipulate (rotate, pan, etc.) the camera, the viewpoint of the scene
+// using multitouch gestures in addition to regular gestures
 
 // .SECTION See Also
 // vtkInteractorStyleTrackballActor vtkInteractorStyleJoystickCamera
@@ -40,33 +37,15 @@ public:
   void PrintSelf(ostream& os, vtkIndent indent);
 
   // Description:
-  // Event bindings controlling the effects of pressing mouse buttons
-  // or moving the mouse.
-  virtual void OnMouseMove();
-  virtual void OnLeftButtonDown();
-  virtual void OnLeftButtonUp();
-
-  // These methods for the different interactions in different modes
-  // are overridden in subclasses to perform the correct motion. Since
-  // they are called by OnTimer, they do not have mouse coord parameters
-  // (use interactor's GetEventPosition and GetLastEventPosition)
-  virtual void AdjustCamera();
-
-  // Description:
-  // Set the apparent sensitivity of the interactor style to mouse motion.
-  vtkSetMacro(MotionFactor,double);
-  vtkGetMacro(MotionFactor,double);
+  // Event bindings for gestures
+  virtual void OnRotate();
+  virtual void OnPinch();
+  virtual void OnPan();
 
 protected:
   vtkInteractorStyleMultiTouchCamera();
   ~vtkInteractorStyleMultiTouchCamera();
 
-  int PointersDownCount;
-  int PointersDown[VTKI_MAX_POINTERS];
-
-  double MotionFactor;
-  int LastState;
-
 private:
   vtkInteractorStyleMultiTouchCamera(const vtkInteractorStyleMultiTouchCamera&);  // Not implemented.
   void operator=(const vtkInteractorStyleMultiTouchCamera&);  // Not implemented.
diff --git a/Interaction/Widgets/vtkPlaneWidget.cxx b/Interaction/Widgets/vtkPlaneWidget.cxx
index c63bb74e168d6b97466bfcb32b42520cc9b95506..ecfc5bf951b8148b85ab535cd4b07e170739a648 100644
--- a/Interaction/Widgets/vtkPlaneWidget.cxx
+++ b/Interaction/Widgets/vtkPlaneWidget.cxx
@@ -285,6 +285,12 @@ void vtkPlaneWidget::SetEnabled(int enabling)
                    this->EventCallbackCommand, this->Priority);
     i->AddObserver(vtkCommand::RightButtonReleaseEvent,
                    this->EventCallbackCommand, this->Priority);
+    i->AddObserver(vtkCommand::StartPinchEvent,
+                   this->EventCallbackCommand, this->Priority);
+    i->AddObserver(vtkCommand::PinchEvent,
+                   this->EventCallbackCommand, this->Priority);
+    i->AddObserver(vtkCommand::EndPinchEvent,
+                   this->EventCallbackCommand, this->Priority);
 
     // Add the plane
     this->CurrentRenderer->AddActor(this->PlaneActor);
@@ -386,6 +392,15 @@ void vtkPlaneWidget::ProcessEvents(vtkObject* vtkNotUsed(object),
     case vtkCommand::MouseMoveEvent:
       self->OnMouseMove();
       break;
+    case vtkCommand::StartPinchEvent:
+      self->OnStartPinch();
+      break;
+    case vtkCommand::PinchEvent:
+      self->OnPinch();
+      break;
+    case vtkCommand::EndPinchEvent:
+      self->OnEndPinch();
+      break;
     }
 }
 
@@ -582,6 +597,87 @@ void vtkPlaneWidget::HighlightPlane(int highlight)
     }
 }
 
+void vtkPlaneWidget::OnStartPinch()
+{
+  int X = this->Interactor->GetEventPosition()[0];
+  int Y = this->Interactor->GetEventPosition()[1];
+
+  // Okay, make sure that the pick is in the current renderer
+  if (!this->CurrentRenderer || !this->CurrentRenderer->IsInViewport(X, Y))
+    {
+    this->State = vtkPlaneWidget::Outside;
+    return;
+    }
+
+  // Okay, we can process this. try to pick the plane.
+  vtkAssemblyPath* path = this->GetAssemblyPath(X, Y, 0., this->PlanePicker);
+
+  if ( path != NULL )
+    {
+    this->State = vtkPlaneWidget::Pinching;
+    this->HighlightPlane(1);
+    this->StartInteraction();
+    this->InvokeEvent(vtkCommand::StartInteractionEvent,NULL);
+    }
+}
+
+void vtkPlaneWidget::OnPinch()
+{
+  if ( this->State != vtkPlaneWidget::Pinching)
+    {
+    return;
+    }
+
+  double sf = this->Interactor->GetScale()/this->Interactor->GetLastScale();
+  double *o = this->PlaneSource->GetOrigin();
+  double *pt1 = this->PlaneSource->GetPoint1();
+  double *pt2 = this->PlaneSource->GetPoint2();
+
+  double center[3];
+  center[0] = 0.5 * ( pt1[0] + pt2[0] );
+  center[1] = 0.5 * ( pt1[1] + pt2[1] );
+  center[2] = 0.5 * ( pt1[2] + pt2[2] );
+
+  // Move the corner points
+  double origin[3], point1[3], point2[3];
+  for (int i=0; i<3; i++)
+    {
+    origin[i] = sf * (o[i] - center[i]) + center[i];
+    point1[i] = sf * (pt1[i] - center[i]) + center[i];
+    point2[i] = sf * (pt2[i] - center[i]) + center[i];
+    }
+
+  this->PlaneSource->SetOrigin(origin);
+  this->PlaneSource->SetPoint1(point1);
+  this->PlaneSource->SetPoint2(point2);
+  this->PlaneSource->Update();
+
+  this->PositionHandles();
+
+  this->EventCallbackCommand->SetAbortFlag(1);
+  this->InvokeEvent(vtkCommand::InteractionEvent,NULL);
+  this->Interactor->Render();
+}
+
+void vtkPlaneWidget::OnEndPinch()
+{
+  if ( this->State != vtkPlaneWidget::Pinching)
+    {
+    return;
+    }
+
+  this->State = vtkPlaneWidget::Start;
+  this->HighlightHandle(NULL);
+  this->HighlightPlane(0);
+  this->HighlightNormal(0);
+  this->SizeHandles();
+
+  this->EventCallbackCommand->SetAbortFlag(1);
+  this->EndInteraction();
+  this->InvokeEvent(vtkCommand::EndInteractionEvent,NULL);
+  this->Interactor->Render();
+}
+
 void vtkPlaneWidget::OnLeftButtonDown()
 {
   int X = this->Interactor->GetEventPosition()[0];
diff --git a/Interaction/Widgets/vtkPlaneWidget.h b/Interaction/Widgets/vtkPlaneWidget.h
index c543b5964a89daad40a07b7c2da1c86ebef3720e..694913d1417e86c2b0ae58ae722dd2834f01553f 100644
--- a/Interaction/Widgets/vtkPlaneWidget.h
+++ b/Interaction/Widgets/vtkPlaneWidget.h
@@ -244,7 +244,8 @@ protected:
     Pushing,
     Rotating,
     Spinning,
-    Outside
+    Outside,
+    Pinching
   };
 
   //handles the events
@@ -261,6 +262,9 @@ protected:
   void OnRightButtonDown();
   void OnRightButtonUp();
   void OnMouseMove();
+  void OnStartPinch();
+  void OnPinch();
+  void OnEndPinch();
 
   // controlling ivars
   int NormalToXAxis;
diff --git a/Rendering/Core/vtkInteractorStyle.cxx b/Rendering/Core/vtkInteractorStyle.cxx
index bb755b2011cd149872e93dd3448ff6ca536b1386..989654ee7898298c83a531e3b8f1ba26d19463a8 100644
--- a/Rendering/Core/vtkInteractorStyle.cxx
+++ b/Rendering/Core/vtkInteractorStyle.cxx
@@ -260,6 +260,25 @@ void vtkInteractorStyle::SetInteractor(vtkRenderWindowInteractor *i)
     i->AddObserver(vtkCommand::TDxButtonReleaseEvent,
                    this->EventCallbackCommand,
                    this->Priority);
+
+    i->AddObserver(vtkCommand::PinchEvent,
+                   this->EventCallbackCommand,
+                   this->Priority);
+    i->AddObserver(vtkCommand::PanEvent,
+                   this->EventCallbackCommand,
+                   this->Priority);
+    i->AddObserver(vtkCommand::RotateEvent,
+                   this->EventCallbackCommand,
+                   this->Priority);
+    i->AddObserver(vtkCommand::TapEvent,
+                   this->EventCallbackCommand,
+                   this->Priority);
+    i->AddObserver(vtkCommand::LongTapEvent,
+                   this->EventCallbackCommand,
+                   this->Priority);
+    i->AddObserver(vtkCommand::SwipeEvent,
+                   this->EventCallbackCommand,
+                   this->Priority);
     }
 
   this->EventForwarder->SetTarget(this->Interactor);
@@ -1185,5 +1204,77 @@ void vtkInteractorStyle::ProcessEvents(vtkObject* vtkNotUsed(object),
     case vtkCommand::TDxButtonReleaseEvent:
       self->DelegateTDxEvent(event,calldata);
       break;
+
+    case vtkCommand::PinchEvent:
+      if (self->HandleObservers &&
+          self->HasObserver(vtkCommand::PinchEvent))
+        {
+        self->InvokeEvent(vtkCommand::PinchEvent,NULL);
+        }
+      else
+        {
+        self->OnPinch();
+        }
+      break;
+    case vtkCommand::PanEvent:
+      if (self->HandleObservers &&
+          self->HasObserver(vtkCommand::PanEvent))
+        {
+        self->InvokeEvent(vtkCommand::PanEvent,NULL);
+        }
+      else
+        {
+        self->OnPan();
+        }
+      break;
+
+    case vtkCommand::RotateEvent:
+      if (self->HandleObservers &&
+          self->HasObserver(vtkCommand::RotateEvent))
+        {
+        self->InvokeEvent(vtkCommand::RotateEvent,NULL);
+        }
+      else
+        {
+        self->OnRotate();
+        }
+      break;
+
+    case vtkCommand::TapEvent:
+      if (self->HandleObservers &&
+          self->HasObserver(vtkCommand::TapEvent))
+        {
+        self->InvokeEvent(vtkCommand::TapEvent,NULL);
+        }
+      else
+        {
+        self->OnTap();
+        }
+      break;
+
+    case vtkCommand::LongTapEvent:
+      if (self->HandleObservers &&
+          self->HasObserver(vtkCommand::LongTapEvent))
+        {
+        self->InvokeEvent(vtkCommand::LongTapEvent,NULL);
+        }
+      else
+        {
+        self->OnLongTap();
+        }
+      break;
+
+    case vtkCommand::SwipeEvent:
+      if (self->HandleObservers &&
+          self->HasObserver(vtkCommand::SwipeEvent))
+        {
+        self->InvokeEvent(vtkCommand::SwipeEvent,NULL);
+        }
+      else
+        {
+        self->OnSwipe();
+        }
+      break;
+
     }
 }
diff --git a/Rendering/Core/vtkInteractorStyle.h b/Rendering/Core/vtkInteractorStyle.h
index a43ee0ee28936d6f7daa78c4c9db5b059c300de1..d837e736a6b0bd54099eb50019f013c7ead2aab8 100644
--- a/Rendering/Core/vtkInteractorStyle.h
+++ b/Rendering/Core/vtkInteractorStyle.h
@@ -249,6 +249,15 @@ public:
   virtual void Zoom() {}
   virtual void UniformScale() {}
 
+  // Description:
+  // gesture based events
+  virtual void OnPinch() {}
+  virtual void OnRotate() {}
+  virtual void OnPan() {}
+  virtual void OnTap() {}
+  virtual void OnLongTap() {}
+  virtual void OnSwipe() {}
+
   // Description:
   // utility routines used by state changes
   virtual void StartState(int newstate);
diff --git a/Rendering/Core/vtkRenderWindowInteractor.cxx b/Rendering/Core/vtkRenderWindowInteractor.cxx
index 00030105da7c21cbe1f683da7aa8990532210ccd..bf5768b96332a78a02f76a2c81a0886711c2d979 100644
--- a/Rendering/Core/vtkRenderWindowInteractor.cxx
+++ b/Rendering/Core/vtkRenderWindowInteractor.cxx
@@ -110,6 +110,10 @@ vtkRenderWindowInteractor::vtkRenderWindowInteractor()
   this->ControlKey = 0;
   this->ShiftKey = 0;
   this->KeyCode = 0;
+  this->Rotation = 0;
+  this->LastRotation = 0;
+  this->Scale = 0;
+  this->LastScale = 0;
   this->RepeatCount = 0;
   this->KeySym = 0;
   this->TimerEventId = 0;
@@ -127,8 +131,12 @@ vtkRenderWindowInteractor::vtkRenderWindowInteractor()
   for (int i=0; i < VTKI_MAX_POINTERS; i++)
     {
     this->PointerIndexLookup[i] = 0;
+    this->PointersDown[i] = 0;
     }
 
+  this->RecognizeGestures = true;
+  this->PointersDownCount = 0;
+  this->CurrentGesture = vtkCommand::StartEvent;
 }
 
 //----------------------------------------------------------------------
@@ -545,6 +553,241 @@ vtkRenderer* vtkRenderWindowInteractor::FindPokedRenderer(int x,int y)
   return currentRenderer;
 }
 
+//----------------------------------------------------------------------------
+void vtkRenderWindowInteractor::SetScale(double scale)
+{
+  this->LastScale = this->Scale;
+  if (this->Scale != scale)
+    {
+    this->Scale = scale;
+    this->Modified();
+    }
+}
+
+//----------------------------------------------------------------------------
+void vtkRenderWindowInteractor::SetRotation(double rot)
+{
+  this->LastRotation = this->Rotation;
+  if (this->Rotation != rot)
+    {
+    this->Rotation = rot;
+    this->Modified();
+    }
+}
+
+//----------------------------------------------------------------------------
+void vtkRenderWindowInteractor::SetTranslation(double val[2])
+{
+  this->LastTranslation[0] = this->Translation[0];
+  this->LastTranslation[1] = this->Translation[1];
+  if (this->Translation[0] != val[0] ||
+      this->Translation[1] != val[1])
+    {
+    this->Translation[0] = val[0];
+    this->Translation[1] = val[1];
+    this->Modified();
+    }
+}
+
+//----------------------------------------------------------------------------
+void vtkRenderWindowInteractor::RecognizeGesture(vtkCommand::EventIds event)
+{
+  // we know we are in multitouch now, so start recognizing
+
+  // more than two pointers we ignore
+  if (this->PointersDownCount > 2)
+    {
+    return;
+    }
+
+  // store the initial positions
+  if (event == vtkCommand::LeftButtonPressEvent)
+    {
+    for (int i = 0; i < VTKI_MAX_POINTERS; i++)
+      {
+      if (this->PointersDown[i])
+        {
+        this->StartingEventPositions[i][0] =
+          this->EventPositions[i][0];
+        this->StartingEventPositions[i][1] =
+          this->EventPositions[i][1];
+        }
+      }
+    // we do not know what the gesture is yet
+    this->CurrentGesture = vtkCommand::StartEvent;
+    return;
+    }
+
+  // end the gesture if needed
+  if (event == vtkCommand::LeftButtonReleaseEvent)
+    {
+    if (this->CurrentGesture == vtkCommand::PinchEvent)
+      {
+      this->EndPinchEvent();
+      }
+    if (this->CurrentGesture == vtkCommand::RotateEvent)
+      {
+      this->EndRotateEvent();
+      }
+    if (this->CurrentGesture == vtkCommand::PanEvent)
+      {
+      this->EndPanEvent();
+      }
+    this->CurrentGesture = vtkCommand::StartEvent;
+    return;
+    }
+
+  // what are the two pointers we are working with
+  int count = 0;
+  int *posVals[2];
+  int *startVals[2];
+  for (int i = 0; i < VTKI_MAX_POINTERS; i++)
+    {
+    if (this->PointersDown[i])
+      {
+      posVals[count] = this->EventPositions[i];
+      startVals[count] = this->StartingEventPositions[i];
+      count++;
+      }
+    }
+
+  // The meat of the algorithm
+  // on move events we analyze them to determine what type
+  // of movement it is and then deal with it.
+  if (event == vtkCommand::MouseMoveEvent)
+    {
+    // calculate the distances
+    double originalDistance = sqrt(
+        static_cast<double>(
+        (startVals[0][0] - startVals[1][0])*(startVals[0][0] - startVals[1][0])
+        + (startVals[0][1] - startVals[1][1])*(startVals[0][1] - startVals[1][1])));
+    double newDistance = sqrt(
+        static_cast<double>(
+        (posVals[0][0] - posVals[1][0])*(posVals[0][0] - posVals[1][0])
+        + (posVals[0][1] - posVals[1][1])*(posVals[0][1] - posVals[1][1])));
+
+    // calculate rotations
+    double originalAngle =
+      vtkMath::DegreesFromRadians( atan2((double)startVals[1][1] - startVals[0][1],
+                                         (double)startVals[1][0] - startVals[0][0]));
+    double newAngle =
+      vtkMath::DegreesFromRadians( atan2( (double)posVals[1][1] - posVals[0][1],
+                                          (double)posVals[1][0] - posVals[0][0]));
+
+    // angles are cyclic so watch for that, 1 and 359 are only 2 apart :)
+    double angleDeviation = newAngle - originalAngle;
+    newAngle = (newAngle+180.0 >= 360.0 ? newAngle - 180.0 : newAngle + 180.0);
+    originalAngle = (originalAngle+180.0 >= 360.0 ? originalAngle - 180.0 : originalAngle + 180.0);
+    if (fabs(newAngle - originalAngle) < fabs(angleDeviation))
+      {
+      angleDeviation = newAngle - originalAngle;
+      }
+
+    // calculate the translations
+    double trans[2];
+      trans[0] = (posVals[0][0] - startVals[0][0] + posVals[1][0] - startVals[1][0])/2.0;
+      trans[1] = (posVals[0][1] - startVals[0][1] + posVals[1][1] - startVals[1][1])/2.0;
+
+    // OK we want to
+    // - immediately respond to the user
+    // - allow the user to zoom without panning (saves focal point)
+    // - allow the user to rotate without panning (saves focal point)
+
+    // do we know what gesture we are doing yet? If not
+    // see if we can figure it out
+    if (this->CurrentGesture == vtkCommand::StartEvent)
+      {
+      // pinch is a move to/from the center point
+      // rotate is a move along the circumference
+      // pan is a move of the center point
+      // compute the distance along each of these axes in pixels
+      // the first to break thresh wins
+      double thresh = sqrt(this->Size[0]*this->Size[0] + this->Size[1]*this->Size[1])*0.01;
+      if (thresh < 15.0)
+        {
+        thresh = 15.0;
+        }
+      double pinchDistance = fabs(newDistance - originalDistance);
+      double rotateDistance = newDistance*3.1415926*fabs(angleDeviation)/360.0;
+      double panDistance = sqrt(trans[0]*trans[0] + trans[1]*trans[1]);
+      if (pinchDistance > thresh
+          && pinchDistance > rotateDistance
+          && pinchDistance > panDistance)
+        {
+        this->CurrentGesture = vtkCommand::PinchEvent;
+        this->Scale = 1.0;
+        this->StartPinchEvent();
+        }
+      else if (rotateDistance > thresh
+          && rotateDistance > panDistance)
+        {
+        this->CurrentGesture = vtkCommand::RotateEvent;
+        this->Rotation = 0.0;
+        this->StartRotateEvent();
+        }
+      else if (panDistance > thresh)
+        {
+        this->CurrentGesture = vtkCommand::PanEvent;
+        this->Translation[0] = 0.0;
+        this->Translation[1] = 0.0;
+        this->StartPanEvent();
+        }
+
+      // // if we are a reasonable distance apart and the rotation is > some degrees
+      // // then start a rotation
+      // if (newDistance > 50.0 && fabs(angleDeviation) > 10.0)
+      //   {
+      //   this->CurrentGesture = vtkCommand::RotateEvent;
+      //   this->Rotation = 0.0;
+      //   }
+      // // if the distance has significantly changed then start a pinch event
+      // if (fabs(newDistance - originalDistance)/
+      //       sqrt(this->Size[0]*this->Size[0] + this->Size[1]*this->Size[1]) > 0.1 ||
+      //     fabs(newDistance - originalDistance) > 100.0)
+      //   {
+      //   this->CurrentGesture = vtkCommand::PinchEvent;
+      //   this->Scale = 1.0;
+      //   }
+      // // if
+      // if (fabs(angleDeviation) < 10.0 &&  // there is little rotation and
+      //     (transDistance/sqrt(this->Size[0]*this->Size[0] + this->Size[1]*this->Size[1]) > 0.1 ||
+      //      transDistance > 100.0))
+      //   {
+      //   this->CurrentGesture = vtkCommand::PanEvent;
+      //   this->Translation[0] = 0.0;
+      //   this->Translation[1] = 0.0;
+      //   }
+
+      }
+
+    // if we have found a specific type of movement then
+    // handle it
+    if (this->CurrentGesture == vtkCommand::RotateEvent)
+      {
+      this->SetRotation(angleDeviation);
+      this->RotateEvent();
+      }
+
+    if (this->CurrentGesture == vtkCommand::PinchEvent)
+      {
+        vtkErrorMacro("See pinch");
+      this->SetScale(newDistance/originalDistance);
+      this->PinchEvent();
+      }
+
+    if (this->CurrentGesture == vtkCommand::PanEvent)
+      {
+      double trans[2];
+      trans[0] = (posVals[0][0] - startVals[0][0] + posVals[1][0] - startVals[1][0])/2.0;
+      trans[1] = (posVals[0][1] - startVals[0][1] + posVals[1][1] - startVals[1][1])/2.0;
+      this->SetTranslation(trans);
+      this->PanEvent();
+      }
+
+    }
+
+}
+
 
 // Timer methods. There are two basic groups of methods, those for backward
 // compatibility (group #1) and those that operate on specific timers (i.e.,
@@ -767,6 +1010,7 @@ void vtkRenderWindowInteractor::PrintSelf(ostream& os, vtkIndent indent)
   os << indent << "TimerEventDuration: " << this->TimerEventDuration << "\n";
   os << indent << "TimerEventPlatformId: " << this->TimerEventPlatformId << "\n";
   os << indent << "UseTDx: " << this->UseTDx << endl;
+  os << indent << "Recognize Gestures: " << this->RecognizeGestures << endl;
 }
 
 //----------------------------------------------------------------------------
@@ -808,7 +1052,17 @@ void vtkRenderWindowInteractor::MouseMoveEvent()
     {
     return;
     }
-  this->InvokeEvent(vtkCommand::MouseMoveEvent, NULL);
+
+  // handle gestures or not?
+  if (this->RecognizeGestures && this->PointersDownCount > 1)
+    {
+    // handle the gesture
+    this->RecognizeGesture(vtkCommand::MouseMoveEvent);
+    }
+  else
+    {
+    this->InvokeEvent(vtkCommand::MouseMoveEvent, NULL);
+    }
 }
 
 //------------------------------------------------------------------
@@ -838,6 +1092,29 @@ void vtkRenderWindowInteractor::LeftButtonPressEvent()
     {
     return;
     }
+
+  // are we translating multitouch into gestures?
+  if (this->RecognizeGestures)
+    {
+    if (!this->PointersDown[this->PointerIndex])
+      {
+      this->PointersDown[this->PointerIndex] = 1;
+      this->PointersDownCount++;
+      }
+    // do we have multitouch
+    if (this->PointersDownCount > 1)
+      {
+      // did we just transition to multitouch?
+      if (this->PointersDownCount == 2)
+        {
+        this->InvokeEvent(vtkCommand::LeftButtonReleaseEvent, NULL);
+        }
+      // handle the gesture
+      this->RecognizeGesture(vtkCommand::LeftButtonPressEvent);
+      return;
+      }
+    }
+
   this->InvokeEvent(vtkCommand::LeftButtonPressEvent, NULL);
 }
 
@@ -848,6 +1125,22 @@ void vtkRenderWindowInteractor::LeftButtonReleaseEvent()
     {
     return;
     }
+
+  if (this->RecognizeGestures)
+    {
+    if (this->PointersDown[this->PointerIndex])
+      {
+      this->PointersDown[this->PointerIndex] = 0;
+      this->PointersDownCount--;
+      }
+    // do we have multitouch
+    if (this->PointersDownCount > 1)
+      {
+      // handle the gesture
+      this->RecognizeGesture(vtkCommand::LeftButtonReleaseEvent);
+      return;
+      }
+    }
   this->InvokeEvent(vtkCommand::LeftButtonReleaseEvent, NULL);
 }
 
@@ -971,4 +1264,115 @@ void vtkRenderWindowInteractor::ExitEvent()
   this->InvokeEvent(vtkCommand::ExitEvent, NULL);
 }
 
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::StartPinchEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::StartPinchEvent, NULL);
+}
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::PinchEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::PinchEvent, NULL);
+}
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::EndPinchEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::EndPinchEvent, NULL);
+}
 
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::StartRotateEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::StartRotateEvent, NULL);
+}
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::RotateEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::RotateEvent, NULL);
+}
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::EndRotateEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::EndRotateEvent, NULL);
+}
+
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::StartPanEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::StartPanEvent, NULL);
+}
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::PanEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::PanEvent, NULL);
+}
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::EndPanEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::EndPanEvent, NULL);
+}
+
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::TapEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::TapEvent, NULL);
+}
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::LongTapEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::LongTapEvent, NULL);
+}
+
+//------------------------------------------------------------------
+void vtkRenderWindowInteractor::SwipeEvent()
+{
+  if (!this->Enabled)
+    {
+    return;
+    }
+  this->InvokeEvent(vtkCommand::SwipeEvent, NULL);
+}
diff --git a/Rendering/Core/vtkRenderWindowInteractor.h b/Rendering/Core/vtkRenderWindowInteractor.h
index c796c3f8a71d34c7fd85778cdd9ef24f024d9ded..7ce9a8a5e04c3b0e11d1dd098f9ffb3a04248021 100644
--- a/Rendering/Core/vtkRenderWindowInteractor.h
+++ b/Rendering/Core/vtkRenderWindowInteractor.h
@@ -44,6 +44,7 @@
 
 #include "vtkRenderingCoreModule.h" // For export macro
 #include "vtkObject.h"
+#include "vtkCommand.h" // for method sig
 
 class vtkTimerIdMap;
 
@@ -447,6 +448,24 @@ public:
   vtkSetMacro(PointerIndex, int);
   vtkGetMacro(PointerIndex, int);
 
+  // Description:
+  // Set/get the rotation for the gesture in degrees, update LastRotation
+  void SetRotation(double val);
+  vtkGetMacro(Rotation, double);
+  vtkGetMacro(LastRotation, double);
+
+  // Description:
+  // Set/get the scale for the gesture, updates LastScale
+  void SetScale(double val);
+  vtkGetMacro(Scale, double);
+  vtkGetMacro(LastScale, double);
+
+  // Description:
+  // Set/get the tranlation for pan/swipe gestures, update LastTranslation
+  void SetTranslation(double val[2]);
+  vtkGetVector2Macro(Translation, double);
+  vtkGetVector2Macro(LastTranslation, double);
+
   // Description:
   // Set all the event information in one call.
   void SetEventInformation(int x,
@@ -587,6 +606,36 @@ public:
   virtual void CharEvent();
   virtual void ExitEvent();
 
+  // Description:
+  // Fire various gesture based events.  These methods will Invoke the
+  // corresponding vtk event.
+  virtual void StartPinchEvent();
+  virtual void PinchEvent();
+  virtual void EndPinchEvent();
+  virtual void StartRotateEvent();
+  virtual void RotateEvent();
+  virtual void EndRotateEvent();
+  virtual void StartPanEvent();
+  virtual void PanEvent();
+  virtual void EndPanEvent();
+  virtual void TapEvent();
+  virtual void LongTapEvent();
+  virtual void SwipeEvent();
+
+  // Description:
+  // Convert multitouch events into gestures. When this is on
+  // (its default) multitouch events received by this interactor
+  // will be converted into gestures by VTK. If turned off the
+  // raw multitouch events will be passed down.
+  vtkSetMacro(RecognizeGestures,bool);
+  vtkGetMacro(RecognizeGestures,bool);
+
+  // Description:
+  // When handling gestures you can query this value to
+  // determine how many pointers are down for the gesture
+  // this is useful for pan gestures for example
+  vtkGetMacro(PointersDownCount,int);
+
   // Description:
   // Most multitouch systems use persistent contact/pointer ids to
   // track events/motion during multitouch events. We keep an array
@@ -629,6 +678,12 @@ protected:
   int   ControlKey;
   int   ShiftKey;
   char  KeyCode;
+  double Rotation;
+  double LastRotation;
+  double Scale;
+  double LastScale;
+  double Translation[2];
+  double LastTranslation[2];
   int   RepeatCount;
   char* KeySym;
   int   EventPosition[2];
@@ -695,6 +750,15 @@ protected:
 
   bool UseTDx; // 3DConnexion device.
 
+  // when recognizing gestures VTK will take multitouch events
+  // if it receives them and convert them to gestures
+  bool RecognizeGestures;
+  int PointersDownCount;
+  int PointersDown[VTKI_MAX_POINTERS];
+  virtual void RecognizeGesture(vtkCommand::EventIds);
+  int StartingEventPositions[VTKI_MAX_POINTERS][2];
+  vtkCommand::EventIds CurrentGesture;
+
 private:
   vtkRenderWindowInteractor(const vtkRenderWindowInteractor&);  // Not implemented.
   void operator=(const vtkRenderWindowInteractor&);  // Not implemented.
diff --git a/Rendering/OpenGL2/vtkAndroidRenderWindowInteractor.cxx b/Rendering/OpenGL2/vtkAndroidRenderWindowInteractor.cxx
index 973814a07d695f3ef4a2bd73648a127046390af2..dac879f0524487f0f84c1e82cb061900acc6a461 100644
--- a/Rendering/OpenGL2/vtkAndroidRenderWindowInteractor.cxx
+++ b/Rendering/OpenGL2/vtkAndroidRenderWindowInteractor.cxx
@@ -442,7 +442,7 @@ void vtkAndroidRenderWindowInteractor::HandleMotionEvent(
       if (index > -1)
         {
         this->SetPointerIndex(index);
-        this->InvokeEvent(vtkCommand::LeftButtonPressEvent,NULL);
+        this->LeftButtonPressEvent();
         }
       }
       return;
@@ -455,7 +455,7 @@ void vtkAndroidRenderWindowInteractor::HandleMotionEvent(
         if (this->IsPointerIndexSet(i))
           {
           this->SetPointerIndex(i);
-          this->InvokeEvent(vtkCommand::LeftButtonReleaseEvent,NULL);
+          this->LeftButtonReleaseEvent();
           this->ClearPointerIndex(i);
           }
         }
@@ -468,13 +468,13 @@ void vtkAndroidRenderWindowInteractor::HandleMotionEvent(
       if (i > -1)
         {
         this->SetPointerIndex(i);
-        this->InvokeEvent(vtkCommand::LeftButtonReleaseEvent,NULL);
+        this->LeftButtonReleaseEvent();
         this->ClearContact(actionId);
         }
       }
       return;
     case AMOTION_EVENT_ACTION_MOVE:
-      this->InvokeEvent(vtkCommand::MouseMoveEvent, NULL);
+      this->MouseMoveEvent();
       return;
     } // end switch action
 }