diff --git a/src/sampling/Make/files b/src/sampling/Make/files
index 01cce60496..de74ebb8de 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 0000000000..ef1bdf8084
--- /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 .
+
+\*---------------------------------------------------------------------------*/
+
+#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::sampledTriSurfaceMeshNormal::sample
+(
+ const GeometricField& vField
+) const
+{
+ tmp> tfld(new Field(size(), vector::zero));
+ tfld.ref().replace
+ (
+ 0,
+ meshedSurface::faceNormals()
+ &sampledTriSurfaceMesh::sample(vField)
+ );
+ return tfld;
+}
+
+
+Foam::tmp>
+Foam::sampledTriSurfaceMeshNormal::interpolate
+(
+ const interpolation& interpolator
+) const
+{
+ // One value per vertex
+ tmp tn
+ (
+ new vectorField
+ (
+ points().size(),
+ vector::zero
+ )
+ );
+
+ pointField allNormals(tn().size(), vector::zero);
+ UIndirectList(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 0000000000..13ad4b847c
--- /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 .
+
+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 sample
+ (
+ const volScalarField&
+ ) const
+ {
+ NotImplemented;
+ return tmp();
+ }
+
+ //- Sample field on surface
+ virtual tmp sample
+ (
+ const volVectorField&
+ ) const;
+
+ //- Sample field on surface
+ virtual tmp sample
+ (
+ const volSphericalTensorField&
+ ) const
+ {
+ NotImplemented;
+ return tmp();
+ }
+
+ //- Sample field on surface
+ virtual tmp sample
+ (
+ const volSymmTensorField&
+ ) const
+ {
+ NotImplemented;
+ return tmp();
+ }
+
+ //- Sample field on surface
+ virtual tmp sample
+ (
+ const volTensorField&
+ ) const
+ {
+ NotImplemented;
+ return tmp();
+ }
+
+ //- Interpolate field on surface
+ virtual tmp interpolate
+ (
+ const interpolation&
+ ) const
+ {
+ NotImplemented;
+ return tmp();
+ }
+
+ //- Interpolate field on surface
+ virtual tmp interpolate
+ (
+ const interpolation&
+ ) const;
+
+ //- Interpolate field on surface
+ virtual tmp interpolate
+ (
+ const interpolation&
+ ) const
+ {
+ NotImplemented;
+ return tmp();
+ }
+
+ //- Interpolate field on surface
+ virtual tmp interpolate
+ (
+ const interpolation&
+ ) const
+ {
+ NotImplemented;
+ return tmp();
+ }
+
+ //- Interpolate field on surface
+ virtual tmp interpolate
+ (
+ const interpolation&
+ ) const
+ {
+ NotImplemented;
+ return tmp();
+ }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //