diff --git a/applications/solvers/dsmc/dsmcFoam/Make/files b/applications/solvers/discreteMethods/dsmc/dsmcFoam/Make/files
similarity index 100%
rename from applications/solvers/dsmc/dsmcFoam/Make/files
rename to applications/solvers/discreteMethods/dsmc/dsmcFoam/Make/files
diff --git a/applications/solvers/dsmc/dsmcFoam/Make/options b/applications/solvers/discreteMethods/dsmc/dsmcFoam/Make/options
similarity index 100%
rename from applications/solvers/dsmc/dsmcFoam/Make/options
rename to applications/solvers/discreteMethods/dsmc/dsmcFoam/Make/options
diff --git a/applications/solvers/dsmc/dsmcFoam/createFields.H b/applications/solvers/discreteMethods/dsmc/dsmcFoam/createFields.H
similarity index 100%
rename from applications/solvers/dsmc/dsmcFoam/createFields.H
rename to applications/solvers/discreteMethods/dsmc/dsmcFoam/createFields.H
diff --git a/applications/solvers/dsmc/dsmcFoam/dsmcFoam.C b/applications/solvers/discreteMethods/dsmc/dsmcFoam/dsmcFoam.C
similarity index 100%
rename from applications/solvers/dsmc/dsmcFoam/dsmcFoam.C
rename to applications/solvers/discreteMethods/dsmc/dsmcFoam/dsmcFoam.C
diff --git a/applications/solvers/molecularDynamics/mdEquilibrationFoam/Make/files b/applications/solvers/discreteMethods/molecularDynamics/mdEquilibrationFoam/Make/files
similarity index 100%
rename from applications/solvers/molecularDynamics/mdEquilibrationFoam/Make/files
rename to applications/solvers/discreteMethods/molecularDynamics/mdEquilibrationFoam/Make/files
diff --git a/applications/solvers/molecularDynamics/mdEquilibrationFoam/Make/options b/applications/solvers/discreteMethods/molecularDynamics/mdEquilibrationFoam/Make/options
similarity index 100%
rename from applications/solvers/molecularDynamics/mdEquilibrationFoam/Make/options
rename to applications/solvers/discreteMethods/molecularDynamics/mdEquilibrationFoam/Make/options
diff --git a/applications/solvers/molecularDynamics/mdEquilibrationFoam/mdEquilibrationFoam.C b/applications/solvers/discreteMethods/molecularDynamics/mdEquilibrationFoam/mdEquilibrationFoam.C
similarity index 100%
rename from applications/solvers/molecularDynamics/mdEquilibrationFoam/mdEquilibrationFoam.C
rename to applications/solvers/discreteMethods/molecularDynamics/mdEquilibrationFoam/mdEquilibrationFoam.C
diff --git a/applications/solvers/molecularDynamics/mdEquilibrationFoam/readmdEquilibrationDict.H b/applications/solvers/discreteMethods/molecularDynamics/mdEquilibrationFoam/readmdEquilibrationDict.H
similarity index 100%
rename from applications/solvers/molecularDynamics/mdEquilibrationFoam/readmdEquilibrationDict.H
rename to applications/solvers/discreteMethods/molecularDynamics/mdEquilibrationFoam/readmdEquilibrationDict.H
diff --git a/applications/solvers/molecularDynamics/mdFoam/Make/files b/applications/solvers/discreteMethods/molecularDynamics/mdFoam/Make/files
similarity index 100%
rename from applications/solvers/molecularDynamics/mdFoam/Make/files
rename to applications/solvers/discreteMethods/molecularDynamics/mdFoam/Make/files
diff --git a/applications/solvers/molecularDynamics/mdFoam/Make/options b/applications/solvers/discreteMethods/molecularDynamics/mdFoam/Make/options
similarity index 100%
rename from applications/solvers/molecularDynamics/mdFoam/Make/options
rename to applications/solvers/discreteMethods/molecularDynamics/mdFoam/Make/options
diff --git a/applications/solvers/molecularDynamics/mdFoam/mdFoam.C b/applications/solvers/discreteMethods/molecularDynamics/mdFoam/mdFoam.C
similarity index 100%
rename from applications/solvers/molecularDynamics/mdFoam/mdFoam.C
rename to applications/solvers/discreteMethods/molecularDynamics/mdFoam/mdFoam.C
diff --git a/applications/test/volPointInterpolation/volPointInterpolationTest.C b/applications/test/volPointInterpolation/volPointInterpolationTest.C
index 07329ac3492d5978538c2ad4a49241970f4ce866..d44dcf9fa4e1743653bc9d1b363d55407f7872f5 100644
--- a/applications/test/volPointInterpolation/volPointInterpolationTest.C
+++ b/applications/test/volPointInterpolation/volPointInterpolationTest.C
@@ -68,8 +68,7 @@ int main(int argc, char *argv[])
         mesh
     );
 
