diff --git a/src/fvOptions/fvOptions/fvOption.C b/src/fvOptions/fvOptions/fvOption.C
index 4a66ded16eb078f867aff5bcf169581a76aacab1..6cd5c770f4e90b95e03c88ca66479d186f45a86a 100644
--- a/src/fvOptions/fvOptions/fvOption.C
+++ b/src/fvOptions/fvOptions/fvOption.C
@@ -191,7 +191,10 @@ void Foam::fv::option::setCellSet()
                         (
                             mesh_,
                             nbrMesh,
-                            readBool(dict_.lookup("consistentMeshes"))
+                            meshToMeshNew::interpolationMethodNames_.read
+                            (
+                                dict_.lookup("interpolationMethod")
+                            )
                         )
                     );
                 }
diff --git a/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMesh.H b/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMesh.H
index 9344f75ba0efe37ea62afc15edc311a49d99e079..b99c0629ccb2fc5646367c3732da84bf33a78fcb 100644
--- a/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMesh.H
+++ b/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMesh.H
@@ -27,6 +27,9 @@ Class
 Description
     mesh to mesh interpolation class.
 
+Note
+    This class is due to be deprecated in favour of meshToMeshNew
+
 SourceFiles
     meshToMesh.C
     calculateMeshToMeshAddressing.C
diff --git a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C
index b71e768f428c7dfea79b1dc15d3210009ef087ec..9ecda6cb4fb537e1cd349501d775e055edccad30 100644
--- a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C
+++ b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.C
@@ -39,6 +39,20 @@ License
 namespace Foam
 {
     defineTypeNameAndDebug(meshToMeshNew, 0);
+
+    template<>
+    const char* Foam::NamedEnum
+    <
+        Foam::meshToMeshNew::interpolationMethod,
+        2
+    >::names[] =
+    {
+        "map",
+        "cellVolumeWeight"
+    };
+
+    const NamedEnum<meshToMeshNew::interpolationMethod, 2>
+        meshToMeshNew::interpolationMethodNames_;
 }
 
 Foam::scalar Foam::meshToMeshNew::tolerance_ = 1e-6;
@@ -707,22 +721,40 @@ void Foam::meshToMeshNew::calcAddressing
     }
 
 
-    if (directMapping_)
+    switch (method_)
     {
-        calcDirect(src, tgt, srcSeedI, tgtSeedI);
-    }
-    else
-    {
-        calcIndirect
-        (
-            src,
-            tgt,
-            srcSeedI,
-            tgtSeedI,
-            srcCellIDs,
-            mapFlag,
-            startSeedI
-        );
+        case imMap:
+        {
+            calcDirect(src, tgt, srcSeedI, tgtSeedI);
+            break;
+        }
+        case imCellVolumeWeight:
+        {
+            calcIndirect
+            (
+                src,
+                tgt,
+                srcSeedI,
+                tgtSeedI,
+                srcCellIDs,
+                mapFlag,
+                startSeedI
+            );
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "void Foam::meshToMeshNew::calcAddressing"
+                "("
+                    "const polyMesh&, "
+                    "const polyMesh&"
+                ")"
+            )
+                << "Unknown interpolation method"
+                << abort(FatalError);
+        }
     }
 
 
@@ -739,7 +771,7 @@ Foam::meshToMeshNew::meshToMeshNew
 (
     const polyMesh& src,
     const polyMesh& tgt,
-    const bool directMapping
+    const interpolationMethod& method
 )
 :
     srcRegionName_(src.name()),
@@ -748,11 +780,11 @@ Foam::meshToMeshNew::meshToMeshNew
     tgtToSrcCellAddr_(),
     srcToTgtCellWght_(),
     tgtToSrcCellWght_(),
+    method_(method),
     V_(0.0),
     singleMeshProc_(-1),
     srcMapPtr_(NULL),
-    tgtMapPtr_(NULL),
-    directMapping_(directMapping)
+    tgtMapPtr_(NULL)
 {
     Info<< "Creating mesh-to-mesh addressing for " << src.name()
         << " and " << tgt.name() << " regions" << endl;
diff --git a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H
index 6b5211ef43da846289f3a274ff7e5bbc3f4e7ae8..85f0c1332e9e5857008d54553a6fe38a0b6ff7f8 100644
--- a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H
+++ b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNew.H
@@ -40,6 +40,7 @@ SourceFiles
 #include "boundBox.H"
 #include "mapDistribute.H"
 #include "volFieldsFwd.H"
+#include "NamedEnum.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -52,6 +53,22 @@ namespace Foam
 
 class meshToMeshNew
 {
+public:
+
+    // Public data types
+
+        //- Enumeration specifying required accuracy
+        enum interpolationMethod
+        {
+            imMap,
+            imCellVolumeWeight
+        };
+
+        static const NamedEnum<interpolationMethod, 2>
+            interpolationMethodNames_;
+
+private:
+
     // Private data
 
         //- Name of source mesh region
@@ -72,6 +89,9 @@ class meshToMeshNew
         //- Target to source cell interpolation weights
         scalarListList tgtToSrcCellWght_;
 
+        //- Interpolation method
+        interpolationMethod method_;
+
         //- Cell total volume in overlap region [m3]
         scalar V_;
 
@@ -85,9 +105,6 @@ class meshToMeshNew
         //- Target map pointer - parallel running only
         autoPtr<mapDistribute> tgtMapPtr_;
 
-        //- Flag to indicate that direct (one-to-one) mapping should be applied
-        bool directMapping_;
-
         //- Tolerance used in volume overlap calculations
         static scalar tolerance_;
 
@@ -289,7 +306,7 @@ public:
     (
         const polyMesh& src,
         const polyMesh& tgt,
-        const bool directMapping
+        const interpolationMethod& method
     );
 
 
diff --git a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C
index 4587b8ea60a0be63cc6cfcf467403ce4209eed13..69bbc69667b466985a055d3c424b925eec0ca38f 100644
--- a/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C
+++ b/src/sampling/meshToMeshInterpolation/meshToMeshNew/meshToMeshNewTemplates.C
@@ -395,28 +395,33 @@ void Foam::meshToMeshNew::interpolate
 
     if (interpPatches)
     {
-        if (directMapping_)
+        switch (method_)
         {
-            result.boundaryField() == field.boundaryField();
-        }
-        else
-        {
-            notImplemented
-            (
-                "void Foam::meshToMeshNew::interpolate"
-                "("
-                    "const GeometricField<Type, fvPatchField, volMesh>&, "
-                    "const CombineOp&, "
-                    "GeometricField<Type, fvPatchField, volMesh>&, "
-                    "const bool"
-                ") const - non-conformal patches"
-            )
-
-            // do something...
+            case imMap:
+            {
+                result.boundaryField() == field.boundaryField();
+                break;
+            }
+            default:
+            {
+                notImplemented
+                (
+                    "void Foam::meshToMeshNew::interpolate"
+                    "("
+                        "const GeometricField<Type, fvPatchField, volMesh>&, "
+                        "const CombineOp&, "
+                        "GeometricField<Type, fvPatchField, volMesh>&, "
+                        "const bool"
+                    ") const - non-conformal patches"
+                )
+
+                // do something...
+            }
         }
     }
 }
 
+
 template<class Type, class CombineOp>
 Foam::tmp<Foam::GeometricField<Type, Foam::fvPatchField, Foam::volMesh> >
 Foam::meshToMeshNew::interpolate