diff --git a/applications/solvers/multiphase/twoPhaseEulerFoam/kineticTheoryModels/kineticTheoryModel/kineticTheoryModel.C b/applications/solvers/multiphase/twoPhaseEulerFoam/kineticTheoryModels/kineticTheoryModel/kineticTheoryModel.C
index 54590f55a338ee2f7912b542ecaa344445249ce5..724602009a6b5c7457199d92c9768b2e81332def 100644
--- a/applications/solvers/multiphase/twoPhaseEulerFoam/kineticTheoryModels/kineticTheoryModel/kineticTheoryModel.C
+++ b/applications/solvers/multiphase/twoPhaseEulerFoam/kineticTheoryModels/kineticTheoryModel/kineticTheoryModel.C
@@ -256,8 +256,7 @@ void Foam::kineticTheoryModel::solve()
        /(alpha*rhoa_*sqrtPi*(ThetaSqrt + TsmallSqrt));
 
     // bulk viscosity  p. 45 (Lun et al. 1984).
-    volScalarField lambda_ =
-        (4.0/3.0)*sqr(alpha_)*rhoa_*da_*gs0_*(1.0+e_)*ThetaSqrt/sqrtPi;
+    lambda_ = (4.0/3.0)*sqr(alpha_)*rhoa_*da_*gs0_*(1.0+e_)*ThetaSqrt/sqrtPi;
 
 
     // stress tensor, Definitions, Table 3.1, p. 43
diff --git a/applications/utilities/mesh/conversion/Optional/Allwmake b/applications/utilities/mesh/conversion/Optional/Allwmake
index 31617e3b12578fff89727d64fbc924c8fd09a65d..ca1fbac090eeefb0ce10abb09da231e311ee962f 100755
--- a/applications/utilities/mesh/conversion/Optional/Allwmake
+++ b/applications/utilities/mesh/conversion/Optional/Allwmake
@@ -5,15 +5,12 @@ set -x
 # run from this directory only
 cd ${0%/*} || exit 1
 
-# build libccmio if required
-if [ ! -e $FOAM_LIBBIN/libccmio.so ]
-then
+# build libccmio and create lnInclude directory
 (
    cd $WM_THIRD_PARTY_DIR && ./AllwmakeLibccmio
 )
-fi
 
-# if the library built okay, the headers must exist too
+# if the library built okay, the headers should exist too
 if [ -e $FOAM_LIBBIN/libccmio.so ]
 then
    wmake ccm26ToFoam
diff --git a/applications/utilities/mesh/generation/blockMesh/blockMeshApp.C b/applications/utilities/mesh/generation/blockMesh/blockMeshApp.C
index e337b0d1678495f33304ff2fa3bd4653283161e7..e73a5262b9b33702b83ecccb9a730254b56a1776 100644
--- a/applications/utilities/mesh/generation/blockMesh/blockMeshApp.C
+++ b/applications/utilities/mesh/generation/blockMesh/blockMeshApp.C
@@ -22,9 +22,29 @@ License
     along with OpenFOAM; if not, write to the Free Software Foundation,
     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
+Application
+    blockMesh
+
 Description
     A multi-block mesh generator.
 
+    Uses the block mesh description found in
+    @a constant/polyMesh/blockMeshDict
+    (or @a constant/\<region\>/polyMesh/blockMeshDict).
+
+Usage
+
+    - blockMesh [OPTION]
+
+    @param -blockTopology \n
+    Write the topology as a set of edges in OBJ format.
+
+    @param -region \<name\> \n
+    Specify an alternative mesh region.
+
+    @param -dict \<dictionary\> \n
+    Specify an alternative dictionary for the block mesh description.
+
 \*---------------------------------------------------------------------------*/
 
 #include "Time.H"
@@ -60,59 +80,70 @@ int main(int argc, char *argv[])
 
     word regionName;
     fileName polyMeshDir;
+    word dictName("blockMeshDict");
+    fileName dictPath(runTime.constant());
 
     if (args.options().found("region"))
     {
-        regionName = args.options()["region"];
+        // constant/<region>/polyMesh/blockMeshDict
+        regionName  = args.options()["region"];
         polyMeshDir = regionName/polyMesh::meshSubDir;
 
         Info<< nl << "Generating mesh for region " << regionName << endl;
     }
     else
     {
-        regionName = polyMesh::defaultRegion;
+        // constant/polyMesh/blockMeshDict
+        regionName  = polyMesh::defaultRegion;
         polyMeshDir = polyMesh::meshSubDir;
     }
 
-
-    Info<< nl << "Reading block mesh description dictionary" << endl;
-
-    word dictName("blockMeshDict");
-    fileName dictPath(runTime.constant()/polyMeshDir);
+    fileName dictLocal = polyMeshDir;
 
     if (args.options().found("dict"))
     {
-        fileName userDict(args.options()["dict"]);
+        wordList elems(fileName(args.options()["dict"]).components());
+        dictName = elems[elems.size()-1];
+        dictPath = elems[0];
+        dictLocal = "";
 
-        dictName = userDict.name();
-        dictPath = userDict.path();
+        if (elems.size() == 1)
+        {
+            dictPath = ".";
+        }
+        else if (elems.size() > 2)
+        {
+            dictLocal = fileName(SubList<word>(elems, elems.size()-2, 1));
+        }
     }
 
-    IOobject meshDescriptionIOobject
+
+    IOobject meshDictIo
     (
         dictName,
         dictPath,
+        dictLocal,
         runTime,
         IOobject::MUST_READ,
         IOobject::NO_WRITE,
         false
     );
 
-    if (!meshDescriptionIOobject.headerOk())
+    if (!meshDictIo.headerOk())
     {
         FatalErrorIn(args.executable())
-            << "Cannot open mesh description file: " << nl
-            << dictPath/dictName << nl
+            << "Cannot open mesh description file\n    "
+            << meshDictIo.objectPath()
+            << nl
             << exit(FatalError);
     }
 
-    IOdictionary meshDescription(meshDescriptionIOobject);
-
-
-    Info<< nl << "Creating block mesh" << endl;
+    Info<< nl << "Creating block mesh from\n    "
+        << meshDictIo.objectPath() << endl;
 
-    blockMesh blocks(meshDescription);
+    IOdictionary meshDict(meshDictIo);
 
+    blockMesh blocks(meshDict);
 
     if (writeTopo)
     {
@@ -169,7 +200,7 @@ int main(int argc, char *argv[])
     (
         runTime,
         runTime.constant(),
-        polyMeshDir,            //polyMesh::meshSubDir
+        polyMeshDir,
         patchNames,
         patchTypes,
         defaultFacesName,
@@ -197,11 +228,11 @@ int main(int argc, char *argv[])
 
 
     // Read in a list of dictionaries for the merge patch pairs
-    if (meshDescription.found("mergePatchPairs"))
+    if (meshDict.found("mergePatchPairs"))
     {
         List<Pair<word> > mergePatchPairs
         (
-            meshDescription.lookup("mergePatchPairs")
+            meshDict.lookup("mergePatchPairs")
         );
 
         if (mergePatchPairs.size())
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/Allwclean b/applications/utilities/postProcessing/graphics/PV3FoamReader/Allwclean
index 0993c14cee915610b0aac195b75341855b7990bd..206ee020896e33df69584c40ee2f5886ce98c9f7 100755
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/Allwclean
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/Allwclean
@@ -1,7 +1,5 @@
 #!/bin/sh
 set -x
 
-rm -r PV3FoamReader/Make
-
+rm -rf PV3FoamReader/Make
 wclean libso vtkPV3Foam
-
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader.xml b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader.xml
index 41b44048d95e5494b510a3cf43249d4a3b62a3c7..123c736f549cdcfed15b7c9792ef46fdcf1cd940 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader.xml
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader.xml
@@ -1,6 +1,6 @@
 <ParaViewReaders>
   <Reader name="PV3FoamReader"
           extensions="OpenFOAM"
-          file_description="OpenFOAM">
+          file_description="OpenFOAM Reader">
   </Reader>
 </ParaViewReaders>
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml
index c097562a53a989c0abc152fd95247f0a8c8fcc20..07620fd849b9590f0c18a8e70d86dc868719bb7f 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/PV3FoamReader_SM.xml
@@ -31,26 +31,6 @@
             <TimeRangeInformationHelper/>
         </DoubleVectorProperty>
 
-<!-- Update GUI check box -->
-        <IntVectorProperty
-            name="UpdateGUI"
-            command="SetUpdateGUI"
-            number_of_elements="1"
-            default_values="0">
-            <BooleanDomain
-                name="bool"/>
-        </IntVectorProperty>
-
-<!-- Cache mesh check box -->
-        <IntVectorProperty
-            name="CacheMesh"
-            command="SetCacheMesh"
-            number_of_elements="1"
-            default_values="1">
-            <BooleanDomain
-                name="bool"/>
-        </IntVectorProperty>
-
 <!-- ExtrapolateWalls check box -->
         <IntVectorProperty
             name="ExtrapolateWalls"
@@ -186,34 +166,25 @@
             </ArraySelectionDomain>
         </StringVectorProperty>
 
-<!-- Available times array -->
-<!-- PV3FOAM_TIMESELECTION must be defined when compiling vtkPV3Foam
-     might discard this in the future
-        <StringVectorProperty
-            name="TimeArrayInfo"
-            information_only="1">
-            <ArraySelectionInformationHelper
-                attribute_name="Time"/>
-        </StringVectorProperty>
-        <StringVectorProperty
-            name="TimeStatus"
-            command="SetTimeArrayStatus"
-            number_of_elements="0"
-            repeat_command="1"
-            number_of_elements_per_command="2"
-            element_types="2 0"
-            information_property="TimeArrayInfo">
-            <ArraySelectionDomain
-                name="array_list">
-                <RequiredProperties>
-                    <Property name="TimeArrayInfo"
-                              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>
 
-PV3FOAM_TIMESELECTION
--->
+<!-- Update GUI check box -->
+        <IntVectorProperty
+            name="UpdateGUI"
+            command="SetUpdateGUI"
+            number_of_elements="1"
+            default_values="0">
+            <BooleanDomain
+                name="bool"/>
+        </IntVectorProperty>
 
     </SourceProxy>
     </ProxyGroup>
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx
index 3e576a77db08c0662d91100f4bb7494e843c6393..81885deee700655016c3a9afbbf36ea0d2f8bac1 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.cxx
@@ -21,32 +21,19 @@
 
 // VTK includes
 #include "vtkCallbackCommand.h"
-#include "vtkCellArray.h"
-#include "vtkCellData.h"
 #include "vtkDataArraySelection.h"
-#include "vtkDirectory.h"
-#include "vtkDoubleArray.h"
-#include "vtkErrorCode.h"
-#include "vtkFloatArray.h"
 #include "vtkInformation.h"
 #include "vtkInformationVector.h"
-#include "vtkIntArray.h"
 #include "vtkMultiBlockDataSet.h"
 #include "vtkObjectFactory.h"
-#include "vtkPoints.h"
-#include "vtkRenderer.h"
 #include "vtkSMRenderViewProxy.h"
 #include "vtkStreamingDemandDrivenPipeline.h"
 #include "vtkStringArray.h"
-#include "vtkUnstructuredGrid.h"
-#include "vtkUnstructuredGridAlgorithm.h"
-#include "vtkAlgorithmOutput.h"
-#include "vtkMultiBlockDataSet.h"
 
 // Foam includes
 #include "vtkPV3Foam.H"
 
-vtkCxxRevisionMacro(vtkPV3FoamReader, "$Revision: 1.2$");
+vtkCxxRevisionMacro(vtkPV3FoamReader, "$Revision: 1.5$");
 vtkStandardNewMacro(vtkPV3FoamReader);
 
 
@@ -60,17 +47,22 @@ vtkPV3FoamReader::vtkPV3FoamReader()
     FileName  = NULL;
     foamData_ = NULL;
 
-    CacheMesh = 0;
+    output1_ = NULL;
 
-    UpdateGUI = 1;
-    UpdateGUIOld = 1;
     TimeStep = 0;
     TimeStepRange[0] = 0;
     TimeStepRange[1] = 0;
 
+    CacheMesh = 0;
+
+    ExtrapolateWalls = 0;
+    IncludeSets = 0;
+    IncludeZones = 0;
     ShowPatchNames = 0;
 
-    TimeSelection = vtkDataArraySelection::New();
+    UpdateGUI = 1;
+    UpdateGUIOld = 1;
+
     RegionSelection = vtkDataArraySelection::New();
     VolFieldSelection = vtkDataArraySelection::New();
     PointFieldSelection = vtkDataArraySelection::New();
@@ -85,11 +77,6 @@ vtkPV3FoamReader::vtkPV3FoamReader()
     );
     SelectionObserver->SetClientData(this);
 
-    TimeSelection->AddObserver
-    (
-        vtkCommand::ModifiedEvent,
-        this->SelectionObserver
-    );
     RegionSelection->AddObserver
     (
         vtkCommand::ModifiedEvent,
@@ -112,6 +99,7 @@ vtkPV3FoamReader::vtkPV3FoamReader()
     );
 }
 
+
 vtkPV3FoamReader::~vtkPV3FoamReader()
 {
     vtkDebugMacro(<<"Deconstructor");
@@ -126,7 +114,6 @@ vtkPV3FoamReader::~vtkPV3FoamReader()
         delete [] FileName;
     }
 
-    TimeSelection->RemoveObserver(this->SelectionObserver);
     RegionSelection->RemoveObserver(this->SelectionObserver);
     VolFieldSelection->RemoveObserver(this->SelectionObserver);
     PointFieldSelection->RemoveObserver(this->SelectionObserver);
@@ -134,7 +121,6 @@ vtkPV3FoamReader::~vtkPV3FoamReader()
 
     SelectionObserver->Delete();
 
-    TimeSelection->Delete();
     RegionSelection->Delete();
     VolFieldSelection->Delete();
     PointFieldSelection->Delete();
@@ -152,7 +138,6 @@ int vtkPV3FoamReader::RequestInformation
 {
     vtkDebugMacro(<<"RequestInformation");
 
-
     if (Foam::vtkPV3Foam::debug)
     {
         cout<<"REQUEST_INFORMATION\n";
@@ -164,38 +149,6 @@ int vtkPV3FoamReader::RequestInformation
         return 0;
     }
 
-    if (Foam::vtkPV3Foam::debug)
-    {
-        vtkInformation* outputInfo = this->GetOutputPortInformation(0);
-
-        vtkMultiBlockDataSet* output = vtkMultiBlockDataSet::SafeDownCast
-        (
-            outputInfo->Get(vtkMultiBlockDataSet::DATA_OBJECT())
-        );
-
-        outputInfo->Print(cout);
-        if (output)
-        {
-            output->Print(cout);
-        }
-        else
-        {
-            cout << "no output\n";
-        }
-
-        this->GetExecutive()->GetOutputInformation(0)->Print(cout);
-
-        int nInfo = outputVector->GetNumberOfInformationObjects();
-
-        cout<< "requestInfo with " << nInfo << " items:\n";
-
-        for (int i=0; i<nInfo; i++)
-        {
-            vtkInformation *info = outputVector->GetInformationObject(i);
-            info->Print(cout);
-        }
-    }
-
     vtkInformation *outInfo = outputVector->GetInformationObject(0);
 
     if (!foamData_)
@@ -205,17 +158,22 @@ int vtkPV3FoamReader::RequestInformation
         (
             outInfo->Get(vtkMultiBlockDataSet::DATA_OBJECT())
         );
-        foamData_ = new Foam::vtkPV3Foam(FileName, this, output);
-        foamData_->UpdateInformation();
+
+        if (Foam::vtkPV3Foam::debug)
+        {
+            cout<< "constructed vtkPV3Foam with output: ";
+            output->Print(cout);
+        }
+
+        foamData_ = new Foam::vtkPV3Foam(FileName, this);
     }
     else
     {
-        vtkDebugMacro("RequestInformation: updating information");
         foamData_->UpdateInformation();
     }
 
     int nTimeSteps = 0;
-    double* timeSteps = foamData_->timeSteps(nTimeSteps);
+    double* timeSteps = foamData_->findTimes(nTimeSteps);
 
     outInfo->Set
     (
@@ -230,7 +188,7 @@ int vtkPV3FoamReader::RequestInformation
         timeRange[0] = timeSteps[0];
         timeRange[1] = timeSteps[nTimeSteps-1];
 
-        if (Foam::vtkPV3Foam::debug)
+        if (Foam::vtkPV3Foam::debug > 1)
         {
             cout<<"nTimeSteps " << nTimeSteps << "\n";
             cout<<"timeRange " << timeRange[0] << " to " << timeRange[1] << "\n";
@@ -271,20 +229,15 @@ int vtkPV3FoamReader::RequestData
         return 0;
     }
 
+    if (Foam::vtkPV3Foam::debug)
     {
         int nInfo = outputVector->GetNumberOfInformationObjects();
-        if (Foam::vtkPV3Foam::debug)
-        {
-            cout<<"requestData with " << nInfo << " items\n";
-        }
-        for (int i=0; i<nInfo; i++)
+        cout<<"requestData with " << nInfo << " items\n";
+
+        for (int i = 0; i < nInfo; ++i)
         {
             vtkInformation *info = outputVector->GetInformationObject(i);
-
-            if (Foam::vtkPV3Foam::debug)
-            {
-                info->Print(cout);
-            }
+            info->Print(cout);
         }
     }
 
@@ -330,7 +283,7 @@ int vtkPV3FoamReader::RequestData
         }
         else
         {
-            cout << "no data_object\n";
+            cout<< "no data_object\n";
         }
     }
 
@@ -423,91 +376,29 @@ void vtkPV3FoamReader::removePatchNamesFromView()
 }
 
 
-void vtkPV3FoamReader::PrintSelf
-(
-    ostream& os,
-    vtkIndent indent
-)
+void vtkPV3FoamReader::PrintSelf(ostream& os, vtkIndent indent)
 {
     vtkDebugMacro(<<"PrintSelf");
 
     this->Superclass::PrintSelf(os,indent);
     os<< indent << "File name: "
       << (this->FileName ? this->FileName : "(none)") << "\n";
-    os<< indent << "Number of meshes: " << foamData_->numberOfMeshes() << "\n";
-    os<< indent << "Number of nodes: " << foamData_->numberOfPoints() << "\n";
-    os<< indent << "Number of cells: " << foamData_->numberOfCells() << "\n";
-    os<< indent << "Number of available time steps: " << foamData_->numberOfAvailableTimes()
-      << endl;
+
+    foamData_->PrintSelf(os, indent);
+
     os<< indent << "Time step range: "
       << this->TimeStepRange[0] << " - " << this->TimeStepRange[1]
-      << endl;
+      << "\n";
     os<< indent << "Time step: " << this->TimeStep << endl;
-    return;
-}
-
-
-vtkDataArraySelection* vtkPV3FoamReader::GetTimeSelection()
-{
-    vtkDebugMacro(<<"GetTimeSelection");
-
-    return TimeSelection;
-}
-
-
-int vtkPV3FoamReader::GetNumberOfTimeArrays()
-{
-    vtkDebugMacro(<<"GetNumberOf TimeArrays");
-
-    return TimeSelection->GetNumberOfArrays();
-}
-
-
-const char* vtkPV3FoamReader::GetTimeArrayName
-(
-    int index
-)
-{
-    vtkDebugMacro(<<"GetTimeArrayName");
-
-    return TimeSelection->GetArrayName(index);
-}
-
-
-int vtkPV3FoamReader::GetTimeArrayStatus
-(
-    const char* name
-)
-{
-    vtkDebugMacro(<<"GetTimeArrayStatus");
-
-    return TimeSelection->ArrayIsEnabled(name);
 }
 
 
-void vtkPV3FoamReader::SetTimeArrayStatus
-(
-    const char* name,
-    int status
-)
-{
-    vtkDebugMacro(<<"SetTimeArrayStatus");
-
-    if (status)
-    {
-        TimeSelection->EnableArray(name);
-    }
-    else
-    {
-        TimeSelection->DisableArray(name);
-    }
-}
-
+// ----------------------------------------------------------------------
+// Region selection list control
 
 vtkDataArraySelection* vtkPV3FoamReader::GetRegionSelection()
 {
     vtkDebugMacro(<<"GetRegionSelection");
-
     return RegionSelection;
 }
 
@@ -515,42 +406,29 @@ vtkDataArraySelection* vtkPV3FoamReader::GetRegionSelection()
 int vtkPV3FoamReader::GetNumberOfRegionArrays()
 {
     vtkDebugMacro(<<"GetNumberOfRegionArrays");
-
     return RegionSelection->GetNumberOfArrays();
 }
 
 
-const char* vtkPV3FoamReader::GetRegionArrayName
-(
-    int index
-)
+const char* vtkPV3FoamReader::GetRegionArrayName(int index)
 {
     vtkDebugMacro(<<"GetRegionArrayName");
-
     return RegionSelection->GetArrayName(index);
 }
 
 
-int vtkPV3FoamReader::GetRegionArrayStatus
-(
-    const char* name
-)
+int vtkPV3FoamReader::GetRegionArrayStatus(const char* name)
 {
     vtkDebugMacro(<<"GetRegionArrayStatus");
-
     return RegionSelection->ArrayIsEnabled(name);
 }
 
 
-void vtkPV3FoamReader::SetRegionArrayStatus
-(
-    const char* name,
-    int status
-)
+void vtkPV3FoamReader::SetRegionArrayStatus(const char* name, int status)
 {
     vtkDebugMacro(<<"SetRegionArrayStatus");
 
-    if(status)
+    if (status)
     {
         RegionSelection->EnableArray(name);
     }
@@ -561,10 +439,12 @@ void vtkPV3FoamReader::SetRegionArrayStatus
 }
 
 
+// ----------------------------------------------------------------------
+// volField selection list control
+
 vtkDataArraySelection* vtkPV3FoamReader::GetVolFieldSelection()
 {
     vtkDebugMacro(<<"GetVolFieldSelection");
-
     return VolFieldSelection;
 }
 
@@ -572,41 +452,27 @@ vtkDataArraySelection* vtkPV3FoamReader::GetVolFieldSelection()
 int vtkPV3FoamReader::GetNumberOfVolFieldArrays()
 {
     vtkDebugMacro(<<"GetNumberOfVolFieldArrays");
-
     return VolFieldSelection->GetNumberOfArrays();
 }
 
 
-const char* vtkPV3FoamReader::GetVolFieldArrayName
-(
-    int index
-)
+const char* vtkPV3FoamReader::GetVolFieldArrayName(int index)
 {
     vtkDebugMacro(<<"GetVolFieldArrayName");
-
     return VolFieldSelection->GetArrayName(index);
 }
 
 
-int vtkPV3FoamReader::GetVolFieldArrayStatus
-(
-    const char* name
-)
+int vtkPV3FoamReader::GetVolFieldArrayStatus(const char* name)
 {
     vtkDebugMacro(<<"GetVolFieldArrayStatus");
-
     return VolFieldSelection->ArrayIsEnabled(name);
 }
 
 
-void vtkPV3FoamReader::SetVolFieldArrayStatus
-(
-    const char* name,
-    int status
-)
+void vtkPV3FoamReader::SetVolFieldArrayStatus(const char* name, int status)
 {
     vtkDebugMacro(<<"SetVolFieldArrayStatus");
-
     if (status)
     {
         VolFieldSelection->EnableArray(name);
@@ -618,10 +484,12 @@ void vtkPV3FoamReader::SetVolFieldArrayStatus
 }
 
 
+// ----------------------------------------------------------------------
+// pointField selection list control
+
 vtkDataArraySelection* vtkPV3FoamReader::GetPointFieldSelection()
 {
     vtkDebugMacro(<<"GetPointFieldSelection");
-
     return PointFieldSelection;
 }
 
@@ -629,41 +497,27 @@ vtkDataArraySelection* vtkPV3FoamReader::GetPointFieldSelection()
 int vtkPV3FoamReader::GetNumberOfPointFieldArrays()
 {
     vtkDebugMacro(<<"GetNumberOfPointFieldArrays");
-
     return PointFieldSelection->GetNumberOfArrays();
 }
 
 
-const char* vtkPV3FoamReader::GetPointFieldArrayName
-(
-    int index
-)
+const char* vtkPV3FoamReader::GetPointFieldArrayName(int index)
 {
     vtkDebugMacro(<<"GetPointFieldArrayName");
-
     return PointFieldSelection->GetArrayName(index);
 }
 
 
-int vtkPV3FoamReader::GetPointFieldArrayStatus
-(
-    const char* name
-)
+int vtkPV3FoamReader::GetPointFieldArrayStatus(const char* name)
 {
     vtkDebugMacro(<<"GetPointFieldArrayStatus");
-
     return PointFieldSelection->ArrayIsEnabled(name);
 }
 
 
-void vtkPV3FoamReader::SetPointFieldArrayStatus
-(
-    const char* name,
-    int status
-)
+void vtkPV3FoamReader::SetPointFieldArrayStatus(const char* name, int status)
 {
     vtkDebugMacro(<<"SetPointFieldArrayStatus");
-
     if (status)
     {
         PointFieldSelection->EnableArray(name);
@@ -675,10 +529,12 @@ void vtkPV3FoamReader::SetPointFieldArrayStatus
 }
 
 
+// ----------------------------------------------------------------------
+// lagrangianField selection list control
+
 vtkDataArraySelection* vtkPV3FoamReader::GetLagrangianFieldSelection()
 {
     vtkDebugMacro(<<"GetLagrangianFieldSelection");
-
     return LagrangianFieldSelection;
 }
 
@@ -686,29 +542,20 @@ vtkDataArraySelection* vtkPV3FoamReader::GetLagrangianFieldSelection()
 int vtkPV3FoamReader::GetNumberOfLagrangianFieldArrays()
 {
     vtkDebugMacro(<<"GetNumberOfLagrangianFieldArrays");
-
     return LagrangianFieldSelection->GetNumberOfArrays();
 }
 
 
-const char* vtkPV3FoamReader::GetLagrangianFieldArrayName
-(
-    int index
-)
+const char* vtkPV3FoamReader::GetLagrangianFieldArrayName(int index)
 {
     vtkDebugMacro(<<"GetLagrangianFieldArrayName");
-
     return LagrangianFieldSelection->GetArrayName(index);
 }
 
 
-int vtkPV3FoamReader::GetLagrangianFieldArrayStatus
-(
-    const char* name
-)
+int vtkPV3FoamReader::GetLagrangianFieldArrayStatus(const char* name)
 {
     vtkDebugMacro(<<"GetLagrangianFieldArrayStatus");
-
     return LagrangianFieldSelection->ArrayIsEnabled(name);
 }
 
@@ -720,7 +567,6 @@ void vtkPV3FoamReader::SetLagrangianFieldArrayStatus
 )
 {
     vtkDebugMacro(<<"SetLagrangianFieldArrayStatus");
-
     if (status)
     {
         LagrangianFieldSelection->EnableArray(name);
@@ -731,6 +577,7 @@ void vtkPV3FoamReader::SetLagrangianFieldArrayStatus
     }
 }
 
+// ----------------------------------------------------------------------
 
 void vtkPV3FoamReader::SelectionModifiedCallback
 (
@@ -747,7 +594,7 @@ void vtkPV3FoamReader::SelectionModifiedCallback
 void vtkPV3FoamReader::SelectionModified()
 {
     vtkDebugMacro(<<"SelectionModified");
-
     Modified();
 }
 
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h
index 9e64260f815a09ee309baacecd6abfe091d279c5..8611884b519da42e8186240f73c11a5335d28179 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/PV3FoamReader/vtkPV3FoamReader.h
@@ -14,11 +14,9 @@
 =========================================================================*/
 // .NAME vtkPV3FoamReader - reads a dataset in OpenFOAM format
 // .SECTION Description
-// vtkPV3FoamReader creates an multiblock dataset. It reads a controlDict
-// file, mesh information, and time dependent data.  The controlDict file
-// contains timestep information. The polyMesh folders contain mesh information
-// The time folders contain transient data for the cells  Each folder can
-// contain any number of data files.
+// vtkPV3FoamReader creates an multiblock dataset.
+// It uses the OpenFOAM infrastructure (fvMesh, etc) to
+// handle mesh and field data.
 
 #ifndef __vtkPV3FoamReader_h
 #define __vtkPV3FoamReader_h
@@ -66,6 +64,13 @@ public:
     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);
+
     // GUI update control
     vtkSetMacro(UpdateGUI, int);
     vtkGetMacro(UpdateGUI, int);
@@ -86,24 +91,10 @@ public:
     vtkSetMacro(IncludeZones, int);
     vtkGetMacro(IncludeZones, int);
 
-    // FOAM patch names control
+    // FOAM display patch names control
     vtkSetMacro(ShowPatchNames, int);
     vtkGetMacro(ShowPatchNames, int);
 
-    // Time-step slider control
-    vtkSetMacro(TimeStep, int);
-    vtkGetMacro(TimeStep, int);
-    vtkSetVector2Macro(TimeStepRange, int);
-    vtkGetVector2Macro(TimeStepRange, int);
-
-    // Time selection list control
-    vtkDataArraySelection* GetTimeSelection();
-    int GetNumberOfTimeArrays();
-    const char* GetTimeArrayName(int index);
-    int GetTimeArrayStatus(const char* name);
-    void SetTimeArrayStatus(const char* name, int status);
-
-
     // Region selection list control
     vtkDataArraySelection* GetRegionSelection();
     int GetNumberOfRegionArrays();
@@ -121,16 +112,16 @@ public:
     // pointField selection list control
     vtkDataArraySelection* GetPointFieldSelection();
     int GetNumberOfPointFieldArrays();
-    const char* GetPointFieldArrayName(int index);
     int GetPointFieldArrayStatus(const char* name);
     void SetPointFieldArrayStatus(const char* name, int status);
+    const char* GetPointFieldArrayName(int index);
 
     // lagrangianField selection list control
     vtkDataArraySelection* GetLagrangianFieldSelection();
     int GetNumberOfLagrangianFieldArrays();
-    const char* GetLagrangianFieldArrayName(int index);
     int GetLagrangianFieldArrayStatus(const char* name);
     void SetLagrangianFieldArrayStatus(const char* name, int status);
+    const char* GetLagrangianFieldArrayName(int index);
 
     // Callback registered with the SelectionObserver
     // for all the selection lists
@@ -182,7 +173,11 @@ private:
     //- Remove patch names from the view
     void removePatchNamesFromView();
 
+    int TimeStep;
+    int TimeStepRange[2];
+
     int CacheMesh;
+
     int ExtrapolateWalls;
     int IncludeSets;
     int IncludeZones;
@@ -190,18 +185,22 @@ private:
 
     int UpdateGUI;
     int UpdateGUIOld;
-    int TimeStep;
-    int TimeStepRange[2];
 
-    vtkDataArraySelection* TimeSelection;
     vtkDataArraySelection* RegionSelection;
     vtkDataArraySelection* VolFieldSelection;
     vtkDataArraySelection* PointFieldSelection;
     vtkDataArraySelection* LagrangianFieldSelection;
 
+    //- Access to the output port1
+    vtkMultiBlockDataSet* output1_;
+
     //BTX
     Foam::vtkPV3Foam* foamData_;
     //ETX
 };
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files
index ba65793d66e1086ce06dee27bf5ee93cd1eb923a..0a5e64ddf14feaed6766684c4c40e2315f661006 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/files
@@ -2,10 +2,8 @@ vtkPV3Foam.C
 vtkPV3FoamAddVolumeMesh.C
 vtkPV3FoamAddLagrangianMesh.C
 vtkPV3FoamAddPatchMesh.C