-    pointMesh pMesh(mesh);
-    volPointInterpolation pInterp(mesh, pMesh);
+    const volPointInterpolation& pInterp = volPointInterpolation::New(mesh);
 
     pointScalarField pp(pInterp.interpolate(p));
     pp.write();
diff --git a/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C b/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C
index 02fb26d52c697b1e810f72ef2a30bb06878c773d..c5b8c8334d1fdda7847c8569cb25c5b020b422f2 100644
--- a/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C
+++ b/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C
@@ -100,6 +100,7 @@ void processorPointPatchField<Type>::initSwapAdd(Field<Type>& pField) const
 {
     if (Pstream::parRun())
     {
+        // Get internal field into my point order
         Field<Type> pf(this->patchInternalField(pField));
 
         OPstream::write
@@ -130,11 +131,7 @@ void processorPointPatchField<Type>::swapAdd(Field<Type>& pField) const
 
         if (doTransform())
         {
-            const labelList& nonGlobalPatchPoints =
-                procPatch_.nonGlobalPatchPoints();
-
             const processorPolyPatch& ppp = procPatch_.procPolyPatch();
-            const labelListList& pointFaces = ppp.pointFaces();
             const tensorField& forwardT = ppp.forwardT();
 
             if (forwardT.size() == 1)
@@ -143,6 +140,10 @@ void processorPointPatchField<Type>::swapAdd(Field<Type>& pField) const
             }
             else
             {
+                const labelList& nonGlobalPatchPoints =
+                    procPatch_.nonGlobalPatchPoints();
+                const labelListList& pointFaces = ppp.pointFaces();
+
                 forAll(nonGlobalPatchPoints, pfi)
                 {
                     pnf[pfi] = transform
diff --git a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processor/processorPointPatch.C b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processor/processorPointPatch.C
index 2e3e001ca9184a4f674e8ccf6a3785087a43ca23..6ef8787d776aafcf3c91f383d3a04f6547f3e6f4 100644
--- a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processor/processorPointPatch.C
+++ b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processor/processorPointPatch.C
@@ -64,7 +64,7 @@ void Foam::processorPointPatch::initGeometry()
     }
     else
     {
-        // Slave side.  Create the reversed patch and pick up its points
+        // Slave side. Create the reversed patch and pick up its points
         // so that the order is correct
         const polyPatch& pp = patch();
 
diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H
index f0bd005b476d9d6122fe8045df53fbddf17acdae..c741b0839ec91863cb47c5071a1c3d08c03c2a33 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H
+++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H
@@ -330,7 +330,9 @@ public:
 
         // Addressing into mesh
 
-            //- Return labelList of mesh points in patch
+            //- Return labelList of mesh points in patch. They are constructed
+            //  walking through the faces in incremental order and not sorted
+            //  anymore.
             const labelList& meshPoints() const;
 
             //- Mesh point map.  Given the global point index find its
diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshData.C b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshData.C
index 9941b024598b0f8346310f88e0680c1805210b46..30cffb6310a0e3b74fa5641b8d9ed1641cb6dd15 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshData.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshData.C
@@ -67,30 +67,56 @@ calcMeshData() const
     // number of faces in the patch
     Map<label> markedPoints(4*this->size());
 
-    // if the point is used, set the mark to 1
+
+    // Important:
+    // ~~~~~~~~~~
+    // In <= 1.5 the meshPoints would be in increasing order but this gives
+    // problems in processor point synchronisation where we have to find out
+    // how the opposite side would have allocated points.
+
+    ////- 1.5 code:
+    //// if the point is used, set the mark to 1
+    //forAll (*this, faceI)
+    //{
+    //    const Face& curPoints = this->operator[](faceI);
+    //
+    //    forAll (curPoints, pointI)
+    //    {
+    //        markedPoints.insert(curPoints[pointI], -1);
+    //    }
+    //}
+    //
+    //// Create the storage and store the meshPoints.  Mesh points are
+    //// the ones marked by the usage loop above
+    //meshPointsPtr_ = new labelList(markedPoints.toc());
+    //labelList& pointPatch = *meshPointsPtr_;
+    //
+    //// Sort the list to preserve compatibility with the old ordering
+    //sort(pointPatch);
+    //
+    //// For every point in map give it its label in mesh points
+    //forAll (pointPatch, pointI)
+    //{
+    //    markedPoints.find(pointPatch[pointI])() = pointI;
+    //}
+
+    //- Unsorted version:
+    DynamicList<label> meshPoints(2*this->size());
     forAll (*this, faceI)
     {
         const Face& curPoints = this->operator[](faceI);
 
         forAll (curPoints, pointI)
         {
-            markedPoints.insert(curPoints[pointI], -1);
+            if (markedPoints.insert(curPoints[pointI], meshPoints.size()))
+            {
+                meshPoints.append(curPoints[pointI]);
+            }
         }
     }
+    // Transfer to straight list (reuses storage)
+    meshPointsPtr_ = new labelList(meshPoints, true);
 
-    // Create the storage and store the meshPoints.  Mesh points are
-    // the ones marked by the usage loop above
-    meshPointsPtr_ = new labelList(markedPoints.toc());
-    labelList& pointPatch = *meshPointsPtr_;
-
-    // Sort the list to preserve compatibility with the old ordering
-    sort(pointPatch);
-
-    // For every point in map give it its label in mesh points
-    forAll (pointPatch, pointI)
-    {
-        markedPoints.find(pointPatch[pointI])() = pointI;
-    }
 
     // Create local faces. Note that we start off from copy of original face
     // list (even though vertices are overwritten below). This is done so
diff --git a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoHexMeshDriver.H b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoHexMeshDriver.H
index 83e7dd9c69a351559e6fb234651c4e228b8ece54..9ae910b5a71c19965794151be42ef0d9759603d4 100644
--- a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoHexMeshDriver.H
+++ b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoHexMeshDriver.H
@@ -38,7 +38,6 @@ SourceFiles
 
 #include "autoPtr.H"
 #include "dictionary.H"
-#include "pointField.H"
 #include "boolList.H"
 #include "wallPoint.H"
 #include "searchableSurfaces.H"
diff --git a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
index aa7ecddf8b8660aef0699fbdeea5e0ac0992f715..011417c29ecd92107e34ff596c9ba506a60cb50a 100644
--- a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
+++ b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
@@ -29,7 +29,6 @@ Description
 
 #include "autoSnapDriver.H"
 #include "Time.H"
-#include "pointFields.H"
 #include "motionSmoother.H"
 #include "polyTopoChange.H"
 #include "OFstream.H"
@@ -1389,11 +1388,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoSnapDriver::repatchToSurface
             }
         }
 
-        pointField localFaceCentres(pp.size());
-        forAll(pp, i)
-        {
-            localFaceCentres[i] = mesh.faceCentres()[pp.addressing()[i]];
-        }
+        pointField localFaceCentres(mesh.faceCentres(), pp.addressing());
 
         // Get nearest surface and region
         labelList hitSurface;
diff --git a/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C b/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C
index 24c7819d8d6b50ec92b4b8d6ccd97bc0356f7d1c..d42ac05b2233d1657f30a6511c825344c531924e 100644
--- a/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C
+++ b/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C
@@ -1242,7 +1242,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::refine
 // Do refinement of consistent set of cells followed by truncation and
 // load balancing.
 Foam::autoPtr<Foam::mapDistributePolyMesh>
- Foam::meshRefinement::refineAndBalance
+Foam::meshRefinement::refineAndBalance
 (
     const string& msg,
     decompositionMethod& decomposer,
diff --git a/src/autoMesh/autoHexMesh/shellSurfaces/shellSurfaces.C b/src/autoMesh/autoHexMesh/shellSurfaces/shellSurfaces.C
index 9c06ccddea6156ba9ff0c1215cf0c6af1cd130ad..856f2ba9239aa3f372fbb511fa9c0693ba519817 100644
--- a/src/autoMesh/autoHexMesh/shellSurfaces/shellSurfaces.C
+++ b/src/autoMesh/autoHexMesh/shellSurfaces/shellSurfaces.C
@@ -193,7 +193,7 @@ void Foam::shellSurfaces::orient()
 
     if (hasSurface)
     {
-        const point outsidePt = 2 * overallBb.span();
+        const point outsidePt = overallBb.max() + overallBb.span();
 
         //Info<< "Using point " << outsidePt << " to orient shells" << endl;
 
diff --git a/src/meshTools/searchableSurface/triSurfaceMesh.C b/src/meshTools/searchableSurface/triSurfaceMesh.C
index 4703d692016e65141103c325453c9021b7446da0..877f2643414d78b9fc986fa2d765b56aac04b816 100644
--- a/src/meshTools/searchableSurface/triSurfaceMesh.C
+++ b/src/meshTools/searchableSurface/triSurfaceMesh.C
@@ -120,6 +120,29 @@ const Foam::fileName& Foam::triSurfaceMesh::checkFile
 }
 
 
+bool Foam::triSurfaceMesh::addFaceToEdge
+(
+    const edge& e,
+    EdgeMap<label>& facesPerEdge
+)
+{
+    EdgeMap<label>::iterator eFnd = facesPerEdge.find(e);
+    if (eFnd != facesPerEdge.end())
+    {
+        if (eFnd() == 2)
+        {
+            return false;
+        }
+        eFnd()++;
+    }
+    else
+    {
+        facesPerEdge.insert(e, 1);
+    }
+    return true;
+}
+
+
 bool Foam::triSurfaceMesh::isSurfaceClosed() const
 {
     // Construct pointFaces. Let's hope surface has compact point
@@ -142,48 +165,41 @@ bool Foam::triSurfaceMesh::isSurfaceClosed() const
             const labelledTri& f = triSurface::operator[](pFaces[i]);
             label fp = findIndex(f, pointI);
 
+            // Something weird: if I expand the code of addFaceToEdge in both
+            // below instances it gives a segmentation violation on some
+            // surfaces. Compiler (4.3.2) problem?
+
+
             // Forward edge
+            label nextPointI = f[f.fcIndex(fp)];
+
+            if (nextPointI > pointI)
             {
-                label p1 = f[f.fcIndex(fp)];
+                bool okFace = addFaceToEdge
+                (
+                    edge(pointI, nextPointI),
+                    facesPerEdge
+                );
 
-                if (p1 > pointI)
+                if (!okFace)
                 {
-                    const edge e(pointI, p1);
-                    EdgeMap<label>::iterator eFnd = facesPerEdge.find(e);
-                    if (eFnd != facesPerEdge.end())
-                    {
-                        if (eFnd() == 2)
-                        {
-                            return false;
-                        }
-                        eFnd()++;
-                    }
-                    else
-                    {
-                        facesPerEdge.insert(e, 1);
-                    }
+                    return false;
                 }
             }
             // Reverse edge
+            label prevPointI = f[f.rcIndex(fp)];
+
+            if (prevPointI > pointI)
             {
-                label p1 = f[f.rcIndex(fp)];
+                bool okFace = addFaceToEdge
+                (
+                    edge(pointI, prevPointI),
+                    facesPerEdge
+                );
 
-                if (p1 > pointI)
+                if (!okFace)
                 {
-                    const edge e(pointI, p1);
-                    EdgeMap<label>::iterator eFnd = facesPerEdge.find(e);
-                    if (eFnd != facesPerEdge.end())
-                    {
-                        if (eFnd() == 2)
-                        {
-                            return false;
-                        }
-                        eFnd()++;
-                    }
-                    else
-                    {
-                        facesPerEdge.insert(e, 1);
-                    }
+                    return false;
                 }
             }
         }
diff --git a/src/meshTools/searchableSurface/triSurfaceMesh.H b/src/meshTools/searchableSurface/triSurfaceMesh.H
index a4231457d5183097cff2eceb31ca00e944c6a05d..b2ec61c14a943e4c6d4268306d5dfc4ee9157359 100644
--- a/src/meshTools/searchableSurface/triSurfaceMesh.H
+++ b/src/meshTools/searchableSurface/triSurfaceMesh.H
@@ -42,6 +42,7 @@ SourceFiles
 #include "indexedOctree.H"
 #include "treeDataTriSurface.H"
 #include "treeDataEdge.H"
+#include "EdgeMap.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -91,6 +92,13 @@ private:
             const fileName& objectName
         );
 
+        //- Helper function for isSurfaceClosed
+        static bool addFaceToEdge
+        (
+            const edge&,
+            EdgeMap<label>&
+        );
+
         //- Check whether surface is closed without calculating any permanent
         //  addressing.
         bool isSurfaceClosed() const;
diff --git a/src/meshTools/triSurface/orientedSurface/orientedSurface.C b/src/meshTools/triSurface/orientedSurface/orientedSurface.C
index 911d06747ae1d21f6b2bcf9608f31cdb2b08f002..10e1fa8f2f930e9457352190159ea80584ef3623 100644
--- a/src/meshTools/triSurface/orientedSurface/orientedSurface.C
+++ b/src/meshTools/triSurface/orientedSurface/orientedSurface.C
@@ -175,6 +175,51 @@ Foam::labelList Foam::orientedSurface::edgeToFace
 }
 
 
+void Foam::orientedSurface::walkSurface
+(
+    const triSurface& s,
+    const label startFaceI,
+    labelList& flipState
+)
+{
+    // List of faces that were changed in the last iteration.
+    labelList changedFaces(1, startFaceI);
+    // List of edges that were changed in the last iteration.
+    labelList changedEdges;
+
+    while(true)
+    {
+        changedEdges = faceToEdge(s, changedFaces);
+
+        if (debug)
+        {
+            Pout<< "From changedFaces:" << changedFaces.size()
+                << " to changedEdges:" << changedEdges.size()
+                << endl;
+        }
+
+        if (changedEdges.empty())
+        {
+            break;
+        }
+
+        changedFaces = edgeToFace(s, changedEdges, flipState);
+
+        if (debug)
+        {
+            Pout<< "From changedEdges:" << changedEdges.size()
+                << " to changedFaces:" << changedFaces.size()
+                << endl;
+        }
+
+        if (changedFaces.empty())
+        {
+            break;
+        }
+    }
+}
+
+
 void Foam::orientedSurface::propagateOrientation
 (
     const triSurface& s,
@@ -228,42 +273,8 @@ void Foam::orientedSurface::propagateOrientation
             << endl;
     }
 
-
-    // List of faces that were changed in the last iteration.
-    labelList changedFaces(1, nearestFaceI);
-    // List of edges that were changed in the last iteration.
-    labelList changedEdges;
-
-    while(true)
-    {
-        changedEdges = faceToEdge(s, changedFaces);
-
-        if (debug)
-        {
-            Pout<< "From changedFaces:" << changedFaces.size()
-                << " to changedEdges:" << changedEdges.size()
-                << endl;
-        }
-
-        if (changedEdges.empty())
-        {
-            break;
-        }
-
-        changedFaces = edgeToFace(s, changedEdges, flipState);
-
-        if (debug)
-        {
-            Pout<< "From changedEdges:" << changedEdges.size()
-                << " to changedFaces:" << changedFaces.size()
-                << endl;
-        }
-
-        if (changedFaces.empty())
-        {
-            break;
-        }
-    }
+    // Walk the surface from nearestFaceI, changing the flipstate.
+    walkSurface(s, nearestFaceI, flipState);
 }
 
 
