From bc430ccdef7512eec45fff604016583b1ccf362c Mon Sep 17 00:00:00 2001
From: sergio <sergio>
Date: Tue, 29 Jan 2019 11:06:35 -0800
Subject: [PATCH] ENH: New vibro-acoustic model suite

  - New solver: `acousticFoam`
  - New base finite-area region class: `regionFaModel`
  - New base shell model classes:
    - `vibrationShellModel`
    - `thermalShellModel`
  - New shell models:
    - A vibration-shell model: `KirchhoffShell`
    - A thermal-shell model: `thermalShell`
  - New finite-area/finite-volume boundary conditions:
    - `clampedPlate`
    - `timeVaryingFixedValue`
    - `acousticWaveTransmissive`
  - New base classes for `fvOption` of finite-area methods: `faOption`
  - New `faOption`s:
    - `contactHeatFluxSource`
    - `externalFileSource`
    - `externalHeatFluxSource`
    - `jouleHeatingSource`
  - New tutorial: `compressible/acousticFoam/obliqueAirJet`

Signed-off-by: Kutalmis Bercin <kutalmis.bercin@esi-group.com>
---
 .../solvers/acoustic/acousticFoam/Make/files  |   3 +
 .../acoustic/acousticFoam/Make/options        |  14 +
 .../acoustic/acousticFoam/acousticFoam.C      |  99 ++++
 .../acoustic/acousticFoam/createFields.H      |  15 +
 .../acousticFoam/createRegionControls.H       |   8 +
 .../solvers/acoustic/acousticFoam/paEqn.H     |  15 +
 .../acousticFoam/readTransportProperties.H    |  23 +
 .../chtMultiRegionSimpleFoam/Make/options     |  10 +-
 src/Allwmake                                  |   4 +-
 src/OpenFOAM/algorithms/subCycle/subCycle.H   |  31 +-
 src/OpenFOAM/db/Time/subCycleTime.C           |  18 +-
 src/faOptions/Make/files                      |  16 +
 src/faOptions/Make/options                    |  22 +
 src/faOptions/faOption/faOption.C             | 291 ++++++++++++
 src/faOptions/faOption/faOption.H             | 441 ++++++++++++++++++
 src/faOptions/faOption/faOptionI.H            | 108 +++++
 src/faOptions/faOption/faOptionIO.C           |  64 +++
 src/faOptions/faOption/faOptionList.C         | 178 +++++++
 src/faOptions/faOption/faOptionList.H         | 250 ++++++++++
 .../faOption/faOptionListTemplates.C          | 290 ++++++++++++
 src/faOptions/faOption/faOptions.C            | 144 ++++++
 src/faOptions/faOption/faOptions.H            | 112 +++++
 src/faOptions/faOption/makeFaOption.H         |  54 +++
 src/faOptions/faceSetOption/faceSetOption.C   | 246 ++++++++++
 src/faOptions/faceSetOption/faceSetOption.H   | 241 ++++++++++
 src/faOptions/faceSetOption/faceSetOptionI.H  |  93 ++++
 .../contactHeatFluxSource.C                   | 204 ++++++++
 .../contactHeatFluxSource.H                   | 196 ++++++++
 .../externalFileSource/externalFileSource.C   | 130 ++++++
 .../externalFileSource/externalFileSource.H   | 169 +++++++
 .../externalHeatFluxSource.C                  | 208 +++++++++
 .../externalHeatFluxSource.H                  | 241 ++++++++++
 .../jouleHeatingSource/jouleHeatingSource.C   | 193 ++++++++
 .../jouleHeatingSource/jouleHeatingSource.H   | 265 +++++++++++
 .../jouleHeatingSourceTemplates.C             | 140 ++++++
 src/finiteArea/Make/files                     |   4 +-
 .../faMesh/faPatches/faPatch/faPatch.C        |  23 +-
 .../faMesh/faPatches/faPatch/faPatch.H        |  22 +-
 .../clampedPlate/clampedPlateFaPatchField.C   | 179 +++++++
 .../clampedPlate/clampedPlateFaPatchField.H   | 214 +++++++++
 .../clampedPlateFaPatchFields.C}              |   6 +-
 .../clampedPlateFaPatchFields.H}              |  10 +-
 .../clampedPlateFaPatchFieldsFwd.H            |  52 +++
 ...imeVaryingUniformFixedValueFaPatchField.C} |  55 ++-
 ...imeVaryingUniformFixedValueFaPatchField.H} | 112 +++--
 ...imeVaryingUniformFixedValueFaPatchFields.C |  46 ++
 ...imeVaryingUniformFixedValueFaPatchFields.H |  52 +++
 ...VaryingUniformFixedValueFaPatchFieldsFwd.H |  54 +++
 .../faPatchFields/faPatchField/faPatchField.H |  39 +-
 .../faPatchField/faPatchFieldNew.C            |   9 +-
 src/finiteArea/finiteArea/fam/famSup.C        |  14 +-
 .../edgeInterpolation/edgeInterpolate.C       |   1 +
 .../edgeInterpolation/edgeInterpolation.C     |  38 +-
 .../skewCorrectedEdgeInterpolation.H          | 219 +++++++++
 .../skewCorrectedEdgeInterpolationMake.C      |  39 ++
 .../volSurfaceMapping/volSurfaceMapping.C     |  72 ++-
 .../volSurfaceMapping/volSurfaceMapping.H     |  38 +-
 src/finiteVolume/Make/files                   |   1 +
 .../acousticWaveTransmissiveFvPatchField.C    | 119 +++++
 .../acousticWaveTransmissiveFvPatchField.H    | 192 ++++++++
 .../acousticWaveTransmissiveFvPatchFields.C   |  46 ++
 .../acousticWaveTransmissiveFvPatchFields.H   |  51 ++
 ...cousticWaveTransmissiveFvPatchFieldsFwd.H} |   9 +-
 .../KirchhoffShell/KirchhoffShell.C           | 319 +++++++++++++
 .../KirchhoffShell/KirchhoffShell.H           | 217 +++++++++
 src/regionFaModels/Make/files                 |  16 +
 src/regionFaModels/Make/options               |  16 +
 .../doc/thermalBaffleBoundaryConditionsDoc.H  |  34 ++
 .../thermalShellFvPatchScalarField.C          | 152 ++++++
 .../thermalShellFvPatchScalarField.H          | 184 ++++++++
 .../vibrationShellFvPatchScalarField.C        | 169 +++++++
 .../vibrationShellFvPatchScalarField.H        | 172 +++++++
 .../regionFaModel/regionFaModel.C             | 172 +++++++
 .../regionFaModel/regionFaModel.H             | 256 ++++++++++
 .../regionFaModel/regionFaModelI.H            | 118 +++++
 .../thermalShell/thermalShell.C               | 232 +++++++++
 .../thermalShell/thermalShell.H               | 208 +++++++++
 .../thermalShellModel/thermalShellModel.C     | 121 +++++
 .../thermalShellModel/thermalShellModel.H     | 205 ++++++++
 .../thermalShellModel/thermalShellModelNew.C  |  69 +++
 .../vibrationShellModel/vibrationShellModel.C | 148 ++++++
 .../vibrationShellModel/vibrationShellModel.H | 218 +++++++++
 .../vibrationShellModelNew.C                  |  68 +++
 .../boundaryData/boundaryDataSurfaceWriter.H  |   3 +
 .../solidProperties/C/C.C                     |   2 +-
 .../solidProperties/CaCO3/CaCO3.C             |   2 +-
 .../solidProperties/ash/ash.C                 |   2 +-
 .../solidProperties/solidProperties.C         |  18 +-
 .../solidProperties/solidProperties.H         |  16 +-
 .../solidProperties/solidPropertiesI.H        |  13 +
 .../acousticFoam/obliqueAirJet/Allclean       |  10 +
 .../obliqueAirJet/Allrun-parallel             |  13 +
 .../main/0.orig/h_vibrationShell              |  30 ++
 .../acousticFoam/obliqueAirJet/main/0.orig/pa |  67 +++
 .../main/0.orig/ps_vibrationShell             |  30 ++
 .../main/0.orig/ws_vibrationShell             |  31 ++
 .../acousticFoam/obliqueAirJet/main/Allclean  |  12 +
 .../obliqueAirJet/main/Allrun-parallel        |  14 +
 .../obliqueAirJet/main/Allrun.pre             |  12 +
 .../main/constant/faMesh/faMeshDefinition     |  30 ++
 .../main/constant/transportProperties         |  21 +
 .../constant/triSurface/window_box.stl.gz     | Bin 0 -> 51747 bytes
 .../obliqueAirJet/main/system/blockMeshDict   |  46 ++
 .../obliqueAirJet/main/system/controlDict     |  48 ++
 .../main/system/decomposeParDict              |  22 +
 .../obliqueAirJet/main/system/faOptions       |  31 ++
 .../obliqueAirJet/main/system/faSchemes       |  54 +++
 .../obliqueAirJet/main/system/faSolution      |  37 ++
 .../obliqueAirJet/main/system/fvSchemes       |  59 +++
 .../obliqueAirJet/main/system/fvSolution      |  43 ++
 .../main/system/snappyHexMeshDict             | 136 ++++++
 .../obliqueAirJet/precursor/0.orig/T          |  45 ++
 .../obliqueAirJet/precursor/0.orig/U          |  42 ++
 .../obliqueAirJet/precursor/0.orig/alphat     |  43 ++
 .../obliqueAirJet/precursor/0.orig/nuTilda    |  44 ++
 .../obliqueAirJet/precursor/0.orig/nut        |  43 ++
 .../obliqueAirJet/precursor/0.orig/p          |  43 ++
 .../obliqueAirJet/precursor/Allclean          |  12 +
 .../obliqueAirJet/precursor/Allrun-parallel   |  20 +
 .../obliqueAirJet/precursor/Allrun.pre        |  14 +
 .../constant/thermophysicalProperties         |  52 +++
 .../precursor/constant/turbulenceProperties   |  36 ++
 .../precursor/system/blockMeshDict            | 231 +++++++++
 .../precursor/system/changeDictionaryDict     |  27 ++
 .../precursor/system/controlDict              |  86 ++++
 .../precursor/system/createPatchDict          |  41 ++
 .../precursor/system/decomposeParDict         |  22 +
 .../precursor/system/extrudeMeshDict          |  44 ++
 .../obliqueAirJet/precursor/system/fvSchemes  |  63 +++
 .../obliqueAirJet/precursor/system/fvSolution |  65 +++
 .../precursor/system/topoSetDict              |  29 ++
 131 files changed, 10959 insertions(+), 191 deletions(-)
 create mode 100644 applications/solvers/acoustic/acousticFoam/Make/files
 create mode 100644 applications/solvers/acoustic/acousticFoam/Make/options
 create mode 100644 applications/solvers/acoustic/acousticFoam/acousticFoam.C
 create mode 100644 applications/solvers/acoustic/acousticFoam/createFields.H
 create mode 100644 applications/solvers/acoustic/acousticFoam/createRegionControls.H
 create mode 100644 applications/solvers/acoustic/acousticFoam/paEqn.H
 create mode 100644 applications/solvers/acoustic/acousticFoam/readTransportProperties.H
 create mode 100644 src/faOptions/Make/files
 create mode 100644 src/faOptions/Make/options
 create mode 100644 src/faOptions/faOption/faOption.C
 create mode 100644 src/faOptions/faOption/faOption.H
 create mode 100644 src/faOptions/faOption/faOptionI.H
 create mode 100644 src/faOptions/faOption/faOptionIO.C
 create mode 100644 src/faOptions/faOption/faOptionList.C
 create mode 100644 src/faOptions/faOption/faOptionList.H
 create mode 100644 src/faOptions/faOption/faOptionListTemplates.C
 create mode 100644 src/faOptions/faOption/faOptions.C
 create mode 100644 src/faOptions/faOption/faOptions.H
 create mode 100644 src/faOptions/faOption/makeFaOption.H
 create mode 100644 src/faOptions/faceSetOption/faceSetOption.C
 create mode 100644 src/faOptions/faceSetOption/faceSetOption.H
 create mode 100644 src/faOptions/faceSetOption/faceSetOptionI.H
 create mode 100644 src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.C
 create mode 100644 src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.H
 create mode 100644 src/faOptions/sources/derived/externalFileSource/externalFileSource.C
 create mode 100644 src/faOptions/sources/derived/externalFileSource/externalFileSource.H
 create mode 100644 src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.C
 create mode 100644 src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.H
 create mode 100644 src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.C
 create mode 100644 src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.H
 create mode 100644 src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSourceTemplates.C
 create mode 100755 src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.C
 create mode 100755 src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.H
 rename src/finiteArea/fields/faPatchFields/derived/{uniformFixedValue/uniformFixedValueFaPatchFields.C => clampedPlate/clampedPlateFaPatchFields.C} (95%)
 mode change 100644 => 100755
 rename src/finiteArea/fields/faPatchFields/derived/{uniformFixedValue/uniformFixedValueFaPatchFields.H => clampedPlate/clampedPlateFaPatchFields.H} (90%)
 mode change 100644 => 100755
 create mode 100755 src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFieldsFwd.H
 rename src/finiteArea/fields/faPatchFields/derived/{uniformFixedValue/uniformFixedValueFaPatchField.C => timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.C} (65%)
 rename src/finiteArea/fields/faPatchFields/derived/{uniformFixedValue/uniformFixedValueFaPatchField.H => timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.H} (56%)
 create mode 100644 src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C
 create mode 100644 src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.H
 create mode 100644 src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFieldsFwd.H
 create mode 100644 src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolation.H
 create mode 100644 src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolationMake.C
 create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.C
 create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.H
 create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C
 create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.H
 rename src/{finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFieldsFwd.H => finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFieldsFwd.H} (88%)
 create mode 100644 src/regionFaModels/KirchhoffShell/KirchhoffShell.C
 create mode 100644 src/regionFaModels/KirchhoffShell/KirchhoffShell.H
 create mode 100644 src/regionFaModels/Make/files
 create mode 100644 src/regionFaModels/Make/options
 create mode 100644 src/regionFaModels/derivedFvPatchFields/doc/thermalBaffleBoundaryConditionsDoc.H
 create mode 100644 src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C
 create mode 100644 src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.H
 create mode 100644 src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C
 create mode 100644 src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.H
 create mode 100644 src/regionFaModels/regionFaModel/regionFaModel.C
 create mode 100644 src/regionFaModels/regionFaModel/regionFaModel.H
 create mode 100644 src/regionFaModels/regionFaModel/regionFaModelI.H
 create mode 100644 src/regionFaModels/thermalShell/thermalShell.C
 create mode 100644 src/regionFaModels/thermalShell/thermalShell.H
 create mode 100644 src/regionFaModels/thermalShellModel/thermalShellModel.C
 create mode 100644 src/regionFaModels/thermalShellModel/thermalShellModel.H
 create mode 100644 src/regionFaModels/thermalShellModel/thermalShellModelNew.C
 create mode 100644 src/regionFaModels/vibrationShellModel/vibrationShellModel.C
 create mode 100644 src/regionFaModels/vibrationShellModel/vibrationShellModel.H
 create mode 100644 src/regionFaModels/vibrationShellModel/vibrationShellModelNew.C
 create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/Allclean
 create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/Allrun-parallel
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/h_vibrationShell
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/pa
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ps_vibrationShell
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ws_vibrationShell
 create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/main/Allclean
 create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun-parallel
 create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun.pre
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/faMesh/faMeshDefinition
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/transportProperties
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/triSurface/window_box.stl.gz
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/blockMeshDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/controlDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/decomposeParDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faOptions
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSchemes
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSolution
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSchemes
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSolution
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/snappyHexMeshDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/T
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/U
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/alphat
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nuTilda
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nut
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/p
 create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allclean
 create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun-parallel
 create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun.pre
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/thermophysicalProperties
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/turbulenceProperties
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/blockMeshDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/changeDictionaryDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/controlDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/createPatchDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/decomposeParDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/extrudeMeshDict
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSchemes
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSolution
 create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/topoSetDict