-vtkPV3FoamAddFaceZoneMesh.C
-vtkPV3FoamAddPointZoneMesh.C
-vtkPV3FoamAddFaceSetMesh.C
-vtkPV3FoamAddPointSetMesh.C
+vtkPV3FoamAddZoneMesh.C
+vtkPV3FoamAddSetMesh.C
 vtkPV3FoamUpdate.C
 vtkPV3FoamUpdateInformation.C
 vtkPV3FoamConvertMesh.C
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/options b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/options
index 2cebe5511260b4c8a1ee47cfe4a3305e70cc5f9a..b40ecb51d71299823066b9b2278542c40daa0151 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/options
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/Make/options
@@ -1,5 +1,4 @@
 EXE_INC = \
-    /* -DPV3FOAM_TIMESELECTION */ \
     -I$(LIB_SRC)/finiteVolume/lnInclude \
     -I$(LIB_SRC)/lagrangian/basic/lnInclude \
     -I$(LIB_SRC)/meshTools/lnInclude \
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
index 7699e94cf25bff1046d5acaffa1932a17939159b..8af700450c0e31c10a2a2544fae5603bd61b9992 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
@@ -32,6 +32,7 @@ License
 #include "IOobjectList.H"
 #include "patchZones.H"
 #include "vtkPV3FoamReader.h"
+#include "IFstream.H"
 
 // VTK includes
 #include "vtkCharArray.h"
@@ -52,7 +53,7 @@ defineTypeNameAndDebug(Foam::vtkPV3Foam, 0);
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-#include "vtkPV3FoamAddFields.H"
+#include "vtkPV3FoamAddToSelection.H"
 #include "vtkPV3FoamUpdateInformationFields.H"
 
 
@@ -172,38 +173,6 @@ void Foam::vtkPV3Foam::resetCounters()
 }
 
 
-void Foam::vtkPV3Foam::initializeTime()
-{
-#ifdef PV3FOAM_TIMESELECTION
-    Time& runTime = dbPtr_();
-
-    // Get times list
-    instantList times = runTime.times();
-
-    vtkDataArraySelection* arraySelection = reader_->GetTimeSelection();
-
-    // only execute this if there is a mismatch between
-    // the times available according to FOAM and according to VTK
-    int nArrays = arraySelection->GetNumberOfArrays();
-
-    if (nArrays && nArrays == times.size() - 1)
-    {
-        return;
-    }
-
-    // "constant" is implicit - skip it
-    // All the time selections are enabled by default
-    for (label timeI = 1; timeI < times.size(); ++timeI)
-    {
-        arraySelection->AddArray
-        (
-            times[timeI].name().c_str()
-        );
-    }
-#endif /* PV3FOAM_TIMESELECTION */
-}
-
-
 bool Foam::vtkPV3Foam::setTime(const double& requestedTime)
 {
     if (debug)
@@ -215,24 +184,10 @@ bool Foam::vtkPV3Foam::setTime(const double& requestedTime)
     Time& runTime = dbPtr_();
 
     // Get times list
-    instantList times = runTime.times();
+    instantList Times = runTime.times();
 
-    // logic as per "checkTimeOption.H"
     bool found = false;
-    int nearestIndex = -1;
-    scalar nearestDiff = Foam::GREAT;
-
-    forAll (times, timeIndex)
-    {
-        if (times[timeIndex].name() == "constant") continue;
-
-        scalar diff = fabs(times[timeIndex].value() - requestedTime);
-        if (diff < nearestDiff)
-        {
-            nearestDiff = diff;
-            nearestIndex = timeIndex;
-        }
-    }
+    int nearestIndex = Time::findClosestTimeIndex(Times, requestedTime);
 
     if (nearestIndex == -1)
     {
@@ -244,12 +199,36 @@ bool Foam::vtkPV3Foam::setTime(const double& requestedTime)
         found = true;
     }
 
-    runTime.setTime(times[nearestIndex], nearestIndex);
+    // see what has changed
+    if (timeIndex_ != nearestIndex)
+    {
+        timeIndex_ = nearestIndex;
+        runTime.setTime(Times[nearestIndex], nearestIndex);
+
+        // the fields change each time
+        fieldsChanged_ = true;
+
+        if (meshPtr_)
+        {
+            if (meshPtr_->readUpdate() != polyMesh::UNCHANGED)
+            {
+                meshChanged_ = true;
+                // patches, zones etc might have changed
+                UpdateInformation();
+            }
+        }
+        else
+        {
+            meshChanged_ = true;
+        }
+    }
 
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::setTime() - selected time "
-            << times[nearestIndex].name() << endl;
+            << Times[nearestIndex].name() << " index=" << nearestIndex
+            << " meshChanged=" << meshChanged_
+            << " fieldsChanged=" << fieldsChanged_ << endl;
     }
 
     return found;
@@ -265,15 +244,28 @@ void Foam::vtkPV3Foam::updateSelectedRegions()
 
     vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
 
-    const label nRegions = arraySelection->GetNumberOfArrays();
+    const label nSelect = arraySelection->GetNumberOfArrays();
 
-    selectedRegions_.setSize(nRegions);
-    selectedRegionDatasetIds_.setSize(nRegions);
+    if (selectedRegions_.size() != nSelect)
+    {
+        selectedRegions_.setSize(nSelect);
+        selectedRegions_ = 0;
+        meshChanged_ = true;
+    }
 
-    // Read the selected patches and add to the region list
-    for (int regionId=0; regionId < nRegions; ++regionId)
+    selectedRegionDatasetIds_.setSize(nSelect);
+
+    // Read the selected cell regions, zones, patches and add to region list
+    forAll (selectedRegions_, regionId)
     {
-        selectedRegions_[regionId] = arraySelection->GetArraySetting(regionId);
+        int setting = arraySelection->GetArraySetting(regionId);
+
+        if (selectedRegions_[regionId] != setting)
+        {
+            selectedRegions_[regionId] = setting;
+            meshChanged_ = true;
+        }
+
         selectedRegionDatasetIds_[regionId] = -1;
 
         if (debug)
@@ -301,7 +293,13 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 
     if (debug)
     {
-        Info << "selections(";
+        Info<< "available(";
+        forAll (selections, elemI)
+        {
+            Info<< " \"" << arraySelection->GetArrayName(elemI) << "\"";
+        }
+        Info<< " )\n"
+            << "selected(";
     }
 
     forAll (selections, elemI)
@@ -322,7 +320,7 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 
             if (debug)
             {
-                Info << " " << selections[nElem];
+                Info<< " " << selections[nElem];
             }
 
             ++nElem;
@@ -331,7 +329,7 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 
     if (debug)
     {
-        Info << " )" << endl;
+        Info<< " )" << endl;
     }
 
     selections.setSize(nElem);
@@ -351,33 +349,45 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 
     if (debug)
     {
-        Info << "selections(";
+        Info<< "available(";
+        for
+        (
+            int elemI = selector.start();
+            elemI < selector.end();
+            ++elemI
+        )
+        {
+            Info<< " \"" << arraySelection->GetArrayName(elemI) << "\"";
+        }
+
+        Info<< " )\n"
+            << "selected(";
     }
 
     for
     (
-        int regionId = selector.start();
-        regionId < selector.end();
-        ++regionId
+        int elemI = selector.start();
+        elemI < selector.end();
+        ++elemI
     )
     {
-        if (arraySelection->GetArraySetting(regionId))
+        if (arraySelection->GetArraySetting(elemI))
         {
             if (firstWord)
             {
                 selections[nElem] = getFirstWord
                 (
-                    arraySelection->GetArrayName(regionId)
+                    arraySelection->GetArrayName(elemI)
                 );
             }
             else
             {
-                selections[nElem] = arraySelection->GetArrayName(regionId);
+                selections[nElem] = arraySelection->GetArrayName(elemI);
             }
 
             if (debug)
             {
-                Info << " " << selections[nElem];
+                Info<< " " << selections[nElem];
             }
 
             ++nElem;
@@ -386,10 +396,9 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
 
     if (debug)
     {
-        Info << " )" << endl;
+        Info<< " )" << endl;
     }
 
-
     selections.setSize(nElem);
     return selections;
 }
@@ -432,10 +441,7 @@ void Foam::vtkPV3Foam::setSelectedArrayEntries
                         << endl;
                 }
 
-                arraySelection->EnableArray
-                (
-                    arrayName.c_str()
-                );
+                arraySelection->EnableArray(arrayName.c_str());
                 break;
             }
         }
@@ -452,12 +458,10 @@ void Foam::vtkPV3Foam::setSelectedArrayEntries
 Foam::vtkPV3Foam::vtkPV3Foam
 (
     const char* const FileName,
-    vtkPV3FoamReader* reader,
-    vtkMultiBlockDataSet* output
+    vtkPV3FoamReader* reader
 )
 :
     reader_(reader),
-    output_(output),
     dbPtr_(NULL),
     meshPtr_(NULL),
     selectInfoVolume_(VOLUME, "unzoned"),
@@ -470,11 +474,15 @@ Foam::vtkPV3Foam::vtkPV3Foam
     selectInfoFaceSets_(FACESET, "faceSet"),
     selectInfoPointSets_(POINTSET, "pointSet"),
     patchTextActorsPtrs_(0),
-    nMesh_(0)
+    nMesh_(0),
+    timeIndex_(-1),
+    meshChanged_(true),
+    fieldsChanged_(true)
 {
     if (debug)
     {
         Info<< "Foam::vtkPV3Foam::vtkPV3Foam - " << FileName << endl;
+        printMemory();
     }
 
     // avoid argList and get rootPath/caseName directly from the file
@@ -518,17 +526,11 @@ Foam::vtkPV3Foam::vtkPV3Foam
 
     dbPtr_().functionObjects().off();
 
-    if (debug)
-    {
-        cout<< "constructed with output: ";
-        output_->Print(cout);
-    }
-
-    resetCounters();
-
     // Set initial cloud name
     // TODO - TEMPORARY MEASURE UNTIL CAN PROCESS MULTIPLE CLOUDS
     cloudName_ = "";
+
+    UpdateInformation();
 }
 
 
@@ -555,27 +557,37 @@ void Foam::vtkPV3Foam::UpdateInformation()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::UpdateInformation - "
-            << "TimeStep = " << reader_->GetTimeStep() << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::UpdateInformation"
+            << " [meshPtr=" << (meshPtr_ ? "set" : "NULL") << "] TimeStep="
+            << reader_->GetTimeStep() << endl;
     }
 
     resetCounters();
 
-    // preserve the currently selected values
-    const stringList selectedEntries = getSelectedArrayEntries
-    (
-        reader_->GetRegionSelection()
-    );
-    // Clear current region list/array
-    reader_->GetRegionSelection()->RemoveAllArrays();
+    vtkDataArraySelection* arraySelection = reader_->GetRegionSelection();
 
-    initializeTime();
+    stringList selectedEntries;
+    // enable 'internalMesh' on the first call
+    if (arraySelection->GetNumberOfArrays() == 0 && !meshPtr_)
+    {
+        selectedEntries.setSize(1);
+        selectedEntries[0] = "internalMesh";
+    }
+    else
+    {
+        // preserve the currently selected values
+        selectedEntries = getSelectedArrayEntries
+        (
+            arraySelection
+        );
+    }
+
+    // Clear current region list/array
+    arraySelection->RemoveAllArrays();
 
     // Update region array
     updateInformationInternalMesh();
-
     updateInformationLagrangian();
-
     updateInformationPatches();
 
     if (reader_->GetIncludeSets())
@@ -588,13 +600,18 @@ void Foam::vtkPV3Foam::UpdateInformation()
         updateInformationZones();
     }
 
