diff --git a/applications/utilities/mesh/manipulation/topoSet/topoSetDict b/applications/utilities/mesh/manipulation/topoSet/topoSetDict
index 5b8a4b73bbe85c562c9e50527fd1b113a8796c3b..4c2180f21d489ff5b916f8bce73628f23443558c 100644
--- a/applications/utilities/mesh/manipulation/topoSet/topoSetDict
+++ b/applications/utilities/mesh/manipulation/topoSet/topoSetDict
@@ -85,7 +85,7 @@ FoamFile
 //    {
 //        set p0;
 //        option any;         // cell with any point in pointSet
-//        //option all;       // cell with all points in pointSet
+//        //option edge;      // cell with an edge with both points in pointSet
 //    }
 //
 //    // Select based on cellShape
@@ -198,6 +198,7 @@ FoamFile
 //        set p0;
 //        option any;         // Faces using any point in pointSet
 //        //option all        // Faces with all points in pointSet
+//        //option edge       // Faces with two consecutive points in pointSet
 //    }
 //
 //    //  Select by explicitly providing face labels
diff --git a/src/meshTools/sets/cellSources/pointToCell/pointToCell.C b/src/meshTools/sets/cellSources/pointToCell/pointToCell.C
index 9701431dc41eb045e4e9f4e73c34376b37f1f8a3..0939a2e3bec5142b84c8b3eb25a2d3788234458d 100644
--- a/src/meshTools/sets/cellSources/pointToCell/pointToCell.C
+++ b/src/meshTools/sets/cellSources/pointToCell/pointToCell.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -41,10 +41,11 @@ namespace Foam
     const char* Foam::NamedEnum
     <
         Foam::pointToCell::pointAction,
-        1
+        2
     >::names[] =
     {
-        "any"
+        "any",
+        "edge"
     };
 }
 
@@ -52,11 +53,12 @@ namespace Foam
 Foam::topoSetSource::addToUsageTable Foam::pointToCell::usage_
 (
     pointToCell::typeName,
-    "\n    Usage: pointToCell <pointSet> any\n\n"
-    "    Select all cells with any point in the pointSet\n\n"
+    "\n    Usage: pointToCell <pointSet> any|edge\n\n"
+    "    Select all cells with any point ('any') or any edge ('edge')"
+    " in the pointSet\n\n"
 );
 
-const Foam::NamedEnum<Foam::pointToCell::pointAction, 1>
+const Foam::NamedEnum<Foam::pointToCell::pointAction, 2>
     Foam::pointToCell::pointActionNames_;
 
 
@@ -82,6 +84,26 @@ void Foam::pointToCell::combine(topoSet& set, const bool add) const
             }
         }
     }
+    else if (option_ == EDGE)
+    {
+        const faceList& faces = mesh_.faces();
+        forAll(faces, faceI)
+        {
+            const face& f = faces[faceI];
+
+            forAll(f, fp)
+            {
+                if (loadedSet.found(f[fp]) && loadedSet.found(f.nextLabel(fp)))
+                {
+                    addOrDelete(set, mesh_.faceOwner()[faceI], add);
+                    if (mesh_.isInternalFace(faceI))
+                    {
+                        addOrDelete(set, mesh_.faceNeighbour()[faceI], add);
+                    }
+                }
+            }
+        }
+    }
 }
 
 
diff --git a/src/meshTools/sets/cellSources/pointToCell/pointToCell.H b/src/meshTools/sets/cellSources/pointToCell/pointToCell.H
index 2e8a507640ae01cc54ea01b6369d81e383d8940a..96f02f18bf64c475f8526e82403c45e3b6627ba7 100644
--- a/src/meshTools/sets/cellSources/pointToCell/pointToCell.H
+++ b/src/meshTools/sets/cellSources/pointToCell/pointToCell.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -55,7 +55,8 @@ public:
         //- Enumeration defining the valid options
         enum pointAction
         {
-            ANY     // Cells using any point in set
+            ANY,    // Cells using any point in set
+            EDGE    // Cells using an edge with both points in set
             //ALL   // Possible extension: cells whose all points are in set
         };
 
@@ -64,7 +65,7 @@ private:
         //- Add usage string
         static addToUsageTable usage_;
 
-        static const NamedEnum<pointAction, 1> pointActionNames_;
+        static const NamedEnum<pointAction, 2> pointActionNames_;
 
         //- Name of set to use
         word setName_;
diff --git a/src/meshTools/sets/faceSources/pointToFace/pointToFace.C b/src/meshTools/sets/faceSources/pointToFace/pointToFace.C
index 81e13e4fc459d26bdd85ee0bd8c0edc00c48f114..7d66aaefe2cd999053f8cca4d2d5209c8e6dd9dd 100644
--- a/src/meshTools/sets/faceSources/pointToFace/pointToFace.C
+++ b/src/meshTools/sets/faceSources/pointToFace/pointToFace.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -41,11 +41,12 @@ namespace Foam
     const char* Foam::NamedEnum
     <
         Foam::pointToFace::pointAction,
-        2
+        3
     >::names[] =
     {
         "any",
-        "all"
+        "all",
+        "edge"
     };
 }
 
@@ -53,13 +54,14 @@ namespace Foam
 Foam::topoSetSource::addToUsageTable Foam::pointToFace::usage_
 (
     pointToFace::typeName,
-    "\n    Usage: pointToFace <pointSet> any|all\n\n"
+    "\n    Usage: pointToFace <pointSet> any|all|edge\n\n"
     "    Select faces with\n"
     "    -any point in the pointSet\n"
     "    -all points in the pointSet\n\n"
+    "    -two consecutive points (an edge) in the pointSet\n\n"
 );
 
-const Foam::NamedEnum<Foam::pointToFace::pointAction, 2>
+const Foam::NamedEnum<Foam::pointToFace::pointAction, 3>
     Foam::pointToFace::pointActionNames_;
 
 
@@ -126,6 +128,23 @@ void Foam::pointToFace::combine(topoSet& set, const bool add) const
             }
         }
     }
+    else if (option_ == EDGE)
+    {
+        const faceList& faces = mesh_.faces();
+        forAll(faces, faceI)
+        {
+            const face& f = faces[faceI];
+
+            forAll(f, fp)
+            {
+                if (loadedSet.found(f[fp]) && loadedSet.found(f.nextLabel(fp)))
+                {
+                    addOrDelete(set, faceI, add);
+                    break;
+                }
+            }
+        }
+    }
 }
 
 
diff --git a/src/meshTools/sets/faceSources/pointToFace/pointToFace.H b/src/meshTools/sets/faceSources/pointToFace/pointToFace.H
index 482626f33fc3aa652e893a4a31061648190f2446..e31bc65086f02e96086085e25bfbe57c778d48ca 100644
--- a/src/meshTools/sets/faceSources/pointToFace/pointToFace.H
+++ b/src/meshTools/sets/faceSources/pointToFace/pointToFace.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -58,7 +58,8 @@ public:
         enum pointAction
         {
             ANY,
-            ALL
+            ALL,
+            EDGE
         };
 
 
@@ -67,7 +68,7 @@ private:
         //- Add usage string
         static addToUsageTable usage_;
 
-        static const NamedEnum<pointAction, 2> pointActionNames_;
+        static const NamedEnum<pointAction, 3> pointActionNames_;
 
         //- Name of set to use
         word setName_;
diff --git a/src/postProcessing/functionObjects/field/fieldValues/controlDict b/src/postProcessing/functionObjects/field/fieldValues/controlDict
index 24b3ddbad403d1cd99759e861c89aebaf30af9a8..ff5007f18d43eceacbd876c53aeaa9b10d595138 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/controlDict
+++ b/src/postProcessing/functionObjects/field/fieldValues/controlDict
@@ -67,17 +67,14 @@ functions
         sourceName      movingWall;
 
         //// if sampledSurface: dictionary with a sampledSurface
-        //// Note: the sampledSurfaces will have cell-values, i.e.
-        //// non-interpolated. Also will not sample surface fields.
+        //// Note: will not sample surface fields.
         //sampledSurfaceDict
         //{
-        //    type            cuttingPlane;
-        //    planeType       pointAndNormal;
-        //    pointAndNormalDict
-        //    {
-        //        basePoint       (0 0.099 0);
-        //        normalVector    (0 1 0);
-        //    }
+        //    // Sampling on triSurface
+        //    type        sampledTriSurfaceMesh;
+        //    surface     integrationPlane.stl;
+        //    source      cells;  // sample cells or boundaryFaces
+        //    interpolate true;
         //}
 
         // Operation: areaAverage/sum/weightedAverage ...
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
index 97f244c60b21a0d91d66b1955073434be667720d..6ce7b3350ddb4e5eac90b3bc8338ece4e6504e78 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
@@ -53,7 +53,7 @@ namespace Foam
     const char* Foam::NamedEnum
     <
         Foam::fieldValues::faceSource::operationType,