diff --git a/applications/solvers/acoustic/acousticFoam/Make/files b/applications/solvers/acoustic/acousticFoam/Make/files
new file mode 100644
index 00000000000..897caa0f26e
--- /dev/null
+++ b/applications/solvers/acoustic/acousticFoam/Make/files
@@ -0,0 +1,3 @@
+acousticFoam.C
+
+EXE = $(FOAM_APPBIN)/acousticFoam
diff --git a/applications/solvers/acoustic/acousticFoam/Make/options b/applications/solvers/acoustic/acousticFoam/Make/options
new file mode 100644
index 00000000000..c12930f5c0a
--- /dev/null
+++ b/applications/solvers/acoustic/acousticFoam/Make/options
@@ -0,0 +1,14 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/fvOption/lnInclude \
+    -I$(LIB_SRC)/regionFaModels/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/transportModels/compressible/lnInclude
+
+EXE_LIBS = \
+    -lfiniteVolume \
+    -lfvOptions \
+    -lmeshTools \
+    -lsampling \
+    -lregionFaModels
diff --git a/applications/solvers/acoustic/acousticFoam/acousticFoam.C b/applications/solvers/acoustic/acousticFoam/acousticFoam.C
new file mode 100644
index 00000000000..ab12a827f2c
--- /dev/null
+++ b/applications/solvers/acoustic/acousticFoam/acousticFoam.C
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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/>.
+
+Application
+   acousticFoam
+
+Group
+    grpAcousticSolvers
+
+Description
+    Acoustic solver solving the acoustic pressure wave equation.
+
+    \f[
+        \ddt2{pa} - c^2 \laplacian{pa} = 0
+    \f]
+
+    where
+    \vartable
+        c       | Sound speed
+        pa      | Acoustic pressure
+    \endvartable
+
+SourceFiles
+    acousticFoam.C
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "fvOptions.H"
+#include "pimpleControl.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+    argList::addNote
+    (
+        "Acoustic solver solving the acoustic pressure wave equation."
+    );
+
+    #include "postProcess.H"
+
+    #include "addCheckCaseOptions.H"
+    #include "setRootCaseLists.H"
+    #include "createTime.H"
+    #include "createMesh.H"
+    #include "createControl.H"
+    #include "createRegionControls.H"
+
+    #include "readTransportProperties.H"
+    #include "createFields.H"
+
+    Info<< "\nStarting time loop\n" << endl;
+
+    while (runTime.run())
+    {
+        ++runTime;
+
+        Info<< "Time = " << runTime.timeName() << nl << endl;
+
+        while (pimple.correct())
+        {
+            #include "paEqn.H"
+        }
+
+        runTime.write();
+
+        runTime.printExecutionTime(Info);
+    }
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/acoustic/acousticFoam/createFields.H b/applications/solvers/acoustic/acousticFoam/createFields.H
new file mode 100644
index 00000000000..3a1eaa069fe
--- /dev/null
+++ b/applications/solvers/acoustic/acousticFoam/createFields.H
@@ -0,0 +1,15 @@
+
+Info << "\nReading pa" << endl;
+
+volScalarField pa
+(
+    IOobject
+    (
+        "pa",
+        runTime.timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh
+);
diff --git a/applications/solvers/acoustic/acousticFoam/createRegionControls.H b/applications/solvers/acoustic/acousticFoam/createRegionControls.H
new file mode 100644
index 00000000000..a1888eead75
--- /dev/null
+++ b/applications/solvers/acoustic/acousticFoam/createRegionControls.H
@@ -0,0 +1,8 @@
+fvSolution solutionDict(runTime);
+
+const dictionary& pimpleDict = solutionDict.subDict("PIMPLE");
+
+bool solvePrimaryRegion
+(
+    pimpleDict.getOrDefault("solvePrimaryRegion", true)
+);
diff --git a/applications/solvers/acoustic/acousticFoam/paEqn.H b/applications/solvers/acoustic/acousticFoam/paEqn.H
new file mode 100644
index 00000000000..d80eb80929a
--- /dev/null
+++ b/applications/solvers/acoustic/acousticFoam/paEqn.H
@@ -0,0 +1,15 @@
+
+fvScalarMatrix paEqn
+(
+    fvm::d2dt2(pa) - sqr(c0)*fvc::laplacian(pa)
+);
+
+if (solvePrimaryRegion)
+{
+    paEqn.relax();
+    paEqn.solve();
+}
+else
+{
+    pa.correctBoundaryConditions();
+}
diff --git a/applications/solvers/acoustic/acousticFoam/readTransportProperties.H b/applications/solvers/acoustic/acousticFoam/readTransportProperties.H
new file mode 100644
index 00000000000..5ff526af53f
--- /dev/null
+++ b/applications/solvers/acoustic/acousticFoam/readTransportProperties.H
@@ -0,0 +1,23 @@
+Info<< "\nReading transportProperties" << endl;
+
+IOdictionary transportProperties
+(
+    IOobject
+    (
+        "transportProperties",
+        runTime.constant(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::NO_WRITE
+    )
+);
+
+dimensionedScalar c0("c0", dimVelocity, transportProperties);
+
+dimensionedScalar rho("rho", dimDensity, transportProperties);
+
+scalar MaxCo =
+    max(mesh.surfaceInterpolation::deltaCoeffs()*c0).value()
+   *runTime.deltaT().value();
+
+Info<< "Max acoustic Courant Number = " << MaxCo << endl;
diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/Make/options b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/Make/options
index 14bbcc2cee2..241a4ff1a64 100644
--- a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/Make/options
+++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/Make/options
@@ -14,7 +14,9 @@ EXE_INC = \
     -I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \
     -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
     -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
-    -I$(LIB_SRC)/regionModels/regionModel/lnInclude
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/regionModels/regionModel/lnInclude \
+    -I$(LIB_SRC)/regionFaModels/lnInclude
 
 EXE_LIBS = \
     -lfiniteVolume \
@@ -28,4 +30,8 @@ EXE_LIBS = \
     -lturbulenceModels \
     -lcompressibleTurbulenceModels \
     -lradiationModels \
-    -lregionModels
+    -lfvOptions \
+    -lfaOptions \
+    -lregionModels \
+    -lsampling \
+    -lregionFaModels
diff --git a/src/Allwmake b/src/Allwmake
index 15a09cdc0a5..a2109cae24d 100755
--- a/src/Allwmake
+++ b/src/Allwmake
@@ -49,6 +49,7 @@ wmake $targetType fileFormats
 wmake $targetType surfMesh
 wmake $targetType meshTools
 
+wmake $targetType finiteArea
 wmake $targetType finiteVolume
 
 wmake $targetType mesh/blockMesh
@@ -85,7 +86,9 @@ regionModels/Allwmake $targetType $*
 lagrangian/Allwmake $targetType $*
 
 wmake $targetType fvOptions
+wmake $targetType faOptions
 wmake $targetType fvMotionSolver
+wmake $targetType regionFaModels
 
 wmake $targetType overset
 
@@ -97,7 +100,6 @@ wmake $targetType waveModels
 
 wmake $targetType engine
 
-wmake $targetType finiteArea
 wmake $targetType genericPatchFields
 
 conversion/Allwmake $targetType $*
diff --git a/src/OpenFOAM/algorithms/subCycle/subCycle.H b/src/OpenFOAM/algorithms/subCycle/subCycle.H
index 6de416d94b0..5024c7d8d6d 100644
--- a/src/OpenFOAM/algorithms/subCycle/subCycle.H
+++ b/src/OpenFOAM/algorithms/subCycle/subCycle.H
@@ -59,7 +59,12 @@ class subCycleField
         GeometricField& gf0_;
 
         //- Copy of the "real" old-time value of the field
-        GeometricField gf_0_;
+        tmp<GeometricField> gf_0_;
+
+        GeometricField& gf00_;
+
+        //- Copy of the "real" old-old-time value of the field
+        tmp<GeometricField> gf_00_;
 
 
 public:
@@ -71,19 +76,28 @@ public:
         :
             gf_(gf),
             gf0_(gf.oldTime()),
-            gf_0_(gf0_.name() + "_", gf0_)
-        {}
+            gf00_(gf.oldTime().oldTime())
+        {
+            {
+                gf_0_ = GeometricField::New(gf0_.name() + "_", gf0_);
+                gf_00_ = GeometricField::New(gf00_.name() + "_", gf00_);
+            }
+        }
 
 
     //- Destructor
     ~subCycleField()
     {
-        // Reset the old-time field
-        gf0_ = gf_0_;
+        if (gf_0_.valid())
+        {
+            // Reset the old-time field
+            gf0_ = gf_0_;
+
+            gf00_ = gf_00_;
 
         // Correct the time index of the field to correspond to the global time
-        gf_.timeIndex() = gf_.time().timeIndex();
-        gf0_.timeIndex() = gf_.time().timeIndex();
+            gf_.timeIndex() = gf_.time().timeIndex();
+        }
     }
 
 
@@ -96,7 +110,8 @@ public:
     void updateTimeIndex()
     {
         gf_.timeIndex() = gf_.time().timeIndex() + 1;
-        gf0_.timeIndex() = gf_.time().timeIndex() + 1;
+        gf0_.timeIndex() = gf0_.time().timeIndex() + 1;
+        gf00_.timeIndex() = gf00_.time().timeIndex() + 1;
     }
 };
 
diff --git a/src/OpenFOAM/db/Time/subCycleTime.C b/src/OpenFOAM/db/Time/subCycleTime.C
index fc21130645d..32dee009156 100644
--- a/src/OpenFOAM/db/Time/subCycleTime.C
+++ b/src/OpenFOAM/db/Time/subCycleTime.C
@@ -36,7 +36,10 @@ Foam::subCycleTime::subCycleTime(Time& runTime, const label nCycles)
     total_(nCycles)
 {
     // Could avoid 0 or 1 nCycles here on construction
-    time_.subCycle(nCycles);
+    if (nCycles > 1)
+    {
+        time_.subCycle(nCycles);
+    }
 }
 
 
@@ -64,7 +67,10 @@ bool Foam::subCycleTime::end() const
 
 void Foam::subCycleTime::endSubCycle()
 {
-    time_.endSubCycle();
+    if (total_ > 1)
+    {
+        time_.endSubCycle();
+    }
 
     // If called manually, ensure status() will return false
 
@@ -89,8 +95,12 @@ bool Foam::subCycleTime::loop()
 
 Foam::subCycleTime& Foam::subCycleTime::operator++()
 {
-    ++time_;
-    ++index_;
+    if (total_ > 1)
+    {
+        time_++;
+    }
+
+    index_++;
 
     // Register index change with Time, in case someone wants this information
     time_.subCycleIndex(index_);
diff --git a/src/faOptions/Make/files b/src/faOptions/Make/files
new file mode 100644
index 00000000000..cd8c59745df
--- /dev/null
+++ b/src/faOptions/Make/files
@@ -0,0 +1,16 @@
+faOption/faOption.C
+faOption/faOptionIO.C
+faOption/faOptionList.C
+faOption/faOptions.C
+
+faceSetOption/faceSetOption.C
+
+/* Sources */
+derivedSources=sources/derived
+
+$(derivedSources)/externalHeatFluxSource/externalHeatFluxSource.C
+$(derivedSources)/jouleHeatingSource/jouleHeatingSource.C
+$(derivedSources)/contactHeatFluxSource/contactHeatFluxSource.C
+$(derivedSources)/externalFileSource/externalFileSource.C
+
+LIB = $(FOAM_LIBBIN)/libfaOptions
diff --git a/src/faOptions/Make/options b/src/faOptions/Make/options
new file mode 100644
index 00000000000..46c960d614b
--- /dev/null
+++ b/src/faOptions/Make/options
@@ -0,0 +1,22 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteArea/lnInclude \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/solidThermo/lnInclude \
+    -I$(LIB_SRC)/transportModels \
+    -I$(LIB_SRC)/transportModels/compressible/lnInclude \
+    -I$(LIB_SRC)/transportModels/incompressible/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude
+
+LIB_LIBS = \
+    -lfiniteArea \
+    -lfiniteVolume \
+    -lsampling \
+    -lmeshTools \
+    -lturbulenceModels \
+    -lincompressibleTurbulenceModels \
+    -lcompressibleTurbulenceModels
diff --git a/src/faOptions/faOption/faOption.C b/src/faOptions/faOption/faOption.C
new file mode 100644
index 00000000000..708f7388511
--- /dev/null
+++ b/src/faOptions/faOption/faOption.C
@@ -0,0 +1,291 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "faOption.H"
+#include "areaFields.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    namespace fa
+    {
+        defineTypeNameAndDebug(option, 0);
+        defineRunTimeSelectionTable(option, dictionary);
+    }
+}
+
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+void Foam::fa::option::constructMeshObjects()
+{
+    regionMeshPtr_.reset(new faMesh(mesh_));
+
+    vsmPtr_.reset(new volSurfaceMapping(regionMeshPtr_()));
+}
+
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fa::option::option
+(
+    const word& name,
+    const word& modelType,
+    const dictionary& dict,
+    const fvPatch& patch
+)
+:
+    name_(name),
+    modelType_(modelType),
+    mesh_(patch.boundaryMesh().mesh()),
+    patch_(patch),
+    dict_(dict),
+    coeffs_(dict.optionalSubDict(modelType + "Coeffs")),
+    active_(dict.getOrDefault<Switch>("active", true)),
+    fieldNames_(),
+    applied_(),
+    regionName_(dict.get<word>("region")),
+    regionMeshPtr_(nullptr),
+    vsmPtr_(nullptr)
+{
+    constructMeshObjects();
+
+    Info<< incrIndent << indent << "Source: " << name_ << endl << decrIndent;
+}
+
+
+// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::fa::option> Foam::fa::option::New
+(
+    const word& name,
+    const dictionary& coeffs,
+    const fvPatch& patch
+)
+{
+    const word modelType(coeffs.get<word>("type"));
+
+    Info<< indent
+        << "Selecting finite area options type " << modelType << endl;
+
+    const_cast<Time&>(patch.boundaryMesh().mesh().time()).libs().open
+    (
+        coeffs,
+        "libs",
+        dictionaryConstructorTablePtr_
+    );
+
+    auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
+
+    if (!cstrIter.found())
+    {
+        FatalErrorInFunction
+            << "Unknown faOption model type "
+            << modelType << nl << nl
+            << "Valid faOption types are:" << nl
+            << dictionaryConstructorTablePtr_->sortedToc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<option>(cstrIter()(name, modelType, coeffs, patch));
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::fa::option::isActive()
+{
+    return active_;
+}
+
+
+Foam::label Foam::fa::option::applyToField(const word& fieldName) const
+{
+    return fieldNames_.find(fieldName);
+}
+
+
+void Foam::fa::option::checkApplied() const
+{
+    forAll(applied_, i)
+    {
+        if (!applied_[i])
+        {
+            WarningInFunction
+                << "Source " << name_ << " defined for field "
+                << fieldNames_[i] << " but never used" << endl;
+        }
+    }
+}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    faMatrix<scalar>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    faMatrix<vector>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    faMatrix<sphericalTensor>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    faMatrix<symmTensor>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    faMatrix<tensor>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    faMatrix<scalar>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    faMatrix<vector>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    faMatrix<sphericalTensor>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    faMatrix<symmTensor>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::addSup
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    faMatrix<tensor>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::constrain(faMatrix<scalar>& eqn, const label fieldi)
+{}
+
+
+void Foam::fa::option::constrain(faMatrix<vector>& eqn, const label fieldi)
+{}
+
+
+void Foam::fa::option::constrain
+(
+    faMatrix<sphericalTensor>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::constrain
+(
+    faMatrix<symmTensor>& eqn,
+    const label fieldi
+)
+{}
+
+
+void Foam::fa::option::constrain(faMatrix<tensor>& eqn, const label fieldi)
+{}
+
+
+void Foam::fa::option::correct(areaScalarField& field)
+{}
+
+
+void Foam::fa::option::correct(areaVectorField& field)
+{}
+
+
+void Foam::fa::option::correct(areaSphericalTensorField& field)
+{}
+
+
+void Foam::fa::option::correct(areaSymmTensorField& field)
+{}
+
+
+void Foam::fa::option::correct(areaTensorField& field)
+{}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/faOption.H b/src/faOptions/faOption/faOption.H
new file mode 100644
index 00000000000..253c26e2b15
--- /dev/null
+++ b/src/faOptions/faOption/faOption.H
@@ -0,0 +1,441 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::fa::option
+
+Description
+    Base abstract class for handling finite area options (i.e. \c faOption).
+
+Usage
+    Minimal example by using \c constant/faOptions:
+    \verbatim
+    <userDefinedName1>
+    {
+        // Mandatory entries (unmodifiable)
+        type              <faOptionName>;
+
+        // Mandatory entries (runtime modifiable)
+        region            <regionName>;
+
+        // Optional entries (unmodifiable/runtime modifiable)
+        <faOption>Coeffs
+        {
+            // subdictionary entries
+        }
+
+        // Optional entries (runtime modifiable)
+        active            true;
+        log               true;
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property         | Description                   | Type  | Reqd | Dflt
+      type             | Name of operand faOption      | word  | yes  | -
+      region           | Name of operand region        | word  | yes  | -
+      \<faOption\>Coeffs | Dictionary containing settings of <!--
+                    --> the selected faOption settings | dictionary | no | -
+      active   | Flag to (de)activate faOption         | bool  | no   | true
+      log      | Flag to log faOption-related info     | bool  | no   | true
+    \endtable
+
+Note
+  - Source/sink options are to be added to the right-hand side of equations.
+
+SourceFiles
+    faOption.C
+    faOptionIO.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef faOption_H
+#define faOption_H
+
+#include "faMatrices.H"
+#include "areaFields.H"
+#include "dictionary.H"
+#include "Switch.H"
+#include "runTimeSelectionTables.H"
+#include "fvMesh.H"
+#include "volSurfaceMapping.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+
+/*---------------------------------------------------------------------------*\
+                           Class option Declaration
+\*---------------------------------------------------------------------------*/
+
+class option
+{
+    // Private Member Functions
+
+        //- Construct region mesh and fields
+        void constructMeshObjects();
+
+
+protected:
+
+    // Protected Data
+
+        //- Source name
+        const word name_;
+
+        //- Model type
+        const word modelType_;
+
+        //- Reference to the mesh database
+        const fvMesh& mesh_;
+
+        //- Reference to the patch
+        const fvPatch& patch_;
+
+        //- Top level source dictionary
+        dictionary dict_;
+
+        //- Dictionary containing source coefficients
+        dictionary coeffs_;
+
+        //- Source active flag
+        Switch active_;
+
+        //- Field names to apply source to - populated by derived models
+        wordList fieldNames_;
+
+        //- Applied flag list - corresponds to each fieldNames_ entry
+        List<bool> applied_;
+
+         //- Region name
+        word regionName_;
+
+        //- Pointer to the region mesh database
+        autoPtr<faMesh> regionMeshPtr_;
+
+        //-Volume-to surface mapping
+        autoPtr<volSurfaceMapping> vsmPtr_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("option");
+
+
+     // Declare run-time constructor selection table
+
+        declareRunTimeSelectionTable
+        (
+            autoPtr,
+            option,
+            dictionary,
+            (
+                const word& name,
+                const word& modelType,
+                const dictionary& dict,
+                const fvPatch& patch
+            ),
+            (name, modelType, dict, patch)
+        );
+
+
+    // Constructors
+
+        //- Construct from components
+        option
+        (
+            const word& name,
+            const word& modelType,
+            const dictionary& dict,
+            const fvPatch& patch
+        );
+
+        //- Return clone
+        autoPtr<option> clone() const
+        {
+            NotImplemented;
+            return nullptr;
+        }
+
+        //- Return pointer to new faOption object created
+        //- on the freestore from an Istream
+        class iNew
+        {
+
+            //- Reference to the patch
+            const fvPatch& patch_;
+
+            //- Name
+            const word& name_;
+
+        public:
+
+            iNew
+            (
+                const fvPatch& patch,
+                const word& name
+            )
+            :
+                patch_(patch),
+                name_(name)
+            {}
+
+            autoPtr<option> operator()(Istream& is) const
+            {
+                const dictionary dict(is);
+
+                return autoPtr<option>
+                (
+                    option::New(name_, dict, patch_)
+                );
+            }
+        };
+
+
+    // Selectors
+
+        //- Return a reference to the selected faOption model
+        static autoPtr<option> New
+        (
+            const word& name,
+            const dictionary& dict,
+            const fvPatch& patch
+        );
+
+
+    //- Destructor
+    virtual ~option() = default;
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return const access to the source name
+            inline const word& name() const;
+
+            //- Return const access to the mesh database
+            inline const fvMesh& mesh() const;
+
+            //- Return const access to fvPatch
+            inline const fvPatch& patch() const;
+
+            //- Return dictionary
+            inline const dictionary& coeffs() const;
+
+            //- Return const access to the source active flag
+            inline bool active() const;
+
+            //- Set the applied flag to true for field index fieldi
+            inline void setApplied(const label fieldi);
+
+            //- Return the region mesh database
+            inline const faMesh& regionMesh() const;
+
+             //- Return volSurfaceMapping
+            inline const volSurfaceMapping& vsm() const;
+
+            //- Region name
+            inline const word& regionName() const;
+
+
+        // Edit
+
+            //- Return access to the source active flag
+            inline Switch& active();
+
+
+        // Checks
+
+            //- Is the source active?
+            virtual bool isActive();
+
+            //- Return index of field name if found in fieldNames list
+            virtual label applyToField(const word& fieldName) const;
+
+            //- Check that the source has been applied
+            virtual void checkApplied() const;
+
+
+        // Evaluation
+
+            // Explicit and implicit sources
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    faMatrix<scalar>& eqn,
+                    const label fieldi
+                );
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    faMatrix<vector>& eqn,
+                    const label fieldi
+                );
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    faMatrix<symmTensor>& eqn,
+                    const label fieldi
+                );
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    faMatrix<sphericalTensor>& eqn,
+                    const label fieldi
+                );
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    faMatrix<tensor>& eqn,
+                    const label fieldi
+                );
+
+
+            // Explicit and implicit sources for compressible equations
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    const areaScalarField& rho,
+                    faMatrix<scalar>& eqn,
+                    const label fieldi
+                );
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    const areaScalarField& rho,
+                    faMatrix<vector>& eqn,
+                    const label fieldi
+                );
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    const areaScalarField& rho,
+                    faMatrix<symmTensor>& eqn,
+                    const label fieldi
+                );
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    const areaScalarField& rho,
+                    faMatrix<sphericalTensor>& eqn,
+                    const label fieldi
+                );
+
+                virtual void addSup
+                (
+                    const areaScalarField& h,
+                    const areaScalarField& rho,
+                    faMatrix<tensor>& eqn,
+                    const label fieldi
+                );
+
+
+            // Constraints
+
+                virtual void constrain
+                (
+                    faMatrix<scalar>& eqn,
+                    const label fieldi
+                );
+
+                virtual void constrain
+                (
+                    faMatrix<vector>& eqn,
+                    const label fieldi
+                );
+
+                virtual void constrain
+                (
+                    faMatrix<sphericalTensor>& eqn,
+                    const label fieldi
+                );
+
+                virtual void constrain
+                (
+                    faMatrix<symmTensor>& eqn,
+                    const label fieldi
+                );
+
+                virtual void constrain
+                (
+                    faMatrix<tensor>& eqn,
+                    const label fieldi
+                );
+
+
+            // Correction
+
+                virtual void correct(areaScalarField& field);
+                virtual void correct(areaVectorField& field);
+                virtual void correct(areaSphericalTensorField& field);
+                virtual void correct(areaSymmTensorField& field);
+                virtual void correct(areaTensorField& field);
+
+
+        // IO
+
+            //- Write the source header information
+            virtual void writeHeader(Ostream&) const;
+
+            //- Write the source footer information
+            virtual void writeFooter(Ostream&) const;
+
+            //- Write the source properties
+            virtual void writeData(Ostream&) const;
+
+            //- Read source dictionary
+            virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fa
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "faOptionI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/faOptionI.H b/src/faOptions/faOption/faOptionI.H
new file mode 100644
index 00000000000..a541123f275
--- /dev/null
+++ b/src/faOptions/faOption/faOptionI.H
@@ -0,0 +1,108 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+------------------------------------------------------------------------------
+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/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline const Foam::word& Foam::fa::option::name() const
+{
+    return name_;
+}
+
+
+inline const Foam::fvMesh& Foam::fa::option::mesh() const
+{
+    return mesh_;
+}
+
+
+inline const Foam::fvPatch& Foam::fa::option::patch() const
+{
+    return patch_;
+}
+
+
+inline const Foam::dictionary& Foam::fa::option::coeffs() const
+{
+    return coeffs_;
+}
+
+
+inline bool Foam::fa::option::active() const
+{
+    return active_;
+}
+
+
+inline void Foam::fa::option::setApplied(const label fieldi)
+{
+    applied_[fieldi] = true;
+}
+
+
+inline Foam::Switch& Foam::fa::option::active()
+{
+    return active_;
+}
+
+
+inline const Foam::word& Foam::fa::option::regionName() const
+{
+    return regionName_;
+}
+
+
+inline const Foam::faMesh& Foam::fa::option::regionMesh() const
+{
+    if (regionMeshPtr_.valid())
+    {
+        return regionMeshPtr_();
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "Region mesh not available" << abort(FatalError);
+    }
+    return *(new faMesh(mesh_));
+}
+
+
+inline const Foam::volSurfaceMapping& Foam::fa::option::vsm() const
+{
+    if (vsmPtr_.valid())
+    {
+        return vsmPtr_();
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "vsmPtr not available" << abort(FatalError);
+    }
+    return *(new volSurfaceMapping(regionMeshPtr_()));
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/faOptionIO.C b/src/faOptions/faOption/faOptionIO.C
new file mode 100644
index 00000000000..1cb2ab70f20
--- /dev/null
+++ b/src/faOptions/faOption/faOptionIO.C
@@ -0,0 +1,64 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+------------------------------------------------------------------------------
+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 "faOption.H"
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::fa::option::writeHeader(Ostream& os) const
+{
+    os.beginBlock(name_);
+}
+
+
+void Foam::fa::option::writeFooter(Ostream& os) const
+{
+    os.endBlock();
+}
+
+
+void Foam::fa::option::writeData(Ostream& os) const
+{
+    os.writeEntry("type", type());
+    os.writeEntry("active", active_);
+
+    os << nl;
+    coeffs_.writeEntry(word(type() + "Coeffs"), os);
+}
+
+
+bool Foam::fa::option::read(const dictionary& dict)
+{
+    dict.readIfPresent("active", active_);
+
+    coeffs_ = dict.optionalSubDict(modelType_ + "Coeffs");
+
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/faOptionList.C b/src/faOptions/faOption/faOptionList.C
new file mode 100644
index 00000000000..80de3cf682e
--- /dev/null
+++ b/src/faOptions/faOption/faOptionList.C
@@ -0,0 +1,178 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+------------------------------------------------------------------------------
+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 "faOptionList.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+    defineTypeNameAndDebug(optionList, 0);
+}
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+const Foam::dictionary& Foam::fa::optionList::optionsDict
+(
+    const dictionary& dict
+) const
+{
+    if (dict.found("options"))
+    {
+        return dict.subDict("options");
+    }
+    else
+    {
+        return dict;
+    }
+}
+
+
+bool Foam::fa::optionList::readOptions(const dictionary& dict)
+{
+    checkTimeIndex_ = mesh_.time().timeIndex() + 2;
+
+    bool allOk = true;
+    forAll(*this, i)
+    {
+        option& bs = this->operator[](i);
+        bool ok = bs.read(dict.subDict(bs.name()));
+        allOk = (allOk && ok);
+    }
+    return allOk;
+}
+
+
+void Foam::fa::optionList::checkApplied() const
+{
+    if (mesh_.time().timeIndex() == checkTimeIndex_)
+    {
+        forAll(*this, i)
+        {
+            const option& bs = this->operator[](i);
+            bs.checkApplied();
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fa::optionList::optionList
+(
+    const fvPatch& p,
+    const dictionary& dict
+)
+:
+    PtrList<option>(),
+    mesh_(p.boundaryMesh().mesh()),
+    patch_(p),
+    checkTimeIndex_(mesh_.time().startTimeIndex() + 2)
+{
+    reset(optionsDict(dict));
+}
+
+
+Foam::fa::optionList::optionList(const fvPatch& p)
+:
+    PtrList<option>(),
+    mesh_(p.boundaryMesh().mesh()),
+    patch_(p),
+    checkTimeIndex_(mesh_.time().startTimeIndex() + 2)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::fa::optionList::reset(const dictionary& dict)
+{
+    // Count number of active faOptions
+    label count = 0;
+    for (const entry& dEntry : dict)
+    {
+        if (dEntry.isDict())
+        {
+            ++count;
+        }
+    }
+
+    this->resize(count);
+
+    count = 0;
+    for (const entry& dEntry : dict)
+    {
+        if (dEntry.isDict())
+        {
+            const word& name = dEntry.keyword();
+            const dictionary& sourceDict = dEntry.dict();
+
+            this->set
+            (
+                count++,
+                option::New(name, sourceDict, patch_)
+            );
+        }
+    }
+}
+
+
+bool Foam::fa::optionList::read(const dictionary& dict)
+{
+    return readOptions(optionsDict(dict));
+}
+
+
+bool Foam::fa::optionList::writeData(Ostream& os) const
+{
+    // Write list contents
+    forAll(*this, i)
+    {
+        os  << nl;
+        this->operator[](i).writeHeader(os);
+        this->operator[](i).writeData(os);
+        this->operator[](i).writeFooter(os);
+    }
+
+    // Check state of IOstream
+    return os.good();
+}
+
+
+// * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
+
+Foam::Ostream& Foam::operator<<(Ostream& os, const fa::optionList& options)
+{
+    options.writeData(os);
+    return os;
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/faOptionList.H b/src/faOptions/faOption/faOptionList.H
new file mode 100644
index 00000000000..290dc794a65
--- /dev/null
+++ b/src/faOptions/faOption/faOptionList.H
@@ -0,0 +1,250 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+------------------------------------------------------------------------------
+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::fa::optionList
+
+Description
+    List of finite volume options
+
+SourceFile
+    optionList.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef faOptionList_H
+#define faOptionList_H
+
+#include "faOption.H"
+#include "PtrList.H"
+#include "GeometricField.H"
+#include "geometricOneField.H"
+#include "faPatchField.H"
+#include "fvMesh.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of friend functions and operators
+namespace fa
+{
+    class optionList;
+}
+
+Ostream& operator<<(Ostream& os, const fa::optionList& options);
+
+namespace fa
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class optionList Declaration
+\*---------------------------------------------------------------------------*/
+
+class optionList
+:
+    public PtrList<option>
+{
+protected:
+
+    // Protected Data
+
+        //- Reference to the mesh database
+        const fvMesh& mesh_;
+
+        //- Reference to the patch
+        const fvPatch& patch_;
+
+        //- Time index to check that all defined sources have been applied
+        label checkTimeIndex_;
+
+
+    // Protected Member Functions
+
+        //- Return the "options" sub-dictionary if present otherwise return dict
+        const dictionary& optionsDict(const dictionary& dict) const;
+
+        //- Read options dictionary
+        bool readOptions(const dictionary& dict);
+
+        //- Check that all sources have been applied
+        void checkApplied() const;
+
+        //- Return source for equation with specified name and dimensions
+        template<class Type>
+        tmp<faMatrix<Type>> source
+        (
+            GeometricField<Type, faPatchField, areaMesh>& field,
+            const areaScalarField& h,
+            const word& fieldName,
+            const dimensionSet& ds
+        );
+
+        //- No copy construct
+        optionList(const optionList&) = delete;
+
+        //- No copy assignment
+        void operator=(const optionList&) = delete;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("optionList");
+
+
+    // Constructors
+
+        //- Construct null
+        optionList(const fvPatch& p);
+
+        //- Construct from mesh and dictionary
+        optionList(const fvPatch&, const dictionary& );
+
+
+    //- Destructor
+    virtual ~optionList()
+    {}
+
+
+    // Member Functions
+
+        //- Reset the source list
+        void reset(const dictionary& dict);
+
+
+        // Sources
+
+            //- Return source for equation
+            template<class Type>
+            tmp<faMatrix<Type>> operator()
+            (
+                const areaScalarField& h,
+                GeometricField<Type, faPatchField, areaMesh>& field
+            );
+
+            //- Return source for equation with specified name
+            template<class Type>
+            tmp<faMatrix<Type>> operator()
+            (
+                const areaScalarField& h,
+                GeometricField<Type, faPatchField, areaMesh>& field,
+                const word& fieldName
+            );
+
+            //- Return source for equation
+            template<class Type>
+            tmp<faMatrix<Type>> operator()
+            (
+                const areaScalarField& h,
+                const areaScalarField& rho,
+                GeometricField<Type, faPatchField, areaMesh>& field
+            );
+
+            //- Return source for equation with specified name
+            template<class Type>
+            tmp<faMatrix<Type>> operator()
+            (
+                const areaScalarField& h,
+                const areaScalarField& rho,
+                GeometricField<Type, faPatchField, areaMesh>& field,
+                const word& fieldName
+            );
+
+
+            //- Return source for equation with specified name and dimensios
+            template<class Type>
+            tmp<faMatrix<Type>> operator()
+            (
+                const areaScalarField& rho,
+                GeometricField<Type, faPatchField, areaMesh>& field,
+                const dimensionSet& ds
+            );
+
+
+            //- Return source for equation with second time derivative
+            template<class Type>
+            tmp<faMatrix<Type>> d2dt2
+            (
+                GeometricField<Type, faPatchField, areaMesh>& field
+            );
+
+            //- Return source for equation with second time derivative
+            template<class Type>
+            tmp<faMatrix<Type>> d2dt2
+            (
+                GeometricField<Type, faPatchField, areaMesh>& field,
+                const word& fieldName
+            );
+
+
+        // Constraints
+
+            //- Apply constraints to equation
+            template<class Type>
+            void constrain(faMatrix<Type>& eqn);
+
+
+        // Correction
+
+            //- Apply correction to field
+            template<class Type>
+            void correct(GeometricField<Type, faPatchField, areaMesh>& field);
+
+
+        // IO
+
+            //- Read dictionary
+            virtual bool read(const dictionary& dict);
+
+            //- Write data to Ostream
+            virtual bool writeData(Ostream& os) const;
+
+            //- Ostream operator
+            friend Ostream& operator<<
+            (
+                Ostream& os,
+                const optionList& options
+            );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fa
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "faOptionListTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/faOptionListTemplates.C b/src/faOptions/faOption/faOptionListTemplates.C
new file mode 100644
index 00000000000..1a954bcce45
--- /dev/null
+++ b/src/faOptions/faOption/faOptionListTemplates.C
@@ -0,0 +1,290 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+------------------------------------------------------------------------------
+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 "profiling.H"
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::source
+(
+    GeometricField<Type, faPatchField, areaMesh>& field,
+    const areaScalarField& h,
+    const word& fieldName,
+    const dimensionSet& ds
+)
+{
+    checkApplied();
+
+    tmp<faMatrix<Type>> tmtx(new faMatrix<Type>(field, ds));
+    faMatrix<Type>& mtx = tmtx.ref();
+
+    forAll(*this, i)
+    {
+        option& source = this->operator[](i);
+
+        label fieldi = source.applyToField(fieldName);
+
+        if (fieldi != -1)
+        {
+            addProfiling(faopt, "faOption()." + source.name());
+
+            source.setApplied(fieldi);
+
+            if (source.isActive())
+            {
+                if (debug)
+                {
+                    Info<< "Applying source " << source.name() << " to field "
+                        << fieldName << endl;
+                }
+
+                source.addSup(h, mtx, fieldi);
+            }
+        }
+    }
+
+    return tmtx;
+}
+
+
+template<class Type>
+Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator()
+(
+    const areaScalarField& h,
+    GeometricField<Type, faPatchField, areaMesh>& field
+)
+{
+    return this->operator()(h, field, field.name());
+}
+
+
+template<class Type>
+Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator()
+(
+    const areaScalarField& h,
+    GeometricField<Type, faPatchField, areaMesh>& field,
+    const word& fieldName
+)
+{
+    return source(field, h, fieldName, field.dimensions()/dimTime*dimArea);
+}
+
+
+template<class Type>
+Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator()
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    GeometricField<Type, faPatchField, areaMesh>& field
+)
+{
+    return this->operator()(h, rho, field, field.name());
+}
+
+
+template<class Type>
+Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator()
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    GeometricField<Type, faPatchField, areaMesh>& field,
+    const word& fieldName
+)
+{
+    checkApplied();
+
+    const dimensionSet ds
+    (
+        rho.dimensions()*field.dimensions()/dimTime*dimArea
+    );
+
+    tmp<faMatrix<Type>> tmtx(new faMatrix<Type>(field, ds));
+    faMatrix<Type>& mtx = tmtx.ref();
+
+    forAll(*this, i)
+    {
+        option& source = this->operator[](i);
+
+        label fieldi = source.applyToField(fieldName);
+
+        if (fieldi != -1)
+        {
+            addProfiling(faopt, "faOption()." + source.name());
+
+            source.setApplied(fieldi);
+
+            if (source.isActive())
+            {
+                if (debug)
+                {
+                    Info<< "Applying source " << source.name() << " to field "
+                        << fieldName << endl;
+                }
+
+                source.addSup(h, rho, mtx, fieldi);
+            }
+        }
+    }
+
+    return tmtx;
+}
+
+
+template<class Type>
+Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator()
+(
+    const areaScalarField& rho,
+    GeometricField<Type, faPatchField, areaMesh>& field,
+    const dimensionSet& ds
+)
+{
+    checkApplied();
+
+    const dimensionSet dsMat(ds*dimArea);
+
+    tmp<faMatrix<Type>> tmtx(new faMatrix<Type>(field, dsMat));
+    faMatrix<Type>& mtx = tmtx.ref();
+
+    forAll(*this, i)
+    {
+        option& source = this->operator[](i);
+
+        label fieldi = source.applyToField(field.name());
+
+        if (fieldi != -1)
+        {
+            addProfiling(faopt, "faOption()." + source.name());
+
+            source.setApplied(fieldi);
+
+            if (source.isActive())
+            {
+                if (debug)
+                {
+                    Info<< "Applying source " << source.name() << " to field "
+                        << field.name() << endl;
+                }
+
+                source.addSup(rho, mtx, fieldi);
+            }
+        }
+    }
+
+    return tmtx;
+}
+
+
+template<class Type>
+Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::d2dt2
+(
+    GeometricField<Type, faPatchField, areaMesh>& field
+)
+{
+    return this->d2dt2(field, field.name());
+}
+
+
+template<class Type>
+Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::d2dt2
+(
+    GeometricField<Type, faPatchField, areaMesh>& field,
+    const word& fieldName
+)
+{
+    return source(field, fieldName, field.dimensions()/sqr(dimTime)*dimArea);
+}
+
+
+template<class Type>
+void Foam::fa::optionList::constrain(faMatrix<Type>& eqn)
+{
+    checkApplied();
+
+    forAll(*this, i)
+    {
+        option& source = this->operator[](i);
+
+        label fieldi = source.applyToField(eqn.psi().name());
+
+        if (fieldi != -1)
+        {
+            addProfiling(faopt, "faOption::constrain." + eqn.psi().name());
+
+            source.setApplied(fieldi);
+
+            if (source.isActive())
+            {
+                if (debug)
+                {
+                    Info<< "Applying constraint " << source.name()
+                        << " to field " << eqn.psi().name() << endl;
+                }
+
+                source.constrain(eqn, fieldi);
+            }
+        }
+    }
+}
+
+
+template<class Type>
+void Foam::fa::optionList::correct
+(
+    GeometricField<Type, faPatchField, areaMesh>& field
+)
+{
+    const word& fieldName = field.name();
+
+    forAll(*this, i)
+    {
+        option& source = this->operator[](i);
+
+        label fieldi = source.applyToField(fieldName);
+
+        if (fieldi != -1)
+        {
+            addProfiling(faopt, "faOption::correct." + source.name());
+
+            source.setApplied(fieldi);
+
+            if (source.isActive())
+            {
+                if (debug)
+                {
+                    Info<< "Correcting source " << source.name()
+                        << " for field " << fieldName << endl;
+                }
+
+                source.correct(field);
+            }
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/faOptions.C b/src/faOptions/faOption/faOptions.C
new file mode 100644
index 00000000000..ef6e465813d
--- /dev/null
+++ b/src/faOptions/faOption/faOptions.C
@@ -0,0 +1,144 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+------------------------------------------------------------------------------
+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 "faOptions.H"
+#include "faMesh.H"
+#include "Time.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    namespace fa
+    {
+        defineTypeNameAndDebug(options, 0);
+    }
+}
+
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+Foam::IOobject Foam::fa::options::createIOobject
+(
+    const fvMesh& mesh
+) const
+{
+    IOobject io
+    (
+        typeName,
+        mesh.time().constant(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::NO_WRITE
+    );
+
+    if (io.typeHeaderOk<IOdictionary>(true))
+    {
+        Info<< "Creating finite area options from "
+            << io.instance()/io.name() << nl
+            << endl;
+
+        io.readOpt() = IOobject::MUST_READ_IF_MODIFIED;
+        return io;
+    }
+    else
+    {
+        // Check if the faOptions file is in system
+        io.instance() = mesh.time().system();
+
+        if (io.typeHeaderOk<IOdictionary>(true))
+        {
+            Info<< "Creating finite area options from "
+                << io.instance()/io.name() << nl
+                << endl;
+
+            io.readOpt() = IOobject::MUST_READ_IF_MODIFIED;
+            return io;
+        }
+        else
+        {
+            io.readOpt() = IOobject::NO_READ;
+            return io;
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fa::options::options
+(
+    const fvPatch& p
+)
+:
+    IOdictionary(createIOobject(p.boundaryMesh().mesh())),
+    optionList(p, *this)
+{}
+
+
+Foam::fa::options& Foam::fa::options::New(const fvPatch& p)
+{
+    const fvMesh& mesh = p.boundaryMesh().mesh();
+
+    if (mesh.thisDb().foundObject<options>(typeName))
+    {
+        return const_cast<options&>
+        (
+            mesh.lookupObject<options>(typeName)
+        );
+    }
+    else
+    {
+        if (debug)
+        {
+            InfoInFunction
+                << "Constructing " << typeName
+                << " for region " << mesh.name() << endl;
+        }
+
+        options* objectPtr = new options(p);
+        regIOobject::store(objectPtr);
+        return *objectPtr;
+    }
+}
+
+
+bool Foam::fa::options::read()
+{
+    if (IOdictionary::regIOobject::read())
+    {
+        optionList::read(*this);
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/faOptions.H b/src/faOptions/faOption/faOptions.H
new file mode 100644
index 00000000000..a80969885cc
--- /dev/null
+++ b/src/faOptions/faOption/faOptions.H
@@ -0,0 +1,112 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+------------------------------------------------------------------------------
+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::fa::options
+
+Description
+    Finite-area options
+
+SourceFiles
+    faOptions.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fa_options_H
+#define fa_options_H
+
+#include "faOptionList.H"
+#include "IOdictionary.H"
+#include "autoPtr.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class options Declaration
+\*---------------------------------------------------------------------------*/
+
+class options
+:
+    public IOdictionary,
+    public optionList
+{
+    // Private Member Functions
+
+        //- Create IO object if dictionary is present
+        IOobject createIOobject(const fvMesh& mesh) const;
+
+        //- No copy construct
+        options(const options&) = delete;
+
+        //- No copy assignment
+        void operator=(const options&) = delete;
+
+
+public:
+
+    // Declare name of the class and its debug switch
+    ClassName("faOptions");
+
+
+    // Constructors
+
+        //- Construct from components with list of field names
+        options(const fvPatch& p);
+
+        //- Construct faOptions and register to database if not present
+        //- otherwise lookup and return
+        static options& New(const fvPatch& p);
+
+
+    //- Destructor
+    virtual ~options()
+    {}
+
+
+    // Member Functions
+
+        //- Inherit read from optionList
+        using optionList::read;
+
+        //- Read dictionary
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fa
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/faOption/makeFaOption.H b/src/faOptions/faOption/makeFaOption.H
new file mode 100644
index 00000000000..64a12e46919
--- /dev/null
+++ b/src/faOptions/faOption/makeFaOption.H
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+------------------------------------------------------------------------------
+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/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef makeFaOption_H
+#define makeFaOption_H
+
+#include "faOption.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#define makeFaOption(Option, Type)                                             \
+                                                                               \
+    defineTemplateTypeNameAndDebugWithName                                     \
+    (                                                                          \
+        Foam::fa::Option<Foam::Type>,                                          \
+        #Type#Option,                                                          \
+        0                                                                      \
+    );                                                                         \
+                                                                               \
+    Foam::fa::option::adddictionaryConstructorToTable                          \
+        <Foam::fa::Option<Foam::Type>>                                         \
+        add##Option##Type##dictionary##ConstructorTooptionTable_
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/faceSetOption/faceSetOption.C b/src/faOptions/faceSetOption/faceSetOption.C
new file mode 100644
index 00000000000..24e176e56da
--- /dev/null
+++ b/src/faOptions/faceSetOption/faceSetOption.C
@@ -0,0 +1,246 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "faceSetOption.H"
+#include "areaFields.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    namespace fa
+    {
+        defineTypeNameAndDebug(faceSetOption, 0);
+    }
+}
+
+
+const Foam::Enum
+<
+    Foam::fa::faceSetOption::selectionModeType
+>
+Foam::fa::faceSetOption::selectionModeTypeNames_
+({
+    { selectionModeType::smAll, "all" },
+    { selectionModeType::smVolFaceZone, "volFaceZone" }
+});
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+void Foam::fa::faceSetOption::setSelection(const dictionary& dict)
+{
+    switch (selectionMode_)
+    {
+        case smAll:
+        {
+            break;
+        }
+        case smVolFaceZone:
+        {
+            dict.readEntry("faceZone", faceSetName_);
+            break;
+        }
+        default:
+        {
+            FatalErrorInFunction
+                << "Unknown selectionMode "
+                << selectionModeTypeNames_[selectionMode_]
+                << ". Valid selectionMode types : "
+                << selectionModeTypeNames_
+                << exit(FatalError);
+        }
+    }
+}
+
+
+void Foam::fa::faceSetOption::setArea()
+{
+    // Set area information
+
+    scalar sumArea = 0.0;
+    for (const label facei : faces_)
+    {
+        sumArea += regionMesh().S()[facei];
+    }
+    reduce(sumArea, sumOp<scalar>());
+
+    const scalar AOld = A_;
+    A_ = sumArea;
+
+    // Convert both areas to representation using current writeprecision
+    word AOldName(Time::timeName(AOld, IOstream::defaultPrecision()));
+    word AName(Time::timeName(A_, IOstream::defaultPrecision()));
+
+    if (AName != AOldName)
+    {
+        Info<< indent
+            << "- selected " << returnReduce(faces_.size(), sumOp<label>())
+            << " face(s) with area " << A_ << endl;
+    }
+}
+
+
+void Foam::fa::faceSetOption::setFaceSet()
+{
+    switch (selectionMode_)
+    {
+        case smVolFaceZone:
+        {
+            Info<< indent
+                << "- selecting faces using volume-mesh faceZone "
+                << faceSetName_ << endl;
+
+            label zoneID = mesh_.faceZones().findZoneID(faceSetName_);
+            if (zoneID == -1)
+            {
+                FatalErrorInFunction
+                    << "Cannot find faceZone " << faceSetName_ << endl
+                    << "Valid faceZones are " << mesh_.faceZones().names()
+                    << exit(FatalError);
+            }
+
+            const faceZone& addr = mesh_.faceZones()[zoneID];
+
+            const bitSet isZoneFace(mesh_.nFaces(), addr);
+
+            // Do we loop over faMesh faces or over faceZone faces?
+            const labelUList& faceLabels = regionMesh().faceLabels();
+
+            label n = 0;
+            for (const label facei : faceLabels)
+            {
+                if (isZoneFace[facei])
+                {
+                    n++;
+                }
+            }
+            faces_.setSize(n);
+            n = 0;
+            for (const label facei : faceLabels)
+            {
+                if (isZoneFace[facei])
+                {
+                    faces_[n++] = facei;
+                }
+            }
+            break;
+        }
+
+        case smAll:
+        {
+            Info<< indent << "- selecting all faces" << endl;
+            faces_ = identity(regionMesh().nFaces());
+
+            break;
+        }
+        default:
+        {
+            FatalErrorInFunction
+                << "Unknown selectionMode "
+                << selectionModeTypeNames_[selectionMode_]
+                << ". Valid selectionMode types are "
+                << selectionModeTypeNames_
+                << exit(FatalError);
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fa::faceSetOption::faceSetOption
+(
+    const word& name,
+    const word& modelType,
+    const dictionary& dict,
+    const fvPatch& patch
+)
+:
+    option(name, modelType, dict, patch),
+    timeStart_(-1.0),
+    duration_(0.0),
+    selectionMode_(selectionModeTypeNames_.get("selectionMode", coeffs_)),
+    faceSetName_("none"),
+    A_(0.0)
+{
+    if (isActive())
+    {
+        Info<< incrIndent;
+        read(dict);
+        setSelection(coeffs_);
+        setFaceSet();
+        setArea();
+        Info<< decrIndent;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::fa::faceSetOption::isActive()
+{
+    if (option::isActive() && inTimeLimits(mesh_.time().value()))
+    {
+        // Update the face set if the mesh is changing
+        if (mesh_.changing())
+        {
+            if (mesh_.topoChanging())
+            {
+                setArea();
+                // Force printing of new set area
+                A_ = -GREAT;
+            }
+
+            // Report new area (if changed)
+            setArea();
+        }
+
+        return true;
+    }
+
+    return false;
+}
+
+
+bool Foam::fa::faceSetOption::read(const dictionary& dict)
+{
+    if (option::read(dict))
+    {
+        if (coeffs_.readIfPresent("timeStart", timeStart_))
+        {
+            coeffs_.readEntry("duration", duration_);
+        }
+
+        return true;
+    }
+
+    return false;
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/faceSetOption/faceSetOption.H b/src/faOptions/faceSetOption/faceSetOption.H
new file mode 100644
index 00000000000..edbf26ed53b
--- /dev/null
+++ b/src/faOptions/faceSetOption/faceSetOption.H
@@ -0,0 +1,241 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::fa::faceSetOption
+
+Description
+    Intermediate abstract class for handling
+    face-set options for the derived faOptions.
+
+Usage
+    Minimal example by using \c constant/faOptions:
+    \verbatim
+    <userDefinedName1>
+    {
+        // Mandatory/Optional (inherited) entries
+        ...
+
+        // Mandatory entries (unmodifiable)
+        selectionMode     all;
+
+        // Optional entries (runtime modifiable)
+        timeStart         1.0;
+
+        // Conditional mandatory entries (runtime modifiable)
+
+            // when timeStart entry is present
+            duration          1.4;
+
+            // when selectionMode=volFaceZone
+            faceZone          <faceZoneName>;
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property      | Description                        | Type  | Reqd | Dflt
+      selectionMode | Mode of face selection - see below | word  | yes  | -
+      timeStart     | Start time of faOption             | scalar | no  | -1
+      duration      | Duration of faOption execution <!--
+                          --> starting from timeStart    | scalar | cndtnl | 0
+      faceZone      | Name of operand faceZone           | word  | cndtnl | -
+    \endtable
+
+    Options for the \c selectionMode entry:
+    \verbatim
+      all       | Use all faces in the computational domain
+      faceZone  | Use a given faceZone
+    \endverbatim
+
+    The inherited entries are elaborated in:
+     - \link faOption.H \endlink
+
+Note
+  - Source/sink options are to be added to the right-hand side of equations.
+
+SourceFiles
+    faceSetOption.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef faceSetOption_H
+#define faceSetOption_H
+
+#include "faOption.H"
+#include "faceSet.H"
+#include "faMesh.H"
+#include "Time.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class faceSetOption Declaration
+\*---------------------------------------------------------------------------*/
+
+class faceSetOption
+:
+    public option
+{
+public:
+
+    // Public Enumeration
+
+        //- Enumeration for selection mode types
+        enum selectionModeType
+        {
+            smAll,
+            smVolFaceZone
+        };
+
+        //- List of selection mode type names
+        static const Enum<selectionModeType> selectionModeTypeNames_;
+
+
+protected:
+
+    // Protected Data
+
+        //- Time start
+        scalar timeStart_;
+
+        //- Duration
+        scalar duration_;
+
+        //- Face selection mode
+        selectionModeType selectionMode_;
+
+        //- Name of zone for "faceZone" selectionMode
+        word faceSetName_;
+
+        //- Set of faces to apply source to
+        labelList faces_;
+
+        //- Sum of face area
+        scalar A_;
+
+
+    // Protected Functions
+
+        //- Set the face selection
+        void setSelection(const dictionary& dict);
+
+        //- Set the face set based on the user input selection mode
+        void setFaceSet();
+
+        //- Recalculate the area
+        void setArea();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("faceSetOption");
+
+
+    // Constructors
+
+        //- Construct from components
+        faceSetOption
+        (
+            const word& name,
+            const word& modelType,
+            const dictionary& dict,
+            const fvPatch& patch
+        );
+
+
+    //- Destructor
+    virtual ~faceSetOption() = default;
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return const access to the time start
+            inline scalar timeStart() const;
+
+            //- Return const access to the duration
+            inline scalar duration() const;
+
+            //- Return true if within time limits
+            inline bool inTimeLimits(const scalar time) const;
+
+            //- Return const access to the face selection mode
+            inline const selectionModeType& selectionMode() const;
+
+            //- Return const access to the name of face set for "faceZone"
+            //- selectionMode
+            inline const word& faceSetName() const;
+
+            //- Return const access to the total face area
+            inline scalar A() const;
+
+            //- Return const access to the face set
+            inline const labelList& faces() const;
+
+
+        // Edit
+
+            //- Return access to the time start
+            inline scalar& timeStart();
+
+            //- Return access to the duration
+            inline scalar& duration();
+
+
+        // Checks
+
+            //- Is the source active?
+            virtual bool isActive();
+
+
+        // IO
+
+            //- Read source dictionary
+            virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fa
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "faceSetOptionI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/faceSetOption/faceSetOptionI.H b/src/faOptions/faceSetOption/faceSetOptionI.H
new file mode 100644
index 00000000000..d63ee885604
--- /dev/null
+++ b/src/faOptions/faceSetOption/faceSetOptionI.H
@@ -0,0 +1,93 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline Foam::scalar Foam::fa::faceSetOption::timeStart() const
+{
+    return timeStart_;
+}
+
+
+inline Foam::scalar Foam::fa::faceSetOption::duration() const
+{
+    return duration_;
+}
+
+
+inline bool Foam::fa::faceSetOption::inTimeLimits(const scalar time) const
+{
+    return
+    (
+        (timeStart_ < 0)
+     ||
+        (
+            (mesh_.time().value() >= timeStart_)
+         && (mesh_.time().value() <= (timeStart_ + duration_))
+        )
+    );
+}
+
+
+inline const Foam::fa::faceSetOption::selectionModeType&
+Foam::fa::faceSetOption::selectionMode() const
+{
+    return selectionMode_;
+}
+
+
+inline const Foam::word& Foam::fa::faceSetOption::faceSetName() const
+{
+    return faceSetName_;
+}
+
+
+inline Foam::scalar Foam::fa::faceSetOption::A() const
+{
+    return A_;
+}
+
+
+inline const Foam::labelList& Foam::fa::faceSetOption::faces() const
+{
+    return faces_;
+}
+
+
+inline Foam::scalar& Foam::fa::faceSetOption::timeStart()
+{
+    return timeStart_;
+}
+
+
+inline Foam::scalar& Foam::fa::faceSetOption::duration()
+{
+    return duration_;
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.C b/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.C
new file mode 100644
index 00000000000..e9a4133d7a9
--- /dev/null
+++ b/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.C
@@ -0,0 +1,204 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "contactHeatFluxSource.H"
+#include "faMatrices.H"
+#include "addToRunTimeSelectionTable.H"
+#include "volFields.H"
+#include "famSup.H"
+#include "zeroGradientFaPatchFields.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+    defineTypeNameAndDebug(contactHeatFluxSource, 0);
+    addToRunTimeSelectionTable(option, contactHeatFluxSource, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fa::contactHeatFluxSource::contactHeatFluxSource
+(
+    const word& sourceName,
+    const word& modelType,
+    const dictionary& dict,
+    const fvPatch& patch
+)
+:
+    faceSetOption(sourceName, modelType, dict, patch),
+    temperatureCoupledBase(patch, dict),
+    TName_(dict.getOrDefault<word>("T", "T")),
+    TprimaryName_(dict.get<word>("Tprimary")),
+    Tp_(mesh().lookupObject<volScalarField>(TprimaryName_)),
+    Tw1_
+    (
+        IOobject
+        (
+            "Tw1_" + sourceName,
+            mesh().time().timeName(),
+            mesh(),
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(dimTemperature, Zero),
+        zeroGradientFaPatchScalarField::typeName
+    ),
+    thicknessLayers_(Zero),
+    kappaLayers_(Zero),
+    contactRes_(0),
+    curTimeIndex_(-1)
+{
+    fieldNames_.setSize(1, TName_);
+
+    applied_.setSize(fieldNames_.size(), false);
+
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::tmp<Foam::areaScalarField> Foam::fa::contactHeatFluxSource::htc() const
+{
+    IOobject io
+    (
+        "thtc",
+        mesh().time().timeName(),
+        mesh(),
+        IOobject::NO_READ,
+        IOobject::NO_WRITE
+    );
+
+    tmp<areaScalarField> thtc
+    (
+        new areaScalarField
+        (
+            io,
+            regionMesh(),
+            dimensionedScalar(dimPower/dimArea/dimTemperature, Zero)
+        )
+    );
+
+    areaScalarField& htc = thtc.ref();
+
+    const volScalarField::Boundary& vfb = Tp_.boundaryField();
+
+    htc.primitiveFieldRef() =
+        temperatureCoupledBase::kappa
+        (
+            vsm().mapInternalToSurface<scalar>(vfb)()
+        )*patch().deltaCoeffs();
+
+    if (contactRes_ != 0)
+    {
+        tmp<areaScalarField> tcontact
+        (
+            new areaScalarField
+            (
+                io,
+                regionMesh(),
+                dimensionedScalar
+                (
+                    "contact",
+                    dimPower/dimArea/dimTemperature,
+                    contactRes_
+                )
+            )
+        );
+        areaScalarField& contact = tcontact.ref();
+        htc.primitiveFieldRef() += contact.primitiveField();
+    }
+
+    return thtc;
+}
+
+
+void Foam::fa::contactHeatFluxSource::addSup
+(
+    const areaScalarField& h,
+    const areaScalarField& rhoCph,
+    faMatrix<scalar>& eqn,
+    const label fieldi
+)
+{
+    if (isActive())
+    {
+        DebugInfo<< name() << ": applying source to " << eqn.psi().name()
+                 << endl;
+
+        if (curTimeIndex_ != mesh().time().timeIndex())
+        {
+            const volScalarField::Boundary& vfb = Tp_.boundaryField();
+
+            Tw1_.primitiveFieldRef() =
+                this->vsm().mapInternalToSurface<scalar>(vfb);
+
+            tmp<areaScalarField> htcw = htc();
+
+            eqn += -fam::Sp(htcw(), eqn.psi()) + htcw()*Tw1_;
+
+            curTimeIndex_ = mesh().time().timeIndex();
+        }
+    }
+}
+
+
+bool Foam::fa::contactHeatFluxSource::read(const dictionary& dict)
+{
+    if (option::read(dict))
+    {
+        coeffs_.readIfPresent("T", TName_);
+
+        if (dict.readIfPresent("thicknessLayers", thicknessLayers_))
+        {
+            dict.readEntry("kappaLayers", kappaLayers_);
+
+            if (thicknessLayers_.size() > 0)
+            {
+                // Calculate effective thermal resistance by harmonic averaging
+                forAll(thicknessLayers_, iLayer)
+                {
+                    contactRes_ += thicknessLayers_[iLayer]/kappaLayers_[iLayer];
+                }
+                contactRes_ = scalar(1)/contactRes_;
+            }
+        }
+
+        return true;
+    }
+
+    return false;
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.H b/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.H
new file mode 100644
index 00000000000..699c5214c0c
--- /dev/null
+++ b/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.H
@@ -0,0 +1,196 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::fa::contactHeatFluxSource
+
+Group
+    grpFaOptionsSources
+
+Description
+    Applies contact heat flux between specified \c faMesh
+    and \c fvMesh within a specified region for compressible flows.
+
+Usage
+    Minimal example by using \c constant/faOptions:
+    \verbatim
+    contactHeatFluxSource1
+    {
+        // Mandatory entries (unmodifiable)
+        type                contactHeatFluxSource;
+        Tprimary            <TprimaryFieldName>;
+
+        // Optional entries (runtime modifiable)
+        T                   <Tname>;
+        thicknessLayers     (<layer1> <layer2> ... <layerN>);
+
+        // Conditional optional entries (runtime modifiable)
+
+            // when the entry "thicknessLayers" is present
+            kappaLayers     (<layer1> <layer2> ... <layerN>);
+
+        // Mandatory/Optional (inherited) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property  | Description                       | Type  | Reqd | Dflt
+      type      | Type name: contactHeatFluxSource  | word  | yes  | -
+      Tprimary  | Name of primary temperature field | word  | yes  | -
+      T         | Name of operand temperature field | word  | no   | T
+      thicknessLayers | List of thicknesses of layers | scalarList | no | -
+      kappaLayers | List of conductivities of layers | scalarList | cndtnl | -
+    \endtable
+
+    The inherited entries are elaborated in:
+     - \link faOption.H \endlink
+     - \link faceSetOption.H \endlink
+     - \link temperatureCoupledBase.H \endlink
+
+SourceFiles
+    contactHeatFluxSource.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fa_contactHeatFluxSource_H
+#define fa_contactHeatFluxSource_H
+
+#include "faOption.H"
+#include "Function1.H"
+#include "areaFields.H"
+#include "faceSetOption.H"
+#include "temperatureCoupledBase.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class contactHeatFluxSource Declaration
+\*---------------------------------------------------------------------------*/
+
+class contactHeatFluxSource
+:
+    public faceSetOption,
+    public temperatureCoupledBase
+{
+    // Private Data
+
+        //- Name of temperature field
+        word TName_;
+
+        //- Name of primary temperature field
+        word TprimaryName_;
+
+        //- Primary region temperature
+        const volScalarField& Tp_;
+
+        //- Temperature - wall [K]
+        areaScalarField Tw1_;
+
+        //- Thickness of layers
+        scalarList thicknessLayers_;
+
+        //- Conductivity of layers
+        scalarList kappaLayers_;
+
+        //- Total contact resistance
+        scalar contactRes_;
+
+        //- Current time index (used for updating)
+        label curTimeIndex_;
+
+
+    // Private Member Functions
+
+        //- Return htc from the primary region
+        tmp<areaScalarField> htc() const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("contactHeatFluxSource");
+
+
+    // Constructors
+
+        //- Construct from explicit source name and mesh
+        contactHeatFluxSource
+        (
+            const word& sourceName,
+            const word& modelType,
+            const dictionary& dict,
+            const fvPatch& patch
+        );
+
+        //- No copy construct
+        contactHeatFluxSource(const contactHeatFluxSource&) = delete;
+
+        //- No copy assignment
+        void operator=(const contactHeatFluxSource&) = delete;
+
+
+    //- Destructor
+    virtual ~contactHeatFluxSource() = default;
+
+
+    // Member Functions
+
+        // Evaluation
+
+            //- Add explicit contribution to compressible momentum equation
+            virtual void addSup
+            (
+                const areaScalarField& h,
+                const areaScalarField& rho,
+                faMatrix<scalar>& eqn,
+                const label fieldi
+            );
+
+
+        // IO
+
+            //- Read source dictionary
+            virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fa
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/externalFileSource/externalFileSource.C b/src/faOptions/sources/derived/externalFileSource/externalFileSource.C
new file mode 100644
index 00000000000..f5a95479d23
--- /dev/null
+++ b/src/faOptions/sources/derived/externalFileSource/externalFileSource.C
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "externalFileSource.H"
+#include "faMatrices.H"
+#include "faCFD.H"
+#include "zeroGradientFaPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+    defineTypeNameAndDebug(externalFileSource, 0);
+    addToRunTimeSelectionTable(option, externalFileSource, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fa::externalFileSource::externalFileSource
+(
+    const word& sourceName,
+    const word& modelType,
+    const dictionary& dict,
+    const fvPatch& p
+)
+:
+    faceSetOption(sourceName, modelType, dict, p),
+    fieldName_(dict.get<word>("fieldName")),
+    tableName_(dict.get<word>("tableName")),
+    pExt_
+    (
+        IOobject
+        (
+            "pExt",
+            mesh_.time().timeName(),
+            mesh_,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("pExt", dimPressure, Zero),
+        zeroGradientFaPatchScalarField::typeName
+    ),
+    value_
+    (
+        new PatchFunction1Types::MappedFile<scalar>
+        (
+            p.patch(),
+            "uniformValue",
+            dict,
+            tableName_,          // field table name
+            true                 // face values
+        )
+    ),
+    curTimeIndex_(-1)
+{
+    fieldNames_.setSize(1, fieldName_);
+
+    applied_.setSize(fieldNames_.size(), false);
+
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::fa::externalFileSource::addSup
+(
+    const areaScalarField& solidMass,
+    faMatrix<scalar>& eqn,
+    const label fieldi
+)
+{
+    const scalar t = mesh().time().value();
+
+    if (isActive() && t > timeStart() && t < (timeStart() + duration()))
+    {
+        DebugInfo<< name() << ": applying source to " << eqn.psi().name()<<endl;
+
+        if (curTimeIndex_ != mesh().time().timeIndex())
+        {
+            pExt_.field() = value_->value(t);
+            eqn += pExt_/solidMass;
+            curTimeIndex_ = mesh().time().timeIndex();
+        }
+    }
+}
+
+
+bool Foam::fa::externalFileSource::read(const dictionary& dict)
+{
+    if (option::read(dict))
+    {
+        return true;
+    }
+
+    return false;
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/externalFileSource/externalFileSource.H b/src/faOptions/sources/derived/externalFileSource/externalFileSource.H
new file mode 100644
index 00000000000..6d6c0ec2dad
--- /dev/null
+++ b/src/faOptions/sources/derived/externalFileSource/externalFileSource.H
@@ -0,0 +1,169 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::fa::externalFileSource
+
+Group
+    grpFaOptionsSources
+
+Description
+    Applies sources on a specified field within a specified region
+    by using an external table file for compressible flows.
+
+Usage
+    Minimal example by using \c constant/faOptions:
+    \verbatim
+    externalFileSource1
+    {
+        // Mandatory entries (unmodifiable)
+        type                externalFileSource;
+        fieldName           <fieldName>;
+        tableName           <tableFileName.dat>;
+
+        // Mandatory/Optional (inherited) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property  | Description                    | Type  | Reqd | Dflt
+      type      | Type name: externalFileSource  | word  | yes  | -
+      fieldName | Name of operand field          | word  | yes  | -
+      tableName | Name of operand table file     | word  | yes  | -
+    \endtable
+
+    The inherited entries are elaborated in:
+     - \link faOption.H \endlink
+     - \link faceSetOption.H \endlink
+
+See also
+  - Foam::PatchFunction1Types
+
+SourceFiles
+    externalFileSource.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fa_externalFileSource_H
+#define fa_externalFileSource_H
+
+#include "faOption.H"
+#include "areaFields.H"
+#include "faceSetOption.H"
+#include "MappedFile.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class externalFileSource Declaration
+\*---------------------------------------------------------------------------*/
+
+class externalFileSource
+:
+    public faceSetOption
+{
+    // Private Data
+
+        //- Name of the field to apply this source
+        word fieldName_;
+
+        //- Name of the table
+        word tableName_;
+
+        //- External pressure field
+        areaScalarField pExt_;
+
+        //- Mapped data from file
+        autoPtr<PatchFunction1Types::MappedFile<scalar>> value_;
+
+        //- Current time index (used for updating)
+        label curTimeIndex_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("externalFileSource");
+
+
+    // Constructors
+
+        //- Construct from explicit source name and mesh
+        externalFileSource
+        (
+            const word& sourceName,
+            const word& modelType,
+            const dictionary& dict,
+            const fvPatch& patch
+        );
+
+        //- No copy construct
+        externalFileSource(const externalFileSource&) = delete;
+
+        //- No copy assignment
+        void operator=(const externalFileSource&) = delete;
+
+
+    //- Destructor
+    virtual ~externalFileSource() = default;
+
+
+    // Member Functions
+
+        // Evaluation
+
+            //- Add explicit contribution to compressible momentum equation
+            virtual void addSup
+            (
+                const areaScalarField& rho,
+                faMatrix<scalar>& eqn,
+                const label fieldi
+            );
+
+
+        // IO
+
+            //- Read source dictionary
+            virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fa
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.C b/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.C
new file mode 100644
index 00000000000..478fc81b5ce
--- /dev/null
+++ b/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.C
@@ -0,0 +1,208 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "externalHeatFluxSource.H"
+#include "addToRunTimeSelectionTable.H"
+#include "physicoChemicalConstants.H"
+#include "zeroGradientFaPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+using Foam::constant::physicoChemical::sigma;
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+    defineTypeNameAndDebug(externalHeatFluxSource, 0);
+    addToRunTimeSelectionTable(option, externalHeatFluxSource, dictionary);
+}
+}
+
+
+const Foam::Enum
+<
+    Foam::fa::externalHeatFluxSource::operationMode
+>
+Foam::fa::externalHeatFluxSource::operationModeNames
+({
+    { operationMode::fixedPower, "power" },
+    { operationMode::fixedHeatFlux, "flux" },
+    { operationMode::fixedHeatTransferCoeff, "coefficient" },
+});
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fa::externalHeatFluxSource::externalHeatFluxSource
+(
+    const word& sourceName,
+    const word& modelType,
+    const dictionary& dict,
+    const fvPatch& patch
+)
+:
+    faceSetOption(sourceName, modelType, dict, patch),
+    mode_(operationModeNames.get("mode", dict)),
+    TName_(dict.getOrDefault<word>("T", "T")),
+    Q_(0),
+    q_(0),
+    h_(0),
+    Ta_(),
+    emissivity_(dict.getOrDefault<scalar>("emissivity", 0))
+{
+    fieldNames_.setSize(1, TName_);
+
+    applied_.setSize(fieldNames_.size(), false);
+
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::fa::externalHeatFluxSource::addSup
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    faMatrix<scalar>& eqn,
+    const label fieldi
+)
+{
+    if (isActive())
+    {
+        DebugInfo<< name() << ": applying source to "
+            << eqn.psi().name() << endl;
+
+        IOobject io
+        (
+            "Q",
+            mesh_.time().timeName(),
+            mesh_,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE,
+            false
+        );
+
+        auto tQ = new areaScalarField
+        (
+            io,
+            regionMesh(),
+            dimensionedScalar("q", dimPower/sqr(dimLength), 0),
+            zeroGradientFaPatchScalarField::typeName
+        );
+        areaScalarField& Q = *tQ;
+
+        switch (mode_)
+        {
+            case fixedPower:
+            {
+                Q.primitiveFieldRef() = Q_/regionMesh().S().field();
+                eqn += Q;
+
+                break;
+            }
+            case fixedHeatFlux:
+            {
+                Q.primitiveFieldRef() = q_;
+                eqn += Q;
+                break;
+            }
+            case fixedHeatTransferCoeff:
+            {
+                const dimensionedScalar Ta
+                (
+                    "Ta",
+                    dimTemperature,
+                    Ta_->value(mesh_.time().timeOutputValue())
+                );
+
+                areaScalarField hp
+                (
+                    io,
+                    regionMesh(),
+                    dimensionedScalar
+                    (
+                        "h",
+                        dimPower/sqr(dimLength)/dimTemperature,
+                        h_
+                    )
+                );
+
+                const areaScalarField hpTa(hp*Ta);
+
+                if (emissivity_ > 0)
+                {
+                    hp -= emissivity_*sigma.value()*pow3(eqn.psi());
+                }
+
+                eqn -= fam::SuSp(hp, eqn.psi()) - hpTa;
+
+            }
+        }
+    }
+}
+
+
+bool Foam::fa::externalHeatFluxSource::read(const dictionary& dict)
+{
+    if (option::read(dict))
+    {
+        dict.readIfPresent("T", TName_);
+        dict.readIfPresent("emissivity", emissivity_);
+
+        mode_ = operationModeNames.get("mode", dict);
+
+        switch (mode_)
+        {
+            case fixedPower:
+            {
+                dict.readEntry("Q", Q_);
+                break;
+            }
+            case fixedHeatFlux:
+            {
+                dict.readEntry("q", q_);
+                break;
+            }
+            case fixedHeatTransferCoeff:
+            {
+                dict.readEntry("h", h_);
+                Ta_ = Function1<scalar>::New("Ta", dict);
+                break;
+            }
+        }
+
+        return true;
+    }
+
+     return false;
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.H b/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.H
new file mode 100644
index 00000000000..97873b29ffd
--- /dev/null
+++ b/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.H
@@ -0,0 +1,241 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::fa::externalHeatFluxSource
+
+Group
+    grpFaOptionsSources
+
+Description
+    Applies a heat flux condition for a specified \c faMesh region
+    to temperature on an external wall for compressible flows
+    in one of three modes:
+
+      - fixed power: supply \c Q
+      - fixed heat flux: supply \c q
+      - fixed heat transfer coefficient: supply \c h and \c Ta
+
+    where
+    \vartable
+        Q  | Power [W]
+        q  | Heat flux [W/m^2]
+        h  | Heat transfer coefficient [W/m^2/K]
+        Ta | Ambient temperature [K]
+    \endvartable
+
+    The ambient temperature \c Ta is specified
+    as a \c Foam::Function1 of time but uniform in space.
+
+Usage
+    Minimal example by using \c constant/faOptions:
+    \verbatim
+    externalHeatFluxSource1
+    {
+        // Mandatory entries (unmodifiable)
+        type            externalHeatFluxSource;
+
+        // Mandatory entries (runtime modifiable)
+        mode            <mode>;
+
+        // Optional entries (runtime modifiable)
+        T               <Tname>;
+        emissivity      0;
+
+        // Conditional mandatory entries (runtime modifiable)
+
+            // when mode=power
+            Q           1.0;
+
+            // when mode=flux
+            q           1.0;
+
+            // when mode=coefficient
+            h           1.0;
+            Ta          <Function1>;
+
+        // Mandatory/Optional (inherited) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property  | Description                          | Type  | Reqd | Dflt
+      type      | Type name: externalHeatFluxSource    | word  | yes  | -
+      mode      | Mode of heat flux condition          | word  | yes  | -
+      T         | Name of operand temperature field    | word  | no   | T
+      emissivity | Surface emissivity for radiative flux to ambient <!--
+                 -->                                   | scalar | no  | 0
+      Q         | Fixed heat power [W]                 | scalar | cndtnl | -
+      q         | Fixed heat flux [W/m2]               | scalar | cndtnl | -
+      h         | Heat transfer coefficient [W/m^2/K]  | scalar | cndtnl | -
+      Ta        | Ambient temperature [K]           | Function1 | cndtnl | -
+    \endtable
+
+    The inherited entries are elaborated in:
+     - \link faOption.H \endlink
+     - \link faceSetOption.H \endlink
+
+    Options for the \c mode entry:
+    \verbatim
+      power       | Use fixed power (supply Q)
+      flux        | Use fixed heat flux (supply q)
+      coefficient | Use fixes heat transfer coefficient (supply h and T)
+    \endverbatim
+
+See also
+  - Foam::Function1
+
+SourceFiles
+    externalHeatFluxSource.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fa_externalHeatFluxSource_H
+#define fa_externalHeatFluxSource_H
+
+#include "faOption.H"
+#include "Function1.H"
+#include "areaFields.H"
+#include "faceSetOption.H"
+#include "faCFD.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class externalHeatFluxSource Declaration
+\*---------------------------------------------------------------------------*/
+
+class externalHeatFluxSource
+:
+    public faceSetOption
+{
+public:
+
+    // Public Enumeration
+
+        //- Options for the heat transfer condition mode
+        enum operationMode
+        {
+            fixedPower,                 //!< Fixed heat power [W]
+            fixedHeatFlux,              //!< Fixed heat flux [W/m2]
+            fixedHeatTransferCoeff,     //!< Fixed heat transfer coefficient
+        };
+
+        //- Names for operationMode
+        static const Enum<operationMode> operationModeNames;
+
+
+private:
+
+    // Private Data
+
+        //- Operation mode
+        operationMode mode_;
+
+        //- Name of temperature field
+        word TName_;
+
+        //- Heat power [W]
+        scalar Q_;
+
+        //- Heat flux [W/m2]
+        scalar q_;
+
+        //- Heat transfer coefficient [W/m2K]
+        scalar h_;
+
+        //- Ambient temperature [K]
+        autoPtr<Function1<scalar>> Ta_;
+
+        //- Optional surface emissivity for radiative transfer to ambient
+        scalar emissivity_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("externalHeatFluxSource");
+
+
+    // Constructors
+
+         //- Construct from explicit source name and mesh
+        externalHeatFluxSource
+        (
+            const word& sourceName,
+            const word& modelType,
+            const dictionary& dict,
+            const fvPatch& patch
+        );
+
+        //- No copy construct
+        externalHeatFluxSource(const externalHeatFluxSource&) = delete;
+
+        //- No copy assignment
+        void operator=(const externalHeatFluxSource&) = delete;
+
+
+    //- Destructor
+    virtual ~externalHeatFluxSource() = default;
+
+
+    // Member Functions
+
+        // Evaluation
+
+            //- Add explicit contribution to compressible momentum equation
+            virtual void addSup
+            (
+                const areaScalarField& h,
+                const areaScalarField& rho,
+                faMatrix<scalar>& eqn,
+                const label fieldi
+            );
+
+
+        // IO
+
+            //- Read source dictionary
+            virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fa
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.C b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.C
new file mode 100644
index 00000000000..2d9cfc63218
--- /dev/null
+++ b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.C
@@ -0,0 +1,193 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "jouleHeatingSource.H"
+#include "faMatrices.H"
+#include "faCFD.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+    defineTypeNameAndDebug(jouleHeatingSource, 0);
+    addToRunTimeSelectionTable(option, jouleHeatingSource, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fa::jouleHeatingSource::jouleHeatingSource
+(
+    const word& sourceName,
+    const word& modelType,
+    const dictionary& dict,
+    const fvPatch& patch
+)
+:
+    faceSetOption(sourceName, modelType, dict, patch),
+    TName_(dict.getOrDefault<word>("T", "T")),
+    V_
+    (
+        IOobject
+        (
+            typeName + ":V_" + regionName_,
+            mesh().time().timeName(),
+            mesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh()
+    ),
+    scalarSigmaVsTPtr_(nullptr),
+    tensorSigmaVsTPtr_(nullptr),
+    curTimeIndex_(-1),
+    nIter_(1),
+    anisotropicElectricalConductivity_(false)
+{
+    fieldNames_.setSize(1, TName_);
+
+    applied_.setSize(fieldNames_.size(), false);
+
+    if (anisotropicElectricalConductivity_)
+    {
+        Info<< "    Using tensor electrical conductivity" << endl;
+
+        initialiseSigma(coeffs_, tensorSigmaVsTPtr_);
+    }
+    else
+    {
+        Info<< "    Using scalar electrical conductivity" << endl;
+
+        initialiseSigma(coeffs_, scalarSigmaVsTPtr_);
+    }
+
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::fa::jouleHeatingSource::addSup
+(
+    const areaScalarField& h,
+    const areaScalarField& rho,
+    faMatrix<scalar>& eqn,
+    const label fieldi
+)
+{
+    if (isActive())
+    {
+        DebugInfo<< name() << ": applying source to " << eqn.psi().name()
+                 << endl;
+
+        if (curTimeIndex_ != mesh().time().timeIndex())
+        {
+            for (label i = 0; i < nIter_; ++i)
+            {
+                if (anisotropicElectricalConductivity_)
+                {
+                    // Update sigma as a function of T if required
+                    const areaTensorField& sigma =
+                        updateSigma(tensorSigmaVsTPtr_);
+
+                    // Solve the electrical potential equation
+                    faScalarMatrix VEqn(fam::laplacian(h*sigma, V_));
+                    VEqn.relax();
+                    VEqn.solve();
+                }
+                else
+                {
+                    // Update sigma as a function of T if required
+                    const areaScalarField& sigma =
+                        updateSigma(scalarSigmaVsTPtr_);
+
+                    // Solve the electrical potential equation
+                    faScalarMatrix VEqn(fam::laplacian(h*sigma, V_));
+                    VEqn.relax();
+                    VEqn.solve();
+                }
+            }
+
+            curTimeIndex_ = mesh().time().timeIndex();
+        }
+
+        // Add the Joule heating contribution
+        areaVectorField gradV("gradV", fac::grad(V_));
+
+        if (anisotropicElectricalConductivity_)
+        {
+            const auto& sigma =
+                mesh_.lookupObject<areaTensorField>
+                (
+                    typeName + ":sigma_" + regionName_
+                );
+
+            eqn += (h*sigma & gradV) & gradV;
+        }
+        else
+        {
+            const auto& sigma =
+                mesh_.lookupObject<areaScalarField>
+                (
+                    typeName + ":sigma_" + regionName_
+                );
+
+            eqn += (h*sigma*gradV) & gradV;
+
+            if (mesh().time().outputTime() && debug)
+            {
+                areaScalarField qgradV("gradVSource", (gradV & gradV));
+                qgradV.write();
+            }
+        }
+    }
+}
+
+
+bool Foam::fa::jouleHeatingSource::read(const dictionary& dict)
+{
+    if (option::read(dict))
+    {
+        dict.readIfPresent("T", TName_);
+
+        dict.readIfPresent("nIter", nIter_);
+
+        anisotropicElectricalConductivity_ =
+            dict.get<bool>("anisotropicElectricalConductivity");
+
+        return true;
+    }
+
+    return false;
+}
+
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.H b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.H
new file mode 100644
index 00000000000..4a5a279a145
--- /dev/null
+++ b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.H
@@ -0,0 +1,265 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::fa::jouleHeatingSource
+
+Group
+    grpFaOptionsSources
+
+Description
+    Evolves an electrical potential equation
+
+    \f[
+        \grad \left( \sigma \grad V \right)
+    \f]
+
+    where \f$ V \f$ is electrical potential
+    and \f$\sigma\f$ is the electrical current.
+
+    To provide a Joule heating contribution according to:
+
+    Differential form of Joule heating - power per unit volume:
+
+    \f[
+        \frac{d(P)}{d(V)} = J \cdot E
+    \f]
+
+    where \f$ J \f$ is the current density and \f$ E \f$ the electric field.
+    If no magnetic field is present:
+
+    \f[
+        J = \sigma E
+    \f]
+
+    The electric field given by
+
+    \f[
+        E = \grad V
+    \f]
+
+    Therefore:
+
+    \f[
+        \frac{d(P)}{d(V)} = J \cdot E
+                          = (sigma E) \cdot E
+                          = (sigma \grad V) \cdot \grad V
+    \f]
+
+Usage
+    Minimal example by using \c constant/faOptions:
+    \verbatim
+    jouleHeatingSource1
+    {
+        // Mandatory entries (unmodifiable)
+        type                 jouleHeatingSource;
+
+        // Mandatory entries (runtime modifiable)
+        anisotropicElectricalConductivity true;
+
+        // Optional entries (runtime modifiable)
+        T                   <Tname>;
+        nIter               -1;
+
+        // Conditional mandatory entries (runtime modifiable)
+
+            // when the entry "sigma" is present
+            sigma           <Function1>;
+
+            // when when the entry "sigma" is not present
+            // read "sigma" from file
+
+        // Mandatory/Optional (inherited) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property  | Description                       | Type  | Reqd | Dflt
+      type      | Type name: jouleHeatingSource     | word  | yes  | -
+      anisotropicElectricalConductivity | Flag to indicate that <!--
+                --> if the electrical conductivity is anisotropic <!--
+                -->                                 | bool  | yes  | -
+      T         | Name of operand temperature field | word  | no   | T
+      sigma     | Electrical conductivity as a function of temperature <!--
+                -->                                 | table | no   | -
+      nIter     | Number of iterations for electrical potential equation <!--
+                --> solution                        | label | no   | -1
+    \endtable
+
+    The inherited entries are elaborated in:
+     - \link faOption.H \endlink
+     - \link faceSetOption.H \endlink
+
+Note
+  - \c anisotropicElectricalConductivity=true enables
+  anisotropic (tensorial) electrical conductivity.
+  - \c anisotropicElectricalConductivity=false enables
+  isotropic (scalar) electrical conductivity.
+  - The electrical conductivity can be specified using either:
+    - If the \c sigma entry is present the electrical conductivity is specified
+    as a function of temperature using a \c Function1 type.
+    - If not present the \c sigma field will be read from file.
+    - If the \c anisotropicElectricalConductivity flag is set to \c true,
+    \c sigma should be specified as a tensor quantity.
+
+See also
+  - Foam::Function1
+
+SourceFiles
+    jouleHeatingSource.C
+    jouleHeatingSourceTemplates.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fa_jouleHeatingSource_H
+#define fa_jouleHeatingSource_H
+
+#include "faOption.H"
+#include "Function1.H"
+#include "areaFields.H"
+#include "faceSetOption.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fa
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class jouleHeatingSource Declaration
+\*---------------------------------------------------------------------------*/
+
+class jouleHeatingSource
+:
+    public faceSetOption
+{
+    // Private Data
+
+        //- Name of temperature field
+        word TName_;
+
+        //- Electrical potential field / [V]
+        areaScalarField V_;
+
+        //- Electrical conductivity as a scalar function of temperature
+        autoPtr<Function1<scalar>> scalarSigmaVsTPtr_;
+
+        //- Electrical conductivity as a tensor function of temperature
+        autoPtr<Function1<tensor>> tensorSigmaVsTPtr_;
+
+        //- Current time index (used for updating)
+        label curTimeIndex_;
+
+        //- Number of iterations for electrical potential equation solution
+        label nIter_;
+
+        //- Flag to indicate that the electrical conductivity is anisotropic
+        bool anisotropicElectricalConductivity_;
+
+
+    // Private Member Functions
+
+        //- Initialise the electrical conductivity field
+        template<class Type>
+        void initialiseSigma
+        (
+            const dictionary& dict,
+            autoPtr<Function1<Type>>& sigmaVsTPtr
+        );
+
+        //- Update the electrical conductivity field
+        template<class Type>
+        const GeometricField<Type, faPatchField, areaMesh>&
+        updateSigma(const autoPtr<Function1<Type>>& sigmaVsTPtr) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("jouleHeatingSource");
+
+
+    // Constructors
+
+        //- Construct from explicit source name and mesh
+        jouleHeatingSource
+        (
+            const word& sourceName,
+            const word& modelType,
+            const dictionary& dict,
+            const fvPatch& patch
+        );
+
+        //- No copy construct
+        jouleHeatingSource(const jouleHeatingSource&) = delete;
+
+        //- No copy assignment
+        void operator=(const jouleHeatingSource&) = delete;
+
+
+    //- Destructor
+    virtual ~jouleHeatingSource() = default;
+
+
+    // Member Functions
+
+        // Evaluation
+
+            //- Add explicit contribution to compressible momentum equation
+            virtual void addSup
+            (
+                const areaScalarField& h,
+                const areaScalarField& rho,
+                faMatrix<scalar>& eqn,
+                const label fieldi
+            );
+
+
+        // IO
+
+            //- Read source dictionary
+            virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fa
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "jouleHeatingSourceTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSourceTemplates.C b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSourceTemplates.C
new file mode 100644
index 00000000000..55f8b8da199
--- /dev/null
+++ b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSourceTemplates.C
@@ -0,0 +1,140 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "emptyFaPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type>
+void Foam::fa::jouleHeatingSource::initialiseSigma
+(
+    const dictionary& dict,
+    autoPtr<Function1<Type>>& sigmaVsTPtr
+)
+{
+    typedef GeometricField<Type, faPatchField, areaMesh> AreaFieldType;
+
+    if (dict.found("sigma"))
+    {
+        // Sigma to be defined using a Function1 type
+        sigmaVsTPtr = Function1<Type>::New("sigma", dict);
+
+        auto tsigma = tmp<AreaFieldType>::New
+        (
+            IOobject
+            (
+                typeName + ":sigma_" + regionName_,
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::AUTO_WRITE
+            ),
+            regionMesh(),
+            dimensioned<Type>(sqr(dimCurrent)/dimPower/dimLength, Zero)
+        );
+
+        mesh_.objectRegistry::store(tsigma.ptr());
+
+        Info<< "    Conductivity 'sigma' read from dictionary as f(T)"
+            << nl << endl;
+    }
+    else
+    {
+        // Sigma to be defined by user input
+        auto tsigma = tmp<AreaFieldType>::New
+        (
+            IOobject
+            (
+                typeName + ":sigma_" + regionName_,
+                mesh().time().timeName(),
+                mesh(),
+                IOobject::MUST_READ,
+                IOobject::AUTO_WRITE
+            ),
+            regionMesh()
+        );
+
+        mesh().objectRegistry::store(tsigma.ptr());
+
+        Info<< "    Conductivity 'sigma' read from file" << nl << endl;
+    }
+}
+
+
+template<class Type>
+const Foam::GeometricField<Type, Foam::faPatchField, Foam::areaMesh>&
+Foam::fa::jouleHeatingSource::updateSigma
+(
+    const autoPtr<Function1<Type>>& sigmaVsTPtr
+) const
+{
+    typedef GeometricField<Type, faPatchField, areaMesh> AreaFieldType;
+
+    auto& sigma =
+        mesh().lookupObjectRef<AreaFieldType>
+        (
+            typeName + ":sigma_" + regionName_
+        );
+
+    if (!sigmaVsTPtr.valid())
+    {
+        // Electrical conductivity field, sigma, was specified by the user
+        return sigma;
+    }
+
+    const auto& T = mesh().lookupObject<areaScalarField>(TName_);
+
+    // Internal field
+    forAll(sigma, i)
+    {
+        sigma[i] = sigmaVsTPtr->value(T[i]);
+    }
+
+
+    // Boundary field
+    typename AreaFieldType::Boundary& bf = sigma.boundaryFieldRef();
+    forAll(bf, patchi)
+    {
+        faPatchField<Type>& pf = bf[patchi];
+        if (!isA<emptyFaPatch>(bf[patchi]))
+        {
+            const scalarField& Tbf = T.boundaryField()[patchi];
+            forAll(pf, facei)
+            {
+                pf[facei] = sigmaVsTPtr->value(Tbf[facei]);
+            }
+        }
+    }
+
+    // Update processor patches
+    sigma.correctBoundaryConditions();
+
+    return sigma;
+}
+
+
+// ************************************************************************* //
diff --git a/src/finiteArea/Make/files b/src/finiteArea/Make/files
index 631570b62c0..a61dab59417 100644
--- a/src/finiteArea/Make/files
+++ b/src/finiteArea/Make/files
@@ -48,7 +48,8 @@ $(derivedFaPatchFields)/fixedValueOutflow/fixedValueOutflowFaPatchFields.C
 $(derivedFaPatchFields)/inletOutlet/inletOutletFaPatchFields.C
 $(derivedFaPatchFields)/slip/slipFaPatchFields.C
 $(derivedFaPatchFields)/edgeNormalFixedValue/edgeNormalFixedValueFaPatchVectorField.C
-$(derivedFaPatchFields)/uniformFixedValue/uniformFixedValueFaPatchFields.C
+$(derivedFaPatchFields)/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C
+$(derivedFaPatchFields)/clampedPlate/clampedPlateFaPatchFields.C
 
 faePatchFields = fields/faePatchFields
 $(faePatchFields)/faePatchField/faePatchFields.C
@@ -81,6 +82,7 @@ $(schemes)/upwind/upwindEdgeInterpolationMake.C
 $(schemes)/linearUpwind/linearUpwindEdgeInterpolationMake.C
 $(schemes)/Gamma/GammaEdgeInterpolationMake.C
 $(schemes)/blended/blendedEdgeInterpolationMake.C
+$(schemes)/skewCorrected/skewCorrectedEdgeInterpolationMake.C
 
 finiteArea/fa/fa.C
 finiteArea/faSchemes/faSchemes.C
diff --git a/src/finiteArea/faMesh/faPatches/faPatch/faPatch.C b/src/finiteArea/faMesh/faPatches/faPatch/faPatch.C
index 2c954b2eea8..52f7a3ba624 100644
--- a/src/finiteArea/faMesh/faPatches/faPatch/faPatch.C
+++ b/src/finiteArea/faMesh/faPatches/faPatch/faPatch.C
@@ -343,8 +343,8 @@ Foam::tmp<Foam::vectorField> Foam::faPatch::ngbPolyPatchPointNormals() const
 
     const labelListList& pntEdges = pointEdges();
 
-    tmp<vectorField> tpN(new vectorField(pntEdges.size(), Zero));
-    vectorField& pN = tpN.ref();
+    auto tpN = tmp<vectorField>::New(pntEdges.size(), Zero);
+    auto& pN = tpN.ref();
 
     const vectorField faceNormals(ngbPolyPatchFaceNormals());
 
@@ -406,8 +406,8 @@ Foam::tmp<Foam::vectorField> Foam::faPatch::edgeNormals() const
 
 Foam::tmp<Foam::vectorField> Foam::faPatch::edgeFaceCentres() const
 {
-    tmp<vectorField> tfc(new vectorField(size()));
-    vectorField& fc = tfc.ref();
+    auto tfc = tmp<vectorField>::New(size());
+    auto& fc = tfc.ref();
 
     // get reference to global face centres
     const vectorField& gfc =
@@ -427,13 +427,22 @@ Foam::tmp<Foam::vectorField> Foam::faPatch::edgeFaceCentres() const
 Foam::tmp<Foam::vectorField> Foam::faPatch::delta() const
 {
     return edgeNormals()*(edgeNormals() & (edgeCentres() - edgeFaceCentres()));
-    //return edgeCentres() - edgeFaceCentres();
 }
 
 
 void Foam::faPatch::makeDeltaCoeffs(scalarField& dc) const
 {
-    dc = 1.0/(edgeNormals() & delta());
+    dc = scalar(1)/(edgeNormals() & delta());
+}
+
+
+void Foam::faPatch::makeCorrectionVectors(vectorField& k) const
+{
+    vectorField unitDelta(delta()/mag(delta()));
+    vectorField edgeNormMag(edgeNormals()/mag(edgeNormals()));
+    scalarField dn(edgeNormals() & delta());
+
+    k = edgeNormMag - (scalar(1)/(unitDelta & edgeNormMag))*unitDelta;
 }
 
 
@@ -445,7 +454,7 @@ const Foam::scalarField& Foam::faPatch::deltaCoeffs() const
 
 void Foam::faPatch::makeWeights(scalarField& w) const
 {
-    w = 1.0;
+    w = scalar(1);
 }
 
 
diff --git a/src/finiteArea/faMesh/faPatches/faPatch/faPatch.H b/src/finiteArea/faMesh/faPatches/faPatch/faPatch.H
index a3d6239faa5..52fb33e613a 100644
--- a/src/finiteArea/faMesh/faPatches/faPatch/faPatch.H
+++ b/src/finiteArea/faMesh/faPatches/faPatch/faPatch.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -35,7 +36,9 @@ Author
 
 SourceFiles
     faPatch.C
-    newFaPatch.C
+    faPatchNew.C
+    faPatchTemplates.C
+    faPatchFaMeshTemplates.C
 
 \*---------------------------------------------------------------------------*/
 
@@ -68,9 +71,7 @@ class faPatch
     public labelList,
     public patchIdentifier
 {
-private:
-
-    // Private data
+    // Private Data
 
         //- Neighbour polyPatch index
         const label ngbPolyPatchIndex_;
@@ -106,6 +107,8 @@ private:
 
 protected:
 
+    // Protected Member Functions
+
         //- The faPatch geometry initialisation is called by faBoundaryMesh
         friend class faBoundaryMesh;
 
@@ -143,7 +146,6 @@ public:
 
     typedef faBoundaryMesh BoundaryMesh;
 
-
     //- Runtime type information
     TypeName("patch");
 
@@ -189,7 +191,7 @@ public:
         faPatch(const faPatch&, const faBoundaryMesh&);
 
         //- Construct and return a clone, resetting the edge list
-        //  and boundary mesh
+        //- and boundary mesh
         virtual autoPtr<faPatch> clone
         (
             const faBoundaryMesh& bm,
@@ -207,7 +209,7 @@ public:
     // Selectors
 
         //- Return a pointer to a new patch created
-        // on freestore from dictionary
+        //- on freestore from dictionary
         static autoPtr<faPatch> New
         (
             const word& name,
@@ -320,6 +322,8 @@ public:
             //- Make patch edge - neighbour face distances
             virtual void makeDeltaCoeffs(scalarField&) const;
 
+            void makeCorrectionVectors(vectorField&) const;
+
             //- Return patch edge - neighbour face distances
             const scalarField& deltaCoeffs() const;
 
@@ -330,7 +334,7 @@ public:
             void resetEdges(const labelList&);
 
 
-        // Evaluation functions
+        // Evaluation
 
             //- Return given internal field next to patch as patch field
             template<class Type>
@@ -344,7 +348,7 @@ public:
             ) const;
 
             //- Lookup and return the patchField of the named field from the
-            //  local objectRegistry.
+            //- local objectRegistry.
             //  N.B.  The dummy pointer arguments are used if this function is
             //  instantiated within a templated function to avoid a bug in gcc.
             //  See inletOutletFvPatchField.C and outletInletFvPatchField.C
diff --git a/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.C b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.C
new file mode 100755
index 00000000000..d4f257b80e7
--- /dev/null
+++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.C
@@ -0,0 +1,179 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "clampedPlateFaPatchField.H"
+#include "areaFields.H"
+#include "uniformDimensionedFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+clampedPlateFaPatchField<Type>::clampedPlateFaPatchField
+(
+    const faPatch& p,
+    const DimensionedField<Type, areaMesh>& iF
+)
+:
+    faPatchField<Type>(p, iF)
+{}
+
+
+template<class Type>
+clampedPlateFaPatchField<Type>::clampedPlateFaPatchField
+(
+    const faPatch& p,
+    const DimensionedField<Type, areaMesh>& iF,
+    const dictionary& dict
+)
+:
+    faPatchField<Type>(p, iF)
+{
+    faPatchField<Type>::operator=(this->patchInternalField());
+}
+
+
+template<class Type>
+clampedPlateFaPatchField<Type>::clampedPlateFaPatchField
+(
+    const clampedPlateFaPatchField<Type>& ptf,
+    const faPatch& p,
+    const DimensionedField<Type, areaMesh>& iF,
+    const faPatchFieldMapper& mapper
+)
+:
+    faPatchField<Type>(ptf, p, iF, mapper)
+{}
+
+
+template<class Type>
+clampedPlateFaPatchField<Type>::clampedPlateFaPatchField
+(
+    const clampedPlateFaPatchField<Type>& ptf
+)
+:
+    faPatchField<Type>(ptf)
+{}
+
+
+template<class Type>
+clampedPlateFaPatchField<Type>::clampedPlateFaPatchField
+(
+    const clampedPlateFaPatchField<Type>& ptf,
+    const DimensionedField<Type, areaMesh>& iF
+)
+:
+    faPatchField<Type>(ptf, iF)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+void clampedPlateFaPatchField<Type>::evaluate(const Pstream::commsTypes)
+{
+    notImplemented(type() + "::evaluate(const Pstream::commsType)");
+}
+
+
+template<>
+void clampedPlateFaPatchField<scalar>::evaluate(const Pstream::commsTypes)
+{
+    if (!this->updated())
+    {
+        this->updateCoeffs();
+    }
+
+    Field<scalar>::operator=(pTraits<scalar>::zero);
+
+    const labelUList& edgeFaces = this->patch().edgeFaces();
+    forAll(edgeFaces, edgeID)
+    {
+        label faceID = edgeFaces[edgeID];
+        const_cast<Field<scalar>&>(this->primitiveField())[faceID] =
+            pTraits<scalar>::zero;
+    }
+
+    faPatchField<scalar>::evaluate();
+}
+
+
+template<class Type>
+tmp<Field<Type> > clampedPlateFaPatchField<Type>::valueInternalCoeffs
+(
+    const tmp<scalarField>&
+) const
+{
+    return tmp<Field<Type>>
+        (new Field<Type>(this->size(), pTraits<Type>::zero));
+}
+
+
+template<class Type>
+tmp<Field<Type> > clampedPlateFaPatchField<Type>::valueBoundaryCoeffs
+(
+    const tmp<scalarField>&
+) const
+{
+    return *this;
+}
+
+
+template<class Type>
+tmp<Field<Type> >
+clampedPlateFaPatchField<Type>::gradientInternalCoeffs() const
+{
+    return -Type(pTraits<Type>::one)*this->patch().deltaCoeffs();
+}
+
+
+template<class Type>
+tmp<Field<Type> >
+clampedPlateFaPatchField<Type>::gradientBoundaryCoeffs() const
+{
+    return this->patch().deltaCoeffs()*(*this);
+}
+
+
+template<class Type>
+void clampedPlateFaPatchField<Type>::write(Ostream& os) const
+{
+    faPatchField<Type>::write(os);
+    this->writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.H b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.H
new file mode 100755
index 00000000000..4178ffb782f
--- /dev/null
+++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.H
@@ -0,0 +1,214 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::clampedPlateFaPatchField
+
+Description
+    This BC provides a clamped BC. It sets zero fixe value and zeroGradient.
+
+Usage
+    Example of the boundary condition specification:
+    \verbatim
+    <patchName>
+    {
+        // Mandatory entries (unmodifiable)
+        type                clampedPlate;
+
+        // Mandatory/Optional (inherited) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property | Description               | Type  | Reqd | Dflt
+      type     | Type name: clampedPlate   | word  | yes  | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link faPatchFields.H \endlink
+
+SourceFiles
+    clampedPlateFaPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef clampedPlateFaPatchField_H
+#define clampedPlateFaPatchField_H
+
+#include "faPatchField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class clampedPlateFaPatch Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class clampedPlateFaPatchField
+:
+    public faPatchField<Type>
+{
+public:
+
+    //- Runtime type information
+    TypeName("clampedPlate");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        clampedPlateFaPatchField
+        (
+            const faPatch&,
+            const DimensionedField<Type, areaMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        clampedPlateFaPatchField
+        (
+            const faPatch&,
+            const DimensionedField<Type, areaMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping the given clampedPlateFaPatchField<Type>
+        //- onto a new patch
+        clampedPlateFaPatchField
+        (
+            const clampedPlateFaPatchField<Type>&,
+            const faPatch&,
+            const DimensionedField<Type, areaMesh>&,
+            const faPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        clampedPlateFaPatchField
+        (
+            const clampedPlateFaPatchField<Type>&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<faPatchField<Type>> clone() const
+        {
+            return tmp<faPatchField<Type>>
+            (
+                new clampedPlateFaPatchField<Type>(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        clampedPlateFaPatchField
+        (
+            const clampedPlateFaPatchField<Type>&,
+            const DimensionedField<Type, areaMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<faPatchField<Type> > clone
+        (
+            const DimensionedField<Type, areaMesh>& iF
+        ) const
+        {
+            return tmp<faPatchField<Type> >
+            (
+                new clampedPlateFaPatchField<Type>(*this, iF)
+            );
+        }
+
+
+     //- Destructor
+    virtual ~clampedPlateFaPatchField()
+    {}
+
+
+    // Member Functions
+
+        // Evaluation
+
+            //- Return gradient at boundary
+            virtual tmp<Field<Type>> snGrad() const
+            {
+                return tmp<Field<Type>>
+                (
+                    new Field<Type>(this->size(), Zero)
+                );
+            }
+
+            //- Evaluate the patch field
+            virtual void evaluate
+            (
+                const Pstream::commsTypes commsType=Pstream::commsTypes::blocking
+            );
+
+            //- Return the matrix diagonal coefficients corresponding to the
+            //- evaluation of the value of this patchField with given weights
+            virtual tmp<Field<Type> > valueInternalCoeffs
+            (
+                const tmp<scalarField>&
+            ) const;
+
+            //- Return the matrix source coefficients corresponding to the
+            //- evaluation of the value of this patchField with given weights
+            virtual tmp<Field<Type> > valueBoundaryCoeffs
+            (
+                const tmp<scalarField>&
+            ) const;
+
+            //- Return the matrix diagonal coefficients corresponding to the
+            //- evaluation of the gradient of this patchField
+            virtual tmp<Field<Type> > gradientInternalCoeffs() const;
+
+            //- Return the matrix source coefficients corresponding to the
+            //- evaluation of the gradient of this patchField
+            virtual tmp<Field<Type> > gradientBoundaryCoeffs() const;
+
+
+        // IO
+
+            //- Write
+            virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "clampedPlateFaPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.C b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.C
old mode 100644
new mode 100755
similarity index 95%
rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.C
rename to src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.C
index 0647d784cc4..a2bb02c72d6
--- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.C
+++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.C
@@ -21,11 +21,11 @@ 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/>.
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>
 
 \*---------------------------------------------------------------------------*/
 
-#include "uniformFixedValueFaPatchFields.H"
+#include "clampedPlateFaPatchFields.H"
 #include "addToRunTimeSelectionTable.H"
 #include "areaFields.H"
 
@@ -36,7 +36,7 @@ namespace Foam
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
-makeFaPatchFields(uniformFixedValue);
+makeFaPatchFields(clampedPlate);
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.H b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.H
old mode 100644
new mode 100755
similarity index 90%
rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.H
rename to src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.H
index 17b020ae6dd..4a3a0549074
--- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.H
+++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.H
@@ -21,14 +21,14 @@ 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/>.
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef uniformFixedValueFaPatchFields_H
-#define uniformFixedValueFaPatchFields_H
+#ifndef clampedPlateFaPatchFields_H
+#define clampedPlateFaPatchFields_H
 
-#include "uniformFixedValueFaPatchField.H"
+#include "clampedPlateFaPatchField.H"
 #include "fieldTypes.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -38,7 +38,7 @@ namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-makeFaPatchTypeFieldTypedefs(uniformFixedValue)
+makeFaPatchTypeFieldTypedefs(clampedPlate)
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFieldsFwd.H b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFieldsFwd.H
new file mode 100755
index 00000000000..949f510afc3
--- /dev/null
+++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFieldsFwd.H
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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/>
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef clampedPlateFaPatchFieldsFwd_H
+#define clampedPlateFaPatchFieldsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class clampedPlateFaPatchField;
+
+makeFaPatchTypeFieldTypedefs(clampedPlate)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.C b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.C
similarity index 65%
rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.C
rename to src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.C
index 4de3a60c888..1bba29333b6 100644
--- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.C
+++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2020 OpenCFD Ltd.
+    Copyright (C) 2016-2017 Wikki Ltd
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -25,24 +25,27 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "uniformFixedValueFaPatchField.H"
+#include "timeVaryingUniformFixedValueFaPatchField.H"
+#include "Time.H"
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 template<class Type>
-Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField
+Foam::timeVaryingUniformFixedValueFaPatchField<Type>::
+timeVaryingUniformFixedValueFaPatchField
 (
     const faPatch& p,
     const DimensionedField<Type, areaMesh>& iF
 )
 :
     fixedValueFaPatchField<Type>(p, iF),
-    uniformValue_(nullptr)
+    timeSeries_()
 {}
 
 
 template<class Type>
-Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField
+Foam::timeVaryingUniformFixedValueFaPatchField<Type>::
+timeVaryingUniformFixedValueFaPatchField
 (
     const faPatch& p,
     const DimensionedField<Type, areaMesh>& iF,
@@ -50,83 +53,85 @@ Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField
 )
 :
     fixedValueFaPatchField<Type>(p, iF),
-    uniformValue_(Function1<Type>::New("uniformValue", dict))
+    timeSeries_(dict)
 {
    if (dict.found("value"))
    {
-       faPatchField<Type>::operator==
-       (
-           Field<Type>("value", dict, p.size())
-       );
+       faPatchField<Type>::operator==(Field<Type>("value", dict, p.size()));
    }
    else
    {
-       this->evaluate();
+       updateCoeffs();
    }
 }
 
 
 template<class Type>
-Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField
+Foam::timeVaryingUniformFixedValueFaPatchField<Type>::
+timeVaryingUniformFixedValueFaPatchField
 (
-    const uniformFixedValueFaPatchField<Type>& ptf,
+    const timeVaryingUniformFixedValueFaPatchField<Type>& ptf,
     const faPatch& p,
     const DimensionedField<Type, areaMesh>& iF,
     const faPatchFieldMapper& mapper
 )
 :
     fixedValueFaPatchField<Type>(ptf, p, iF, mapper),
-    uniformValue_(ptf.uniformValue_.clone())
+    timeSeries_(ptf.timeSeries_)
 {}
 
 
 template<class Type>
-Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField
+Foam::timeVaryingUniformFixedValueFaPatchField<Type>::
+timeVaryingUniformFixedValueFaPatchField
 (
-    const uniformFixedValueFaPatchField<Type>& ptf
+    const timeVaryingUniformFixedValueFaPatchField<Type>& ptf
 )
 :
     fixedValueFaPatchField<Type>(ptf),
-    uniformValue_(ptf.uniformValue_.clone())
+    timeSeries_(ptf.timeSeries_)
 {}
 
 
 template<class Type>
-Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField
+Foam::timeVaryingUniformFixedValueFaPatchField<Type>::
+timeVaryingUniformFixedValueFaPatchField
 (
-    const uniformFixedValueFaPatchField<Type>& ptf,
+    const timeVaryingUniformFixedValueFaPatchField<Type>& ptf,
     const DimensionedField<Type, areaMesh>& iF
 )
 :
     fixedValueFaPatchField<Type>(ptf, iF),
-    uniformValue_(ptf.uniformValue_.clone())
+    timeSeries_(ptf.timeSeries_)
 {}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class Type>
-void Foam::uniformFixedValueFaPatchField<Type>::updateCoeffs()
+void Foam::timeVaryingUniformFixedValueFaPatchField<Type>::updateCoeffs()
 {
     if (this->updated())
     {
         return;
     }
 
-    const scalar t = this->db().time().timeOutputValue();
-    faPatchField<Type>::operator==(uniformValue_->value(t));
+    faPatchField<Type>::operator==
+    (
+        timeSeries_(this->db().time().timeOutputValue())
+    );
     fixedValueFaPatchField<Type>::updateCoeffs();
 }
 
 
 template<class Type>
-void Foam::uniformFixedValueFaPatchField<Type>::write
+void Foam::timeVaryingUniformFixedValueFaPatchField<Type>::write
 (
     Ostream& os
 ) const
 {
     faPatchField<Type>::write(os);
-    uniformValue_->writeData(os);
+    timeSeries_.write(os);
     this->writeEntry("value", os);
 }
 
diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.H b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.H
similarity index 56%
rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.H
rename to src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.H
index cf75c75e166..70154cc728a 100644
--- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.H
+++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.H
@@ -5,6 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
+    Copyright (C) 2016-2017 Wikki Ltd
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -24,42 +25,59 @@ License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
 Class
-    Foam::uniformFixedValueFaPatchField
+    Foam::timeVaryingUniformFixedValueFaPatchField
 
 Description
-    This finiteArea boundary condition
-    provides a uniform fixed value condition, which can also be time-varying.
+    A time-varying form of a uniform fixed value finite area
+    boundary condition.
 
 Usage
-    \table
-        Property     | Description                  | Required | Default
-        uniformValue | uniform value                | yes |
-    \endtable
-
     Example of the boundary condition specification:
     \verbatim
     <patchName>
     {
-        type            uniformFixedValue;
-        uniformValue    constant 0.2;
+        // Mandatory entries (unmodifiable)
+        type                timeVaryingUniformFixedValue;
+        fileName            "<case>/time-series";
+        outOfBounds         clamp;           // (error|warn|clamp|repeat)
+
+        // Mandatory/Optional (inherited) entries
+        ...
     }
     \endverbatim
 
+    where the entries mean:
+    \table
+      Property | Description                             | Type  | Reqd | Dflt
+      type     | Type name: timeVaryingUniformFixedValue | word  | yes  | -
+      fileName | Name of operand file                    | word  | yes  | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link faPatchFields.H \endlink
+
+Author
+    Zeljko Tukovic, FMENA
+    Hrvoje Jasak, Wikki Ltd.
+
+Note
+    This class is derived directly from a fixedValue patch rather than from
+    a uniformFixedValue patch.
+
 See also
-    Foam::Function1Types
-    Foam::fixedValueFvPatchField
-    Foam::uniformFixedValueFvPatchField.C
+  - Foam::interpolationTable
+  - Foam::fixedValueFaPatchField
 
 SourceFiles
-    uniformFixedValueFaPatchField.C
+    timeVaryingUniformFixedValueFaPatchField.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef uniformFixedValueFaPatchField_H
-#define uniformFixedValueFaPatchField_H
+#ifndef timeVaryingUniformFixedValueFaPatchField_H
+#define timeVaryingUniformFixedValueFaPatchField_H
 
 #include "fixedValueFaPatchField.H"
-#include "Function1.H"
+#include "interpolationTable.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -67,56 +85,56 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                  Class uniformFixedValueFaPatch Declaration
+             Class timeVaryingUniformFixedValueFaPatch Declaration
 \*---------------------------------------------------------------------------*/
 
 template<class Type>
-class uniformFixedValueFaPatchField
+class timeVaryingUniformFixedValueFaPatchField
 :
     public fixedValueFaPatchField<Type>
 {
     // Private Data
 
-        //- Value
-        autoPtr<Function1<Type>> uniformValue_;
+        //- The time series being used, including the bounding treatment
+        interpolationTable<Type> timeSeries_;
 
 
 public:
 
     //- Runtime type information
-    TypeName("uniformFixedValue");
+    TypeName("timeVaryingUniformFixedValue");
 
 
     // Constructors
 
         //- Construct from patch and internal field
-        uniformFixedValueFaPatchField
+        timeVaryingUniformFixedValueFaPatchField
         (
             const faPatch&,
             const DimensionedField<Type, areaMesh>&
         );
 
         //- Construct from patch, internal field and dictionary
-        uniformFixedValueFaPatchField
+        timeVaryingUniformFixedValueFaPatchField
         (
             const faPatch&,
             const DimensionedField<Type, areaMesh>&,
             const dictionary&
         );
 
-        //- Construct by mapping onto a new patch
-        uniformFixedValueFaPatchField
+        //- Construct by mapping given patch field onto a new patch
+        timeVaryingUniformFixedValueFaPatchField
         (
-            const uniformFixedValueFaPatchField<Type>&,
+            const timeVaryingUniformFixedValueFaPatchField<Type>&,
             const faPatch&,
             const DimensionedField<Type, areaMesh>&,
             const faPatchFieldMapper&
         );
 
-        //- Copy construct
-        uniformFixedValueFaPatchField
+        //- Construct as copy
+        timeVaryingUniformFixedValueFaPatchField
         (
-            const uniformFixedValueFaPatchField<Type>&
+            const timeVaryingUniformFixedValueFaPatchField<Type>&
         );
 
         //- Construct and return a clone
@@ -124,14 +142,14 @@ public:
         {
             return tmp<faPatchField<Type>>
             (
-                new uniformFixedValueFaPatchField<Type>(*this)
+                new timeVaryingUniformFixedValueFaPatchField<Type>(*this)
             );
         }
 
         //- Construct as copy setting internal field reference
-        uniformFixedValueFaPatchField
+        timeVaryingUniformFixedValueFaPatchField
         (
-            const uniformFixedValueFaPatchField<Type>&,
+            const timeVaryingUniformFixedValueFaPatchField<Type>&,
             const DimensionedField<Type, areaMesh>&
         );
 
@@ -143,22 +161,36 @@ public:
         {
             return tmp<faPatchField<Type>>
             (
-                new uniformFixedValueFaPatchField<Type>(*this, iF)
+                new timeVaryingUniformFixedValueFaPatchField<Type>(*this, iF)
             );
         }
 
 
     //- Destructor
-    virtual ~uniformFixedValueFaPatchField() = default;
+    virtual ~timeVaryingUniformFixedValueFaPatchField() = default;
 
 
     // Member Functions
 
-        //- Update the coefficients associated with the patch field
-        virtual void updateCoeffs();
+        // Access
+
+            //- Return the time series used
+            const interpolationTable<Type>& timeSeries() const
+            {
+                return timeSeries_;
+            }
+
+
+        // Evaluation
+
+            //- Update the coefficients associated with the patch field
+            virtual void updateCoeffs();
+
+
+        // IO
 
-        //- Write
-        virtual void write(Ostream& os) const;
+            //- Write
+            virtual void write(Ostream&) const;
 };
 
 
@@ -169,7 +201,7 @@ public:
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #ifdef NoRepository
-    #include "uniformFixedValueFaPatchField.C"
+    #include "timeVaryingUniformFixedValueFaPatchField.C"
 #endif
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C
new file mode 100644
index 00000000000..fa19e8c9d89
--- /dev/null
+++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "timeVaryingUniformFixedValueFaPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+#include "areaFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makeFaPatchFields(timeVaryingUniformFixedValue);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.H b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.H
new file mode 100644
index 00000000000..46bfc57c736
--- /dev/null
+++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.H
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef timeVaryingUniformFixedValueFaPatchFields_H
+#define timeVaryingUniformFixedValueFaPatchFields_H
+
+#include "timeVaryingUniformFixedValueFaPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makeFaPatchTypeFieldTypedefs(timeVaryingUniformFixedValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFieldsFwd.H b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFieldsFwd.H
new file mode 100644
index 00000000000..6691ec7fc24
--- /dev/null
+++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFieldsFwd.H
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef timeVaryingUniformFixedValueFaPatchFieldsFwd_H
+#define timeVaryingUniformFixedValueFaPatchFieldsFwd_H
+
+#include "faPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class timeVaryingUniformFixedValueFaPatchField;
+
+makeFaPatchTypeFieldTypedefs(timeVaryingUniformFixedValue);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteArea/fields/faPatchFields/faPatchField/faPatchField.H b/src/finiteArea/fields/faPatchFields/faPatchField/faPatchField.H
index 3818dcb2ffa..389510504c9 100644
--- a/src/finiteArea/fields/faPatchFields/faPatchField/faPatchField.H
+++ b/src/finiteArea/fields/faPatchFields/faPatchField/faPatchField.H
@@ -81,7 +81,7 @@ class faPatchField
 :
     public Field<Type>
 {
-    // Private data
+    // Private Data
 
         //- Reference to a patch
         const faPatch& patch_;
@@ -94,8 +94,8 @@ class faPatchField
         bool updated_;
 
         //- Optional patch type, used to allow specified boundary conditions
-        //  to be applied to constraint patches by providing the constraint
-        //  patch type as 'patchType'
+        //- to be applied to constraint patches by providing the constraint
+        //- patch type as 'patchType'
         word patchType_;
 
 
@@ -217,7 +217,7 @@ public:
     // Selectors
 
         //- Return a pointer to a new patchField created on freestore given
-        //  patch and internal field
+        //- patch and internal field
         //  (does not set the patch field values)
         static tmp<faPatchField<Type>> New
         (
@@ -228,7 +228,7 @@ public:
         );
 
         //- Return a pointer to a new patchField created on freestore given
-        //  patch and internal field
+        //- patch and internal field
         //  (does not set the patch field values)
         static tmp<faPatchField<Type>> New
         (
@@ -238,7 +238,7 @@ public:
         );
 
         //- Return a pointer to a new patchField created on freestore from
-        //  a given faPatchField mapped onto a new patch
+        //- a given faPatchField mapped onto a new patch
         static tmp<faPatchField<Type>> New
         (
             const faPatchField<Type>&,
@@ -248,7 +248,7 @@ public:
         );
 
         //- Return a pointer to a new patchField created on freestore
-        //  from dictionary
+        //- from dictionary
         static tmp<faPatchField<Type>> New
         (
             const faPatch&,
@@ -257,7 +257,7 @@ public:
         );
 
         //- Return a pointer to a new calculatedFaPatchField created on
-        //  freestore without setting patchField values
+        //- freestore without setting patchField values
         template<class Type2>
         static tmp<faPatchField<Type>> NewCalculatedType
         (
@@ -269,7 +269,7 @@ public:
     virtual ~faPatchField<Type>() = default;
 
 
-    // Member functions
+    // Member Functions
 
         // Access
 
@@ -330,7 +330,7 @@ public:
             }
 
 
-        // Mapping functions
+        // Mapping
 
             //- Map (and resize as needed) from self given a mapping object
             virtual void autoMap
@@ -346,7 +346,7 @@ public:
             );
 
 
-        // Evaluation functions
+        // Evaluation
 
             //- Return patch-normal gradient
             virtual tmp<Field<Type>> snGrad() const;
@@ -383,9 +383,8 @@ public:
                     Pstream::commsTypes::blocking
             );
 
-
             //- Return the matrix diagonal coefficients corresponding to the
-            //  evaluation of the value of this patchField with given weights
+            //- evaluation of the value of this patchField with given weights
             virtual tmp<Field<Type>> valueInternalCoeffs
             (
                 const tmp<Field<scalar>>&
@@ -396,7 +395,7 @@ public:
             }
 
             //- Return the matrix source coefficients corresponding to the
-            //  evaluation of the value of this patchField with given weights
+            //- evaluation of the value of this patchField with given weights
             virtual tmp<Field<Type>> valueBoundaryCoeffs
             (
                 const tmp<Field<scalar>>&
@@ -407,7 +406,7 @@ public:
             }
 
             //- Return the matrix diagonal coefficients corresponding to the
-            //  evaluation of the gradient of this patchField
+            //- evaluation of the gradient of this patchField
             virtual tmp<Field<Type>> gradientInternalCoeffs() const
             {
                 NotImplemented;
@@ -415,7 +414,7 @@ public:
             }
 
             //- Return the matrix source coefficients corresponding to the
-            //  evaluation of the gradient of this patchField
+            //- evaluation of the gradient of this patchField
             virtual tmp<Field<Type>> gradientBoundaryCoeffs() const
             {
                 NotImplemented;
@@ -423,8 +422,10 @@ public:
             }
 
 
-        //- Write
-        virtual void write(Ostream&) const;
+        // IO
+
+            //- Write
+            virtual void write(Ostream&) const;
 
 
         // Check
@@ -433,7 +434,7 @@ public:
             void check(const faPatchField<Type>&) const;
 
 
-    // Member operators
+    // Member Operators
 
         virtual void operator=(const UList<Type>&);
 
diff --git a/src/finiteArea/fields/faPatchFields/faPatchField/faPatchFieldNew.C b/src/finiteArea/fields/faPatchFields/faPatchField/faPatchFieldNew.C
index 55768d7d6c2..04550acbb1c 100644
--- a/src/finiteArea/fields/faPatchFields/faPatchField/faPatchFieldNew.C
+++ b/src/finiteArea/fields/faPatchFields/faPatchField/faPatchFieldNew.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2016-2017 Wikki Ltd
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -37,7 +37,12 @@ Foam::tmp<Foam::faPatchField<Type>> Foam::faPatchField<Type>::New
     const DimensionedField<Type, areaMesh>& iF
 )
 {
-    DebugInFunction << "Constructing faPatchField<Type>" << endl;
+    DebugInFunction
+        << "Constructing faPatchField<Type> "
+        << "patchFieldType:" << patchFieldType
+        << "actualPatchType:" << actualPatchType
+        << "p.Type():" << p.type()
+        << endl;
 
     auto cstrIter = patchConstructorTablePtr_->cfind(patchFieldType);
 
diff --git a/src/finiteArea/finiteArea/fam/famSup.C b/src/finiteArea/finiteArea/fam/famSup.C
index ec63e51f196..b0ad234b9a1 100644
--- a/src/finiteArea/finiteArea/fam/famSup.C
+++ b/src/finiteArea/finiteArea/fam/famSup.C
@@ -165,9 +165,19 @@ SuSp
     );
     faMatrix<Type>& fam = tfam.ref();
 
-    fam.diag() += mesh.S()*max(sp.internalField(), scalar(0));
+   fam.diag() +=
+        mesh.S()*max
+        (
+            sp.internalField(),
+            dimensionedScalar("0", sp.dimensions(), Zero)
+        );
 
-    fam.source() -= mesh.S()*min(sp.internalField(), scalar(0))
+    fam.source() -=
+        mesh.S()*min
+        (
+            sp.internalField(),
+            dimensionedScalar("0", sp.dimensions(), Zero)
+        )
         *vf.internalField();
 
     return tfam;
diff --git a/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolate.C b/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolate.C
index 15a284e1b94..54dcd271b14 100644
--- a/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolate.C
+++ b/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolate.C
@@ -281,6 +281,7 @@ Foam::fac::interpolate
     tmp<GeometricField<Type, faePatchField, edgeMesh>> tsf =
         interpolate(tvf());
     tvf.clear();
+
     return tsf;
 }
 
diff --git a/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolation.C b/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolation.C
index dbfe6c04321..9e14d5cbb6d 100644
--- a/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolation.C
+++ b/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolation.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -47,8 +48,6 @@ void Foam::edgeInterpolation::clearOut()
     deleteDemandDrivenData(differenceFactors_);
     deleteDemandDrivenData(correctionVectors_);
     deleteDemandDrivenData(skewCorrectionVectors_);
-//     deleteDemandDrivenData(leastSquarePvectors_);
-//     deleteDemandDrivenData(leastSquareNvectors_);
 }
 
 
@@ -64,8 +63,6 @@ Foam::edgeInterpolation::edgeInterpolation(const faMesh& fam)
     correctionVectors_(nullptr),
     skew_(true),
     skewCorrectionVectors_(nullptr)
-//     leastSquarePvectors_(nullptr),
-//     leastSquareNvectors_(nullptr)
 {}
 
 
@@ -161,30 +158,6 @@ Foam::edgeInterpolation::skewCorrectionVectors() const
 }
 
 
-// const Foam::edgeVectorField&
-// Foam::edgeInterpolation::leastSquarePvectors() const
-// {
-//     if (!leastSquarePvectors_)
-//     {
-//         makeLeastSquareVectors();
-//     }
-//
-//     return (*leastSquarePvectors_);
-// }
-
-
-// const Foam::edgeVectorField&
-// Foam::edgeInterpolation::leastSquareNvectors() const
-// {
-//     if (!leastSquareNvectors_)
-//     {
-//         makeLeastSquareVectors();
-//     }
-//
-//     return (*leastSquareNvectors_);
-// }
-
-
 bool Foam::edgeInterpolation::movePoints() const
 {
     deleteDemandDrivenData(lPN_);
@@ -197,9 +170,6 @@ bool Foam::edgeInterpolation::movePoints() const
     skew_ = true;
     deleteDemandDrivenData(skewCorrectionVectors_);
 
-//     deleteDemandDrivenData(leastSquarePvectors_);
-//     deleteDemandDrivenData(leastSquareNvectors_);
-
     return true;
 }
 
@@ -527,10 +497,12 @@ void Foam::edgeInterpolation::makeCorrectionVectors() const
           - deltaCoeffs[edgeI]*unitDelta;
     }
 
+
     edgeVectorField::Boundary& CorrVecsbf = CorrVecs.boundaryFieldRef();
-    for (faePatchVectorField& patchCorrVecs : CorrVecsbf)
+
+    forAll(CorrVecs.boundaryField(), patchI)
     {
-        patchCorrVecs = vector::zero;
+        mesh().boundary()[patchI].makeCorrectionVectors(CorrVecsbf[patchI]);
     }
 
     scalar NonOrthogCoeff = 0.0;
diff --git a/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolation.H b/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolation.H
new file mode 100644
index 00000000000..da63c64444d
--- /dev/null
+++ b/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolation.H
@@ -0,0 +1,219 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::skewCorrectedEdgeInterpolation
+
+Description
+    Linear/upwind blended differencing scheme
+
+SourceFiles
+    skewCorrectedEdgeInterpolationMake.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef skewCorrectedEdgeInterpolation_H
+#define skewCorrectedEdgeInterpolation_H
+
+#include "edgeInterpolationScheme.H"
+#include "linearEdgeInterpolation.H"
+#include "gaussFaGrad.H"
+#include "areaFields.H"
+#include "zeroGradientFaPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                 Class skewCorrectedEdgeInterpolation Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class skewCorrectedEdgeInterpolation
+:
+    virtual public edgeInterpolationScheme<Type>
+{
+    // Private Data
+
+        tmp<edgeInterpolationScheme<Type>> tScheme_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("skewCorrected");
+
+
+    // Constructors
+
+        //- Construct from Istream
+        skewCorrectedEdgeInterpolation(const faMesh& mesh, Istream& is)
+        :
+            edgeInterpolationScheme<Type>(mesh),
+            tScheme_
+            (
+                edgeInterpolationScheme<Type>::New(mesh, is)
+            )
+        {}
+
+        //- Construct from mesh, faceFlux and blendingFactor
+        skewCorrectedEdgeInterpolation
+        (
+            const faMesh& mesh,
+            const edgeScalarField& faceFlux,
+            Istream& is
+        )
+        :
+            edgeInterpolationScheme<Type>(mesh),
+            tScheme_
+            (
+                edgeInterpolationScheme<Type>::New(mesh, faceFlux, is)
+            )
+        {}
+
+        //- No copy construct
+        skewCorrectedEdgeInterpolation(const skewCorrectedEdgeInterpolation&) =
+            delete;
+
+        //- No copy assignment
+        void operator=(const skewCorrectedEdgeInterpolation&) = delete;
+
+
+    // Member Functions
+
+        //- Return the interpolation weighting factors
+        virtual tmp<edgeScalarField> weights
+        (
+            const GeometricField<Type, faPatchField, areaMesh>& vf
+        ) const
+        {
+            return tScheme_().weights(vf);
+        }
+
+         //- Return true if this scheme uses an explicit correction
+        virtual bool corrected() const
+        {
+            return
+                tScheme_().corrected() || (this->mesh()).skew();
+        }
+
+        tmp<GeometricField<Type, faePatchField, edgeMesh>>
+        skewCorrection
+        (
+            const GeometricField<Type, faPatchField, areaMesh>& vf
+        ) const
+        {
+            const faMesh& mesh = this->mesh();
+
+            const edgeVectorField& scv = mesh.skewCorrectionVectors();
+
+            tmp<GeometricField<Type, faePatchField, edgeMesh>> tsfCorr
+            (
+                new GeometricField<Type, faePatchField, edgeMesh>
+                (
+                    IOobject
+                    (
+                        "skewCorrected::skewCorrection(" + vf.name() + ')',
+                        vf.instance(),
+                        vf.db()
+                    ),
+                    mesh,
+                    dimensioned<Type>(vf.dimensions(), Zero)
+                )
+            );
+
+            GeometricField<Type, faePatchField, edgeMesh>& corr = tsfCorr.ref();
+
+            for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; ++cmpt)
+            {
+                corr.replace
+                (
+                    cmpt,
+                    scv & linearEdgeInterpolation
+                    <
+                        typename outerProduct
+                        <
+                            vector,
+                            typename pTraits<Type>::cmptType
+                        >::type
+                    >(mesh).interpolate
+                    (
+                        fa::gaussGrad<typename pTraits<Type>::cmptType>
+                        (mesh).grad(vf.component(cmpt))
+                    )
+                );
+            }
+
+            return tsfCorr;
+        }
+
+
+        //- Return the explicit correction to the face-interpolate
+        virtual tmp<GeometricField<Type, faePatchField, edgeMesh>>
+        correction
+        (
+            const GeometricField<Type, faPatchField, areaMesh>& vf
+        ) const
+        {
+            if
+            (
+                tScheme_().corrected()
+             && (this->mesh()).skew()
+            )
+            {
+                return tScheme_().correction(vf) + skewCorrection(vf);
+            }
+            else if (tScheme_().corrected())
+            {
+                return tScheme_().correction(vf);
+            }
+            else if ((this->mesh()).skew())
+            {
+                return skewCorrection(vf);
+            }
+            else
+            {
+                return
+                    tmp<GeometricField<Type, faePatchField, edgeMesh>>
+                    (
+                        nullptr
+                    );
+            }
+        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolationMake.C b/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolationMake.C
new file mode 100644
index 00000000000..70c9e674621
--- /dev/null
+++ b/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolationMake.C
@@ -0,0 +1,39 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "faMesh.H"
+#include "skewCorrectedEdgeInterpolation.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    makeEdgeInterpolationScheme(skewCorrectedEdgeInterpolation)
+}
+
+// ************************************************************************* //
diff --git a/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.C b/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.C
index 4f814a9cd49..e8123536495 100644
--- a/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.C
+++ b/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2016-2017 Wikki Ltd
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -38,11 +39,8 @@ Foam::tmp<Foam::Field<Type>> Foam::volSurfaceMapping::mapToSurface
     // Grab labels for all faces in faMesh
     const labelList& faceLabels = mesh_.faceLabels();
 
-    tmp<Field<Type>> tresult
-    (
-        new Field<Type>(faceLabels.size(), Zero)
-    );
-    Field<Type>& result = tresult.ref();
+    auto tresult = tmp<Field<Type>>::New(faceLabels.size(), Zero);
+    auto& result = tresult.ref();
 
     // Get reference to volume mesh
     const polyMesh& pMesh = mesh_();
@@ -67,6 +65,41 @@ Foam::tmp<Foam::Field<Type>> Foam::volSurfaceMapping::mapToSurface
 }
 
 
+template<class Type>
+Foam::tmp<Foam::Field<Type>> Foam::volSurfaceMapping::mapInternalToSurface
+(
+    const typename GeometricField<Type, fvPatchField, volMesh>::Boundary& df
+) const
+{
+    // Grab labels for all faces in faMesh
+    const labelList& faceLabels = mesh_.faceLabels();
+
+    auto tresult = tmp<Field<Type>>::New(faceLabels.size(), Zero);
+    auto& result = tresult.ref();
+
+    // Get reference to volume mesh
+    const polyMesh& pMesh = mesh_();
+    const polyBoundaryMesh& bm = pMesh.boundaryMesh();
+
+    label patchID, faceID;
+
+    // Grab droplet cloud source by identifying patch and face
+    forAll(faceLabels, i)
+    {
+        // Escape if face is beyond active faces, eg belongs to a face zone
+        if (faceLabels[i] < pMesh.nFaces())
+        {
+            patchID = bm.whichPatch(faceLabels[i]);
+            faceID = bm[patchID].whichFace(faceLabels[i]);
+
+            result[i] = df[patchID].patchInternalField()()[faceID];
+        }
+    }
+
+    return tresult;
+}
+
+
 template<class Type>
 void Foam::volSurfaceMapping::mapToVolume
 (
@@ -103,7 +136,7 @@ template<class Type>
 void Foam::volSurfaceMapping::mapToVolume
 (
     const tmp<GeometricField<Type, faPatchField, areaMesh>>& taf,
-     typename GeometricField<Type, fvPatchField, volMesh>::Boundary& bf
+    typename GeometricField<Type, fvPatchField, volMesh>::Boundary& bf
 ) const
 {
     mapToVolume(taf(), bf);
@@ -112,4 +145,31 @@ void Foam::volSurfaceMapping::mapToVolume
 }
 
 
+template<class Type>
+void Foam::volSurfaceMapping::mapToField
+(
+    const GeometricField<Type, faPatchField, areaMesh>& af,
+    Field<Type>& f
+) const
+{
+    const labelList& faceLabels = mesh_.faceLabels();
+
+    const polyMesh& pMesh = mesh_();
+    const polyBoundaryMesh& bm = pMesh.boundaryMesh();
+    label patchID, faceID;
+
+    const Field<Type>& afi = af.internalField();
+
+    forAll(faceLabels, i)
+    {
+        if (faceLabels[i] < pMesh.nFaces())
+        {
+            patchID = bm.whichPatch(faceLabels[i]);
+            faceID = bm[patchID].whichFace(faceLabels[i]);
+            f[faceID] = afi[i];
+        }
+    }
+}
+
+
 // ************************************************************************* //
diff --git a/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.H b/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.H
index 43f7be6e6e1..5b428f099c1 100644
--- a/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.H
+++ b/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2016-2017 Wikki Ltd
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -56,21 +56,12 @@ template<class Type> class fvPatchField;
 
 class volSurfaceMapping
 {
-    // Private data
+    // Private Data
 
         //- Reference to mesh
         const faMesh& mesh_;
 
 
-    // Private Member Functions
-
-        //- No copy construct
-        volSurfaceMapping(const volSurfaceMapping&) = delete;
-
-        //- No copy assignment
-        void operator=(const volSurfaceMapping&) = delete;
-
-
 public:
 
     // Constructors
@@ -81,6 +72,12 @@ public:
             mesh_(mesh)
         {}
 
+        //- No copy construct
+        volSurfaceMapping(const volSurfaceMapping&) = delete;
+
+        //- No copy assignment
+        void operator=(const volSurfaceMapping&) = delete;
+
 
     //- Destructor
     ~volSurfaceMapping() = default;
@@ -96,6 +93,15 @@ public:
             GeometricField<Type, fvPatchField, volMesh>::Boundary& df
         ) const;
 
+
+        //- Map patch internal field to surface
+        template<class Type>
+        tmp<Field<Type>> mapInternalToSurface
+        (
+            const typename
+            GeometricField<Type, fvPatchField, volMesh>::Boundary& df
+        ) const;
+
         //- Map surface field to volume boundary field
         template<class Type>
         void mapToVolume
@@ -104,12 +110,22 @@ public:
             typename GeometricField<Type, fvPatchField, volMesh>::Boundary& bf
         ) const;
 
+        //- Map surface tmp field to volume boundary field
         template<class Type>
         void mapToVolume
         (
             const tmp<GeometricField<Type, faPatchField, areaMesh>>& taf,
             typename GeometricField<Type, fvPatchField, volMesh>::Boundary& bf
         ) const;
+
+        //- Map surface field to field assumes Field
+        //- faces in the same order as Boundary
+        template<class Type>
+        void mapToField
+        (
+            const GeometricField<Type, faPatchField, areaMesh>& af,
+            Field<Type>& f
+        ) const;
 };
 
 
diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files
index b4db8e8f3b3..1f175aafaa4 100644
--- a/src/finiteVolume/Make/files
+++ b/src/finiteVolume/Make/files
@@ -227,6 +227,7 @@ $(derivedFvPatchFields)/fixedProfile/fixedProfileFvPatchFields.C
 $(derivedFvPatchFields)/plenumPressure/plenumPressureFvPatchScalarField.C
 $(derivedFvPatchFields)/interfaceCompression/interfaceCompressionFvPatchScalarField.C
 $(derivedFvPatchFields)/swirlFanVelocity/swirlFanVelocityFvPatchField.C
+$(derivedFvPatchFields)/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C
 
 $(derivedFvPatchFields)/mappedMixed/mappedMixedFvPatchFields.C
 $(derivedFvPatchFields)/mappedField/Sampled/makeSampledPatchFunction1s.C
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.C
new file mode 100644
index 00000000000..9ebb26fbd5f
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.C
@@ -0,0 +1,119 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "acousticWaveTransmissiveFvPatchField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFieldMapper.H"
+#include "volFields.H"
+#include "EulerDdtScheme.H"
+#include "CrankNicolsonDdtScheme.H"
+#include "backwardDdtScheme.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    advectiveFvPatchField<Type>(p, iF),
+    advectiveU_(0)
+{}
+
+
+template<class Type>
+Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField
+(
+    const acousticWaveTransmissiveFvPatchField& ptf,
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    advectiveFvPatchField<Type>(ptf, p, iF, mapper),
+    advectiveU_(ptf.advectiveU_)
+{}
+
+
+template<class Type>
+Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    advectiveFvPatchField<Type>(p, iF, dict),
+    advectiveU_(dict.get<scalar>("advectiveSpeed"))
+{}
+
+
+template<class Type>
+Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField
+(
+    const acousticWaveTransmissiveFvPatchField& ptpsf
+)
+:
+    advectiveFvPatchField<Type>(ptpsf),
+    advectiveU_(ptpsf.advectiveU_)
+{}
+
+
+template<class Type>
+Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField
+(
+    const acousticWaveTransmissiveFvPatchField& ptpsf,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    advectiveFvPatchField<Type>(ptpsf, iF),
+    advectiveU_(ptpsf.advectiveU_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::tmp<Foam::scalarField>
+Foam::acousticWaveTransmissiveFvPatchField<Type>::advectionSpeed() const
+{
+    return tmp<scalarField>::New(this->size(), advectiveU_);
+}
+
+
+template<class Type>
+void Foam::acousticWaveTransmissiveFvPatchField<Type>::write(Ostream& os) const
+{
+    fvPatchField<Type>::write(os);
+    os.writeEntry("advectiveSpeed", advectiveU_);
+    this->writeEntry("value", os);
+}
+
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.H
new file mode 100644
index 00000000000..f0f31cfefb3
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.H
@@ -0,0 +1,192 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::acousticWaveTransmissiveFvPatchField
+
+Group
+    grpOutletBoundaryConditions
+
+Description
+    This boundary condition provides a wave transmissive outflow condition,
+    based on solving DDt(W, field) = 0 at the boundary \c W is the wave velocity
+    and \c field is the field to which this boundary condition is applied.
+    The wave speed is input in the BC.
+
+Usage
+    Example of the boundary condition specification:
+    \verbatim
+    <patchName>
+    {
+        // Mandatory entries (unmodifiable)
+        type                acousticWaveTransmissive;
+        advectiveSpeed      50.0;
+
+        // Mandatory/Optional (inherited) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property | Description                          | Type  | Reqd | Dflt
+      type     | Type name: acousticWaveTransmissive  | word  | yes  | -
+      advectiveSpeed | Advective speed value          | scalar | yes | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link advectiveFvPatchField.H \endlink
+
+See also
+  - Foam::advectiveFvPatchFields
+
+SourceFiles
+    acousticWaveTransmissiveFvPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef acousticWaveTransmissiveFvPatchField_H
+#define acousticWaveTransmissiveFvPatchField_H
+
+#include "advectiveFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                Class acousticWaveTransmissiveFvPatchField Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class acousticWaveTransmissiveFvPatchField
+:
+    public advectiveFvPatchField<Type>
+{
+    // Private Data
+
+        //- Advection speed value
+        scalar advectiveU_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("acousticWaveTransmissive");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        acousticWaveTransmissiveFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        acousticWaveTransmissiveFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given acousticWaveTransmissiveFvPatchField
+        //- onto a new patch
+        acousticWaveTransmissiveFvPatchField
+        (
+            const acousticWaveTransmissiveFvPatchField<Type>&,
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        acousticWaveTransmissiveFvPatchField
+        (
+            const acousticWaveTransmissiveFvPatchField&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchField<Type>> clone() const
+        {
+            return tmp<fvPatchField<Type>>
+            (
+                new acousticWaveTransmissiveFvPatchField<Type>(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        acousticWaveTransmissiveFvPatchField
+        (
+            const acousticWaveTransmissiveFvPatchField&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchField<Type>> clone
+        (
+            const DimensionedField<Type, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchField<Type>>
+            (
+                new acousticWaveTransmissiveFvPatchField<Type>(*this, iF)
+            );
+        }
+
+
+    // Member Functions
+
+        // Evaluation
+
+            //- Calculate and return the advection speed at the boundary
+            virtual tmp<scalarField> advectionSpeed() const;
+
+
+        // IO
+
+            //- Write
+            virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "acousticWaveTransmissiveFvPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C
new file mode 100644
index 00000000000..c1c37ed4361
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "volFields.H"
+#include "surfaceFields.H"
+#include "acousticWaveTransmissiveFvPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePatchFields(acousticWaveTransmissive);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.H b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.H
new file mode 100644
index 00000000000..9c13ce1790f
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef acousticWaveTransmissiveFvPatchFields_H
+#define acousticWaveTransmissiveFvPatchFields_H
+
+#include "acousticWaveTransmissiveFvPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeFieldTypedefs(acousticWaveTransmissive);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFieldsFwd.H b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFieldsFwd.H
similarity index 88%
rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFieldsFwd.H
rename to src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFieldsFwd.H
index 9facb8dce2d..cf54c570983 100644
--- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFieldsFwd.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFieldsFwd.H
@@ -25,10 +25,9 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef uniformFixedValueFaPatchFieldsFwd_H
-#define uniformFixedValueFaPatchFieldsFwd_H
+#ifndef acousticWaveTransmissiveFvPatchFieldsFwd_H
+#define acousticWaveTransmissiveFvPatchFieldsFwd_H
 
-#include "faPatchField.H"
 #include "fieldTypes.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -38,9 +37,9 @@ namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-template<class Type> class uniformFixedValueFaPatchField;
+template<class Type> class acousticWaveTransmissiveFvPatchField;
 
-makeFaPatchTypeFieldTypedefs(uniformFixedValue);
+makePatchTypeFieldTypedefs(acousticWaveTransmissive);
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/regionFaModels/KirchhoffShell/KirchhoffShell.C b/src/regionFaModels/KirchhoffShell/KirchhoffShell.C
new file mode 100644
index 00000000000..577a5262e11
--- /dev/null
+++ b/src/regionFaModels/KirchhoffShell/KirchhoffShell.C
@@ -0,0 +1,319 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "KirchhoffShell.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFields.H"
+#include "zeroGradientFaPatchFields.H"
+#include "subCycle.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(KirchhoffShell, 0);
+
+addToRunTimeSelectionTable(vibrationShellModel, KirchhoffShell, dictionary);
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool KirchhoffShell::read(const dictionary& dict)
+{
+    this->solution().readEntry("nNonOrthCorr", nNonOrthCorr_);
+    return true;
+}
+
+
+void KirchhoffShell::solveDisplacement()
+{
+    if (debug)
+    {
+        InfoInFunction << endl;
+    }
+
+    const Time& time = primaryMesh().time();
+
+    areaScalarField solidMass(rho()*h_);
+    areaScalarField solidD(D()/solidMass);
+
+    // Save old times
+    areaScalarField w0(w_.oldTime());
+    areaScalarField w00(w_.oldTime().oldTime());
+
+    if (nSubCycles_ > 1)
+    {
+        // Restore the oldTime in sub-cycling
+        w_.oldTime() = w0_;
+        w_.oldTime().oldTime() = w00_;
+        laplaceW_.oldTime() = laplaceW0_;
+        laplace2W_.oldTime() = laplace2W0_;
+     }
+
+    for
+    (
+        subCycleTime wSubCycle
+        (
+            const_cast<Time&>(time),
+            nSubCycles_
+        );
+       !(++wSubCycle).end();
+    )
+    {
+
+        laplaceW_ = fac::laplacian(w_);
+        laplace2W_ = fac::laplacian(laplaceW_);
+
+        faScalarMatrix wEqn
+        (
+            fam::d2dt2(w_)
+         +  f1_*fam::ddt(w_)
+         -  f0_*sqrt(solidD)*fac::ddt(laplaceW_)
+         +  solidD*(laplace2W_ + f2_*fac::ddt(laplace2W_))
+        ==
+            ps_/solidMass
+          + faOptions()(solidMass, w_, dimLength/sqr(dimTime))
+        );
+
+        faOptions().constrain(wEqn);
+
+        wEqn.solve();
+
+        Info<< "w min/max   = " << min(w_) << ", " << max(w_) << endl;
+
+        if (wSubCycle.index() >= wSubCycle.nSubCycles())
+        {
+            // Cache oldTimes inside the sub-cycling
+            w0_ = w_.oldTime();
+            w00_ = w_.oldTime().oldTime();
+            laplaceW0_ = laplaceW_.oldTime();
+            laplace2W0_ = laplace2W_.oldTime();
+
+            // Update shell acceleration
+            a_ = fac::d2dt2(w_);
+        }
+    }
+
+    // Restore old time in main time
+    w_.oldTime() = w0;
+    w_.oldTime().oldTime() = w00;
+
+    faOptions().correct(w_);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+KirchhoffShell::KirchhoffShell
+(
+    const word& modelType,
+    const fvPatch& patch,
+    const dictionary& dict
+)
+:
+    vibrationShellModel(modelType, patch, dict),
+    f0_("f0", dimless, dict),
+    f1_("f1", inv(dimTime), dict),
+    f2_("f2", dimTime, dict),
+    nNonOrthCorr_(1),
+    nSubCycles_(1),
+    ps_
+    (
+        IOobject
+        (
+            "ps_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(dimPressure, Zero)
+    ),
+    h_
+    (
+        IOobject
+        (
+            "h_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh()
+    ),
+    laplaceW_
+    (
+        IOobject
+        (
+            "laplaceW_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(inv(dimLength), Zero)
+    ),
+    laplace2W_
+    (
+        IOobject
+        (
+            "laplace2W_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(inv(pow3(dimLength)), Zero)
+    ),
+    w0_
+    (
+        IOobject
+        (
+            "w0_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(dimLength, Zero)
+    ),
+    w00_
+    (
+         IOobject
+        (
+            "w00_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(dimLength, Zero)
+    ),
+    laplaceW0_
+    (
+         IOobject
+        (
+            "laplaceW0_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(inv(dimLength), Zero)
+    ),
+    laplace2W0_
+    (
+         IOobject
+        (
+            "laplace2W0_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(inv(pow3(dimLength)), Zero)
+    )
+{
+    init();
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void KirchhoffShell::init()
+{}
+
+
+void KirchhoffShell::preEvolveRegion()
+{}
+
+
+void KirchhoffShell::evolveRegion()
+{
+    nNonOrthCorr_ = solution().get<label>("nNonOrthCorr");
+    nSubCycles_ = solution().get<label>("nSubCycles");
+
+    for (int nonOrth=0; nonOrth<=nNonOrthCorr_; nonOrth++)
+    {
+        solveDisplacement();
+    }
+}
+
+
+const tmp<areaScalarField> KirchhoffShell::D() const
+{
+    const dimensionedScalar E("E", dimForce/dimArea , solid().E());
+    const dimensionedScalar nu("nu", dimless, solid().nu());
+
+    return tmp<areaScalarField>(E*pow3(h_)/(12*(1 - sqr(nu))));
+}
+
+
+const tmp<areaScalarField> KirchhoffShell::rho() const
+{
+    return tmp<areaScalarField>
+    (
+        new areaScalarField
+        (
+            IOobject
+            (
+                "rhos",
+                primaryMesh().time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            regionMesh(),
+            dimensionedScalar("rho", dimDensity, solid().rho()),
+            zeroGradientFaPatchScalarField::typeName
+        )
+    );
+}
+
+
+void KirchhoffShell::info()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/KirchhoffShell/KirchhoffShell.H b/src/regionFaModels/KirchhoffShell/KirchhoffShell.H
new file mode 100644
index 00000000000..0a7762bedb4
--- /dev/null
+++ b/src/regionFaModels/KirchhoffShell/KirchhoffShell.H
@@ -0,0 +1,217 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::regionFaModels::KirchhoffShell
+
+Description
+
+Usage
+    Example of the boundary condition specification:
+    \verbatim
+    <patchName>
+    {
+        // Mandatory/Optional (inherited) entries
+        ...
+
+        // Mandatory entries (unmodifiable)
+        vibrationShellModel   KirchhoffShell;
+        f0                    0.04;
+        f1                    0.0;
+        f2                    0.0;
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property   | Description                         | Type  | Reqd | Dflt
+      vibrationShellModel | Type name: KirchhoffShell  | word  | yes  | -
+      f0         | Damping coefficient [1/s]           | scalar | yes | -
+      f1         | Damping coefficient [1/s]           | scalar | yes | -
+      f2         | Damping coefficient [1/s]           | scalar | yes | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link vibrationShellModel.H \endlink
+
+SourceFiles
+    KirchhoffShell.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef KirchhoffShell_H
+#define KirchhoffShell_H
+
+#include "volFieldsFwd.H"
+#include "vibrationShellModel.H"
+#include "faMesh.H"
+#include "faCFD.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class KirchhoffShell Declaration
+\*---------------------------------------------------------------------------*/
+
+class KirchhoffShell
+:
+    public vibrationShellModel
+{
+    // Private Data
+
+        //- Damping coefficients [1/s]
+        dimensionedScalar f0_;
+        dimensionedScalar f1_;
+        dimensionedScalar f2_;
+
+
+    // Private Member Functions
+
+        //- Initialize KirchhoffShell
+        void init();
+
+
+protected:
+
+    // Protected Data
+
+        // Solution parameters
+
+            //- Number of non orthogonal correctors
+            label nNonOrthCorr_;
+
+            //- Sub cycles
+            label nSubCycles_;
+
+
+        // Source term fields
+
+            //- External surface source [Pa]
+            areaScalarField ps_;
+
+            //- Thickness [m]
+            areaScalarField h_;
+
+            //- Laplace of the displacement
+            areaScalarField laplaceW_;
+
+            //- Laplace of the Laplace for the displacement
+            areaScalarField laplace2W_;
+
+            //- Cache w.oldTime() in sub-cycling
+            areaScalarField w0_;
+
+            //- Cache w.oldTime.oldTime() in sub-cycling
+            areaScalarField w00_;
+
+            //- Cache laplaceW.oldTime() in sub-cycling
+            areaScalarField laplaceW0_;
+
+            //- Cache laplace2.oldTime() in sub-cycling
+            areaScalarField laplace2W0_;
+
+
+    // Protected Member Functions
+
+        //- Read control parameters from dictionary
+        virtual bool read(const dictionary& dict);
+
+
+        // Equations
+
+            //- Solve energy equation
+            void solveDisplacement();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("KirchhoffShell");
+
+
+    // Constructors
+
+        //- Construct from components and dict
+        KirchhoffShell
+        (
+            const word& modelType,
+            const fvPatch& patch,
+            const dictionary& dict
+        );
+
+        //- No copy construct
+        KirchhoffShell(const KirchhoffShell&) = delete;
+
+        //- No copy assignment
+        void operator=(const KirchhoffShell&) = delete;
+
+
+    //- Destructor
+    virtual ~KirchhoffShell() = default;
+
+
+    // Member Functions
+
+        // Fields
+
+            //- Return stiffness
+            const tmp<areaScalarField> D() const;
+
+            //- Return density [Kg/m3]
+            const tmp<areaScalarField> rho() const;
+
+
+        // Evolution
+
+            //- Pre-evolve  thermal baffle
+            virtual void preEvolveRegion();
+
+            //- Evolve the thermal baffle
+            virtual void evolveRegion();
+
+
+       // IO
+
+            //- Provide some feedback
+            virtual void info();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/Make/files b/src/regionFaModels/Make/files
new file mode 100644
index 00000000000..3a3b9a4addd
--- /dev/null
+++ b/src/regionFaModels/Make/files
@@ -0,0 +1,16 @@
+/* Region models */
+regionFaModel/regionFaModel.C
+thermalShellModel/thermalShellModel.C
+thermalShellModel/thermalShellModelNew.C
+vibrationShellModel/vibrationShellModel.C
+vibrationShellModel/vibrationShellModelNew.C
+
+/* Shell models */
+thermalShell/thermalShell.C
+KirchhoffShell/KirchhoffShell.C
+
+/* Boundary conditions */
+derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C
+derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C
+
+LIB = $(FOAM_LIBBIN)/libregionFaModels
diff --git a/src/regionFaModels/Make/options b/src/regionFaModels/Make/options
new file mode 100644
index 00000000000..cd4795b38d0
--- /dev/null
+++ b/src/regionFaModels/Make/options
@@ -0,0 +1,16 @@
+EXE_INC = \
+    -I$(LIB_SRC)/faOptions/lnInclude \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/finiteArea/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/thermophysicalProperties/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude
+
+LIB_LIBS = \
+    -lfiniteVolume \
+    -lfiniteArea \
+    -lmeshTools \
+    -lthermophysicalProperties \
+    -lspecie \
+    -lfaOptions
diff --git a/src/regionFaModels/derivedFvPatchFields/doc/thermalBaffleBoundaryConditionsDoc.H b/src/regionFaModels/derivedFvPatchFields/doc/thermalBaffleBoundaryConditionsDoc.H
new file mode 100644
index 00000000000..2ea5aee695f
--- /dev/null
+++ b/src/regionFaModels/derivedFvPatchFields/doc/thermalBaffleBoundaryConditionsDoc.H
@@ -0,0 +1,34 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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/>.
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+\defgroup grpThermoBaffleBoundaryConditions Thermo baffle boundary conditions
+@{
+    \ingroup grpThermoBoundaryConditions
+    This group contains thermo baffle model boundary conditions
+@}
+
+\*---------------------------------------------------------------------------*/
diff --git a/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C b/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C
new file mode 100644
index 00000000000..6b1db5d3bbf
--- /dev/null
+++ b/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "thermalShellFvPatchScalarField.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace compressible
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+thermalShellFvPatchScalarField::thermalShellFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<scalar>(p, iF),
+    baffle_(),
+    dict_(dictionary::null)
+{}
+
+
+thermalShellFvPatchScalarField::thermalShellFvPatchScalarField
+(
+    const thermalShellFvPatchScalarField& ptf,
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchField<scalar>
+    (
+        ptf,
+        p,
+        iF,
+        mapper
+    ),
+    baffle_(),
+    dict_(ptf.dict_)
+{}
+
+
+thermalShellFvPatchScalarField::thermalShellFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchField<scalar>(p, iF, dict),
+    baffle_(),
+    dict_(dict)
+{
+    typedef regionModels::thermalShellModel baffle;
+
+    if (!baffle_)
+    {
+        baffle_.reset(baffle::New(p, dict).ptr());
+    }
+}
+
+
+thermalShellFvPatchScalarField::thermalShellFvPatchScalarField
+(
+    const thermalShellFvPatchScalarField& ptf,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<scalar>(ptf, iF),
+    baffle_(),
+    dict_(ptf.dict_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void thermalShellFvPatchScalarField::updateCoeffs()
+{
+    if (this->updated())
+    {
+        return;
+    }
+
+    baffle_->evolve();
+
+    volScalarField::Boundary& vfb =
+        db().lookupObjectRef<volScalarField>
+        (
+            this->internalField().name()
+        ).boundaryFieldRef();
+
+    baffle_->vsm().mapToVolume(baffle_->T(), vfb);
+
+    fixedValueFvPatchField<scalar>::updateCoeffs();
+}
+
+
+void thermalShellFvPatchScalarField::write(Ostream& os) const
+{
+    fixedValueFvPatchField<scalar>::write(os);
+
+    // Remove value and type already written by fixedValueFvPatchField
+    dict_.remove("value");
+    dict_.remove("type");
+    dict_.write(os, false);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeField
+(
+    fvPatchScalarField,
+    thermalShellFvPatchScalarField
+);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace compressible
+} // End namespace Foam
+
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.H b/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.H
new file mode 100644
index 00000000000..4a9e01b52f3
--- /dev/null
+++ b/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.H
@@ -0,0 +1,184 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::compressible::thermalShellFvPatchScalarField
+
+Group
+    grpThermoBoundaryConditions
+
+Description
+    This boundary condition provides a coupled temperature condition between
+    a primary region (3D mesh) and a thermal shell model (2D mesh).
+
+    The primary region boundary creates the finite area region
+    and evolves its energy equation.
+
+Usage
+    Example of the boundary condition specification:
+    \verbatim
+    <masterPatchName>
+    {
+        // Mandatory entries (unmodifiable)
+        type                compressible::thermalShell;
+
+        // Mandatory/Optional (inherited) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property | Description                           | Type  | Reqd | Dflt
+      type     | Type name: compressible::thermalShell | word  | yes  | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link fixedValueFvPatchField.H \endlink
+      - \link thermalShellModel.H \endlink
+
+Note
+  - The two-dimensional area mesh needs to be
+    generated in the pre-processing steps.
+
+SourceFiles
+    thermalShellFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef thermalShellFvPatchScalarField_H
+#define thermalShellFvPatchScalarField_H
+
+#include "autoPtr.H"
+#include "thermalShellModel.H"
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace compressible
+{
+
+/*---------------------------------------------------------------------------*\
+             Class thermalShellFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class thermalShellFvPatchScalarField
+:
+    public fixedValueFvPatchField<scalar>
+{
+    // Private Data
+
+        //- Thermal baffle
+        autoPtr<regionModels::thermalShellModel> baffle_;
+
+        //- Dictionary
+        mutable dictionary dict_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("compressible::thermalShell");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        thermalShellFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        thermalShellFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //- thermalShellFvPatchScalarField onto a new patch
+        thermalShellFvPatchScalarField
+        (
+            const thermalShellFvPatchScalarField&,
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchScalarField> clone() const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new thermalShellFvPatchScalarField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        thermalShellFvPatchScalarField
+        (
+            const thermalShellFvPatchScalarField&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchScalarField> clone
+        (
+            const DimensionedField<scalar, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new thermalShellFvPatchScalarField(*this, iF)
+            );
+        }
+
+
+    // Member Functions
+
+        //- Update the coefficients associated with the patch field
+        virtual void updateCoeffs();
+
+        //- Write
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace compressible
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C b/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C
new file mode 100644
index 00000000000..8b91815f80c
--- /dev/null
+++ b/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C
@@ -0,0 +1,169 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "vibrationShellFvPatchScalarField.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+vibrationShellFvPatchScalarField::vibrationShellFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    mixedFvPatchField<scalar>(p, iF),
+    baffle_(),
+    dict_(dictionary::null)
+{
+    refValue() = 0;
+    refGrad() = 0;
+    valueFraction() = 1;
+}
+
+
+vibrationShellFvPatchScalarField::vibrationShellFvPatchScalarField
+(
+    const vibrationShellFvPatchScalarField& ptf,
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    mixedFvPatchField<scalar>
+    (
+        ptf,
+        p,
+        iF,
+        mapper
+    ),
+    baffle_(),
+    dict_(ptf.dict_)
+{}
+
+
+vibrationShellFvPatchScalarField::vibrationShellFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    mixedFvPatchField<scalar>(p, iF),
+    baffle_(),
+    dict_(dict)
+{
+    fvPatchScalarField::operator=(scalarField("value", dict, p.size()));
+
+    if (dict.found("refValue"))
+    {
+        // Full restart
+        refValue() = scalarField("refValue", dict, p.size());
+        refGrad() = scalarField("refGradient", dict, p.size());
+        valueFraction() = scalarField("valueFraction", dict, p.size());
+    }
+    else
+    {
+        // Start from user entered data. Assume fixedValue.
+        refValue() = *this;
+        refGrad() = 0;
+        valueFraction() = 1;
+    }
+
+    if (!baffle_)
+    {
+        baffle_.reset(regionModels::vibrationShellModel::New(p, dict).ptr());
+    }
+}
+
+
+vibrationShellFvPatchScalarField::vibrationShellFvPatchScalarField
+(
+    const vibrationShellFvPatchScalarField& ptf,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    mixedFvPatchField<scalar>(ptf, iF),
+    baffle_(),
+    dict_(ptf.dict_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void vibrationShellFvPatchScalarField::updateCoeffs()
+{
+    if (this->updated())
+    {
+        return;
+    }
+
+    baffle_->evolve();
+
+    const auto& transportProperties =
+        db().lookupObject<IOdictionary>("transportProperties");
+
+    dimensionedScalar rho("rho", dimDensity, transportProperties);
+
+    const areaScalarField aRho(rho*baffle_->a());
+
+    baffle_->vsm().mapToField(aRho, this->refGrad());
+
+    this->refValue() = Zero;
+    this->valueFraction() = Zero;
+
+    mixedFvPatchField<scalar>::updateCoeffs();
+}
+
+
+void vibrationShellFvPatchScalarField::write(Ostream& os) const
+{
+    mixedFvPatchField<scalar>::write(os);
+
+    dict_.write(os, false);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeField
+(
+    fvPatchScalarField,
+    vibrationShellFvPatchScalarField
+);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.H b/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.H
new file mode 100644
index 00000000000..ae742242c7e
--- /dev/null
+++ b/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.H
@@ -0,0 +1,172 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::compressible::vibrationShellFvPatchScalarField
+
+Group
+    grpVibrationBoundaryConditions
+
+Description
+
+Usage
+    Example of the boundary condition specification:
+    \verbatim
+    <masterPatchName>
+    {
+        // Mandatory entries (unmodifiable)
+        type                vibrationShell;
+
+        // Mandatory/Optional (inherited) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property | Description                      | Type  | Reqd | Dflt
+      type     | Type name: vibrationShell        | word  | yes  | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link mixedFvPatchField.H \endlink
+      - \link vibrationShellModel.H \endlink
+
+SourceFiles
+    vibrationShellFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef vibrationShellFvPatchScalarField_H
+#define vibrationShellFvPatchScalarField_H
+
+#include "autoPtr.H"
+#include "vibrationShellModel.H"
+#include "mixedFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+             Class vibrationShellFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class vibrationShellFvPatchScalarField
+:
+    public mixedFvPatchField<scalar>
+{
+    // Private Data
+
+        //- Thermal baffle
+        autoPtr<regionModels::vibrationShellModel> baffle_;
+
+        //- Dictionary
+        mutable dictionary dict_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("vibrationShell");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        vibrationShellFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        vibrationShellFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //- vibrationShellFvPatchScalarField onto a new patch
+        vibrationShellFvPatchScalarField
+        (
+            const vibrationShellFvPatchScalarField&,
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchScalarField> clone() const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new vibrationShellFvPatchScalarField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        vibrationShellFvPatchScalarField
+        (
+            const vibrationShellFvPatchScalarField&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchScalarField> clone
+        (
+            const DimensionedField<scalar, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new vibrationShellFvPatchScalarField(*this, iF)
+            );
+        }
+
+
+    // Member Functions
+
+        //- Update the coefficients associated with the patch field
+        virtual void updateCoeffs();
+
+        //- Write
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/regionFaModel/regionFaModel.C b/src/regionFaModels/regionFaModel/regionFaModel.C
new file mode 100644
index 00000000000..9a7078e036c
--- /dev/null
+++ b/src/regionFaModels/regionFaModel/regionFaModel.C
@@ -0,0 +1,172 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "regionFaModel.H"
+#include "faMesh.H"
+#include "Time.H"
+#include "mappedWallPolyPatch.H"
+#include "zeroGradientFvPatchFields.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+    defineTypeNameAndDebug(regionFaModel, 0);
+}
+}
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+void Foam::regionModels::regionFaModel::constructMeshObjects()
+{
+    regionMeshPtr_.reset
+    (
+        new faMesh(primaryMesh_)
+    );
+}
+
+
+void Foam::regionModels::regionFaModel::initialise()
+{
+    if (debug)
+    {
+        Pout<< "regionFaModel::initialise()" << endl;
+    }
+
+    vsmPtr_.reset(new volSurfaceMapping(regionMeshPtr_()));
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool Foam::regionModels::regionFaModel::read(const dictionary& dict)
+{
+    if (active_)
+    {
+        if (const dictionary* dictptr = dict.findDict(modelName_ + "Coeffs"))
+        {
+            coeffs_ <<= *dictptr;
+        }
+
+        infoOutput_.readIfPresent("infoOutput", dict);
+
+        return true;
+    }
+
+    return false;
+}
+
+
+// * * * * * * * * * * * * Public Member Functions  * * * * * * * * * * * //
+
+const Foam::volSurfaceMapping& Foam::regionModels::regionFaModel::vsm() const
+{
+    return vsmPtr_();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::regionModels::regionFaModel::regionFaModel
+(
+    const fvPatch& patch,
+    const word& regionType,
+    const word& modelName,
+    const dictionary& dict,
+    bool readFields
+)
+:
+    primaryMesh_(patch.boundaryMesh().mesh()),
+    patch_(patch),
+    time_(patch.boundaryMesh().mesh().time()),
+    active_(dict.get<Switch>("active")),
+    infoOutput_(false),
+    modelName_(modelName),
+    regionMeshPtr_(nullptr),
+    coeffs_(dict.subOrEmptyDict(modelName + "Coeffs")),
+    vsmPtr_(nullptr),
+    patchID_(patch.index()),
+    regionName_(dict.lookup("region"))
+{
+    if (active_)
+    {
+        constructMeshObjects();
+        initialise();
+
+        if (readFields)
+        {
+            read(dict);
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void Foam::regionModels::regionFaModel::evolve()
+{
+    if (active_)
+    {
+        Info<< "\nEvolving " << modelName_ << " for region "
+            << regionMesh().name() << endl;
+
+        preEvolveRegion();
+
+        evolveRegion();
+
+        postEvolveRegion();
+
+        // Provide some feedback
+        if (infoOutput_)
+        {
+            Info<< incrIndent;
+            info();
+            Info<< endl << decrIndent;
+        }
+    }
+}
+
+
+void Foam::regionModels::regionFaModel::preEvolveRegion()
+{}
+
+
+void Foam::regionModels::regionFaModel::evolveRegion()
+{}
+
+
+void Foam::regionModels::regionFaModel::postEvolveRegion()
+{}
+
+
+void Foam::regionModels::regionFaModel::info()
+{}
+
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/regionFaModel/regionFaModel.H b/src/regionFaModels/regionFaModel/regionFaModel.H
new file mode 100644
index 00000000000..48cb985339b
--- /dev/null
+++ b/src/regionFaModels/regionFaModel/regionFaModel.H
@@ -0,0 +1,256 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::regionModels::regionFaModel
+
+Description
+    Base class for area region models.
+
+Usage
+    Example of the model specification:
+    \verbatim
+    <patchName>
+    {
+        // Mandatory entries (runtime modifiable)
+        region          <regionName>;
+        active          true;
+
+        // Optional entries (runtime modifiable)
+        infoOutput      false;
+        <model>Coeffs
+        {
+            // subdictionary entries
+        }
+
+        // Mandatory/Optional (derived) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property   | Description                         | Type  | Reqd | Dflt
+      region     | Name of operand region              | word  | yes  | -
+      active     | Flag to activate the model          | bool  | yes  | -
+      infoOutput | Flag to activate information output | bool  | no   | false
+    \endtable
+
+SourceFiles
+    regionFaModelI.H
+    regionFaModel.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef regionFaModel_H
+#define regionFaModel_H
+
+#include "volMesh.H"
+#include "IOdictionary.H"
+#include "Switch.H"
+#include "labelList.H"
+#include "areaFields.H"
+#include "faMesh.H"
+#include "volSurfaceMapping.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+namespace regionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class regionFaModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class regionFaModel
+{
+    // Private Member Functions
+
+        //- Construct region mesh and fields
+        void constructMeshObjects();
+
+        //- Initialise the region
+        void initialise();
+
+
+protected:
+
+    // Protected Data
+
+        //- Reference to the primary mesh database
+        const fvMesh& primaryMesh_;
+
+        //- Reference to fvPatch
+        const fvPatch& patch_;
+
+        //- Reference to the time database
+        const Time& time_;
+
+        //- Active flag
+        Switch active_;
+
+        //- Active information output
+        Switch infoOutput_;
+
+        //- Model name
+        const word modelName_;
+
+        //- Pointer to the region mesh database
+        autoPtr<faMesh> regionMeshPtr_;
+
+        //- Model coefficients dictionary
+        dictionary coeffs_;
+
+        //-Volume-to surface mapping
+        autoPtr<volSurfaceMapping> vsmPtr_;
+
+
+        // Addressing
+
+            //- Patch IDs on the primary region coupled to this region
+            label patchID_;
+
+
+        //- Region name
+        word regionName_;
+
+
+    // Protected Member Functions
+
+        //- Read control parameters from dictionary
+        virtual bool read(const dictionary& dict);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("regionFaModel");
+
+
+    // Constructors
+
+        //- Construct from mesh and name and dict
+        regionFaModel
+        (
+            const fvPatch& patch,
+            const word& regionType,
+            const word& modelName,
+            const dictionary& dict,
+            bool readFields = true
+        );
+
+        //- No copy construct
+        regionFaModel(const regionFaModel&) = delete;
+
+        //- No copy assignment
+        void operator=(const regionFaModel&) = delete;
+
+
+    //- Destructor
+    virtual ~regionFaModel() = default;
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return the reference to the primary mesh database
+            inline const fvMesh& primaryMesh() const;
+
+            //- Return the reference to the time database
+            inline const Time& time() const;
+
+            //- Return the active flag
+            inline const Switch& active() const;
+
+            //- Return the information flag
+            inline const Switch& infoOutput() const;
+
+            //- Return the model name
+            inline const word& modelName() const;
+
+            //- Return the region mesh database
+            inline const faMesh& regionMesh() const;
+
+            //- Return the region mesh database for manipulation
+            inline faMesh& regionMesh();
+
+            //- Return the model coefficients dictionary
+            inline const dictionary& coeffs() const;
+
+            //- Return the solution dictionary
+            inline const dictionary& solution() const;
+
+            //- Return volSurfaceMapping
+            const volSurfaceMapping& vsm() const;
+
+
+        // Addressing
+
+            //- Return the list of patch IDs on the primary region coupled
+            //- to this region
+            inline label patchID();
+
+
+        // Evolution
+
+            //- Main driver routing to evolve the region - calls other evolves
+            virtual void evolve();
+
+            //- Pre-evolve region
+            virtual void preEvolveRegion();
+
+            //- Evolve the region
+            virtual void evolveRegion();
+
+            //- Post-evolve region
+            virtual void postEvolveRegion();
+
+
+        // IO
+
+            //- Provide some feedback
+            virtual void info();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionFaModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "regionFaModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/regionFaModel/regionFaModelI.H b/src/regionFaModels/regionFaModel/regionFaModelI.H
new file mode 100644
index 00000000000..35fe64d4997
--- /dev/null
+++ b/src/regionFaModels/regionFaModel/regionFaModelI.H
@@ -0,0 +1,118 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "regionFaModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inline const Foam::fvMesh&
+Foam::regionModels::regionFaModel::primaryMesh() const
+{
+    return primaryMesh_;
+}
+
+
+inline const Foam::Time& Foam::regionModels::regionFaModel::time() const
+{
+    return time_;
+}
+
+
+inline const Foam::Switch& Foam::regionModels::regionFaModel::active() const
+{
+    return active_;
+}
+
+
+inline const Foam::Switch& Foam::regionModels::regionFaModel::infoOutput() const
+{
+    return infoOutput_;
+}
+
+
+inline const Foam::word& Foam::regionModels::regionFaModel::modelName() const
+{
+    return modelName_;
+}
+
+
+inline const Foam::faMesh& Foam::regionModels::regionFaModel::regionMesh() const
+{
+    const auto* regionPtr = time_.findObject<faMesh>(regionName_);
+
+    if (regionPtr)
+    {
+        return *regionPtr;
+    }
+    else if (!regionMeshPtr_.valid())
+    {
+        FatalErrorInFunction
+            << "Region mesh not available" << abort(FatalError);
+    }
+
+    return *regionMeshPtr_;
+}
+
+
+inline Foam::faMesh& Foam::regionModels::regionFaModel::regionMesh()
+{
+    auto* regionPtr = time_.getObjectPtr<faMesh>(regionName_);
+
+    if (regionPtr)
+    {
+        return *regionPtr;
+    }
+    else if (!regionMeshPtr_.valid())
+    {
+        FatalErrorInFunction
+            << "Region mesh not available" << abort(FatalError);
+    }
+
+    return *regionMeshPtr_;
+}
+
+
+inline const Foam::dictionary& Foam::regionModels::regionFaModel::coeffs() const
+{
+    return coeffs_;
+}
+
+
+inline const Foam::dictionary&
+Foam::regionModels::regionFaModel::solution() const
+{
+    return regionMesh().solutionDict();
+}
+
+
+inline Foam::label Foam::regionModels::regionFaModel::patchID()
+{
+    return patchID_;
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/thermalShell/thermalShell.C b/src/regionFaModels/thermalShell/thermalShell.C
new file mode 100644
index 00000000000..797de7e2d5e
--- /dev/null
+++ b/src/regionFaModels/thermalShell/thermalShell.C
@@ -0,0 +1,232 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "thermalShell.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFields.H"
+#include "zeroGradientFaPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(thermalShell, 0);
+
+addToRunTimeSelectionTable(thermalShellModel, thermalShell, dictionary);
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool thermalShell::read(const dictionary& dict)
+{
+    this->solution().readEntry("nNonOrthCorr", nNonOrthCorr_);
+
+    return true;
+}
+
+
+void thermalShell::solveEnergy()
+{
+    if (debug)
+    {
+        InfoInFunction << endl;
+    }
+
+    const areaScalarField rhoCph(Cp()*rho()*h_);
+
+    faScalarMatrix TEqn
+    (
+        fam::ddt(rhoCph, T_)
+      - fam::laplacian(kappa()*h_, T_)
+     ==
+        qs_
+      //+ q(T_) handled by faOption contactHeatFlux
+      + faOptions()(h_, rhoCph, T_)
+    );
+
+    TEqn.relax();
+
+    faOptions().constrain(TEqn);
+
+    TEqn.solve();
+
+    faOptions().correct(T_);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+thermalShell::thermalShell
+(
+    const word& modelType,
+    const fvPatch& patch,
+    const dictionary& dict
+)
+:
+    thermalShellModel(modelType, patch, dict),
+    nNonOrthCorr_(1),
+    thermo_(dict.subDict("thermo")),
+    qs_
+    (
+        IOobject
+        (
+            "qs_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(dimPower/dimArea, Zero)
+    ),
+    h_
+    (
+        IOobject
+        (
+            "h_" + regionName_,
+            primaryMesh().time().timeName(),
+            primaryMesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh()
+    )
+{
+    init();
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void thermalShell::init()
+{}
+
+
+void thermalShell::preEvolveRegion()
+{}
+
+
+void thermalShell::evolveRegion()
+{
+    nNonOrthCorr_ = solution().get<label>("nNonOrthCorr");
+
+    for (int nonOrth = 0; nonOrth <= nNonOrthCorr_; ++nonOrth)
+    {
+        solveEnergy();
+    }
+
+    Info<< "T min/max   = " << min(T_) << ", " << max(T_) << endl;
+}
+
+
+const tmp<areaScalarField> thermalShell::Cp() const
+{
+    return tmp<areaScalarField>
+    (
+        new areaScalarField
+        (
+            IOobject
+            (
+                "Cps",
+                primaryMesh().time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            regionMesh(),
+            dimensionedScalar(dimEnergy/dimTemperature/dimMass, thermo_.Cp()),
+            zeroGradientFaPatchScalarField::typeName
+        )
+    );
+}
+
+
+const tmp<areaScalarField> thermalShell::rho() const
+{
+    return tmp<areaScalarField>
+    (
+        new areaScalarField
+        (
+            IOobject
+            (
+                "rhos",
+                primaryMesh().time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            regionMesh(),
+            dimensionedScalar(dimDensity, thermo_.rho()),
+            zeroGradientFaPatchScalarField::typeName
+        )
+    );
+}
+
+
+const tmp<areaScalarField> thermalShell::kappa() const
+{
+    return tmp<areaScalarField>
+    (
+        new areaScalarField
+        (
+            IOobject
+            (
+                "kappas",
+                primaryMesh().time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            regionMesh(),
+            dimensionedScalar
+            (
+                dimPower/dimLength/dimTemperature,
+                thermo_.kappa()
+            ),
+            zeroGradientFaPatchScalarField::typeName
+        )
+    );
+}
+
+
+void thermalShell::info()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/thermalShell/thermalShell.H b/src/regionFaModels/thermalShell/thermalShell.H
new file mode 100644
index 00000000000..6160855c130
--- /dev/null
+++ b/src/regionFaModels/thermalShell/thermalShell.H
@@ -0,0 +1,208 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::regionFaModels::thermalShell
+
+Description
+    Thermal-shell finite-area model. It solves the energy
+    equation in 2D. The coupling with the 3D region is done through
+    the \c temperatureCoupledBase, plus \c faOption is available to
+    add extra sources on the shell such as \c externalHeatFluxSource etc.
+
+Usage
+    Example of the boundary condition specification:
+    \verbatim
+    <patchName>
+    {
+        // Mandatory/Optional (inherited) entries
+        ...
+
+        // Mandatory entries (unmodifiable)
+        thermalShellModel   thermalShell;
+        thermo
+        {
+            // subdictionary entries
+        }
+
+        // Mandatory/Optional (derived) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property   | Description                      | Type  | Reqd | Dflt
+      thermalShellModel | Type name: thermalShell   | word  | yes  | -
+      thermo     | Solid thermal properties         | dictionary | yes | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link thermalShellModel.H \endlink
+
+See also
+  - Foam::regionModels::thermalShellModels::thermalShellModel
+
+SourceFiles
+    thermalShell.C
+    thermalShellI.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef thermalShell_H
+#define thermalShell_H
+
+#include "volFieldsFwd.H"
+#include "thermalShellModel.H"
+#include "solidProperties.H"
+#include "faMesh.H"
+#include "faCFD.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class thermalShell Declaration
+\*---------------------------------------------------------------------------*/
+
+class thermalShell
+:
+    public thermalShellModel
+{
+    // Private Member Functions
+
+        //- Initialize thermalShell
+        void init();
+
+
+protected:
+
+    // Protected Data
+
+        // Solution parameters
+
+            //- Number of non orthogonal correctors
+            label nNonOrthCorr_;
+
+
+        // Thermo properties
+
+            //- Solid properties
+            solidProperties thermo_;
+
+
+        // Source term fields
+
+            //- External surface energy source  / [J/m2/s]
+            areaScalarField qs_;
+
+            //- Thickness
+            areaScalarField h_;
+
+
+    // Protected Member Functions
+
+        //- Read control parameters from dictionary
+        virtual bool read(const dictionary& dict);
+
+
+        // Equations
+
+            //- Solve energy equation
+            void solveEnergy();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("thermalShell");
+
+
+    // Constructors
+
+        //- Construct from components and dict
+        thermalShell
+        (
+            const word& modelType,
+            const fvPatch& patch,
+            const dictionary& dict
+        );
+
+        //- No copy construct
+        thermalShell(const thermalShell&) = delete;
+
+        //- No copy assignment
+        void operator=(const thermalShell&) = delete;
+
+
+    //- Destructor
+    virtual ~thermalShell() = default;
+
+
+    // Member Functions
+
+        // Fields
+
+            //- Return the film specific heat capacity [J/kg/K]
+            const tmp<areaScalarField> Cp() const;
+
+            //- Return density [Kg/m3]
+            const tmp<areaScalarField> rho() const;
+
+            //- Return thermal conductivity [W/m/K]
+            const tmp<areaScalarField> kappa() const;
+
+
+        // Evolution
+
+            //- Pre-evolve  thermal baffle
+            virtual void preEvolveRegion();
+
+            //- Evolve the thermal baffle
+            virtual void evolveRegion();
+
+
+       // IO
+
+            //- Provide some feedback
+            virtual void info();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/thermalShellModel/thermalShellModel.C b/src/regionFaModels/thermalShellModel/thermalShellModel.C
new file mode 100644
index 00000000000..4ee3c206e35
--- /dev/null
+++ b/src/regionFaModels/thermalShellModel/thermalShellModel.C
@@ -0,0 +1,121 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "thermalShellModel.H"
+#include "faMesh.H"
+#include "fvMesh.H"
+#include "fvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(thermalShellModel, 0);
+
+defineRunTimeSelectionTable(thermalShellModel, dictionary);
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool thermalShellModel::read(const dictionary& dict)
+{
+    if (regionFaModel::read(dict))
+    {
+        return true;
+    }
+
+    return false;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+thermalShellModel::thermalShellModel
+(
+    const word& modelType,
+    const fvPatch& p,
+    const dictionary& dict
+)
+:
+    regionFaModel(p, "thermalShell", modelType, dict, true),
+    TName_(dict.get<word>("T")),
+    Tp_(p.boundaryMesh().mesh().lookupObject<volScalarField>(TName_)),
+    T_
+    (
+        IOobject
+        (
+            "Ts_" + regionName_,
+            p.boundaryMesh().mesh().time().timeName(),
+            p.boundaryMesh().mesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh()
+    ),
+    faOptions_(Foam::fa::options::New(p))
+{
+    if (!faOptions_.optionList::size())
+    {
+        Info << "No finite area options present" << endl;
+    }
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void thermalShellModel::preEvolveRegion()
+{}
+
+
+const Foam::volScalarField& thermalShellModel::Tp() const
+{
+    return Tp_;
+}
+
+
+const Foam::areaScalarField& thermalShellModel::T() const
+{
+    return T_;
+}
+
+
+Foam::fa::options& thermalShellModel::faOptions()
+{
+     return faOptions_;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/thermalShellModel/thermalShellModel.H b/src/regionFaModels/thermalShellModel/thermalShellModel.H
new file mode 100644
index 00000000000..2b2e9ec2829
--- /dev/null
+++ b/src/regionFaModels/thermalShellModel/thermalShellModel.H
@@ -0,0 +1,205 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::regionModels::thermalShellModels::thermalShellModel
+
+Description
+    Intermediate class for thermal-shell finite-area models.
+
+Usage
+    Example of the boundary condition specification:
+    \verbatim
+    <patchName>
+    {
+        // Mandatory/Optional (inherited) entries
+        ...
+
+        // Mandatory entries (unmodifiable)
+        T                     <Tname>;
+
+        // Optional entries (unmodifiable)
+        thermalShellModel     <thermalShellModelName>;
+
+        // Mandatory/Optional (derived) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property   | Description                       | Type  | Reqd | Dflt
+      T          | Name of operand temperature field | word  | yes  | -
+      thermalShellModel | Name of thermal-shell model <!--
+                        -->                      | word | no | thermalShell
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link regionFaModel.H \endlink
+
+SourceFiles
+    thermalShellModel.C
+    thermalShellModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef thermalShellModel_H
+#define thermalShellModel_H
+
+#include "runTimeSelectionTables.H"
+#include "autoPtr.H"
+#include "areaFieldsFwd.H"
+#include "volFieldsFwd.H"
+#include "regionFaModel.H"
+#include "faOptions.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class thermalShellModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class thermalShellModel
+:
+    public regionFaModel
+{
+    // Private Member Functions
+
+        //- Initialize thermal Baffle
+        void init();
+
+
+protected:
+
+    // Protected Data
+
+        //- Name of the temperature field
+        word TName_;
+
+        //- Primary region temperature
+        const volScalarField& Tp_;
+
+        //- Shell temperature
+        areaScalarField T_;
+
+        //- Pointer to faOptions
+        Foam::fa::options& faOptions_;
+
+
+    // Protected Member Functions
+
+        //- Read control parameters from dictionary
+        virtual bool read(const dictionary&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("thermalShellModel");
+
+
+    // Declare runtime constructor selection tables
+
+         declareRunTimeSelectionTable
+         (
+             autoPtr,
+             thermalShellModel,
+             dictionary,
+             (
+                const word& modelType,
+                const fvPatch& patch,
+                const dictionary& dict
+             ),
+             (modelType, patch, dict)
+         );
+
+
+    // Constructors
+
+        //- Construct from type name and mesh and dict
+        thermalShellModel
+        (
+            const word& modelType,
+            const fvPatch& patch,
+            const dictionary& dict
+        );
+
+        //- No copy construct
+        thermalShellModel(const thermalShellModel&) = delete;
+
+        //- No copy assignment
+        void operator=(const thermalShellModel&) = delete;
+
+
+    // Selectors
+
+        //- Return a reference to the selected model using dictionary
+        static autoPtr<thermalShellModel> New
+        (
+            const fvPatch& patch,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~thermalShellModel() = default;
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return primary region temperature
+            const volScalarField& Tp() const;
+
+            //- Return shell temperature
+            const areaScalarField& T() const;
+
+            //- Return faOptions
+            Foam::fa::options& faOptions();
+
+
+        // Evolution
+
+            //- Pre-evolve region
+            virtual void preEvolveRegion();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/thermalShellModel/thermalShellModelNew.C b/src/regionFaModels/thermalShellModel/thermalShellModelNew.C
new file mode 100644
index 00000000000..71848973d93
--- /dev/null
+++ b/src/regionFaModels/thermalShellModel/thermalShellModelNew.C
@@ -0,0 +1,69 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "thermalShellModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+autoPtr<thermalShellModel> thermalShellModel::New
+(
+    const fvPatch& p,
+    const dictionary& dict
+)
+{
+    const word modelType =
+        dict.getOrDefault<word>("thermalShellModel", "thermalShell");
+
+    auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
+
+    if (!cstrIter.found())
+    {
+        FatalErrorInFunction
+            << "Unknown thermalShellModel type "
+            << modelType << nl << nl
+            << "Valid thermalShellModel types :" << nl
+            << dictionaryConstructorTablePtr_->sortedToc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<thermalShellModel>(cstrIter()(modelType, p, dict));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/vibrationShellModel/vibrationShellModel.C b/src/regionFaModels/vibrationShellModel/vibrationShellModel.C
new file mode 100644
index 00000000000..ea309868a0d
--- /dev/null
+++ b/src/regionFaModels/vibrationShellModel/vibrationShellModel.C
@@ -0,0 +1,148 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "vibrationShellModel.H"
+#include "faMesh.H"
+#include "fvMesh.H"
+#include "fvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(vibrationShellModel, 0);
+
+defineRunTimeSelectionTable(vibrationShellModel, dictionary);
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool vibrationShellModel::read(const dictionary& dict)
+{
+    if (regionFaModel::read(dict))
+    {
+        return true;
+    }
+
+    return false;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+vibrationShellModel::vibrationShellModel
+(
+    const word& modelType,
+    const fvPatch& p,
+    const dictionary& dict
+)
+:
+    regionFaModel(p, "vibratingShell", modelType, dict, true),
+    pName_(dict.get<word>("p")),
+    pa_(p.boundaryMesh().mesh().lookupObject<volScalarField>(pName_)),
+    w_
+    (
+        IOobject
+        (
+            "ws_" + regionName_,
+            p.boundaryMesh().mesh().time().timeName(),
+            p.boundaryMesh().mesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh()
+    ),
+    a_
+    (
+        IOobject
+        (
+            "as_" + regionName_,
+            p.boundaryMesh().mesh().time().timeName(),
+            p.boundaryMesh().mesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar(dimAcceleration, Zero)
+    ),
+    faOptions_(Foam::fa::options::New(p)),
+    solid_(dict.subDict("solid"))
+{
+    if (!faOptions_.optionList::size())
+    {
+        Info << "No finite area options present" << endl;
+    }
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void vibrationShellModel::preEvolveRegion()
+{}
+
+
+const Foam::volScalarField& vibrationShellModel::pa() const
+{
+    return pa_;
+}
+
+
+const Foam::areaScalarField& vibrationShellModel::w() const
+{
+    return w_;
+}
+
+
+const Foam::areaScalarField& vibrationShellModel::a() const
+{
+    return a_;
+}
+
+
+Foam::fa::options& vibrationShellModel::faOptions()
+{
+     return faOptions_;
+}
+
+
+const Foam::solidProperties& vibrationShellModel::solid() const
+{
+     return solid_;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/vibrationShellModel/vibrationShellModel.H b/src/regionFaModels/vibrationShellModel/vibrationShellModel.H
new file mode 100644
index 00000000000..566d4fd2bd0
--- /dev/null
+++ b/src/regionFaModels/vibrationShellModel/vibrationShellModel.H
@@ -0,0 +1,218 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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::regionModels::thermalShellModels::vibrationShellModel
+
+Description
+    Intermediate class for vibration-shell finite-area models.
+
+Usage
+    Example of the boundary condition specification:
+    \verbatim
+    <patchName>
+    {
+        // Mandatory/Optional (inherited) entries
+        ...
+
+        // Mandatory entries (unmodifiable)
+        vibrationShellModel     <thermalShellModelName>;
+        p                       <pName>;
+
+        solid
+        {
+            // subdictionary entries
+        }
+
+        // Mandatory/Optional (derived) entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property   | Description                            | Type  | Reqd | Dflt
+      vibrationShellModel | Name of vibration-shell model | word | yes | -
+      p          | Name of the coupled field in the primary <!--
+                 --> region                               | word | yes | -
+      solid      | Solid properties                 | dictionary | yes | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link regionFaModel.H \endlink
+
+SourceFiles
+    vibrationShellModel.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef thermalShellModel_H
+#define thermalShellModel_H
+
+#include "runTimeSelectionTables.H"
+#include "autoPtr.H"
+#include "areaFieldsFwd.H"
+#include "volFieldsFwd.H"
+#include "regionFaModel.H"
+#include "faOptions.H"
+#include "solidProperties.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class vibrationShellModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class vibrationShellModel
+:
+    public regionFaModel
+{
+    // Private Member Functions
+
+        //- No copy construct
+        vibrationShellModel(const vibrationShellModel&) = delete;
+
+        //- No copy assignment
+        void operator=(const vibrationShellModel&) = delete;
+
+
+protected:
+
+    // Protected Data
+
+        //- Name of the coupled field in the primary region
+        word pName_;
+
+        //- Primary region acoustic pressure
+        const volScalarField& pa_;
+
+        //- Shell displacement
+        areaScalarField w_;
+
+        //- Shell acceleration
+        areaScalarField a_;
+
+        //- Pointer to faOptions
+        Foam::fa::options& faOptions_;
+
+        //- Solid properties
+        solidProperties solid_;
+
+
+    // Protected Member Functions
+
+        //- Read control parameters from dictionary
+        virtual bool read(const dictionary&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("vibrationShellModel");
+
+
+    // Declare runtime constructor selection tables
+
+         declareRunTimeSelectionTable
+         (
+             autoPtr,
+             vibrationShellModel,
+             dictionary,
+             (
+                const word& modelType,
+                const fvPatch& patch,
+                const dictionary& dict
+             ),
+             (modelType, patch, dict)
+         );
+
+
+    // Constructors
+
+        //- Construct from type name and mesh and dict
+        vibrationShellModel
+        (
+            const word& modelType,
+            const fvPatch& patch,
+            const dictionary& dict
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected model using dictionary
+        static autoPtr<vibrationShellModel> New
+        (
+            const fvPatch& patch,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~vibrationShellModel() = default;
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return primary region pa
+            const volScalarField& pa() const;
+
+            //- Return shell displacement
+            const areaScalarField& w() const;
+
+            //- Return shell acceleration
+            const areaScalarField& a() const;
+
+            //- Return faOptions
+            Foam::fa::options& faOptions();
+
+            //- Return solid properties
+            const solidProperties& solid() const;
+
+
+        // Evolution
+
+            //- Pre-evolve region
+            virtual void preEvolveRegion();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionFaModels/vibrationShellModel/vibrationShellModelNew.C b/src/regionFaModels/vibrationShellModel/vibrationShellModelNew.C
new file mode 100644
index 00000000000..01234e34511
--- /dev/null
+++ b/src/regionFaModels/vibrationShellModel/vibrationShellModelNew.C
@@ -0,0 +1,68 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2019-2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+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 "vibrationShellModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+autoPtr<vibrationShellModel> vibrationShellModel::New
+(
+    const fvPatch& p,
+    const dictionary& dict
+)
+{
+    const word modelType = dict.get<word>("vibrationShellModel");
+
+    auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
+
+    if (!cstrIter.found())
+    {
+        FatalErrorInFunction
+            << "Unknown vibrationShellModel type "
+            << modelType << nl << nl
+            << "Valid vibrationShellModel types :" << nl
+            << dictionaryConstructorTablePtr_->sortedToc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<vibrationShellModel>(cstrIter()(modelType, p, dict));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H b/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H
index f8628882fed..65beade5915 100644
--- a/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H
+++ b/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H
@@ -159,6 +159,9 @@ class boundaryDataWriter
 
     // Private Member Functions
 
+        //- Write option (default: IOstream::ASCII)
+        IOstream::streamFormat writeFormat_;
+
         //- Templated write field operation
         template<class Type>
         fileName writeTemplate
diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/C/C.C b/src/thermophysicalModels/thermophysicalProperties/solidProperties/C/C.C
index 173eddf86d7..95315348a63 100644
--- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/C/C.C
+++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/C/C.C
@@ -42,7 +42,7 @@ namespace Foam
 
 Foam::C::C()
 :
-    solidProperties(2010, 710, 0.04, 0.0, 1.0, 12.011)
+    solidProperties(2010, 710, 0.04, 0.0, 1.0, 12.011, 0.0, 0.0)
 {
     if (debug)
     {
diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/CaCO3/CaCO3.C b/src/thermophysicalModels/thermophysicalProperties/solidProperties/CaCO3/CaCO3.C
index 03fae10e830..c4e2eae0b9c 100644
--- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/CaCO3/CaCO3.C
+++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/CaCO3/CaCO3.C
@@ -42,7 +42,7 @@ namespace Foam
 
 Foam::CaCO3::CaCO3()
 :
-    solidProperties(2710, 850, 1.3, 0.0, 1.0, 100.086)
+    solidProperties(2710, 850, 1.3, 0.0, 1.0, 100.086, 0.0, 0.0)
 {
     if (debug)
     {
diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/ash/ash.C b/src/thermophysicalModels/thermophysicalProperties/solidProperties/ash/ash.C
index cd41a4824ba..e6ace630763 100644
--- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/ash/ash.C
+++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/ash/ash.C
@@ -42,7 +42,7 @@ namespace Foam
 
 Foam::ash::ash()
 :
-    solidProperties(2010, 710, 0.04, 0.0, 1.0, 12.011)
+    solidProperties(2010, 710, 0.04, 0.0, 1.0, 12.011, 0.0, 0.0)
 {
     if (debug)
     {
diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.C b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.C
index d2afd3e5ec6..443c4c91978 100644
--- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.C
+++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.C
@@ -47,7 +47,9 @@ Foam::solidProperties::solidProperties
     scalar kappa,
     scalar Hf,
     scalar emissivity,
-    scalar W
+    scalar W,
+    scalar nu,
+    scalar E
 )
 :
     rho_(rho),
@@ -55,7 +57,9 @@ Foam::solidProperties::solidProperties
     kappa_(kappa),
     Hf_(Hf),
     emissivity_(emissivity),
-    W_(W)
+    W_(W),
+    nu_(nu),
+    E_(E)
 {}
 
 
@@ -66,7 +70,9 @@ Foam::solidProperties::solidProperties(const dictionary& dict)
     kappa_(dict.getCompat<scalar>("kappa", {{"K", 1612}})),
     Hf_(dict.get<scalar>("Hf")),
     emissivity_(dict.get<scalar>("emissivity")),
-    W_(dict.get<scalar>("W"))
+    W_(dict.get<scalar>("W")),
+    nu_(dict.getOrDefault<scalar>("nu", 0.0)),
+    E_(dict.getOrDefault<scalar>("E", 0.0))
 {}
 
 
@@ -80,6 +86,8 @@ void Foam::solidProperties::readIfPresent(const dictionary& dict)
     dict.readIfPresent("Hf", Hf_);
     dict.readIfPresent("emissivity", emissivity_);
     dict.readIfPresent("W", W_);
+    dict.readIfPresent("nu", nu_);
+    dict.readIfPresent("E", E_);
 }
 
 
@@ -90,7 +98,9 @@ void Foam::solidProperties::writeData(Ostream& os) const
         << kappa_ << token::SPACE
         << Hf_ << token::SPACE
         << emissivity_ << token::SPACE
-        << W_;
+        << W_ << token::SPACE
+        << nu_ << token::SPACE
+        << E_;
 }
 
 
diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.H b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.H
index 7c089ae0e44..3d8729acc36 100644
--- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.H
+++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.H
@@ -74,6 +74,12 @@ class solidProperties
         //- Molar weight [Kg/Kmol]
         scalar W_;
 
+        //- Poisson ration
+        scalar nu_;
+
+        //- Young Modulus [N/m2]
+        scalar E_;
+
 
 public:
 
@@ -112,7 +118,9 @@ public:
             scalar kappa,
             scalar Hf,
             scalar emissivity,
-            scalar W
+            scalar W,
+            scalar nu,
+            scalar E
         );
 
         //- Construct from dictionary
@@ -163,6 +171,12 @@ public:
             //- Molar weight [Kg/Kmol]
             inline scalar W() const;
 
+            //- Poissons
+            inline scalar nu() const;
+
+            //- Young modulus [N/m2]
+            inline scalar E() const;
+
 
     // I-O
 
diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidPropertiesI.H b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidPropertiesI.H
index 16189b52b3d..0f6148bdef6 100644
--- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidPropertiesI.H
+++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidPropertiesI.H
@@ -65,10 +65,23 @@ inline Foam::scalar Foam::solidProperties::emissivity() const
     return emissivity_;
 }
 
+
 inline Foam::scalar Foam::solidProperties::W() const
 {
     return W_;
 }
 
 
+inline Foam::scalar Foam::solidProperties::nu() const
+{
+    return nu_;
+}
+
+
+inline Foam::scalar Foam::solidProperties::E() const
+{
+    return E_;
+}
+
+
 // ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/Allclean b/tutorials/compressible/acousticFoam/obliqueAirJet/Allclean
new file mode 100755
index 00000000000..87adb1f6be7
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions      # Tutorial clean functions
+#------------------------------------------------------------------------------
+
+(cd precursor && ./Allclean)
+
+(cd main && ./Allclean)
+
+# -----------------------------------------------------------------------------
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/Allrun-parallel b/tutorials/compressible/acousticFoam/obliqueAirJet/Allrun-parallel
new file mode 100755
index 00000000000..b3bcb07bffc
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/Allrun-parallel
@@ -0,0 +1,13 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions        # Tutorial run functions
+#------------------------------------------------------------------------------
+
+# Run a precursor init case
+(cd main && ./Allrun.pre)
+(cd precursor && ./Allrun-parallel)
+
+# Run the main case
+(cd main && ./Allrun-parallel)
+
+# -----------------------------------------------------------------------------
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/h_vibrationShell b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/h_vibrationShell
new file mode 100644
index 00000000000..7c4124634b0
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/h_vibrationShell
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       areaScalarField;
+    object      h_ceilingShell;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 0 0 0 0 0];
+
+internalField   uniform 0.00485;
+
+boundaryField
+{
+    ".*"
+    {
+        type    zeroGradient;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/pa b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/pa
new file mode 100644
index 00000000000..0128164ecc9
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/pa
@@ -0,0 +1,67 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      pa;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [1 -1 -2 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    box
+    {
+        type            acousticWaveTransmissive;
+        advectiveSpeed  340;
+        value           $internalField;
+    }
+
+    window
+    {
+        type                vibrationShell;
+        active              true;
+        p                   pa;
+
+        solid
+        {
+            W                   20; //Not used
+            rho                 2500;
+
+            kappa               200;
+            Cp                  600;
+            Hf                  0;
+            emissivity          0;
+
+            E                   7e10;
+            nu                  0.22;
+        }
+
+        region                vibrationShell;
+        vibrationShellModel   KirchhoffShell;
+
+        f0             0.04;
+        f1             0;
+        f2             0;
+
+        value          $internalField;
+   }
+
+    wall
+    {
+        type            zeroGradient;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ps_vibrationShell b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ps_vibrationShell
new file mode 100644
index 00000000000..e708286b16c
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ps_vibrationShell
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       areaScalarField;
+    object      ps;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [1 -1 -2 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    ".*"
+    {
+        type    zeroGradient;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ws_vibrationShell b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ws_vibrationShell
new file mode 100644
index 00000000000..94a7f4b43f5
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ws_vibrationShell
@@ -0,0 +1,31 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       areaScalarField;
+    object      wS;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions     [0 1 0 0 0 0 0];
+
+internalField      uniform 0.0;
+
+boundaryField
+{
+    sealing
+    {
+        type       clampedPlate;
+        value      $internalField;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allclean b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allclean
new file mode 100755
index 00000000000..25241a589c0
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allclean
@@ -0,0 +1,12 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions      # Tutorial clean functions
+#------------------------------------------------------------------------------
+
+cleanCase0
+
+rm -rf constant/boundaryData
+rm -f constant/faMesh/faceLabels
+rm -f constant/faMesh/faBoundary
+
+# -----------------------------------------------------------------------------
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun-parallel b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun-parallel
new file mode 100755
index 00000000000..28d05965c37
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun-parallel
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions        # Tutorial run functions
+#------------------------------------------------------------------------------
+
+restore0Dir
+
+runApplication decomposePar -force
+
+runParallel $(getApplication)
+
+runApplication reconstructPar
+
+#------------------------------------------------------------------------------
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun.pre b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun.pre
new file mode 100755
index 00000000000..8ac85a8f173
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun.pre
@@ -0,0 +1,12 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions        # Tutorial run functions
+#------------------------------------------------------------------------------
+
+runApplication blockMesh
+
+runApplication snappyHexMesh -overwrite
+
+runApplication makeFaMesh
+
+#------------------------------------------------------------------------------
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/faMesh/faMeshDefinition b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/faMesh/faMeshDefinition
new file mode 100644
index 00000000000..ed7eb31b732
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/faMesh/faMeshDefinition
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      faMeshDefinition;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+polyMeshPatches  1(window);
+
+boundary
+{
+    sealing
+    {
+        type                patch;
+        ownerPolyPatch      window;
+        neighbourPolyPatch  fixedWall;
+    }
+}
+
+
+// ************************************************************************** //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/transportProperties b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/transportProperties
new file mode 100644
index 00000000000..6697be20ead
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/transportProperties
@@ -0,0 +1,21 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+c0      340.;
+rho     1.2;
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/triSurface/window_box.stl.gz b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/triSurface/window_box.stl.gz
new file mode 100644
index 0000000000000000000000000000000000000000..06a030747e5659792b09eeac0ea5e7795267b000
GIT binary patch
literal 51747
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

literal 0
HcmV?d00001

diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/blockMeshDict b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/blockMeshDict
new file mode 100644
index 00000000000..cba6a4a543f
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/blockMeshDict
@@ -0,0 +1,46 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale    1;
+
+vertices
+(
+  (-.2  -.3   -.2)
+  (2.2  -.3  -.2)
+  (2.2  1.3  -.2)
+  (-.2  1.3  -.2)
+
+  (-.2  -.3  2.2)
+  (2.2  -.3  2.2)
+  (2.2  1.3  2.2)
+  (-.2  1.3  2.2)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (15 10 15) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+patches
+(
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/controlDict b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/controlDict
new file mode 100644
index 00000000000..2b7179b5179
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/controlDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     acousticFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.03;
+
+deltaT          1e-6;
+
+writeControl    timeStep;
+
+writeInterval   200;
+
+purgeWrite      0;
+
+writeFormat     binary;
+
+writePrecision  12;
+
+timeFormat      general;
+
+timePrecision   12;
+
+runTimeModifiable yes;
+
+adjustTimeStep no;
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/decomposeParDict b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/decomposeParDict
new file mode 100644
index 00000000000..1a5866caf17
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/decomposeParDict
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 6;
+
+method             scotch;
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faOptions b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faOptions
new file mode 100644
index 00000000000..2388c160641
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faOptions
@@ -0,0 +1,31 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      faOptions;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+pressure
+{
+    type            externalFileSource;
+    fieldName       ws_vibrationShell;
+    tableName       p;
+    active          true;
+    timeStart       0.001;
+    duration        0.03;
+    region          vibrationShell;
+    selectionMode   all;
+    format          binary;
+}
+
+
+//************************************************************************** //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSchemes b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSchemes
new file mode 100644
index 00000000000..173abaa2794
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSchemes
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      faSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+d2dt2Schemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default                  leastSquares;
+    grad(ws_vibrationShell)  leastSquares;
+}
+
+divSchemes
+{
+    default         Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSolution b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSolution
new file mode 100644
index 00000000000..14d0babd74d
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSolution
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      faSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    ws_vibrationShell
+    {
+        solver          diagonal;
+        preconditioner  DILU;
+        tolerance       1e-08;
+        relTol          0;
+    }
+}
+
+nNonOrthCorr            0;
+nSubCycles              2;
+
+relaxationFactors
+{
+    w_vibrationShell    1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSchemes b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSchemes
new file mode 100644
index 00000000000..33b28299b63
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSchemes
@@ -0,0 +1,59 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+d2dt2Schemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         leastSquares;
+}
+
+divSchemes
+{
+    default         Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         orthogonal;
+}
+
+wallDist
+{
+    method          meshWave;
+    nRequired       yes;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSolution b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSolution
new file mode 100644
index 00000000000..3e50abb3c3a
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSolution
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    pa
+    {
+        solver           GAMG;
+        tolerance        0;
+        relTol           0.01;
+        smoother         DICGaussSeidel;
+    }
+
+    paFinal
+    {
+        $p;
+        tolerance        1e-6;
+        relTol           0;
+    }
+}
+
+PIMPLE
+{
+    nOuterCorrectors    3;
+    nCOrrectors         1;
+    nNonOrthogonalCorrectors 0;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/snappyHexMeshDict b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/snappyHexMeshDict
new file mode 100644
index 00000000000..57c81d26cf2
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/snappyHexMeshDict
@@ -0,0 +1,136 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      snappyHexMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+castellatedMesh true;
+snap            true;
+addLayers       false;
+
+geometry
+{
+    "window_box.stl"
+    {
+        type triSurfaceMesh;
+        name window_box;
+        regions
+        {
+            window    {name window;}
+            box       {name box;}
+            wall      {name fixedWall;}
+        }
+    }
+    rbox_f
+    {
+        type searchableBox;
+        min (0.7  0   0.7);
+        max (1.3  0.5  1.3);
+    }
+    rbox_c
+    {
+        type searchableBox;
+        min (0 0 0);
+        max (2 1 2);
+    }
+};
+
+
+castellatedMeshControls
+{
+    maxLocalCells 300000000;
+    maxGlobalCells 300000000;
+    minRefinementCells 10;
+    maxLoadUnbalance 0.10;
+    nCellsBetweenLevels 1;
+
+    features
+    (
+    );
+
+    refinementSurfaces
+    {
+        window_box
+        {
+            level (2 2);
+            regions
+            {
+                window{ level (3 3); }
+            }
+        }
+    }
+
+    resolveFeatureAngle 30;
+
+    refinementRegions
+    {
+        rbox_f
+        {
+            mode inside;
+            levels ((3 3));
+        }
+        rbox_c
+        {
+            mode inside;
+            levels ((2 2));
+        }
+    }
+
+    locationInMesh (1.0134 0.543 1.0765);
+
+    allowFreeStandingZoneFaces false;
+}
+
+
+snapControls
+{
+    nSmoothPatch 3;
+    tolerance 4.0;
+    nSolveIter 10;
+    nRelaxIter 5;
+    nFeatureSnapIter 10;
+
+    explicitFeatureSnap false;
+    implicitFeatureSnap true;
+}
+
+
+addLayersControls
+{}
+
+
+meshQualityControls
+{
+    maxNonOrtho 65;
+    maxBoundarySkewness 20;
+    maxInternalSkewness 4;
+    maxConcave 80;
+    minVol 1e-13;
+    minTetQuality -1;
+    minArea -1;
+    minTwist 0.02;
+    minDeterminant 0.001;
+    minFaceWeight 0.05;
+    minVolRatio 0.01;
+    minTriangleTwist -1;
+
+    nSmoothScale 4;
+    errorReduction 0.75;
+}
+
+debug 0;
+
+mergeTolerance 1e-8;
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/T b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/T
new file mode 100644
index 00000000000..92b10989cd6
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/T
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      T;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+Tinlet          293;
+
+dimensions      [0 0 0 1 0 0 0];
+
+internalField   uniform $Tinlet;
+
+boundaryField
+{
+    inlet
+    {
+        type            fixedValue;
+        value           uniform $Tinlet;
+    }
+
+    "(window|fixedWall)"
+    {
+        type            zeroGradient;
+    }
+
+    box
+    {
+        type            inletOutlet;
+        inletValue      uniform $Tinlet;
+        value           uniform $Tinlet;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/U b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/U
new file mode 100644
index 00000000000..6cecc4d7471
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/U
@@ -0,0 +1,42 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    inlet
+    {
+        type            fixedValue;
+        value           uniform (0 -1 20);
+    }
+
+    "(window|fixedWall)"
+    {
+        type            noSlip;
+    }
+
+    box
+    {
+        type            pressureInletOutletVelocity;
+        value           $internalField;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/alphat b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/alphat
new file mode 100644
index 00000000000..0d666dc61cd
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/alphat
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      alphat;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [1 -1 -1 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    inlet
+    {
+        type            calculated;
+        value           $internalField;
+    }
+
+    "(window|fixedWall)"
+    {
+        type            compressible::alphatWallFunction;
+        value           $internalField;
+    }
+
+    box
+    {
+        type            zeroGradient;
+        value           $internalField;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nuTilda b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nuTilda
new file mode 100644
index 00000000000..4801adb0ddb
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nuTilda
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      nuTilda;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -1 0 0 0 0];
+
+internalField   uniform 1.51e-05;
+
+boundaryField
+{
+    inlet
+    {
+        type            fixedValue;
+        value           $internalField;
+    }
+
+    "(window|fixedWall)"
+    {
+        type            zeroGradient;
+        value           $internalField;
+    }
+
+    box
+    {
+        type            inletOutlet;
+        inletValue      $internalField;
+        value           $internalField;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nut b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nut
new file mode 100644
index 00000000000..bfe0450f34d
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nut
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -1 0 0 0 0];
+
+internalField   uniform 1e-5;
+
+boundaryField
+{
+    inlet
+    {
+        type            calculated;
+        value           $internalField;
+    }
+
+    "(window|fixedWall)"
+    {
+        type            nutUSpaldingWallFunction;
+        value           $internalField;
+    }
+
+    box
+    {
+        type            calculated;
+        value           $internalField;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/p b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/p
new file mode 100644
index 00000000000..7036695e94c
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/p
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [1 -1 -2 0 0 0 0];
+
+internalField   uniform 1e5;
+
+boundaryField
+{
+    "(inlet|window|fixedWall)"
+    {
+        type            zeroGradient;
+    }
+
+    box
+    {
+        type            waveTransmissive;
+        field           p;
+        phi             phi;
+        rho             rho;
+        psi             thermo:psi;
+        gamma           1.4;
+        fieldInf        1e5;
+        lInf            5.0;
+        value           $internalField;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allclean b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allclean
new file mode 100755
index 00000000000..91099c43c02
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allclean
@@ -0,0 +1,12 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions      # Tutorial clean functions
+#------------------------------------------------------------------------------
+
+vibroAcousticCase="../main"
+
+cleanCase0
+
+rm -rf $vibroAcousticCase/constant/boundaryData
+
+# -----------------------------------------------------------------------------
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun-parallel b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun-parallel
new file mode 100755
index 00000000000..98c9f3495c8
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun-parallel
@@ -0,0 +1,20 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions        # Tutorial run functions
+#------------------------------------------------------------------------------
+
+[[ -d constant/polyMesh ]] || runApplication ./Allrun.pre
+
+restore0Dir
+
+runApplication decomposePar
+
+runParallel $(getApplication)
+
+vibroAcousticCase="../main"
+dataDir="postProcessing/surfaces/window"
+
+mkdir -p "$vibroAcousticCase/constant/boundaryData"
+cp -rf "$dataDir" "$vibroAcousticCase/constant/boundaryData/window"
+
+# -----------------------------------------------------------------------------
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun.pre b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun.pre
new file mode 100755
index 00000000000..8a256108197
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun.pre
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions        # Tutorial run functions
+#------------------------------------------------------------------------------
+
+runApplication extrudeMesh
+
+runApplication changeDictionary -constant
+
+runApplication topoSet
+
+runApplication createPatch -overwrite
+
+# -----------------------------------------------------------------------------
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/thermophysicalProperties b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/thermophysicalProperties
new file mode 100644
index 00000000000..9490a621cfd
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/thermophysicalProperties
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      thermophysicalProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+thermoType
+{
+    type            hePsiThermo;
+    mixture         pureMixture;
+    transport       const;
+    thermo          hConst;
+    equationOfState perfectGas;
+    specie          specie;
+    energy          sensibleEnthalpy;
+}
+
+mixture // air at room temperature (293 K)
+{
+    equationOfState
+    {
+        p0          103308.85730683322;
+        T0          225.24440406165331;
+    }
+    specie
+    {
+        molWeight   28.9;
+    }
+    thermodynamics
+    {
+        Cp          1005;
+        Hf          0;
+    }
+    transport
+    {
+        mu          1.82e-05;
+        Pr          0.71;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/turbulenceProperties b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/turbulenceProperties
new file mode 100644
index 00000000000..130f0d86b87
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/turbulenceProperties
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType          LES;
+
+LES
+{
+    LESModel            SpalartAllmarasDDES;
+    turbulence          on;
+    printCoeffs         on;
+    delta               vanDriest;
+    vanDriestCoeffs
+    {
+        delta           cubeRootVol;
+        cubeRootVolCoeffs
+        {
+            deltaCoeff      2.0;
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/blockMeshDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/blockMeshDict
new file mode 100644
index 00000000000..b0368fe2979
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/blockMeshDict
@@ -0,0 +1,231 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale       1;
+
+x_up        2.5;
+x_down      3.5;
+y_pad       4.0;
+z_pad       1.0;
+
+x0          0.0;
+x1          $x_up;
+x2          #eval{ $x1 + 1.0 };
+x3          #eval{ $x2 + $x_down };
+
+y0          0.0;
+y1          $y_pad;
+y2          #eval{ $y1 + 1.0 };
+y3          #eval{ $y2 + $y_pad };
+
+z0          0.0;
+z1          1.0;
+z2          #eval{ $z1 + $z_pad };
+
+nx1         40;
+nx2         40;
+nx3         80;
+ny1         30;
+ny2         $nx2;
+ny3         $ny1;
+nz1         $nx2;
+nz2         40;
+
+vertices
+(
+    ($x0 $y0 $z0)  //  0
+    ($x1 $y0 $z0)  //  1
+    ($x2 $y0 $z0)  //  2
+    ($x3 $y0 $z0)  //  3
+    ($x0 $y0 $z1)  //  4
+    ($x1 $y0 $z1)  //  5
+    ($x2 $y0 $z1)  //  6
+    ($x3 $y0 $z1)  //  7
+    ($x0 $y0 $z2)  //  8
+    ($x1 $y0 $z2)  //  9
+    ($x2 $y0 $z2)  // 10
+    ($x3 $y0 $z2)  // 11
+
+    ($x0 $y1 $z0)  // 12
+    ($x1 $y1 $z0)  // 13
+    ($x2 $y1 $z0)  // 14
+    ($x3 $y1 $z0)  // 15
+    ($x0 $y1 $z1)  // 16
+    ($x1 $y1 $z1)  // 17
+    ($x2 $y1 $z1)  // 18
+    ($x3 $y1 $z1)  // 19
+    ($x0 $y1 $z2)  // 20
+    ($x1 $y1 $z2)  // 21
+    ($x2 $y1 $z2)  // 22
+    ($x3 $y1 $z2)  // 23
+
+    ($x0 $y2 $z0)  // 24
+    ($x1 $y2 $z0)  // 25
+    ($x2 $y2 $z0)  // 26
+    ($x3 $y2 $z0)  // 27
+    ($x0 $y2 $z1)  // 28
+    ($x1 $y2 $z1)  // 29
+    ($x2 $y2 $z1)  // 30
+    ($x3 $y2 $z1)  // 31
+    ($x0 $y2 $z2)  // 32
+    ($x1 $y2 $z2)  // 33
+    ($x2 $y2 $z2)  // 34
+    ($x3 $y2 $z2)  // 35
+
+    ($x0 $y3 $z0)  // 36
+    ($x1 $y3 $z0)  // 37
+    ($x2 $y3 $z0)  // 38
+    ($x3 $y3 $z0)  // 39
+    ($x0 $y3 $z1)  // 40
+    ($x1 $y3 $z1)  // 41
+    ($x2 $y3 $z1)  // 42
+    ($x3 $y3 $z1)  // 43
+    ($x0 $y3 $z2)  // 44
+    ($x1 $y3 $z2)  // 45
+    ($x2 $y3 $z2)  // 46
+    ($x3 $y3 $z2)  // 47
+);
+
+edges
+(
+);
+
+x_up     ((0.4 0.25 0.5)(0.3 0.25 0.75)(0.3 0.5 0.2));
+x_down   ((0.15 0.45 3)(0.25 0.35 1.5)(0.6 0.2 5));
+z_top    ((0.2 0.25 4)(0.6 0.5 1)(0.2 0.25 0.25));
+z_bottom ((0.2 0.25 4)(0.6 0.5 1)(0.2 0.25 0.25));
+y_side1  ((0.4 0.1 0.5)(0.4 0.2 0.5)(0.3 0.7 0.1));
+y_side2  ((0.3 0.7 10)(0.4 0.2 2)(0.4 0.1 2));
+
+blocks
+(
+    hex ( 0  1 13 12  4  5 17 16) ($nx1 $ny1 $nz1) simpleGrading ( $x_up $y_side1  $z_bottom)
+    hex ( 1  2 14 13  5  6 18 17) ($nx2 $ny1 $nz1) simpleGrading ( 1   $y_side1  $z_bottom)
+    hex ( 2  3 15 14  6  7 19 18) ($nx3 $ny1 $nz1) simpleGrading ($x_down   $y_side1  $z_bottom)
+    hex ( 4  5 17 16  8  9 21 20) ($nx1 $ny1 $nz2) simpleGrading ( $x_up $y_side1 $z_top)
+    hex ( 5  6 18 17  9 10 22 21) ($nx2 $ny1 $nz2) simpleGrading ( 1   $y_side1 $z_top)
+    hex ( 6  7 19 18 10 11 23 22) ($nx3 $ny1 $nz2) simpleGrading ($x_down   $y_side1 $z_top)
+
+    hex (12 13 25 24 16 17 29 28) ($nx1 $ny2 $nz1) simpleGrading ($x_up 1 $z_bottom)
+    hex (14 15 27 26 18 19 31 30) ($nx3 $ny2 $nz1) simpleGrading ($x_down 1 $z_bottom)
+    hex (16 17 29 28 20 21 33 32) ($nx1 $ny2 $nz2) simpleGrading ($x_up 1 $z_top)
+    hex (17 18 30 29 21 22 34 33) ($nx2 $ny2 $nz2) simpleGrading (1 1 $z_top)
+    hex (18 19 31 30 22 23 35 34) ($nx3 $ny2 $nz2) simpleGrading ($x_down 1 $z_top)
+
+    hex (24 25 37 36 28 29 41 40) ($nx1 $ny3 $nz1) simpleGrading ($x_up $y_side2 $z_bottom)
+    hex (25 26 38 37 29 30 42 41) ($nx2 $ny3 $nz1) simpleGrading (1 $y_side2 $z_bottom)
+    hex (26 27 39 38 30 31 43 42) ($nx3 $ny3 $nz1) simpleGrading ($x_down $y_side2 $z_bottom)
+    hex (28 29 41 40 32 33 45 44) ($nx1 $ny3 $nz2) simpleGrading ($x_up $y_side2 $z_top)
+    hex (29 30 42 41 33 34 46 45) ($nx2 $ny3 $nz2) simpleGrading (1 $y_side2 $z_top)
+    hex (30 31 43 42 34 35 47 46) ($nx3 $ny3 $nz2) simpleGrading ($x_down $y_side2 $z_top)
+);
+
+boundary
+(
+    cube
+    {
+        type    wall;
+        faces
+        (
+            (13 17 18 14)
+            (14 18 30 26)
+            (25 29 30 26)
+            (13 25 29 17)
+            (17 29 30 18)
+        );
+    }
+    topAndBottom
+    {
+        type    wall;
+        faces
+        (
+            // floor
+            ( 0 12 13  1)
+            ( 1 13 14  2)
+            ( 2 14 15  3)
+            (12 24 25 13)
+            (14 26 27 15)
+            (24 36 37 25)
+            (25 37 38 26)
+            (26 38 39 27)
+
+            // top
+            ( 8  9 21 20)
+            ( 9 10 22 21)
+            (10 11 23 22)
+            (20 21 33 32)
+            (21 22 34 33)
+            (22 23 35 34)
+            (32 33 45 44)
+            (33 34 46 45)
+            (34 35 47 46)
+        );
+    }
+
+    sides
+    {
+        type    patch;
+        faces
+        (
+            // minY
+            ( 0  1  5  4)
+            ( 1  2  6  5)
+            ( 2  3  7  6)
+            ( 4  5  9  8)
+            ( 5  6 10  9)
+            ( 6  7 11 10)
+
+            // maxY
+            (36 40 41 37)
+            (37 41 42 38)
+            (38 42 43 39)
+            (40 44 45 41)
+            (41 45 46 42)
+            (42 46 47 43)
+        );
+    }
+
+    inlet
+    {
+        type    patch;
+        faces
+        (
+            ( 0  4 16 12)
+            (12 16 28 24)
+            (24 28 40 36)
+            ( 4  8 20 16)
+            (16 20 32 28)
+            (28 32 44 40)
+        );
+    }
+
+    outlet
+    {
+        type    patch;
+        faces
+        (
+            ( 3 15 19  7)
+            (15 27 31 19)
+            (27 39 43 31)
+            ( 7 19 23 11)
+            (19 31 35 23)
+            (31 43 47 35)
+        );
+    }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/changeDictionaryDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/changeDictionaryDict
new file mode 100644
index 00000000000..c4df534a859
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/changeDictionaryDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      changeDictionaryDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+boundary
+{
+    box
+    {
+        type      patch;
+        inGroups  1 ( patch );
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/controlDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/controlDict
new file mode 100644
index 00000000000..0879c268809
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/controlDict
@@ -0,0 +1,86 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     rhoPimpleAdiabaticFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.05;
+
+deltaT          1e-5;
+
+writeControl    timeStep;
+
+writeInterval   500;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  6;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+adjustTimeStep  no;
+
+maxCo           0.5;
+
+graphFormat     raw;
+
+functions
+{
+    surfaces
+    {
+        type            surfaces;
+        surfaceFormat   boundaryData;
+        writeControl    timeStep;
+        writeInterval   10;
+        interpolationScheme cell;
+        fields
+        (
+            p
+        );
+        formatOptions
+        {
+            boundaryData
+            {
+                format          binary;
+            }
+        }
+        surfaces
+        {
+            window
+            {
+                type            patch;
+                patches         (window);
+                interpolate     false;
+            }
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/createPatchDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/createPatchDict
new file mode 100644
index 00000000000..0c80268fa72
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/createPatchDict
@@ -0,0 +1,41 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      createPatchDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+pointSync false;
+
+// Patches to create.
+patches
+(
+    {
+        // Name of new patch
+        name inlet;
+
+        // Dictionary to construct new patch from
+        patchInfo
+        {
+            type patch;
+        }
+
+        // How to construct: either from 'patches' or 'set'
+        constructFrom set;
+
+        // If constructFrom = set : name of faceSet
+        set f0;
+    }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/decomposeParDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/decomposeParDict
new file mode 100644
index 00000000000..59827275570
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/decomposeParDict
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 6;
+
+method          scotch;
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/extrudeMeshDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/extrudeMeshDict
new file mode 100644
index 00000000000..430caf8b89a
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/extrudeMeshDict
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      extrudeMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+constructFrom    patch;
+
+// If construct from patch/mesh:
+sourceCase       "../main";
+sourcePatches    (fixedWall window);
+
+exposedPatchName fixedWall;
+
+flipNormals      false;
+
+extrudeModel     linearDirection;
+
+nLayers          100;
+
+expansionRatio   1.0;
+
+linearDirectionCoeffs
+{
+    direction       (0 -1 0);
+    thickness       1;
+}
+
+mergeFaces       false;
+
+mergeTol         0;
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSchemes b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSchemes
new file mode 100644
index 00000000000..073db380a0b
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         backward 1;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss LUST grad(U);
+    div(phi,h)      Gauss LUST grad(h);
+    div(phi,K)      Gauss linear;
+    div(phiv,p)     Gauss linear;
+    div(phi,k)      Gauss limitedLinear 1;
+    div(phi,B)      Gauss limitedLinear 1;
+    div(phi,nuTilda) Gauss limitedLinear 1;
+    div(B)          Gauss linear;
+    div(phi,epsilon) Gauss limitedLinear 1;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+wallDist
+{
+     method          meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSolution b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSolution
new file mode 100644
index 00000000000..46875004477
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSolution
@@ -0,0 +1,65 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    "(p|rho)"
+    {
+        solver          PBiCGStab;
+        preconditioner  DIC;
+        tolerance       1e-9;
+        relTol          0.01;
+    }
+
+    "(p|rho)Final"
+    {
+        $p;
+        relTol          0;
+    }
+
+    "(U|h|k|nuTilda|epsilon)"
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+        tolerance       1e-6;
+        relTol          0.01;
+    }
+
+    "(U|h|k|nuTilda|epsilon)Final"
+    {
+        $U;
+        relTol          0;
+    }
+}
+
+PIMPLE
+{
+    momentumPredictor yes;
+    nOuterCorrectors 1;
+    nCorrectors     2;
+    nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+    equations
+    {
+        ".*"  1;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/topoSetDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/topoSetDict
new file mode 100644
index 00000000000..37f685b78b4
--- /dev/null
+++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/topoSetDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2011                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    f0;
+        type    faceSet;
+        action  new;
+        source  boxToFace;
+        box     (1 -0.7 -0.01)(1.5 -0.2 0.01);
+    }
+);
+
+
+// ************************************************************************* //
-- 
GitLab