-    // Update region selection with the data just read in
+    // restore the currently enabled values
     setSelectedArrayEntries
     (
-        reader_->GetRegionSelection(),
+        arraySelection,
         selectedEntries
     );
 
+    if (meshChanged_)
+    {
+        fieldsChanged_ = true;
+    }
+
     // Update volField array
     updateInformationFields<fvPatchField, volMesh>
     (
@@ -630,24 +647,24 @@ void Foam::vtkPV3Foam::Update
         output->Print(cout);
 
         cout<<"Internally:\n";
-        output_->Print(cout);
+        output->Print(cout);
 
-        cout<< " has " << output_->GetNumberOfBlocks() << " blocks\n";
+        cout<< " has " << output->GetNumberOfBlocks() << " blocks\n";
+        printMemory();
     }
 
-
     // Set up region selection(s)
     updateSelectedRegions();
 
     // Update the Foam mesh
     updateFoamMesh();
+    reader_->UpdateProgress(0.2);
 
     // Convert meshes
     convertMeshVolume(output);
-
     convertMeshLagrangian(output);
-
     convertMeshPatches(output);
+    reader_->UpdateProgress(0.4);
 
     if (reader_->GetIncludeZones())
     {
@@ -658,17 +675,17 @@ void Foam::vtkPV3Foam::Update
 
     if (reader_->GetIncludeSets())
     {
-        convertMeshCellSet(output);
-        convertMeshFaceSet(output);
-        convertMeshPointSet(output);
+        convertMeshCellSets(output);
+        convertMeshFaceSets(output);
+        convertMeshPointSets(output);
     }
+    reader_->UpdateProgress(0.8);
 
     // Update fields
     updateVolFields(output);
-
     updatePointFields(output);
-
     updateLagrangianFields(output);
+    reader_->UpdateProgress(1.0);
 
     if (debug)
     {
@@ -693,90 +710,32 @@ void Foam::vtkPV3Foam::Update
             << GetNumberOfDataSets(output, selectInfoPointSets_) << nl;
 
         // traverse blocks:
-
-        int nBlocks = output->GetNumberOfBlocks();
-        Info << "nBlocks = " << nBlocks << endl;
-
+        cout<< "nBlocks = " << output->GetNumberOfBlocks() << "\n";
         cout<< "done Update\n";
-        output_->Print(cout);
-        cout<< " has " << output_->GetNumberOfBlocks() << " blocks\n";
-        output_->GetInformation()->Print(cout);
+        output->Print(cout);
+        cout<< " has " << output->GetNumberOfBlocks() << " blocks\n";
+        output->GetInformation()->Print(cout);
 
-        cout <<"ShouldIReleaseData :" << output_->ShouldIReleaseData() << "\n";
+        cout<<"ShouldIReleaseData :" << output->ShouldIReleaseData() << "\n";
+        printMemory();
     }
+
+    meshChanged_ = fieldsChanged_ = false;
 }
 
 
-double* Foam::vtkPV3Foam::timeSteps(int& nTimeSteps)
+double* Foam::vtkPV3Foam::findTimes(int& nTimeSteps)
 {
     int nTimes = 0;
-    double* ts = NULL;
+    double* tsteps = NULL;
 
     if (dbPtr_.valid())
     {
         Time& runTime = dbPtr_();
+        instantList timeLst = runTime.times();
 
-        instantList times = runTime.times();
-
-#ifdef PV3FOAM_TIMESELECTION
-        List<bool> selected = List<bool>(times.size(), false);
-
-        vtkDataArraySelection* arraySelection = reader_->GetTimeSelection();
-        const label nSelectedTimes = arraySelection->GetNumberOfArrays();
-
-        for (int i = 0; i < nSelectedTimes; ++i)
-        {
-            // always skip "constant" time
-            const int timeI = i + 1;
-            if
-            (
-                arraySelection->GetArraySetting(i)
-             && timeI < times.size()
-            )
-            {
-                if (debug > 1)
-                {
-                    Info<<"timeSelection["
-                        << i
-                        <<"] = "
-                        << arraySelection->GetArraySetting(i)
-                            << " is "
-                        << arraySelection->GetArrayName(i) << endl;
-                }
-                selected[timeI] = true;
-                ++nTimes;
-            }
-        }
-
-        if (debug > 1)
-        {
-            Info<< "selected " << nTimes << " times ";
-            Info<< "found " << times.size() << " times: (";
-            forAll(times, timeI)
-            {
-                Info<< " " << times[timeI].value();
-            }
-            Info<< " )" << endl;
-        }
-
-        if (nTimes)
-        {
-            ts = new double[nTimes];
-            int stepI = 0;
-
-            forAll(selected, selectI)
-            {
-                if (selected[selectI])
-                {
-                    ts[stepI] = times[selectI].value();
-                    stepI++;
-                }
-            }
-        }
-
-#else /* PV3FOAM_TIMESELECTION */
         // always skip "constant" time, unless there are no other times
-        nTimes = times.size();
+        nTimes = timeLst.size();
         label timeI = 0;
 
         if (nTimes > 1)
@@ -787,26 +746,25 @@ double* Foam::vtkPV3Foam::timeSteps(int& nTimeSteps)
 
         if (nTimes)
         {
-            ts = new double[nTimes];
+            tsteps = new double[nTimes];
             for (label stepI = 0; stepI < nTimes; ++stepI, ++timeI)
             {
-                ts[stepI] = times[timeI].value();
+                tsteps[stepI] = timeLst[timeI].value();
             }
         }
-#endif /* PV3FOAM_TIMESELECTION */
     }
     else
     {
         if (debug)
         {
-            Info<< "no valid dbPtr:" <<endl;
+            cout<< "no valid dbPtr:\n";
         }
     }
 
-    // return vector length via the parameter
+    // vector length returned via the parameter
     nTimeSteps = nTimes;
 
-    return ts;
+    return tsteps;
 }
 
 
@@ -820,8 +778,7 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
         Info<< "<beg> Foam::vtkPV3Foam::addPatchNames" << endl;
     }
 
-    const fvMesh& mesh = *meshPtr_;
-    const polyBoundaryMesh& pbMesh = mesh.boundaryMesh();
+    const polyBoundaryMesh& pbMesh = meshPtr_->boundaryMesh();
 
     const selectionInfo& selector = selectInfoPatches_;
 
@@ -835,7 +792,7 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
 
     if (debug)
     {
-        Info<<"... add patches: " << selectedPatches <<endl;
+        Info<<"... add patches: " << selectedPatches << endl;
     }
 
     // Find the total number of zones
@@ -924,8 +881,8 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
 
     if (debug)
     {
-        Info<< "patch zone centres = " << zoneCentre << endl;
-        Info<< "zones per patch = " << nZones << endl;
+        Info<< "patch zone centres = " << zoneCentre << nl
+            << "zones per patch = " << nZones << endl;
     }
 
     // Set the size of the patch labels to max number of zones
@@ -946,9 +903,9 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
         {
             if (debug)
             {
-                Info<< "patch name = " << pp.name() << endl;
-                Info<< "anchor = " << zoneCentre[globalZoneI] << endl;
-                Info<< "globalZoneI = " << globalZoneI << endl;
+                Info<< "patch name = " << pp.name() << nl
+                    << "anchor = " << zoneCentre[globalZoneI] << nl
+                    << "globalZoneI = " << globalZoneI << endl;
             }
 
             vtkTextActor* txt = vtkTextActor::New();
@@ -1012,48 +969,59 @@ void Foam::vtkPV3Foam::removePatchNames(vtkRenderer* renderer)
 }
 
 
-int Foam::vtkPV3Foam::numberOfAvailableTimes() const
+void Foam::vtkPV3Foam::PrintSelf(ostream& os, vtkIndent indent) const
 {
-    if (dbPtr_.valid())
-    {
-        return dbPtr_().times().size();
-    }
-    else
-    {
-        return 0;
-    }
-}
+    os  << indent << "Number of meshes: " << nMesh_ << "\n";
+    os  << indent << "Number of nodes: "
+        << (meshPtr_ ? meshPtr_->nPoints() : 0) << "\n";
 
+    os  << indent << "Number of cells: "
+        << (meshPtr_ ? meshPtr_->nCells() : 0) << "\n";
 
-int Foam::vtkPV3Foam::numberOfPoints()
-{
-    if (meshPtr_)
-    {
-        return meshPtr_->nPoints();
-    }
-    else
-    {
-        return 0;
-    }
+    os  << indent << "Number of available time steps: "
+        << (dbPtr_.valid() ? dbPtr_().times().size() : 0) << endl;
 }
 
 
-int Foam::vtkPV3Foam::numberOfCells()
+// parse these bits of info from /proc/meminfo (Linux)
+//
+// MemTotal:      2062660 kB
+// MemFree:       1124400 kB
+//
+// used = MemTotal - MemFree is what the free(1) uses.
+//
+void Foam::vtkPV3Foam::printMemory()
 {
-    if (meshPtr_)
-    {
-        return meshPtr_->nCells();
-    }
+    const char* meminfo = "/proc/meminfo";
+
+    if (exists(meminfo))
     {
-        return 0;
-    }
-}
+        IFstream is(meminfo);
+        label memTotal = 0;
+        label memFree = 0;
 
+        string line;
 
-int Foam::vtkPV3Foam::numberOfMeshes() const
-{
-    return nMesh_;
-}
+        while (is.getLine(line).good())
+        {
+            char tag[32];
+            int value;
 
+            if (sscanf(line.c_str(), "%30s %d", tag, &value) == 2)
+            {
+                if (!strcmp(tag, "MemTotal:"))
+                {
+                    memTotal = value;
+                }
+                else if (!strcmp(tag, "MemFree:"))
+                {
+                    memFree = value;
+                }
+            }
+        }
+
+        Info << "memUsed: " << (memTotal - memFree) << " kB\n";
+    }
+}
 
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
index b1b02208b97ff779bd1f9854f6f64d671f1171fa..0fbed64bfacf3e4624d2bc05f0221605d4357b4f 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
@@ -29,18 +29,16 @@ Description
     Provides a reader interface for OpenFOAM to VTK interaction.
 
 SourceFiles
-    interpolatePointToCell.C
-    interpolatePointToCell.H
     vtkPV3Foam.C
     vtkPV3Foam.H
-    vtkPV3FoamAddFaceSetMesh.C
-    vtkPV3FoamAddFaceZoneMesh.C
-    vtkPV3FoamAddFields.H
+    vtkPV3FoamI.H
     vtkPV3FoamAddLagrangianMesh.C
     vtkPV3FoamAddPatchMesh.C
-    vtkPV3FoamAddPointSetMesh.C
-    vtkPV3FoamAddPointZoneMesh.C
+    vtkPV3FoamAddSetMesh.C
+    vtkPV3FoamAddToSelection.H
     vtkPV3FoamAddVolumeMesh.C
+    vtkPV3FoamAddZoneMesh.C
+    vtkPV3FoamConvertFaceField.H
     vtkPV3FoamConvertLagrangianFields.H
     vtkPV3FoamConvertMesh.C
     vtkPV3FoamConvertPatchFaceField.H
@@ -52,7 +50,7 @@ SourceFiles
     vtkPV3FoamUpdateInformation.C
     vtkPV3FoamUpdateInformationFields.H
 
-    // Needed by VTK?
+    // Needed by VTK:
     vtkDataArrayTemplateImplicit.txx
 
 \*---------------------------------------------------------------------------*/
@@ -64,19 +62,21 @@ SourceFiles
 #include "fileName.H"
 #include "volPointInterpolation.H"
 #include "stringList.H"
+#include "wordList.H"
 #include "primitivePatch.H"
 
 // * * * * * * * * * * * * * Forward Declarations  * * * * * * * * * * * * * //
 
 class vtkDataArraySelection;
 class vtkDataSet;
-class vtkMultiBlockDataSet;
 class vtkPoints;
 class vtkPV3FoamReader;
 class vtkRenderer;
 class vtkTextActor;
+class vtkMultiBlockDataSet;
 class vtkPolyData;
 class vtkUnstructuredGrid;
+class vtkIndent;
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -196,9 +196,6 @@ private:
         //- Access to the controlling vtkPV3FoamReader
         vtkPV3FoamReader* reader_;
 
-        //- Access to the output block
-        vtkMultiBlockDataSet* output_;
-
         //- Foam time control
         autoPtr<Time> dbPtr_;
 
@@ -232,12 +229,12 @@ private:
         labelList superCells_;
 
         //- Label of original cell for decomposed cells
-        //  - cell zone meshes
-        List<labelList> superCellZonesCells_;
+        //  - cellZone meshes
+        List<labelList> zoneSuperCells_;
 
         //- Label of original cell for decomposed cells
-        //  - cell set meshes
-        List<labelList> superCellSetCells_;
+        //  - cellSet meshes
+        List<labelList> csetSuperCells_;
 
         //- List of patch names
         List<vtkTextActor*> patchTextActorsPtrs_;
@@ -253,6 +250,15 @@ private:
             // 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_;
+
 
     // Private Member Functions
 
@@ -287,9 +293,6 @@ private:
         //- Reset data counters
         void resetCounters();
 
-        //- Get all the available times and select the latestTime
-        void initializeTime();
-
         // Update information helper functions
 
             //- Update the regions selected in the GUI
@@ -307,9 +310,21 @@ private:
             //- Set info
             void updateInformationSets();
 
+            //- 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,
+                const IOobjectList&,
+                const string& suffix = ""
+            );
+
             //- Field info
             template<template<class> class patchType, class meshType>
             void updateInformationFields
@@ -350,20 +365,20 @@ private:
             //- Cell zone meshes
             void convertMeshCellZones(vtkMultiBlockDataSet* output);
 
-            //- Cell zone meshes
+            //- Face zone meshes
             void convertMeshFaceZones(vtkMultiBlockDataSet* output);
 
-            //- Cell zone meshes
+            //- Point zone meshes
             void convertMeshPointZones(vtkMultiBlockDataSet* output);
 
             //- Cell set meshes
-            void convertMeshCellSet(vtkMultiBlockDataSet* output);
+            void convertMeshCellSets(vtkMultiBlockDataSet* output);
 
             //- Face set meshes
-            void convertMeshFaceSet(vtkMultiBlockDataSet* output);
+            void convertMeshFaceSets(vtkMultiBlockDataSet* output);
 
             //- Point set meshes
-            void convertMeshPointSet(vtkMultiBlockDataSet* output);
+            void convertMeshPointSets(vtkMultiBlockDataSet* output);
 
 
         // Add mesh functions
@@ -433,7 +448,7 @@ private:
         //- Add the fields in the selected time directory to the selection
         //  lists
         template<class GeoField>
-        label addFields
+        label addObjectsToSelection
         (
             vtkDataArraySelection* fieldSelection,
             const IOobjectList& objects,
@@ -602,8 +617,7 @@ public:
         vtkPV3Foam
         (
             const char* const FileName,
-            vtkPV3FoamReader* reader,
-            vtkMultiBlockDataSet* output
+            vtkPV3FoamReader* reader
         );
 
 
@@ -614,13 +628,14 @@ public:
 
     // Member Functions
 
+        //- Update
         void UpdateInformation();
 
         void Update(vtkMultiBlockDataSet* output);
 
-        //- allocate and return a list of selected times
+        //- Allocate and return a list of selected times
         //  returns the count via the parameter
-        double* timeSteps(int& nTimeSteps);
+        double* findTimes(int& nTimeSteps);
 
         //- Add patch names to the display
         void addPatchNames(vtkRenderer* renderer);
@@ -635,14 +650,11 @@ public:
 
      // Access
 
-        //- Return the total number of available timesets
-        int numberOfAvailableTimes() const;
-
-        int numberOfCells();
-
-        int numberOfPoints();
+        //- Debug information
+        void PrintSelf(ostream&, vtkIndent) const;
 
-        int numberOfMeshes() const;
+        //- Simple memory used debugging information
+        static void printMemory();
 
 };
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C
index d4d31aa3cca1a62371b4bd85d61a737ab52f384f..d4463109a9cf82f8596884c1ac67a9527d15e9a2 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C
@@ -52,6 +52,7 @@ void Foam::vtkPV3Foam::addLagrangianMesh
     {
         Info<< "<beg> Foam::vtkPV3Foam::addLagrangianMesh - timePath "
             << mesh.time().timePath()/"lagrangian" << endl;
+        printMemory();
     }
 
     fileNameList cloudDirs
@@ -103,6 +104,7 @@ void Foam::vtkPV3Foam::addLagrangianMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addLagrangianMesh" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C
index 37392c905f71414fa0d88cf1bcf4f19cb2de724a..7c8a586ebabd084c9fd96147edb51c00239b11ba 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C
@@ -49,6 +49,7 @@ void Foam::vtkPV3Foam::addPatchMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addPatchMesh - " << p.name() << endl;
+        printMemory();
     }
 
     // Convert Foam mesh vertices to VTK
@@ -88,6 +89,7 @@ void Foam::vtkPV3Foam::addPatchMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addPatchMesh - " << p.name() << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPointSetMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPointSetMesh.C
deleted file mode 100644
index 4a19fab3d4d411a4053a53259d0940c6d98638e2..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPointSetMesh.C
+++ /dev/null
@@ -1,73 +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 "pointSet.H"
-#include "vtkPV3FoamInsertNextPoint.H"
-
-// VTK includes
-#include "vtkPoints.h"
-#include "vtkPolyData.h"
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-void Foam::vtkPV3Foam::addPointSetMesh
-(
-    const fvMesh& mesh,
-    const pointSet& pSet,
-    vtkPolyData* vtkmesh
-)
-{
-    if (debug)
-    {
-        Info<< "<beg> Foam::vtkPV3Foam::addPointSetMesh" << endl;
-    }
-
-    const pointField& meshPoints = mesh.points();
-
-    vtkPoints *vtkpoints = vtkPoints::New();
-    vtkpoints->Allocate(pSet.size());
-
-    forAllConstIter(pointSet, pSet, iter)
-    {
-        vtkPV3FoamInsertNextPoint(vtkpoints, meshPoints[iter.key()]);
-    }
-
-    vtkmesh->SetPoints(vtkpoints);
-    vtkpoints->Delete();
-
-    if (debug)
-    {
-        Info<< "<end> Foam::vtkPV3Foam::addPointSetMesh" << endl;
-    }
-}
-
-
-// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPointZoneMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPointZoneMesh.C
deleted file mode 100644
index f6369bfa238fb387df1dc3db3f7e0e73b66d4ce4..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPointZoneMesh.C
+++ /dev/null
@@ -1,72 +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 "vtkPV3FoamInsertNextPoint.H"
-
-// VTK includes
-#include "vtkPoints.h"
-#include "vtkPolyData.h"
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-void Foam::vtkPV3Foam::addPointZoneMesh
-(
-    const fvMesh& mesh,
-    const labelList& pointLabels,
-    vtkPolyData* vtkmesh
-)
-{
-    if (debug)
-    {
-        Info<< "<beg> Foam::vtkPV3Foam::addPointZoneMesh" << endl;
-    }
-
-    const pointField& meshPoints = mesh.points();
-
-    vtkPoints *vtkpoints = vtkPoints::New();
-    vtkpoints->Allocate(pointLabels.size());
-
-    forAll(pointLabels, pointI)
-    {
-        vtkPV3FoamInsertNextPoint(vtkpoints, meshPoints[pointLabels[pointI]]);
-    }
-
-    vtkmesh->SetPoints(vtkpoints);
-    vtkpoints->Delete();
-
-    if (debug)
-    {
-        Info<< "<beg> Foam::vtkPV3Foam::addPointZoneMesh" << endl;
-    }
-}
-
-
-// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFaceSetMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C
similarity index 80%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFaceSetMesh.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C
index 116f503a4dbcfd841e137838f2331440b3b27065..18835fe427f38c36d7a9aa1ac13f6a47af54fb9b 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFaceSetMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C
@@ -30,6 +30,7 @@ Description
 
 // Foam includes
 #include "faceSet.H"
+#include "pointSet.H"
 #include "vtkPV3FoamInsertNextPoint.H"
 
 // VTK includes
@@ -49,6 +50,7 @@ void Foam::vtkPV3Foam::addFaceSetMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addFaceSetMesh" << endl;
+        printMemory();
     }
 
     // Construct primitivePatch of faces in fSet.
@@ -100,6 +102,41 @@ void Foam::vtkPV3Foam::addFaceSetMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addFaceSetMesh" << endl;
+        printMemory();
+    }
+}
+
+
+void Foam::vtkPV3Foam::addPointSetMesh
+(
+    const fvMesh& mesh,
+    const pointSet& pSet,
+    vtkPolyData* vtkmesh
+)
+{
+    if (debug)
+    {
+        Info<< "<beg> Foam::vtkPV3Foam::addPointSetMesh" << endl;
+        printMemory();
+    }
+
+    const pointField& meshPoints = mesh.points();
+
+    vtkPoints *vtkpoints = vtkPoints::New();
+    vtkpoints->Allocate(pSet.size());
+
+    forAllConstIter(pointSet, pSet, iter)
+    {
+        vtkPV3FoamInsertNextPoint(vtkpoints, meshPoints[iter.key()]);
+    }
+
+    vtkmesh->SetPoints(vtkpoints);
+    vtkpoints->Delete();
+
+    if (debug)
+    {
+        Info<< "<end> Foam::vtkPV3Foam::addPointSetMesh" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFields.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddToSelection.H
similarity index 70%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFields.H
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddToSelection.H
index ff6c48bfe5a0082e20c2850e043f354336a039df..08a316268637a9e6c93a87804443a2410cb89127 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFields.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddToSelection.H
@@ -22,13 +22,10 @@ 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 vtkPV3FoamAddFields_H
-#define vtkPV3FoamAddFields_H
+#ifndef vtkPV3FoamAddToSelection_H
+#define vtkPV3FoamAddToSelection_H
 
 // FOAM includes
 #include "SortableList.H"
@@ -38,48 +35,48 @@ InClass
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-template<class GeoField>
-Foam::label Foam::vtkPV3Foam::addFields
+template<class Type>
+Foam::label Foam::vtkPV3Foam::addToSelection
 (
-    vtkDataArraySelection *fieldSelection,
-    const IOobjectList& objects,
+    vtkDataArraySelection *arraySelection,
+    const IOobjectList& objectLst,
     const string& suffix
 )
 {
-    IOobjectList fieldObjects(objects.lookupClass(GeoField::typeName));
+    IOobjectList objects(objectLst.lookupClass(Type::typeName));
 
-    SortableList<word> fields(fieldObjects.size());
+    SortableList<word> objectNames(objects.size());
 
     label count = 0;
-    forAllConstIter(IOobjectList, fieldObjects, iter)
+    forAllConstIter(IOobjectList, objects, iter)
     {
-        fields[count++] = iter()->name();
+        objectNames[count++] = iter()->name();
     }
 
     if (count)
     {
-        fields.sort();
+        objectNames.sort();
 
-        forAll(fields, fieldI)
+        forAll (objectNames, objI)
         {
             if (debug)
             {
-                Info<<"    addField to GUI " << GeoField::typeName
-                    << ":" << fields[fieldI] << endl;
+                Info<<"    addToSelection<" << Type::typeName << "> to GUI "
+                    << ":" << objectNames[objI] << endl;
             }
 
             if (suffix.size())
             {
-                fieldSelection->AddArray
+                arraySelection->AddArray
                 (
-                    (fields[fieldI] + suffix).c_str()
+                    (objectNames[objI] + suffix).c_str()
                 );
             }
             else
             {
-                fieldSelection->AddArray
+                arraySelection->AddArray
                 (
-                    fields[fieldI].c_str()
+                    objectNames[objI].c_str()
                 );
             }
         }
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C
index 5de9114eef42d6c056807e7f53df80cb581fe8ac..292fb8d2a0964cd6f75582ea356d67b59e00dbae 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C
@@ -55,6 +55,7 @@ void Foam::vtkPV3Foam::addVolumeMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addVolumeMesh" << endl;
+        printMemory();
     }
 
     // Number of additional points needed by the decomposition of polyhedra
@@ -354,6 +355,7 @@ void Foam::vtkPV3Foam::addVolumeMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addVolumeMesh" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFaceZoneMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C
similarity index 80%
rename from applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFaceZoneMesh.C
rename to applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C
index 044d4cedaf942ee56941fd1d830ca702ccd84fc7..9c52624f0f9ad7019d92e70a3fceb1718e3de5cc 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddFaceZoneMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C
@@ -38,6 +38,7 @@ Description
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+
 void Foam::vtkPV3Foam::addFaceZoneMesh
 (
     const fvMesh& mesh,
@@ -48,6 +49,7 @@ void Foam::vtkPV3Foam::addFaceZoneMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addFaceZoneMesh" << endl;
+        printMemory();
     }
 
     // Construct primitivePatch of faces in fSet.
@@ -98,8 +100,43 @@ void Foam::vtkPV3Foam::addFaceZoneMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addFaceZoneMesh" << endl;
+        printMemory();
     }
 }
 
 
+
+void Foam::vtkPV3Foam::addPointZoneMesh
+(
+    const fvMesh& mesh,
+    const labelList& pointLabels,
+    vtkPolyData* vtkmesh
+)
+{
+    if (debug)
+    {
+        Info<< "<beg> Foam::vtkPV3Foam::addPointZoneMesh" << endl;
+        printMemory();
+    }
+
+    const pointField& meshPoints = mesh.points();
+
+    vtkPoints *vtkpoints = vtkPoints::New();
+    vtkpoints->Allocate(pointLabels.size());
+
+    forAll(pointLabels, pointI)
+    {
+        vtkPV3FoamInsertNextPoint(vtkpoints, meshPoints[pointLabels[pointI]]);
+    }
+
+    vtkmesh->SetPoints(vtkpoints);
+    vtkpoints->Delete();
+
+    if (debug)
+    {
+        Info<< "<beg> Foam::vtkPV3Foam::addPointZoneMesh" << endl;
+        printMemory();
+    }
+}
+
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C
index 47239f02d716915e97f92061f0a628d2a0e55631..33b5891f04689bd706c766900baf01216e372f96 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C
@@ -51,6 +51,7 @@ void Foam::vtkPV3Foam::convertMeshVolume
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshVolume" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoVolume_;
@@ -76,7 +77,7 @@ void Foam::vtkPV3Foam::convertMeshVolume
 
         if (debug)
         {
-            Info<< "Creating VTK internal mesh" << endl;
+            Info<< "Creating VTK internalMesh" << endl;
         }
 
         const label datasetId = 0;
@@ -92,6 +93,7 @@ void Foam::vtkPV3Foam::convertMeshVolume
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshVolume" << endl;
+        printMemory();
     }
 }
 
@@ -104,6 +106,7 @@ void Foam::vtkPV3Foam::convertMeshLagrangian
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshLagrangian" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoLagrangian_;
@@ -139,6 +142,7 @@ void Foam::vtkPV3Foam::convertMeshLagrangian
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshLagrangian" << endl;
+        printMemory();
     }
 }
 
@@ -151,6 +155,7 @@ void Foam::vtkPV3Foam::convertMeshPatches
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshPatches" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoPatches_;
@@ -209,6 +214,7 @@ void Foam::vtkPV3Foam::convertMeshPatches
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshPatches" << endl;
+        printMemory();
     }
 }
 
@@ -221,6 +227,7 @@ void Foam::vtkPV3Foam::convertMeshCellZones
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellZones" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoCellZones_;
@@ -258,14 +265,14 @@ void Foam::vtkPV3Foam::convertMeshCellZones
             (
                 subsetter.subMesh(),
                 vtkmesh,
-                superCellZonesCells_[datasetId]
+                zoneSuperCells_[datasetId]
             );
 
             // renumber - superCells must contain global cell ids
             inplaceRenumber
             (
                 subsetter.cellMap(),
-                superCellZonesCells_[datasetId]
+                zoneSuperCells_[datasetId]
             );
 
             AddToBlock
@@ -281,18 +288,20 @@ void Foam::vtkPV3Foam::convertMeshCellZones
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshCellZones" << endl;
+        printMemory();
     }
 }
 
 
-void Foam::vtkPV3Foam::convertMeshCellSet
+void Foam::vtkPV3Foam::convertMeshCellSets
 (
     vtkMultiBlockDataSet* output
 )
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellSet" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellSets" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoCellSets_;
@@ -337,14 +346,14 @@ void Foam::vtkPV3Foam::convertMeshCellSet
             (
                 subsetter.subMesh(),
                 vtkmesh,
-                superCellSetCells_[datasetId]
+                csetSuperCells_[datasetId]
             );
 
             // renumber - superCells must contain global cell ids
             inplaceRenumber
             (
                 subsetter.cellMap(),
-                superCellSetCells_[datasetId]
+                csetSuperCells_[datasetId]
             );
 
             AddToBlock