-        9
+        11
     >::names[] =
     {
         "none",
@@ -64,7 +64,9 @@ namespace Foam
         "areaIntegrate",
         "min",
         "max",
-        "CoV"
+        "CoV",
+        "areaNormalAverage",
+        "areaNormalIntegrate"
     };
 
 }
@@ -73,7 +75,7 @@ namespace Foam
 const Foam::NamedEnum<Foam::fieldValues::faceSource::sourceType, 3>
     Foam::fieldValues::faceSource::sourceTypeNames_;
 
-const Foam::NamedEnum<Foam::fieldValues::faceSource::operationType, 9>
+const Foam::NamedEnum<Foam::fieldValues::faceSource::operationType, 11>
     Foam::fieldValues::faceSource::operationTypeNames_;
 
 
@@ -313,6 +315,35 @@ void Foam::fieldValues::faceSource::writeFileHeader()
 }
 
 
+template<>
+Foam::vector Foam::fieldValues::faceSource::processValues
+(
+    const Field<vector>& values,
+    const vectorField& Sf,
+    const scalarField& weightField
+) const
+{
+    switch (operation_)
+    {
+        case opAreaNormalAverage:
+        {
+            scalar result = sum(values&Sf)/sum(mag(Sf));
+            return vector(result, 0.0, 0.0);
+        }
+        case opAreaNormalIntegrate:
+        {
+            scalar result = sum(values&Sf);
+            return vector(result, 0.0, 0.0);
+        }
+        default:
+        {
+            // Fall through to other operations
+            return processSameTypeValues(values, Sf, weightField);
+        }
+    }
+}
+
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 Foam::fieldValues::faceSource::faceSource
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
index b7a292403593051934bf8c6cf0b57bbef556f9de..fd95788894aa3e9d63ebc083045e422f66d6164c 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -65,7 +65,9 @@ Description
       - min
       - max
       - CoV (Coefficient of variation: standard deviation/mean)
-
+      - areaNormalAverage   (vector with first component (average of) inproduct
+                             of value and face area vector)
+      - areaNormalIntegrate (   ,,          ,,           (sum of)       ,,
 
     Notes:
     - faces on empty patches get ignored
@@ -75,7 +77,11 @@ Description
       negative pressure)
     - using sampledSurfaces:
             - they do not do surface fields
-            - they use cell values - they do not do any interpolation.
+            - if interpolate=true they use interpolationCellPoint
+              otherwise they use cell values
+            - each triangle in sampledSurface is logically only in one cell
+              so interpolation will be wrong when triangles are larger than
+              cells. This can only happen for sampling on triSurfaceMesh.
             - take care when using isoSurfaces - these might have duplicate
               triangles so integration might be wrong
 
@@ -138,11 +144,13 @@ public:
             opAreaIntegrate,
             opMin,
             opMax,
-            opCoV
+            opCoV,
+            opAreaNormalAverage,
+            opAreaNormalIntegrate
         };
 
         //- Operation type names
-        static const NamedEnum<operationType, 9> operationTypeNames_;
+        static const NamedEnum<operationType, 11> operationTypeNames_;
 
 
 private:
@@ -194,7 +202,6 @@ protected:
             autoPtr<sampledSurface> surfacePtr_;
 
 
-
     // Protected Member Functions
 
         //- Initialise, e.g. face addressing
@@ -212,12 +219,23 @@ protected:
             const bool mustGet = false
         ) const;
 
-        //- Apply the 'operation' to the values
+        //- Apply the 'operation' to the values. Operation has to
+        //  preserve Type.
+        template<class Type>
+        Type processSameTypeValues
+        (
+            const Field<Type>& values,
+            const vectorField& Sf,
+            const scalarField& weightField
+        ) const;
+
+        //- Apply the 'operation' to the values. Wrapper around
+        //  processSameTypeValues. See also template specialisation below.
         template<class Type>
         Type processValues
         (
             const Field<Type>& values,
-            const scalarField& magSf,
+            const vectorField& Sf,
             const scalarField& weightField
         ) const;
 
@@ -292,6 +310,17 @@ public:
 };
 
 
