diff --git a/integration/OpenCFD/code/Allwclean b/integration/OpenCFD/code/Allwclean
new file mode 100755
index 0000000000000000000000000000000000000000..6ec5fd120dc304d8ed846abc6c13302fb310e3d3
--- /dev/null
+++ b/integration/OpenCFD/code/Allwclean
@@ -0,0 +1,5 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+wclean libso waveModel
+wclean libso waveBCs
diff --git a/integration/OpenCFD/code/Allwmake b/integration/OpenCFD/code/Allwmake
new file mode 100755
index 0000000000000000000000000000000000000000..19e81851d198c3e1b179110bd51e60bd21e7d1f2
--- /dev/null
+++ b/integration/OpenCFD/code/Allwmake
@@ -0,0 +1,5 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+wmake libso waveModel
+wmake libso waveBCs
diff --git a/integration/OpenCFD/code/waveBCs/Make/files b/integration/OpenCFD/code/waveBCs/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..734e8d76a9121d7c05083c7afd335c74cf1c0de9
--- /dev/null
+++ b/integration/OpenCFD/code/waveBCs/Make/files
@@ -0,0 +1,4 @@
+waveInletVelocity/waveInletVelocityFvPatchVectorField.C
+waveInletAlpha/waveInletAlphaFvPatchScalarField.C
+
+LIB = $(FOAM_USER_LIBBIN)/libwaveBCs
diff --git a/integration/OpenCFD/code/waveBCs/Make/options b/integration/OpenCFD/code/waveBCs/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..0490e0a2c63e035f06bc5efe710cdc0e59934134
--- /dev/null
+++ b/integration/OpenCFD/code/waveBCs/Make/options
@@ -0,0 +1,11 @@
+DEV_PATH = ..
+
+EXE_INC = \
+    -DFULLDEBUG -g -O0 \
+    -I$(DEV_PATH)/waveModel/lnInclude \
+    -I$(LIB_SRC)/finiteVolume/lnInclude
+
+LIB_LIBS = \
+    -L$(FOAM_USER_LIBBIN) \
+        -lwaveModels \
+    -lfiniteVolume
diff --git a/integration/OpenCFD/code/waveBCs/waveAbsorptionOutletVelocity/waveAbsorptionOutletVelocityFvPatchVectorField.C b/integration/OpenCFD/code/waveBCs/waveAbsorptionOutletVelocity/waveAbsorptionOutletVelocityFvPatchVectorField.C
new file mode 100644
index 0000000000000000000000000000000000000000..e9c8107ff4829af49f940e591c3f65a08b42f41f
--- /dev/null
+++ b/integration/OpenCFD/code/waveBCs/waveAbsorptionOutletVelocity/waveAbsorptionOutletVelocityFvPatchVectorField.C
@@ -0,0 +1,174 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "waveAbsorptionOutletVelocityFvPatchVectorField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFieldMapper.H"
+
+Foam::waveModel&
+Foam::waveAbsorptionOutletVelocityFvPatchVectorField::getWaveModel()
+{
+    // Return waveModel from database if present, or create
+
+    if (!waveModel_.valid())
+    {
+        waveModel_ =
+            waveModel::lookupOrCreate
+            (
+                patch().patch(),
+                internalField().mesh(),
+                waveDictName_
+            );
+    }
+
+    return waveModel_.ref();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveAbsorptionOutletVelocityFvPatchVectorField::
+waveAbsorptionOutletVelocityFvPatchVectorField
+(
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<vector>(p, iF),
+    waveDictName_(waveModel::dictName),
+    waveModelPtr_()
+{}
+
+
+Foam::waveAbsorptionOutletVelocityFvPatchVectorField::
+waveAbsorptionOutletVelocityFvPatchVectorField
+(
+    const waveAbsorptionOutletVelocityFvPatchVectorField& ptf,
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchField<vector>(ptf, p, iF, mapper),
+    waveDictName_(ptf.waveDictName_),
+    waveModelPtr_()
+{}
+
+
+Foam::waveAbsorptionOutletVelocityFvPatchVectorField::
+waveAbsorptionOutletVelocityFvPatchVectorField
+(
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchField<vector>(p, iF, dict),
+    waveDictName_(dict.lookupOrDefault<word>("waveDict", waveModel::dictName)),
+    waveModelPtr_()
+{}
+
+
+Foam::waveAbsorptionOutletVelocityFvPatchVectorField::
+waveAbsorptionOutletVelocityFvPatchVectorField
+(
+    const waveAbsorptionOutletVelocityFvPatchVectorField& ptf
+)
+:
+    fixedValueFvPatchField<vector>(ptf),
+    waveDictName_(ptf.waveDictName_),
+    waveModelPtr_()
+{}
+
+
+Foam::waveAbsorptionOutletVelocityFvPatchVectorField::
+waveAbsorptionOutletVelocityFvPatchVectorField
+(
+    const waveAbsorptionOutletVelocityFvPatchVectorField& ptf,
+    const DimensionedField<vector, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<vector>(ptf, iF),
+    waveDictName_(ptf.waveDictName_),
+    waveModelPtr_()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::waveAbsorptionOutletVelocityFvPatchVectorField::updateCoeffs()
+{
+    if (updated())
+    {
+        return;
+    }
+
+    tmp<waveModel> tmodel
+    (
+        waveModel::lookupOrCreate
+        (
+            patch().patch(),
+            internalField().mesh(),
+            waveDictName_
+        )
+    );
+
+    waveModel& model = const_cast<waveModel&>(tmodel());
+
+    model.correct(db().time().value());
+
+    operator == (model.U());
+
+    fixedValueFvPatchField<vector>::updateCoeffs();
+}
+
+
+void Foam::waveAbsorptionOutletVelocityFvPatchVectorField::write
+(
+    Ostream& os
+) const
+{
+    fvPatchField<vector>::write(os);
+
+    os.writeKeyword("waveDictName") << waveDictName_
+        << token::END_STATEMENT << nl;
+
+    writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+   makePatchTypeField
+   (
+       fvPatchVectorField,
+       waveAbsorptionOutletVelocityFvPatchVectorField
+   );
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveBCs/waveAbsorptionOutletVelocity/waveAbsorptionOutletVelocityFvPatchVectorField.H b/integration/OpenCFD/code/waveBCs/waveAbsorptionOutletVelocity/waveAbsorptionOutletVelocityFvPatchVectorField.H
new file mode 100644
index 0000000000000000000000000000000000000000..1f050ce6f82d40c46e13aefe8d26514bf6ce6e47
--- /dev/null
+++ b/integration/OpenCFD/code/waveBCs/waveAbsorptionOutletVelocity/waveAbsorptionOutletVelocityFvPatchVectorField.H
@@ -0,0 +1,174 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::waveAbsorptionOutletVelocityFvPatchVectorField
+
+Description
+    Example of the boundary condition specification:
+    \verbatim
+    inlet
+    {
+        type            waveAbsorptionOutletVelocity;
+        waveDict        wavesDict;
+        value           uniform (0 0 0);
+	    leftORright	      1.0;
+    }
+    \endverbatim
+
+Usage
+    \table
+        Property     | Description             | Required    | Default value
+        type         | type: waveAbsorptionOutletVelocity | yes         |
+        waveDict     | Dictionary where variables for generation/absorption are defined | yes | waveDict
+	    leftORright  | Define location of Boundary condition: Left(1) or Right (-1) | yes | -1
+    \endtable
+
+Note
+    - The value is positive inwards
+    - May not work correctly for transonic inlets
+    - Strange behaviour with potentialFoam since the U equation is not solved
+
+SourceFiles
+    waveAbsorptionOutletVelocityFvPatchVectorField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveAbsorptionOutletVelocityFvPatchVectorField_H
+#define waveAbsorptionOutletVelocityFvPatchVectorField_H
+
+#include "fixedValueFvPatchFields.H"
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+/*---------------------------------------------------------------------------*\
+       Class waveAbsorptionOutletVelocityFvPatchVectorField Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveAbsorptionOutletVelocityFvPatchVectorField
+:
+    public fixedValueFvPatchVectorField
+{
+    // Private data
+
+        //- Dictionary name
+        word waveDictName_;
+
+        //- Pointer to the wave model
+        tmp<waveModel> waveModel_;
+
+        //- Help function to retrieve the wave model
+        waveModel& getWaveModel();
+
+
+public:
+
+   //- Runtime type information
+   TypeName("waveAbsorptionOutletVelocity");
+
+
+   // Constructors
+
+        //- Construct from patch and internal field
+        waveAbsorptionOutletVelocityFvPatchVectorField
+        (
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        waveAbsorptionOutletVelocityFvPatchVectorField
+        (
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //  waveAbsorptionOutletVelocityFvPatchVectorField
+        //  onto a new patch
+        waveAbsorptionOutletVelocityFvPatchVectorField
+        (
+            const waveAbsorptionOutletVelocityFvPatchVectorField&,
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        waveAbsorptionOutletVelocityFvPatchVectorField
+        (
+            const waveAbsorptionOutletVelocityFvPatchVectorField&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchVectorField> clone() const
+        {
+            return tmp<fvPatchVectorField>
+            (
+                new waveAbsorptionOutletVelocityFvPatchVectorField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        waveAbsorptionOutletVelocityFvPatchVectorField
+        (
+            const waveAbsorptionOutletVelocityFvPatchVectorField&,
+            const DimensionedField<vector, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchVectorField> clone
+        (
+            const DimensionedField<vector, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchVectorField>
+            (
+                new waveAbsorptionOutletVelocityFvPatchVectorField(*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/integration/OpenCFD/code/waveBCs/waveInletAlpha/waveInletAlphaFvPatchScalarField.C b/integration/OpenCFD/code/waveBCs/waveInletAlpha/waveInletAlphaFvPatchScalarField.C
new file mode 100644
index 0000000000000000000000000000000000000000..b9d27cf73f4284b4e809372ee02c49f3f478c8c4
--- /dev/null
+++ b/integration/OpenCFD/code/waveBCs/waveInletAlpha/waveInletAlphaFvPatchScalarField.C
@@ -0,0 +1,167 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "waveInletAlphaFvPatchScalarField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFieldMapper.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+Foam::waveModel& Foam::waveInletAlphaFvPatchScalarField::getWaveModel()
+{
+    // Return waveModel from database if present, or create
+
+    if (!waveModel_.valid())
+    {
+        waveModel_ =
+            waveModel::lookupOrCreate
+            (
+                patch().patch(),
+                internalField().mesh(),
+                waveDictName_
+            );
+    }
+
+    return waveModel_.ref();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveInletAlphaFvPatchScalarField::waveInletAlphaFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<scalar>(p, iF),
+    waveDictName_(waveModel::dictName),
+    waveModel_()
+{}
+
+
+Foam::waveInletAlphaFvPatchScalarField::waveInletAlphaFvPatchScalarField
+(
+    const waveInletAlphaFvPatchScalarField& ptf,
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchField<scalar>(ptf, p, iF, mapper),
+    waveDictName_(ptf.waveDictName_),
+    waveModel_()
+{}
+
+
+Foam::waveInletAlphaFvPatchScalarField::waveInletAlphaFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchField<scalar>(p, iF, dict),
+    waveDictName_(dict.lookupOrDefault<word>("waveDict", waveModel::dictName)),
+    waveModel_()
+{}
+
+
+Foam::waveInletAlphaFvPatchScalarField::waveInletAlphaFvPatchScalarField
+(
+    const waveInletAlphaFvPatchScalarField& ptf
+)
+:
+    fixedValueFvPatchField<scalar>(ptf),
+    waveDictName_(ptf.waveDictName_),
+    waveModel_()
+{}
+
+
+Foam::waveInletAlphaFvPatchScalarField::waveInletAlphaFvPatchScalarField
+(
+    const waveInletAlphaFvPatchScalarField& ptf,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<scalar>(ptf, iF),
+    waveDictName_(ptf.waveDictName_),
+    waveModel_()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::waveInletAlphaFvPatchScalarField::updateCoeffs()
+{
+    if (updated())
+    {
+        return;
+    }
+
+    tmp<waveModel> tmodel
+    (
+        waveModel::lookupOrCreate
+        (
+            patch().patch(),
+            internalField().mesh(),
+            waveDictName_
+        )
+    );
+
+    waveModel& model = const_cast<waveModel&>(tmodel());
+
+    model.correct(db().time().value());
+
+    operator == (model.alpha());
+
+    fixedValueFvPatchField<scalar>::updateCoeffs();
+}
+
+
+void Foam::waveInletAlphaFvPatchScalarField::write(Ostream& os) const
+{
+    fvPatchField<scalar>::write(os);
+
+    os.writeKeyword("waveDictName") << waveDictName_
+        << token::END_STATEMENT << nl;
+
+    writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+   makePatchTypeField
+   (
+       fvPatchScalarField,
+       waveInletAlphaFvPatchScalarField
+   );
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveBCs/waveInletAlpha/waveInletAlphaFvPatchScalarField.H b/integration/OpenCFD/code/waveBCs/waveInletAlpha/waveInletAlphaFvPatchScalarField.H
new file mode 100644
index 0000000000000000000000000000000000000000..b654bd60c8be759e011a67b8e3f4e93cb55c5257
--- /dev/null
+++ b/integration/OpenCFD/code/waveBCs/waveInletAlpha/waveInletAlphaFvPatchScalarField.H
@@ -0,0 +1,174 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::waveInletAlphaFvPatchScalarField
+
+Description
+
+    Example of the boundary condition specification:
+    \verbatim
+    inlet
+    {
+        type            waveInletAlpha;
+        value           uniform (0 0 0);
+	    leftORright	      1.0;
+    }
+    \endverbatim
+
+Usage
+    \table
+        Property    | Description          | Required    | Default value
+        type        | type: waveInletAlpha | yes         |
+        waveDict    | Dictionary specifying wave variables | no | waveProperties
+	    leftORright | Define location of Boundary condition: Left(1) or Right (-1) | yes | -1
+    \endtable
+
+Note
+    - The value is positive inwards
+    - May not work correctly for transonic inlets
+    - Strange behaviour with potentialFoam since the U equation is not solved
+
+SourceFiles
+    waveInletAlphaFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveInletAlphaFvPatchScalarField_H
+#define waveInletAlphaFvPatchScalarField_H
+
+#include "fixedValueFvPatchFields.H"
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+/*---------------------------------------------------------------------------*\
+              class waveInletAlphaFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveInletAlphaFvPatchScalarField
+:
+    public fixedValueFvPatchScalarField
+{
+    // Private data
+
+        //- Dictionary name
+        word waveDictName_;
+
+        //- Pointer to the wave model
+        tmp<waveModel> waveModel_;
+
+        //- Help function to retrieve the wave model
+        waveModel& getWaveModel();
+
+
+public:
+
+   //- Runtime type information
+   TypeName("waveInletAlpha");
+
+
+   // Constructors
+
+        //- Construct from patch and internal field
+        waveInletAlphaFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        waveInletAlphaFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //  waveInletAlphaFvPatchScalarField
+        //  onto a new patch
+        waveInletAlphaFvPatchScalarField
+        (
+            const waveInletAlphaFvPatchScalarField&,
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        waveInletAlphaFvPatchScalarField
+        (
+            const waveInletAlphaFvPatchScalarField&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchScalarField> clone() const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new waveInletAlphaFvPatchScalarField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        waveInletAlphaFvPatchScalarField
+        (
+            const waveInletAlphaFvPatchScalarField&,
+            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 waveInletAlphaFvPatchScalarField(*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/integration/OpenCFD/code/waveBCs/waveInletVelocity/waveInletVelocityFvPatchVectorField.C b/integration/OpenCFD/code/waveBCs/waveInletVelocity/waveInletVelocityFvPatchVectorField.C
new file mode 100644
index 0000000000000000000000000000000000000000..78df5763ed60fffe86a04ae2a3447306da14160d
--- /dev/null
+++ b/integration/OpenCFD/code/waveBCs/waveInletVelocity/waveInletVelocityFvPatchVectorField.C
@@ -0,0 +1,167 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "waveInletVelocityFvPatchVectorField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFieldMapper.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+Foam::waveModel& Foam::waveInletVelocityFvPatchVectorField::getWaveModel()
+{
+    // Return waveModel from database if present, or create
+
+    if (!waveModel_.valid())
+    {
+        waveModel_ =
+            waveModel::lookupOrCreate
+            (
+                patch().patch(),
+                internalField().mesh(),
+                waveDictName_
+            );
+    }
+
+    return waveModel_.ref();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
+(
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<vector>(p, iF),
+    waveDictName_(waveModel::dictName),
+    waveModel_()
+{}
+
+
+Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
+(
+    const waveInletVelocityFvPatchVectorField& ptf,
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchField<vector>(ptf, p, iF, mapper),
+    waveDictName_(ptf.waveDictName_),
+    waveModel_()
+{}
+
+
+Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
+(
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchField<vector>(p, iF, dict),
+    waveDictName_(dict.lookupOrDefault<word>("waveDict", waveModel::dictName)),
+    waveModel_()
+{}
+
+
+Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
+(
+    const waveInletVelocityFvPatchVectorField& ptf
+)
+:
+    fixedValueFvPatchField<vector>(ptf),
+    waveDictName_(ptf.waveDictName_),
+    waveModel_()
+{}
+
+
+Foam::waveInletVelocityFvPatchVectorField::waveInletVelocityFvPatchVectorField
+(
+    const waveInletVelocityFvPatchVectorField& ptf,
+    const DimensionedField<vector, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<vector>(ptf, iF),
+    waveDictName_(ptf.waveDictName_),
+    waveModel_()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::waveInletVelocityFvPatchVectorField::updateCoeffs()
+{
+    if (updated())
+    {
+        return;
+    }
+
+    tmp<waveModel> tmodel
+    (
+        waveModel::lookupOrCreate
+        (
+            patch().patch(),
+            internalField().mesh(),
+            waveDictName_
+        )
+    );
+
+    waveModel& model = const_cast<waveModel&>(tmodel());
+
+    model.correct(db().time().value());
+
+    operator == (model.U());
+
+    fixedValueFvPatchField<vector>::updateCoeffs();
+}
+
+
+void Foam::waveInletVelocityFvPatchVectorField::write(Ostream& os) const
+{
+    fvPatchField<vector>::write(os);
+
+    os.writeKeyword("waveDictName") << waveDictName_
+        << token::END_STATEMENT << nl;
+
+    writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+   makePatchTypeField
+   (
+       fvPatchVectorField,
+       waveInletVelocityFvPatchVectorField
+   );
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveBCs/waveInletVelocity/waveInletVelocityFvPatchVectorField.H b/integration/OpenCFD/code/waveBCs/waveInletVelocity/waveInletVelocityFvPatchVectorField.H
new file mode 100644
index 0000000000000000000000000000000000000000..faa42bee7b05215c07a190802c8e433154a925bf
--- /dev/null
+++ b/integration/OpenCFD/code/waveBCs/waveInletVelocity/waveInletVelocityFvPatchVectorField.H
@@ -0,0 +1,173 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::waveInletVelocityFvPatchVectorField
+
+Description
+    Example of the boundary condition specification:
+    \verbatim
+    inlet
+    {
+        type            waveInletVelocity;
+        value           uniform (0 0 0);
+	    leftORright	      1.0;
+    }
+    \endverbatim
+
+Usage
+    \table
+        Property    | Description             | Required   | Default value
+        type        | type: waveInletVelocity | yes        |
+        waveDict    | Dictionary specifying wave variables | no | waveProperties
+	    leftORright | Define location of Boundary condition: Left(1) or Right (-1) | yes | -1
+    \endtable
+
+Note
+    - The value is positive inwards
+    - May not work correctly for transonic inlets
+    - Strange behaviour with potentialFoam since the U equation is not solved
+
+SourceFiles
+    waveInletVelocityFvPatchVectorField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveInletVelocityFvPatchVectorField_H
+#define waveInletVelocityFvPatchVectorField_H
+
+#include "fixedValueFvPatchFields.H"
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+/*---------------------------------------------------------------------------*\
+             Class waveInletVelocityFvPatchVectorField Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveInletVelocityFvPatchVectorField
+:
+    public fixedValueFvPatchVectorField
+{
+    // Private data
+
+        //- Dictionary name
+        word waveDictName_;
+
+        //- Pointer to the wave model
+        tmp<waveModel> waveModel_;
+
+        //- Help function to retrieve the wave model
+        waveModel& getWaveModel();
+
+
+public:
+
+   //- Runtime type information
+   TypeName("waveInletVelocity");
+
+
+   // Constructors
+
+        //- Construct from patch and internal field
+        waveInletVelocityFvPatchVectorField
+        (
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        waveInletVelocityFvPatchVectorField
+        (
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //  waveInletVelocityFvPatchVectorField
+        //  onto a new patch
+        waveInletVelocityFvPatchVectorField
+        (
+            const waveInletVelocityFvPatchVectorField&,
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        waveInletVelocityFvPatchVectorField
+        (
+            const waveInletVelocityFvPatchVectorField&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchVectorField> clone() const
+        {
+            return tmp<fvPatchVectorField>
+            (
+                new waveInletVelocityFvPatchVectorField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        waveInletVelocityFvPatchVectorField
+        (
+            const waveInletVelocityFvPatchVectorField&,
+            const DimensionedField<vector, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchVectorField> clone
+        (
+            const DimensionedField<vector, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchVectorField>
+            (
+                new waveInletVelocityFvPatchVectorField(*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/integration/OpenCFD/code/waveModel/Make/files b/integration/OpenCFD/code/waveModel/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..36161a0045c1b6db82afc6ec1e6097e7069450bc
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/Make/files
@@ -0,0 +1,18 @@
+waveModel/waveModel.C
+waveModel/waveModelNew.C
+
+waveGenerationModels/base/waveGenerationModel/waveGenerationModel.C
+waveGenerationModels/base/regularWaveModel/regularWaveModel.C
+waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.C
+waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C
+waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C
+waveGenerationModels/derived/StokesII/StokesIIWaveModel.C
+waveGenerationModels/derived/StokesI/StokesIWaveModel.C
+waveGenerationModels/derived/StokesV/StokesVWaveModel.C
+
+
+waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.C
+waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.C
+
+
+LIB = $(FOAM_USER_LIBBIN)/libwaveModels
diff --git a/integration/OpenCFD/code/waveModel/Make/options b/integration/OpenCFD/code/waveModel/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..856294218da6ee85e92a00c7409170de3b0ca5f7
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/Make/options
@@ -0,0 +1,6 @@
+EXE_INC = \
+    -DFULLDEBUG -g -O0 \
+    -I$(LIB_SRC)/finiteVolume/lnInclude
+
+LIB_LIBS = \
+    -lfiniteVolume
diff --git a/integration/OpenCFD/code/waveModel/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.C b/integration/OpenCFD/code/waveModel/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..6bb712abd63e8c7335e34f8223b152b1628c836a
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.C
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "waveAbsorptionModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(waveAbsorptionModel, 0);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::waveAbsorptionModel::waveAbsorptionModel
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    waveModel(dict, mesh, patch, false)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::waveAbsorptionModel::~waveAbsorptionModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::waveAbsorptionModel::read()
+{
+    if (waveModel::read())
+    {
+        // Note: always set to true
+        activeAbsorption_ = true;
+
+        return true;
+    }
+
+    return false;
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.H b/integration/OpenCFD/code/waveModel/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..0f60c8c7784ab5542f104da72e1ba633cd91095b
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.H
@@ -0,0 +1,95 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveAbsorptionModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_waveAbsorptionModel_H
+#define waveModels_waveAbsorptionModel_H
+
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class waveAbsorptionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveAbsorptionModel
+:
+    public waveModel
+{
+protected:
+
+    // Protected Member Functions
+
+        //- Wave direction
+        virtual scalar direction() const
+        {
+            return -1;
+        }
+
+
+public:
+
+    //- Runtime type information
+    TypeName("waveAbsorptionModel");
+
+    //- Constructor
+    waveAbsorptionModel
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~waveAbsorptionModel();
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.C b/integration/OpenCFD/code/waveModel/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.C
new file mode 100644
index 0000000000000000000000000000000000000000..9fb497d04e9fa22c2d3d95a44a091c82b6ba62de
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.C
@@ -0,0 +1,114 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "shallowWaterAbsorption.H"
+#include "volFields.H"
+#include "fvPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(shallowWaterAbsorption, 0);
+    addToRunTimeSelectionTable(waveModel, shallowWaterAbsorption, patch);
+}
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+void Foam::waveModels::shallowWaterAbsorption::setLevel
+(
+    const scalar t,
+    const scalar tCoeff,
+    scalarField& level
+) const
+{
+    level = waterDepthRef_;
+}
+
+
+void Foam::waveModels::shallowWaterAbsorption::setVelocity
+(
+    const scalar t,
+    const scalar tCoeff,
+    const scalarField& level
+)
+{
+    U_ = vector::zero;
+}
+
+
+void Foam::waveModels::shallowWaterAbsorption::setAlpha
+(
+    const scalarField& level
+)
+{
+    // Set alpha as zero-gradient
+    const volScalarField& alpha =
+        mesh_.lookupObject<volScalarField>(alphaName_);
+
+    alpha_ = alpha.boundaryField()[patch_.index()].patchInternalField();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::shallowWaterAbsorption::shallowWaterAbsorption
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    waveAbsorptionModel(dict, mesh, patch, false)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::shallowWaterAbsorption::~shallowWaterAbsorption()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::shallowWaterAbsorption::read()
+{
+    return waveAbsorptionModel::read();
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.H b/integration/OpenCFD/code/waveModel/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.H
new file mode 100644
index 0000000000000000000000000000000000000000..8db9d45cc33d16cb637a61ea3658de8fe9f8b987
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.H
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::shallowWaterAbsorption
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_shallowWaterAbsorption_H
+#define waveModels_shallowWaterAbsorption_H
+
+#include "waveAbsorptionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class shallowWaterAbsorption Declaration
+\*---------------------------------------------------------------------------*/
+
+class shallowWaterAbsorption
+:
+    public waveAbsorptionModel
+{
+protected:
+
+    // Protected Member Functions
+
+
+        //- Set the water level
+        virtual void setLevel
+        (
+            const scalar t,
+            const scalar tCoeff,
+            scalarField& level
+        ) const;
+
+        //- Calculate the wave model velocity
+        virtual void setVelocity
+        (
+            const scalar t,
+            const scalar tCoeff,
+            const scalarField& level
+        );
+
+        //- Set the alpha field based on the water level
+        virtual void setAlpha(const scalarField& level);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("shallowWaterAbsorption");
+
+    //- Constructor
+    shallowWaterAbsorption
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~shallowWaterAbsorption();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/base/regularWaveModel/regularWaveModel.C b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/regularWaveModel/regularWaveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..1d877175eaecbb4e562272416e0effeb3d12c091
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/regularWaveModel/regularWaveModel.C
@@ -0,0 +1,126 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "regularWaveModel.H"
+#include "mathematicalConstants.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(regularWaveModel, 0);
+}
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+Foam::word Foam::waveModels::regularWaveModel::waveType() const
+{
+    scalar waveK = 2.0*mathematical::pi/waveLength_;
+
+    word generation = "Intermediate";
+    if (waveK*waterDepthRef_ > mathematical::pi)
+    {
+        generation = "Deep";
+    }
+    else if (waveK*waterDepthRef_ < 0.1*mathematical::pi)
+    {
+        generation = "Shallow";
+    }
+
+    return generation;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::regularWaveModel::regularWaveModel
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    waveGenerationModel(dict, mesh, patch, false),
+    wavePeriod_(0),
+    waveLength_(0),
+    wavePhase_(1.5*mathematical::pi)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::regularWaveModel::~regularWaveModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::regularWaveModel::read()
+{
+    if (waveGenerationModel::read())
+    {
+        lookup("wavePeriod") >> wavePeriod_;
+        if (wavePeriod_ < 0)
+        {
+            FatalIOErrorInFunction(*this)
+                << "Wave period must be greater than zero.  Supplied"
+                << " value wavePeriod = " << wavePeriod_
+                << exit(FatalIOError);
+        }
+
+        readIfPresent("wavePhase", wavePhase_);
+
+        // Note: waveLength to be set in derived classes
+
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::regularWaveModel::info(Ostream& os) const
+{
+    waveGenerationModel::info(os);
+
+    os  << "    Wave period : " << wavePeriod_ << nl
+        << "    Wave length : " << waveLength_ << nl
+        << "    Wave phase : " << wavePhase_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/base/regularWaveModel/regularWaveModel.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/regularWaveModel/regularWaveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..64404b9f462ef8efd8ecfc7cc6bbf9cbd0e300c7
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/regularWaveModel/regularWaveModel.H
@@ -0,0 +1,116 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModels::regularWaveModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_reguarWaveModel_H
+#define waveModels_reguarWaveModel_H
+
+#include "waveGenerationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class regularWaveModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class regularWaveModel
+:
+    public waveGenerationModel
+{
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        regularWaveModel(const regularWaveModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const regularWaveModel&);
+
+
+protected:
+
+    // Protected data
+
+        //- Wave period
+        scalar wavePeriod_;
+
+        //- Wavelength
+        scalar waveLength_;
+
+        //- Wave phase
+        scalar wavePhase_;
+
+    // Protected Member Functions
+
+        //- Return word description of wave type
+        word waveType() const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("regularWaveModel");
+
+
+    //- Constructor
+    regularWaveModel
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~regularWaveModel();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.C b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..4ea1bf721248658ca59246b1775648125fc7c299
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.C
@@ -0,0 +1,91 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "solitaryWaveModel.H"
+#include "polyPatch.H"
+#include "SubField.H"
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(solitaryWaveModel, 0);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::solitaryWaveModel::solitaryWaveModel
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    waveGenerationModel(dict, mesh, patch, false),
+    x_
+    (
+        patch.faceCentres().component(0)*cos(waveAngle_)
+      + patch.faceCentres().component(1)*sin(waveAngle_)
+    ),
+    x0_(gMin(x_))
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::solitaryWaveModel::~solitaryWaveModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::solitaryWaveModel::read()
+{
+    if (waveGenerationModel::read())
+    {
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::solitaryWaveModel::info(Ostream& os) const
+{
+    waveGenerationModel::info(os);
+
+    os << "    x0: " << x0_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..4ac086f5f44e7ec852129791bd69c0dd79736eff
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.H
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModels::solitaryWaveModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_solitaryWaveModel_H
+#define waveModels_solitaryWaveModel_H
+
+#include "waveGenerationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class solitaryWaveModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class solitaryWaveModel
+:
+    public waveGenerationModel
+{
+
+protected:
+
+    // Protected data
+
+        //-
+        const scalarField& x_;
+
+        const scalar x0_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("solitaryWaveModel");
+
+
+    //- Constructor
+    solitaryWaveModel
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~solitaryWaveModel();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.C b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..daed9a9138fb41072e003ebf126cc1d5d8416b91
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.C
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "waveGenerationModel.H"
+#include "mathematicalConstants.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(waveGenerationModel, 0);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::waveGenerationModel::waveGenerationModel
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    waveModel(dict, mesh, patch, false),
+    waveHeight_(0),
+    waveAngle_(0)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::waveGenerationModel::~waveGenerationModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::waveGenerationModel::read()
+{
+    if (waveModel::read())
+    {
+        lookup("rampTime") >> rampTime_;
+        lookup("activeAbsorption") >> activeAbsorption_;
+
+        lookup("waveHeight") >> waveHeight_;
+        if (waveHeight_ < 0)
+        {
+            FatalIOErrorInFunction(*this)
+                << "Wave height must be greater than zero.  Supplied"
+                << " value waveHeight = " << waveHeight_
+                << exit(FatalIOError);
+        }
+
+        lookup("waveAngle") >> waveAngle_;
+        waveAngle_ *= mathematical::pi/180;
+
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::waveGenerationModel::info(Ostream& os) const
+{
+    waveModel::info(os);
+
+    os  << "    Ramp time : " << rampTime_ << nl
+        << "    Wave height : " << waveHeight_ << nl
+        << "    Wave angle  : " << 180/mathematical::pi*waveAngle_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..267aa1e83c0d7a5b4d751a4be7fc65679b10a847
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.H
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveGenerationModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_waveGenerationModel_H
+#define waveModels_waveGenerationModel_H
+
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                     Class waveGenerationModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveGenerationModel
+:
+    public waveModel
+{
+protected:
+
+    // Protected data
+
+        //- Wave height / [m]
+        scalar waveHeight_;
+
+        //- Wave angle / [rad]  (read in degrees)
+        scalar waveAngle_;
+
+
+    // Protected Member Functions
+
+        //- Wave direction
+        virtual scalar direction() const
+        {
+            return 1;
+        }
+
+
+public:
+
+    //- Runtime type information
+    TypeName("waveGenerationModel");
+
+    //- Constructor
+    waveGenerationModel
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~waveGenerationModel();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..d4e13db39093703668496cd22971325f9229072c
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C
@@ -0,0 +1,251 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "BoussinesqWaveModel.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(Boussinesq, 0);
+    addToRunTimeSelectionTable
+    (
+        waveModel,
+        Boussinesq,
+        patch
+    );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::Boussinesq::eta
+(
+    const scalar H,
+    const scalar h,
+    const scalar x,
+    const scalar y,
+    const scalar theta,
+    const scalar t,
+    const scalar X0
+) const
+{
+    scalar C = sqrt(mag(g_)*(H + h));
+    scalar ts = 3.5*h/sqrt(H/h);
+    scalar aux = sqrt(3.0*H/(4.0*h))/h;
+    scalar Xa = -C*t + ts - X0 + x*cos(theta) + y*sin(theta);
+
+    return H*1.0/sqr(cosh(aux*Xa));
+}
+
+
+Foam::vector Foam::waveModels::Boussinesq::Deta
+(
+    const scalar H,
+    const scalar h,
+    const scalar x,
+    const scalar y,
+    const scalar theta,
+    const scalar t,
+    const scalar X0
+) const
+{
+    vector deta(vector::zero);
+
+    scalar C = sqrt(mag(g_)*(H + h));
+    scalar ts = 3*h/sqrt(H/h);
+    scalar a = sqrt(3*H/(4*h))/h;
+    scalar Xa = -C*t + ts - X0 + x*cos(theta) + y*sin(theta);
+    scalar expTerm = exp(2*a*Xa);
+    scalar b = 8*a*h*expTerm;
+
+    deta[0] =
+        b*(1 - expTerm)
+       /pow3(1 + expTerm);
+
+    deta[1] =
+        2*a*b*(exp(4*a*Xa) - 4*expTerm + 1)
+       /pow4(1 + expTerm);
+
+    deta[2] =
+       -4*sqr(a)*b*(exp(6*a*Xa) - 11*exp(4*a*Xa) + 11*expTerm - 1)
+       /pow5(1 + expTerm);
+
+    return deta;
+}
+
+
+Foam::vector Foam::waveModels::Boussinesq::U
+(
+    const scalar H,
+    const scalar h,
+    const scalar x,
+    const scalar y,
+    const scalar theta,
+    const scalar t,
+    const scalar X0,
+    const scalar z
+) const
+{
+    scalar C = sqrt(mag(g_)*(H + h));
+    scalar eta = this->eta(H, h, x, y, theta, t, X0);
+    vector Deta = this->Deta(H, h, x, y, theta, t, X0);
+
+    scalar u =
+        C*eta/h
+       *(
+            1.0
+          - eta/(4.0*h)
+          + sqr(h)/(3.0*eta)*(1.0 - 3.0/2.0*sqr(z/h))*Deta[1]
+        );
+
+    scalar w =
+       -C*z/h
+       *(
+            (1.0 - eta/(2.0*h))*Deta[0]
+          + sqr(h)/3.0*(1.0 - 1.0/2.0*sqr(z/h))*Deta[2]
+        );
+
+    scalar v = u*sin(waveAngle_);
+    u *= cos(waveAngle_);
+
+    return vector(u, v, w);
+}
+
+
+void Foam::waveModels::Boussinesq::setLevel
+(
+    const scalar t,
+    const scalar tCoeff,
+    scalarField& level
+) const
+{
+    forAll(level, paddlei)
+    {
+        const scalar eta =
+            this->eta
+            (
+                waveHeight_,
+                waterDepthRef_,
+                xPaddle_[paddlei],
+                yPaddle_[paddlei],
+                waveAngle_,
+                t,
+                x0_
+            );
+
+        level[paddlei] = waterDepthRef_ + tCoeff*eta;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::Boussinesq::Boussinesq
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    solitaryWaveModel(dict, mesh, patch, false)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::Boussinesq::~Boussinesq()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::Boussinesq::read()
+{
+    if (solitaryWaveModel::read())
+    {
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::Boussinesq::setVelocity
+(
+    const scalar t,
+    const scalar tCoeff,
+    const scalarField& level
+)
+{
+    forAll(U_, facei)
+    {
+        // Fraction of geometry represented by paddle - to be set
+        scalar fraction = 1;
+
+        // Height - to be set
+        scalar z = 0;
+
+        setPaddlePropeties(level, facei, fraction, z);
+
+        if (fraction > 0)
+        {
+            const label paddlei = faceToPaddle_[facei];
+
+            const vector Uf = U
+	        (
+                waveHeight_,
+                waterDepthRef_,
+                xPaddle_[paddlei],
+                yPaddle_[paddlei],
+                waveAngle_,
+                t,
+                x0_,
+                z
+            );
+
+            U_[facei] = fraction*Uf*tCoeff;
+        }
+    }
+}
+
+
+void Foam::waveModels::Boussinesq::info(Ostream& os) const
+{
+    solitaryWaveModel::info(os);
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..10ff40244608b0b4a52ba5b303484b09355e8b9c
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.H
@@ -0,0 +1,145 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModels::Boussinesq
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_Boussinesq_H
+#define waveModels_Boussinesq_H
+
+#include "solitaryWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class Boussinesq Declaration
+\*---------------------------------------------------------------------------*/
+
+class Boussinesq
+:
+    public solitaryWaveModel
+{
+protected:
+
+    // Protected Member Functions
+
+        //- Wave height
+        virtual scalar eta
+        (
+            const scalar H,
+            const scalar h,
+            const scalar x,
+            const scalar y,
+            const scalar theta,
+            const scalar t,
+            const scalar X0
+        ) const;
+
+        //- wave
+        virtual vector Deta
+        (
+            const scalar H,
+            const scalar h,
+            const scalar x,
+            const scalar y,
+            const scalar theta,
+            const scalar t,
+            const scalar X0
+        ) const;
+
+        //- Wave velocity
+        virtual vector U
+        (
+            const scalar H,
+            const scalar h,
+            const scalar x,
+            const scalar y,
+            const scalar theta,
+            const scalar t,
+            const scalar X0,
+            const scalar z
+        ) const;
+
+        //- Set the water level
+        virtual void setLevel
+        (
+            const scalar t,
+            const scalar tCoeff,
+            scalarField& level
+        ) const;
+
+        //- Calculate the wave model velocity
+        virtual void setVelocity
+        (
+            const scalar t,
+            const scalar tCoeff,
+            const scalarField& level
+        );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("Boussinesq");
+
+    //- Constructor
+    Boussinesq
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~Boussinesq();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesI/StokesIWaveModel.C b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesI/StokesIWaveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..79342d182b89d85bcac1b8465a2902d8a99c2f66
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesI/StokesIWaveModel.C
@@ -0,0 +1,238 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "StokesIWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(StokesI, 0);
+    addToRunTimeSelectionTable
+    (
+        waveModel,
+        StokesI,
+        patch
+    );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::StokesI::waveLength
+(
+    const scalar h,
+    const scalar T
+) const
+{
+    scalar L0 = mag(g_)*T*T/(2.0*mathematical::pi);
+    scalar L = L0;
+
+    for (int i=1; i<=100; i++)
+    {
+        L = L0*tanh(2.0*mathematical::pi*h/L);
+    }
+
+    return L;
+}
+
+
+Foam::scalar Foam::waveModels::StokesI::eta
+(
+    const scalar H,
+    const scalar Kx,
+    const scalar x,
+    const scalar Ky,
+    const scalar y,
+    const scalar omega,
+    const scalar t,
+    const scalar phase
+) const
+{
+    scalar phaseTot = Kx*x + Ky*y - omega*t + phase;
+
+    return H*0.5*cos(phaseTot);
+}
+
+Foam::vector Foam::waveModels::StokesI::U
+(
+    const scalar H,
+    const scalar h,
+    const scalar Kx,
+    const scalar x,
+    const scalar Ky,
+    const scalar y,
+    const scalar omega,
+    const scalar t,
+    const scalar phase,
+    const scalar z
+) const
+{
+    scalar k = sqrt(Kx*Kx + Ky*Ky);
+    scalar phaseTot = Kx*x + Ky*y - omega*t + phase;
+
+    scalar u = H*0.5*omega*cos(phaseTot)*cosh(k*z)/sinh(k*h);
+    scalar w = H*0.5*omega*sin(phaseTot)*sinh(k*z)/sinh(k*h);
+    scalar v = u*sin(waveAngle_);
+    u *= cos(waveAngle_);
+
+    return vector(u, v, w);
+}
+
+
+void Foam::waveModels::StokesI::setLevel
+(
+    const scalar t,
+    const scalar tCoeff,
+    scalarField& level
+) const
+{
+    const scalar waveOmega = mathematical::twoPi/wavePeriod_;
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(level, paddlei)
+    {
+        const scalar eta =
+            this->eta
+	        (
+                waveHeight_,
+                waveKx,
+                xPaddle_[paddlei],
+                waveKy,
+                yPaddle_[paddlei],
+                waveOmega,
+                t,
+                wavePhase_
+            );
+
+        level[paddlei] = waterDepthRef_ + tCoeff*eta;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesI::StokesI
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    regularWaveModel(dict, mesh, patch, false)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesI::~StokesI()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::StokesI::read()
+{
+    if (regularWaveModel::read())
+    {
+		waveLength_ = waveLength(waterDepthRef_, wavePeriod_);
+
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::StokesI::setVelocity
+(
+    const scalar t,
+    const scalar tCoeff,
+    const scalarField& level
+)
+{
+    const scalar waveOmega = mathematical::twoPi/wavePeriod_;
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(U_, facei)
+    {
+        // Fraction of geometry represented by paddle - to be set
+        scalar fraction = 1;
+
+        // Height - to be set
+        scalar z = 0;
+
+        setPaddlePropeties(level, facei, fraction, z);
+
+        if (fraction > 0)
+        {
+            const label paddlei = faceToPaddle_[facei];
+
+            const vector Uf = U
+	        (
+                waveHeight_,
+                waterDepthRef_,
+                waveKx,
+                xPaddle_[paddlei],
+                waveKy,
+                yPaddle_[paddlei],
+                waveOmega,
+                t,
+                wavePhase_,
+                z
+            );
+
+            U_[facei] = fraction*Uf*tCoeff;
+        }
+    }
+}
+
+
+void Foam::waveModels::StokesI::info(Ostream& os) const
+{
+    regularWaveModel::info(os);
+
+    os  << "    Wave type: " << waveType() << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesI/StokesIWaveModel.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesI/StokesIWaveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..6e991c09f4afc4be06db69c5a1587e0bdf06c743
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesI/StokesIWaveModel.H
@@ -0,0 +1,138 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModels::StokesI
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_StokesI_H
+#define waveModels_StokesI_H
+
+#include "regularWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                            Class StokesI Declaration
+\*---------------------------------------------------------------------------*/
+
+class StokesI
+:
+    public regularWaveModel
+{
+protected:
+
+    // Protected Member Functions
+
+        //- Return the wavelength
+        virtual scalar waveLength(const scalar h, const scalar T) const;
+
+        virtual scalar eta
+        (
+            const scalar H,
+            const scalar Kx,
+            const scalar x,
+            const scalar Ky,
+            const scalar y,
+            const scalar omega,
+            const scalar t,
+            const scalar phase
+        ) const;
+
+        virtual vector U
+        (
+            const scalar H,
+            const scalar h,
+            const scalar Kx,
+            const scalar x,
+            const scalar Ky,
+            const scalar y,
+            const scalar omega,
+            const scalar t,
+            const scalar phase,
+            const scalar z
+        ) const;
+
+
+        //- Set the water level
+        virtual void setLevel
+        (
+            const scalar t,
+            const scalar tCoeff,
+            scalarField& level
+        ) const;
+
+        //- Calculate the wave model velocity
+        virtual void setVelocity
+        (
+            const scalar t,
+            const scalar tCoeff,
+            const scalarField& level
+        );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("StokesI");
+
+    //- Constructor
+    StokesI
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~StokesI();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesII/StokesIIWaveModel.C b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesII/StokesIIWaveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..c50e80c6da19833f7e2bc18c877793e34dfe4fb2
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesII/StokesIIWaveModel.C
@@ -0,0 +1,181 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "StokesIIWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(StokesII, 0);
+    addToRunTimeSelectionTable
+    (
+        waveModel,
+        StokesII,
+        patch
+    );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::StokesII::eta
+(
+    const scalar H,
+    const scalar h,
+    const scalar Kx,
+    const scalar x,
+    const scalar Ky,
+    const scalar y,
+    const scalar omega,
+    const scalar t,
+    const scalar phase
+) const
+{
+    const scalar k = sqrt(Kx*Kx + Ky*Ky);
+    const scalar sigma = tanh(k*h);
+    const scalar phaseTot = Kx*x + Ky*y - omega*t + phase;
+
+    return
+        H*0.5*cos(phaseTot)
+      + k*H*H/4.0*(3.0 - sigma*sigma)/(4.0*pow3(sigma))*cos(2.0*phaseTot);
+}
+
+
+Foam::vector Foam::waveModels::StokesII::U
+(
+    const scalar H,
+    const scalar h,
+    const scalar Kx,
+    const scalar x,
+    const scalar Ky,
+    const scalar y,
+    const scalar omega,
+    const scalar t,
+    const scalar phase,
+    const scalar z
+) const
+{
+    const scalar k = sqrt(Kx*Kx + Ky*Ky);
+    const scalar phaseTot = Kx*x + Ky*y - omega*t + phase;
+
+    scalar u =
+        H*0.5*omega*cos(phaseTot)*cosh(k*z)/sinh(k*h)
+      + 3.0/4.0*H*H/4.0*omega*k*cosh(2.0*k*z)/pow4(sinh(k*h))*cos(2.0*phaseTot);
+    scalar w =
+        H*0.5*omega*sin(phaseTot)*sinh(k*z)/sinh(k*h)
+      + 3.0/4.0*H*H/4.0*omega*k*sinh(2.0*k*z)/pow4(sinh(k*h))*sin(2.0*phaseTot);
+    scalar v = u*sin(waveAngle_);
+    u *= cos(waveAngle_);
+
+    return vector(u, v, w);
+}
+
+
+void Foam::waveModels::StokesII::setLevel
+(
+    const scalar t,
+    const scalar tCoeff,
+    scalarField& level
+) const
+{
+    const scalar waveOmega = mathematical::twoPi/wavePeriod_;
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(level, paddlei)
+    {
+        const scalar eta =
+            this->eta
+	        (
+                waveHeight_,
+                waterDepthRef_,
+                waveKx,
+                xPaddle_[paddlei],
+                waveKy,
+                yPaddle_[paddlei],
+                waveOmega,
+                t,
+                wavePhase_
+            );
+
+        level[paddlei] = waterDepthRef_ + tCoeff*eta;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesII::StokesII
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    StokesI(dict, mesh, patch, false)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesII::~StokesII()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::StokesII::read()
+{
+    if (StokesI::read())
+    {
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::StokesII::info(Ostream& os) const
+{
+    StokesI::info(os);
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesII/StokesIIWaveModel.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesII/StokesIIWaveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..f1f631727006aa3bfaa64dc37cd9ba28d6c3856c
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesII/StokesIIWaveModel.H
@@ -0,0 +1,128 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModels::StokesII
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_StokesII_H
+#define waveModels_StokesII_H
+
+#include "StokesIWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                          Class StokesII Declaration
+\*---------------------------------------------------------------------------*/
+
+class StokesII
+:
+    public StokesI
+{
+protected:
+
+    // Protected Member Functions
+
+        virtual scalar eta
+        (
+            const scalar H,
+            const scalar h,
+            const scalar Kx,
+            const scalar x,
+            const scalar Ky,
+            const scalar y,
+            const scalar omega,
+            const scalar t,
+            const scalar phase
+        ) const;
+
+        virtual vector U
+        (
+            const scalar H,
+            const scalar h,
+            const scalar Kx,
+            const scalar x,
+            const scalar Ky,
+            const scalar y,
+            const scalar omega,
+            const scalar t,
+            const scalar phase,
+            const scalar z
+        ) const;
+
+
+        //- Set the water level
+        virtual void setLevel
+        (
+            const scalar t,
+            const scalar tCoeff,
+            scalarField& level
+        ) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("StokesII");
+
+    //- Constructor
+    StokesII
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~StokesII();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesV/StokesVWaveModel.C b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesV/StokesVWaveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..c67b9e7ab17848ce3197122483bd9ae5bb75fd4c
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesV/StokesVWaveModel.C
@@ -0,0 +1,895 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "StokesVWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(StokesV, 0);
+    addToRunTimeSelectionTable
+    (
+        waveModel,
+        StokesV,
+        patch
+    );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::StokesV::A11
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    return 1.0/s;
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A13
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+    return -sqr(c)*(5*sqr(c) + 1)/(8*pow5(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A15
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+       -(
+            1184*pow(c, 10)
+          - 1440*pow(c, 8)
+          - 1992*pow6(c)
+          + 2641*pow4(c)
+          - 249*sqr(c) + 18
+        )
+       /(1536*pow(s, 11));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A22
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    return 3/(8*pow4(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A24
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (192*pow(c, 8) - 424*pow(c, 6) - 312*pow4(c) + 480*sqr(c) - 17)
+       /(768*pow(s, 10));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A33
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return (13 - 4*sqr(c))/(64*pow(s, 7));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A35
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (
+            512*pow(c, 12)
+          + 4224*pow(c, 10)
+          - 6800*pow(c, 8)
+          - 12808*pow(c, 6)
+          + 16704.0*pow4(c)
+          - 3154*sqr(c)
+          + 107
+        )
+       /(4096*pow(s, 13)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A44
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (80*pow(c, 6) - 816*pow4(c) + 1338*sqr(c) - 197)
+       /(1536*pow(s, 10)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A55
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+       -(
+            2880*pow(c, 10)
+          - 72480*pow(c, 8)
+          + 324000*pow(c, 6)
+          - 432000*pow4(c)
+          + 163470*sqr(c)
+          - 16245
+        )
+       /(61440*pow(s, 11)*(6*sqr(c) - 1)*(8*pow4(c) - 11*sqr(c) + 3));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B22
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return (2*sqr(c) + 1)*c/(4*pow3(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B24
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (272*pow(c, 8) - 504*pow(c, 6) - 192*pow4(c) + 322*sqr(c) + 21)*c
+       /(384*pow(s, 9));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B33
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return (8*pow6(c) + 1)*3/(64*pow6(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B33k
+(
+    const scalar h,
+    const scalar k
+) const // d B33 / d k
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    const scalar sk = h*s;
+    const scalar ck = h*c;
+
+    return 9.*pow5(c)*ck/(4*pow6(s)) - (9*(8*pow6(c) + 1))/(32*pow(s, 7))*sk;
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B35
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (
+            88128*pow(c, 14)
+          - 208224*pow(c, 12)
+          + 70848*pow(c, 10)
+          + 54000*pow(c, 8)
+          - 21816*pow6(c)
+          + 6264*pow4(c)
+          - 54*sqr(c)
+          - 81
+        )
+       /(12288*pow(s, 12)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B35k
+(
+    const scalar h,
+    const scalar k
+) const // d B35 / d k
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    const scalar sk = h*s;
+    const scalar ck = h*c;
+
+    return
+        (
+            14*88128*pow(c, 13)*ck
+          - 12*208224*pow(c, 11)*ck
+          + 10*70848*pow(c, 9)*ck
+          + 8*54000.0*pow(c, 7)*ck
+          - 6*21816*pow5(c)*ck
+          + 4*6264*pow3(c)*ck
+          - 2*54*c*ck
+        )
+       /(12288*pow(s, 12)*(6*sqr(c) - 1))
+      - (
+            88128*pow(c, 14)
+          - 208224*pow(c, 12)
+          + 70848*pow(c, 10)
+          + 54000*pow(c, 8)
+          - 21816*pow6(c)
+          + 6264*pow4(c)
+          - 54*sqr(c)
+          - 81
+        )*12
+       /(12288*pow(s, 13)*(6*sqr(c) - 1))*sk
+      - (
+            88128*pow(c,14)
+          - 208224*pow(c, 12)
+          + 70848*pow(c, 10)
+          + 54000*pow(c, 8)
+          - 21816*pow6(c)
+          + 6264*pow4(c)
+          - 54*sqr(c)
+          - 81
+        )*12*c*ck
+       /(12288*pow(s, 12)*sqr(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B44
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (
+            768*pow(c, 10)
+          - 448*pow(c, 8)
+          - 48*pow6(c)
+          + 48*pow4(c)
+          + 106*sqr(c)
+          - 21
+        )*c
+       /(384*pow(s, 9)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B55
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (
+            192000*pow(c, 16)
+          - 262720*pow(c, 14)
+          + 83680*pow(c, 12)
+          + 20160*pow(c, 10)
+          - 7280*pow(c, 8)
+          + 7160*pow(c, 6)
+          - 1800*pow(c, 4)
+          - 1050*sqr(c)
+          + 225
+        )
+       /(12288*pow(s, 10)*(6*sqr(c) - 1)*(8*pow4(c) - 11*sqr(c) + 3));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B55k
+(
+    const scalar h,
+    const scalar k
+) const // d B55 / d k
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    const scalar sk = h*s;
+    const scalar ck = h*c;
+
+    return
+        (
+            16*192000*pow(c, 15)*ck
+          - 14*262720*pow(c, 13)*ck
+          + 12*83680*pow(c, 11)*ck
+          + 10*20160*pow(c, 9)*ck
+          - 8*7280*pow(c, 7)*ck
+          + 6*7160*pow(c, 5)*ck
+          - 4*1800*pow(c, 3)*ck
+          - 2*1050*pow(c,1)*ck
+        )
+       /(12288*pow(s, 10)*(6*sqr(c) - 1)*(8*pow(c, 4) - 11*sqr(c) + 3))
+      - (
+            192000*pow(c, 16)
+          - 262720*pow(c, 14)
+          + 83680*pow(c, 12)
+          + 20160*pow(c, 10)
+          - 7280*pow(c, 8)
+          + 7160*pow(c, 6)
+          - 1800*pow(c, 4)
+          - 1050*pow(c, 2)
+          + 225
+        )*10.0
+       /(12288*pow(s, 11)*(6*sqr(c) - 1)*(8*pow4(c) - 11*sqr(c) + 3))*sk
+      - (
+            192000*pow(c, 16)
+          - 262720*pow(c, 14)
+          + 83680*pow(c, 12)
+          + 20160*pow(c,10)
+          - 7280*pow(c, 8)
+          + 7160*pow(c, 6)
+          - 1800*pow(c,4)
+          - 1050*pow(c, 2)
+          + 225
+        )*12*c*ck
+        /(12288*pow(s, 10)*sqr(6*sqr(c) - 1)*(8*pow4(c) - 11*sqr(c) + 3))
+      - (
+            192000*pow(c, 16)
+          - 262720*pow(c, 14)
+          + 83680*pow(c, 12)
+          + 20160*pow(c, 10)
+          - 7280*pow(c, 8)
+          + 7160*pow(c, 6)
+          - 1800*pow(c, 4)
+          - 1050*pow(c, 2)
+          + 225
+        )*(32*pow3(c) - 22*c)*ck
+        /(12288*pow(s, 10)*(6*sqr(c) - 1)*sqr(8*pow4(c) - 11*sqr(c) + 3));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C1
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return (8*pow4(c) - 8*sqr(c) + 9)/(8*pow4(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C1k
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    const scalar sk = h*s;
+    const scalar ck = h*c;
+
+    return
+        (4*8*pow3(c)*ck - 2*8*c*ck)/(8*pow4(s))
+      - (8*pow4(c) - 8*sqr(c) + 9)*4*sk/(8*pow5(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C2
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (
+            3840*pow(c, 12)
+          - 4096*pow(c, 10)
+          + 2592*pow(c, 8)
+          - 1008*pow(c, 6)
+          + 5944*pow(c, 4)
+          - 1830*pow(c, 2)
+          + 147
+        ) // - 2592
+       /(512*pow(s, 10)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C2k
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    const scalar sk = h*s;
+    const scalar ck = h*c;
+
+    return
+        (
+            12*3840*pow(c, 11)*ck
+          - 10*4096*pow(c,9)*ck
+          + 8*2592*pow(c, 7)*ck
+          - 6*1008*pow(c, 5)*ck
+          + 4*5944*pow(c, 3)*ck
+          - 2*1830*c*ck
+        )
+       /(512*pow(s, 10)*(6*sqr(c) - 1))
+      - (
+            3840*pow(c, 12)
+          - 4096*pow(c, 10)
+          + 2592*pow(c, 8)
+          - 1008*pow(c, 6)
+          + 5944*pow(c, 4)
+          - 1830*pow(c, 2)
+          + 147
+        )*10*sk
+       /(512*pow(s, 11)*(6*sqr(c) - 1))
+      - (
+            3840*pow(c, 12)
+          - 4096*pow(c, 10)
+          + 2592*pow(c, 8)
+          - 1008*pow(c, 6)
+          + 5944*pow(c, 4)
+          - 1830*pow(c, 2)
+          + 147
+        )*12*c*ck
+       /(512*pow(s, 10)*sqr(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C3
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return -1/(4*s*c);
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C4
+(
+    const scalar h,
+    const scalar k
+) const
+{
+    const scalar s = sinh(k*h);
+    const scalar c = cosh(k*h);
+
+    return
+        (12*pow(c, 8) + 36*pow(c, 6) - 162*pow(c, 4) + 141*sqr(c) -27)
+       /(192*c*pow(s, 9));
+}
+
+
+void Foam::waveModels::StokesV::initialise
+(
+    const scalar H,
+    const scalar d,
+    const scalar T,
+    scalar& kOut,
+    scalar& LambdaOut,
+    scalar& f1Out,
+    scalar& f2Out
+) const
+{
+    scalar f1 = 1;
+    scalar f2 = 1;
+
+    const scalar pi = mathematical::pi;
+    scalar k = 2.0*pi/(sqrt(mag(g_)*d)*T);
+    scalar lambda = H/2.0*k;
+
+    label n = 0;
+
+    const scalar tolerance = 1e-12;
+    const label iterMax = 10000;
+
+    while ((mag(f1) > tolerance || mag(f2) > tolerance) && (n < iterMax))
+    {
+        const scalar b33 = B33(d, k);
+        const scalar b35 = B35(d, k);
+        const scalar b55 = B55(d, k);
+        const scalar c1 = C1(d, k);
+        const scalar c2 = C2(d, k);
+
+        const scalar b33k = B33k(d, k);
+        const scalar b35k = B35k(d, k);
+        const scalar b55k = B55k(d, k);
+        const scalar c1k = C1k(d, k);
+        const scalar c2k = C2k(d, k);
+
+        const scalar l2 = sqr(lambda);
+        const scalar l3 = l2*lambda;
+        const scalar l4 = l3*lambda;
+        const scalar l5 = l4*lambda;
+
+        const scalar Bmat11 =
+            2*pi/(sqr(k)*d)*(lambda + l3*b33 + l5*(b35 + b55))
+          - 2*pi/(k*d)*(l3*b33k + l5*(b35k + b55k));
+
+        const scalar Bmat12 =
+          - 2*pi/(k*d)*(1 + 3*l2*b33 + 5*l4*(b35 + b55));
+
+        const scalar Bmat21 =
+          - d/(2*pi)*tanh(k*d)*(1 + l2*c1 + l4*c2)
+          - k*d/(2*pi)*(1 - sqr(tanh(k*d)))*d*(1 + l2*c1 + l4*c2)
+          - k*d/(2*pi)*tanh(k*d)*(l2*c1k + l4*c2k);
+
+        const scalar Bmat22 = - k*d/(2.0*pi)*tanh(k*d)*(2*lambda*c1 + 4*l3*c2);
+
+        f1 = pi*H/d - 2*pi/(k*d)*(lambda + l3*b33 + l5*(b35 + b55));
+
+        f2 = (2*pi*d)/(mag(g_)*sqr(T)) - k*d/(2*pi)*tanh(k*d)*(1 + l2*c1 + l4*c2);
+
+        const scalar lambdaPr =
+            (f1*Bmat21 - f2*Bmat11)/(Bmat11*Bmat22 - Bmat12*Bmat21);
+        const scalar kPr =
+            (f2*Bmat12 - f1*Bmat22)/(Bmat11*Bmat22 - Bmat12*Bmat21);
+
+        lambda += lambdaPr;
+        k += kPr;
+
+        n++;
+    }
+
+    kOut = k;
+    LambdaOut = lambda;
+
+    f1Out = mag(f1);
+    f2Out = mag(f2);
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::eta
+(
+    const scalar h,
+    const scalar kx,
+    const scalar ky,
+    const scalar lambda,
+    const scalar T,
+    const scalar x,
+    const scalar y,
+    const scalar t,
+    const scalar phase
+) const
+{
+    const scalar k = sqrt(kx*kx + ky*ky);
+
+    const scalar b22 = B22(h, k);
+    const scalar b24 = B24(h, k);
+    const scalar b33 = B33(h, k);
+    const scalar b35 = B35(h, k);
+    const scalar b44 = B44(h, k);
+    const scalar b55 = B55(h, k);
+
+    const scalar l2 = sqr(lambda);
+    const scalar l3 = l2*lambda;
+    const scalar l4 = l3*lambda;
+    const scalar l5 = l4*lambda;
+
+    const scalar amp1 = lambda/k;
+    const scalar amp2 = (b22*l2 + b24*l4)/k;
+    const scalar amp3 = (b33*l3 + b35*l5)/k;
+    const scalar amp4 = b44*l4/k;
+    const scalar amp5 = b55*l5/k;
+
+    const scalar theta = kx*x + ky*y - 2.0*mathematical::pi/T*t + phase;
+
+    return
+        amp1*cos(theta)
+      + amp2*cos(2*theta)
+      + amp3*cos(3*theta)
+	  + amp4*cos(4*theta)
+      + amp5*cos(5*theta);
+}
+
+
+Foam::vector Foam::waveModels::StokesV::U
+(
+    const scalar d,
+    const scalar kx,
+    const scalar ky,
+    const scalar lambda,
+    const scalar T,
+    const scalar x,
+    const scalar y,
+    const scalar t,
+    const scalar phase,
+    const scalar z
+) const
+{
+    const scalar k = sqrt(kx*kx + ky*ky);
+
+    const scalar a11 = A11(d, k);
+    const scalar a13 = A13(d, k);
+    const scalar a15 = A15(d, k);
+    const scalar a22 = A22(d, k);
+    const scalar a24 = A24(d, k);
+    const scalar a33 = A33(d, k);
+    const scalar a35 = A35(d, k);
+    const scalar a44 = A44(d, k);
+    const scalar a55 = A55(d, k);
+
+    const scalar pi = mathematical::pi;
+    const scalar l2 = sqr(lambda);
+    const scalar l3 = l2*lambda;
+    const scalar l4 = l3*lambda;
+    const scalar l5 = l4*lambda;
+
+    const scalar a1u = 2*pi/T/k*(lambda*a11 + l3*a13 + l5*a15);
+    const scalar a2u = 2*2*pi/T/k*(l2*a22 + l4*a24);
+    const scalar a3u = 3*2*pi/T/k*(l3*a33 + l5*a35);
+    const scalar a4u = 4*2*pi/T/k*(l4*a44);
+    const scalar a5u = 5*2*pi/T/k*(l5*a55);
+
+    const scalar theta = kx*x + ky*y - 2*pi/T*t + phase;
+
+    scalar u =
+        a1u*cosh(k*z)*cos(theta)
+      + a2u*cosh(2.0*k*z)*cos(2.0*(theta))
+      + a3u*cosh(3.0*k*z)*cos(3.0*(theta))
+      + a4u*cosh(4.0*k*z)*cos(4.0*(theta))
+      + a5u*cosh(5.0*k*z)*cos(5.0*(theta));
+
+    scalar w =
+        a1u*sinh(k*z)*sin(theta)
+      + a2u*sinh(2.0*k*z)*sin(2.0*(theta))
+      + a3u*sinh(3.0*k*z)*sin(3.0*(theta))
+      + a4u*sinh(4.0*k*z)*sin(4.0*(theta))
+      + a5u*sinh(5.0*k*z)*sin(5.0*(theta));
+
+    scalar v = u*sin(waveAngle_);
+    u *= cos(waveAngle_);
+
+    return vector(u, v, w);
+}
+
+
+void Foam::waveModels::StokesV::setLevel
+(
+    const scalar t,
+    const scalar tCoeff,
+    scalarField& level
+) const
+{
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(level, paddlei)
+    {
+        const scalar eta =
+            this->eta
+	        (
+                waterDepthRef_,
+		        waveKx,
+                waveKy,
+                lambda_,
+                wavePeriod_,
+                xPaddle_[paddlei],
+                yPaddle_[paddlei],
+                t,
+                wavePhase_
+            );
+
+        level[paddlei] = waterDepthRef_ + tCoeff*eta;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesV::StokesV
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    regularWaveModel(dict, mesh, patch, false),
+    lambda_(0)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesV::~StokesV()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::StokesV::read()
+{
+    if (regularWaveModel::read())
+    {
+        scalar f1;
+        scalar f2;
+        scalar waveK;
+
+        initialise
+        (
+            waveHeight_,
+            waterDepthRef_,
+            wavePeriod_,
+            waveK,
+            lambda_,
+            f1,
+            f2
+        );
+
+        if (f1 > 0.001 || f2 > 0.001)
+        {
+	        FatalErrorInFunction
+                << "No convergence for Stokes V wave theory" << nl
+                << "    f1: " << f1 << nl
+                << "    f2: " << f2 << nl
+	            << exit(FatalError);
+        }
+
+        waveLength_ = 2.0*mathematical::pi/waveK;
+
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::StokesV::setVelocity
+(
+    const scalar t,
+    const scalar tCoeff,
+    const scalarField& level
+)
+{
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(U_, facei)
+    {
+        // Fraction of geometry represented by paddle - to be set
+        scalar fraction = 1;
+
+        // Height - to be set
+        scalar z = 0;
+
+        setPaddlePropeties(level, facei, fraction, z);
+
+        if (fraction > 0)
+        {
+            const label paddlei = faceToPaddle_[facei];
+
+            const vector Uf = U
+	        (
+                waterDepthRef_,
+                waveKx,
+                waveKy,
+                lambda_,
+                wavePeriod_,
+                xPaddle_[paddlei],
+                yPaddle_[paddlei],
+                t,
+                wavePhase_,
+                z
+            );
+
+            U_[facei] = fraction*Uf*tCoeff;
+        }
+    }
+}
+
+
+void Foam::waveModels::StokesV::info(Ostream& os) const
+{
+    regularWaveModel::info(os);
+
+    os  << "    Lambda : " << lambda_ << nl
+        << "    Wave type : " << waveType() << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesV/StokesVWaveModel.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesV/StokesVWaveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..7b9291b463a084eb447d0ba16202da55676d0926
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/StokesV/StokesVWaveModel.H
@@ -0,0 +1,227 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModels::StokesV
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_StokesV_H
+#define waveModels_StokesV_H
+
+#include "regularWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                          Class StokesV Declaration
+\*---------------------------------------------------------------------------*/
+
+class StokesV
+:
+    public regularWaveModel
+{
+protected:
+
+    // Proteced Data
+
+        //-
+        scalar lambda_;
+
+
+    // Protected Member Functions
+
+        //-
+        virtual scalar A11(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar A13(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar A15(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar A22(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar A24(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar A33(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar A35(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar A44(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar A55(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B22(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B24(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B33(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B33k(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B35(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B35k(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B44(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B55(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar B55k(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar C1(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar C1k(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar C2(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar C2k(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar C3(const scalar h, const scalar k) const;
+
+        //-
+        virtual scalar C4(const scalar h, const scalar k) const;
+
+        //-
+        virtual void initialise
+        (
+            const scalar H,
+            const scalar d,
+            const scalar T,
+            scalar& kOut,
+            scalar& LambdaOut,
+            scalar& f1Out,
+            scalar& f2Out
+        ) const;
+
+        //-
+        virtual scalar eta
+        (
+            const scalar h,
+            const scalar kx,
+            const scalar ky,
+            const scalar lambda,
+            const scalar T,
+            const scalar x,
+            const scalar y,
+            const scalar t,
+            const scalar phase
+        ) const;
+
+        //-
+        virtual vector U
+        (
+            const scalar d,
+            const scalar kx,
+            const scalar ky,
+            const scalar lambda,
+            const scalar T,
+            const scalar x,
+            const scalar y,
+            const scalar t,
+            const scalar phase,
+            const scalar z
+        ) const;
+
+        //- Set the water level
+        virtual void setLevel
+        (
+            const scalar t,
+            const scalar tCoeff,
+            scalarField& level
+        ) const;
+
+        //- Calculate the wave model velocity
+        virtual void setVelocity
+        (
+            const scalar t,
+            const scalar tCoeff,
+            const scalarField& level
+        );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("StokesV");
+
+    //- Constructor
+    StokesV
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~StokesV();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/Elliptic.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/Elliptic.H
new file mode 100644
index 0000000000000000000000000000000000000000..83effacac998c917963ede87354cdc79cf546063
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/Elliptic.H
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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/>.
+
+Namespace
+    Foam::Elliptic
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#include "mathematicalConstants.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace Elliptic
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+void ellipticIntegralsKE(const scalar m, scalar& K, scalar& E)
+{
+    if (m == 0)
+    {
+        K = 0.5*mathematical::pi;
+        E = 0.5*mathematical::pi;
+        return;
+    }
+
+    scalar a = 1;
+    scalar g = Foam::sqrt(1 - m);
+    scalar ga = g*a;
+    scalar aux = 1;
+    scalar sum = 2 - m;
+
+    while (true)
+    {
+        scalar aOld = a;
+        scalar gOld = g;
+        ga = gOld*aOld;
+        a = 0.5*(gOld + aOld);
+        aux += aux;
+        sum -= aux*(a*a - ga);
+
+        if (mag(aOld - gOld) < SMALL)
+        {
+            break;
+        }
+
+        g = sqrt(ga);
+    }
+
+    K = 0.5*mathematical::pi/a;
+    E = 0.25*mathematical::pi/a*sum;
+}
+
+
+Foam::scalar JacobiAmp(const scalar u, const scalar mIn)
+{
+    static const label ITER = 25;
+    FixedList<scalar, ITER + 1> a, g, c;
+    scalar aux, amp;
+    label n;
+
+    const scalar m = mag(mIn);
+
+    if (m == 0)
+    {
+        return u;
+    }
+
+    if (m == 1)
+    {
+        return 2*atan(exp(u)) - mathematical::pi/2;
+    }
+
+    a[0] = 1.0;
+    g[0] = Foam::sqrt(1.0 - m);
+    c[0] = Foam::sqrt(m);
+
+    aux = 1.0;
+
+    for (n = 0; n < ITER; n++)
+    {
+        if (mag(a[n] - g[n]) < SMALL)
+        {
+            break;
+        }
+
+        aux += aux;
+        a[n+1] = 0.5*(a[n] + g[n]);
+        g[n+1] = Foam::sqrt(a[n]*g[n]);
+        c[n+1] = 0.5*(a[n] - g[n]);
+    }
+
+    amp = aux*a[n]*u;
+
+    for (; n > 0; n--)
+    {
+        amp = 0.5*(amp + asin(c[n]*sin(amp)/a[n]));
+    }
+
+    return scalar(amp);
+}
+
+
+void JacobiSnCnDn
+(
+    const scalar u,
+    const scalar m,
+    scalar& Sn,
+    scalar& Cn,
+    scalar& Dn
+)
+{
+    const scalar amp = Elliptic::JacobiAmp(u, m);
+
+    Sn = sin(amp);
+    Cn = cos(amp);
+    Dn = sqrt(1.0 - m*sin(amp)*sin(amp));
+    return;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Elliptic
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..972ef9c94a4d4e7a2f235b917836246e3d5cc478
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C
@@ -0,0 +1,367 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "cnoidalWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+#include "Elliptic.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(cnoidal, 0);
+    addToRunTimeSelectionTable
+    (
+        waveModel,
+        cnoidal,
+        patch
+    );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+void Foam::waveModels::cnoidal::initialise
+(
+    const scalar H,
+    const scalar d,
+    const scalar T,
+    scalar& mOut,
+    scalar& LOut
+) const
+{
+    const scalar mTolerance = 0.0001;
+    scalar mElliptic = 0.5;
+    scalar LElliptic = 0;
+    scalar phaseSpeed = 0;
+
+    scalar mError = 0.0;
+    scalar mMinError = GREAT;
+
+    while (mElliptic < 1.0)
+    {
+        scalar KElliptic, EElliptic;
+        Elliptic::ellipticIntegralsKE(mElliptic, KElliptic, EElliptic);
+
+        LElliptic = KElliptic*sqrt(16.0*pow3(d)*mElliptic/(3.0*H));
+
+        phaseSpeed =
+            sqrt(mag(g_)*d)
+           *(1.0 - H/d/2.0 + H/d/mElliptic*(1.0 - 3.0/2.0*EElliptic/KElliptic));
+
+        mError = mag(T - LElliptic/phaseSpeed);
+
+        if (mError <= mMinError)
+        {
+            mOut = mElliptic;
+            LOut = LElliptic;
+            mMinError = mError;
+        }
+
+        mElliptic += mTolerance;
+    }
+}
+
+
+Foam::scalar Foam::waveModels::cnoidal::eta
+(
+    const scalar H,
+    const scalar m,
+    const scalar kx,
+    const scalar ky,
+    const scalar T,
+    const scalar x,
+    const scalar y,
+    const scalar t
+) const
+{
+    scalar K, E;
+    Elliptic::ellipticIntegralsKE(m, K, E);
+
+    const scalar uCnoidal =
+        K/mathematical::pi*(kx*x + ky*y - 2.0*mathematical::pi*t/T);
+
+    scalar sn, cn, dn;
+    Elliptic::JacobiSnCnDn(uCnoidal, m, sn, cn, dn);
+
+    return H*((1.0 - E/K)/m - 1.0 + sqr(cn));
+}
+
+
+Foam::scalar Foam::waveModels::cnoidal::eta1D
+(
+    const scalar H,
+    const scalar m,
+    const scalar t,
+    const scalar T
+) const
+{
+    scalar K, E;
+    Elliptic::ellipticIntegralsKE(m, K, E);
+
+    const scalar uCnoidal = -2.0*K*(t/T);
+
+    scalar sn, cn, dn;
+    Elliptic::JacobiSnCnDn(uCnoidal, m, sn, cn, dn);
+
+    return H*((1.0 - E/K)/m - 1.0 + sqr(cn));
+}
+
+
+Foam::scalar Foam::waveModels::cnoidal::etaMeanSq
+(
+    const scalar H,
+    const scalar m,
+    const scalar T
+) const
+{
+    scalar eta = 0;
+    scalar etaSumSq = 0;
+
+    for (int i=0; i<1000; i++)
+    {
+        eta = eta1D(H, m, i*T/(1000.0), T);
+        etaSumSq += eta*eta;
+    }
+
+    etaSumSq /= 1000.0;
+    return etaSumSq;
+}
+
+
+Foam::vector Foam::waveModels::cnoidal::dEtaDx
+(
+    const scalar H,
+    const scalar m,
+    const scalar uCnoidal,
+    const scalar L,
+    const scalar K,
+    const scalar E
+) const
+{
+    const scalar dudx = 2.0*K/L;
+    const scalar dudxx = 2.0*K/L*dudx;
+    const scalar dudxxx = 2.0*K/L*dudxx;
+
+    scalar sn, cn, dn;
+    Elliptic::JacobiSnCnDn(uCnoidal, m, sn, cn, dn);
+
+    scalar d1 = -2.0*H*cn*dn*sn*dudx;
+    scalar d2 = 2.0*H*(dn*dn*sn*sn - cn*cn*dn*dn + m*cn*cn*sn*sn)*dudxx;
+    scalar d3 =
+        8.0*H
+       *(
+            cn*sn*dn*dn*dn*(-4.0 - 2.0*m)
+          + 4.0*m*cn*sn*sn*sn*dn
+          - 2.0*m*cn*cn*cn*sn*dn
+        )
+       *dudxxx;
+
+    return vector(d1, d2, d3);
+}
+
+
+Foam::vector Foam::waveModels::cnoidal::U
+(
+    const scalar H,
+    const scalar h,
+    const scalar m,
+    const scalar kx,
+    const scalar ky,
+    const scalar T,
+    const scalar x,
+    const scalar y,
+    const scalar t,
+    const scalar z
+) const
+{
+    scalar K, E;
+    Elliptic::ellipticIntegralsKE(m, K, E);
+
+    const scalar uCnoidal =
+        K/mathematical::pi*(kx*x + ky*y - 2.0*mathematical::pi*t/T);
+    const scalar k = sqrt(kx*kx + ky*ky);
+    const scalar L = 2.0*mathematical::pi/k;
+    const scalar c = L/T;
+
+    const scalar etaCN = eta(H, m, kx, ky, T, x, y, t);
+    const vector etaX = this->dEtaDx(H, m, uCnoidal, L, K, E);
+    const scalar etaMS = etaMeanSq(H, m, T);
+
+    scalar u =
+        c*etaCN/h
+      - c*(etaCN*etaCN/h/h + etaMS*etaMS/h/h)
+     + 1.0/2.0*c*h*(1.0/3.0 - z*z/h/h)*etaX[1];
+
+    scalar w =
+       -c*z*(etaX[0]/h*(1.0 - 2.0*etaCN/h) + 1.0/6.0*h*(1.0 - z*z/h/h)*etaX[2]);
+
+    scalar v = u*sin(waveAngle_);
+    u *= cos(waveAngle_);
+
+    return vector(u, v, w);
+}
+
+
+void Foam::waveModels::cnoidal::setLevel
+(
+    const scalar t,
+    const scalar tCoeff,
+    scalarField& level
+) const
+{
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(level, paddlei)
+    {
+        const scalar eta =
+            this->eta
+	        (
+                waveHeight_,
+                m_,
+                waveKx,
+                waveKy,
+                wavePeriod_,
+                xPaddle_[paddlei],
+                yPaddle_[paddlei],
+                t
+            );
+
+        level[paddlei] = waterDepthRef_ + tCoeff*eta;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::cnoidal::cnoidal
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    regularWaveModel(dict, mesh, patch, false),
+    m_(0)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::cnoidal::~cnoidal()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::cnoidal::read()
+{
+    if (regularWaveModel::read())
+    {
+        // Initialise m parameter and wavelength
+        initialise
+        (
+            waveHeight_,
+            waterDepthRef_,
+            wavePeriod_,
+            m_,
+            waveLength_
+        );
+
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::cnoidal::setVelocity
+(
+    const scalar t,
+    const scalar tCoeff,
+    const scalarField& level
+)
+{
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(U_, facei)
+    {
+        // Fraction of geometry represented by paddle - to be set
+        scalar fraction = 1;
+
+        // Height - to be set
+        scalar z = 0;
+
+        setPaddlePropeties(level, facei, fraction, z);
+
+        if (fraction > 0)
+        {
+            const label paddlei = faceToPaddle_[facei];
+
+            const vector Uf = U
+	        (
+                waveHeight_,
+                waterDepthRef_,
+                m_,
+                waveKx,
+                waveKy,
+                wavePeriod_,
+                xPaddle_[paddlei],
+                yPaddle_[paddlei],
+                t,
+                z
+            );
+
+            U_[facei] = fraction*Uf*tCoeff;
+        }
+    }
+}
+
+
+void Foam::waveModels::cnoidal::info(Ostream& os) const
+{
+    regularWaveModel::info(os);
+
+    os  << "    Cnoidal m parameter : " << m_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.H b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..be15105454f1d08d31ffaf2c6b36d55b83479b63
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.H
@@ -0,0 +1,174 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModels::cnoidal
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_cnoidal_H
+#define waveModels_cnoidal_H
+
+#include "regularWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                            Class cnoidal Declaration
+\*---------------------------------------------------------------------------*/
+
+class cnoidal
+:
+    public regularWaveModel
+{
+protected:
+
+    // Protected data
+
+        //- `m' coefficient
+        scalar m_;
+
+
+    // Protected Member Functions
+
+        void initialise
+        (
+            const scalar H,
+            const scalar d,
+            const scalar T,
+            scalar& mOut,
+            scalar& LOut
+        ) const;
+
+        virtual scalar eta
+        (
+            const scalar H,
+            const scalar Kx,
+            const scalar x,
+            const scalar Ky,
+            const scalar y,
+            const scalar omega,
+            const scalar t,
+            const scalar phase
+        ) const;
+
+        scalar eta1D
+        (
+            const scalar H,
+            const scalar m,
+            const scalar t,
+            const scalar T
+        ) const;
+
+        scalar etaMeanSq
+        (
+            const scalar H,
+            const scalar m,
+            const scalar T
+        ) const;
+
+        vector dEtaDx
+        (
+            const scalar H,
+            const scalar m,
+            const scalar uCnoidal,
+            const scalar L,
+            const scalar K,
+            const scalar E
+        ) const;
+
+        virtual vector U
+        (
+            const scalar H,
+            const scalar h,
+            const scalar Kx,
+            const scalar x,
+            const scalar Ky,
+            const scalar y,
+            const scalar omega,
+            const scalar t,
+            const scalar phase,
+            const scalar z
+        ) const;
+
+        //- Set the water level
+        virtual void setLevel
+        (
+            const scalar t,
+            const scalar tCoeff,
+            scalarField& level
+        ) const;
+
+        //- Calculate the wave model velocity
+        virtual void setVelocity
+        (
+            const scalar t,
+            const scalar tCoeff,
+            const scalarField& level
+        );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("cnoidal");
+
+    //- Constructor
+    cnoidal
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~cnoidal();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveModel/waveModel.C b/integration/OpenCFD/code/waveModel/waveModel/waveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..96d234f49fdd2336dfca516ff88103e7a7ed9cbc
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveModel/waveModel.C
@@ -0,0 +1,427 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "waveModel.H"
+#include "fvMesh.H"
+#include "polyPatch.H"
+#include "uniformDimensionedFields.H"
+#include "volFields.H"
+#include "fvPatchFields.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(waveModel, 0);
+    defineRunTimeSelectionTable(waveModel, patch);
+}
+
+const Foam::word Foam::waveModel::dictName("waveProperties");
+
+
+Foam::word Foam::waveModel::modelName(const word& patchName)
+{
+    word name = dictName + '.' + patchName;
+
+    if (Pstream::parRun())
+    {
+        name += ".proc" + Foam::name(Pstream::myProcNo());
+    }
+
+    return name;
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+void Foam::waveModel::initialiseGeometry()
+{
+    // Determine local patch co-ordinate system given by:
+    // - X: streamwise: patch normal
+    // - Y: spanwise: Z^X
+    // - Z: up: (negative) gravity direction
+    vector x(-gAverage(patch_.faceAreas()));
+    x /= mag(x) + ROOTVSMALL;
+    vector z = -g_/mag(g_);
+    vector y = z^x;
+
+    // Rotation from global<->local about global origin
+    Rlg_ = tensor(x, y, z);
+    Rgl_ = Rlg_.T();
+
+    // Global patch extents
+    const vectorField& Cp = patch_.localPoints();
+    const vectorField CpLocal(Rgl_ & Cp);
+    boundBox bb(CpLocal, true);
+    const scalar xMin = bb.min().x();
+    const scalar xMax = bb.max().x();
+    const scalar yMin = bb.min().y();
+    const scalar yMax = bb.max().y();
+    zSpan_ = bb.max().z() - bb.min().z();
+
+    // Global x, y positions of the paddle centres
+    xPaddle_.setSize(nPaddle_, 0);
+    yPaddle_.setSize(nPaddle_, 0);
+    const scalar xMid = xMin + 0.5*(xMax - xMin);
+    const scalar paddleDy = (yMax - yMin)/scalar(nPaddle_);
+    for (label paddlei = 0; paddlei < nPaddle_; ++paddlei)
+    {
+        xPaddle_[paddlei] = xMid;
+        yPaddle_[paddlei] = paddlei*paddleDy + yMin + 0.5*paddleDy;;
+    }
+
+    // Local face centres
+    const vectorField& Cf = patch_.faceCentres();
+    const vectorField CfLocal(Rgl_ & Cf);
+    z_ = CfLocal.component(2);
+
+    // Local face extents in z-direction
+    zMin_.setSize(patch_.size());
+    zMax_.setSize(patch_.size());
+    const faceList& faces = patch_.localFaces();
+    forAll(faces, facei)
+    {
+        const face& f = faces[facei];
+        const label nPoint = f.size();
+        zMin_[facei] = CpLocal[f[0]].z();
+        zMax_[facei] = CpLocal[f[0]].z();
+
+        for (label fpi = 1; fpi < nPoint; ++fpi)
+        {
+            const label pointi = f[fpi];
+            zMin_[facei] = min(zMin_[facei], CpLocal[pointi].z());
+            zMax_[facei] = max(zMax_[facei], CpLocal[pointi].z());
+        }
+    }
+
+    // Local paddle-to-face addressing
+    faceToPaddle_.setSize(patch_.size(), -1);
+    forAll(faceToPaddle_, facei)
+    {
+        faceToPaddle_[facei] = floor((CfLocal[facei].y() - yMin)/paddleDy);
+    }
+}
+
+
+Foam::tmp<Foam::scalarField> Foam::waveModel::waterLevel() const
+{
+    // Note: initialising as initial depth
+    tmp<scalarField> tlevel(new scalarField(nPaddle_, initialDepth_));
+    scalarField& level = tlevel.ref();
+
+    const volScalarField& alpha =
+        mesh_.lookupObject<volScalarField>(alphaName_);
+    const fvPatchScalarField& alphap = alpha.boundaryField()[patch_.index()];
+    const scalarField alphac(alphap.patchInternalField());
+
+    const scalarField& magSf = alphap.patch().magSf();
+    scalarList paddleMagSf(nPaddle_, 0.0);
+    scalarList paddleWettedMagSf(nPaddle_, 0.0);
+
+    forAll(alphac, facei)
+    {
+        label paddlei = faceToPaddle_[facei];
+        paddleMagSf[paddlei] += magSf[facei];
+        paddleWettedMagSf[paddlei] += magSf[facei]*alphac[facei];
+    }
+
+    forAll(paddleMagSf, paddlei)
+    {
+        reduce(paddleMagSf[paddlei], sumOp<scalar>());
+        reduce(paddleWettedMagSf[paddlei], sumOp<scalar>());
+        level[paddlei] +=
+            paddleWettedMagSf[paddlei]/paddleMagSf[paddlei]*zSpan_;
+    }
+
+    return tlevel;
+}
+
+
+void Foam::waveModel::setAlpha(const scalarField& level)
+{
+    forAll(alpha_, facei)
+    {
+        const label paddlei = faceToPaddle_[facei];
+        const scalar paddleCalc = level[paddlei];
+
+    	if (zMax_[facei] < paddleCalc)
+    	{
+    	    alpha_[facei] = 1.0;
+    	}
+    	else if (zMin_[facei] > paddleCalc)
+    	{
+    	    alpha_[facei] = 0.0;
+    	}
+    	else
+    	{
+    	    scalar dz = paddleCalc - zMin_[facei];
+    	    alpha_[facei] = dz/zSpan_;
+    	}
+    }
+}
+
+
+void Foam::waveModel::setPaddlePropeties
+(
+    const scalarField& level,
+    const label facei,
+    scalar& fraction,
+    scalar& z
+) const
+{
+    const label paddlei = faceToPaddle_[facei];
+    const scalar paddleCalc = level[paddlei];
+    const scalar paddleHeight = min(paddleCalc, waterDepthRef_);
+    const scalar zMin = zMin_[facei];
+    const scalar zMax = zMax_[facei];
+
+    fraction = 1;
+    z = 0;
+
+    if (zMax < paddleHeight)
+    {
+        z = z_[facei];
+    }
+    else if (zMin > paddleCalc)
+    {
+        fraction = -1;
+    }
+    else
+    {
+        if (paddleCalc < waterDepthRef_)
+        {
+            if ((zMax > paddleCalc) && (zMin < paddleCalc))
+            {
+                scalar dz = paddleCalc - zMin;
+	            fraction = dz/zSpan_;
+                z = z_[facei];
+            }
+        }
+	    else
+        {
+            if (zMax < paddleCalc)
+            {
+                z = waterDepthRef_;
+            }
+            else if ((zMax > paddleCalc) && (zMin < paddleCalc))
+            {
+                scalar dz = paddleCalc - zMin;
+	            fraction = dz/zSpan_;
+                z = waterDepthRef_;
+            }
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModel::waveModel
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    IOdictionary
+    (
+        IOobject
+        (
+            modelName(patch.name()),
+            mesh.time().timeName(),
+            mesh,
+            IOobject::NO_READ
+        ),
+        dict
+    ),
+    mesh_(mesh),
+    patch_(patch),
+    g_(mesh.lookupObject<uniformDimensionedVectorField>("g").value()),
+    UName_("U"),
+    alphaName_("alpha"),
+    Rgl_(tensor::I),
+    Rlg_(tensor::I),
+    nPaddle_(1),
+    xPaddle_(),
+    yPaddle_(),
+    z_(),
+    zSpan_(0),
+    zMin_(),
+    zMax_(),
+    waterDepthRef_(0),
+    initialDepth_(0),
+    rampTime_(VSMALL),
+    activeAbsorption_(false),
+    U_(patch.size(), vector::zero),
+    alpha_(patch.size(), 0)
+{
+    if (readFields)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModel::~waveModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModel::read()
+{
+    readIfPresent("U", UName_);
+    readIfPresent("alpha", alphaName_);
+
+    lookup("nPaddle") >> nPaddle_;
+    if (nPaddle_ < 1)
+    {
+        FatalIOErrorInFunction(*this)
+            << "Number of paddles must be greater than zero.  Supplied"
+            << " value nPaddles = " << nPaddle_
+            << exit(FatalIOError);
+    }
+
+    readIfPresent("initialDepth", initialDepth_);
+
+    // Need to intialise the geometry before calling waterLevel()
+    initialiseGeometry();
+
+    // Set the reference water depth
+    if (!readIfPresent("waterDepthRef", waterDepthRef_))
+    {
+        scalar waterDepth = 0;
+        if (readIfPresent("waterDepth", waterDepth))
+        {
+            waterDepthRef_ = waterDepth;
+        }
+        else
+        {
+            const scalarField level(waterLevel());
+            if (level.size())
+            {
+                waterDepthRef_ = level.first();
+            }
+        }
+    }
+
+    return true;
+}
+
+
+void Foam::waveModel::correct(const scalar t)
+{
+    static label timeIndex = -1;
+
+    if (mesh_.time().timeIndex() != timeIndex)
+    {
+        Info<< "Updating " << type() << " wave model for patch "
+            << patch_.name() << endl;
+
+        // Time ramp weight
+        const scalar tCoeff = max(0, min(t/rampTime_, 1));
+
+        // Reset the velocity and phase fraction fields
+        U_ = vector::zero;
+        alpha_ = 0;
+
+        // Update the calculated water level field
+        scalarField calculatedLevel(nPaddle_, 0);
+
+        if (patch_.size())
+        {
+            // Set wave level
+            setLevel(t, tCoeff, calculatedLevel);
+
+            // Update the velocity field
+            setVelocity(t, tCoeff, calculatedLevel);
+
+            // Update the phase fraction field
+            setAlpha(calculatedLevel);
+        }
+
+        if (activeAbsorption_)
+        {
+            const scalarField activeLevel(this->waterLevel());
+
+            if (patch_.size())
+            {
+                const scalar d = direction();
+
+                forAll(activeLevel, facei)
+                {
+                    const label paddlei = faceToPaddle_[facei];
+
+                    if (zMin_[facei] < activeLevel[paddlei])
+                    {
+                        scalar UCorr =
+                            (calculatedLevel[paddlei] - activeLevel[paddlei])
+                           *sqrt(mag(g_)/activeLevel[paddlei]);
+
+                        U_[facei].x() += d*UCorr;
+                    }
+                }
+            }
+        }
+
+        // Transform velocity into global co-ordinate system
+        U_ = Rlg_ & U_;
+
+        timeIndex = mesh_.time().timeIndex();
+    }
+}
+
+
+const Foam::vectorField& Foam::waveModel::U() const
+{
+    return U_;
+}
+
+
+const Foam::scalarField& Foam::waveModel::alpha() const
+{
+    return alpha_;
+}
+
+
+void Foam::waveModel::info(Ostream& os) const
+{
+    os  << "Wave model: patch " << patch_.name() << nl
+        << "    Type : " << type() << nl
+        << "    Velocity field name : " << UName_ << nl
+        << "    Phase fraction field name : " << alphaName_ << nl
+        << "    Transformation from local to global system : " << Rlg_ << nl
+        << "    Number of paddles: " << nPaddle_ << nl
+        << "    Reference water depth : " << waterDepthRef_ << nl
+        << "    Active absorption: " << activeAbsorption_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveModel/waveModel.H b/integration/OpenCFD/code/waveModel/waveModel/waveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..077633ae373a4c31e855c9b18a47e576293603b5
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveModel/waveModel.H
@@ -0,0 +1,256 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModel_H
+#define waveModel_H
+
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+
+#include "IOdictionary.H"
+#include "dictionary.H"
+#include "scalarField.H"
+#include "vectorField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class fvMesh;
+class polyPatch;
+
+/*---------------------------------------------------------------------------*\
+                          Class waveModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveModel
+:
+    public refCount,
+    public IOdictionary
+{
+protected:
+
+    // Protected data
+
+        //- Reference to the mesh database
+        const fvMesh& mesh_;
+
+        //- Reference to the polyPatch
+        const polyPatch& patch_;
+
+        //- Gravity
+        const vector& g_;
+
+        //- Name of velocity field, default = "U"
+        word UName_;
+
+        //- Name of phase fraction field, default = "alpha"
+        word alphaName_;
+
+        //- Rotation tensor from global to local system
+        tensor Rgl_;
+
+        //- Rotation tensor from local to global system
+        tensor Rlg_;
+
+        //- Number of paddles
+        label nPaddle_;
+
+        //- Paddle x co-ordinates / [m]
+        scalarField xPaddle_;
+
+        //- Paddle y co-ordinates / [m]
+        scalarField yPaddle_;
+
+        //- Addressing from patch face index to paddle index
+        labelList faceToPaddle_;
+
+        //- Patch face centre z co-ordinates / [m]
+        scalarField z_;
+
+        //- Overall (point) span in z-direction / [m]
+        scalar zSpan_;
+
+        //- Minimum z (point) height per patch face / [m]
+        scalarField zMin_;
+
+        //- Maximum z (point) height per patch face / [m]
+        scalarField zMax_;
+
+        //- Reference water depth / [m]
+        scalar waterDepthRef_;
+
+        //- Initial depth / [m]
+        scalar initialDepth_;
+
+        //- Ramp time
+        scalar rampTime_;
+
+        //- Active wave absorption switch
+        bool activeAbsorption_;
+
+        // Current values
+
+            //- Velocity field
+            vectorField U_;
+
+            //- Wave indicator field
+            scalarField alpha_;
+
+
+    // Protected Member Functions
+
+        //- Initialise
+        virtual void initialiseGeometry();
+
+        //- Water level
+        virtual tmp<scalarField> waterLevel() const;
+
+        //- Set the water level
+        virtual void setLevel
+        (
+            const scalar t,
+            const scalar tCoeff,
+            scalarField& level
+        ) const = 0;
+
+        //- Calculate the wave model velocity
+        virtual void setVelocity
+        (
+            const scalar t,
+            const scalar tCoeff,
+            const scalarField& level
+        ) = 0;
+
+        //- Wave direction
+        virtual scalar direction() const = 0;
+
+        //- Set the alpha field based on the water level
+        virtual void setAlpha(const scalarField& level);
+
+        //- Set the paddle coverage fraction and reference height
+        virtual void setPaddlePropeties
+        (
+            const scalarField& level,
+            const label facei,
+            scalar& fraction,
+            scalar& z
+        ) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("waveModel");
+
+    // Declare runtime constructor selection table
+
+        declareRunTimeSelectionTable
+        (
+            autoPtr,
+            waveModel,
+            patch,
+            (
+                const dictionary& dict,
+                const fvMesh& mesh,
+                const polyPatch& patch
+            ),
+            (dict, mesh, patch)
+        );
+
+
+    //- Constructor
+    waveModel
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+
+    // Selectors
+
+        //- Return a reference to the selected wave model
+        static autoPtr<waveModel> New
+        (
+            const word& dictName,
+            const fvMesh& mesh,
+            const polyPatch& patch
+        );
+
+        //- Lookup waveModel from database, or create new
+        static tmp<waveModel> lookupOrCreate
+        (
+            const polyPatch& patch,
+            const fvMesh& mesh,
+            const word& waveDictName
+        );
+
+
+    //- Destructor
+    virtual ~waveModel();
+
+    //- Dictionary name
+    static const word dictName;
+
+
+    // Public Member Functions
+
+        //- Utility function to construct the model name
+        static word modelName(const word& patchName);
+
+        //- Read from dictionary
+        virtual bool read();
+
+        //- Return the latest wave velocity prediction
+        virtual const vectorField& U() const;
+
+        //- Return the latest wave indicator field prediction
+        virtual const scalarField& alpha() const;
+
+        //- Correct the model for time, t[s]
+        virtual void correct(const scalar t);
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/integration/OpenCFD/code/waveModel/waveModel/waveModelNew.C b/integration/OpenCFD/code/waveModel/waveModel/waveModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..60446418e577dcc2c7eafe42ec6e71fa8335b094
--- /dev/null
+++ b/integration/OpenCFD/code/waveModel/waveModel/waveModelNew.C
@@ -0,0 +1,103 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "waveModel.H"
+#include "fvMesh.H"
+
+Foam::autoPtr<Foam::waveModel> Foam::waveModel::New
+(
+    const word& dictName,
+    const fvMesh& mesh,
+    const polyPatch& patch
+)
+{
+    IOdictionary waveDict
+    (
+        IOobject
+        (
+            dictName,
+            mesh.time().constant(),
+            mesh,
+            IOobject::MUST_READ,
+            IOobject::NO_WRITE,
+            false                   // Not registering
+        )
+    );
+
+    word modelType = "none";
+    dictionary patchDict;
+    if (waveDict.found(patch.name()))
+    {
+        patchDict = waveDict.subDict(patch.name());
+        patchDict.lookup("waveModel") >> modelType;
+    }
+    else
+    {
+        FatalIOErrorInFunction(waveDict)
+            << "Dictionary entry for patch " << patch.name() << " not found"
+            << exit(FatalIOError);
+    }
+
+    Info<< "Selecting waveModel " << modelType << endl;
+
+    patchConstructorTable::iterator cstrIter =
+        patchConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == patchConstructorTablePtr_->end())
+    {
+        FatalIOErrorInFunction(waveDict)
+            << "Unknown waveModel type "
+            << modelType << nl << nl
+            << "Valid waveModel types are:" << nl
+            << patchConstructorTablePtr_->sortedToc()
+            << exit(FatalIOError);
+    }
+
+    return autoPtr<waveModel>(cstrIter()(patchDict, mesh, patch));
+}
+
+
+Foam::tmp<Foam::waveModel> Foam::waveModel::lookupOrCreate
+(
+    const polyPatch& patch,
+    const fvMesh& mesh,
+    const word& waveDictName
+)
+{
+    const word modelName = waveModel::modelName(patch.name());
+
+    if (!mesh.foundObject<waveModel>(modelName))
+    {
+        autoPtr<waveModel> model(waveModel::New(waveDictName, mesh, patch));
+        waveModel* waveModelPtr = model.ptr();
+        waveModelPtr->store();
+        waveModelPtr->info(Info);
+    }
+
+    return mesh.lookupObject<waveModel>(modelName);
+}
+
+
+// ************************************************************************* //