@@ -359,10 +368,12 @@ void Foam::vtkPV3Foam::convertMeshCellSet
 
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::convertMeshCellSet" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::convertMeshCellSets" << endl;
+        printMemory();
     }
 }
 
+
 void Foam::vtkPV3Foam::convertMeshFaceZones
 (
     vtkMultiBlockDataSet* output
@@ -371,6 +382,7 @@ void Foam::vtkPV3Foam::convertMeshFaceZones
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshFaceZones" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoFaceZones_;
@@ -417,22 +429,24 @@ void Foam::vtkPV3Foam::convertMeshFaceZones
             vtkmesh->Delete();
         }
     }
-    
+
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshFaceZones" << endl;
+        printMemory();
     }
 }
 
 
-void Foam::vtkPV3Foam::convertMeshFaceSet
+void Foam::vtkPV3Foam::convertMeshFaceSets
 (
     vtkMultiBlockDataSet* output
 )
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::convertMeshFaceSet" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::convertMeshFaceSets" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoFaceSets_;
@@ -487,10 +501,11 @@ void Foam::vtkPV3Foam::convertMeshFaceSet
             vtkmesh->Delete();
         }
     }
-    
+
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::convertMeshFaceSet" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::convertMeshFaceSets" << endl;
+        printMemory();
     }
 }
 
@@ -503,6 +518,7 @@ void Foam::vtkPV3Foam::convertMeshPointZones
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshPointZones" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoPointZones_;
@@ -549,23 +565,25 @@ void Foam::vtkPV3Foam::convertMeshPointZones
             vtkmesh->Delete();
         }
     }
-    
+
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshPointZones" << endl;
+        printMemory();
     }
 }
 
 
 
-void Foam::vtkPV3Foam::convertMeshPointSet
+void Foam::vtkPV3Foam::convertMeshPointSets
 (
     vtkMultiBlockDataSet* output
 )
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::convertMeshPointSet" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::convertMeshPointSets" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoPointSets_;
@@ -620,10 +638,11 @@ void Foam::vtkPV3Foam::convertMeshPointSet
             vtkmesh->Delete();
         }
     }
-    
+
     if (debug)
     {
-        Info<< "<end> Foam::vtkPV3Foam::convertMeshPointSet" << endl;
+        Info<< "<end> Foam::vtkPV3Foam::convertMeshPointSets" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertVolFields.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertVolFields.H
index 6c78158eb0a3dc28244aebb116d78bc90f6dc3a3..7543f58c9c97e4c18e175a36dc5d82052ba06ebf 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertVolFields.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertVolFields.H
@@ -173,8 +173,7 @@ void Foam::vtkPV3Foam::convertVolFields
                 convertPatchFaceField
                 (
                     tf.name(),
-                    fvPatchField<Type>(p, tf)
-                       .patchInternalField()(),
+                    fvPatchField<Type>(p, tf).patchInternalField()(),
                     output,
                     selectInfoPatches_,
                     selectedRegionDatasetIds_[regionId]
@@ -236,7 +235,7 @@ void Foam::vtkPV3Foam::convertVolFields
             (
                 tf,
                 output, selectInfoCellZones_, datasetId,
-                superCellZonesCells_[datasetId]
+                zoneSuperCells_[datasetId]
             );
         }
 
@@ -273,7 +272,7 @@ void Foam::vtkPV3Foam::convertVolFields
             (
                 tf,
                 output, selectInfoCellSets_, datasetId,
-                superCellSetCells_[datasetId]
+                csetSuperCells_[datasetId]
             );
         }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamI.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamI.H
index 37f9543c560b1c923fa147800fb49896a93155ef..8f9f682cdc083f92f1456c0d597704c467fbf022 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamI.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamI.H
@@ -28,7 +28,6 @@ License
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-//- Extract up to the first non-word characters
 inline Foam::word Foam::vtkPV3Foam::getFirstWord(const char* str)
 {
     if (str)
@@ -46,32 +45,4 @@ inline Foam::word Foam::vtkPV3Foam::getFirstWord(const char* str)
     }
 }
 
-
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * Friend Functions  * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * Ostream Operator  * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdate.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdate.C
index 85493b933ee384c781ce0e8c99e53ddc85b553de..8f4a83c43f356baca208f25941ff04767191ec7f 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdate.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdate.C
@@ -48,16 +48,10 @@ void Foam::vtkPV3Foam::updateFoamMesh()
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::updateFoamMesh" << endl;
+        printMemory();
     }
 
-    if
-    (
-        !reader_->GetCacheMesh()
-#ifdef PV3FOAM_TIMESELECTION
-        // This is only useful if the times are individually selectable
-     || reader_->GetTimeSelection()->GetArraySetting(0)
-#endif
-    )
+    if (!reader_->GetCacheMesh())
     {
         delete meshPtr_;
         meshPtr_ = NULL;
@@ -79,6 +73,8 @@ void Foam::vtkPV3Foam::updateFoamMesh()
                 dbPtr_()
             )
         );
+
+        meshChanged_ = true;
     }
     else
     {
@@ -91,6 +87,7 @@ void Foam::vtkPV3Foam::updateFoamMesh()
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::updateFoamMesh" << endl;
+        printMemory();
     }
 }
 
@@ -103,6 +100,7 @@ void Foam::vtkPV3Foam::updateVolFields
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::updateVolFields" << endl;
+        printMemory();
     }
 
     const fvMesh& mesh = *meshPtr_;
@@ -167,6 +165,7 @@ void Foam::vtkPV3Foam::updateVolFields
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::updateVolFields" << endl;
+        printMemory();
     }
 }
 
@@ -179,6 +178,7 @@ void Foam::vtkPV3Foam::updatePointFields
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::updatePointFields" << endl;
+        printMemory();
     }
 
     const fvMesh& mesh = *meshPtr_;
@@ -218,6 +218,7 @@ void Foam::vtkPV3Foam::updatePointFields
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::updatePointFields" << endl;
+        printMemory();
     }
 }
 
@@ -230,6 +231,7 @@ void Foam::vtkPV3Foam::updateLagrangianFields
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::updateLagrangianFields" << endl;
+        printMemory();
     }
 
     const fvMesh& mesh = *meshPtr_;
@@ -281,6 +283,7 @@ void Foam::vtkPV3Foam::updateLagrangianFields
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::updateLagrangianFields" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C
index 9c2d144dea1cf7a2bb23f5b7c619a61af1a4c5cb..031d8aad58ddf8115c49002fbbfb767e654fef45 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C
@@ -22,8 +22,6 @@ 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"
@@ -31,13 +29,17 @@ Description
 // Foam includes
 #include "cellSet.H"
 #include "faceSet.H"
+#include "pointSet.H"
 #include "IOobjectList.H"
 #include "IOPtrList.H"
-#include "pointSet.H"
 #include "polyBoundaryMeshEntries.H"
 #include "entry.H"
 #include "vtkPV3FoamReader.h"
 
+// local headers
+#include "vtkPV3FoamAddToSelection.H"
+#include "vtkPV3FoamUpdateInformationFields.H"
+
 // VTK includes
 #include "vtkDataArraySelection.h"
 
@@ -77,10 +79,43 @@ public:
 
 }
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+Foam::wordList Foam::vtkPV3Foam::readZoneNames(const word& zoneType)
+{
+    wordList zoneNames;
+
+    // mesh not loaded - read from file
+    IOobject ioObj
+    (
+        zoneType,
+        dbPtr_().findInstance
+        (
+            polyMesh::meshSubDir,
+            zoneType,
+            IOobject::READ_IF_PRESENT
+        ),
+        polyMesh::meshSubDir,
+        dbPtr_(),
+        IOobject::READ_IF_PRESENT,
+        IOobject::NO_WRITE,
+        false
+    );
+
+    if (ioObj.headerOk())
+    {
+        zonesEntries zones(ioObj);
+
+        zoneNames.setSize(zones.size());
+        forAll (zones, zoneI)
+        {
+            zoneNames[zoneI] = zones[zoneI].keyword();
+        }
+    }
+
+    return zoneNames;
+}
 
-#include "vtkPV3FoamAddFields.H"
-#include "vtkPV3FoamUpdateInformationFields.H"
 
 void Foam::vtkPV3Foam::updateInformationInternalMesh()
 {
@@ -103,6 +138,9 @@ void Foam::vtkPV3Foam::updateInformationInternalMesh()
 
     if (debug)
     {
+        // just for debug info
+        getSelectedArrayEntries(arraySelection);
+
         Info<< "<end> Foam::vtkPV3Foam::updateInformationInternalMesh" << endl;
     }
 
@@ -132,7 +170,7 @@ void Foam::vtkPV3Foam::updateInformationLagrangian()
         arraySelection->AddArray("lagrangian");
         selectInfoLagrangian_ += 1;
 
-        Info<<"added cloudDirs\n";
+        Info<< "... added cloudDirs\n";
 
         if (cloudDirs.size() > 1)
         {
@@ -149,13 +187,16 @@ void Foam::vtkPV3Foam::updateInformationLagrangian()
     {
         if (debug)
         {
-            Info<<"no clouds identified in " <<nl
+            Info<< "... no clouds identified in " <<nl
                 << "    " <<dbPtr_->timePath()/"lagrangian" << endl;
         }
     }
 
     if (debug)
     {
+        // just for debug info
+        getSelectedArrayEntries(arraySelection);
+
         Info<< "<end> Foam::vtkPV3Foam::updateInformationLagrangian" << endl;
     }
 }
@@ -165,50 +206,80 @@ void Foam::vtkPV3Foam::updateInformationPatches()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationPatches" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::updateInformationPatches"
+            << " [meshPtr=" << (meshPtr_ ? "set" : "NULL") << "]" << endl;
     }
 
     vtkDataArraySelection *arraySelection = reader_->GetRegionSelection();
-
-    // Read patches
-    polyBoundaryMeshEntries patchEntries
-    (
-        IOobject
-        (
-            "boundary",
-            dbPtr_().findInstance(polyMesh::meshSubDir, "boundary"),
-            polyMesh::meshSubDir,
-            dbPtr_(),
-            IOobject::MUST_READ,
-            IOobject::NO_WRITE,
-            false
-        )
-    );
-
     selectInfoPatches_ = arraySelection->GetNumberOfArrays();
+
     int nPatches = 0;
 
-    // Start regions at patches
-    forAll (patchEntries, entryI)
+    if (meshPtr_)
     {
-        label nFaces(readLabel(patchEntries[entryI].dict().lookup("nFaces")));
+        const polyBoundaryMesh& patches = meshPtr_->boundaryMesh();
+        forAll (patches, patchI)
+        {
+            const polyPatch& pp = patches[patchI];
 
-        // Valid patch if nFace > 0
-        if (nFaces)
+            if (pp.size())
+            {
+                // Add patch to GUI region list
+                arraySelection->AddArray
+                (
+                    (pp.name() + " - patch").c_str()
+                );
+
+                ++nPatches;
+            }
+        }
+    }
+    else
+    {
+        // Read patches
+        polyBoundaryMeshEntries patchEntries
+        (
+            IOobject
+            (
+                "boundary",
+                dbPtr_().findInstance(polyMesh::meshSubDir, "boundary"),
+                polyMesh::meshSubDir,
+                dbPtr_(),
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                false
+            )
+        );
+
+        // Start regions at patches
+        forAll (patchEntries, entryI)
         {
-            // Add patch to GUI region list
-            arraySelection->AddArray
+            label nFaces
             (
-                (patchEntries[entryI].keyword() + " - patch").c_str()
+                readLabel(patchEntries[entryI].dict().lookup("nFaces"))
             );
 
-            ++nPatches;
+            // Valid patch if nFace > 0
+            if (nFaces)
+            {
+                // Add patch to GUI region list
+                arraySelection->AddArray
+                (
+                    (patchEntries[entryI].keyword() + " - patch").c_str()
+                );
+
+                ++nPatches;
+            }
         }
     }
+
     selectInfoPatches_ += nPatches;
 
     if (debug)
     {
+        // just for debug info
+        getSelectedArrayEntries(arraySelection);
+
         Info<< "<end> Foam::vtkPV3Foam::updateInformationPatches" << endl;
     }
 }
@@ -218,108 +289,82 @@ void Foam::vtkPV3Foam::updateInformationZones()
 {
     if (debug)
     {
-        Info<< "<beg> Foam::vtkPV3Foam::updateInformationZones" << endl;
+        Info<< "<beg> Foam::vtkPV3Foam::updateInformationZones"
+            << " [meshPtr=" << (meshPtr_ ? "set" : "NULL") << "]" << endl;
     }
 
     vtkDataArraySelection *arraySelection = reader_->GetRegionSelection();
 
-    // Read cell zone information
-    {
-        zonesEntries zones
-        (
-            IOobject
-            (
-                "cellZones",
-                dbPtr_().findInstance(polyMesh::meshSubDir, "cellZones"),
-                polyMesh::meshSubDir,
-                dbPtr_(),
-                IOobject::READ_IF_PRESENT,
-                IOobject::NO_WRITE,
-                false
-            )
-        );
+    wordList namesLst;
 
-        selectInfoCellZones_ = arraySelection->GetNumberOfArrays();
-        if (zones.headerOk())
-        {
-            forAll(zones, zoneI)
-            {
-                arraySelection->AddArray
-                (
-                    (zones[zoneI].keyword() + " - cellZone").c_str()
-                );
-            }
-            selectInfoCellZones_ += zones.size();
-        }
+    //
+    // cellZones information
+    // ~~~~~~~~~~~~~~~~~~~~~
+    if (meshPtr_)
+    {
+        namesLst = meshPtr_->cellZones().names();
+    }
+    else
+    {
+        namesLst = readZoneNames("cellZones");
+    }
 
-        superCellZonesCells_.setSize(selectInfoCellZones_.size());
+    selectInfoCellZones_ = arraySelection->GetNumberOfArrays();
+    forAll (namesLst, elemI)
+    {
+        arraySelection->AddArray((namesLst[elemI] + " - cellZone").c_str());
     }
+    selectInfoCellZones_ += namesLst.size();
+    zoneSuperCells_.setSize(selectInfoCellZones_.size());
 
-    // Read face zone information
+
+    //
+    // faceZones information
+    // ~~~~~~~~~~~~~~~~~~~~~
+    if (meshPtr_)
     {
-        zonesEntries zones
-        (
-            IOobject
-            (
-                "faceZones",
-                dbPtr_().findInstance(polyMesh::meshSubDir, "faceZones"),
-                polyMesh::meshSubDir,
-                dbPtr_(),
-                IOobject::READ_IF_PRESENT,
-                IOobject::NO_WRITE,
-                false
-            )
-        );
+        namesLst = meshPtr_->faceZones().names();
+    }
+    else
+    {
+        namesLst = readZoneNames("faceZones");
+    }
 
-        selectInfoFaceZones_ = arraySelection->GetNumberOfArrays();
-        if (zones.headerOk())
-        {
-            forAll(zones, zoneI)
-            {
-                arraySelection->AddArray
-                (
-                    (zones[zoneI].keyword() + " - faceZone").c_str()
-                );
-            }
-            selectInfoFaceZones_ += zones.size();
-        }
+    selectInfoFaceZones_ = arraySelection->GetNumberOfArrays();
+    forAll (namesLst, elemI)
+    {
+        arraySelection->AddArray((namesLst[elemI] + " - faceZone").c_str());
     }
+    selectInfoFaceZones_ += namesLst.size();
 
-    // Read point zone information
+
+    //
+    // pointZones information
+    // ~~~~~~~~~~~~~~~~~~~~~~
+    if (meshPtr_)
     {
-        zonesEntries zones
-        (
-            IOobject
-            (
-                "pointZones",
-                dbPtr_().findInstance(polyMesh::meshSubDir, "pointZones"),
-                polyMesh::meshSubDir,
-                dbPtr_(),
-                IOobject::READ_IF_PRESENT,
-                IOobject::NO_WRITE,
-                false
-            )
-        );
+        namesLst = meshPtr_->pointZones().names();
+    }
+    else
+    {
+        namesLst = readZoneNames("pointZones");
+    }
 
-        selectInfoPointZones_ = arraySelection->GetNumberOfArrays();
-        if (zones.headerOk())
-        {
-            forAll(zones, zoneI)
-            {
-                arraySelection->AddArray
-                (
-                    (zones[zoneI].keyword() + " - pointZone").c_str()
-                );
-            }
-            selectInfoPointZones_ += zones.size();
-        }
+    selectInfoPointZones_ = arraySelection->GetNumberOfArrays();
+    forAll (namesLst, elemI)
+    {
+        arraySelection->AddArray((namesLst[elemI] + " - pointZone").c_str());
     }
+    selectInfoPointZones_ += namesLst.size();
+
 
     if (debug)
     {
+        // just for debug info
+        getSelectedArrayEntries(arraySelection);
+
         Info<< "<end> Foam::vtkPV3Foam::updateInformationZones" << endl;
     }
-
 }
 
 
@@ -332,7 +377,7 @@ void Foam::vtkPV3Foam::updateInformationSets()
 
     vtkDataArraySelection *arraySelection = reader_->GetRegionSelection();
 
-    // Add sets
+    // Add names of sets
     IOobjectList objects
     (
         dbPtr_(),
@@ -342,16 +387,16 @@ void Foam::vtkPV3Foam::updateInformationSets()
 
 
     selectInfoCellSets_ = arraySelection->GetNumberOfArrays();
-    selectInfoCellSets_ += addFields<cellSet>
+    selectInfoCellSets_ += addToSelection<cellSet>
     (
         arraySelection,
         objects,
         " - cellSet"
     );
-    superCellSetCells_.setSize(selectInfoCellSets_.size());
+    csetSuperCells_.setSize(selectInfoCellSets_.size());
 
     selectInfoFaceSets_ = arraySelection->GetNumberOfArrays();
-    selectInfoFaceSets_ += addFields<faceSet>
+    selectInfoFaceSets_ += addToSelection<faceSet>
     (
         arraySelection,
         objects,
@@ -359,7 +404,7 @@ void Foam::vtkPV3Foam::updateInformationSets()
     );
 
     selectInfoPointSets_ = arraySelection->GetNumberOfArrays();
-    selectInfoPointSets_ += addFields<pointSet>
+    selectInfoPointSets_ += addToSelection<pointSet>
     (
         arraySelection,
         objects,
@@ -368,6 +413,9 @@ void Foam::vtkPV3Foam::updateInformationSets()
 
     if (debug)
     {
+        // just for debug info
+        getSelectedArrayEntries(arraySelection);
+
         Info<< "<end> Foam::vtkPV3Foam::updateInformationSets" << endl;
     }
 }
@@ -399,32 +447,32 @@ void Foam::vtkPV3Foam::updateInformationLagrangianFields()
         "lagrangian"/cloudName_
     );
 
-    addFields<IOField<label> >
+    addToSelection<IOField<label> >
     (
         arraySelection,
         objects
     );
-    addFields<IOField<scalar> >
+    addToSelection<IOField<scalar> >
     (
         arraySelection,
         objects
     );
-    addFields<IOField<vector> >
+    addToSelection<IOField<vector> >
     (
         arraySelection,
         objects
     );
-    addFields<IOField<sphericalTensor> >
+    addToSelection<IOField<sphericalTensor> >
     (
         arraySelection,
         objects
     );
-    addFields<IOField<symmTensor> >
+    addToSelection<IOField<symmTensor> >
     (
         arraySelection,
         objects
     );
-    addFields<IOField<tensor> >
+    addToSelection<IOField<tensor> >
     (
         arraySelection,
         objects
@@ -444,5 +492,7 @@ void Foam::vtkPV3Foam::updateInformationLagrangianFields()
     }
 }
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
 
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H
index 170ad74ed1be5368b93a348d06984b51526735be..b9d7df9fa55d5235806785fcd07f838b7b7c5943 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H
@@ -43,11 +43,23 @@ void Foam::vtkPV3Foam::updateInformationFields
         Info<< "<beg> Foam::vtkPV3Foam::updateInformationFields" << endl;
     }
 
-    // preserve the currently selected values
-    const stringList selectedEntries = getSelectedArrayEntries
-    (
-        arraySelection
-    );
+    stringList selectedEntries;
+    // enable 'p' and 'U' on the first call
+    if (arraySelection->GetNumberOfArrays() == 0 && !meshPtr_)
+    {
+        selectedEntries.setSize(2);
+        selectedEntries[0] = "p";
+        selectedEntries[1] = "U";
+    }
+    else
+    {
+        // preserve the currently selected values
+        selectedEntries = getSelectedArrayEntries
+        (
+            arraySelection
+        );
+    }
+
     arraySelection->RemoveAllArrays();
 
     // Search for list of objects for this time
@@ -56,33 +68,33 @@ void Foam::vtkPV3Foam::updateInformationFields
 
     //- Add volume fields to GUI
 /*
-    addFields<GeometricField<label, patchType, meshType> >
+    addToSelection<GeometricField<label, patchType, meshType> >
     (
         arraySelection,
         objects
     );
 */
-    addFields<GeometricField<scalar, patchType, meshType> >
+    addToSelection<GeometricField<scalar, patchType, meshType> >
     (
         arraySelection,
         objects
     );
-    addFields<GeometricField<vector, patchType, meshType> >
+    addToSelection<GeometricField<vector, patchType, meshType> >
     (
         arraySelection,
         objects
     );
-    addFields<GeometricField<sphericalTensor, patchType, meshType> >
+    addToSelection<GeometricField<sphericalTensor, patchType, meshType> >
     (
         arraySelection,
         objects
     );
-    addFields<GeometricField<symmTensor, patchType, meshType> >
+    addToSelection<GeometricField<symmTensor, patchType, meshType> >
     (
         arraySelection,
         objects
     );
-    addFields<GeometricField<tensor, patchType, meshType> >
+    addToSelection<GeometricField<tensor, patchType, meshType> >
     (
         arraySelection,
         objects
diff --git a/applications/utilities/postProcessing/graphics/fieldview9Reader/Allwmake b/applications/utilities/postProcessing/graphics/fieldview9Reader/Allwmake
index ff9f5f412ee354f018d45b70e0261ccf3287daa0..a2dc313fb1957b75938552cc1dd23cc62bef0c8b 100755
--- a/applications/utilities/postProcessing/graphics/fieldview9Reader/Allwmake
+++ b/applications/utilities/postProcessing/graphics/fieldview9Reader/Allwmake
@@ -1,3 +1,8 @@
-#if [ "$FV_HOME" -a -r $FV_HOME ] ; then
+#!/bin/sh
+
+# disabled
+
+# if [ "$FV_HOME" -a -r $FV_HOME ]
+# then
 #    wmake fieldview9Reader
-#fi
+# fi
diff --git a/applications/utilities/postProcessing/graphics/paraFoam/Allwmake b/applications/utilities/postProcessing/graphics/paraFoam/Allwmake
deleted file mode 100755
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/applications/utilities/postProcessing/wall/yPlusLES/yPlusLES.C b/applications/utilities/postProcessing/wall/yPlusLES/yPlusLES.C
index c5524896c1a0776d995f235fc0668de390a81cd6..d7c145b95324cf542d16c02b719bd68620d1aa63 100644
--- a/applications/utilities/postProcessing/wall/yPlusLES/yPlusLES.C
+++ b/applications/utilities/postProcessing/wall/yPlusLES/yPlusLES.C
@@ -107,11 +107,12 @@ int main(int argc, char *argv[])
                        *mag(U.boundaryField()[patchi].snGrad())
                     )
                    /sgsModel->nu().boundaryField()[patchi];
+                const scalarField& Yp = yPlus.boundaryField()[patchi];
 
                 Info<< "Patch " << patchi
                     << " named " << currPatch.name()
-                    << " y+ : min: " << min(yPlus) << " max: " << max(yPlus)
-                    << " average: " << average(yPlus) << nl << endl;
+                    << " y+ : min: " << min(Yp) << " max: " << max(Yp)
+                    << " average: " << average(Yp) << nl << endl;
             }
         }
 
diff --git a/applications/utilities/surface/surfaceCheck/surfaceCheck.C b/applications/utilities/surface/surfaceCheck/surfaceCheck.C
index ed91a3d3d4171bc885b33322b223ebfb99fe0a1d..3506b05de7942769a2a425868ba0ddb2f7a51f59 100644
--- a/applications/utilities/surface/surfaceCheck/surfaceCheck.C
+++ b/applications/utilities/surface/surfaceCheck/surfaceCheck.C
@@ -49,20 +49,20 @@ bool validTri(const triSurface& surf, const label faceI)
      || (f[2] < 0) || (f[2] >= surf.points().size())
     )
     {
-        WarningIn("validTri(const triSurface&, const label)")
-            << "triangle " << faceI << " vertices " << f
-            << " uses point indices outside point range 0.."
-            << surf.points().size()-1 << endl;
+        //WarningIn("validTri(const triSurface&, const label)")
+        //    << "triangle " << faceI << " vertices " << f
+        //    << " uses point indices outside point range 0.."
+        //    << surf.points().size()-1 << endl;
 
         return false;
     }
 
     if ((f[0] == f[1]) || (f[0] == f[2]) || (f[1] == f[2]))
     {
-        WarningIn("validTri(const triSurface&, const label)")
-            << "triangle " << faceI
-            << " uses non-unique vertices " << f
-            << endl;
+        //WarningIn("validTri(const triSurface&, const label)")
+        //    << "triangle " << faceI
+        //    << " uses non-unique vertices " << f
+        //    << endl;
         return false;
     }
 
@@ -91,11 +91,11 @@ bool validTri(const triSurface& surf, const label faceI)
          && ((f[2] == nbrF[0]) || (f[2] == nbrF[1]) || (f[2] == nbrF[2]))
         )
         {
-            WarningIn("validTri(const triSurface&, const label)")
-                << "triangle " << faceI << " vertices " << f
-                << " has the same vertices as triangle " << nbrFaceI
-                << " vertices " << nbrF
-                << endl;
+            //WarningIn("validTri(const triSurface&, const label)")
+            //    << "triangle " << faceI << " vertices " << f
+            //    << " has the same vertices as triangle " << nbrFaceI
+            //    << " vertices " << nbrF
+            //    << endl;
 
             return false;
         }
@@ -270,9 +270,9 @@ int main(int argc, char *argv[])
 
             if (f[0] == f[1] || f[0] == f[2] || f[1] == f[2])
             {
-                WarningIn(args.executable())
-                    << "Illegal triangle " << faceI << " vertices " << f
-                    << " coords " << f.points(surf.points()) << endl;
+                //WarningIn(args.executable())
+                //    << "Illegal triangle " << faceI << " vertices " << f
+                //    << " coords " << f.points(surf.points()) << endl;
             }
             else
             {
diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C
index dd1e944067fb78f36fce921dad44d4eca9730c76..ef4fb9c21fa23b78a973f2bfe90028534bf36a53 100644
--- a/src/OpenFOAM/db/Time/Time.C
+++ b/src/OpenFOAM/db/Time/Time.C
@@ -418,19 +418,55 @@ Foam::instant Foam::Time::findClosestTime(const scalar t) const
         return times[times.size() - 1];
     }
 
+    label nearestIndex = -1;
     scalar deltaT = GREAT;
-    label closesti = 0;
 
     for (label i=1; i<times.size(); i++)
     {
-        if (mag(times[i].value() - t) < deltaT)
+        scalar diff = mag(times[i].value() - t);
+        if (diff < deltaT)
         {
-            deltaT = mag(times[i].value() - t);
-            closesti = i;
+            deltaT = diff;
+            nearestIndex = i;
         }
     }
 
-    return times[closesti];
+    return times[nearestIndex];
+}
+
+//
+// This should work too,
+// if we don't worry about checking "constant" explicitly
+//
+// Foam::instant Foam::Time::findClosestTime(const scalar t) const
+// {
+//     instantList times = Time::findTimes(path());
+//     label timeIndex = min(findClosestTimeIndex(times, t), 0);
+//     return times[timeIndex];
+// }
+
+Foam::label Foam::Time::findClosestTimeIndex
+(
+    const instantList& times,
+    const scalar t
+)
+{
+    label nearestIndex = -1;
+    scalar deltaT = GREAT;
+
+    forAll (times, i)
+    {
+        if (times[i].name() == "constant") continue;
+
+        scalar diff = fabs(times[i].value() - t);
+        if (diff < deltaT)
+        {
+            deltaT = diff;
+            nearestIndex = i;
+        }
+    }
+
+    return nearestIndex;
 }
 
 
diff --git a/src/OpenFOAM/db/Time/Time.H b/src/OpenFOAM/db/Time/Time.H
index 89e1480c23f1502e549b82e1b220abb6c2e258ae..50239c0c08c1307001cb5a95a8673119a3fc5bfa 100644
--- a/src/OpenFOAM/db/Time/Time.H
+++ b/src/OpenFOAM/db/Time/Time.H
@@ -300,6 +300,9 @@ public:
             //- Search the case for the time closest to the given time
             instant findClosestTime(const scalar) const;
 
