diff --git a/src/sampling/Make/files b/src/sampling/Make/files
index 01cce604966811c246045d285390e7fdba8efbba..de74ebb8de8b2dcfcd563fe1e46200d82c1ebaac 100644
--- a/src/sampling/Make/files
+++ b/src/sampling/Make/files
@@ -39,6 +39,7 @@ sampledSurface/sampledSurface/sampledSurface.C
 sampledSurface/sampledSurfaces/sampledSurfaces.C
 sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C
 sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
+sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.C
 sampledSurface/thresholdCellFaces/sampledThresholdCellFaces.C
 
 /* Proof-of-concept: */
diff --git a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.C b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.C
new file mode 100644
index 0000000000000000000000000000000000000000..ef1bdf8084168a1f7d4102d334c38669588bad72
--- /dev/null
+++ b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.C
@@ -0,0 +1,134 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 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 3 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, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "sampledTriSurfaceMeshNormal.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(sampledTriSurfaceMeshNormal, 0);
+    addToRunTimeSelectionTable
+    (
+        sampledSurface,
+        sampledTriSurfaceMeshNormal,
+        word
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::sampledTriSurfaceMeshNormal::sampledTriSurfaceMeshNormal
+(
+    const word& name,
+    const polyMesh& mesh,
+    const word& surfaceName,
+    const samplingSource sampleSource
+)
+:
+    sampledTriSurfaceMesh(name, mesh, surfaceName, sampleSource)
+{}
+
+
+Foam::sampledTriSurfaceMeshNormal::sampledTriSurfaceMeshNormal
+(
+    const word& name,
+    const polyMesh& mesh,
+    const dictionary& dict
+)
+:
+    sampledTriSurfaceMesh(name, mesh, dict)
+{}
+
+
+Foam::sampledTriSurfaceMeshNormal::sampledTriSurfaceMeshNormal
+(
+    const word& name,
+    const polyMesh& mesh,
+    const triSurface& surface,
+    const word& sampleSourceName
+)
+:
+    sampledTriSurfaceMesh(name, mesh, surface, sampleSourceName)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::sampledTriSurfaceMeshNormal::~sampledTriSurfaceMeshNormal()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::tmp<Foam::Field<Foam::vector>>
+Foam::sampledTriSurfaceMeshNormal::sample
+(
+    const GeometricField<vector, fvPatchField, volMesh>& vField
+) const
+{
+    tmp<Field<vector>> tfld(new Field<vector>(size(), vector::zero));
+    tfld.ref().replace
+    (
+        0,
+        meshedSurface::faceNormals()
+       &sampledTriSurfaceMesh::sample(vField)
+    );
+    return tfld;
+}
+
+
+Foam::tmp<Foam::Field<Foam::vector>>
+Foam::sampledTriSurfaceMeshNormal::interpolate
+(
+    const interpolation<vector>& interpolator
+) const
+{
+    // One value per vertex
+    tmp<vectorField> tn
+    (
+        new vectorField
+        (
+            points().size(),
+            vector::zero
+        )
+    );
+
+    pointField allNormals(tn().size(), vector::zero);
+    UIndirectList<vector>(allNormals, meshPoints()) = pointNormals();
+
+    tn.ref().replace
+    (
+        0,
+        allNormals
+       &sampledTriSurfaceMesh::interpolate(interpolator)
+    );
+    return tn;
+}
+
+
+// ************************************************************************* //
diff --git a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.H b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.H
new file mode 100644
index 0000000000000000000000000000000000000000..13ad4b847ceda40d38cfb05df3e2ea90d50be6ef
--- /dev/null
+++ b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.H
@@ -0,0 +1,201 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 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 3 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, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::sampledTriSurfaceMeshNormal
+
+Description
+    Variant of sampledTriSurfaceMesh that samples the surface-normal component
+    of a vector field.
+
+    Returns a vector field with the value in the first component and sets
+    the other two to zero.
+
+SourceFiles
+    sampledTriSurfaceMeshNormal.C
+    sampledTriSurfaceMeshNormalTemplates.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef sampledTriSurfaceMeshNormal_H
+#define sampledTriSurfaceMeshNormal_H
+
+#include "sampledTriSurfaceMesh.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                 Class sampledTriSurfaceMeshNormal Declaration
+\*---------------------------------------------------------------------------*/
+
+class sampledTriSurfaceMeshNormal
+:
+    public sampledTriSurfaceMesh
+{
+public:
+
+    //- Runtime type information
+    TypeName("sampledTriSurfaceMeshNormal");
+
+
+    // Constructors
+
+        //- Construct from components
+        sampledTriSurfaceMeshNormal
+        (
+            const word& name,
+            const polyMesh& mesh,
+            const word& surfaceName,
+            const samplingSource sampleSource
+        );
+
+        //- Construct from dictionary
+        sampledTriSurfaceMeshNormal
+        (
+            const word& name,
+            const polyMesh& mesh,
+            const dictionary& dict
+        );
+
+        //- Construct from triSurface
+        sampledTriSurfaceMeshNormal
+        (
+            const word& name,
+            const polyMesh& mesh,
+            const triSurface& surface,
+            const word& sampleSourceName
+        );
+
+
+    //- Destructor
+    virtual ~sampledTriSurfaceMeshNormal();
+
+
+    // Member Functions
+
+        //- Sample field on surface
+        virtual tmp<scalarField> sample
+        (
+            const volScalarField&
+        ) const
+        {
+            NotImplemented;
+            return tmp<scalarField>();
+        }
+
+        //- Sample field on surface
+        virtual tmp<vectorField> sample
+        (
+            const volVectorField&
+        ) const;
+
+        //- Sample field on surface
+        virtual tmp<sphericalTensorField> sample
+        (
+            const volSphericalTensorField&
+        ) const
+        {
+            NotImplemented;
+            return tmp<sphericalTensorField>();
+        }
+
+        //- Sample field on surface
+        virtual tmp<symmTensorField> sample
+        (
+            const volSymmTensorField&
+        ) const
+        {
+            NotImplemented;
+            return tmp<symmTensorField>();
+        }
+
+        //- Sample field on surface
+        virtual tmp<tensorField> sample
+        (
+            const volTensorField&
+        ) const
+        {
+            NotImplemented;
+            return tmp<tensorField>();
+        }
+
+        //- Interpolate field on surface
+        virtual tmp<scalarField> interpolate
+        (
+            const interpolation<scalar>&
+        ) const
+        {
+            NotImplemented;
+            return tmp<scalarField>();
+        }
+
+        //- Interpolate field on surface
+        virtual tmp<vectorField> interpolate
+        (
+            const interpolation<vector>&
+        ) const;
+
+        //- Interpolate field on surface
+        virtual tmp<sphericalTensorField> interpolate
+        (
+            const interpolation<sphericalTensor>&
+        ) const
+        {
+            NotImplemented;
+            return tmp<sphericalTensorField>();
+        }
+
+        //- Interpolate field on surface
+        virtual tmp<symmTensorField> interpolate
+        (
+            const interpolation<symmTensor>&
+        ) const
+        {
+            NotImplemented;
+            return tmp<symmTensorField>();
+        }
+
+        //- Interpolate field on surface
+        virtual tmp<tensorField> interpolate
+        (
+            const interpolation<tensor>&
+        ) const
+        {
+            NotImplemented;
+            return tmp<tensorField>();
+        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //