diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml
index 07620fd849b9590f0c18a8e70d86dc868719bb7f..d522660cc4110cd70c04cb5e66cb088f2b7366d5 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml
@@ -1,191 +1,189 @@
 <ServerManagerConfiguration>
-    <ProxyGroup name="sources">
-    <SourceProxy
-
-        name="PV3FoamReader"
-        class="vtkPV3FoamReader">
-
-     <!-- File name - compulsory -->
-        <StringVectorProperty
-            name="FileName"
-            command="SetFileName"
-            number_of_elements="1">
-            <FileListDomain
-                name="files"/>
-        </StringVectorProperty>
-
-<!-- Time info sent to animation controls (top of window) -->
-
-        <DoubleVectorProperty
-            name="TimestepValues"
-            information_only="1">
-            <TimeStepsInformationHelper/>
-            <Documentation>
-                Available timestep values.
-            </Documentation>
-        </DoubleVectorProperty>
-
-        <DoubleVectorProperty
-            name="TimeRange"
-            information_only="1">
-            <TimeRangeInformationHelper/>
-        </DoubleVectorProperty>
-
-<!-- ExtrapolateWalls check box -->
-        <IntVectorProperty
-            name="ExtrapolateWalls"
-            command="SetExtrapolateWalls"
-            number_of_elements="1"
-            default_values="0">
-            <BooleanDomain
-                name="bool"/>
-        </IntVectorProperty>
-
-<!-- Include sets check box -->
-        <IntVectorProperty
-            name="IncludeSets"
-            command="SetIncludeSets"
-            number_of_elements="1"
-            default_values="0">
-            <BooleanDomain
-                name="bool"/>
-        </IntVectorProperty>
-
-<!-- Include zones check box -->
-        <IntVectorProperty
-            name="IncludeZones"
-            command="SetIncludeZones"
-            number_of_elements="1"
-            default_values="0">
-            <BooleanDomain
-                name="bool"/>
-        </IntVectorProperty>
-
-<!-- Show patch names check box -->
-        <IntVectorProperty
-            name="ShowPatchNames"
-            command="SetShowPatchNames"
-            number_of_elements="1"
-            default_values="0">
-            <BooleanDomain name="bool"/>
-        </IntVectorProperty>
-
-<!-- Available regions array -->
-        <StringVectorProperty
-            name="RegionArrayInfo"
-            information_only="1">
-            <ArraySelectionInformationHelper
-                attribute_name="Region"/>
-        </StringVectorProperty>
-        <StringVectorProperty
-            name="RegionStatus"
-            command="SetRegionArrayStatus"
-            number_of_elements="0"
-            repeat_command="1"
-            number_of_elements_per_command="2"
-            element_types="2 0"
-            information_property="RegionArrayInfo">
-            <ArraySelectionDomain
-                name="array_list">
-                <RequiredProperties>
-                    <Property name="RegionArrayInfo"
-                              function="ArrayList"/>
-                </RequiredProperties>
-            </ArraySelectionDomain>
-        </StringVectorProperty>
-
-<!-- Available volFields array -->
-        <StringVectorProperty
-            name="VolFieldArrayInfo"
-            information_only="1">
-            <ArraySelectionInformationHelper
-                attribute_name="VolField"/>
-        </StringVectorProperty>
-        <StringVectorProperty
-            name="VolFieldStatus"
-            command="SetVolFieldArrayStatus"
-            number_of_elements="0"
-            repeat_command="1"
-            number_of_elements_per_command="2"
-            element_types="2 0"
-            information_property="VolFieldArrayInfo">
-            <ArraySelectionDomain
-                name="array_list">
-                <RequiredProperties>
-                    <Property name="VolFieldArrayInfo"
-                              function="ArrayList"/>
-                </RequiredProperties>
-            </ArraySelectionDomain>
-        </StringVectorProperty>
-
-<!-- Available pointFields array -->
-        <StringVectorProperty
-            name="PointFieldArrayInfo"
-            information_only="1">
-            <ArraySelectionInformationHelper
-                attribute_name="PointField"/>
-        </StringVectorProperty>
-        <StringVectorProperty
-            name="PointFieldStatus"
-            command="SetPointFieldArrayStatus"
-            number_of_elements="0"
-            repeat_command="1"
-            number_of_elements_per_command="2"
-            element_types="2 0"
-            information_property="PointFieldArrayInfo">
-            <ArraySelectionDomain
-                name="array_list">
-                <RequiredProperties>
-                    <Property name="PointFieldArrayInfo"
-                              function="ArrayList"/>
-                </RequiredProperties>
-            </ArraySelectionDomain>
-        </StringVectorProperty>
-
-<!-- Available Lagrangian fields array -->
-        <StringVectorProperty
-            name="LagrangianFieldArrayInfo"
-            information_only="1">
-            <ArraySelectionInformationHelper
-                attribute_name="LagrangianField"/>
-        </StringVectorProperty>
-        <StringVectorProperty
-            name="LagrangianFieldStatus"
-            command="SetLagrangianFieldArrayStatus"
-            number_of_elements="0"
-            repeat_command="1"
-            number_of_elements_per_command="2"
-            element_types="2 0"
-            information_property="LagrangianFieldArrayInfo">
-            <ArraySelectionDomain
-                name="array_list">
-                <RequiredProperties>
-                    <Property name="LagrangianFieldArrayInfo"
-                              function="ArrayList"/>
-                </RequiredProperties>
-            </ArraySelectionDomain>
-        </StringVectorProperty>
-
-<!-- Cache mesh check box -->
-        <IntVectorProperty
-            name="CacheMesh"
-            command="SetCacheMesh"
-            number_of_elements="1"
-            default_values="1">
-            <BooleanDomain
-                name="bool"/>
-        </IntVectorProperty>
-
-<!-- Update GUI check box -->
-        <IntVectorProperty
-            name="UpdateGUI"
-            command="SetUpdateGUI"
-            number_of_elements="1"
-            default_values="0">
-            <BooleanDomain
-                name="bool"/>
-        </IntVectorProperty>
-
-    </SourceProxy>
-    </ProxyGroup>
+  <ProxyGroup name="sources">
+  <SourceProxy
+    name="PV3FoamReader"
+    class="vtkPV3FoamReader">
+
+    <!-- File name - compulsory -->
+    <StringVectorProperty
+      name="FileName"
+      command="SetFileName"
+      number_of_elements="1"
+      animateable="0">
+      <FileListDomain name="files"/>
+      <Documentation>
+          Specifies the filename for the OpenFOAM Reader
+      </Documentation>
+    </StringVectorProperty>
+
+    <!-- Time info sent to animation controls (top of window) -->
+    <DoubleVectorProperty
+      name="TimestepValues"
+      information_only="1">
+      <TimeStepsInformationHelper/>
+      <Documentation>
+        Available timestep values
+      </Documentation>
+    </DoubleVectorProperty>
+
+    <DoubleVectorProperty
+      name="TimeRange"
+      information_only="1">
+      <TimeRangeInformationHelper/>
+    </DoubleVectorProperty>
+
+    <!-- Available Region array -->
+    <StringVectorProperty
+      name="RegionArrayInfo"
+      information_only="1">
+      <ArraySelectionInformationHelper attribute_name="Region"/>
+    </StringVectorProperty>
+    <StringVectorProperty
+      name="RegionStatus"
+      label="Mesh Parts"
+      command="SetRegionArrayStatus"
+      number_of_elements="0"
+      repeat_command="1"
+      number_of_elements_per_command="2"
+      element_types="2 0"
+      information_property="RegionArrayInfo"
+      animateable="0">
+      <ArraySelectionDomain name="array_list">
+        <RequiredProperties>
+          <Property name="RegionArrayInfo" function="ArrayList"/>
+        </RequiredProperties>
+      </ArraySelectionDomain>
+    </StringVectorProperty>
+
+    <!-- Available volFields array -->
+    <StringVectorProperty
+      name="VolFieldArrayInfo"
+      information_only="1">
+      <ArraySelectionInformationHelper attribute_name="VolField"/>
+    </StringVectorProperty>
+    <StringVectorProperty
+      name="VolFieldStatus"
+      label="Volume Fields"
+      command="SetVolFieldArrayStatus"
+      number_of_elements="0"
+      repeat_command="1"
+      number_of_elements_per_command="2"
+      element_types="2 0"
+      information_property="VolFieldArrayInfo"
+      animateable="0">
+      <ArraySelectionDomain name="array_list">
+        <RequiredProperties>
+          <Property name="VolFieldArrayInfo" function="ArrayList"/>
+        </RequiredProperties>
+      </ArraySelectionDomain>
+    </StringVectorProperty>
+
+    <!-- Available Lagrangian fields array -->
+    <StringVectorProperty
+      name="LagrangianFieldArrayInfo"
+      information_only="1">
+      <ArraySelectionInformationHelper attribute_name="LagrangianField"/>
+    </StringVectorProperty>
+    <StringVectorProperty
+      name="LagrangianFieldStatus"
+      label="Lagrangian Fields"
+      command="SetLagrangianFieldArrayStatus"
+      number_of_elements="0"
+      repeat_command="1"
+      number_of_elements_per_command="2"
+      element_types="2 0"
+      information_property="LagrangianFieldArrayInfo"
+      animateable="0">
+      <ArraySelectionDomain name="array_list">
+        <RequiredProperties>
+          <Property name="LagrangianFieldArrayInfo" function="ArrayList"/>
+        </RequiredProperties>
+      </ArraySelectionDomain>
+    </StringVectorProperty>
+
+    <!-- Available pointFields array -->
+    <StringVectorProperty
+      name="PointFieldArrayInfo"
+      information_only="1">
+      <ArraySelectionInformationHelper attribute_name="PointField"/>
+    </StringVectorProperty>
+    <StringVectorProperty
+      name="PointFieldStatus"
+      label="Point Fields"
+      command="SetPointFieldArrayStatus"
+      number_of_elements="0"
+      repeat_command="1"
+      number_of_elements_per_command="2"
+      element_types="2 0"
+      information_property="PointFieldArrayInfo"
+      animateable="0">
+      <ArraySelectionDomain name="array_list">
+        <RequiredProperties>
+          <Property name="PointFieldArrayInfo" function="ArrayList"/>
+        </RequiredProperties>
+      </ArraySelectionDomain>
+    </StringVectorProperty>
+
+    <!-- Extrapolate Walls check-box -->
+    <IntVectorProperty
+      name="ExtrapolateWalls"
+      command="SetExtrapolateWalls"
+      number_of_elements="1"
+      default_values="0"
+      animateable="0">
+      <BooleanDomain name="bool"/>
+    </IntVectorProperty>
+
+    <!-- Include Sets check-box -->
+    <IntVectorProperty
+      name="IncludeSets"
+      command="SetIncludeSets"
+      number_of_elements="1"
+      default_values="0"
+      animateable="0">
+      <BooleanDomain name="bool"/>
+    </IntVectorProperty>
+
+    <!-- Include Zones check-box -->
+    <IntVectorProperty
+      name="IncludeZones"
+      command="SetIncludeZones"
+      number_of_elements="1"
+      default_values="0"
+      animateable="0">
+      <BooleanDomain name="bool"/>
+    </IntVectorProperty>
+
+    <!-- Show Patch Names check-box -->
+    <IntVectorProperty
+      name="ShowPatchNames"
+      command="SetShowPatchNames"
+      number_of_elements="1"
+      default_values="0"
+      animateable="0">
+      <BooleanDomain name="bool"/>
+    </IntVectorProperty>
+
+    <!-- Cache Mesh check-box -->
+    <IntVectorProperty
+      name="CacheMesh"
+      command="SetCacheMesh"
+      number_of_elements="1"
+      default_values="1"
+      animateable="0">
+      <BooleanDomain name="bool"/>
+    </IntVectorProperty>
+
+    <!-- Update GUI check box -->
+    <IntVectorProperty
+      name="UpdateGUI"
+      command="SetUpdateGUI"
+      number_of_elements="1"
+      default_values="0"
+      animateable="0">
+      <BooleanDomain name="bool"/>
+    </IntVectorProperty>
+
+  </SourceProxy>
+  </ProxyGroup>
 </ServerManagerConfiguration>
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx
index fc12c30b8ac144bf0e916f94a22762c79c532400..2ad4f68cb01494fe722f034872b39e7a4137d2c0 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx
@@ -59,11 +59,10 @@ vtkPV3FoamReader::vtkPV3FoamReader()
     this->GetExecutive()->SetOutputData(1, lagrangian);
     lagrangian->Delete();
 
-    TimeStep = 0;
     TimeStepRange[0] = 0;
     TimeStepRange[1] = 0;
 
-    CacheMesh = 0;
+    CacheMesh = 1;
 
     ExtrapolateWalls = 0;
     IncludeSets = 0;
@@ -181,7 +180,7 @@ int vtkPV3FoamReader::RequestInformation
     }
     else
     {
-        foamData_->UpdateInformation();
+        foamData_->updateInfo();
     }
 
     int nTimeSteps = 0;
@@ -349,6 +348,15 @@ int vtkPV3FoamReader::RequestData
 
     foamData_->Update(output, lagrangianOutput);
 
+    if (ShowPatchNames)
+    {
+        addPatchNamesToView();
+    }
+    else
+    {
+        removePatchNamesFromView();
+    }
+
 #endif
 
     return 1;
@@ -408,7 +416,13 @@ void vtkPV3FoamReader::PrintSelf(ostream& os, vtkIndent indent)
     os<< indent << "Time step range: "
       << this->TimeStepRange[0] << " - " << this->TimeStepRange[1]
       << "\n";
-    os<< indent << "Time step: " << this->TimeStep << endl;
+    os<< indent << "Time step: " << this->GetTimeStep() << endl;
+}
+
+
+int vtkPV3FoamReader::GetTimeStep()
+{
+    return foamData_ ? foamData_->timeIndex() : -1;
 }
 
 
@@ -446,7 +460,6 @@ int vtkPV3FoamReader::GetRegionArrayStatus(const char* name)
 void vtkPV3FoamReader::SetRegionArrayStatus(const char* name, int status)
 {
     vtkDebugMacro(<<"SetRegionArrayStatus");
-
     if (status)
     {
         RegionSelection->EnableArray(name);
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h
index 77985be212595224b427fb7c173b3ec6c2d947c0..88fbae9b313ae429e534c9411227fbbd71bb8451 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h
@@ -21,20 +21,16 @@
 #ifndef __vtkPV3FoamReader_h
 #define __vtkPV3FoamReader_h
 
-#include "vtkMultiBlockDataSetAlgorithm.h"
-
 // Foam forward declarations
 namespace Foam
 {
     class vtkPV3Foam;
 }
 
+// VTK includes
+#include "vtkMultiBlockDataSetAlgorithm.h"
+
 // VTK forward declarations
-class vtkUnstructuredGrid;
-class vtkPoints;
-class vtkIntArray;
-class vtkFloatArray;
-class vtkDoubleArray;
 class vtkDataArraySelection;
 class vtkCallbackCommand;
 
@@ -44,41 +40,31 @@ class VTK_IO_EXPORT vtkPV3FoamReader
     public vtkMultiBlockDataSetAlgorithm
 {
 public:
+    vtkTypeRevisionMacro(vtkPV3FoamReader,vtkMultiBlockDataSetAlgorithm);
+    void PrintSelf(ostream&, vtkIndent);
 
     static vtkPV3FoamReader* New();
 
-    vtkTypeRevisionMacro
-    (
-        vtkPV3FoamReader,
-        vtkMultiBlockDataSetAlgorithm
-    );
-
-    void PrintSelf
-    (
-        ostream& os,
-        vtkIndent indent
-    );
+    // Description:
+    // Get the current timestep and the timestep range.
+    vtkGetVector2Macro(TimeStepRange, int);
 
     // Description:
     // Set/Get the filename.
     vtkSetStringMacro(FileName);
     vtkGetStringMacro(FileName);
 
-    // Time control
-    // Set/Get the timestep and the timestep range
-    vtkSetMacro(TimeStep, int);
-    vtkGetMacro(TimeStep, int);
-    vtkSetVector2Macro(TimeStepRange, int);
-    vtkGetVector2Macro(TimeStepRange, int);
-
+    // Description:
     // GUI update control
     vtkSetMacro(UpdateGUI, int);
     vtkGetMacro(UpdateGUI, int);
 
+    // Description:
     // FOAM mesh caching control
     vtkSetMacro(CacheMesh, int);
     vtkGetMacro(CacheMesh, int);
 
+    // Description:
     // FOAM extrapolate internal values onto the walls
     vtkSetMacro(ExtrapolateWalls, int);
     vtkGetMacro(ExtrapolateWalls, int);
@@ -87,42 +73,53 @@ public:
     vtkSetMacro(IncludeSets, int);
     vtkGetMacro(IncludeSets, int);
 
+    // Description:
     // FOAM read zones control
     vtkSetMacro(IncludeZones, int);
     vtkGetMacro(IncludeZones, int);
 
+    // Description:
     // FOAM display patch names control
     vtkSetMacro(ShowPatchNames, int);
     vtkGetMacro(ShowPatchNames, int);
 
+    // Description:
+    // Get the current timestep
+    int  GetTimeStep();
+
+    // Description:
     // Region selection list control
     vtkDataArraySelection* GetRegionSelection();
-    int GetNumberOfRegionArrays();
-    const char* GetRegionArrayName(int index);
-    int GetRegionArrayStatus(const char* name);
+    int  GetNumberOfRegionArrays();
+    int  GetRegionArrayStatus(const char* name);
     void SetRegionArrayStatus(const char* name, int status);
+    const char* GetRegionArrayName(int index);
 
+    // Description:
     // volField selection list control
     vtkDataArraySelection* GetVolFieldSelection();
-    int GetNumberOfVolFieldArrays();
-    const char* GetVolFieldArrayName(int index);
-    int GetVolFieldArrayStatus(const char* name);
+    int  GetNumberOfVolFieldArrays();
+    int  GetVolFieldArrayStatus(const char* name);
     void SetVolFieldArrayStatus(const char* name, int status);
+    const char* GetVolFieldArrayName(int index);
 
+    // Description:
     // pointField selection list control
     vtkDataArraySelection* GetPointFieldSelection();
-    int GetNumberOfPointFieldArrays();
-    int GetPointFieldArrayStatus(const char* name);
+    int  GetNumberOfPointFieldArrays();
+    int  GetPointFieldArrayStatus(const char* name);
     void SetPointFieldArrayStatus(const char* name, int status);
     const char* GetPointFieldArrayName(int index);
 
+    // Description:
     // lagrangianField selection list control
     vtkDataArraySelection* GetLagrangianFieldSelection();
-    int GetNumberOfLagrangianFieldArrays();
-    int GetLagrangianFieldArrayStatus(const char* name);
+    int  GetNumberOfLagrangianFieldArrays();
+    int  GetLagrangianFieldArrayStatus(const char* name);
     void SetLagrangianFieldArrayStatus(const char* name, int status);
     const char* GetLagrangianFieldArrayName(int index);
 
+    // Description:
     // Callback registered with the SelectionObserver
     // for all the selection lists
     static void SelectionModifiedCallback
@@ -138,35 +135,44 @@ public:
 
 protected:
 
+    //- Construct null
     vtkPV3FoamReader();
-    ~vtkPV3FoamReader();
 
-    char* FileName;
+    //- Destructor
+    ~vtkPV3FoamReader();
 
-    virtual int RequestData
+    //- Return information about mesh, times, etc without loading anything
+    virtual int RequestInformation
     (
         vtkInformation*,
         vtkInformationVector**,
         vtkInformationVector*
     );
 
-    virtual int RequestInformation
+    //- Get the mesh/fields for a particular time
+    //- Destructor
+    virtual int RequestData
     (
         vtkInformation*,
         vtkInformationVector**,
         vtkInformationVector*
     );
 
+    //- Fill in additional port information
     virtual int FillOutputPortInformation(int, vtkInformation*);
 
-    // The observer to modify this object when the array selections
-    // are modified
+    // The observer to modify this object when array selections are modified
     vtkCallbackCommand* SelectionObserver;
 
+    char* FileName;
+
 private:
 
-    vtkPV3FoamReader(const vtkPV3FoamReader&);  // Not implemented.
-    void operator=(const vtkPV3FoamReader&);  // Not implemented.
+    //- Disallow default bitwise copy construct
+    vtkPV3FoamReader(const vtkPV3FoamReader&);
+
+    //- Disallow default bitwise assignment
+    void operator=(const vtkPV3FoamReader&);
 
     //- Add patch names to the view
     void addPatchNamesToView();
@@ -174,9 +180,7 @@ private:
     //- Remove patch names from the view
     void removePatchNamesFromView();
 
-    int TimeStep;
     int TimeStepRange[2];
-
     int CacheMesh;
 
     int ExtrapolateWalls;
@@ -184,7 +188,7 @@ private:
     int IncludeZones;
     int ShowPatchNames;
 
-    //- Dummy variable/switch for provoking a reader update
+    //- Dummy variable/switch for invoke a reader update
     int UpdateGUI;
 
     vtkDataArraySelection* RegionSelection;
@@ -192,7 +196,7 @@ private:
     vtkDataArraySelection* PointFieldSelection;
     vtkDataArraySelection* LagrangianFieldSelection;
 
-    //- Cached data for output port0
+    //- Cached data for output port0 (experimental!)
     vtkMultiBlockDataSet* output0_;
 
     //BTX
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files
index 8fb98bc9adf477fa961ae2880a98fff9cf5b801e..4bb4f69970e1898d90a3c0ddf209d73f75e27abf 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files
@@ -1,11 +1,11 @@
 vtkPV3Foam.C
-vtkPV3FoamAddVolumeMesh.C
-vtkPV3FoamAddLagrangianMesh.C
-vtkPV3FoamAddPatchMesh.C
-vtkPV3FoamAddZoneMesh.C
-vtkPV3FoamAddSetMesh.C
-vtkPV3FoamUpdateInformation.C
-vtkPV3FoamConvertMesh.C
-vtkPV3FoamConvertFields.C
+vtkPV3FoamFields.C
+vtkPV3FoamMesh.C
+vtkPV3FoamMeshLagrangian.C
+vtkPV3FoamMeshPatch.C
+vtkPV3FoamMeshSet.C
+vtkPV3FoamMeshVolume.C
+vtkPV3FoamMeshZone.C
+vtkPV3FoamUpdateInfo.C
 
 LIB = $(FOAM_LIBBIN)/libvtkPV3Foam
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
index 2d6e5756ce9396cb168ae7f35a6ea36a148dc576..9595e37ff7a9c9ecd2a259f9974f0d783ebd1ee8 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
@@ -25,13 +25,12 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "vtkPV3Foam.H"
+#include "vtkPV3FoamReader.h"
 
 // Foam includes
-#include "Time.H"
 #include "fvMesh.H"
-#include "IOobjectList.H"
+#include "Time.H"
 #include "patchZones.H"
-#include "vtkPV3FoamReader.h"
 #include "IFstream.H"
 
 // VTK includes
@@ -54,8 +53,7 @@ defineTypeNameAndDebug(Foam::vtkPV3Foam, 0);
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 #include "vtkPV3FoamAddToSelection.H"
-#include "vtkPV3FoamUpdateInformationFields.H"
-
+#include "vtkPV3FoamUpdateInfoFields.H"
 
 void Foam::vtkPV3Foam::AddToBlock
 (
@@ -161,19 +159,19 @@ Foam::label Foam::vtkPV3Foam::GetNumberOfDataSets
 void Foam::vtkPV3Foam::resetCounters()
 {
     // Reset region ids and sizes
-    selectInfoVolume_.reset();
-    selectInfoPatches_.reset();
-    selectInfoLagrangian_.reset();
-    selectInfoCellZones_.reset();
-    selectInfoFaceZones_.reset();
-    selectInfoPointZones_.reset();
-    selectInfoCellSets_.reset();
-    selectInfoFaceSets_.reset();
-    selectInfoPointSets_.reset();
+    regionInfoVolume_.reset();
+    regionInfoPatches_.reset();
+    regionInfoLagrangian_.reset();
+    regionInfoCellZones_.reset();
+    regionInfoFaceZones_.reset();
+    regionInfoPointZones_.reset();
+    regionInfoCellSets_.reset();
+    regionInfoFaceSets_.reset();
+    regionInfoPointSets_.reset();
 }
 
 
-bool Foam::vtkPV3Foam::setTime(const double& requestedTime)
+int Foam::vtkPV3Foam::setTime(const double& requestedTime)
 {
     if (debug)
     {
@@ -186,17 +184,12 @@ bool Foam::vtkPV3Foam::setTime(const double& requestedTime)
     // Get times list
     instantList Times = runTime.times();
 
-    bool found = false;
-    int nearestIndex = Time::findClosestTimeIndex(Times, requestedTime);
+    int foundIndex = Time::findClosestTimeIndex(Times, requestedTime);
+    int nearestIndex = foundIndex;
 
-    if (nearestIndex == -1)
+    if (foundIndex < 0)
     {
         nearestIndex = 0;
-        found = false;
-    }
-    else
-    {
-        found = true;
     }
 
     // see what has changed
@@ -213,16 +206,17 @@ bool Foam::vtkPV3Foam::setTime(const double& requestedTime)
             if (meshPtr_->readUpdate() != polyMesh::UNCHANGED)
             {
                 meshChanged_ = true;
-                reader_->UpdateProgress(0.05);
-
-                // patches, zones etc might have changed
-                UpdateInformation();
             }
         }
         else
         {
             meshChanged_ = true;
         }
+
+        reader_->UpdateProgress(0.05);
+
+        // this seems to be needed for catching Lagrangian fields
+        updateInfo();
     }
 
     if (debug)
@@ -233,91 +227,109 @@ bool Foam::vtkPV3Foam::setTime(const double& requestedTime)
             << " fieldsChanged=" << fieldsChanged_ << endl;
     }
 
-    return found;
+    return foundIndex;
 }
 
 
-void Foam::vtkPV3Foam::updateSelectedRegions()
+void Foam::vtkPV3Foam::updateRegionStatus()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateSelectedRegions" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::updateRegionStatus" << endl;
     }
 
-    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
-
-    const label nSelect = arraySelection->GetNumberOfArrays();
-
-    if (selectedRegions_.size() != nSelect)
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
+    const label nSelect = regionSelection->GetNumberOfArrays();
+    if (regionStatus_.size() != nSelect)
     {
-        selectedRegions_.setSize(nSelect);
-        selectedRegions_ = 0;
+        regionStatus_.setSize(nSelect);
+        regionStatus_ = false;
         meshChanged_ = true;
     }
 
-    selectedRegionDatasetIds_.setSize(nSelect);
+    // this needs fixing if we wish to re-use the datasets
+    regionDataset_.setSize(nSelect);
+    regionDataset_ = -1;
 
     // Read the selected cell regions, zones, patches and add to region list
-    forAll (selectedRegions_, regionId)
+    forAll(regionStatus_, regionId)
     {
-        int setting = arraySelection->GetArraySetting(regionId);
+        int setting = regionSelection->GetArraySetting(regionId);
 
-        if (selectedRegions_[regionId] != setting)
+        if (regionStatus_[regionId] != setting)
         {
-            selectedRegions_[regionId] = setting;
+            regionStatus_[regionId] = setting;
             meshChanged_ = true;
         }
 
-        selectedRegionDatasetIds_[regionId] = -1;
-
         if (debug)
         {
             Info<< "  region[" << regionId << "] = "
-                << selectedRegions_[regionId]
-                << " : " << arraySelection->GetArrayName(regionId) << endl;
+                << regionStatus_[regionId]
+                << " : " << regionSelection->GetArrayName(regionId) << endl;
         }
     }
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::updateSelectedRegions" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::updateRegionStatus" << endl;
     }
 }
 
+Foam::wordHashSet Foam::vtkPV3Foam::getSelected
+(
+    vtkDataArraySelection* select
+)
+{
+    int nElem = select->GetNumberOfArrays();
+    wordHashSet selections(2*nElem);
+
+    for (int elemI=0; elemI < nElem; ++elemI)
+    {
+        if (select->GetArraySetting(elemI))
+        {
+            word name(getFirstWord(select->GetArrayName(elemI)));
+            selections.insert(name);
+        }
+    }
+
+    return selections;
+}
+
 
 Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 (
-    vtkDataArraySelection* arraySelection,
+    vtkDataArraySelection* select,
     const bool firstWord
 )
 {
-    stringList selections(arraySelection->GetNumberOfArrays());
+    stringList selections(select->GetNumberOfArrays());
     label nElem = 0;
 
     if (debug)
     {
         Info<< "available(";
-        forAll (selections, elemI)
+        forAll(selections, elemI)
         {
-            Info<< " \"" << arraySelection->GetArrayName(elemI) << "\"";
+            Info<< " \"" << select->GetArrayName(elemI) << "\"";
         }
         Info<< " )\n"
             << "selected(";
     }
 
-    forAll (selections, elemI)
+    forAll(selections, elemI)
     {
-        if (arraySelection->GetArraySetting(elemI))
+        if (select->GetArraySetting(elemI))
         {
             if (firstWord)
             {
                 selections[nElem] = getFirstWord
                 (
-                    arraySelection->GetArrayName(elemI)
+                    select->GetArrayName(elemI)
                 );
             }
             else
             {
-                selections[nElem] = arraySelection->GetArrayName(elemI);
+                selections[nElem] = select->GetArrayName(elemI);
             }
 
             if (debug)
@@ -341,7 +353,7 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 
 Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 (
-    vtkDataArraySelection* arraySelection,
+    vtkDataArraySelection* select,
     const selectionInfo& selector,
     const bool firstWord
 )
@@ -359,7 +371,7 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
             ++elemI
         )
         {
-            Info<< " \"" << arraySelection->GetArrayName(elemI) << "\"";
+            Info<< " \"" << select->GetArrayName(elemI) << "\"";
         }
 
         Info<< " )\n"
@@ -373,18 +385,18 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
         ++elemI
     )
     {
-        if (arraySelection->GetArraySetting(elemI))
+        if (select->GetArraySetting(elemI))
         {
             if (firstWord)
             {
                 selections[nElem] = getFirstWord
                 (
-                    arraySelection->GetArrayName(elemI)
+                    select->GetArrayName(elemI)
                 );
             }
             else
             {
-                selections[nElem] = arraySelection->GetArrayName(elemI);
+                selections[nElem] = select->GetArrayName(elemI);
             }
 
             if (debug)
@@ -408,7 +420,7 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 
 void Foam::vtkPV3Foam::setSelectedArrayEntries
 (
-    vtkDataArraySelection* arraySelection,
+    vtkDataArraySelection* select,
     const stringList& selections
 )
 {
@@ -416,13 +428,13 @@ void Foam::vtkPV3Foam::setSelectedArrayEntries
     {
         Info<< "<beg> Foam::vtkPV3Foam::setSelectedArrayEntries" << endl;
     }
-    const label nEntries = arraySelection->GetNumberOfArrays();
+    const label nEntries = select->GetNumberOfArrays();
 
     // Reset all current entries to 'not selected'
-    arraySelection->DisableAllArrays();
+    select->DisableAllArrays();
 
     // Loop through entries, setting values from selectedEntries
-    forAll (selections, elemI)
+    forAll(selections, elemI)
     {
         if (debug > 1)
         {
@@ -432,7 +444,7 @@ void Foam::vtkPV3Foam::setSelectedArrayEntries
 
         for (label i=0; i<nEntries; i++)
         {
-            string arrayName = arraySelection->GetArrayName(i);
+            string arrayName = select->GetArrayName(i);
 
             if (arrayName == selections[elemI])
             {
@@ -443,7 +455,7 @@ void Foam::vtkPV3Foam::setSelectedArrayEntries
                         << endl;
                 }
 
-                arraySelection->EnableArray(arrayName.c_str());
+                select->EnableArray(arrayName.c_str());
                 break;
             }
         }
@@ -466,20 +478,19 @@ Foam::vtkPV3Foam::vtkPV3Foam
     reader_(reader),
     dbPtr_(NULL),
     meshPtr_(NULL),
-    selectInfoVolume_("unzoned"),
-    selectInfoPatches_("patches"),
-    selectInfoLagrangian_("lagrangian"),
-    selectInfoCellZones_("cellZone"),
-    selectInfoFaceZones_("faceZone"),
-    selectInfoPointZones_("pointZone"),
-    selectInfoCellSets_("cellSet"),
-    selectInfoFaceSets_("faceSet"),
-    selectInfoPointSets_("pointSet"),
-    patchTextActorsPtrs_(0),
     nMesh_(0),
     timeIndex_(-1),
     meshChanged_(true),
-    fieldsChanged_(true)
+    fieldsChanged_(true),
+    regionInfoVolume_("unzoned"),
+    regionInfoPatches_("patches"),
+    regionInfoLagrangian_("lagrangian"),
+    regionInfoCellZones_("cellZone"),
+    regionInfoFaceZones_("faceZone"),
+    regionInfoPointZones_("pointZone"),
+    regionInfoCellSets_("cellSet"),
+    regionInfoFaceSets_("faceSet"),
+    regionInfoPointSets_("pointSet")
 {
     if (debug)
     {
@@ -528,11 +539,7 @@ Foam::vtkPV3Foam::vtkPV3Foam
 
     dbPtr_().functionObjects().off();
 
-    // Set initial cloud name
-    // TODO - TEMPORARY MEASURE UNTIL CAN PROCESS MULTIPLE CLOUDS
-    cloudName_ = "";
-
-    UpdateInformation();
+    updateInfo();
 }
 
 
@@ -551,22 +558,22 @@ Foam::vtkPV3Foam::~vtkPV3Foam()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-void Foam::vtkPV3Foam::UpdateInformation()
+void Foam::vtkPV3Foam::updateInfo()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::UpdateInformation"
-            << " [meshPtr=" << (meshPtr_ ? "set" : "NULL") << "] TimeStep="
-            << reader_->GetTimeStep() << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::updateInfo"
+            << " [meshPtr=" << (meshPtr_ ? "set" : "NULL") << "] timeIndex="
+            << timeIndex_ << endl;
     }
 
     resetCounters();
 
-    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
     stringList selectedEntries;
     // enable 'internalMesh' on the first call
-    if (arraySelection->GetNumberOfArrays() == 0 && !meshPtr_)
+    if (regionSelection->GetNumberOfArrays() == 0 && !meshPtr_)
     {
         selectedEntries.setSize(1);
         selectedEntries[0] = "internalMesh";
@@ -576,33 +583,25 @@ void Foam::vtkPV3Foam::UpdateInformation()
         // preserve the enabled selections
         selectedEntries = getSelectedArrayEntries
         (
-            arraySelection,
+            regionSelection,
             false
         );
     }
 
     // Clear current region list/array
-    arraySelection->RemoveAllArrays();
+    regionSelection->RemoveAllArrays();
 
-    // Update region array
-    updateInformationInternalMesh();
-    updateInformationLagrangian();
-    updateInformationPatches();
-
-    if (reader_->GetIncludeSets())
-    {
-        updateInformationSets();
-    }
-
-    if (reader_->GetIncludeZones())
-    {
-        updateInformationZones();
-    }
+    // Update region array - add Lagrangian at the bottom
+    updateInfoInternalMesh();
+    updateInfoPatches();
+    updateInfoSets();
+    updateInfoZones();
+    updateInfoLagrangian();
 
     // restore the enabled selections
     setSelectedArrayEntries
     (
-        arraySelection,
+        regionSelection,
         selectedEntries
     );
 
@@ -611,24 +610,20 @@ void Foam::vtkPV3Foam::UpdateInformation()
         fieldsChanged_ = true;
     }
 
-    // Update volField array
-    updateInformationFields<fvPatchField, volMesh>
+    // Update volume, point and lagrangian fields
+    updateInfoFields<fvPatchField, volMesh>
     (
         reader_->GetVolFieldSelection()
     );
-
-    // Update pointField array
-    updateInformationFields<pointPatchField, pointMesh>
+    updateInfoFields<pointPatchField, pointMesh>
     (
         reader_->GetPointFieldSelection()
     );
-
-    // Update lagrangian field array
-    updateInformationLagrangianFields();
+    updateInfoLagrangianFields();
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::UpdateInformation" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::updateInfo" << endl;
     }
 
 }
@@ -702,7 +697,7 @@ void Foam::vtkPV3Foam::Update
     reader_->UpdateProgress(0.1);
 
     // Set up region selection(s)
-    updateSelectedRegions();
+    updateRegionStatus();
 
     // Update the Foam mesh
     updateFoamMesh();
@@ -793,27 +788,23 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
     // Remove any patch names previously added to the renderer
     removePatchNames(renderer);
 
-    if (debug)
-    {
-        Info<< "<beg> Foam::vtkPV3Foam::addPatchNames" << endl;
-    }
-
     // get the display patches, strip off any suffix
     const stringList selectedPatches = getSelectedArrayEntries
     (
         reader_->GetRegionSelection(),
-        selectInfoPatches_,
+        regionInfoPatches_,
         true
     );
 
-    if (debug)
+    if (!selectedPatches.size())
     {
-        Info<<"... add patches: " << selectedPatches << endl;
+        return;
     }
 
-    if (!selectedPatches.size())
+    if (debug)
     {
-        return;
+        Info<< "<beg> Foam::vtkPV3Foam::addPatchNames" << nl
+            <<"... add patches: " << selectedPatches << endl;
     }
 
     const polyBoundaryMesh& pbMesh = meshPtr_->boundaryMesh();
@@ -977,11 +968,6 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
 
 void Foam::vtkPV3Foam::removePatchNames(vtkRenderer* renderer)
 {
-    if (debug)
-    {
-        Info<< "removePatchNames()" << endl;
-    }
-
     forAll(patchTextActorsPtrs_, patchI)
     {
         renderer->RemoveViewProp(patchTextActorsPtrs_[patchI]);
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
index f78ba346b4bff3f3101743721a217a0b3ed7adfb..3907348cc0348feb70f53f0c6e85b92d58b19f09 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
@@ -32,23 +32,22 @@ SourceFiles
     vtkPV3Foam.C
     vtkPV3Foam.H
     vtkPV3FoamI.H
-    vtkPV3FoamAddLagrangianMesh.C
-    vtkPV3FoamAddPatchMesh.C
-    vtkPV3FoamAddSetMesh.C
+    vtkPV3FoamFields.C
+    vtkPV3FoamMesh.C
+    vtkPV3FoamMeshLagrangian.C
+    vtkPV3FoamMeshPatch.C
+    vtkPV3FoamMeshSet.C
+    vtkPV3FoamMeshVolume.C
+    vtkPV3FoamMeshZone.C
+    vtkPV3FoamFaceField.H
+    vtkPV3FoamLagrangianFields.H
+    vtkPV3FoamPatchField.H
+    vtkPV3FoamPointFields.H
+    vtkPV3FoamPoints.H
+    vtkPV3FoamUpdateInfo.C
+    vtkPV3FoamUpdateInfoFields.H
+    vtkPV3FoamVolFields.H
     vtkPV3FoamAddToSelection.H
-    vtkPV3FoamAddVolumeMesh.C
-    vtkPV3FoamAddZoneMesh.C
-    vtkPV3FoamConvertFields.C
-    vtkPV3FoamConvertFaceField.H
-    vtkPV3FoamConvertLagrangianFields.H
-    vtkPV3FoamConvertMesh.C
-    vtkPV3FoamConvertPatchFaceField.H
-    vtkPV3FoamConvertPatchPointField.H
-    vtkPV3FoamConvertPointFields.H
-    vtkPV3FoamConvertVolFields.H
-    vtkPV3FoamInsertNextPoint.H
-    vtkPV3FoamUpdateInformation.C
-    vtkPV3FoamUpdateInformationFields.H
 
     // Needed by VTK:
     vtkDataArrayTemplateImplicit.txx
@@ -104,9 +103,55 @@ class List;
 
 class vtkPV3Foam
 {
-public:
+    // Private data
+
+        //- Access to the controlling vtkPV3FoamReader
+        vtkPV3FoamReader* reader_;
+
+        //- Foam time control
+        autoPtr<Time> dbPtr_;
+
+        //- Foam mesh
+        fvMesh* meshPtr_;
+
+        //- Number of meshes
+        // TODO - for info only - only set up to process ONE mesh
+        int nMesh_;
+
+        //- The time index
+        int timeIndex_;
 
-    // Public data
+        //- Track changes in mesh geometry
+        bool meshChanged_;
+
+        //- Track changes in fields
+        bool fieldsChanged_;
+
+        //- Cell-centre labels used as additional points for decomposed cells
+        labelList addPointCellLabels_;
+
+        //- Label of original cell for decomposed cells (internal mesh)
+        labelList superCells_;
+
+        //- Label of original cell for decomposed cells (cellZone meshes)
+        List<labelList> zoneSuperCells_;
+
+        //- Label of original cell for decomposed cells (cellSet meshes)
+        List<labelList> csetSuperCells_;
+
+        //- List of patch names
+        List<vtkTextActor*> patchTextActorsPtrs_;
+
+
+        //- Selected geometrical pieces
+        //  [0] = internal mesh, patches, zones, sets, lagrangian
+        boolList regionStatus_;
+
+        //- Selected regions indices in each respective block
+        labelList regionDataset_;
+
+
+    // Private classes
 
         //- bookkeeping for the GUI checklists and the multi-block organization
         class selectionInfo
@@ -177,87 +222,20 @@ public:
             {
                 size_ += n;
             }
-
-            friend Ostream& operator<<(Ostream& os, const selectionInfo& s)
-            {
-                os  << "selector: " << s.name_
-                    << " (block " << s.block_ << ") "
-                    << " = " << s.start_ << " + " << s.size_;
-                return os;
-            }
-
         };
 
-
-private:
-
     // Private data
 
-        //- Access to the controlling vtkPV3FoamReader
-        vtkPV3FoamReader* reader_;
-
-        //- Foam time control
-        autoPtr<Time> dbPtr_;
-
-        //- Foam mesh
-        fvMesh* meshPtr_;
-
         //- First instance and size of various regions
-        selectionInfo selectInfoVolume_;
-        selectionInfo selectInfoPatches_;
-        selectionInfo selectInfoLagrangian_;
-        selectionInfo selectInfoCellZones_;
-        selectionInfo selectInfoFaceZones_;
-        selectionInfo selectInfoPointZones_;
-        selectionInfo selectInfoCellSets_;
-        selectionInfo selectInfoFaceSets_;
-        selectionInfo selectInfoPointSets_;
-
-        //- Selected regions
-        //  [0] = internal mesh, then lagrangian, patches, zones, sets
-        boolList selectedRegions_;
-
-        //- Selected regions indices in each respective block
-        labelList selectedRegionDatasetIds_;
-
-        //- Labels of cell-centres used as additional points when decomposing
-        // polyhedra
-        labelList addPointCellLabels_;
-
-        //- Label of original cell for decomposed cells
-        //  - internal mesh
-        labelList superCells_;
-
-        //- Label of original cell for decomposed cells
-        //  - cellZone meshes
-        List<labelList> zoneSuperCells_;
-
-        //- Label of original cell for decomposed cells
-        //  - cellSet meshes
-        List<labelList> csetSuperCells_;
-
-        //- List of patch names
-        List<vtkTextActor*> patchTextActorsPtrs_;
-
-
-        // Dataset sizes
-
-            //- Number of meshes
-            // TODO - for info only - only set up to process ONE mesh
-            int nMesh_;
-
-            //- Cloud name to be processed
-            // TODO - currently only set up to process ONE cloud
-            word cloudName_;
-
-            //- The time index
-            int timeIndex_;
-
-            //- Track changes in mesh geometry
-            bool meshChanged_;
-
-            //- Track changes in fields
-            bool fieldsChanged_;
+        selectionInfo regionInfoVolume_;
+        selectionInfo regionInfoPatches_;
+        selectionInfo regionInfoLagrangian_;
+        selectionInfo regionInfoCellZones_;
+        selectionInfo regionInfoFaceZones_;
+        selectionInfo regionInfoPointZones_;
+        selectionInfo regionInfoCellSets_;
+        selectionInfo regionInfoFaceSets_;
+        selectionInfo regionInfoPointSets_;
 
 
     // Private Member Functions
@@ -296,44 +274,41 @@ private:
         // Update information helper functions
 
             //- Update the regions selected in the GUI
-            void updateSelectedRegions();
+            void updateRegionStatus();
 
             //- Internal mesh info
-            void updateInformationInternalMesh();
+            void updateInfoInternalMesh();
 
             //- Lagrangian info
-            void updateInformationLagrangian();
+            void updateInfoLagrangian();
 
             //- Patch info
-            void updateInformationPatches();
+            void updateInfoPatches();
 
             //- Set info
-            void updateInformationSets();
+            void updateInfoSets();
+
+            //- Zone info
+            void updateInfoZones();
 
             //- Read zone names for zoneType from file
             wordList readZoneNames(const word& zoneType);
 
-            //- Zone info
-            void updateInformationZones();
-
             //- Add to paraview array selection
             template<class Type>
             label addToSelection
             (
-                vtkDataArraySelection *arraySelection,
+                vtkDataArraySelection*,
                 const IOobjectList&,
                 const string& suffix=string::null
             );
 
             //- Field info
             template<template<class> class patchType, class meshType>
-            void updateInformationFields
-            (
-                vtkDataArraySelection *fieldSelection
-            );
+            void updateInfoFields(vtkDataArraySelection*);
 
             //- Lagrangian field info
-            void updateInformationLagrangianFields();
+            void updateInfoLagrangianFields();
 
 
         // Update helper functions
@@ -384,64 +359,48 @@ private:
         // Add mesh functions
 
             //- Add internal mesh/cell set meshes
-            void addVolumeMesh
+            vtkUnstructuredGrid* volumeVTKMesh
             (
                 const fvMesh&,
-                vtkUnstructuredGrid*,
                 labelList& superCells
             );
 
             //- Add Lagrangian mesh
-            void addLagrangianMesh
+            vtkPolyData* lagrangianVTKMesh
             (
                 const fvMesh&,
-                vtkPolyData*
+                const word& cloudName
             );
 
             //- Add patch mesh
-            void addPatchMesh
-            (
-                const polyPatch&,
-                vtkPolyData*
-            );
+            vtkPolyData* patchVTKMesh(const polyPatch&);
 
             //- Add face zone mesh
-            void addFaceZoneMesh
+            vtkPolyData* faceZoneVTKMesh
             (
                 const fvMesh&,
-                const labelList& faceLabels,
-                vtkPolyData*
+                const labelList& faceLabels
             );
 
             //- Add point zone
-            void addPointZoneMesh
-            (
-                const fvMesh&,
-                const labelList& pointLabels,
-                vtkPolyData*
-            );
-
-            //- Add cell set mesh
-            void addCellSetMesh
+            vtkPolyData* pointZoneVTKMesh
             (
                 const fvMesh&,
-                vtkUnstructuredGrid*
+                const labelList& pointLabels
             );
 
             //- Add face set mesh
-            void addFaceSetMesh
+            vtkPolyData* faceSetVTKMesh
             (
                 const fvMesh&,
-                const faceSet&,
-                vtkPolyData*
+                const faceSet&
             );
 
             //- Add point mesh
-            void addPointSetMesh
+            vtkPolyData* pointSetVTKMesh
             (
                 const fvMesh&,
-                const pointSet&,
-                vtkPolyData*
+                const pointSet&
             );
 
         // Field conversion functions
@@ -461,8 +420,8 @@ private:
         template<class GeoField>
         label addObjectsToSelection
         (
-            vtkDataArraySelection* fieldSelection,
-            const IOobjectList& objects,
+            vtkDataArraySelection*,
+            const IOobjectList&,
             const string& suffix=string::null
         );
 
@@ -474,14 +433,13 @@ private:
             void convertVolFields
             (
                 const fvMesh&,
-                const volPointInterpolation& pInterp,
+                const volPointInterpolation&,
                 const PtrList<PrimitivePatchInterpolation<primitivePatch> >&,
-                const IOobjectList& objects,
-                vtkDataArraySelection* fieldSelection,
+                const IOobjectList&,
                 vtkMultiBlockDataSet* output
             );
 
-            //- Volume field - all types except scalar
+            //- Volume field
             template<class Type>
             void convertVolField
             (
@@ -494,7 +452,7 @@ private:
 
             //- Patch field
             template<class Type>
-            void convertPatchFaceField
+            void convertPatchField
             (
                 const word& name,
                 const Field<Type>&,
@@ -531,13 +489,12 @@ private:
             template<class Type>
             void convertLagrangianFields
             (
-                const fvMesh&,
-                const IOobjectList& objects,
-                vtkDataArraySelection *fieldSelection,
-                vtkMultiBlockDataSet* output
+                const IOobjectList&,
+                vtkMultiBlockDataSet* output,
+                const label datasetNo
             );
 
-            //- Lagrangian field - all types except scalar
+            //- Lagrangian field
             template<class Type>
             void convertLagrangianField
             (
@@ -551,29 +508,29 @@ private:
             template<class Type>
             void convertPointFields
             (
-                const fvMesh& mesh,
-                const IOobjectList& objects,
-                vtkDataArraySelection *fieldSelection,
+                const fvMesh&,
+                const pointMesh&,
+                const IOobjectList&,
                 vtkMultiBlockDataSet* output
             );
 
-            //- Point fields - all types except scalar
+            //- Point fields
             template<class Type>
             void convertPointField
             (
-                const GeometricField<Type, pointPatchField, pointMesh>& ptf,
-                const GeometricField<Type, fvPatchField, volMesh>& tf,
+                const GeometricField<Type, pointPatchField, pointMesh>&,
+                const GeometricField<Type, fvPatchField, volMesh>&,
                 vtkMultiBlockDataSet* output,
                 const selectionInfo&,
                 const label datasetNo
             );
 
-            //- Patch point field - all types except scalar
+            //- Patch point field
             template<class Type>
             void convertPatchPointField
             (
                 const word& name,
-                const Field<Type>& tf,
+                const Field<Type>&,
                 vtkMultiBlockDataSet* output,
                 const selectionInfo&,
                 const label datasetNo
@@ -585,17 +542,27 @@ private:
             //- Extract up to the first non-word characters
             inline static word getFirstWord(const char*);
 
+            //- Subset an IOobjectList based on a hashSet
+            static void subsetObjectList
+            (
+                IOobjectList&,
+                const wordHashSet&
+            );
+
+            //- Store the current selection(s)
+            static wordHashSet getSelected(vtkDataArraySelection*);
+
             //- Store the current selection(s)
             static stringList getSelectedArrayEntries
             (
-                vtkDataArraySelection* arraySelection,
+                vtkDataArraySelection*,
                 const bool firstWord=false
             );
 
             //- Store the current selection(s) for a sub-selection
             static stringList getSelectedArrayEntries
             (
-                vtkDataArraySelection* arraySelection,
+                vtkDataArraySelection*,
                 const selectionInfo&,
                 const bool firstWord=false
             );
@@ -603,8 +570,8 @@ private:
             //- Set selection(s)
             static void setSelectedArrayEntries
             (
-                vtkDataArraySelection* arraySelection,
-                const stringList& selectedEntries
+                vtkDataArraySelection*,
+                const stringList&
             );
 
 
@@ -640,7 +607,7 @@ public:
     // Member Functions
 
         //- Update
-        void UpdateInformation();
+        void updateInfo();
 
         void Update
         (
@@ -658,10 +625,15 @@ public:
         //- Remove patch names from the display
         void removePatchNames(vtkRenderer* renderer);
 
-        //- set the runTime to the requested time
-        //  sets to "constant" on error
-        bool setTime(const double& requestedTime);
+        //- set the runTime to the requested time, returns the timeIndex
+        //  sets to "constant" on error and returns -1
+        int setTime(const double& requestedTime);
 
+        //- The current time index
+        int timeIndex() const
+        {
+           return timeIndex_;
+        }
 
      // Access
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddToSelection.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddToSelection.H
index 08a316268637a9e6c93a87804443a2410cb89127..7b9b0113acb5096bca3800c045b43c47e21c8115 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddToSelection.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddToSelection.H
@@ -28,6 +28,7 @@ License
 #define vtkPV3FoamAddToSelection_H
 
 // FOAM includes
+#include "IOobjectList.H"
 #include "SortableList.H"
 
 // VTK includes
@@ -38,7 +39,7 @@ License
 template<class Type>
 Foam::label Foam::vtkPV3Foam::addToSelection
 (
-    vtkDataArraySelection *arraySelection,
+    vtkDataArraySelection *select,
     const IOobjectList& objectLst,
     const string& suffix
 )
@@ -57,7 +58,7 @@ Foam::label Foam::vtkPV3Foam::addToSelection
     {
         objectNames.sort();
 
-        forAll (objectNames, objI)
+        forAll(objectNames, objI)
         {
             if (debug)
             {
@@ -67,14 +68,14 @@ Foam::label Foam::vtkPV3Foam::addToSelection
 
             if (suffix.size())
             {
-                arraySelection->AddArray
+                select->AddArray
                 (
                     (objectNames[objI] + suffix).c_str()
                 );
             }
             else
             {
-                arraySelection->AddArray
+                select->AddArray
                 (
                     objectNames[objI].c_str()
                 );
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertFields.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertFields.C
deleted file mode 100644
index 543fc63eb0ba23f4d0b58333c69bec87983043f3..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertFields.C
+++ /dev/null
@@ -1,233 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software; you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by the
-    Free Software Foundation; either version 2 of the License, or (at your
-    option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM; if not, write to the Free Software Foundation,
-    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-Description
-
-\*---------------------------------------------------------------------------*/
-
-#include "vtkPV3Foam.H"
-
-// Foam includes
-#include "IOobjectList.H"
-#include "vtkPV3FoamReader.h"
-
-// VTK includes
-#include "vtkDataArraySelection.h"
-#include "vtkPolyData.h"
-#include "vtkUnstructuredGrid.h"
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-#include "vtkPV3FoamConvertVolFields.H"
-#include "vtkPV3FoamConvertPointFields.H"
-#include "vtkPV3FoamConvertLagrangianFields.H"
-
-
-void Foam::vtkPV3Foam::convertVolFields
-(
-    vtkMultiBlockDataSet* output
-)
-{
-    if (debug)
-    {
-        Info<< "<beg> Foam::vtkPV3Foam::convertVolFields" << endl;
-        printMemory();
-    }
-
-    const fvMesh& mesh = *meshPtr_;
-
-    // Construct interpolation on the raw mesh
-    pointMesh pMesh(mesh);
-
-    // Search for list of objects for this time
-    IOobjectList objects(mesh, dbPtr_().timeName());
-
-    vtkDataArraySelection* arraySelection = reader_->GetVolFieldSelection();
-
-    // Convert volume fields
-    if (debug)
-    {
-        Info<< "converting Foam volume fields" << endl;
-    }
-
-    volPointInterpolation pInterp(mesh, pMesh);
-
-    PtrList<PrimitivePatchInterpolation<primitivePatch> >
-        ppInterpList(mesh.boundaryMesh().size());
-
-    forAll(ppInterpList, i)
-    {
-        ppInterpList.set
-        (
-            i,
-            new PrimitivePatchInterpolation<primitivePatch>
-            (
-                mesh.boundaryMesh()[i]
-            )
-        );
-    }
-
-    convertVolFields<Foam::scalar>
-    (
-        mesh, pInterp, ppInterpList, objects, arraySelection, output
-    );
-    convertVolFields<Foam::vector>
-    (
-        mesh, pInterp, ppInterpList, objects, arraySelection, output
-    );
-    convertVolFields<Foam::sphericalTensor>
-    (
-        mesh, pInterp, ppInterpList, objects, arraySelection, output
-    );
-    convertVolFields<Foam::symmTensor>
-    (
-        mesh, pInterp, ppInterpList, objects, arraySelection, output
-    );
-    convertVolFields<Foam::tensor>
-    (
-        mesh, pInterp, ppInterpList, objects, arraySelection, output
-    );
-
-    if (debug)
-    {
-        Info<< "<end> Foam::vtkPV3Foam::convertVolFields" << endl;
-        printMemory();
-    }
-}
-
-
-void Foam::vtkPV3Foam::convertPointFields
-(
-    vtkMultiBlockDataSet* output
-)
-{
-    if (debug)
-    {
-        Info<< "<beg> Foam::vtkPV3Foam::convertPointFields" << endl;
-        printMemory();
-    }
-
-    const fvMesh& mesh = *meshPtr_;
-
-    // Search for list of objects for this time
-    IOobjectList objects(mesh, dbPtr_().timeName());
-
-    vtkDataArraySelection* arraySelection = reader_->GetPointFieldSelection();
-
-    convertPointFields<Foam::scalar>
-    (
-        mesh, objects, arraySelection, output
-    );
-    convertPointFields<Foam::vector>
-    (
-        mesh, objects, arraySelection, output
-    );
-    convertPointFields<Foam::sphericalTensor>
-    (
-        mesh, objects, arraySelection, output
-    );
-    convertPointFields<Foam::symmTensor>
-    (
-        mesh, objects, arraySelection, output
-    );
-    convertPointFields<Foam::tensor>
-    (
-        mesh, objects, arraySelection, output
-    );
-
-    if (debug)
-    {
-        Info<< "<end> Foam::vtkPV3Foam::convertPointFields" << endl;
-        printMemory();
-    }
-}
-
-
-void Foam::vtkPV3Foam::convertLagrangianFields
-(
-    vtkMultiBlockDataSet* output
-)
-{
-    if (debug)
-    {
-        Info<< "<beg> Foam::vtkPV3Foam::convertLagrangianFields" << endl;
-        printMemory();
-    }
-
-    const fvMesh& mesh = *meshPtr_;
-
-    // Search for list of objects for this time
-    //- TODO - currently hard-coded to ONE cloud
-    IOobjectList objects
-    (
-        mesh,
-        dbPtr_().timeName(),
-        "lagrangian"/cloudName_
-    );
-
-    vtkDataArraySelection* arraySelection =
-        reader_->GetLagrangianFieldSelection();
-
-    // Convert Lagrangian fields
-    if (debug)
-    {
-        Info<< "converting Lagrangian fields - "
-            << selectInfoLagrangian_ << endl;
-    }
-
-    convertLagrangianFields<Foam::label>
-    (
-        mesh, objects, arraySelection, output
-    );
-
-    convertLagrangianFields<Foam::scalar>
-    (
-        mesh, objects, arraySelection, output
-    );
-    convertLagrangianFields<Foam::vector>
-    (
-        mesh, objects, arraySelection, output
-    );
-    convertLagrangianFields<Foam::sphericalTensor>
-    (
-        mesh, objects, arraySelection, output
-    );
-    convertLagrangianFields<Foam::symmTensor>
-    (
-        mesh, objects, arraySelection, output
-    );
-    convertLagrangianFields<Foam::tensor>
-    (
-        mesh, objects, arraySelection, output
-    );
-
-    if (debug)
-    {
-        Info<< "<end> Foam::vtkPV3Foam::convertLagrangianFields" << endl;
-        printMemory();
-    }
-}
-
-
-// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertLagrangianFields.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertLagrangianFields.H
deleted file mode 100644
index b77fadaa9d5971804b51274925b6476ab925b050..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertLagrangianFields.H
+++ /dev/null
@@ -1,151 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software; you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by the
-    Free Software Foundation; either version 2 of the License, or (at your
-    option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM; if not, write to the Free Software Foundation,
-    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-InClass
-    vtkPV3Foam
-
-\*---------------------------------------------------------------------------*/
-
-#ifndef vtkPV3FoamConvertLagrangianFields_H
-#define vtkPV3FoamConvertLagrangianFields_H
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-template<class Type>
-void Foam::vtkPV3Foam::convertLagrangianFields
-(
-    const fvMesh& mesh,
-    const IOobjectList& objects,
-    vtkDataArraySelection* fieldSelection,
-    vtkMultiBlockDataSet* output
-)
-{
-    const selectionInfo& selector = selectInfoLagrangian_;
-
-    IOobjectList fieldObjects
-    (
-        objects.lookupClass
-        (
-            IOField<Type>::typeName
-        )
-    );
-
-    label nFields = fieldSelection->GetNumberOfArrays();
-    for (label i=0; i<nFields; i++)
-    {
-        const word fieldName = fieldSelection->GetArrayName(i);
-
-        if
-        (
-            !fieldSelection->GetArraySetting(i)
-         || !fieldObjects.found(fieldName))
-        {
-            continue;
-        }
-
-        IOField<Type> iotf
-        (
-            IOobject
-            (
-                fieldName,
-                mesh.time().timeName(),
-                "lagrangian"/cloudName_,
-                mesh,
-                IOobject::MUST_READ
-            )
-        );
-
-
-        // Convert Lagrangian points
-        for
-        (
-            int regionId = selector.start();
-            regionId < selector.end();
-            ++regionId
-        )
-        {
-            if (selectedRegions_[regionId])
-            {
-                convertLagrangianField
-                (
-                    iotf, output, selector,
-                    selectedRegionDatasetIds_[regionId]
-                );
-            }
-        }
-    }
-}
-
-
-template<class Type>
-void Foam::vtkPV3Foam::convertLagrangianField
-(
-    const IOField<Type>& tf,
-    vtkMultiBlockDataSet* output,
-    const selectionInfo& selector,
-    const label datasetNo
-)
-{
-    const label nComp = pTraits<Type>::nComponents;
-
-    vtkPolyData* vtkmesh = vtkPolyData::SafeDownCast
-    (
-        GetDataSetFromBlock(output, selector, datasetNo)
-    );
-
-    vtkFloatArray *pointData = vtkFloatArray::New();
-    pointData->SetNumberOfTuples(tf.size());
-    pointData->SetNumberOfComponents(nComp);
-    pointData->Allocate(nComp*tf.size());
-    pointData->SetName(tf.name().c_str());
-
-    if (debug)
-    {
-        Info<< "converting Lagrangian <Type>Field: " << tf.name() << nl
-            << "tf.size() = " << tf.size() << nl
-            << "nComp  = " << nComp << endl;
-    }
-
-    float vec[nComp];
-
-    forAll(tf, i)
-    {
-        for (direction d=0; d<nComp; d++)
-        {
-            vec[d] = component(tf[i], d);
-        }
-
-        pointData->InsertTuple(i, vec);
-    }
-
-    vtkmesh->GetPointData()->AddArray(pointData);
-    pointData->Delete();
-}
-
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#endif
-
-// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertFaceField.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamFaceField.H
similarity index 80%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertFaceField.H
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamFaceField.H
index 114aab667a5f9347b799b53e8274f0495ede37c4..7ab511a5215d5cd306d1a3de87c2877f78e414c2 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertFaceField.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamFaceField.H
@@ -27,8 +27,8 @@ InClass
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef vtkPV3FoamConvertFaceField_H
-#define vtkPV3FoamConvertFaceField_H
+#ifndef vtkPV3FoamFaceField_H
+#define vtkPV3FoamFaceField_H
 
 // VTK includes
 #include "vtkCellData.h"
@@ -60,13 +60,24 @@ void Foam::vtkPV3Foam::convertFaceField
     const labelList& faceNeigh = mesh.faceNeighbour();
 
     vtkFloatArray *cellData = vtkFloatArray::New();
-    cellData->SetNumberOfTuples(faceLabels.size());
-    cellData->SetNumberOfComponents(nComp);
-    cellData->Allocate(nComp*faceLabels.size());
-    cellData->SetName(tf.name().c_str());
+    cellData->SetNumberOfTuples( faceLabels.size() );
+    cellData->SetNumberOfComponents( nComp );
+    cellData->Allocate( nComp*faceLabels.size() );
+    cellData->SetName( tf.name().c_str() );
+
+    if (debug)
+    {
+        Info<< "convert convertFaceField: "
+            << tf.name()
+            << " size = " << tf.size()
+            << " nComp=" << nComp
+            << " nTuples = " << faceLabels.size() <<  endl;
+    }
 
     float vec[nComp];
 
+    // for interior faces: average owner/neighbour
+    // for boundary faces: owner
     forAll(faceLabels, faceI)
     {
         const label faceNo = faceLabels[faceI];
@@ -119,13 +130,24 @@ void Foam::vtkPV3Foam::convertFaceField
     const labelList& faceNeigh = mesh.faceNeighbour();
 
     vtkFloatArray *cellData = vtkFloatArray::New();
-    cellData->SetNumberOfTuples(fSet.size());
-    cellData->SetNumberOfComponents(nComp);
-    cellData->Allocate(nComp*fSet.size());
-    cellData->SetName(tf.name().c_str());
+    cellData->SetNumberOfTuples( fSet.size() );
+    cellData->SetNumberOfComponents( nComp );
+    cellData->Allocate( nComp*fSet.size() );
+    cellData->SetName( tf.name().c_str() );
+
+    if (debug)
+    {
+        Info<< "convert convertFaceField: "
+            << tf.name()
+            << " size = " << tf.size()
+            << " nComp=" << nComp
+            << " nTuples = " << fSet.size() <<  endl;
+    }
 
     float vec[nComp];
 
+    // for interior faces: average owner/neighbour
+    // for boundary faces: owner
     label faceI = 0;
     forAllConstIter(faceSet, fSet, iter)
     {
@@ -157,7 +179,6 @@ void Foam::vtkPV3Foam::convertFaceField
     cellData->Delete();
 }
 
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #endif
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamFields.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamFields.C
new file mode 100644
index 0000000000000000000000000000000000000000..bff8d615291b0af7a10c2dd6907cdae2812043d0
--- /dev/null
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamFields.C
@@ -0,0 +1,332 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#include "vtkPV3Foam.H"
+
+// Foam includes
+#include "IOobjectList.H"
+#include "vtkPV3FoamReader.h"
+
+// VTK includes
+#include "vtkDataArraySelection.h"
+#include "vtkPolyData.h"
+#include "vtkUnstructuredGrid.h"
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+#include "vtkPV3FoamVolFields.H"
+#include "vtkPV3FoamPointFields.H"
+#include "vtkPV3FoamLagrangianFields.H"
+
+
+void Foam::vtkPV3Foam::subsetObjectList
+(
+    IOobjectList& objects,
+    const wordHashSet& selected
+)
+{
+    // hash all the selected field names
+    if (!selected.size())
+    {
+        objects.clear();
+    }
+
+    // only keep selected fields
+    forAllIter(IOobjectList, objects, iter)
+    {
+        if (!selected.found(iter()->name()))
+        {
+            objects.erase(iter);
+        }
+    }
+}
+
+
+void Foam::vtkPV3Foam::convertVolFields
+(
+    vtkMultiBlockDataSet* output
+)
+{
+    wordHashSet selectedFields = getSelected
+    (
+        reader_->GetVolFieldSelection()
+    );
+
+    if (!selectedFields.size())
+    {
+        return;
+    }
+
+    const fvMesh& mesh = *meshPtr_;
+
+    // Get objects (fields) for this time - only keep selected fields
+    IOobjectList objects(mesh, dbPtr_().timeName());
+    subsetObjectList(objects, selectedFields);
+
+    if (!objects.size())
+    {
+        return;
+    }
+
+    if (debug)
+    {
+        Info<< "<beg> Foam::vtkPV3Foam::convertVolFields" << nl
+            << "converting Foam volume fields" << endl;
+        forAllConstIter(IOobjectList, objects, iter)
+        {
+            Info<< "  " << iter()->name()
+                << " == " << iter()->objectPath() << nl;
+        }
+        printMemory();
+    }
+
+    // Construct interpolation on the raw mesh
+    pointMesh pMesh(mesh);
+    volPointInterpolation pInterp(mesh, pMesh);
+
+    PtrList<PrimitivePatchInterpolation<primitivePatch> >
+        ppInterpList(mesh.boundaryMesh().size());
+
+    forAll(ppInterpList, i)
+    {
+        ppInterpList.set
+        (
+            i,
+            new PrimitivePatchInterpolation<primitivePatch>
+            (
+                mesh.boundaryMesh()[i]
+            )
+        );
+    }
+
+
+    convertVolFields<scalar>
+    (
+        mesh, pInterp, ppInterpList, objects, output
+    );
+    convertVolFields<vector>
+    (
+        mesh, pInterp, ppInterpList, objects, output
+    );
+    convertVolFields<sphericalTensor>
+    (
+        mesh, pInterp, ppInterpList, objects, output
+    );
+    convertVolFields<symmTensor>
+    (
+        mesh, pInterp, ppInterpList, objects, output
+    );
+    convertVolFields<tensor>
+    (
+        mesh, pInterp, ppInterpList, objects, output
+    );
+
+    if (debug)
+    {
+        Info<< "<end> Foam::vtkPV3Foam::convertVolFields" << endl;
+        printMemory();
+    }
+}
+
+
+void Foam::vtkPV3Foam::convertPointFields
+(
+    vtkMultiBlockDataSet* output
+)
+{
+    wordHashSet selectedFields = getSelected
+    (
+        reader_->GetPointFieldSelection()
+    );
+
+    if (!selectedFields.size())
+    {
+        return;
+    }
+
+    const fvMesh& mesh = *meshPtr_;
+
+    // Get objects (fields) for this time - only keep selected fields
+    IOobjectList objects(mesh, dbPtr_().timeName());
+
+    subsetObjectList(objects, selectedFields);
+
+    if (!objects.size())
+    {
+        return;
+    }
+
+    if (debug)
+    {
+        Info<< "<beg> Foam::vtkPV3Foam::convertPointFields" << nl
+            << "converting Foam volume fields" << endl;
+        forAllConstIter(IOobjectList, objects, iter)
+        {
+            Info<< "  " << iter()->name()
+                << " == " << iter()->objectPath() << nl;
+        }
+        printMemory();
+    }
+
+    // Construct interpolation on the raw mesh
+    pointMesh pMesh(mesh);
+
+
+    convertPointFields<scalar>
+    (
+        mesh, pMesh, objects, output
+    );
+    convertPointFields<vector>
+    (
+        mesh, pMesh, objects, output
+    );
+    convertPointFields<sphericalTensor>
+    (
+        mesh, pMesh, objects, output
+    );
+    convertPointFields<symmTensor>
+    (
+        mesh, pMesh, objects, output
+    );
+    convertPointFields<tensor>
+    (
+        mesh, pMesh, objects, output
+    );
+
+    if (debug)
+    {
+        Info<< "<end> Foam::vtkPV3Foam::convertPointFields" << endl;
+        printMemory();
+    }
+}
+
+
+void Foam::vtkPV3Foam::convertLagrangianFields
+(
+    vtkMultiBlockDataSet* output
+)
+{
+    wordHashSet selectedFields = getSelected
+    (
+        reader_->GetLagrangianFieldSelection()
+    );
+
+    if (!selectedFields.size())
+    {
+        return;
+    }
+
+    const fvMesh& mesh = *meshPtr_;
+    selectionInfo& selector = regionInfoLagrangian_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
+
+    if (debug)
+    {
+        Info<< "<beg> Foam::vtkPV3Foam::convertLagrangianFields" << endl;
+        printMemory();
+    }
+
+    for
+    (
+        int regionId = selector.start();
+        regionId < selector.end();
+        ++regionId
+    )
+    {
+        const label datasetNo = regionDataset_[regionId];
+
+        if (!regionStatus_[regionId] || datasetNo < 0)
+        {
+            continue;
+        }
+
+        word cloudName = getFirstWord
+        (
+            regionSelection->GetArrayName(regionId)
+        );
+
+        // Get the Lagrangian fields for this time and this cloud
+        // but only keep selected fields
+        IOobjectList objects
+        (
+            mesh,
+            dbPtr_().timeName(),
+            "lagrangian"/cloudName
+        );
+        subsetObjectList(objects, selectedFields);
+
+        if (!objects.size())
+        {
+            continue;
+        }
+
+        if (debug)
+        {
+            Info<< "converting Foam lagrangian fields" << nl;
+            forAllConstIter(IOobjectList, objects, iter)
+            {
+                Info<< "  " << iter()->name()
+                    << " == " << iter()->objectPath() << nl;
+            }
+        }
+
+        convertLagrangianFields<label>
+        (
+            objects, output, datasetNo
+        );
+        convertLagrangianFields<scalar>
+        (
+            objects, output, datasetNo
+        );
+        convertLagrangianFields<vector>
+        (
+            objects, output, datasetNo
+        );
+        convertLagrangianFields<sphericalTensor>
+        (
+            objects, output, datasetNo
+        );
+        convertLagrangianFields<symmTensor>
+        (
+            objects, output, datasetNo
+        );
+        convertLagrangianFields<tensor>
+        (
+            objects, output, datasetNo
+        );
+    }
+
+    if (debug)
+    {
+        Info<< "<end> Foam::vtkPV3Foam::convertLagrangianFields" << endl;
+        printMemory();
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPatchPointField.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamLagrangianFields.H
similarity index 63%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPatchPointField.H
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamLagrangianFields.H
index a793958218a2084299fc9a4fd50b85bb9d9078f4..6a6056086bea5c9ff155bc4f201b3298665f49b4 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPatchPointField.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamLagrangianFields.H
@@ -27,19 +27,42 @@ InClass
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef vtkPV3FoamConvertPatchPointField_H
-#define vtkPV3FoamConvertPatchPointField_H
-
-// VTK includes
-#include "vtkPointData.h"
+#ifndef vtkPV3FoamLagrangianFields_H
+#define vtkPV3FoamLagrangianFields_H
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 template<class Type>
-void Foam::vtkPV3Foam::convertPatchPointField
+void Foam::vtkPV3Foam::convertLagrangianFields
+(
+    const IOobjectList& objects,
+    vtkMultiBlockDataSet* output,
+    const label datasetNo
+)
+{
+    const selectionInfo& selector = regionInfoLagrangian_;
+
+    // field subset based on type
+    IOobjectList fieldObjects
+    (
+        objects.lookupClass
+        (
+            IOField<Type>::typeName
+        )
+    );
+
+    forAllIter(IOobjectList, fieldObjects, iter)
+    {
+        IOField<Type> tf(*iter());
+        convertLagrangianField(tf, output, selector, datasetNo);
+    }
+}
+
+
+template<class Type>
+void Foam::vtkPV3Foam::convertLagrangianField
 (
-    const word& name,
-    const Field<Type>& pptf,
+    const IOField<Type>& tf,
     vtkMultiBlockDataSet* output,
     const selectionInfo& selector,
     const label datasetNo
@@ -53,18 +76,27 @@ void Foam::vtkPV3Foam::convertPatchPointField
     );
 
     vtkFloatArray *pointData = vtkFloatArray::New();
-    pointData->SetNumberOfTuples(pptf.size());
-    pointData->SetNumberOfComponents(nComp);
-    pointData->Allocate(nComp*pptf.size());
-    pointData->SetName(name.c_str());
+    pointData->SetNumberOfTuples( tf.size() );
+    pointData->SetNumberOfComponents( nComp );
+    pointData->Allocate( nComp*tf.size() );
+    pointData->SetName( tf.name().c_str() );
 
-    float vec[nComp];
+    if (debug)
+    {
+        Info<< "convert LagrangianField: "
+            << tf.name()
+            << " size = " << tf.size()
+            << " nComp=" << nComp
+            << " nTuples = " << tf.size() <<  endl;
+    }
 
-    forAll(pptf, i)
+    float vec[nComp];
+    forAll(tf, i)
     {
+        const Type& t = tf[i];
         for (direction d=0; d<nComp; d++)
         {
-            vec[d] = component(pptf[i], d);
+            vec[d] = component(t, d);
         }
 
         pointData->InsertTuple(i, vec);
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMesh.C
similarity index 50%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMesh.C
index acd0ed5f0380fbd54392558d3f225998f722b2f2..3c5cc6fa933b154c84f0a046e833f5435ba2d9f0 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMesh.C
@@ -56,13 +56,14 @@ void Foam::vtkPV3Foam::convertMeshVolume
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoVolume_;
+    selectionInfo& selector = regionInfoVolume_;
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
-    // Create the internal mesh and add as dataset 0
+    // Create the internalMesh
+    // TODO: multiple regions
     for
     (
         int regionId = selector.start();
@@ -70,34 +71,33 @@ void Foam::vtkPV3Foam::convertMeshVolume
         ++regionId
     )
     {
-        if (!selectedRegions_[regionId])
+        if (!regionStatus_[regionId])
         {
             continue;
         }
 
-        // word selectName = getFirstWord
-        // (
-        //     arraySelection->GetArrayName(regionId)
-        // );
-
         if (debug)
         {
             Info<< "Creating VTK internalMesh" << endl;
         }
 
-        const label datasetId = 0;
-
-        vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::New();
-        addVolumeMesh(mesh, vtkmesh, superCells_);
+        vtkUnstructuredGrid* vtkmesh = volumeVTKMesh
+        (
+            mesh,
+            superCells_
+        );
 
-        AddToBlock(output, selector, datasetId, vtkmesh, "internalMesh");
-        selectedRegionDatasetIds_[regionId] = datasetId;
-        vtkmesh->Delete();
+        if (vtkmesh)
+        {
+            AddToBlock(output, selector, datasetNo, vtkmesh, "internalMesh");
+            vtkmesh->Delete();
 
-        created = true;
+            regionDataset_[regionId] = datasetNo++;
+        }
     }
 
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
@@ -123,13 +123,14 @@ void Foam::vtkPV3Foam::convertMeshLagrangian
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoLagrangian_;
+    selectionInfo& selector = regionInfoLagrangian_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
-    // Create a single Lagrangian mesh and add as dataset 0
+    // Create Lagrangian meshes
     for
     (
         int regionId = selector.start();
@@ -137,29 +138,28 @@ void Foam::vtkPV3Foam::convertMeshLagrangian
         ++regionId
     )
     {
-        if (!selectedRegions_[regionId])
+        if (!regionStatus_[regionId])
         {
             continue;
         }
 
-        if (debug)
-        {
-            Info<< "Creating VTK Lagrangian mesh" << endl;
-        }
-
-        const label datasetId = 0;
-
-        vtkPolyData* vtkmesh = vtkPolyData::New();
-        addLagrangianMesh(mesh, vtkmesh);
+        word cloudName = getFirstWord
+        (
+            regionSelection->GetArrayName(regionId)
+        );
 
-        AddToBlock(output, selector, datasetId, vtkmesh, cloudName_);
-        selectedRegionDatasetIds_[regionId] = datasetId;
-        vtkmesh->Delete();
+        vtkPolyData* vtkmesh = lagrangianVTKMesh(mesh, cloudName);
+        if (vtkmesh)
+        {
+            AddToBlock(output, selector, datasetNo, vtkmesh, cloudName);
+            vtkmesh->Delete();
 
-        created = true;
+            regionDataset_[regionId] = datasetNo++;
+        }
     }
 
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
@@ -185,18 +185,17 @@ void Foam::vtkPV3Foam::convertMeshPatches
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoPatches_;
-    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
+    selectionInfo& selector = regionInfoPatches_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
     if (selector.size())
     {
         const polyBoundaryMesh& patches = mesh.boundaryMesh();
 
-        // Create the patches and add as dataset ...
         for
         (
             int regionId = selector.start();
@@ -204,52 +203,41 @@ void Foam::vtkPV3Foam::convertMeshPatches
             ++regionId
         )
         {
-            if (!selectedRegions_[regionId])
-            {
-                continue;
-            }
-
-            word selectName = getFirstWord
+            word patchName = getFirstWord
             (
-                arraySelection->GetArrayName(regionId)
+                regionSelection->GetArrayName(regionId)
             );
 
-            const label patchId = patches.findPatchID(selectName);
+            label patchId = patches.findPatchID(patchName);
 
-            if (debug)
+            if (!regionStatus_[regionId] || patchId < 0)
             {
-                Info<< "Creating VTK mesh for patch: " << selectName
-                    << " region index: " << regionId << endl;
+                continue;
             }
 
-            const label datasetId = GetNumberOfDataSets(output, selector);
-
-            vtkPolyData* vtkmesh = vtkPolyData::New();
-            addPatchMesh
-            (
-                patches[patchId],
-                vtkmesh
-            );
+            if (debug)
+            {
+                Info<< "Creating VTK mesh for patch: " << patchName
+                    << " patch index: " << patchId << endl;
+            }
 
-            AddToBlock
-            (
-                output, selector, datasetId, vtkmesh,
-                selectName + ":patch"
-            );
-            selectedRegionDatasetIds_[regionId] = datasetId;
-            vtkmesh->Delete();
+            vtkPolyData* vtkmesh = patchVTKMesh(patches[patchId]);
+            if (vtkmesh)
+            {
+                AddToBlock(output, selector, datasetNo, vtkmesh, patchName);
+                vtkmesh->Delete();
 
-            created = true;
+                regionDataset_[regionId] = datasetNo++;
+            }
         }
     }
 
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
 
-
-
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshPatches" << endl;
@@ -271,23 +259,32 @@ void Foam::vtkPV3Foam::convertMeshCellZones
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoCellZones_;
+    selectionInfo& selector = regionInfoCellZones_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
-    // Create the cell zone(s) and add as DataSet(CELLZONE, 0..n)
     if (selector.size())
     {
-        const cellZoneMesh& czMesh = mesh.cellZones();
+        const cellZoneMesh& zMesh = mesh.cellZones();
 
-        // use the zoneId directly instead of the name
-        for (int zoneI=0; zoneI < selector.size(); ++zoneI)
+        for
+        (
+            int regionId = selector.start();
+            regionId < selector.end();
+            ++regionId
+        )
         {
-            const int regionId = selector.start() + zoneI;
+            word zoneName = getFirstWord
+            (
+                regionSelection->GetArrayName(regionId)
+            );
+
+            label zoneId = zMesh.findZoneID(zoneName);
 
-            if (!selectedRegions_[regionId])
+            if (!regionStatus_[regionId] || zoneId < 0)
             {
                 continue;
             }
@@ -295,43 +292,41 @@ void Foam::vtkPV3Foam::convertMeshCellZones
             if (debug)
             {
                 Info<< "Creating VTK mesh for cellZone: "
-                    << zoneI << endl;
+                    << zoneId << endl;
             }
 
             fvMeshSubset subsetter(mesh);
-            subsetter.setLargeCellSubset(czMesh[zoneI]);
+            subsetter.setLargeCellSubset(zMesh[zoneId]);
 
-            const label datasetId = GetNumberOfDataSets(output, selector);
-
-            vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::New();
-
-            addVolumeMesh
+            vtkUnstructuredGrid* vtkmesh = volumeVTKMesh
             (
                 subsetter.subMesh(),
-                vtkmesh,
-                zoneSuperCells_[datasetId]
+                zoneSuperCells_[datasetNo]
             );
 
-            // renumber - superCells must contain global cell ids
-            inplaceRenumber
-            (
-                subsetter.cellMap(),
-                zoneSuperCells_[datasetId]
-            );
-
-            AddToBlock
-            (
-                output, selector, datasetId, vtkmesh,
-                czMesh.names()[zoneI] + ":cellZone"
-            );
-            selectedRegionDatasetIds_[regionId] = datasetId;
-            vtkmesh->Delete();
-
-            created = true;
+            if (vtkmesh)
+            {
+                // renumber - superCells must contain global cell ids
+                inplaceRenumber
+                (
+                    subsetter.cellMap(),
+                    zoneSuperCells_[datasetNo]
+                );
+
+                AddToBlock
+                (
+                    output, selector, datasetNo, vtkmesh,
+                    zMesh[zoneId].name() + ":cellZone"
+                );
+                vtkmesh->Delete();
+
+                regionDataset_[regionId] = datasetNo++;
+            }
         }
     }
 
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
@@ -357,12 +352,12 @@ void Foam::vtkPV3Foam::convertMeshCellSets
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoCellSets_;
-    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
+    selectionInfo& selector = regionInfoCellSets_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
     // Create the cell sets and add as dataset
     if (selector.size())
@@ -373,57 +368,55 @@ void Foam::vtkPV3Foam::convertMeshCellSets
             regionId < selector.end();
             ++regionId)
         {
-            if (!selectedRegions_[regionId])
+            if (!regionStatus_[regionId])
             {
                 continue;
             }
 
-            word selectName = getFirstWord
+            word selectedName = getFirstWord
             (
-                arraySelection->GetArrayName(regionId)
+                regionSelection->GetArrayName(regionId)
             );
 
             if (debug)
             {
-                Info<< "Creating VTK mesh for cellSet: " << selectName
+                Info<< "Creating VTK mesh for cellSet: " << selectedName
                     << " region index: " << regionId << endl;
             }
 
-            const cellSet cSet(mesh, selectName);
+            const cellSet cSet(mesh, selectedName);
             fvMeshSubset subsetter(mesh);
             subsetter.setLargeCellSubset(cSet);
 
-            const label datasetId = GetNumberOfDataSets(output, selector);
-
-            vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::New();
-
-            addVolumeMesh
+            vtkUnstructuredGrid* vtkmesh = volumeVTKMesh
             (
                 subsetter.subMesh(),
-                vtkmesh,
-                csetSuperCells_[datasetId]
-            );
-
-            // renumber - superCells must contain global cell ids
-            inplaceRenumber
-            (
-                subsetter.cellMap(),
-                csetSuperCells_[datasetId]
+                csetSuperCells_[datasetNo]
             );
 
-            AddToBlock
-            (
-                output, selector, datasetId, vtkmesh,
-                selectName + ":cellSet"
-            );
-            selectedRegionDatasetIds_[regionId] = datasetId;
-            vtkmesh->Delete();
-
-            created = true;
+            if (vtkmesh)
+            {
+                // renumber - superCells must contain global cell ids
+                inplaceRenumber
+                (
+                    subsetter.cellMap(),
+                    csetSuperCells_[datasetNo]
+                );
+
+                AddToBlock
+                (
+                    output, selector, datasetNo, vtkmesh,
+                    selectedName + ":cellSet"
+                );
+                vtkmesh->Delete();
+
+                regionDataset_[regionId] = datasetNo++;
+            }
         }
     }
 
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
@@ -449,58 +442,65 @@ void Foam::vtkPV3Foam::convertMeshFaceZones
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoFaceZones_;
+    selectionInfo& selector = regionInfoFaceZones_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
-    // Create the cell zone(s) and add as datasets
+    // Create the cell zone(s)
     if (selector.size())
     {
-        const faceZoneMesh& fzMesh = mesh.faceZones();
+        const faceZoneMesh& zMesh = mesh.faceZones();
 
-        // use the zoneId directly instead of the name
-        for (int zoneI=0; zoneI < selector.size(); ++zoneI)
+        for
+        (
+            int regionId = selector.start();
+            regionId < selector.end();
+            ++regionId
+        )
         {
-            const int regionId = selector.start() + zoneI;
+            word zoneName = getFirstWord
+            (
+                regionSelection->GetArrayName(regionId)
+            );
+
+            const label zoneId = zMesh.findZoneID(zoneName);
 
-            if (!selectedRegions_[regionId])
+            if (!regionStatus_[regionId] || zoneId < 0)
             {
                 continue;
             }
 
             if (debug)
             {
-                Info<< "Creating VTK mesh for faceZone: "
-                    << zoneI << endl;
+                Info<< "Creating VTK mesh for faceZone[" << zoneId
+                    << "] " << zoneName << endl;
             }
 
-            const label datasetId = GetNumberOfDataSets(output, selector);
-
-            vtkPolyData* vtkmesh = vtkPolyData::New();
-
-            addFaceZoneMesh
+            vtkPolyData* vtkmesh = faceZoneVTKMesh
             (
                 mesh,
-                fzMesh[zoneI],
-                vtkmesh
+                zMesh[zoneId]
             );
 
-            AddToBlock
-            (
-                output, selector, datasetId, vtkmesh,
-                fzMesh.names()[zoneI] + ":faceZone"
-            );
-            selectedRegionDatasetIds_[regionId] = datasetId;
-            vtkmesh->Delete();
-
-            created = true;
+            if (vtkmesh)
+            {
+                AddToBlock
+                (
+                    output, selector, datasetNo, vtkmesh,
+                    zMesh[zoneId].name() + ":faceZone"
+                );
+                vtkmesh->Delete();
+
+                regionDataset_[regionId] = datasetNo++;
+            }
         }
     }
 
-
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
@@ -526,12 +526,12 @@ void Foam::vtkPV3Foam::convertMeshFaceSets
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoFaceSets_;
-    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
+    selectionInfo& selector = regionInfoFaceSets_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
     // Create the face sets and add as dataset
     if (selector.size())
@@ -543,47 +543,46 @@ void Foam::vtkPV3Foam::convertMeshFaceSets
             ++regionId
         )
         {
-            if (!selectedRegions_[regionId])
+            if (!regionStatus_[regionId])
             {
                 continue;
             }
 
-            word selectName = getFirstWord
+            word selectedName = getFirstWord
             (
-                arraySelection->GetArrayName(regionId)
+                regionSelection->GetArrayName(regionId)
             );
 
             if (debug)
             {
-                Info<< "Creating VTK mesh for faceSet: " << selectName
+                Info<< "Creating VTK mesh for faceSet: " << selectedName
                     << " region index: " << regionId << endl;
             }
 
-            const faceSet fSet(mesh, selectName);
-
-            const label datasetId = GetNumberOfDataSets(output, selector);
+            const faceSet fSet(mesh, selectedName);
 
-            vtkPolyData* vtkmesh = vtkPolyData::New();
-            addFaceSetMesh
+            vtkPolyData* vtkmesh = faceSetVTKMesh
             (
                 mesh,
-                fSet,
-                vtkmesh
+                fSet
             );
 
-            AddToBlock
-            (
-                output, selector, datasetId, vtkmesh,
-                selectName + ":faceSet"
-            );
-            selectedRegionDatasetIds_[regionId] = datasetId;
-            vtkmesh->Delete();
-
-            created = true;
+            if (vtkmesh)
+            {
+                AddToBlock
+                (
+                    output, selector, datasetNo, vtkmesh,
+                    selectedName + ":faceSet"
+                );
+                vtkmesh->Delete();
+
+                regionDataset_[regionId] = datasetNo++;
+            }
         }
     }
 
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
@@ -609,62 +608,58 @@ void Foam::vtkPV3Foam::convertMeshPointZones
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoPointZones_;
+    selectionInfo& selector = regionInfoPointZones_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
-    // Create the point sets and add as dataset
     if (selector.size())
     {
-        const pointZoneMesh& pzMesh = mesh.pointZones();
+        const pointZoneMesh& zMesh = mesh.pointZones();
 
-        // use the zoneId directly instead of the name
-        for (int zoneI=0; zoneI < selector.size(); ++zoneI)
+        for
+        (
+            int regionId = selector.start();
+            regionId < selector.end();
+            ++regionId
+        )
         {
-            const int regionId = selector.start() + zoneI;
+            word zoneName = getFirstWord
+            (
+                regionSelection->GetArrayName(regionId)
+            );
+
+            label zoneId = zMesh.findZoneID(zoneName);
 
-            if (!selectedRegions_[regionId])
+            if (!regionStatus_[regionId] || zoneId < 0)
             {
                 continue;
             }
 
-            if (debug)
+            vtkPolyData* vtkmesh = pointZoneVTKMesh(mesh, zMesh[zoneId]);
+
+            if (vtkmesh)
             {
-                Info<< "Creating VTK mesh for pointZone: "
-                    << zoneI << endl;
+                AddToBlock
+                (
+                    output, selector, datasetNo, vtkmesh,
+                    zMesh[zoneId].name() + ":pointZone"
+                );
+                vtkmesh->Delete();
+
+                regionDataset_[regionId] = datasetNo++;
             }
-
-            const label datasetId = GetNumberOfDataSets(output, selector);
-
-            vtkPolyData* vtkmesh = vtkPolyData::New();
-
-            addPointZoneMesh
-            (
-                mesh,
-                pzMesh[zoneI],
-                vtkmesh
-            );
-
-            AddToBlock
-            (
-                output, selector, datasetId, vtkmesh,
-                pzMesh.names()[zoneI] + ":pointZone"
-            );
-            selectedRegionDatasetIds_[regionId] = datasetId;
-            vtkmesh->Delete();
-
-            created = true;
         }
     }
 
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
 
-
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshPointZones" << endl;
@@ -687,14 +682,13 @@ void Foam::vtkPV3Foam::convertMeshPointSets
     }
 
     const fvMesh& mesh = *meshPtr_;
-    selectionInfo& selector = selectInfoPointSets_;
-    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
+    selectionInfo& selector = regionInfoPointSets_;
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    // set output block and note if anything was added
+    // set output block, restart at dataset 0
     selector.block(blockNo);
-    bool created = false;
+    label datasetNo = 0;
 
-    // Create the point sets and add as dataset
     if (selector.size())
     {
         for
@@ -704,47 +698,41 @@ void Foam::vtkPV3Foam::convertMeshPointSets
             ++regionId
         )
         {
-            if (!selectedRegions_[regionId])
+            if (!regionStatus_[regionId])
             {
                 continue;
             }
 
-            word selectName = getFirstWord
+            word selectedName = getFirstWord
             (
-                arraySelection->GetArrayName(regionId)
+                regionSelection->GetArrayName(regionId)
             );
 
-
             if (debug)
             {
-                Info<< "Creating VTK mesh for pointSet: " << selectName
+                Info<< "Creating VTK mesh for pointSet: " << selectedName
                     << " region index: " << regionId << endl;
             }
 
-            const pointSet pSet(mesh, selectName);
-
-            const label datasetId = GetNumberOfDataSets(output, selector);
+            const pointSet pSet(mesh, selectedName);
 
-            vtkPolyData* vtkmesh = vtkPolyData::New();
-            addPointSetMesh
-            (
-                mesh,
-                pSet,
-                vtkmesh
-            );
-            AddToBlock
-            (
-                output, selector, datasetId, vtkmesh,
-                selectName + ":pointSet"
-            );
-            selectedRegionDatasetIds_[regionId] = datasetId;
-            vtkmesh->Delete();
-
-            created = true;
+            vtkPolyData* vtkmesh = pointSetVTKMesh(mesh, pSet);
+            if (vtkmesh)
+            {
+                AddToBlock
+                (
+                    output, selector, datasetNo, vtkmesh,
+                    selectedName + ":pointSet"
+                );
+                vtkmesh->Delete();
+
+                regionDataset_[regionId] = datasetNo++;
+            }
         }
     }
 
-    if (created)
+    // was anything added?
+    if (datasetNo)
     {
         ++blockNo;
     }
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshLagrangian.C
similarity index 55%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshLagrangian.C
index d4463109a9cf82f8596884c1ac67a9527d15e9a2..d1b0492235c56aa1d63717439bba31f062a4b650 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshLagrangian.C
@@ -31,81 +31,68 @@ Description
 // Foam includes
 #include "Cloud.H"
 #include "fvMesh.H"
-#include "passiveParticle.H"
-#include "vtkPV3FoamInsertNextPoint.H"
 #include "IOobjectList.H"
+#include "passiveParticle.H"
+#include "vtkPV3FoamPoints.H"
 
 // VTK includes
-#include "vtkCellArray.h"
+#include "vtkPoints.h"
 #include "vtkPolyData.h"
-#include "vtkUnstructuredGrid.h"
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-void Foam::vtkPV3Foam::addLagrangianMesh
+vtkPolyData* Foam::vtkPV3Foam::lagrangianVTKMesh
 (
     const fvMesh& mesh,
-    vtkPolyData *vtkmesh
+    const word& cloudName
 )
 {
+    vtkPolyData* vtkmesh = NULL;
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::addLagrangianMesh - timePath "
-            << mesh.time().timePath()/"lagrangian" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::lagrangianVTKMesh - timePath "
+            << mesh.time().timePath()/"lagrangian"/cloudName << endl;
         printMemory();
     }
 
-    fileNameList cloudDirs
+    IOobjectList sprayObjs
     (
-        readDir(mesh.time().timePath()/"lagrangian", fileName::DIRECTORY)
+        mesh,
+        mesh.time().timeName(),
+        "lagrangian"/cloudName
     );
 
-    if (debug && cloudDirs.size())
+    IOobject* positionsPtr = sprayObjs.lookup("positions");
+    if (positionsPtr)
     {
-        Info<< "... check cloudDirs: " << cloudDirs << endl;
-    }
-
-    bool foundCloud = false;
-    forAll(cloudDirs, i)
-    {
-        IOobjectList sprayObjs
-        (
-            mesh,
-            mesh.time().timeName(),
-            "lagrangian"/cloudDirs[i]
-        );
-
-        IOobject* positionsPtr = sprayObjs.lookup("positions");
+        Cloud<passiveParticle> parcels(mesh, cloudName, false);
 
-        if (positionsPtr && !foundCloud)
+        if (debug)
         {
-            foundCloud = true;
-
-            Cloud<passiveParticle> parcels(mesh, cloudDirs[i], false);
-
-            if (debug)
-            {
-                Info<< "cloud with " << parcels.size() << " parcels" << endl;
-            }
-
-            vtkPoints* vtkpoints = vtkPoints::New();
-            vtkpoints->Allocate(parcels.size());
+            Info<< "cloud with " << parcels.size() << " parcels" << endl;
+        }
 
-            forAllConstIter(Cloud<passiveParticle>, parcels, elmnt)
-            {
-                vtkPV3FoamInsertNextPoint(vtkpoints, elmnt().position());
-            }
+        vtkmesh = vtkPolyData::New();
+        vtkPoints* vtkpoints = vtkPoints::New();
+        vtkpoints->Allocate( parcels.size() );
 
-            vtkmesh->SetPoints(vtkpoints);
-            vtkpoints->Delete();
+        forAllConstIter(Cloud<passiveParticle>, parcels, iter)
+        {
+            vtkPV3FoamInsertNextPoint(vtkpoints, iter().position());
         }
+
+        vtkmesh->SetPoints(vtkpoints);
+        vtkpoints->Delete();
     }
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::addLagrangianMesh" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::lagrangianVTKMesh" << endl;
         printMemory();
     }
+
+    return vtkmesh;
 }
 
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshPatch.C
similarity index 84%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshPatch.C
index 7c8a586ebabd084c9fd96147edb51c00239b11ba..bacaa0f63d01724660e68655768b7033f7e21903 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshPatch.C
@@ -31,7 +31,7 @@ Description
 // Foam includes
 #include "polyPatch.H"
 #include "primitivePatch.H"
-#include "vtkPV3FoamInsertNextPoint.H"
+#include "vtkPV3FoamPoints.H"
 
 // VTK includes
 #include "vtkCellArray.h"
@@ -40,15 +40,16 @@ Description
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-void Foam::vtkPV3Foam::addPatchMesh
+vtkPolyData* Foam::vtkPV3Foam::patchVTKMesh
 (
-    const polyPatch& p,
-    vtkPolyData *vtkmesh
+    const polyPatch& p
 )
 {
+    vtkPolyData* vtkmesh = vtkPolyData::New();
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::addPatchMesh - " << p.name() << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::patchVTKMesh - " << p.name() << endl;
         printMemory();
     }
 
@@ -56,7 +57,7 @@ void Foam::vtkPV3Foam::addPatchMesh
     const Foam::pointField& points = p.localPoints();
 
     vtkPoints *vtkpoints = vtkPoints::New();
-    vtkpoints->Allocate(points.size());
+    vtkpoints->Allocate( points.size() );
     forAll(points, i)
     {
         vtkPV3FoamInsertNextPoint(vtkpoints, points[i]);
@@ -69,14 +70,14 @@ void Foam::vtkPV3Foam::addPatchMesh
     // Add faces as polygons
     const faceList& faces = p.localFaces();
 
-    vtkCellArray * vtkcells = vtkCellArray::New();
-    vtkcells->Allocate(faces.size());
+    vtkCellArray* vtkcells = vtkCellArray::New();
+    vtkcells->Allocate( faces.size() );
     forAll(faces, faceI)
     {
         const face& f = faces[faceI];
         vtkIdType nodeIds[f.size()];
 
-        forAll (f, fp)
+        forAll(f, fp)
         {
             nodeIds[fp] = f[fp];
         }
@@ -88,9 +89,11 @@ void Foam::vtkPV3Foam::addPatchMesh
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::addPatchMesh - " << p.name() << endl;
+        Info<< "<end> Foam::vtkPV3Foam::patchVTKMesh - " << p.name() << endl;
         printMemory();
     }
+
+    return vtkmesh;
 }
 
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshSet.C
similarity index 80%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshSet.C
index 18835fe427f38c36d7a9aa1ac13f6a47af54fb9b..c64c3ec692d8235890ad655a51a1e3be73b0b243 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshSet.C
@@ -31,7 +31,7 @@ Description
 // Foam includes
 #include "faceSet.H"
 #include "pointSet.H"
-#include "vtkPV3FoamInsertNextPoint.H"
+#include "vtkPV3FoamPoints.H"
 
 // VTK includes
 #include "vtkPoints.h"
@@ -40,16 +40,17 @@ Description
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-void Foam::vtkPV3Foam::addFaceSetMesh
+vtkPolyData* Foam::vtkPV3Foam::faceSetVTKMesh
 (
     const fvMesh& mesh,
-    const faceSet& fSet,
-    vtkPolyData* vtkmesh
+    const faceSet& fSet
 )
 {
+    vtkPolyData* vtkmesh = vtkPolyData::New();
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::addFaceSetMesh" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::faceSetVTKMesh" << endl;
         printMemory();
     }
 
@@ -65,13 +66,13 @@ void Foam::vtkPV3Foam::addFaceSetMesh
     primitiveFacePatch p(patchFaces, mesh.points());
 
 
-    // The balance of this routine should be identical to addPatchMesh
+    // The balance of this routine should be identical to patchVTKMesh
 
     // Convert Foam mesh vertices to VTK
     const pointField& points = p.localPoints();
 
     vtkPoints *vtkpoints = vtkPoints::New();
-    vtkpoints->Allocate(points.size());
+    vtkpoints->Allocate( points.size() );
     forAll(points, i)
     {
         vtkPV3FoamInsertNextPoint(vtkpoints, points[i]);
@@ -83,13 +84,14 @@ void Foam::vtkPV3Foam::addFaceSetMesh
     const faceList& faces = p.localFaces();
 
     vtkCellArray* vtkcells = vtkCellArray::New();
-    vtkcells->Allocate(p.size());
+    vtkcells->Allocate( faces.size() );
+
     forAll(faces, faceI)
     {
         const face& f = faces[faceI];
         vtkIdType nodeIds[f.size()];
 
-        forAll (f, fp)
+        forAll(f, fp)
         {
             nodeIds[fp] = f[fp];
         }
@@ -101,29 +103,32 @@ void Foam::vtkPV3Foam::addFaceSetMesh
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::addFaceSetMesh" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::faceSetVTKMesh" << endl;
         printMemory();
     }
+
+    return vtkmesh;
 }
 
 
-void Foam::vtkPV3Foam::addPointSetMesh
+vtkPolyData* Foam::vtkPV3Foam::pointSetVTKMesh
 (
     const fvMesh& mesh,
-    const pointSet& pSet,
-    vtkPolyData* vtkmesh
+    const pointSet& pSet
 )
 {
+    vtkPolyData* vtkmesh = vtkPolyData::New();
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::addPointSetMesh" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::pointSetVTKMesh" << endl;
         printMemory();
     }
 
     const pointField& meshPoints = mesh.points();
 
     vtkPoints *vtkpoints = vtkPoints::New();
-    vtkpoints->Allocate(pSet.size());
+    vtkpoints->Allocate( pSet.size() );
 
     forAllConstIter(pointSet, pSet, iter)
     {
@@ -135,9 +140,12 @@ void Foam::vtkPV3Foam::addPointSetMesh
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::addPointSetMesh" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::pointSetVTKMesh" << endl;
         printMemory();
     }
+
+    return vtkmesh;
 }
 
+
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshVolume.C
similarity index 85%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshVolume.C
index 292fb8d2a0964cd6f75582ea356d67b59e00dbae..333a9dc1063a8d607e5cc9f1bf88db22f2708c3a 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshVolume.C
@@ -26,35 +26,30 @@ Description
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef vtkPV3FoamAddVolumeMesh_H
-#define vtkPV3FoamAddVolumeMesh_H
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
 #include "vtkPV3Foam.H"
 
 // Foam includes
 #include "fvMesh.H"
 #include "cellModeller.H"
-#include "vtkPV3FoamInsertNextPoint.H"
+#include "vtkPV3FoamPoints.H"
 
 // VTK includes
 #include "vtkCellArray.h"
 #include "vtkUnstructuredGrid.h"
 
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-void Foam::vtkPV3Foam::addVolumeMesh
+vtkUnstructuredGrid* Foam::vtkPV3Foam::volumeVTKMesh
 (
     const fvMesh& mesh,
-    vtkUnstructuredGrid* vtkmesh,
     labelList& superCells
 )
 {
+    vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::New();
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::addVolumeMesh" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::volumeVTKMesh" << endl;
         printMemory();
     }
 
@@ -124,10 +119,10 @@ void Foam::vtkPV3Foam::addVolumeMesh
 
     if (debug)
     {
-        Info<<"mesh.nCells()  = " << mesh.nCells() << nl
-            <<"mesh.nPoints() = " << mesh.nPoints() << nl
-            <<"nAddCells      = " << nAddCells << nl
-            <<"nAddPoints     = " << nAddPoints << endl;
+        Info<<" mesh nCells     = " << mesh.nCells() << nl
+            <<"      nPoints    = " << mesh.nPoints() << nl
+            <<"      nAddCells  = " << nAddCells << nl
+            <<"      nAddPoints = " << nAddPoints << endl;
     }
 
     superCells.setSize(mesh.nCells() + nAddCells);
@@ -139,7 +134,7 @@ void Foam::vtkPV3Foam::addVolumeMesh
 
     // Convert Foam mesh vertices to VTK
     vtkPoints *vtkpoints = vtkPoints::New();
-    vtkpoints->Allocate(mesh.nPoints() + nAddPoints);
+    vtkpoints->Allocate( mesh.nPoints() + nAddPoints );
 
     const Foam::pointField& points = mesh.points();
 
@@ -154,21 +149,21 @@ void Foam::vtkPV3Foam::addVolumeMesh
         Info<< "... converting cells" << endl;
     }
 
-    vtkmesh->Allocate(mesh.nCells() + nAddCells);
+    vtkmesh->Allocate( mesh.nCells() + nAddCells );
 
     // Set counters for additional points and additional cells
-    label api = 0, aci = 0;
+    label addPointI = 0, addCellI = 0;
 
     // Create storage for points - needed for mapping from Foam to VTK
     // data types - max 'order' = hex = 8 points
     vtkIdType nodeIds[8];
 
-    forAll(cellShapes, celli)
+    forAll(cellShapes, cellI)
     {
-        const cellShape& cellShape = cellShapes[celli];
+        const cellShape& cellShape = cellShapes[cellI];
         const cellModel& cellModel = cellShape.model();
 
-        superCells[aci++] = celli;
+        superCells[addCellI++] = cellI;
 
         if (cellModel == tet)
         {
@@ -265,16 +260,16 @@ void Foam::vtkPV3Foam::addVolumeMesh
             // Polyhedral cell. Decompose into tets + prisms.
 
             // Mapping from additional point to cell
-            addPointCellLabels_[api] = celli;
+            addPointCellLabels_[addPointI] = cellI;
 
             // Insert the new vertex from the cell-centre
-            label newVertexLabel = mesh.nPoints() + api;
-            vtkPV3FoamInsertNextPoint(vtkpoints, mesh.C()[celli]);
+            label newVertexLabel = mesh.nPoints() + addPointI;
+            vtkPV3FoamInsertNextPoint(vtkpoints, mesh.C()[cellI]);
 
             // Whether to insert cell in place of original or not.
             bool substituteCell = true;
 
-            const labelList& cFaces = mesh.cells()[celli];
+            const labelList& cFaces = mesh.cells()[cellI];
 
             forAll(cFaces, cFaceI)
             {
@@ -293,13 +288,13 @@ void Foam::vtkPV3Foam::addVolumeMesh
 
                     if (substituteCell)
                     {
-                        thisCellI = celli;
+                        thisCellI = cellI;
                         substituteCell = false;
                     }
                     else
                     {
-                        thisCellI = mesh.nCells() + aci;
-                        superCells[aci++] = celli;
+                        thisCellI = mesh.nCells() + addCellI;
+                        superCells[addCellI++] = cellI;
                     }
 
                     nodeIds[0] = f[0];
@@ -323,13 +318,13 @@ void Foam::vtkPV3Foam::addVolumeMesh
 
                     if (substituteCell)
                     {
-                        thisCellI = celli;
+                        thisCellI = cellI;
                         substituteCell = false;
                     }
                     else
                     {
-                        thisCellI = mesh.nCells() + aci;
-                        superCells[aci++] = celli;
+                        thisCellI = mesh.nCells() + addCellI;
+                        superCells[addCellI++] = cellI;
                     }
 
                     nodeIds[0] = f[0];
@@ -345,7 +340,7 @@ void Foam::vtkPV3Foam::addVolumeMesh
                 }
             }
 
-            api++;
+            addPointI++;
         }
     }
 
@@ -354,14 +349,11 @@ void Foam::vtkPV3Foam::addVolumeMesh
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::addVolumeMesh" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::volumeVTKMesh" << endl;
         printMemory();
     }
-}
-
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#endif
+    return vtkmesh;
+}
 
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshZone.C
similarity index 76%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshZone.C
index 9c52624f0f9ad7019d92e70a3fceb1718e3de5cc..12533e44bc8939c734a8a82362057e662a214a42 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamMeshZone.C
@@ -29,7 +29,7 @@ Description
 #include "vtkPV3Foam.H"
 
 // Foam includes
-#include "vtkPV3FoamInsertNextPoint.H"
+#include "vtkPV3FoamPoints.H"
 
 // VTK includes
 #include "vtkPoints.h"
@@ -39,20 +39,21 @@ Description
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 
-void Foam::vtkPV3Foam::addFaceZoneMesh
+vtkPolyData* Foam::vtkPV3Foam::faceZoneVTKMesh
 (
     const fvMesh& mesh,
-    const labelList& faceLabels,
-    vtkPolyData* vtkmesh
+    const labelList& faceLabels
 )
 {
+    vtkPolyData* vtkmesh = vtkPolyData::New();
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::addFaceZoneMesh" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::faceZoneVTKMesh" << endl;
         printMemory();
     }
 
-    // Construct primitivePatch of faces in fSet.
+    // Construct primitivePatch of faces in faceZone
 
     const faceList& meshFaces = mesh.faces();
     faceList patchFaces(faceLabels.size());
@@ -63,31 +64,34 @@ void Foam::vtkPV3Foam::addFaceZoneMesh
     primitiveFacePatch p(patchFaces, mesh.points());
 
 
-    // The balance of this routine should be identical to addPatchMesh
+    // The balance of this routine should be identical to patchVTKMesh
 
     // Convert Foam mesh vertices to VTK
     const pointField& points = p.localPoints();
 
-    vtkPoints *vtkpoints = vtkPoints::New();
-    vtkpoints->Allocate(p.size());
+    vtkPoints* vtkpoints = vtkPoints::New();
+    vtkpoints->Allocate( points.size() );
     forAll(points, i)
     {
         vtkPV3FoamInsertNextPoint(vtkpoints, points[i]);
     }
+
     vtkmesh->SetPoints(vtkpoints);
     vtkpoints->Delete();
 
+
     // Add faces as polygons
     const faceList& faces = p.localFaces();
 
     vtkCellArray* vtkcells = vtkCellArray::New();
-    vtkcells->Allocate(points.size());
+    vtkcells->Allocate( faces.size() );
+
     forAll(faces, faceI)
     {
         const face& f = faces[faceI];
         vtkIdType nodeIds[f.size()];
 
-        forAll (f, fp)
+        forAll(f, fp)
         {
             nodeIds[fp] = f[fp];
         }
@@ -99,30 +103,33 @@ void Foam::vtkPV3Foam::addFaceZoneMesh
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::addFaceZoneMesh" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::faceZoneVTKMesh" << endl;
         printMemory();
     }
+
+    return vtkmesh;
 }
 
 
 
-void Foam::vtkPV3Foam::addPointZoneMesh
+vtkPolyData* Foam::vtkPV3Foam::pointZoneVTKMesh
 (
     const fvMesh& mesh,
-    const labelList& pointLabels,
-    vtkPolyData* vtkmesh
+    const labelList& pointLabels
 )
 {
+    vtkPolyData* vtkmesh = vtkPolyData::New();
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::addPointZoneMesh" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::pointZoneVTKMesh" << endl;
         printMemory();
     }
 
     const pointField& meshPoints = mesh.points();
 
     vtkPoints *vtkpoints = vtkPoints::New();
-    vtkpoints->Allocate(pointLabels.size());
+    vtkpoints->Allocate( pointLabels.size() );
 
     forAll(pointLabels, pointI)
     {
@@ -134,9 +141,11 @@ void Foam::vtkPV3Foam::addPointZoneMesh
 
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::addPointZoneMesh" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::pointZoneVTKMesh" << endl;
         printMemory();
     }
+
+    return vtkmesh;
 }
 
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPatchFaceField.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPatchField.H
similarity index 63%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPatchFaceField.H
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPatchField.H
index af0fde5e21db913a599b06f0438ab3edb555fd4c..aa7fea32535e91868205711a5feda2bede0cc3fb 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPatchFaceField.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPatchField.H
@@ -27,19 +27,20 @@ InClass
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef vtkPV3FoamConvertPatchFaceField_H
-#define vtkPV3FoamConvertPatchFaceField_H
+#ifndef vtkPV3FoamPatchField_H
+#define vtkPV3FoamPatchField_H
 
 // VTK includes
 #include "vtkCellData.h"
 #include "vtkFloatArray.h"
 #include "vtkMultiBlockDataSet.h"
+#include "vtkPointData.h"
 #include "vtkPolyData.h"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 template<class Type>
-void Foam::vtkPV3Foam::convertPatchFaceField
+void Foam::vtkPV3Foam::convertPatchField
 (
     const word& name,
     const Field<Type>& ptf,
@@ -55,14 +56,13 @@ void Foam::vtkPV3Foam::convertPatchFaceField
         GetDataSetFromBlock(output, selector, datasetNo)
     );
 
-    vtkFloatArray *cellData = vtkFloatArray::New();
-    cellData->SetNumberOfTuples(ptf.size());
-    cellData->SetNumberOfComponents(nComp);
-    cellData->Allocate(nComp*ptf.size());
-    cellData->SetName(name.c_str());
+    vtkFloatArray* cellData = vtkFloatArray::New();
+    cellData->SetNumberOfTuples( ptf.size() );
+    cellData->SetNumberOfComponents( nComp );
+    cellData->Allocate( nComp*ptf.size() );
+    cellData->SetName( name.c_str() );
 
     float vec[nComp];
-
     forAll(ptf, i)
     {
         const Type& t = ptf[i];
@@ -79,6 +79,46 @@ void Foam::vtkPV3Foam::convertPatchFaceField
 }
 
 
+// as above, but with PointData()
+template<class Type>
+void Foam::vtkPV3Foam::convertPatchPointField
+(
+    const word& name,
+    const Field<Type>& pptf,
+    vtkMultiBlockDataSet* output,
+    const selectionInfo& selector,
+    const label datasetNo
+)
+{
+    const label nComp = pTraits<Type>::nComponents;
+
+    vtkPolyData* vtkmesh = vtkPolyData::SafeDownCast
+    (
+        GetDataSetFromBlock(output, selector, datasetNo)
+    );
+
+    vtkFloatArray *pointData = vtkFloatArray::New();
+    pointData->SetNumberOfTuples( pptf.size() );
+    pointData->SetNumberOfComponents( nComp );
+    pointData->Allocate( nComp*pptf.size() );
+    pointData->SetName( name.c_str() );
+
+    float vec[nComp];
+    forAll(pptf, i)
+    {
+        const Type& t = pptf[i];
+        for (direction d=0; d<nComp; d++)
+        {
+            vec[d] = component(t, d);
+        }
+
+        pointData->InsertTuple(i, vec);
+    }
+
+    vtkmesh->GetPointData()->AddArray(pointData);
+    pointData->Delete();
+}
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #endif
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPointFields.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPointFields.H
similarity index 65%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPointFields.H
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPointFields.H
index dbbe22d6637bc99dad5eeaee3479b46ff41e91d3..eece2609d7b75453104cea4c5cab921f627b9c67 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertPointFields.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPointFields.H
@@ -27,8 +27,8 @@ InClass
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef vtkPV3FoamConvertPointFields_H
-#define vtkPV3FoamConvertPointFields_H
+#ifndef vtkPV3FoamPointFields_H
+#define vtkPV3FoamPointFields_H
 
 // Foam includes
 #include "interpolatePointToCell.H"
@@ -39,11 +39,12 @@ template<class Type>
 void Foam::vtkPV3Foam::convertPointFields
 (
     const fvMesh& mesh,
+    const pointMesh& pMesh,
     const IOobjectList& objects,
-    vtkDataArraySelection* fieldSelection,
     vtkMultiBlockDataSet* output
 )
 {
+    // field subset based on type
     IOobjectList fieldObjects
     (
         objects.lookupClass
@@ -52,20 +53,12 @@ void Foam::vtkPV3Foam::convertPointFields
         )
     );
 
-    label nFields = fieldSelection->GetNumberOfArrays();
     const polyBoundaryMesh& patches = mesh.boundaryMesh();
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    for (label i=0; i<nFields; i++)
+    forAllIter(IOobjectList, fieldObjects, iter)
     {
-        const word fieldName = fieldSelection->GetArrayName(i);
-
-        if
-        (
-            !fieldSelection->GetArraySetting(i)
-         || !fieldObjects.found(fieldName))
-        {
-            continue;
-        }
+        word fieldName = iter()->name();
 
         if (debug)
         {
@@ -73,17 +66,9 @@ void Foam::vtkPV3Foam::convertPointFields
                 << fieldName << endl;
         }
 
-        pointMesh pMesh(mesh);
-
         GeometricField<Type, pointPatchField, pointMesh> ptf
         (
-            IOobject
-            (
-                fieldName,
-                mesh.time().timeName(),
-                mesh,
-                IOobject::MUST_READ
-            ),
+            *iter(),
             pMesh
         );
 
@@ -93,14 +78,14 @@ void Foam::vtkPV3Foam::convertPointFields
         //
         for
         (
-            int regionId = selectInfoVolume_.start();
-            regionId < selectInfoVolume_.end();
+            int regionId = regionInfoVolume_.start();
+            regionId < regionInfoVolume_.end();
             ++regionId
         )
         {
-            const label datasetId = selectedRegionDatasetIds_[regionId];
+            const label datasetNo = regionDataset_[regionId];
 
-            if (!selectedRegions_[regionId] || datasetId < 0)
+            if (!regionStatus_[regionId] || datasetNo < 0)
             {
                 continue;
             }
@@ -110,36 +95,42 @@ void Foam::vtkPV3Foam::convertPointFields
                 ptf,
                 GeometricField<Type, fvPatchField, volMesh>::null(),
                 output,
-                selectInfoVolume_,
-                datasetId
+                regionInfoVolume_,
+                datasetNo
             );
         }
 
-
         //
         // Convert patches - if activated
         //
-        label regionId = selectInfoPatches_.start();
-        forAll (patches, patchI)
+        for
+        (
+            int regionId = regionInfoPatches_.start();
+            regionId < regionInfoPatches_.end();
+            ++regionId
+        )
         {
-            if (patches[patchI].size())
+            word patchName = getFirstWord
+            (
+                regionSelection->GetArrayName(regionId)
+            );
+
+            const label datasetNo = regionDataset_[regionId];
+            const label patchId = patches.findPatchID(patchName);
+
+            if (!regionStatus_[regionId] || datasetNo < 0 || patchId < 0)
             {
-                const label datasetId = selectedRegionDatasetIds_[regionId];
-
-                if (selectedRegions_[regionId] && datasetId >= 0)
-                {
-
-                    convertPatchPointField
-                    (
-                        fieldName,
-                        ptf.boundaryField()[patchI].patchInternalField()(),
-                        output,
-                        selectInfoPatches_,
-                        datasetId
-                    );
-                }
-                regionId++;
+                continue;
             }
+
+            convertPatchPointField
+            (
+                fieldName,
+                ptf.boundaryField()[patchId].patchInternalField()(),
+                output,
+                regionInfoPatches_,
+                datasetNo
+            );
         }
     }
 }
@@ -157,37 +148,48 @@ void Foam::vtkPV3Foam::convertPointField
 {
     const label nComp = pTraits<Type>::nComponents;
 
-    vtkUnstructuredGrid* internalMesh = vtkUnstructuredGrid::SafeDownCast
+    vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::SafeDownCast
     (
         GetDataSetFromBlock(output, selector, datasetNo)
     );
 
     vtkFloatArray *pointData = vtkFloatArray::New();
-    pointData->SetNumberOfTuples(ptf.size() + addPointCellLabels_.size());
-    pointData->SetNumberOfComponents(nComp);
-    pointData->Allocate(nComp*ptf.size());
-    pointData->SetName(tf.name().c_str());
+    pointData->SetNumberOfTuples( ptf.size() + addPointCellLabels_.size() );
+    pointData->SetNumberOfComponents( nComp );
+    pointData->Allocate( nComp*(ptf.size() + addPointCellLabels_.size()) );
+    pointData->SetName( tf.name().c_str() );
 
-    float vec[nComp];
 
+    if (debug)
+    {
+        Info<< "convert convertPointField: "
+            << tf.name()
+            << " size = " << ptf.size()
+            << " nComp=" << nComp
+            << " nTuples = " << (ptf.size() + addPointCellLabels_.size())
+            <<  endl;
+    }
+
+    float vec[nComp];
     forAll(ptf, i)
     {
+        const Type& t = ptf[i];
         for (direction d=0; d<nComp; d++)
         {
-            vec[d] = component(ptf[i], d);
+            vec[d] = component(t, d);
         }
 
         pointData->InsertTuple(i, vec);
     }
 
+    // continue insertion from here
     label i = ptf.size();
 
     if (&tf != &GeometricField<Type, fvPatchField, volMesh>::null())
     {
         forAll(addPointCellLabels_, api)
         {
-            Type t = tf[addPointCellLabels_[api]];
-
+            const Type& t = tf[addPointCellLabels_[api]];
             for (direction d=0; d<nComp; d++)
             {
                 vec[d] = component(t, d);
@@ -211,11 +213,10 @@ void Foam::vtkPV3Foam::convertPointField
         }
     }
 
-    internalMesh->GetPointData()->AddArray(pointData);
+    vtkmesh->GetPointData()->AddArray(pointData);
     pointData->Delete();
 }
 
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #endif
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamInsertNextPoint.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPoints.H
similarity index 72%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamInsertNextPoint.H
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPoints.H
index a7bab440d3ec8f936fe9d7ad8c8e99365d6b8091..101fb8d62b24109d90b66c355baf0cd7ce5a7646 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamInsertNextPoint.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamPoints.H
@@ -27,8 +27,8 @@ InClass
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef vtkPV3FoamInsertNextPoint_H
-#define vtkPV3FoamInsertNextPoint_H
+#ifndef vtkPV3FoamPoints_H
+#define vtkPV3FoamPoints_H
 
 // VTK includes
 #include "vtkPoints.h"
@@ -44,6 +44,34 @@ inline void vtkPV3FoamInsertNextPoint
     points->InsertNextPoint(p.x(), p.y(), p.z());
 }
 
+#if 0
+// this should be faster, but didn't get it working ...
+inline void vtkPV3FoamSetPoint
+(
+    vtkPoints *points,
+    const Foam::label id,
+    const Foam::point& p
+)
+{
+    points->SetPoint(id, p.x(), p.y(), p.z());
+}
+
+
+// Convert Foam mesh vertices to VTK
+inline vtkPoints* vtkPV3FoamVTKPoints(const Foam::pointField& points)
+{
+    vtkPoints *vtkpoints = vtkPoints::New();
+    vtkpoints->SetNumberOfPoints(points.size());
+    forAll(points, i)
+    {
+        const Foam::point& p = points[i];
+        vtkpoints->SetPoint(i, p.x(), p.y(), p.z());
+    }
+
+    return vtkpoints;
+}
+
+#endif
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInfo.C
similarity index 61%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInfo.C
index 3f18047ced05de76a2dcaa00c9502478df4ef429..4319a8b5195b4912fbc9a773174958271a0acae6 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInfo.C
@@ -38,7 +38,7 @@ License
 
 // local headers
 #include "vtkPV3FoamAddToSelection.H"
-#include "vtkPV3FoamUpdateInformationFields.H"
+#include "vtkPV3FoamUpdateInfoFields.H"
 
 // VTK includes
 #include "vtkDataArraySelection.h"
@@ -107,7 +107,7 @@ Foam::wordList Foam::vtkPV3Foam::readZoneNames(const word& zoneType)
         zonesEntries zones(ioObj);
 
         zoneNames.setSize(zones.size());
-        forAll (zones, zoneI)
+        forAll(zones, zoneI)
         {
             zoneNames[zoneI] = zones[zoneI].keyword();
         }
@@ -117,14 +117,14 @@ Foam::wordList Foam::vtkPV3Foam::readZoneNames(const word& zoneType)
 }
 
 
-void Foam::vtkPV3Foam::updateInformationInternalMesh()
+void Foam::vtkPV3Foam::updateInfoInternalMesh()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationInternalMesh" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::updateInfoInternalMesh" << endl;
     }
 
-    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
     // Determine number of meshes available
     HashTable<const fvMesh*> meshObjects = dbPtr_().lookupClass<const fvMesh>();
@@ -132,100 +132,85 @@ void Foam::vtkPV3Foam::updateInformationInternalMesh()
 
     // Determine regions (internal mesh and patches...)
     //- Add internal mesh as first entry
-    selectInfoVolume_ = arraySelection->GetNumberOfArrays();
-    arraySelection->AddArray("internalMesh");
-    selectInfoVolume_ += 1;
+    regionInfoVolume_ = regionSelection->GetNumberOfArrays();
+    regionSelection->AddArray("internalMesh");
+    regionInfoVolume_ += 1;
 
     if (debug)
     {
         // just for debug info
-        getSelectedArrayEntries(arraySelection);
+        getSelectedArrayEntries(regionSelection);
 
-        Info<< "<end> Foam::vtkPV3Foam::updateInformationInternalMesh" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::updateInfoInternalMesh" << endl;
     }
 
 }
 
 
-void Foam::vtkPV3Foam::updateInformationLagrangian()
+void Foam::vtkPV3Foam::updateInfoLagrangian()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationLagrangian" << nl
+        Info<< "<beg> Foam::vtkPV3Foam::updateInfoLagrangian" << nl
             << "    " << dbPtr_->timePath()/"lagrangian" << endl;
     }
 
-    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
-
     // Search for list of lagrangian objects for this time
     fileNameList cloudDirs
     (
         readDir(dbPtr_->timePath()/"lagrangian", fileName::DIRECTORY)
     );
 
-    selectInfoLagrangian_ = arraySelection->GetNumberOfArrays();
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
+    regionInfoLagrangian_ = regionSelection->GetNumberOfArrays();
 
-    if (cloudDirs.size())
+    int nClouds = 0;
+    forAll(cloudDirs, cloudI)
     {
-        arraySelection->AddArray("lagrangian");
-        selectInfoLagrangian_ += 1;
-
-        Info<< "... added cloudDirs\n";
+        // Add cloud to GUI list
+        regionSelection->AddArray
+        (
+            (cloudDirs[cloudI] + " - lagrangian").c_str()
+        );
 
-        if (cloudDirs.size() > 1)
-        {
-            WarningIn("void Foam::vtkPV3Foam::updateInformationLagrangian()")
-                << "Multiple lagrangian clouds identified. Currently only able "
-                << "to process ONE cloud: " << cloudDirs[0]
-                << endl;
-        }
-        // Set cloud name to first cloud found
-        // TODO - multiple clouds
-        cloudName_ = cloudDirs[0];
-    }
-    else
-    {
-        if (debug)
-        {
-            Info<< "... no clouds identified in " <<nl
-                << "    " <<dbPtr_->timePath()/"lagrangian" << endl;
-        }
+        ++nClouds;
     }
 
+    regionInfoLagrangian_ += nClouds;
+
     if (debug)
     {
         // just for debug info
-        getSelectedArrayEntries(arraySelection);
+        getSelectedArrayEntries(regionSelection);
 
-        Info<< "<end> Foam::vtkPV3Foam::updateInformationLagrangian" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::updateInfoLagrangian" << endl;
     }
 }
 
 
-void Foam::vtkPV3Foam::updateInformationPatches()
+void Foam::vtkPV3Foam::updateInfoPatches()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationPatches"
+        Info<< "<beg> Foam::vtkPV3Foam::updateInfoPatches"
             << " [meshPtr=" << (meshPtr_ ? "set" : "NULL") << "]" << endl;
     }
 
-    vtkDataArraySelection *arraySelection = reader_->GetRegionSelection();
-    selectInfoPatches_ = arraySelection->GetNumberOfArrays();
+    vtkDataArraySelection *regionSelection = reader_->GetRegionSelection();
+    regionInfoPatches_ = regionSelection->GetNumberOfArrays();
 
     int nPatches = 0;
-
     if (meshPtr_)
     {
         const polyBoundaryMesh& patches = meshPtr_->boundaryMesh();
-        forAll (patches, patchI)
+        forAll(patches, patchI)
         {
             const polyPatch& pp = patches[patchI];
 
             if (pp.size())
             {
-                // Add patch to GUI region list
-                arraySelection->AddArray
+                // Add patch to GUI list
+                regionSelection->AddArray
                 (
                     (pp.name() + " - patch").c_str()
                 );
@@ -252,7 +237,7 @@ void Foam::vtkPV3Foam::updateInformationPatches()
         );
 
         // Start regions at patches
-        forAll (patchEntries, entryI)
+        forAll(patchEntries, entryI)
         {
             label nFaces
             (
@@ -262,8 +247,8 @@ void Foam::vtkPV3Foam::updateInformationPatches()
             // Valid patch if nFace > 0
             if (nFaces)
             {
-                // Add patch to GUI region list
-                arraySelection->AddArray
+                // Add patch to GUI list
+                regionSelection->AddArray
                 (
                     (patchEntries[entryI].keyword() + " - patch").c_str()
                 );
@@ -273,27 +258,32 @@ void Foam::vtkPV3Foam::updateInformationPatches()
         }
     }
 
-    selectInfoPatches_ += nPatches;
+    regionInfoPatches_ += nPatches;
 
     if (debug)
     {
         // just for debug info
-        getSelectedArrayEntries(arraySelection);
+        getSelectedArrayEntries(regionSelection);
 
-        Info<< "<end> Foam::vtkPV3Foam::updateInformationPatches" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::updateInfoPatches" << endl;
     }
 }
 
 
-void Foam::vtkPV3Foam::updateInformationZones()
+void Foam::vtkPV3Foam::updateInfoZones()
 {
+    if (!reader_->GetIncludeZones())
+    {
+        return;
+    }
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationZones"
+        Info<< "<beg> Foam::vtkPV3Foam::updateInfoZones"
             << " [meshPtr=" << (meshPtr_ ? "set" : "NULL") << "]" << endl;
     }
 
-    vtkDataArraySelection *arraySelection = reader_->GetRegionSelection();
+    vtkDataArraySelection *regionSelection = reader_->GetRegionSelection();
 
     wordList namesLst;
 
@@ -309,13 +299,13 @@ void Foam::vtkPV3Foam::updateInformationZones()
         namesLst = readZoneNames("cellZones");
     }
 
-    selectInfoCellZones_ = arraySelection->GetNumberOfArrays();
-    forAll (namesLst, elemI)
+    regionInfoCellZones_ = regionSelection->GetNumberOfArrays();
+    forAll(namesLst, elemI)
     {
-        arraySelection->AddArray((namesLst[elemI] + " - cellZone").c_str());
+        regionSelection->AddArray((namesLst[elemI] + " - cellZone").c_str());
     }
-    selectInfoCellZones_ += namesLst.size();
-    zoneSuperCells_.setSize(selectInfoCellZones_.size());
+    regionInfoCellZones_ += namesLst.size();
+    zoneSuperCells_.setSize(regionInfoCellZones_.size());
 
 
     //
@@ -330,12 +320,15 @@ void Foam::vtkPV3Foam::updateInformationZones()
         namesLst = readZoneNames("faceZones");
     }
 