+            //- Search instantList for the time index closest to the given time
+            static label findClosestTimeIndex(const instantList&, const scalar);
+
             //- Write using given format, version and compression
             virtual bool writeObject
             (
diff --git a/src/OpenFOAM/db/Time/findInstance.C b/src/OpenFOAM/db/Time/findInstance.C
index ca15159bd5f7c2aabd1e57f19b07d1dfd9184e3a..4d2202d9cbe96f0b47a879d732e6f4372350c9b3 100644
--- a/src/OpenFOAM/db/Time/findInstance.C
+++ b/src/OpenFOAM/db/Time/findInstance.C
@@ -33,10 +33,7 @@ Description
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-namespace Foam
-{
-
-word Time::findInstance
+Foam::word Foam::Time::findInstance
 (
     const fileName& dir,
     const word& name,
@@ -110,7 +107,7 @@ word Time::findInstance
     // constant function of the time, because the latter points to
     // the case constant directory in parallel cases
 
-    if 
+    if
     (
         file(path()/constant()/dir/name)
      && IOobject(name, constant(), dir, *this).headerOk()
@@ -139,9 +136,4 @@ word Time::findInstance
     return constant();
 }
 
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-} // End namespace Foam
-
 // ************************************************************************* //
diff --git a/src/OpenFOAM/db/Time/findTimes.C b/src/OpenFOAM/db/Time/findTimes.C
index 175c340ade8418680b3f256dd05bb62e33e7439b..5e83e115fdbfc8ca2626d51550acb4ab79aede97 100644
--- a/src/OpenFOAM/db/Time/findTimes.C
+++ b/src/OpenFOAM/db/Time/findTimes.C
@@ -35,12 +35,7 @@ Description
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-namespace Foam
-{
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-instantList Time::findTimes(const fileName& directory)
+Foam::instantList Foam::Time::findTimes(const fileName& directory)
 {
     if (debug)
     {
@@ -101,9 +96,4 @@ instantList Time::findTimes(const fileName& directory)
     return Times;
 }
 
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-} // End namespace Foam
-
 // ************************************************************************* //
diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C
index d8b90d013b5981722997608b06bcddad49cbc6a4..a2faa64133a164011173bf5a2168accea365b3cc 100644
--- a/src/OpenFOAM/global/argList/argList.C
+++ b/src/OpenFOAM/global/argList/argList.C
@@ -337,23 +337,21 @@ Foam::argList::argList
 
             Switch distributed(false);
 
-            if (decompositionDict.found("distributed"))
+            if
+            (
+                decompositionDict.readIfPresent("distributed", distributed)
+             && distributed
+            )
             {
-                decompositionDict.lookup("distributed") >> distributed;
+                decompositionDict.lookup("roots") >> roots;
 
-                if (distributed)
+                if (roots.size() != Pstream::nProcs()-1)
                 {
-                    decompositionDict.lookup("roots") >> roots;
-
-                    if (roots.size() != Pstream::nProcs())
-                    {
-                        FatalError
-                            << "number of entries in "
-                            << "decompositionDict::roots"
-                            << " is not equal to the number of processors "
-                            << Pstream::nProcs()
-                            << exit(FatalError);
-                    }
+                    FatalError
+                        << "number of entries in decompositionDict::roots"
+                        << " is not equal to the number of slaves "
+                        << Pstream::nProcs()-1
+                        << exit(FatalError);
                 }
             }
 
diff --git a/src/OpenFOAM/include/checkTimeOption.H b/src/OpenFOAM/include/checkTimeOption.H
index d0256f13e2bd1812177b66274a288a519697afad..70759dd81ba12b91617ed714a2ef9be8040b236a 100644
--- a/src/OpenFOAM/include/checkTimeOption.H
+++ b/src/OpenFOAM/include/checkTimeOption.H
@@ -1,22 +1,7 @@
     if (args.options().found("time"))
     {
-        scalar time(readScalar(IStringStream(args.options()["time"])()));
+        scalar timeValue(readScalar(IStringStream(args.options()["time"])()));
 
-        int nearestIndex = -1;
-        scalar nearestDiff = Foam::GREAT;
-
-        forAll(Times, timeIndex)
-        {
-            if (Times[timeIndex].name() == "constant") continue;
-
-            scalar diff = fabs(Times[timeIndex].value() - time);
-            if (diff < nearestDiff)
-            {
-                nearestDiff = diff;
-                nearestIndex = timeIndex;
-            }
-        }
-
-        startTime = nearestIndex;
-        endTime = nearestIndex + 1;
+        startTime = Time::findClosestTimeIndex(Times, timeValue);
+        endTime = startTime + 1;
     }
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMesh.C b/src/OpenFOAM/meshes/polyMesh/polyMesh.C
index 326f59df8108105bad602641e28a795b4df1cfdc..3b7961979d7fdc7b3cdff6923439f248a15a2011 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMesh.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMesh.C
@@ -1072,7 +1072,7 @@ const Foam::globalMeshData& Foam::polyMesh::globalData() const
 // Remove all files and some subdirs (eg, sets)
 void Foam::polyMesh::removeFiles(const fileName& instanceDir) const
 {
-    fileName meshFilesPath = db().path()/instanceDir/meshSubDir;
+    fileName meshFilesPath = db().path()/instanceDir/meshDir();
 
     rm(meshFilesPath/"points");
     rm(meshFilesPath/"faces");
diff --git a/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.C b/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.C
index c90ad7e878276a644c41a6ea7e12b1dc0e8c5ce6..e2cc0d711b2c0a2a3bf3b9fdf67d73b3783de499 100644
--- a/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.C
+++ b/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.C
@@ -102,7 +102,7 @@ Foam::scalar Foam::layerAdditionRemoval::readOldThickness
     const dictionary& dict
 )
 {
-    dict.lookupOrDefault("oldLayerThickness", -1.0);
+    return dict.lookupOrDefault("oldLayerThickness", -1.0);
 }
 
 
diff --git a/src/meshTools/Make/files.txt b/src/meshTools/Make/files.txt
deleted file mode 100644
index 911ae444fd312b293964d356fc214995b64dc721..0000000000000000000000000000000000000000
--- a/src/meshTools/Make/files.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-cellClassification/cellClassification.C
-cellClassification/cellInfo.C
-
-cellQuality/cellQuality.C
-
-cellDist/cellDistFuncs.C
-cellDist/patchWave/patchWave.C
-cellDist/wallPoint/wallPoint.C
-
-cellFeatures/cellFeatures.C
-
-coordinateSystems/parabolicCylindricalCS.C
-coordinateSystems/coordinateSystem.C
-coordinateSystems/toroidalCS.C
-coordinateSystems/cartesianCS.C
-coordinateSystems/newCoordinateSystem.C
-coordinateSystems/cylindricalCS.C
-coordinateSystems/sphericalCS.C
-coordinateSystems/coordinateRotation/coordinateRotation.C
-coordinateSystems/coordinateRotation/EulerCoordinateRotation.C
-coordinateSystems/coordinateRotation/STARCDCoordinateRotation.C
-
-polyMeshZipUpCells/polyMeshZipUpCells.C
-
-primitiveMeshGeometry/primitiveMeshGeometry.C
-
-meshSearch/meshSearch.C
-
-meshTools/meshTools.C
-
-PointEdgeWave/PointEdgeWaveName.C
-PointEdgeWave/pointEdgePoint.C
-
-regionSplit/regionSplit.C
-
-octree/octreeName.C
-octree/octreeDataPoint.C
-octree/octreeDataPointTreeLeaf.C
-octree/octreeDataEdges.C
-octree/octreeDataCell.C
-octree/octreeDataFace.C
-octree/treeBoundBox.C
-octree/treeNodeName.C
-octree/treeLeafName.C
-octree/pointIndexHitIOList.C
-
-indexedOctree/indexedOctreeName.C
-indexedOctree/treeDataTriSurface.C
-
-topoSets = sets/topoSets
-$(topoSets)/cellSet.C
-$(topoSets)/topoSet.C
-$(topoSets)/faceSet.C
-$(topoSets)/pointSet.C
-
-sets/topoSetSource/topoSetSource.C
-
-cellSources =  sets/cellSources
-$(cellSources)/faceToCell/faceToCell.C
-$(cellSources)/fieldToCell/fieldToCell.C
-$(cellSources)/pointToCell/pointToCell.C
-$(cellSources)/shapeToCell/shapeToCell.C
-$(cellSources)/boxToCell/boxToCell.C
-$(cellSources)/rotatedBoxToCell/rotatedBoxToCell.C
-$(cellSources)/labelToCell/labelToCell.C
-$(cellSources)/surfaceToCell/surfaceToCell.C
-$(cellSources)/cellToCell/cellToCell.C
-$(cellSources)/nearestToCell/nearestToCell.C
-$(cellSources)/nbrToCell/nbrToCell.C
-$(cellSources)/zoneToCell/zoneToCell.C
-
-faceSources = sets/faceSources
-$(faceSources)/faceToFace/faceToFace.C
-$(faceSources)/labelToFace/labelToFace.C
-$(faceSources)/cellToFace/cellToFace.C
-$(faceSources)/normalToFace/normalToFace.C
-$(faceSources)/pointToFace/pointToFace.C
-$(faceSources)/patchToFace/patchToFace.C
-$(faceSources)/boundaryToFace/boundaryToFace.C
-$(faceSources)/zoneToFace/zoneToFace.C
-$(faceSources)/boxToFace/boxToFace.C
-
-pointSources = sets/pointSources
-$(pointSources)/labelToPoint/labelToPoint.C
-$(pointSources)/pointToPoint/pointToPoint.C
-$(pointSources)/cellToPoint/cellToPoint.C
-$(pointSources)/faceToPoint/faceToPoint.C
-$(pointSources)/boxToPoint/boxToPoint.C
-$(pointSources)/surfaceToPoint/surfaceToPoint.C
-$(pointSources)/zoneToPoint/zoneToPoint.C
-
-surfaceSets/surfaceSets.C
-
-triSurface/orientedSurface/orientedSurface.C
-
-booleanOps = triSurface/booleanOps
-
-surfaceIntersection = $(booleanOps)/surfaceIntersection
-$(surfaceIntersection)/surfaceIntersection.C
-$(surfaceIntersection)/surfaceIntersectionFuncs.C
-$(surfaceIntersection)/edgeIntersections.C
-
-booleanSurface = $(booleanOps)/booleanSurface
-$(booleanSurface)/booleanSurface.C
-
-intersectedSurface = $(booleanOps)/intersectedSurface
-$(intersectedSurface)/intersectedSurface.C
-$(intersectedSurface)/edgeSurface.C
-
-triSurface/triSurfaceSearch/triSurfaceSearch.C
-
-triSurface/octreeData/octreeDataTriSurface.C
-triSurface/octreeData/octreeDataTriSurfaceTreeLeaf.C
-
-triSurface/triangleFuncs/triangleFuncs.C
-
-triSurface/surfaceFeatures/surfaceFeatures.C
-
-triSurface/triSurfaceMeshes/triSurfaceMeshes.C
-
-twoDPointCorrector/twoDPointCorrector.C
-
-directMapped/directMappedPolyPatch/directMappedPolyPatch.C
-directMapped/directMappedPointPatch/directMappedPointPatch.C
-
-LIB = $(FOAM_LIBBIN)/libmeshTools
diff --git a/src/sampling/cuttingPlane/cuttingPlane.C b/src/sampling/cuttingPlane/cuttingPlane.C
index f546c31dbe4ddfd5d5aed6d4998b392111c8ded5..472d30e7827f59297efc1f1442bc72c2020fd573 100644
--- a/src/sampling/cuttingPlane/cuttingPlane.C
+++ b/src/sampling/cuttingPlane/cuttingPlane.C
@@ -29,6 +29,15 @@ License
 #include "linePointRef.H"
 #include "meshTools.H"
 
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+// set values for what is close to zero and what is considered to
+// be positive (and not just rounding noise)
+//! @cond localScope
+const Foam::scalar zeroish  = Foam::SMALL;
+const Foam::scalar positive = Foam::SMALL * 1E3;
+//! @endcond localScope
+
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 // Find cut cells
@@ -71,8 +80,8 @@ void Foam::cuttingPlane::calcCutCells
 
             if
             (
-                (dotProducts[e[0]] < 0 && dotProducts[e[1]] > 0)
-             || (dotProducts[e[1]] < 0 && dotProducts[e[0]] > 0)
+                (dotProducts[e[0]] < zeroish && dotProducts[e[1]] > positive)
+             || (dotProducts[e[1]] < zeroish && dotProducts[e[0]] > positive)
             )
             {
                 nCutEdges++;
@@ -116,8 +125,8 @@ Foam::labelList Foam::cuttingPlane::intersectEdges
 
         if
         (
-            (dotProducts[e[0]] < 0 && dotProducts[e[1]] > 0)
-         || (dotProducts[e[1]] < 0 && dotProducts[e[0]] > 0)
+            (dotProducts[e[0]] < zeroish && dotProducts[e[1]] > positive)
+         || (dotProducts[e[1]] < zeroish && dotProducts[e[0]] > positive)
         )
         {
             // Edge is cut.
@@ -126,7 +135,19 @@ Foam::labelList Foam::cuttingPlane::intersectEdges
 
             scalar alpha = lineIntersect(linePointRef(p0, p1));
 
-            dynCuttingPoints.append((1-alpha)*p0 + alpha*p1);
+            if (alpha < zeroish)
+            {
+                dynCuttingPoints.append(p0);
+            }
+            else if (alpha > 1.0)
+            {
+                dynCuttingPoints.append(p1);
+            }
+            else
+            {
+                dynCuttingPoints.append((1-alpha)*p0 + alpha*p1);
+            }
+
             edgePoint[edgeI] = dynCuttingPoints.size() - 1;
         }
     }
diff --git a/src/sampling/cuttingPlane/cuttingPlane.H b/src/sampling/cuttingPlane/cuttingPlane.H
index 32dec6908d9c1248d1d3faedb4e1944b3a497221..3e33be9da769c887a842b0a7c7b61084cc0bb671 100644
--- a/src/sampling/cuttingPlane/cuttingPlane.H
+++ b/src/sampling/cuttingPlane/cuttingPlane.H
@@ -30,6 +30,10 @@ Description
 
     No attempt at resolving degenerate cases.
 
+Note
+    When the cutting plane coincides with a mesh face, the cell edge on the
+    positive side of the plane is taken.
+
 SourceFiles
     cuttingPlane.C