@@ -352,6 +363,26 @@ bool Foam::orientedSurface::orient
     const bool orientOutside
 )
 {
+    bool anyFlipped = false;
+
+    // Do initial flipping to make triangles consistent. Otherwise if the
+    // nearest is e.g. on an edge inbetween inconsistent triangles it might
+    // make the wrong decision.
+    if (s.size() > 0)
+    {
+        // Whether face has to be flipped.
+        //      UNVISITED: unvisited
+        //      NOFLIP: no need to flip
+        //      FLIP: need to flip
+        labelList flipState(s.size(), UNVISITED);
+
+        flipState[0] = NOFLIP;
+        walkSurface(s, 0, flipState);
+
+        anyFlipped = flipSurface(s, flipState);
+    }
+
+
     // Whether face has to be flipped.
     //      UNVISITED: unvisited
     //      NOFLIP: no need to flip
@@ -410,7 +441,9 @@ bool Foam::orientedSurface::orient
     }
 
     // Now finally flip triangles according to flipState.
-    return flipSurface(s, flipState);
+    bool geomFlipped = flipSurface(s, flipState);
+
+    return anyFlipped || geomFlipped;
 }
 
 
diff --git a/src/meshTools/triSurface/orientedSurface/orientedSurface.H b/src/meshTools/triSurface/orientedSurface/orientedSurface.H
index c0b5ca8c4272b1a5c3396c70eeae414197449e1e..812edd31bde262d71f5b1e8466890418211472e8 100644
--- a/src/meshTools/triSurface/orientedSurface/orientedSurface.H
+++ b/src/meshTools/triSurface/orientedSurface/orientedSurface.H
@@ -94,6 +94,15 @@ class orientedSurface
             labelList& flip
         );
 
