diff --git a/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.C b/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.C
index 8a8edd0f8a2bf1978541ccc3338216fecbf5bdd1..5dc0e4b8d10353bab81ff6e4ca3326c4db7b8360 100644
--- a/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.C
+++ b/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.C
@@ -44,13 +44,6 @@ namespace areaSurfaceFilmModels
 
 defineTypeNameAndDebug(contactAngleForce, 0);
 
-// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
-
-void contactAngleForce::initialise()
-{
-}
-
-
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 contactAngleForce::contactAngleForce
@@ -62,28 +55,7 @@ contactAngleForce::contactAngleForce
 :
     force(typeName, film, dict),
     Ccf_(coeffDict_.get<scalar>("Ccf")),
-    hCrit_(coeffDict_.getOrDefault<scalar>("hCrit", GREAT)),
-    mask_
-    (
-        IOobject
-        (
-            typeName + ":fContactForceMask",
-            film.primaryMesh().time().timeName(),
-            film.primaryMesh(),
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
-        film.regionMesh(),
-        dimensionedScalar("mask", dimless, 1.0)
-    )
-{
-    initialise();
-}
-
-
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-contactAngleForce::~contactAngleForce()
+    hCrit_(coeffDict_.getOrDefault<scalar>("hCrit", GREAT))
 {}
 
 
@@ -91,73 +63,69 @@ contactAngleForce::~contactAngleForce()
 
 tmp<faVectorMatrix> contactAngleForce::correct(areaVectorField& U)
 {
-    tmp<areaVectorField> tForce
+    auto tforce = tmp<areaVectorField>::New
     (
-        new areaVectorField
+        IOobject
         (
-            IOobject
-            (
-                typeName + ":contactForce",
-                film().primaryMesh().time().timeName(),
-                film().primaryMesh(),
-                IOobject::NO_READ,
-                IOobject::NO_WRITE
-            ),
-            film().regionMesh(),
-            dimensionedVector(dimForce/dimDensity/dimArea, Zero)
-        )
+            IOobject::scopedName(typeName, "contactForce"),
+            film().primaryMesh().time().timeName(),
+            film().primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE,
+            IOobject::NO_REGISTER
+        ),
+        film().regionMesh(),
+        dimensionedVector(dimForce/dimDensity/dimArea, Zero)
     );
-
-    vectorField& force = tForce.ref().primitiveFieldRef();
+    vectorField& force = tforce.ref().primitiveFieldRef();
 
     const labelUList& own = film().regionMesh().owner();
-    const labelUList& nbr = film().regionMesh().neighbour();
+    const labelUList& nei = film().regionMesh().neighbour();
 
     const DimensionedField<scalar, areaMesh>& magSf = film().regionMesh().S();
     const scalarField& magSff = magSf.field();
 
-    tmp<areaScalarField> talpha = film().alpha();
-    const areaScalarField& sigma = film().sigma();
+    const edgeScalarField& invDx = film().regionMesh().deltaCoeffs();
 
+    const areaScalarField& sigma = film().sigma();
     const areaScalarField& mu = film().mu();
     const areaScalarField& rhof = film().rho();
+    const areaVectorField& Uf = film().Uf();
+    const areaScalarField& hf = film().h();
+
+    tmp<areaScalarField> talpha = film().alpha();
+    const areaScalarField& alpha = talpha();
 
     tmp<areaScalarField> ttheta = theta();
     const areaScalarField& theta = ttheta();
 
-    const areaVectorField& Uf = film().Uf();
-    const areaScalarField& hf = film().h();
+    tmp<areaVectorField> tgradAlpha = fac::grad(alpha);
+    const areaVectorField& gradAlpha = tgradAlpha();
 
-    const areaVectorField gradAlpha(fac::grad(talpha()));
-
-    forAll(nbr, edgei)
+    forAll(nei, edgei)
     {
         const label faceO = own[edgei];
-        const label faceN = nbr[edgei];
+        const label faceN = nei[edgei];
 
         label facei = -1;
-        if ((talpha()[faceO] > 0.5) && (talpha()[faceN] < 0.5))
+        if ((alpha[faceO] > 0.5) && (alpha[faceN] < 0.5))
         {
             facei = faceO;
         }
-        else if ((talpha()[faceO] < 0.5) && (talpha()[faceN] > 0.5))
+        else if ((alpha[faceO] < 0.5) && (alpha[faceN] > 0.5))
         {
             facei = faceN;
         }
 
-        if (facei != -1 && mask_[facei] > 0.5)
+        if (facei != -1)
         {
-            const scalar invDx = film().regionMesh().deltaCoeffs()[edgei];
-            const vector n
-            (
-                gradAlpha[facei]/(mag(gradAlpha[facei]) + ROOTVSMALL)
-            );
+            const vector n(normalised(gradAlpha[facei]));
             const scalar cosTheta = cos(degToRad(theta[facei]));
 
             // (MHDX:Eq. 13)
             force[facei] +=
                 Ccf_*n*sigma[facei]*(1 - cosTheta)
-               /invDx/rhof[facei]/magSff[facei];
+               /invDx[edgei]/rhof[facei]/magSff[facei];
 
             // (NDPC:Eq. 11)
             if (hf[facei] > hCrit_)
@@ -185,16 +153,13 @@ tmp<faVectorMatrix> contactAngleForce::correct(areaVectorField& U)
 
     if (film().regionMesh().time().writeTime())
     {
-        tForce().write();
+        tforce().write();
         gradAlpha.write();
     }
 
-    tmp<faVectorMatrix> tfvm
-    (
-        new faVectorMatrix(U, dimForce/dimDensity)
-    );
+    auto tfvm = tmp<faVectorMatrix>::New(U, dimForce/dimDensity);
 
-    tfvm.ref() += tForce;
+    tfvm.ref() += tforce;
 
     return tfvm;
 }
diff --git a/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.H b/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.H
index 8209c6d08085ea72f0a1b15858afcb5e2b56163c..d763d37e98d339b430a90520a069e65d1f06f900 100644
--- a/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.H
+++ b/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.H
@@ -32,6 +32,36 @@ Description
     The effect of the contact angle force can be ignored over a specified
     distance from patches.
 
+    The contact-angle force is implemented as follows:
+    \f[
+        \vec{f}_\theta =
+            \beta \frac{\sigma (1 - cos(\theta))}{\Delta_{cl}} \vec{n}_{cl}
+            \frac{1}{\rho_f|\vec{S}_f|}
+          - \vec{f}_{cl}
+    \f]
+
+    with if \f$ h > h_{crit} \f$:
+
+    \f[
+        \vec{f}_{cl} = \nu_f \frac{\vec{U}_f}{h_{crit}}
+    \f]
+
+    where
+    \vartable
+        \vec{f}_\theta | Contact-angle force            [N/m^2/rho]
+        \beta          | Empirical constant             [-]
+        \sigma         | Liquid-air interfacial surface tension [kg/s^2]
+        \theta         | Contact angle                  [rad]
+        \Delta_{cl}    | Inverse width in direction normal to contact line [1/m]
+        \vec{n}_{cl}   | Direction normal to contact line [-]
+        \rho_f         | Film density                   [kg/m^3]
+        \vec{S}_f      | Face-area vector               [m^2]
+        \vec{f}_{cl}   | Contact-line movement force    [N/m^2/rho]
+        \nu_f          | Film kinematic viscosity       [m^2/s]
+        \vec{U}_f      | Film velocity                  [m/s]
+        h_{crit}       | Critical film height           [m]
+    \endvartable
+
     Reference:
     \verbatim
         Governing equations (tag:MHDX):
@@ -46,13 +76,38 @@ Description
             Springer Vieweg, Wiesbaden.
     \endverbatim
 
+Usage
+    Minimal example:
+    \verbatim
+    {
+        // Mandatory entries
+        Ccf             <scalar>;
+
+        // Optional entries
+        hCrit           <scalar>;
+
+        // Inherited entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property         | Description               | Type  | Reqd | Deflt
+      Ccf              | Empirical coefficient    | scalar | yes  | -
+      hCrit            | Critical film height [m] | scalar | no   | GREAT
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link force.H \endlink
+
 SourceFiles
     contactAngleForce.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef contactAngleForce_H
-#define contactAngleForce_H
+#ifndef areaSurfaceFilmModels_contactAngleForce_H
+#define areaSurfaceFilmModels_contactAngleForce_H
 
 #include "force.H"
 
@@ -81,15 +136,9 @@ class contactAngleForce
         //- Critical film thickness [m]
         scalar hCrit_;
 
-        //- Mask over which force is applied
-        areaScalarField mask_;
-
 
     // Private Member Functions
 
-        //- Initialise
-        void initialise();
-
         //- No copy construct
         contactAngleForce(const contactAngleForce&) = delete;
 
@@ -121,7 +170,7 @@ public:
 
 
     //- Destructor
-    virtual ~contactAngleForce();
+    virtual ~contactAngleForce() = default;
 
 
     // Member Functions