-    selectInfoFaceZones_ = arraySelection->GetNumberOfArrays();
-    forAll (namesLst, elemI)
+    regionInfoFaceZones_ = regionSelection->GetNumberOfArrays();
+    forAll(namesLst, elemI)
     {
-        arraySelection->AddArray((namesLst[elemI] + " - faceZone").c_str());
+        regionSelection->AddArray
+        (
+            (namesLst[elemI] + " - faceZone").c_str()
+        );
     }
-    selectInfoFaceZones_ += namesLst.size();
+    regionInfoFaceZones_ += namesLst.size();
 
 
     //
@@ -350,32 +343,40 @@ void Foam::vtkPV3Foam::updateInformationZones()
         namesLst = readZoneNames("pointZones");
     }
 
-    selectInfoPointZones_ = arraySelection->GetNumberOfArrays();
-    forAll (namesLst, elemI)
+    regionInfoPointZones_ = regionSelection->GetNumberOfArrays();
+    forAll(namesLst, elemI)
     {
-        arraySelection->AddArray((namesLst[elemI] + " - pointZone").c_str());
+        regionSelection->AddArray
+        (
+            (namesLst[elemI] + " - pointZone").c_str()
+        );
     }
-    selectInfoPointZones_ += namesLst.size();
+    regionInfoPointZones_ += namesLst.size();
 
 
     if (debug)
     {
         // just for debug info
-        getSelectedArrayEntries(arraySelection);
+        getSelectedArrayEntries(regionSelection);
 
-        Info<< "<end> Foam::vtkPV3Foam::updateInformationZones" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::updateInfoZones" << endl;
     }
 }
 
 
-void Foam::vtkPV3Foam::updateInformationSets()
+void Foam::vtkPV3Foam::updateInfoSets()
 {
+    if (!reader_->GetIncludeSets())
+    {
+        return;
+    }
+
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationSets" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::updateInfoSets" << endl;
     }
 
-    vtkDataArraySelection *arraySelection = reader_->GetRegionSelection();
+    vtkDataArraySelection *regionSelection = reader_->GetRegionSelection();
 
     // Add names of sets
     IOobjectList objects
@@ -386,27 +387,27 @@ void Foam::vtkPV3Foam::updateInformationSets()
     );
 
 
-    selectInfoCellSets_ = arraySelection->GetNumberOfArrays();
-    selectInfoCellSets_ += addToSelection<cellSet>
+    regionInfoCellSets_ = regionSelection->GetNumberOfArrays();
+    regionInfoCellSets_ += addToSelection<cellSet>
     (
-        arraySelection,
+        regionSelection,
         objects,
         " - cellSet"
     );
-    csetSuperCells_.setSize(selectInfoCellSets_.size());
+    csetSuperCells_.setSize(regionInfoCellSets_.size());
 
-    selectInfoFaceSets_ = arraySelection->GetNumberOfArrays();
-    selectInfoFaceSets_ += addToSelection<faceSet>
+    regionInfoFaceSets_ = regionSelection->GetNumberOfArrays();
+    regionInfoFaceSets_ += addToSelection<faceSet>
     (
-        arraySelection,
+        regionSelection,
         objects,
         " - faceSet"
     );
 
-    selectInfoPointSets_ = arraySelection->GetNumberOfArrays();
-    selectInfoPointSets_ += addToSelection<pointSet>
+    regionInfoPointSets_ = regionSelection->GetNumberOfArrays();
+    regionInfoPointSets_ += addToSelection<pointSet>
     (
-        arraySelection,
+        regionSelection,
         objects,
         " - pointSet"
     );
@@ -414,82 +415,102 @@ void Foam::vtkPV3Foam::updateInformationSets()
     if (debug)
     {
         // just for debug info
-        getSelectedArrayEntries(arraySelection);
+        getSelectedArrayEntries(regionSelection);
 
-        Info<< "<end> Foam::vtkPV3Foam::updateInformationSets" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::updateInfoSets" << endl;
     }
 }
 
 
-void Foam::vtkPV3Foam::updateInformationLagrangianFields()
+void Foam::vtkPV3Foam::updateInfoLagrangianFields()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationLagrangianFields"
+        Info<< "<beg> Foam::vtkPV3Foam::updateInfoLagrangianFields"
             << endl;
     }
 
-    vtkDataArraySelection *arraySelection =
+    vtkDataArraySelection *fieldSelection =
         reader_->GetLagrangianFieldSelection();
 
+    vtkDataArraySelection *regionSelection =
+        reader_->GetRegionSelection();
+
     // preserve the enabled selections
     stringList selectedEntries = getSelectedArrayEntries
     (
-        arraySelection,
+        fieldSelection,
         true
     );
 
-    arraySelection->RemoveAllArrays();
+    fieldSelection->RemoveAllArrays();
+
+
+    //
+    // TODO - can currently only get fields from ONE cloud
+    //
+
+    const selectionInfo& selector = regionInfoLagrangian_;
+    int regionId = selector.start();
+
+    if (!selector.size() || regionId < 0)
+    {
+        return;
+    }
+
+    word cloudName = getFirstWord
+    (
+        regionSelection->GetArrayName(regionId)
+    );
 
-    // TODO - currently hard-coded to ONE cloud
     IOobjectList objects
     (
         dbPtr_(),
         dbPtr_().timeName(),
-        "lagrangian"/cloudName_
+        "lagrangian"/cloudName
     );
 
     addToSelection<IOField<label> >
     (
-        arraySelection,
+        fieldSelection,
         objects
     );
     addToSelection<IOField<scalar> >
     (
-        arraySelection,
+        fieldSelection,
         objects
     );
     addToSelection<IOField<vector> >
     (
-        arraySelection,
+        fieldSelection,
         objects
     );
     addToSelection<IOField<sphericalTensor> >
     (
-        arraySelection,
+        fieldSelection,
         objects
     );
     addToSelection<IOField<symmTensor> >
     (
-        arraySelection,
+        fieldSelection,
         objects
     );
     addToSelection<IOField<tensor> >
     (
-        arraySelection,
+        fieldSelection,
         objects
     );
 
     // restore the enabled selections
     setSelectedArrayEntries
     (
-        arraySelection,
+        fieldSelection,
         selectedEntries
     );
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::updateInformationLagrangianFields - "
+        Info<< "<end> Foam::vtkPV3Foam::updateInfoLagrangianFields - "
             << "lagrangian objects.size() = " << objects.size() << endl;
     }
 }
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInfoFields.H
similarity index 78%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInfoFields.H
index 601a7f5326d4e52d61842a2306cfcfcf8dfaf01c..540820907760d95f2bf902367dd1ebade5736749 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInfoFields.H
@@ -27,25 +27,25 @@ InClass
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef vtkPV3FoamUpdateInformationFields_H
-#define vtkPV3FoamUpdateInformationFields_H
+#ifndef vtkPV3FoamUpdateInfoFields_H
+#define vtkPV3FoamUpdateInfoFields_H
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 template<template<class> class patchType, class meshType>
-void Foam::vtkPV3Foam::updateInformationFields
+void Foam::vtkPV3Foam::updateInfoFields
 (
-    vtkDataArraySelection *arraySelection
+    vtkDataArraySelection *select
 )
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationFields" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::updateInfoFields" << endl;
     }
 
     stringList selectedEntries;
     // enable 'p' and 'U' on the first call
-    if (arraySelection->GetNumberOfArrays() == 0 && !meshPtr_)
+    if (select->GetNumberOfArrays() == 0 && !meshPtr_)
     {
         selectedEntries.setSize(2);
         selectedEntries[0] = "p";
@@ -54,61 +54,55 @@ void Foam::vtkPV3Foam::updateInformationFields
     else
     {
         // preserve the enabled selections
-        selectedEntries = getSelectedArrayEntries
-        (
-            arraySelection
-        );
+        selectedEntries = getSelectedArrayEntries(select);
     }
 
-    arraySelection->RemoveAllArrays();
+    select->RemoveAllArrays();
 
     // Search for list of objects for this time
     IOobjectList objects(dbPtr_(), dbPtr_().timeName());
-    // Populate the GUI volume/point field arrays
 
     //- Add volume fields to GUI
     addToSelection<GeometricField<scalar, patchType, meshType> >
     (
-        arraySelection,
+        select,
         objects
     );
     addToSelection<GeometricField<vector, patchType, meshType> >
     (
-        arraySelection,
+        select,
         objects
     );
     addToSelection<GeometricField<sphericalTensor, patchType, meshType> >
     (
-        arraySelection,
+        select,
         objects
     );
     addToSelection<GeometricField<symmTensor, patchType, meshType> >
     (
-        arraySelection,
+        select,
         objects
     );
     addToSelection<GeometricField<tensor, patchType, meshType> >
     (
-        arraySelection,
+        select,
         objects
     );
 
     // restore the enabled selections
     setSelectedArrayEntries
     (
-        arraySelection,
+        select,
         selectedEntries
     );
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::updateInformationFields" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::updateInfoFields" << endl;
     }
 }
 
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #endif
-
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertVolFields.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamVolFields.H
similarity index 62%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertVolFields.H
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamVolFields.H
index 7ed194bfa5b4dcf37edcaae2db2c30d564885fab..6413852bffdd995c26f56579364205d729b7e5fb 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertVolFields.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamVolFields.H
@@ -27,16 +27,15 @@ InClass
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef vtkPV3FoamConvertVolFields_H
-#define vtkPV3FoamConvertVolFields_H
+#ifndef vtkPV3FoamVolFields_H
+#define vtkPV3FoamVolFields_H
 
 // Foam includes
 #include "emptyFvPatchField.H"
 #include "wallPolyPatch.H"
 #include "faceSet.H"
-#include "vtkPV3FoamConvertPatchFaceField.H"
-#include "vtkPV3FoamConvertPatchPointField.H"
-#include "vtkPV3FoamConvertFaceField.H"
+#include "vtkPV3FoamFaceField.H"
+#include "vtkPV3FoamPatchField.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -47,10 +46,10 @@ void Foam::vtkPV3Foam::convertVolFields
     const volPointInterpolation& pInterp,
     const PtrList<PrimitivePatchInterpolation<primitivePatch> >& ppInterpList,
     const IOobjectList& objects,
-    vtkDataArraySelection *fieldSelection,
     vtkMultiBlockDataSet* output
 )
 {
+    // field subset based on type
     IOobjectList fieldObjects
     (
         objects.lookupClass
@@ -59,37 +58,16 @@ void Foam::vtkPV3Foam::convertVolFields
         )
     );
 
-    label nFields = fieldSelection->GetNumberOfArrays();
     const polyBoundaryMesh& patches = mesh.boundaryMesh();
+    vtkDataArraySelection* regionSelection = reader_->GetRegionSelection();
 
-    vtkDataArraySelection* arraySelector = reader_->GetRegionSelection();
-
-    for (label i=0; i<nFields; i++)
+    forAllIter(IOobjectList, fieldObjects, iter)
     {
-        const word fieldName = fieldSelection->GetArrayName(i);
-
-        if
-        (
-            !fieldSelection->GetArraySetting(i)
-         || !fieldObjects.found(fieldName))
-        {
-            continue;
-        }
-
-        if (debug)
-        {
-            Info<< "converting volume field: " << fieldName << endl;
-        }
+        word fieldName = iter()->name();
 
         GeometricField<Type, fvPatchField, volMesh> tf
         (
-            IOobject
-            (
-                fieldName,
-                mesh.time().timeName(),
-                mesh,
-                IOobject::MUST_READ
-            ),
+            *iter(),
             mesh
         );
 
@@ -104,14 +82,14 @@ void Foam::vtkPV3Foam::convertVolFields
         //
         for
         (
-            int regionId = selectInfoVolume_.start();
-            regionId < selectInfoVolume_.end();
+            int regionId = regionInfoVolume_.start();
+            regionId < regionInfoVolume_.end();
             ++regionId
         )
         {
-            const label datasetId = selectedRegionDatasetIds_[regionId];
+            const label datasetNo = regionDataset_[regionId];
 
-            if (!selectedRegions_[regionId] || datasetId < 0)
+            if (!regionStatus_[regionId] || datasetNo < 0)
             {
                 continue;
             }
@@ -120,8 +98,8 @@ void Foam::vtkPV3Foam::convertVolFields
             (
                 tf,
                 output,
-                selectInfoVolume_,
-                datasetId,
+                regionInfoVolume_,
+                datasetNo,
                 superCells_
             );
             convertPointField
@@ -129,8 +107,8 @@ void Foam::vtkPV3Foam::convertVolFields
                 tptf(),
                 tf,
                 output,
-                selectInfoVolume_,
-                datasetId
+                regionInfoVolume_,
+                datasetNo
             );
         }
 
@@ -139,29 +117,25 @@ void Foam::vtkPV3Foam::convertVolFields
         //
         for
         (
-            int regionId = selectInfoPatches_.start();
-            regionId < selectInfoPatches_.end();
+            int regionId = regionInfoPatches_.start();
+            regionId < regionInfoPatches_.end();
             ++regionId
         )
         {
-            const label datasetId = selectedRegionDatasetIds_[regionId];
+            word patchName = getFirstWord
+            (
+                regionSelection->GetArrayName(regionId)
+            );
 
-            if (!selectedRegions_[regionId] || datasetId < 0)
+            const label datasetNo = regionDataset_[regionId];
+            const label patchId = patches.findPatchID(patchName);
+
+            if (!regionStatus_[regionId] || datasetNo < 0 || patchId < 0)
             {
                 continue;
             }
 
-            word selectName = getFirstWord
-            (
-                arraySelector->GetArrayName(regionId)
-            );
-
-            const label patchId = patches.findPatchID(selectName);
-
-            const fvPatchField<Type>& ptf
-            (
-                tf.boundaryField()[patchId]
-            );
+            const fvPatchField<Type>& ptf = tf.boundaryField()[patchId];
 
             if
             (
@@ -179,24 +153,24 @@ void Foam::vtkPV3Foam::convertVolFields
                     tf.mesh().boundary()
                 );
 
-                convertPatchFaceField
+                convertPatchField
                 (
                     tf.name(),
                     fvPatchField<Type>(p, tf).patchInternalField()(),
                     output,
-                    selectInfoPatches_,
-                    datasetId
+                    regionInfoPatches_,
+                    datasetNo
                 );
             }
             else
             {
-                convertPatchFaceField
+                convertPatchField
                 (
                     tf.name(),
                     ptf,
                     output,
-                    selectInfoPatches_,
-                    datasetId
+                    regionInfoPatches_,
+                    datasetNo
                 );
             }
 
@@ -205,8 +179,8 @@ void Foam::vtkPV3Foam::convertVolFields
                 tf.name(),
                 ppInterpList[patchId].faceToPointInterpolate(ptf)(),
                 output,
-                selectInfoPatches_,
-                datasetId
+                regionInfoPatches_,
+                datasetNo
             );
         }
 
@@ -215,14 +189,14 @@ void Foam::vtkPV3Foam::convertVolFields
         //
         for
         (
-            int regionId = selectInfoCellZones_.start();
-            regionId < selectInfoCellZones_.end();
+            int regionId = regionInfoCellZones_.start();
+            regionId < regionInfoCellZones_.end();
             ++regionId
         )
         {
-            const label datasetId = selectedRegionDatasetIds_[regionId];
+            const label datasetNo = regionDataset_[regionId];
 
-            if (!selectedRegions_[regionId] || datasetId < 0)
+            if (!regionStatus_[regionId] || datasetNo < 0)
             {
                 continue;
             }
@@ -230,7 +204,7 @@ void Foam::vtkPV3Foam::convertVolFields
             if (debug)
             {
                 Info<< "wish to convert cellzone: "
-                    << getFirstWord(arraySelector->GetArrayName(regionId))
+                    << getFirstWord(regionSelection->GetArrayName(regionId))
                     << " regionId: " << regionId
                     << " volume field: " << fieldName
                     << endl;
@@ -240,9 +214,9 @@ void Foam::vtkPV3Foam::convertVolFields
             (
                 tf,
                 output,
-                selectInfoCellZones_,
-                datasetId,
-                zoneSuperCells_[datasetId]
+                regionInfoCellZones_,
+                datasetNo,
+                zoneSuperCells_[datasetNo]
             );
         }
 
@@ -251,14 +225,14 @@ void Foam::vtkPV3Foam::convertVolFields
         //
         for
         (
-            int regionId = selectInfoCellSets_.start();
-            regionId < selectInfoCellSets_.end();
+            int regionId = regionInfoCellSets_.start();
+            regionId < regionInfoCellSets_.end();
             ++regionId
         )
         {
-            const label datasetId = selectedRegionDatasetIds_[regionId];
+            const label datasetNo = regionDataset_[regionId];
 
-            if (!selectedRegions_[regionId] || datasetId < 0)
+            if (!regionStatus_[regionId] || datasetNo < 0)
             {
                 continue;
             }
@@ -266,7 +240,7 @@ void Foam::vtkPV3Foam::convertVolFields
             if (debug)
             {
                 Info<< "wish to convert cellset: "
-                    << getFirstWord(arraySelector->GetArrayName(regionId))
+                    << getFirstWord(regionSelection->GetArrayName(regionId))
                     << " regionId: " << regionId
                     << " volume field: " << fieldName
                     << endl;
@@ -276,9 +250,9 @@ void Foam::vtkPV3Foam::convertVolFields
             (
                 tf,
                 output,
-                selectInfoCellSets_,
-                datasetId,
-                csetSuperCells_[datasetId]
+                regionInfoCellSets_,
+                datasetNo,
+                csetSuperCells_[datasetNo]
             );
         }
 
@@ -287,14 +261,26 @@ void Foam::vtkPV3Foam::convertVolFields
         //
         for
         (
-            int regionId = selectInfoFaceZones_.start();
-            regionId < selectInfoFaceZones_.end();
+            int regionId = regionInfoFaceZones_.start();
+            regionId < regionInfoFaceZones_.end();
             ++regionId
         )
         {
-            const label datasetId = selectedRegionDatasetIds_[regionId];
+            word zoneName = getFirstWord
+            (
+                regionSelection->GetArrayName(regionId)
+            );
+            const label datasetNo = regionDataset_[regionId];
 
-            if (!selectedRegions_[regionId] || datasetId < 0)
+            if (!regionStatus_[regionId] || datasetNo < 0)
+            {
+                continue;
+            }
+
+            const faceZoneMesh& zMesh = mesh.faceZones();
+            const label zoneId = zMesh.findZoneID(zoneName);
+
+            if (zoneId < 0)
             {
                 continue;
             }
@@ -302,23 +288,20 @@ void Foam::vtkPV3Foam::convertVolFields
             if (debug)
             {
                 Info<< "wish to convert facezone: "
-                    << getFirstWord(arraySelector->GetArrayName(regionId))
+                    << zoneName
                     << " regionId: " << regionId
                     << " volume field: " << fieldName
                     << endl;
             }
 
-            const faceZoneMesh& fzMesh = mesh.faceZones();
-            const label zoneI = regionId - selectInfoFaceZones_.start();
-
             convertFaceField
             (
                 tf,
                 output,
-                selectInfoFaceZones_,
-                datasetId,
+                regionInfoFaceZones_,
+                datasetNo,
                 mesh,
-                fzMesh[zoneI]
+                zMesh[zoneId]
             );
         }
 
@@ -327,21 +310,20 @@ void Foam::vtkPV3Foam::convertVolFields
         //
         for
         (
-            int regionId = selectInfoFaceSets_.start();
-            regionId < selectInfoFaceSets_.end();
+            int regionId = regionInfoFaceSets_.start();
+            regionId < regionInfoFaceSets_.end();
             ++regionId
         )
         {
-            const label datasetId = selectedRegionDatasetIds_[regionId];
-
-            if (!selectedRegions_[regionId] || datasetId < 0)
+            const label datasetNo = regionDataset_[regionId];
+            if (!regionStatus_[regionId] || datasetNo < 0)
             {
                 continue;
             }
 
             word selectName = getFirstWord
             (
-                arraySelector->GetArrayName(regionId)
+                regionSelection->GetArrayName(regionId)
             );
 
             if (debug)
@@ -354,13 +336,12 @@ void Foam::vtkPV3Foam::convertVolFields
 
             const faceSet fSet(mesh, selectName);
 
-
             convertFaceField
             (
                 tf,
                 output,
-                selectInfoFaceSets_,
-                datasetId,
+                regionInfoFaceSets_,
+                datasetNo,
                 mesh,
                 fSet
             );
@@ -387,30 +368,30 @@ void Foam::vtkPV3Foam::convertVolField
     );
 
     vtkFloatArray* celldata = vtkFloatArray::New();
-    celldata->SetNumberOfTuples(superCells.size());
-    celldata->SetNumberOfComponents(nComp);
-    celldata->Allocate(nComp*superCells.size());
-    celldata->SetName(tf.name().c_str());
+    celldata->SetNumberOfTuples( superCells.size() );
+    celldata->SetNumberOfComponents( nComp );
+    celldata->Allocate( nComp*superCells.size() );
+    celldata->SetName( tf.name().c_str() );
 
     if (debug)
     {
-        Info<< "converting vol<Type>Field: " << tf.name() << nl
-            << "field size = " << tf.size() << nl
-            << "nTuples = " << superCells.size() << nl
-            << "nComp  = " << nComp << endl;
+        Info<< "convert volField: "
+            << tf.name()
+            << " size = " << tf.size()
+            << " nComp=" << nComp
+            << " nTuples = " << superCells.size() <<  endl;
     }
 
     float vec[nComp];
-
-    forAll(superCells, scI)
+    forAll(superCells, i)
     {
-        const Type& t = tf[superCells[scI]];
+        const Type& t = tf[superCells[i]];
         for (direction d=0; d<nComp; d++)
         {
             vec[d] = component(t, d);
         }
 
-        celldata->InsertTuple(scI, vec);
+        celldata->InsertTuple(i, vec);
     }
 
     vtkmesh->GetCellData()->AddArray(celldata);