+//- Specialisation of processing vectors for opAreaNormalAverage,
+//  opAreaNormalIntegrate (use inproduct - dimension reducing operation)
+template<>
+vector faceSource::processValues
+(
+    const Field<vector>& values,
+    const vectorField& Sf,
+    const scalarField& weightField
+) const;
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace fieldValues
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
index 79c031818fda6824ebf362877ed7bd8bd331bcd4..892593d0360bfe14aafeadc92f2b4820123f653d 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
@@ -27,6 +27,7 @@ License
 #include "surfaceFields.H"
 #include "volFields.H"
 #include "sampledSurface.H"
+#include "interpolationCellPoint.H"
 
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
@@ -65,13 +66,44 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues
     }
     else if (obr_.foundObject<vf>(fieldName))
     {
+        const vf& fld = obr_.lookupObject<vf>(fieldName);
+
         if (surfacePtr_.valid())
         {
-            return surfacePtr_().sample(obr_.lookupObject<vf>(fieldName));
+            if (surfacePtr_().interpolate())
+            {
+                const interpolationCellPoint<Type> interp(fld);
+                tmp<Field<Type> > tintFld(surfacePtr_().interpolate(interp));
+                const Field<Type>& intFld = tintFld();
+
+                // Average
+                const faceList& faces = surfacePtr_().faces();
+                tmp<Field<Type> > tavg
+                (
+                    new Field<Type>(faces.size(), pTraits<Type>::zero)
+                );
+                Field<Type>& avg = tavg();
+
+                forAll(faces, faceI)
+                {
+                    const face& f = faces[faceI];
+                    forAll(f, fp)
+                    {
+                        avg[faceI] += intFld[f[fp]];
+                    }
+                    avg[faceI] /= f.size();
+                }
+
+                return tavg;
+            }
+            else
+            {
+                return surfacePtr_().sample(fld);
+            }
         }
         else
         {
-            return filterField(obr_.lookupObject<vf>(fieldName), true);
+            return filterField(fld, true);
         }
     }
 
@@ -94,12 +126,11 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues
 
 
 template<class Type>
-Type Foam::fieldValues::faceSource::processValues
+Type Foam::fieldValues::faceSource::processSameTypeValues
 (
     const Field<Type>& values,
-    const scalarField& magSf,
+    const vectorField& Sf,
     const scalarField& weightField
-
 ) const
 {
     Type result = pTraits<Type>::zero;
@@ -122,11 +153,15 @@ Type Foam::fieldValues::faceSource::processValues
         }
         case opAreaAverage:
         {
+            const scalarField magSf = mag(Sf);
+
             result = sum(values*magSf)/sum(magSf);
             break;
         }
         case opAreaIntegrate:
         {
+            const scalarField magSf = mag(Sf);
+
             result = sum(values*magSf);
             break;
         }
@@ -142,6 +177,8 @@ Type Foam::fieldValues::faceSource::processValues
         }
         case opCoV:
         {
+            const scalarField magSf = mag(Sf);
+
             Type meanValue = sum(values*magSf)/sum(magSf);
 
             const label nComp = pTraits<Type>::nComponents;
@@ -169,6 +206,19 @@ Type Foam::fieldValues::faceSource::processValues
 }
 
 
+template<class Type>
+Type Foam::fieldValues::faceSource::processValues
+(
+    const Field<Type>& values,
+    const vectorField& Sf,
+    const scalarField& weightField
+) const
+{
+    return processSameTypeValues(values, Sf, weightField);
+}
+
+
+
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class Type>
@@ -186,22 +236,22 @@ bool Foam::fieldValues::faceSource::writeValues(const word& fieldName)
             weightField = getFieldValues<scalar>(weightFieldName_, true);
         }
 
-        scalarField magSf;
+        vectorField Sf;
 
         if (surfacePtr_.valid())
         {
-            // Get unoriented magSf
-            magSf = surfacePtr_().magSf();
+            // Get oriented Sf
+            Sf = surfacePtr_().Sf();
         }
         else
         {
-            // Get unoriented magSf
-            magSf = filterField(mesh().magSf(), false);
+            // Get oriented Sf
+            Sf = filterField(mesh().Sf(), false);
         }
 
         // Combine onto master
         combineFields(values);
-        combineFields(magSf);
+        combineFields(Sf);
         combineFields(weightField);
 
         // apply weight field
@@ -210,7 +260,7 @@ bool Foam::fieldValues::faceSource::writeValues(const word& fieldName)
 
         if (Pstream::master())
         {
-            Type result = processValues(values, magSf, weightField);
+            Type result = processValues(values, Sf, weightField);
 
             if (valueOutput_)
             {