+        //- Walk from face across connected faces. Change orientation to be
+        //  consistent with startFaceI.
+        static void walkSurface
+        (
+            const triSurface& s,
+            const label startFaceI,
+            labelList& flipState
+        );
+
         //- Given nearest point and face check orientation to nearest face
         //  and flip if nessecary (only marked in flipState) and propagate.
         static void propagateOrientation
diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C
index 5fd09bda66e9ba888e5f0212c05cca58c567a70f..017117370d1979ab8b5cc9ce0b712a378ac9a6dd 100644
--- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C
+++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C
@@ -307,6 +307,48 @@ Foam::tmp<Foam::volScalarField> Foam::sampledIsoSurface::average
 }
 
 
+Foam::tmp<Foam::pointScalarField> Foam::sampledIsoSurface::average
+(
+    const pointMesh& pMesh,
+    const volScalarField& fld
+) const
+{
+    tmp<pointScalarField> tpointAvg
+    (
+        new pointScalarField
+        (
+            IOobject
+            (
+                "pointAvg",
+                fld.time().timeName(),
+                fld.db(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            pMesh,
+            dimensionedScalar("zero", dimless, scalar(0.0))
+        )
+    );
+    pointScalarField& pointAvg = tpointAvg();
+
+    for (label pointI = 0; pointI < fld.mesh().nPoints(); pointI++)
+    {
+        const labelList& pCells = fld.mesh().pointCells(pointI);
+
+        forAll(pCells, i)
+        {
+            pointAvg[pointI] += fld[pCells[i]];
+        }
+        pointAvg[pointI] /= pCells.size();
+    }
+    // Give value to calculatedFvPatchFields
+    pointAvg.correctBoundaryConditions();
+
+    return tpointAvg;
+}
+
+
 bool Foam::sampledIsoSurface::updateGeometry() const
 {
     const fvMesh& fvm = static_cast<const fvMesh&>(mesh());
@@ -407,6 +449,7 @@ bool Foam::sampledIsoSurface::updateGeometry() const
                 (
                     *volFieldPtr_,
                     *pointFieldPtr_,
+                    //average(pointMesh::New(mesh()), *volFieldPtr_),
                     isoVal_,
                     regularise_,
                     mergeTol_
diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
index 99324cdf5f398a66b1f1e3416d1454e12ff07f20..ccaa4d875005b3189692fa4a34799970a5450acb 100644
--- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
+++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
@@ -124,6 +124,12 @@ class sampledIsoSurface
             const pointScalarField&
         ) const;
 
+        tmp<pointScalarField> average
+        (
+            const pointMesh&,
+            const volScalarField& fld
+        ) const;
+
         //- Create iso surface (if time has changed)
         //  Do nothing (and return false) if no update was needed
         bool updateGeometry() const;