diff --git a/src/optimisation/adjointOptimisation/adjoint/Make/files b/src/optimisation/adjointOptimisation/adjoint/Make/files
index 0c72b563269ddcc67734e577710d00009b0db583..f377ef4598f5eb21831baa2258c62d2d05efbd60 100644
--- a/src/optimisation/adjointOptimisation/adjoint/Make/files
+++ b/src/optimisation/adjointOptimisation/adjoint/Make/files
@@ -55,6 +55,7 @@ objectives/incompressible/objectiveMoment/objectiveMoment.C
 objectives/incompressible/objectivePtLosses/objectivePtLosses.C
 objectives/incompressible/objectiveForceTarget/objectiveForceTarget.C
 objectives/incompressible/objectivePartialVolume/objectivePartialVolume.C
+objectives/incompressible/objectiveNutSqr/objectiveNutSqr.C
 
 /* OBJECTIVE MANAGER*/
 objectiveManager/objectiveManager/objectiveManager.C
@@ -76,11 +77,12 @@ turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOu
 turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletFlux/adjointOutletFluxFvPatchScalarField.C
 
 /* ADJOINT BOUNDARY CONDITIONS */
-adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C
+adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditions.C
 adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.C
 adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.C
 adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C
 adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.C
+adjointBoundaryConditions/adjointRotatingWallVelocity/adjointRotatingWallVelocityFvPatchVectorField.C
 adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.C
 adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.C
 adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.C
@@ -125,6 +127,7 @@ optimisation/adjointSensitivity/sensitivity/sensitivity.C
 optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.C
 incoSens=optimisation/adjointSensitivity/incompressible
 $(incoSens)/adjointSensitivity/adjointSensitivityIncompressible.C
+$(incoSens)/shapeSensitivities/shapeSensitivitiesIncompressible.C
 $(incoSens)/adjointEikonalSolver/adjointEikonalSolverIncompressible.C
 $(incoSens)/adjointMeshMovementSolver/adjointMeshMovementSolverIncompressible.C
 $(incoSens)/sensitivitySurface/sensitivitySurfaceIncompressible.C
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C
index 735b9387a471318702bff4da3fe7cc384ed42397..2febf7f9125ba530823dd8072d0a420c1febfab3 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -28,6 +28,10 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "adjointBoundaryCondition.H"
+#include "emptyFvPatch.H"
+#include "adjointSolverManager.H"
+#include "HashTable.H"
+#include "surfaceInterpolationScheme.H"
 #include "ATCUaGradU.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -35,14 +39,109 @@ License
 namespace Foam
 {
 
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
-defineTypeNameAndDebug(adjointBoundaryCondition, 0);
+template<class Type>
+template<class Type2>
+tmp
+<
+    Field<typename Foam::outerProduct<Foam::vector, Type2>::type>
+>
+adjointBoundaryCondition<Type>::computePatchGrad(word name)
+{
+    // Return field
+    typedef typename outerProduct<vector, Type2>::type GradType;
+    auto tresGrad = tmp<Field<GradType>>::New(patch_.size(), Zero);
+    auto& resGrad = tresGrad.ref();
+
+    const labelList& faceCells = patch_.faceCells();
+    const fvMesh& mesh = patch_.boundaryMesh().mesh();
+    const cellList& cells = mesh.cells();
+
+    // Go through the surfaceInterpolation scheme defined in gradSchemes for
+    // consistency
+    const GeometricField<Type2, fvPatchField, volMesh>& field =
+        mesh.lookupObject<volVectorField>(name);
+
+    // Gives problems when grad(AdjointVar) is computed using a limited scheme,
+    // since it is not possible to know a priori how many words to expect in the
+    // stream.
+    // Interpolation scheme is now read through interpolation schemes.
+    /*
+    word  gradSchemeName       ("grad(" + name + ')');
+    Istream& is = mesh.gradScheme(gradSchemeName);
+    word schemeData(is);
+    */
+
+    tmp<surfaceInterpolationScheme<Type2>> tinterpScheme
+    (
+        surfaceInterpolationScheme<Type2>::New
+        (
+            mesh,
+            mesh.interpolationScheme("interpolate(" + name + ")")
+        )
+    );
 
+    GeometricField<Type2, fvsPatchField, surfaceMesh> surfField
+    (
+        tinterpScheme().interpolate(field)
+    );
+
+    // Auxiliary fields
+    const surfaceVectorField& Sf = mesh.Sf();
+    tmp<vectorField> tnf = patch_.nf();
+    const vectorField& nf = tnf();
+    const scalarField& V = mesh.V();
+    const labelUList& owner = mesh.owner();
+
+    // Compute grad value of cell adjacent to the boundary
+    forAll(faceCells, fI)
+    {
+        const label cI = faceCells[fI];
+        const cell& cellI = cells[cI];
+        for (const label faceI : cellI) // global face numbering
+        {
+            label patchID = mesh.boundaryMesh().whichPatch(faceI);
+            if (patchID == -1) //face is internal
+            {
+                const label own = owner[faceI];
+                tensor flux = Sf[faceI]*surfField[faceI];
+                if (cI == own)
+                {
+                    resGrad[fI] += flux;
+                }
+                else
+                {
+                    resGrad[fI] -= flux;
+                }
+            }
+            else  // Face is boundary. Covers coupled patches as well
+            {
+                if (!isA<emptyFvPatch>(mesh.boundary()[patchID]))
+                {
+                    const fvPatch& patchForFlux = mesh.boundary()[patchID];
+                    const label boundaryFaceI = faceI - patchForFlux.start();
+                    const vectorField& Sfb = Sf.boundaryField()[patchID];
+                    resGrad[fI] +=
+                        Sfb[boundaryFaceI]
+                       *surfField.boundaryField()[patchID][boundaryFaceI];
+                }
+            }
+        }
+        resGrad[fI] /= V[cI];
+    }
+
+    // This has concluded the computation of the grad at the cell next to the
+    // boundary. We now need to compute the grad at the boundary face
+    const fvPatchField<Type2>& bField = field.boundaryField()[patch_.index()];
+    resGrad = nf*bField.snGrad() + (resGrad - nf*(nf & resGrad));
+
+    return tresGrad;
+}
 
-// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
-bool adjointBoundaryCondition::addATCUaGradUTerm()
+template<class Type>
+bool adjointBoundaryCondition<Type>::addATCUaGradUTerm()
 {
     if (addATCUaGradUTerm_.empty())
     {
@@ -54,9 +153,10 @@ bool adjointBoundaryCondition::addATCUaGradUTerm()
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-adjointBoundaryCondition::adjointBoundaryCondition
+template<class Type>
+adjointBoundaryCondition<Type>::adjointBoundaryCondition
 (
-    const adjointBoundaryCondition& adjointBC
+    const adjointBoundaryCondition<Type>& adjointBC
 )
 :
     patch_(adjointBC.patch_),
@@ -77,27 +177,53 @@ adjointBoundaryCondition::adjointBoundaryCondition
 {}
 
 
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+adjointBoundaryCondition<Type>::adjointBoundaryCondition
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const word& solverName
+)
+:
+    patch_(p),
+    managerName_("objectiveManager" + solverName),
+    adjointSolverName_(solverName),
+    simulationType_("incompressible"),
+    boundaryContrPtr_(nullptr),
+    addATCUaGradUTerm_(nullptr)
+{
+    // Set the boundaryContribution pointer
+    setBoundaryContributionPtr();
+}
+
+
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-const word& adjointBoundaryCondition::objectiveManagerName() const
+template<class Type>
+const word& adjointBoundaryCondition<Type>::objectiveManagerName() const
 {
     return managerName_;
 }
 
 
-const word& adjointBoundaryCondition::adjointSolverName() const
+template<class Type>
+const word& adjointBoundaryCondition<Type>::adjointSolverName() const
 {
     return adjointSolverName_;
 }
 
 
-const word& adjointBoundaryCondition::simulationType() const
+template<class Type>
+const word& adjointBoundaryCondition<Type>::simulationType() const
 {
     return simulationType_;
 }
 
 
-void adjointBoundaryCondition::setBoundaryContributionPtr()
+template<class Type>
+void adjointBoundaryCondition<Type>::setBoundaryContributionPtr()
 {
     // Note:
     // Check whether there is an objectiveFunctionManager object in the registry
@@ -128,19 +254,35 @@ void adjointBoundaryCondition::setBoundaryContributionPtr()
 }
 
 
+template<class Type>
 boundaryAdjointContribution&
-adjointBoundaryCondition::getBoundaryAdjContribution()
+adjointBoundaryCondition<Type>::getBoundaryAdjContribution()
 {
     return boundaryContrPtr_();
 }
 
 
-const ATCModel& adjointBoundaryCondition::getATC() const
+template<class Type>
+const ATCModel& adjointBoundaryCondition<Type>::getATC() const
+{
+    return
+        patch_.boundaryMesh().mesh().template
+            lookupObject<ATCModel>("ATCModel" + adjointSolverName_);
+}
+
+
+template<class Type>
+tmp
+<
+    Field<typename Foam::outerProduct<Foam::vector, Type>::type>
+>
+adjointBoundaryCondition<Type>::dxdbMult() const
 {
     return
-        patch_.boundaryMesh().mesh().lookupObject<ATCModel>
+        tmp<Field<typename Foam::outerProduct<Foam::vector, Type>::type>>::New
         (
-            "ATCModel" + adjointSolverName_
+            patch_.size(),
+            Zero
         );
 }
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.H
index 415a770b06809cb5cca02b93cb722fd877904b7c..4ec46c64c96867bc520b24b39cbfe082eb8c8933 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -46,9 +46,10 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                  Class adjointBoundaryCondition Declaration
+                   Class adjointBoundaryCondition Declaration
 \*---------------------------------------------------------------------------*/
 
+template<class Type>
 class adjointBoundaryCondition
 {
 protected:
@@ -82,10 +83,10 @@ protected:
     // Protected Member Functions
 
         //- Get gradient of field on a specific boundary
-        template<class Type>
+        template<class Type2>
         tmp
         <
-            Field<typename Foam::outerProduct<Foam::vector, Type>::type>
+            Field<typename Foam::outerProduct<Foam::vector, Type2>::type>
         > computePatchGrad(word name);
 
         //- Whether to add the extra term from the UaGradU formulation
@@ -103,7 +104,6 @@ public:
     // Constructors
 
         //- Construct from field and base name
-        template<class Type>
         adjointBoundaryCondition
         (
             const fvPatch& p,
@@ -112,11 +112,11 @@ public:
         );
 
         //- Construct as copy
-        adjointBoundaryCondition(const adjointBoundaryCondition&);
+        adjointBoundaryCondition(const adjointBoundaryCondition<Type>&);
 
 
     //- Destructor
-    virtual ~adjointBoundaryCondition() = default;
+    virtual ~adjointBoundaryCondition<Type>() = default;
 
 
     // Member Functions
@@ -140,6 +140,18 @@ public:
 
             //- ATC type might be useful for a number of BCs. Return here
             const ATCModel& getATC() const;
+
+
+        // Contribution to sensitivity derivatives
+
+            //- Return contribution to sensitivity derivatives
+            //  For adjoint boundary conditions corresponding to primal
+            //  boundary conditions that include geometric components
+            //  (e.g. rotatingWallVelocity)
+            virtual tmp
+            <
+                Field<typename Foam::outerProduct<Foam::vector, Type>::type>
+            > dxdbMult() const;
 };
 
 
@@ -150,11 +162,14 @@ public:
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #ifdef NoRepository
-    #include "adjointBoundaryConditionTemplates.C"
+    #include "adjointBoundaryCondition.C"
 #endif
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #endif
 
+#define makeAdjointBoundaryCondition(adjointTypeBoundaryCondition)             \
+defineNamedTemplateTypeNameAndDebug(adjointTypeBoundaryCondition, 0);
+
 // ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditions.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditions.C
new file mode 100644
index 0000000000000000000000000000000000000000..3b6da10de1e732726cfbea1e0ed82aff76c2e930
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditions.C
@@ -0,0 +1,45 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 PCOpt/NTUA
+    Copyright (C) 2020 FOSS GP
+-------------------------------------------------------------------------------
+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 "adjointBoundaryConditions.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makeAdjointBoundaryCondition(adjointScalarBoundaryCondition)
+makeAdjointBoundaryCondition(adjointVectorBoundaryCondition)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditions.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditions.H
new file mode 100644
index 0000000000000000000000000000000000000000..9551722dad12b38a7fe79459c98d3a97c4aa7912
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditions.H
@@ -0,0 +1,39 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 PCOpt/NTUA
+    Copyright (C) 2020 FOSS GP
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef adjointBoundaryConditions_H
+#define adjointBoundaryConditions_H
+
+#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditionsFwd.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditionsFwd.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditionsFwd.H
new file mode 100644
index 0000000000000000000000000000000000000000..88a093c2c2d6850ca004b153c0314e872435f133
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryConditionsFwd.H
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 PCOpt/NTUA
+    Copyright (C) 2020 FOSS GP
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef adjointBoundaryConditionsFwd_H
+#define adjointBoundaryConditionsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class adjointBoundaryCondition;
+
+typedef adjointBoundaryCondition<scalar> adjointScalarBoundaryCondition;
+typedef adjointBoundaryCondition<vector> adjointVectorBoundaryCondition;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.C
index 09dd5ea5c7cd554ffbf5fadaff7f6ded1e8e4cbf..695f1e4c4595fcde9e4f49243cef31685838947c 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -44,7 +44,7 @@ adjointFarFieldPressureFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointScalarBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -58,7 +58,7 @@ adjointFarFieldPressureFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointScalarBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -71,7 +71,7 @@ adjointFarFieldPressureFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointScalarBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<scalar>::operator=
     (
@@ -88,7 +88,7 @@ adjointFarFieldPressureFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(tppsf, iF),
-    adjointBoundaryCondition(tppsf)
+    adjointScalarBoundaryCondition(tppsf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.H
index 0e69a91d5a79671756f37ac372ef98f8aa140f16..97406ef979ac3f0ea2c99b1e2f52279d8dc9b4b4 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldPressure/adjointFarFieldPressureFvPatchScalarField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -41,7 +41,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -55,7 +55,7 @@ namespace Foam
 class adjointFarFieldPressureFvPatchScalarField
 :
     public fixedValueFvPatchScalarField,
-    public adjointBoundaryCondition
+    public adjointScalarBoundaryCondition
 {
 public:
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.C
index 1646cbe0a10c53c0fb57b1b47da629833a0669e3..88de315419b4714102a1edbf23e48c6f33bbf724 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -40,7 +40,7 @@ adjointFarFieldVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointVectorBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -54,7 +54,7 @@ adjointFarFieldVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointVectorBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -67,7 +67,7 @@ adjointFarFieldVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointVectorBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<vector>::operator=
     (
@@ -84,7 +84,7 @@ adjointFarFieldVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(pivpvf, iF),
-    adjointBoundaryCondition(pivpvf)
+    adjointVectorBoundaryCondition(pivpvf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.H
index 13638347e6cacfc24e6d669312b32cd56ada7e8d..1f61a89d7a188e4a9cc23f9a8fd30f4369d7f678 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointFarFieldVelocity/adjointFarFieldVelocityFvPatchVectorField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -41,7 +41,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -55,7 +55,7 @@ namespace Foam
 class adjointFarFieldVelocityFvPatchVectorField
 :
     public fixedValueFvPatchVectorField,
-    public adjointBoundaryCondition
+    public adjointVectorBoundaryCondition
 {
 public:
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.C
index 6350f30d6374c36e2805fb935846c3293400c5ec..a5e71cb4c3373a54f2cb890a64db5b85d9f41743 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -42,7 +42,7 @@ adjointInletVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointVectorBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -56,7 +56,7 @@ adjointInletVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointVectorBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -69,7 +69,7 @@ adjointInletVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointVectorBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<vector>::operator=
     (
@@ -86,7 +86,7 @@ adjointInletVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(pivpvf, iF),
-    adjointBoundaryCondition(pivpvf)
+    adjointVectorBoundaryCondition(pivpvf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.H
index e9c688bdbde99c2bf9374d4a8f6b9fea030a48b0..04d4891f0966af67446f1d69b9e9bb6cccc6c441 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointInletVelocity/adjointInletVelocityFvPatchVectorField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -41,7 +41,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -55,7 +55,7 @@ namespace Foam
 class adjointInletVelocityFvPatchVectorField
 :
     public fixedValueFvPatchVectorField,
-    public adjointBoundaryCondition
+    public adjointVectorBoundaryCondition
 {
 public:
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.C
index 5c76bc26716fc7195563ca7a35bcc402c8df93f4..b4f5015493981585dcc962ca6c8129a66997d831 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -45,7 +45,7 @@ adjointOutletPressureFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointScalarBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -59,7 +59,7 @@ adjointOutletPressureFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointScalarBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -72,7 +72,7 @@ adjointOutletPressureFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointScalarBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<scalar>::operator=
     (
@@ -89,7 +89,7 @@ adjointOutletPressureFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(tppsf, iF),
-    adjointBoundaryCondition(tppsf)
+    adjointScalarBoundaryCondition(tppsf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.H
index 7e12c17cb704176871cc9488c50ff48fee349639..ad035cc6ff7f9eaac33884b80be1d6877ef15902 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletPressure/adjointOutletPressureFvPatchScalarField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -41,7 +41,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -55,7 +55,7 @@ namespace Foam
 class adjointOutletPressureFvPatchScalarField
 :
     public fixedValueFvPatchScalarField,
-    public adjointBoundaryCondition
+    public adjointScalarBoundaryCondition
 {
 public:
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.C
index adc25347523361206961850f7ac2b8b7445ffd7d..4d3f2fce75d2acb8d6fe9ab9022c454c307b62a3 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -102,7 +102,7 @@ adjointOutletVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointVectorBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -116,7 +116,7 @@ adjointOutletVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointVectorBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -129,7 +129,7 @@ adjointOutletVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointVectorBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<vector>::operator=
     (
@@ -146,7 +146,7 @@ adjointOutletVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(pivpvf, iF),
-    adjointBoundaryCondition(pivpvf)
+    adjointVectorBoundaryCondition(pivpvf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.H
index b0ae32e3eaca8570f05e8f1832940c47dccf8f65..95c57078aa6e78b21ea3a6f9a81c890b97eaa4fd 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocity/adjointOutletVelocityFvPatchVectorField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -46,7 +46,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -60,7 +60,7 @@ namespace Foam
 class adjointOutletVelocityFvPatchVectorField
 :
     public fixedValueFvPatchVectorField,
-    public adjointBoundaryCondition
+    public adjointVectorBoundaryCondition
 {
     // Private Member Functions
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.C
index 871db0a78616687b144671f19069847fc4ad2a7b..8abaf44d00c9eadc46ee9e0168c4620201974ef3 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -42,7 +42,7 @@ adjointOutletVelocityFluxFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointVectorBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -56,7 +56,7 @@ adjointOutletVelocityFluxFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointVectorBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -69,7 +69,7 @@ adjointOutletVelocityFluxFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointVectorBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<vector>::operator=
     (
@@ -86,7 +86,7 @@ adjointOutletVelocityFluxFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(pivpvf, iF),
-    adjointBoundaryCondition(pivpvf)
+    adjointVectorBoundaryCondition(pivpvf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.H
index 854443b350789c524ae0c127bc7ca3ce98b972d4..3201b245ab79d4d7c403ef690b1944635b0b4b1a 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -47,7 +47,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -61,7 +61,7 @@ namespace Foam
 class adjointOutletVelocityFluxFvPatchVectorField
 :
     public fixedValueFvPatchVectorField,
-    public adjointBoundaryCondition
+    public adjointVectorBoundaryCondition
 {
     // Private Member Functions
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointRotatingWallVelocity/adjointRotatingWallVelocityFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointRotatingWallVelocity/adjointRotatingWallVelocityFvPatchVectorField.C
new file mode 100644
index 0000000000000000000000000000000000000000..c7d4487a479238c20fbe4a326f9808cfd81b6b9e
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointRotatingWallVelocity/adjointRotatingWallVelocityFvPatchVectorField.C
@@ -0,0 +1,135 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 PCOpt/NTUA
+    Copyright (C) 2020 FOSS GP
+-------------------------------------------------------------------------------
+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 "adjointRotatingWallVelocityFvPatchVectorField.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::adjointRotatingWallVelocityFvPatchVectorField::
+adjointRotatingWallVelocityFvPatchVectorField
+(
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF
+)
+:
+    adjointWallVelocityFvPatchVectorField(p, iF),
+    origin_(),
+    axis_(Zero),
+    omega_(nullptr)
+{}
+
+
+Foam::adjointRotatingWallVelocityFvPatchVectorField::
+adjointRotatingWallVelocityFvPatchVectorField
+(
+    const adjointRotatingWallVelocityFvPatchVectorField& ptf,
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    adjointWallVelocityFvPatchVectorField(ptf, p, iF, mapper),
+    origin_(ptf.origin_),
+    axis_(ptf.axis_),
+    omega_(ptf.omega_.clone())
+{}
+
+
+Foam::adjointRotatingWallVelocityFvPatchVectorField::
+adjointRotatingWallVelocityFvPatchVectorField
+(
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    adjointWallVelocityFvPatchVectorField(p, iF, dict),
+    origin_(dict.get<vector>("origin")),
+    axis_(dict.get<vector>("axis")),
+    omega_(Function1<scalar>::New("omega", dict))
+{}
+
+
+Foam::adjointRotatingWallVelocityFvPatchVectorField::
+adjointRotatingWallVelocityFvPatchVectorField
+(
+    const adjointRotatingWallVelocityFvPatchVectorField& pivpvf,
+    const DimensionedField<vector, volMesh>& iF
+)
+:
+    adjointWallVelocityFvPatchVectorField(pivpvf, iF),
+    origin_(pivpvf.origin_),
+    axis_(pivpvf.axis_),
+    omega_(pivpvf.omega_.clone())
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::tmp<Foam::tensorField>
+Foam::adjointRotatingWallVelocityFvPatchVectorField::dxdbMult() const
+{
+    const scalar t(this->db().time().timeOutputValue());
+    const scalar om(omega_->value(t));
+    const vector omega(om*axis_/mag(axis_));
+    tensor mult
+    (
+        scalar(0), -omega.z(),  omega.y(),
+        omega.z(),  scalar(0), -omega.x(),
+       -omega.y(),  omega.x(),  scalar(0)
+    );
+
+    return tmp<tensorField>::New(patch().size(), mult);
+}
+
+
+void Foam::adjointRotatingWallVelocityFvPatchVectorField::write
+(
+    Ostream& os
+) const
+{
+    adjointWallVelocityFvPatchVectorField::write(os);
+    os.writeEntry("origin", origin_);
+    os.writeEntry("axis", axis_);
+    omega_->writeData(os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    makePatchTypeField
+    (
+        fvPatchVectorField,
+        adjointRotatingWallVelocityFvPatchVectorField
+    );
+}
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointRotatingWallVelocity/adjointRotatingWallVelocityFvPatchVectorField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointRotatingWallVelocity/adjointRotatingWallVelocityFvPatchVectorField.H
new file mode 100644
index 0000000000000000000000000000000000000000..382ffa5baaaf9791b1521668825a0f70a096222f
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointRotatingWallVelocity/adjointRotatingWallVelocityFvPatchVectorField.H
@@ -0,0 +1,154 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 PCOpt/NTUA
+    Copyright (C) 2020 FOSS GP
+-------------------------------------------------------------------------------
+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::adjointRotatingWallVelocityFvPatchVectorField
+
+Description
+    The same as adjointWallVelocity but additionally computes the sensitivity
+    contribution emerging from the change in the positions of the face centres,
+    in case rotatingWallVelocity is used for the flow simulation.
+
+SourceFiles
+    adjointRotatingWallVelocityFvPatchVectorField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef adjointRotatingWallVelocityFvPatchVectorField_H
+#define adjointRotatingWallVelocityFvPatchVectorField_H
+
+#include "adjointWallVelocityFvPatchVectorField.H"
+#include "Function1.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                 Class adjointRotatingWallVelocity Declaration
+\*---------------------------------------------------------------------------*/
+
+class adjointRotatingWallVelocityFvPatchVectorField
+:
+    public adjointWallVelocityFvPatchVectorField
+{
+private:
+
+    // Private Data
+
+        //- Origin of the rotation
+        vector origin_;
+
+        //- Axis of the rotation
+        vector axis_;
+
+        //- Rotational speed
+        autoPtr<Function1<scalar>> omega_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("adjointRotatingWallVelocity");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        adjointRotatingWallVelocityFvPatchVectorField
+        (
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        adjointRotatingWallVelocityFvPatchVectorField
+        (
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //- adjointRotatingWallVelocityFvPatchVectorField onto a new patch
+        adjointRotatingWallVelocityFvPatchVectorField
+        (
+            const adjointRotatingWallVelocityFvPatchVectorField&,
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchVectorField> clone() const
+        {
+            return tmp<fvPatchVectorField>
+            (
+                new adjointRotatingWallVelocityFvPatchVectorField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        adjointRotatingWallVelocityFvPatchVectorField
+        (
+            const adjointRotatingWallVelocityFvPatchVectorField&,
+            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 adjointRotatingWallVelocityFvPatchVectorField(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        //- Compute contribution to SDs
+        virtual tmp<tensorField> dxdbMult() const;
+
+        //- Write
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C
index 00db8159e8099bc9ed58801b1837395a666becee..32372f99affc5c919f480a9d14400b602efd258e 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -42,7 +42,7 @@ adjointWallVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null),
+    adjointVectorBoundaryCondition(p, iF, word::null),
     kappa_(0.41),
     E_(9.8)
 {}
@@ -58,7 +58,7 @@ adjointWallVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_),
+    adjointVectorBoundaryCondition(p, iF, ptf.adjointSolverName_),
     kappa_(ptf.kappa_),
     E_(ptf.E_)
 {}
@@ -73,7 +73,7 @@ adjointWallVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName")),
+    adjointVectorBoundaryCondition(p, iF, dict.get<word>("solverName")),
     kappa_(dict.getOrDefault<scalar>("kappa", 0.41)),
     E_(dict.getOrDefault<scalar>("E", 9.8))
 {
@@ -92,7 +92,7 @@ adjointWallVelocityFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(pivpvf, iF),
-    adjointBoundaryCondition(pivpvf),
+    adjointVectorBoundaryCondition(pivpvf),
     kappa_(pivpvf.kappa_),
     E_(pivpvf.E_)
 {}
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.H
index f2b5ed4bc3a050c2951079fc0c5d8e98e5e871bc..7ead8328d5b09f6d8221d49fbc2eec88614b4972 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -55,7 +55,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -69,7 +69,7 @@ namespace Foam
 class adjointWallVelocityFvPatchVectorField
 :
     public fixedValueFvPatchVectorField,
-    public adjointBoundaryCondition
+    public adjointVectorBoundaryCondition
 {
 private:
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.C
index aacded67f8bf4820bb944d1bbe857ed1068b8102..606eb246250e0532ffd0565ebb61810120541df7 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -41,7 +41,7 @@ adjointWallVelocityLowReFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointVectorBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -55,7 +55,7 @@ adjointWallVelocityLowReFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointVectorBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -68,7 +68,7 @@ adjointWallVelocityLowReFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointVectorBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<vector>::operator=
     (
@@ -85,7 +85,7 @@ adjointWallVelocityLowReFvPatchVectorField
 )
 :
     fixedValueFvPatchVectorField(pivpvf, iF),
-    adjointBoundaryCondition(pivpvf)
+    adjointVectorBoundaryCondition(pivpvf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.H
index 5d4980c89d68c4244556453b30785bb9042ef34e..30a1752191db6267a3a98a2854050aa398dee02c 100644
--- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocityLowRe/adjointWallVelocityLowReFvPatchVectorField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -41,7 +41,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -55,7 +55,7 @@ namespace Foam
 class adjointWallVelocityLowReFvPatchVectorField
 :
     public fixedValueFvPatchVectorField,
-    public adjointBoundaryCondition
+    public adjointVectorBoundaryCondition
 {
 public:
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectiveManager/objectiveManager/objectiveManager.C b/src/optimisation/adjointOptimisation/adjoint/objectiveManager/objectiveManager/objectiveManager.C
index 89c6ef89be01d14b199e68009cf9b7fe185d5ed7..2420ebfb244a55e47c3d112cf623d061d309e55f 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectiveManager/objectiveManager/objectiveManager.C
+++ b/src/optimisation/adjointOptimisation/adjoint/objectiveManager/objectiveManager/objectiveManager.C
@@ -151,12 +151,16 @@ bool objectiveManager::readDict(const dictionary& dict)
     return true;
 }
 
+
 void objectiveManager::updateNormalizationFactor()
 {
     // Update normalization factors for all objectives
     for (objective& obj : objectives_)
     {
-        obj.updateNormalizationFactor();
+        if (obj.normalize())
+        {
+            obj.updateNormalizationFactor();
+        }
     }
 }
 
@@ -173,7 +177,7 @@ void objectiveManager::update()
 
 void objectiveManager::updateOrNullify()
 {
-    //- Update contributions to adjoint if true, otherwise return nulls
+    // Update contributions to adjoint if true, otherwise return nulls
     for (objective& obj : objectives_)
     {
         if (obj.isWithinIntegrationTime())
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveForceTarget/objectiveForceTarget.C b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveForceTarget/objectiveForceTarget.C
index 19195b77b0be718a89cd38f4c7c61dc8e169353e..b6895320e3e9273132bd018efa69882f68e2772b 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveForceTarget/objectiveForceTarget.C
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveForceTarget/objectiveForceTarget.C
@@ -7,7 +7,7 @@
 -------------------------------------------------------------------------------
     Copyright (C) 2007-2019 PCOpt/NTUA
     Copyright (C) 2013-2019 FOSS GP
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -75,7 +75,7 @@ scalar objectiveForceTarget::J()
 }
 
 
-void objectiveForceTarget::write() const
+bool objectiveForceTarget::write(const bool valid) const
 {
     if (Pstream::master())
     {
@@ -99,6 +99,8 @@ void objectiveForceTarget::write() const
             << setw(width) << force_ << " "
             << setw(width) << target_ << endl;
     }
+
+    return true;
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveForceTarget/objectiveForceTarget.H b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveForceTarget/objectiveForceTarget.H
index 1e6bb6acc3d7d0d104c859ad4ee75f2ab0cfea67..f94763aeb9e1c152ba6d02325f58f4a2b8a9bb60 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveForceTarget/objectiveForceTarget.H
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveForceTarget/objectiveForceTarget.H
@@ -7,7 +7,7 @@
 -------------------------------------------------------------------------------
     Copyright (C) 2007-2019 PCOpt/NTUA
     Copyright (C) 2013-2019 FOSS GP
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -92,7 +92,7 @@ public:
         scalar J();
 
         //- Write objective value
-        void write() const;
+        virtual bool write(const bool valid = true) const;
 };
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveIncompressible/objectiveIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveIncompressible/objectiveIncompressible.C
index ac7fa6fb1f6895960253a57b626bde936f22854b..dbc0789d24bd6a9d871fdbf1426f47bee22178e4 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveIncompressible/objectiveIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveIncompressible/objectiveIncompressible.C
@@ -7,7 +7,7 @@
 -------------------------------------------------------------------------------
     Copyright (C) 2007-2019 PCOpt/NTUA
     Copyright (C) 2013-2019 FOSS GP
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -128,6 +128,67 @@ autoPtr<objectiveIncompressible> objectiveIncompressible::New
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+void objectiveIncompressible::doNormalization()
+{
+    if (normalize_ && normFactor_.valid())
+    {
+        const scalar oneOverNorm(1./normFactor_());
+
+        if (hasdJdv())
+        {
+            dJdvPtr_().primitiveFieldRef() *= oneOverNorm;
+        }
+        if (hasdJdp())
+        {
+            dJdpPtr_().primitiveFieldRef() *= oneOverNorm;
+        }
+        if (hasdJdT())
+        {
+            dJdTPtr_().primitiveFieldRef() *= oneOverNorm;
+        }
+        if (hasdJdTMVar1())
+        {
+            dJdTMvar1Ptr_().primitiveFieldRef() *= oneOverNorm;
+        }
+        if (hasdJdTMVar2())
+        {
+            dJdTMvar2Ptr_().primitiveFieldRef() *= oneOverNorm;
+        }
+        if (hasBoundarydJdv())
+        {
+            bdJdvPtr_() *= oneOverNorm;
+        }
+        if (hasBoundarydJdvn())
+        {
+            bdJdvnPtr_() *= oneOverNorm;
+        }
+        if (hasBoundarydJdvt())
+        {
+            bdJdvtPtr_() *= oneOverNorm;
+        }
+        if (hasBoundarydJdp())
+        {
+            bdJdpPtr_() *= oneOverNorm;
+        }
+        if (hasBoundarydJdT())
+        {
+            bdJdTPtr_() *= oneOverNorm;
+        }
+        if (hasBoundarydJdTMVar1())
+        {
+            bdJdTMvar1Ptr_() *= oneOverNorm;
+        }
+        if (hasBoundarydJdTMVar2())
+        {
+            bdJdTMvar2Ptr_() *= oneOverNorm;
+        }
+
+        // Normalize geometric fields
+        objective::doNormalization();
+    }
+}
+
+
 const volVectorField& objectiveIncompressible::dJdv()
 {
     if (dJdvPtr_.empty())
@@ -418,6 +479,9 @@ void objectiveIncompressible::update()
     update_dxdbDirectMultiplier();
     update_boundaryEdgeContribution();
     update_dJdStressMultiplier();
+
+    // Divide everything with normalization factor
+    doNormalization();
 }
 
 
@@ -482,9 +546,9 @@ void objectiveIncompressible::nullify()
 }
 
 
-void objectiveIncompressible::write() const
+bool objectiveIncompressible::write(const bool valid) const
 {
-    objective::write();
+    return objective::write(valid);
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveIncompressible/objectiveIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveIncompressible/objectiveIncompressible.H
index 1bf89badd9675411198c7030bed5ead2eb81ab5a..a96a07b003ce4410896532b848509cb1ff3ce23c 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveIncompressible/objectiveIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveIncompressible/objectiveIncompressible.H
@@ -7,7 +7,7 @@
 -------------------------------------------------------------------------------
     Copyright (C) 2007-2019 PCOpt/NTUA
     Copyright (C) 2013-2019 FOSS GP
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -165,6 +165,9 @@ public:
         //- Return the objective function value
         virtual scalar J() = 0;
 
+        //- Normalize all fields allocated by the objective
+        virtual void doNormalization();
+
         //- Contribution to field adjoint momentum eqs
         const volVectorField& dJdv();
 
@@ -303,7 +306,7 @@ public:
         {}
 
         //- Write objective function history
-        virtual void write() const;
+        virtual bool write(const bool valid = true) const;
 
         //- Inline functions for checking whether pointers are set or not
         inline bool hasdJdv() const;
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveNutSqr/objectiveNutSqr.C b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveNutSqr/objectiveNutSqr.C
new file mode 100644
index 0000000000000000000000000000000000000000..515b82061ff3bdc6172ffb510000c8c4e3808d5d
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveNutSqr/objectiveNutSqr.C
@@ -0,0 +1,169 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
+-------------------------------------------------------------------------------
+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 "objectiveNutSqr.H"
+#include "createZeroField.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+namespace objectives
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(objectiveNutSqr, 1);
+addToRunTimeSelectionTable
+(
+    objectiveIncompressible,
+    objectiveNutSqr,
+    dictionary
+);
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+objectiveNutSqr::objectiveNutSqr
+(
+    const fvMesh& mesh,
+    const dictionary& dict,
+    const word& adjointSolverName,
+    const word& primalSolverName
+)
+:
+    objectiveIncompressible(mesh, dict, adjointSolverName, primalSolverName),
+    zones_
+    (
+        mesh_.cellZones().indices(this->dict().get<wordRes>("zones"))
+    )
+{
+    // Allocate source term for the adjoint turbulence model
+    dJdTMvar1Ptr_.reset
+    (
+        createZeroFieldPtr<scalar>
+        (
+            mesh_,
+            "ATMSource",
+            (dimless/dimTime/dimTime)
+        )
+    );
+    // Allocate term to be added to volume-based sensitivity derivatives
+    divDxDbMultPtr_.reset
+    (
+        createZeroFieldPtr<scalar>
+        (
+            mesh_,
+            ("divDxdbMult"+type()) ,
+            //variable dimensions!!
+            //Dummy zeroes. Only the internalField will be used
+            dimensionSet(0,0,0,0,0,0,0)
+        )
+    );
+    // set file pointer
+    //objFunctionFilePtr_ = new OFstream(objFunctionFolder_/type());
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+scalar objectiveNutSqr::J()
+{
+    J_ = Zero;
+
+    const autoPtr<incompressible::RASModelVariables>&
+       turbVars = vars_.RASModelVariables();
+    const volScalarField& nut = turbVars->nutRefInst();
+
+    //scalar zoneVol(Zero);
+    for (const label zI : zones_)
+    {
+        const cellZone& zoneI = mesh_.cellZones()[zI];
+        for (const label cellI : zoneI)
+        {
+            J_ += sqr(nut[cellI])*(mesh_.V()[cellI]);
+            //zoneVol += mesh_.V()[cellI];
+        }
+    }
+    reduce(J_, sumOp<scalar>());
+    //reduce(zoneVol, sumOp<scalar>());
+
+    return J_;
+}
+
+
+void objectiveNutSqr::update_dJdTMvar1()
+{
+    const autoPtr<incompressible::RASModelVariables>&
+       turbVars = vars_.RASModelVariables();
+    const singlePhaseTransportModel& lamTransp = vars_.laminarTransport();
+    const volScalarField& nut = turbVars->nutRef();
+
+    tmp<volScalarField> tnutJacobian = turbVars->nutJacobianVar1(lamTransp);
+    const volScalarField& nutJacobian = tnutJacobian();
+
+    volScalarField& dJdTMvar1 = dJdTMvar1Ptr_();
+
+    for (const label zI : zones_)
+    {
+        const cellZone& zoneI = mesh_.cellZones()[zI];
+        for (const label cellI : zoneI)
+        {
+            dJdTMvar1[cellI] = 2.*nut[cellI]*nutJacobian[cellI];
+        }
+    }
+}
+
+
+void objectiveNutSqr::update_divDxDbMultiplier()
+{
+    const autoPtr<incompressible::RASModelVariables>&
+       turbVars = vars_.RASModelVariables();
+    const volScalarField& nut = turbVars->nutRef();
+
+    volScalarField& divDxDbMult = divDxDbMultPtr_();
+
+    for (const label zI : zones_)
+    {
+        const cellZone& zoneI = mesh_.cellZones()[zI];
+        for (const label cellI : zoneI)
+        {
+            divDxDbMult[cellI] = sqr(nut[cellI]);
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace objectives
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveNutSqr/objectiveNutSqr.H b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveNutSqr/objectiveNutSqr.H
new file mode 100644
index 0000000000000000000000000000000000000000..b2211b9b506fe28b31ef3f929538fc0730aad7d0
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveNutSqr/objectiveNutSqr.H
@@ -0,0 +1,127 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
+-------------------------------------------------------------------------------
+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::objectives::objectiveNutSqr
+
+Description
+    Objective qualitatively quantifying noise through the integral of the
+    squared turbulent viscosity over specified cellZones. Requires the adjoint
+    to the turbulence model to be incorporated into the optimisation loop.
+
+    Reference:
+    \verbatim
+        Objective function initially presented in
+
+            Papoutsis-Kiachagias, E. M., Magoulas, N., Mueller, J., Othmer, C.,
+            & Giannakoglou, K. C. (2015).
+            Noise reduction in car aerodynamics using a surrogate objective
+            function and the continuous adjoint method with wall functions.
+            Computers & Fluids, 122(20), 223-232.
+            https://doi.org/10.1016/j.compfluid.2015.09.002
+    \endverbatim
+
+SourceFiles
+    objectiveNutSqrNoise.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef objectiveNutSqr_H
+#define objectiveNutSqr_H
+
+#include "objectiveIncompressible.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+namespace objectives
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class objectiveNutSqr Declaration
+\*---------------------------------------------------------------------------*/
+
+class objectiveNutSqr
+:
+    public objectiveIncompressible
+{
+    // Private data
+
+        //- Where to define the objective
+        labelList zones_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("nutSqr");
+
+
+    // Constructors
+
+        //- From components
+        objectiveNutSqr
+        (
+            const fvMesh& mesh,
+            const dictionary& dict,
+            const word& adjointSolverName,
+            const word& primalSolverName
+        );
+
+
+    //- Destructor
+    virtual ~objectiveNutSqr() = default;
+
+
+    // Member Functions
+
+        //- Return the objective function value
+        scalar J();
+
+        //- Update field to be added to the adjoint turbulence model PDE
+        //  The equivalent for the second turbulence model variable should
+        //  be implemented for turbulence models other than SA
+        void update_dJdTMvar1();
+
+        //- Update field to be added to be added to volume-based
+        //- sensitivity derivatives, emerging from delta ( dV ) / delta b
+        void update_divDxDbMultiplier();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace objectiveNutSqrNoise
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePartialVolume/objectivePartialVolume.C b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePartialVolume/objectivePartialVolume.C
index 7861fac8392da0b27612e0c38ec4b45c50bb8dba..8fec4c11ff16de8934690a32750d2f9404dd2397 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePartialVolume/objectivePartialVolume.C
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePartialVolume/objectivePartialVolume.C
@@ -133,7 +133,7 @@ void objectivePartialVolume::update_dSdbMultiplier()
 }
 
 
-void objectivePartialVolume::write() const
+bool objectivePartialVolume::write(const bool valid) const
 {
     if (Pstream::master())
     {
@@ -153,6 +153,8 @@ void objectivePartialVolume::write() const
         objFunctionFilePtr_() << setw(width) << J_ << " ";
         objFunctionFilePtr_() << setw(width) << initVol_ << endl;
     }
+
+    return true;
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePartialVolume/objectivePartialVolume.H b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePartialVolume/objectivePartialVolume.H
index ba409f2af07468c463072fcd434b5ce4ca9325cb..aec678088a96017b0d9ce5f0204db95d0d274c46 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePartialVolume/objectivePartialVolume.H
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePartialVolume/objectivePartialVolume.H
@@ -7,7 +7,7 @@
 -------------------------------------------------------------------------------
     Copyright (C) 2007-2019 PCOpt/NTUA
     Copyright (C) 2013-2019 FOSS GP
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -99,7 +99,7 @@ public:
         void update_dSdbMultiplier();
 
         //- Write objective function history
-        void write() const;
+        virtual bool write(const bool valid = true) const;
 };
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePtLosses/objectivePtLosses.C b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePtLosses/objectivePtLosses.C
index d4f43c7afc62d9471c3f13d58ac4eab0019ffe4d..53792824458558d4c7a294179b443a7cdf7f4b1e 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePtLosses/objectivePtLosses.C
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePtLosses/objectivePtLosses.C
@@ -234,7 +234,7 @@ void objectivePtLosses::update_boundarydJdvt()
 }
 
 
-void objectivePtLosses::write() const
+bool objectivePtLosses::write(const bool valid) const
 {
     if (Pstream::master())
     {
@@ -247,6 +247,7 @@ void objectivePtLosses::write() const
             setObjectiveFilePtr();
             objFunctionFilePtr_() << setw(4)     << "#"        << " ";
             objFunctionFilePtr_() << setw(width) << "ptLosses" << " ";
+            objFunctionFilePtr_() << setw(width) << "JCycle"   << " ";
             forAll(patches_, oI)
             {
                 label patchI = patches_[oI];
@@ -258,12 +259,15 @@ void objectivePtLosses::write() const
 
         objFunctionFilePtr_() << setw(4)     << mesh_.time().value() << " ";
         objFunctionFilePtr_() << setw(width) << J_ << " ";
+        objFunctionFilePtr_() << setw(width) << JCycle() << " ";
         forAll(patchPt_, pI)
         {
             objFunctionFilePtr_() << setw(width) << patchPt_[pI] << " ";
         }
         objFunctionFilePtr_() << endl;
     }
+
+    return true;
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePtLosses/objectivePtLosses.H b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePtLosses/objectivePtLosses.H
index 0953add4055ae64fb8f453d478c16437c3b89409..014dd3cabdc0fe5a37ec1c067f87fd2590ee3ceb 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePtLosses/objectivePtLosses.H
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePtLosses/objectivePtLosses.H
@@ -7,7 +7,7 @@
 -------------------------------------------------------------------------------
     Copyright (C) 2007-2019 PCOpt/NTUA
     Copyright (C) 2013-2019 FOSS GP
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -59,8 +59,10 @@ class objectivePtLosses
 {
     // Private data
 
+        //- Patches on which to compute losses
         labelList patches_;
 
+        //- Total pressure per patch on patches_
         scalarField patchPt_;
 
 
@@ -107,7 +109,7 @@ public:
         void update_boundarydJdvt();
 
         //- Write objective function values and its contrituents
-        void write() const;
+        virtual bool write(const bool valid = true) const;
 };
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/objective/objective.C b/src/optimisation/adjointOptimisation/adjoint/objectives/objective/objective.C
index a9a910d6a7a9fc7674477ec39ffee449df7adc10..5a0bf4dea6d1355e6d3cdec869be103729f2ff4f 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/objective/objective.C
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/objective/objective.C
@@ -5,9 +5,9 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -106,6 +106,22 @@ objective::objective
     const word& primalSolverName
 )
 :
+    localIOdictionary
+    (
+        IOobject
+        (
+            dict.dictName(),
+            mesh.time().timeName(),
+            fileName("uniform")/fileName("objectives")/adjointSolverName,
+            mesh,
+            IOobject::READ_IF_PRESENT,
+            IOobject::AUTO_WRITE
+        ),
+        // avoid type checking since dictionary is read using the
+        // derived type name and type() will result in "objective"
+        // here
+        word::null
+    ),
     mesh_(mesh),
     dict_(dict),
     adjointSolverName_(adjointSolverName),
@@ -113,10 +129,13 @@ objective::objective
     objectiveName_(dict.dictName()),
     computeMeanFields_(false), // is reset in derived classes
     nullified_(false),
+    normalize_(dict.getOrDefault<bool>("normalize", false)),
 
     J_(Zero),
-    JMean_(Zero),
+    JMean_(this->getOrDefault<scalar>("JMean", Zero)),
     weight_(Zero),
+    normFactor_(nullptr),
+    target_(dict.getOrDefault<scalar>("target", Zero)),
 
     integrationStartTimePtr_(nullptr),
     integrationEndTimePtr_(nullptr),
@@ -159,19 +178,18 @@ objective::objective
         );
     }
 
-    // Read JMean from dictionary, if present
-    IOobject headObjectiveIODict
-    (
-        "objectiveDict" + objectiveName_,
-        mesh_.time().timeName(),
-        "uniform",
-        mesh_,
-        IOobject::READ_IF_PRESENT,
-        IOobject::NO_WRITE
-    );
-    if (headObjectiveIODict.typeHeaderOk<IOdictionary>(false))
+    // Set normalization factor, if present
+    if (normalize_)
     {
-        JMean_ = IOdictionary(headObjectiveIODict).get<scalar>("JMean");
+        scalar normFactor(Zero);
+        if (dict.readIfPresent("normFactor", normFactor))
+        {
+            normFactor_.reset(new scalar(normFactor));
+        }
+        else if (this->readIfPresent("normFactor", normFactor))
+        {
+            normFactor_.reset(new scalar(normFactor));
+        }
     }
 }
 
@@ -233,13 +251,26 @@ scalar objective::JCycle() const
     {
         J = JMean_;
     }
+
+    // Subtract target, in case the objective is used as a constraint
+    J -= target_;
+
+    // Normalize here, in order to get the correct value for line search
+    if (normalize_ && normFactor_.valid())
+    {
+        J /= normFactor_();
+    }
+
     return J;
 }
 
 
 void objective::updateNormalizationFactor()
 {
-    // Does nothing in base
+    if (normalize_ && normFactor_.empty())
+    {
+        normFactor_.reset(new scalar(JCycle()));
+    }
 }
 
 
@@ -288,6 +319,62 @@ scalar objective::weight() const
 }
 
 
+bool objective::normalize() const
+{
+    return normalize_;
+}
+
+
+void objective::doNormalization()
+{
+    if (normalize_ && normFactor_.valid())
+    {
+        const scalar oneOverNorm(1./normFactor_());
+
+        if (hasdJdb())
+        {
+            dJdbPtr_().primitiveFieldRef() *= oneOverNorm;
+        }
+        if (hasBoundarydJdb())
+        {
+            bdJdbPtr_() *= oneOverNorm;
+        }
+        if (hasdSdbMult())
+        {
+            bdSdbMultPtr_() *= oneOverNorm;
+        }
+        if (hasdndbMult())
+        {
+            bdndbMultPtr_() *= oneOverNorm;
+        }
+        if (hasdxdbMult())
+        {
+            bdxdbMultPtr_() *= oneOverNorm;
+        }
+        if (hasdxdbDirectMult())
+        {
+            bdxdbDirectMultPtr_() *= oneOverNorm;
+        }
+        if (hasBoundaryEdgeContribution())
+        {
+            bEdgeContribution_() *= oneOverNorm;
+        }
+        if (hasDivDxDbMult())
+        {
+            divDxDbMultPtr_() *= oneOverNorm;
+        }
+        if (hasGradDxDbMult())
+        {
+            gradDxDbMultPtr_() *= oneOverNorm;
+        }
+        if (hasBoundarydJdStress())
+        {
+            bdJdStressPtr_() *= oneOverNorm;
+        }
+    }
+}
+
+
 bool objective::isWithinIntegrationTime() const
 {
     if (hasIntegrationStartTime() && hasIntegrationEndTime())
@@ -590,7 +677,7 @@ void objective::nullify()
 }
 
 
-void objective::write() const
+bool objective::write(const bool valid) const
 {
     if (Pstream::master())
     {
@@ -604,6 +691,8 @@ void objective::write() const
 
         objFunctionFilePtr_() << mesh_.time().value() << tab << J_ << endl;
     }
+
+    return true;
 }
 
 
@@ -624,6 +713,18 @@ void objective::writeInstantaneousValue() const
 }
 
 
+void objective::writeInstantaneousSeparator() const
+{
+    if (Pstream::master())
+    {
+        if (instantValueFilePtr_.valid())
+        {
+            instantValueFilePtr_() << endl;
+        }
+    }
+}
+
+
 void objective::writeMeanValue() const
 {
     if (Pstream::master())
@@ -648,22 +749,17 @@ void objective::writeMeanValue() const
                 << mesh_.time().value() << tab << JMean_ << endl;
         }
     }
-    // Write mean value under time/uniform, to allow for lineSearch to work
-    // appropriately in continuation runs, when field averaging is used
-    IOdictionary objectiveDict
-    (
-        IOobject
-        (
-            "objectiveDict" + objectiveName_,
-            mesh_.time().timeName(),
-            "uniform",
-            mesh_,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        )
-    );
-    objectiveDict.add<scalar>("JMean", JMean_);
-    objectiveDict.regIOobject::write();
+}
+
+
+bool objective::writeData(Ostream& os) const
+{
+    os.writeEntry("JMean", JMean_);
+    if (normFactor_.valid())
+    {
+        os.writeEntry("normFactor", normFactor_());
+    }
+    return os.good();
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/objectives/objective/objective.H b/src/optimisation/adjointOptimisation/adjoint/objectives/objective/objective.H
index 2293da74de47a7b5832868ef9bb337006e4c7528..4ded76e0d0e839a3124539a0b9f1ce0745cd70f6 100644
--- a/src/optimisation/adjointOptimisation/adjoint/objectives/objective/objective.H
+++ b/src/optimisation/adjointOptimisation/adjoint/objectives/objective/objective.H
@@ -5,9 +5,9 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -40,6 +40,7 @@ SourceFiles
 #ifndef objective_H
 #define objective_H
 
+#include "localIOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
 #include "OFstream.H"
@@ -57,6 +58,8 @@ namespace Foam
 \*---------------------------------------------------------------------------*/
 
 class objective
+:
+    public localIOdictionary
 {
 protected:
 
@@ -69,18 +72,32 @@ protected:
         const word objectiveName_;
         bool computeMeanFields_;
         bool nullified_;
+        bool normalize_;
 
-        // Objective function value and weight
+        //- Objective function value and weight
         scalar J_;
-        scalar JMean_;  //average value
+
+        //- Average objective value
+        scalar JMean_;
+
+        //- Objective weight
         scalar weight_;
 
-        // Objective integration start and end times (for unsteady flows)
+        //- Normalization factor
+        autoPtr<scalar> normFactor_;
+
+        //- Target value, in case the objective is used as a constraint
+        //  Should be used in caution and with updateMethods than get affected
+        //  by the target value, without requiring a sqr (e.g. SQP, MMA)
+        scalar target_;
+
+        //- Objective integration start and end times (for unsteady flows)
         autoPtr<scalar> integrationStartTimePtr_;
         autoPtr<scalar> integrationEndTimePtr_;
 
-        // Contribution to field sensitivity derivatives
-        // Topology optimisation
+        //- Contribution to field sensitivity derivatives
+        //  Topology optimisation or other variants with
+        //  as many design variables as the mesh cells
         //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
         autoPtr<volScalarField> dJdbPtr_;
@@ -241,6 +258,12 @@ public:
         //- Return the objective function weight
         scalar weight() const;
 
+        //- Is the objective normalized
+        bool normalize() const;
+
+        //- Normalize all fields allocated by the objective
+        virtual void doNormalization();
+
         //- Check whether this is an objective integration time
         bool isWithinIntegrationTime() const;
 
@@ -350,14 +373,20 @@ public:
         {}
 
         //- Write objective function history
-        virtual void write() const;
+        virtual bool write(const bool valid = true) const;
 
         //- Write objective function history at each primal solver iteration
         virtual void writeInstantaneousValue() const;
 
+        //- Write objective function history at each primal solver iteration
+        virtual void writeInstantaneousSeparator() const;
+
         //- Write mean objective function history
         virtual void writeMeanValue() const;
 
+        //- Write averaged objective for continuation
+        virtual bool writeData(Ostream& os) const;
+
         // Inline functions for checking whether pointers are set or not
         inline const word& objectiveName() const;
         inline bool hasdJdb() const;
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/FIBase/FIBaseIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/FIBase/FIBaseIncompressible.C
index ca4fc90810ac7253f50918b550b4bd214f2d5841..4cc2993e2aff48e28c3d24f3e3168949b35ff5f3 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/FIBase/FIBaseIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/FIBase/FIBaseIncompressible.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -84,7 +84,7 @@ FIBase::FIBase
     fv::optionAdjointList& fvOptionsAdjoint
 )
 :
-    adjointSensitivity
+    shapeSensitivities
     (
         mesh,
         dict,
@@ -93,7 +93,6 @@ FIBase::FIBase
         objectiveManager,
         fvOptionsAdjoint
     ),
-    shapeSensitivitiesBase(mesh, dict),
     gradDxDbMult_
     (
         IOobject
@@ -109,9 +108,6 @@ FIBase::FIBase
     ),
     divDxDbMult_(mesh_.nCells(), Zero),
     optionsDxDbMult_(mesh_.nCells(), Zero),
-    dSfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
-    dnfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
-    dxdbDirectMult_(createZeroBoundaryPtr<vector>(mesh_)),
 
     includeDistance_(false),
     eikonalSolver_(nullptr)
@@ -165,18 +161,11 @@ void FIBase::accumulateIntegrand(const scalar dt)
     }
 
     // Accumulate direct sensitivities
-    for (const label patchI : sensitivityPatchIDs_)
-    {
-        const scalarField magSfDt(mesh_.boundary()[patchI].magSf()*dt);
-        for (objective& func : functions)
-        {
-            const scalar wei = func.weight();
-            dSfdbMult_()[patchI] += wei*func.dSdbMultiplier(patchI)*dt;
-            dnfdbMult_()[patchI] += wei*func.dndbMultiplier(patchI)*magSfDt;
-            dxdbDirectMult_()[patchI] +=
-                wei*func.dxdbDirectMultiplier(patchI)*magSfDt;
-        }
-    }
+    accumulateDirectSensitivityIntegrand(dt);
+
+    // Accumulate sensitivities due to boundary conditions
+    accumulateBCSensitivityIntegrand(dt);
+
 }
 
 
@@ -185,24 +174,13 @@ void FIBase::clearSensitivities()
     gradDxDbMult_ = dimensionedTensor(gradDxDbMult_.dimensions(), Zero);
     divDxDbMult_ = Zero;
     optionsDxDbMult_ = vector::zero;
-    dSfdbMult_() = vector::zero;
-    dnfdbMult_() = vector::zero;
-    dxdbDirectMult_() = vector::zero;
 
     if (includeDistance_)
     {
         eikonalSolver_->reset();
     }
 
-    adjointSensitivity::clearSensitivities();
-    shapeSensitivitiesBase::clear();
-}
-
-
-void FIBase::write(const word& baseName)
-{
-    adjointSensitivity::write(baseName);
-    shapeSensitivitiesBase::write();
+    shapeSensitivities::clearSensitivities();
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/FIBase/FIBaseIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/FIBase/FIBaseIncompressible.H
index e7f1120caeafff3e4f486c873633dd0284cead09..576493b72a43c3b63c13a291a7a618606572a8b3 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/FIBase/FIBaseIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/FIBase/FIBaseIncompressible.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -40,7 +40,7 @@ SourceFiles
 #define FIBaseIncompressible_H
 
 #include "adjointSensitivityIncompressible.H"
-#include "shapeSensitivitiesBase.H"
+#include "shapeSensitivitiesIncompressible.H"
 #include "adjointEikonalSolverIncompressible.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -52,13 +52,12 @@ namespace incompressible
 {
 
 /*---------------------------------------------------------------------------*\
-                  Class FIBase Declaration
+                            Class FIBase Declaration
 \*---------------------------------------------------------------------------*/
 
 class FIBase
 :
-    public adjointSensitivity,
-    public shapeSensitivitiesBase
+    public shapeSensitivities
 {
 protected:
 
@@ -73,11 +72,6 @@ protected:
         //- dx/db multiplier coming from fvOptions
         vectorField optionsDxDbMult_;
 
-        //- Fields related to direct sensitivities
-        autoPtr<boundaryVectorField> dSfdbMult_;
-        autoPtr<boundaryVectorField> dnfdbMult_;
-        autoPtr<boundaryVectorField> dxdbDirectMult_;
-
         //- Include distance variation in sens computation
         bool includeDistance_;
 
@@ -139,9 +133,6 @@ public:
 
         //- Zero sensitivity fields and their constituents
         virtual void clearSensitivities();
-
-        //- Write sensitivity fields
-        virtual void write(const word& baseName = word::null);
 };
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.C
index ed34fc5ccd78c0f47e8e2679c3233853d74fd36c..bb9600eb583096535a877b367abb094c5f39be5a 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -50,6 +50,8 @@ void SIBase::read()
     surfaceSensitivity_.read();
     includeObjective_ =
         dict().getOrDefault<bool>("includeObjectiveContribution", true);
+    writeSensitivityMap_ =
+        dict().getOrDefault<bool>("writeSensitivityMap", false);
 
     // If includeObjective is set to true both here and in the surface
     // sensitivities, set the one in the latter to false to avoid double
@@ -83,7 +85,7 @@ SIBase::SIBase
     fv::optionAdjointList& fvOptionsAdjoint
 )
 :
-    adjointSensitivity
+    shapeSensitivities
     (
         mesh,
         dict,
@@ -92,12 +94,11 @@ SIBase::SIBase
         objectiveManager,
         fvOptionsAdjoint
     ),
-    shapeSensitivitiesBase(mesh, dict),
     surfaceSensitivity_
     (
         mesh,
         // Ideally, subOrEmptyDict would be used.
-        // Since we need a recursive search in shapeSensitivitiesBase though
+        // Since we need a recursive search in shapeSensitivities though
         // and the dict returned by subOrEmptyDict (if found)
         // does not know its parent, optionalSubDict is used
         dict.optionalSubDict("surfaceSensitivities"),
@@ -106,10 +107,8 @@ SIBase::SIBase
         objectiveManager,
         fvOptionsAdjoint
     ),
-    dSfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
-    dnfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
-    dxdbDirectMult_(createZeroBoundaryPtr<vector>(mesh_)),
-    includeObjective_(true)
+    includeObjective_(true),
+    writeSensitivityMap_(true)
 {
     read();
 }
@@ -141,42 +140,34 @@ void SIBase::accumulateIntegrand(const scalar dt)
     // Accumulate direct sensitivities
     if (includeObjective_)
     {
-        PtrList<objective>& functions
-        (
-            objectiveManager_.getObjectiveFunctions()
-        );
-        for (const label patchI : sensitivityPatchIDs_)
-        {
-            const scalarField magSfDt(mesh_.boundary()[patchI].magSf()*dt);
-            for (objective& func : functions)
-            {
-                const scalar wei = func.weight();
-                dSfdbMult_()[patchI] += wei*func.dSdbMultiplier(patchI)*dt;
-                dnfdbMult_()[patchI] += wei*func.dndbMultiplier(patchI)*magSfDt;
-                dxdbDirectMult_()[patchI] +=
-                    wei*func.dxdbDirectMultiplier(patchI)*magSfDt;
-            }
-        }
+        accumulateDirectSensitivityIntegrand(dt);
     }
+
+    // Accumulate sensitivities due to boundary conditions
+    accumulateBCSensitivityIntegrand(dt);
 }
 
 
 void SIBase::clearSensitivities()
 {
     surfaceSensitivity_.clearSensitivities();
-    dSfdbMult_() = vector::zero;
-    dnfdbMult_() = vector::zero;
-    dxdbDirectMult_() = vector::zero;
+    shapeSensitivities::clearSensitivities();
+}
 
-    adjointSensitivity::clearSensitivities();
-    shapeSensitivitiesBase::clear();
+
+const sensitivitySurface& SIBase::getSurfaceSensitivities() const
+{
+    return surfaceSensitivity_;
 }
 
 
 void SIBase::write(const word& baseName)
 {
-    adjointSensitivity::write(baseName);
-    shapeSensitivitiesBase::write();
+    shapeSensitivities::write(baseName);
+    if (writeSensitivityMap_)
+    {
+        surfaceSensitivity_.write(baseName);
+    }
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.H
index 25de490626adfe3ed02bdb0f65c8c42d94c37a1b..cc3342d05bf2165da77c0457df31b7e991469feb 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -40,8 +40,7 @@ SourceFiles
 #ifndef SIBaseIncompressible_H
 #define SIBaseIncompressible_H
 
-#include "adjointSensitivityIncompressible.H"
-#include "shapeSensitivitiesBase.H"
+#include "shapeSensitivitiesIncompressible.H"
 #include "sensitivitySurfaceIncompressible.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -53,13 +52,12 @@ namespace incompressible
 {
 
 /*---------------------------------------------------------------------------*\
-                  Class SIBase Declaration
+                            Class SIBase Declaration
 \*---------------------------------------------------------------------------*/
 
 class SIBase
 :
-    public adjointSensitivity,
-    public shapeSensitivitiesBase
+    public shapeSensitivities
 {
 protected:
 
@@ -68,13 +66,15 @@ protected:
         //- Surface sensitivities
         sensitivitySurface surfaceSensitivity_;
 
-        //- Fields related to direct sensitivities
-        autoPtr<boundaryVectorField> dSfdbMult_;
-        autoPtr<boundaryVectorField> dnfdbMult_;
-        autoPtr<boundaryVectorField> dxdbDirectMult_;
-
+        //- Whether to include direct sensitivities or not.
+        //  Used to avoid double contributions from both here and the
+        //  sensitivitySurface object which might have already accounted for
+        //  them
         bool includeObjective_;
 
+        //- Write sensitivity map upon write
+        bool writeSensitivityMap_;
+
 
     // Protected Member Functions
 
@@ -131,7 +131,10 @@ public:
         //- Zero sensitivity fields and their constituents
         virtual void clearSensitivities();
 
-        //- Write sensitivity fields.
+        //- Return reference to underlaying surface sensitivities
+        const sensitivitySurface& getSurfaceSensitivities() const;
+
+        //- Write sensitivity map
         virtual void write(const word& baseName = word::null);
 };
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/adjointSensitivity/adjointSensitivityIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/adjointSensitivity/adjointSensitivityIncompressible.C
index b904c4032e358aba463c4681375db568662c404a..5ed9ec2fa1e5da98c3ffaa01f9d48b46faa2515d 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/adjointSensitivity/adjointSensitivityIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/adjointSensitivity/adjointSensitivityIncompressible.C
@@ -121,6 +121,12 @@ const scalarField& adjointSensitivity::calculateSensitivities()
 }
 
 
+const scalarField& adjointSensitivity::getSensitivities() const
+{
+    return derivatives_;
+}
+
+
 void adjointSensitivity::clearSensitivities()
 {
     derivatives_ = scalar(0);
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/adjointSensitivity/adjointSensitivityIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/adjointSensitivity/adjointSensitivityIncompressible.H
index 71b0f3b1bd027008ae6924f552df804f2304de4a..f0727a17eacac385b640b865b513fb38162fcbb4 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/adjointSensitivity/adjointSensitivityIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/adjointSensitivity/adjointSensitivityIncompressible.H
@@ -177,6 +177,10 @@ public:
        //  Used with optimisation libraries
        virtual const scalarField& calculateSensitivities();
 
+       //- Returns the sensitivity fields
+       //  Assumes it has already been updated/computed
+       const scalarField& getSensitivities() const;
+
        //- Zero sensitivity fields and their constituents
        virtual void clearSensitivities();
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.C
index 4e1b1cfd5057c46dbf36b07e12d1bdce02e8a936..af41e4fab2f986b77d67a25201f89f4826e1f7ac 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -77,6 +77,7 @@ sensitivityBezier::sensitivityBezier
     dSdbSens_(Bezier_.nBezier(), Zero),
     dndbSens_(Bezier_.nBezier(), Zero),
     dxdbDirectSens_(Bezier_.nBezier(), Zero),
+    bcSens_(Bezier_.nBezier(), Zero),
     derivativesFolder_("optimisation"/type() + "Derivatives")
 {
     derivatives_ = scalarField(3*Bezier_.nBezier(), Zero);
@@ -137,9 +138,12 @@ void sensitivityBezier::assembleSensitivities()
                 dxdbDirectSens_[iCP] +=
                     gSum((dxdbDirectMult_()[patchI] & dxidXj));
             }
+
+            // Sensitivities from boundary conditions
+            bcSens_[iCP] += gSum(bcDxDbMult_()[patchI] & dxidXj);
         }
     }
-    sens_ = flowSens_ + dSdbSens_ + dndbSens_ + dxdbDirectSens_;
+    sens_ = flowSens_ + dSdbSens_ + dndbSens_ + dxdbDirectSens_ + bcSens_;
 
     // Transform sensitivities to scalarField in order to cooperate with
     // updateMethod
@@ -159,6 +163,7 @@ void sensitivityBezier::assembleSensitivities()
             dSdbSens_[cpI].x() = Zero;
             dndbSens_[cpI].x() = Zero;
             dxdbDirectSens_[cpI].x() = Zero;
+            bcSens_[cpI].x() = Zero;
         }
         if (confineYmovement[cpI])
         {
@@ -167,6 +172,7 @@ void sensitivityBezier::assembleSensitivities()
             dSdbSens_[cpI].y() = Zero;
             dndbSens_[cpI].y() = Zero;
             dxdbDirectSens_[cpI].y() = Zero;
+            bcSens_[cpI].y() = Zero;
         }
         if (confineZmovement[cpI])
         {
@@ -175,6 +181,7 @@ void sensitivityBezier::assembleSensitivities()
             dSdbSens_[cpI].z() = Zero;
             dndbSens_[cpI].z() = Zero;
             dxdbDirectSens_[cpI].z() = Zero;
+            bcSens_[cpI].z() = Zero;
         }
     }
 }
@@ -187,6 +194,7 @@ void sensitivityBezier::clearSensitivities()
     dSdbSens_ = Zero;
     dndbSens_ = Zero;
     dxdbDirectSens_ = Zero;
+    bcSens_ = Zero;
 
     SIBase::clearSensitivities();
 }
@@ -195,6 +203,9 @@ void sensitivityBezier::clearSensitivities()
 void sensitivityBezier::write(const word& baseName)
 {
     Info<< "Writing control point sensitivities to file" << endl;
+    // Write sensitivity map
+    SIBase::write(baseName);
+    // Write control point sensitivities
     if (Pstream::master())
     {
         OFstream derivFile
@@ -210,7 +221,8 @@ void sensitivityBezier::write(const word& baseName)
             << setw(width) << "flow" << " "
             << setw(width) << "dSdb" << " "
             << setw(width) << "dndb" << " "
-            << setw(width) << "dxdbDirect" << endl;
+            << setw(width) << "dxdbDirect" << " "
+            << setw(width) << "dvdb" << endl;
         label nDV = derivatives_.size();
         label nBezier = Bezier_.nBezier();
         const boolListList& confineMovement = Bezier_.confineMovement();
@@ -229,7 +241,8 @@ void sensitivityBezier::write(const word& baseName)
                     << setw(width) << flowSens_[iCP].component(idir) << " "
                     << setw(width) << dSdbSens_[iCP].component(idir) << " "
                     << setw(width) << dndbSens_[iCP].component(idir) << " "
-                    << setw(width) << dxdbDirectSens_[iCP].component(idir)
+                    << setw(width) << dxdbDirectSens_[iCP].component(idir) << " "
+                    << setw(width) << bcSens_[iCP].component(idir)
                     << endl;
             }
         }
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.H
index cd450e0e115df15c6491ab29366398662e37c5eb..ad5a99222b8d3fa3c9abe3b8d4a0a22d447f1531 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -78,6 +78,7 @@ protected:
         vectorField dSdbSens_;
         vectorField dndbSens_;
         vectorField dxdbDirectSens_;
+        vectorField bcSens_;
 
         fileName derivativesFolder_;
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezierFI/sensitivityBezierFIIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezierFI/sensitivityBezierFIIncompressible.C
index 72b6f425869491d35713562be89ed5c428fa607b..ca17f29794670a2d1775fe0988aff9a5e1fd6731 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezierFI/sensitivityBezierFIIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezierFI/sensitivityBezierFIIncompressible.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -146,6 +146,7 @@ sensitivityBezierFI::sensitivityBezierFI
     dVdbSens_(3*Bezier_.nBezier(), Zero),
     distanceSens_(3*Bezier_.nBezier(), Zero),
     optionsSens_(3*Bezier_.nBezier(), Zero),
+    bcSens_(3*Bezier_.nBezier(), Zero),
 
     derivativesFolder_("optimisation"/type() + "Derivatives"),
 
@@ -249,6 +250,9 @@ void sensitivityBezierFI::assembleSensitivities()
                 const vectorField& dxdbFace = tdxdbFace();
                 dxdbDirectSens_[iDV] +=
                     gSum(dxdbDirectMult_()[patchI] & dxdbFace);
+
+                // Contribution from boundary conditions
+                bcSens_[iDV] += gSum(bcDxDbMult_()[patchI] & dxdbFace);
             }
 
             // Contribution from delta (V) / delta b
@@ -290,7 +294,8 @@ void sensitivityBezierFI::assembleSensitivities()
           + dxdbDirectSens_
           + dVdbSens_
           + distanceSens_
-          + optionsSens_;
+          + optionsSens_
+          + bcSens_;
     }
 }
 
@@ -304,6 +309,7 @@ void sensitivityBezierFI::clearSensitivities()
     dVdbSens_ = Zero;
     distanceSens_ = Zero;
     optionsSens_ = Zero;
+    bcSens_ = Zero;
 
     FIBase::clearSensitivities();
 }
@@ -329,7 +335,9 @@ void sensitivityBezierFI::write(const word& baseName)
             << setw(width)   << "dndb"       << " "
             << setw(width)   << "dxdbDirect" << " "
             << setw(width)   << "dVdb"       << " "
-            << setw(width)   << "distance"   << endl;
+            << setw(width)   << "distance"   << " "
+            << setw(width)   << "options"    << " "
+            << setw(width)   << "dvdb"       << endl;
         const label nDVs = derivatives_.size();
         const label nBezier = Bezier_.nBezier();
         const boolListList& confineMovement = Bezier_.confineMovement();
@@ -337,11 +345,14 @@ void sensitivityBezierFI::write(const word& baseName)
 
         for (label iDV = 0; iDV < nDVs; iDV++)
         {
-            label iCP = iDV%nBezier;
-            label idir = iDV/nBezier;
+            const label iCP(iDV%nBezier);
+            const label idir(iDV/nBezier);
             if (!confineMovement[idir][iCP])
             {
-                if (iDV!=lastActive + 1) derivFile << "\n";
+                if (iDV!=lastActive + 1)
+                {
+                    derivFile << "\n";
+                }
                 lastActive = iDV;
                 derivFile
                    << setw(widthDV) << iDV << " "
@@ -351,7 +362,9 @@ void sensitivityBezierFI::write(const word& baseName)
                    << setw(width) << dndbSens_[iDV] << " "
                    << setw(width) << dxdbDirectSens_[iDV] << " "
                    << setw(width) << dVdbSens_[iDV] << " "
-                   << setw(width) << distanceSens_[iDV] << endl;
+                   << setw(width) << distanceSens_[iDV] << " "
+                   << setw(width) << optionsSens_[iDV] << " "
+                   << setw(width) << bcSens_[iDV] << endl;
             }
         }
     }
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezierFI/sensitivityBezierFIIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezierFI/sensitivityBezierFIIncompressible.H
index 382316b432bd29c7cedb03cc348b5f083598cabb..2ea45cb5fe3ad28fcfed46e19a4b2f8ef930634d 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezierFI/sensitivityBezierFIIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezierFI/sensitivityBezierFIIncompressible.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -93,6 +93,9 @@ protected:
         //- Term depending on fvOptions
         scalarField optionsSens_;
 
+        //- Term depending on the differenation of boundary conditions
+        scalarField bcSens_;
+
         fileName derivativesFolder_;
 
         label meshMovementIters_;
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.C
index 3869c7dcf4605a0a4356153ff8b6261ce9d318f3..50786bf00faa65796e7246aa1d979f8cdffb8e9b 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -195,14 +195,21 @@ void sensitivitySurface::addGeometricSens()
 
 void sensitivitySurface::setSuffixName()
 {
+    word suffix(dict().getOrDefault<word>("suffix", word::null));
     // Determine suffix for fields holding the sens
     if (includeMeshMovement_)
     {
-        shapeSensitivitiesBase::setSuffix(adjointVars_.solverName() + "ESI");
+        shapeSensitivitiesBase::setSuffix
+        (
+            adjointVars_.solverName() + "ESI" + suffix
+        );
     }
     else
     {
-        shapeSensitivitiesBase::setSuffix(adjointVars_.solverName() + "SI");
+        shapeSensitivitiesBase::setSuffix
+        (
+            adjointVars_.solverName() + "SI" + suffix
+        );
     }
 }
 
@@ -707,7 +714,7 @@ void sensitivitySurface::clearSensitivities()
     }
     // Reset sensitivity fields
     adjointSensitivity::clearSensitivities();
-    shapeSensitivitiesBase::clear();
+    shapeSensitivitiesBase::clearSensitivities();
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.C
index f856d24072755853f1a16f1de546e4be2aacde6e..264839e515301f8491ee771d612a184204762838 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -306,14 +306,21 @@ void sensitivitySurfacePoints::constructGlobalPointNormalsAndAreas
 
 void sensitivitySurfacePoints::setSuffixName()
 {
+    word suffix(dict().getOrDefault<word>("suffix", word::null));
     // Determine suffix for fields holding the sens
     if (includeMeshMovement_)
     {
-        shapeSensitivitiesBase::setSuffix(adjointVars_.solverName() + "ESI");
+        shapeSensitivitiesBase::setSuffix
+        (
+            adjointVars_.solverName() + "ESI" + suffix
+        );
     }
     else
     {
-        shapeSensitivitiesBase::setSuffix(adjointVars_.solverName() + "SI");
+        shapeSensitivitiesBase::setSuffix
+        (
+            adjointVars_.solverName() + "SI" + suffix
+        );
     }
 }
 
@@ -743,7 +750,7 @@ void sensitivitySurfacePoints::clearSensitivities()
 
     // Reset sensitivity fields
     adjointSensitivity::clearSensitivities();
-    shapeSensitivitiesBase::clear();
+    shapeSensitivitiesBase::clearSensitivities();
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C
index 7e9e54a6352edccffad789022fe886a431fbed2f..29946a2c035d0c6289c193c4e9137f28c1aa772b 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C
@@ -113,6 +113,30 @@ void sensitivityVolBSplines::computeObjectiveContributions()
 }
 
 
+void sensitivityVolBSplines::computeBCContributions()
+{
+    label passedCPs = 0;
+    PtrList<NURBS3DVolume>& boxes = volBSplinesBase_.boxesRef();
+    forAll(boxes, iNURB)
+    {
+        vectorField sensBcsDxDb =
+            boxes[iNURB].computeControlPointSensitivities
+            (
+                bcDxDbMult_(),
+                sensitivityPatchIDs_.toc()
+            );
+
+        // Transfer to global list
+        forAll(sensBcsDxDb, cpI)
+        {
+            bcSens_[passedCPs + cpI] = sensBcsDxDb[cpI];
+        }
+        passedCPs += sensBcsDxDb.size();
+    }
+    volBSplinesBase_.boundControlPointMovement(bcSens_);
+}
+
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 sensitivityVolBSplines::sensitivityVolBSplines
@@ -143,16 +167,18 @@ sensitivityVolBSplines::sensitivityVolBSplines
     dSdbSens_(0),
     dndbSens_(0),
     dxdbDirectSens_(0),
+    bcSens_(0),
 
     derivativesFolder_("optimisation"/type() + "Derivatives")
 {
     // No boundary field pointers need to be allocated
-    label nCPs = volBSplinesBase_.getTotalControlPointsNumber();
+    const label nCPs(volBSplinesBase_.getTotalControlPointsNumber());
     derivatives_ = scalarField(3*nCPs, Zero);
     flowSens_ = vectorField(nCPs, Zero);
     dSdbSens_ = vectorField(nCPs, Zero);
     dndbSens_ = vectorField(nCPs, Zero);
     dxdbDirectSens_ = vectorField(nCPs, Zero);
+    bcSens_ = vectorField(nCPs, Zero);
 
     // Create folder to store sensitivities
     mkDir(derivativesFolder_);
@@ -199,6 +225,8 @@ void sensitivityVolBSplines::assembleSensitivities()
     // false for sensitivityVolBSplines
     computeObjectiveContributions();
 
+    computeBCContributions();
+
     // Transform sensitivites to scalarField in order to cooperate with
     // updateMethod
     forAll(flowSens_, cpI)
@@ -207,17 +235,20 @@ void sensitivityVolBSplines::assembleSensitivities()
             flowSens_[cpI].x()
           + dSdbSens_[cpI].x()
           + dndbSens_[cpI].x()
-          + dxdbDirectSens_[cpI].x();
+          + dxdbDirectSens_[cpI].x()
+          + bcSens_[cpI].x();
         derivatives_[3*cpI + 1] =
             flowSens_[cpI].y()
           + dSdbSens_[cpI].y()
           + dndbSens_[cpI].y()
-          + dxdbDirectSens_[cpI].y();
+          + dxdbDirectSens_[cpI].y()
+          + bcSens_[cpI].y();
         derivatives_[3*cpI + 2] =
             flowSens_[cpI].z()
           + dSdbSens_[cpI].z()
           + dndbSens_[cpI].z()
-          + dxdbDirectSens_[cpI].z();
+          + dxdbDirectSens_[cpI].z()
+          + bcSens_[cpI].z();
     }
 }
 
@@ -228,6 +259,7 @@ void sensitivityVolBSplines::clearSensitivities()
     dSdbSens_ = vector::zero;
     dndbSens_ = vector::zero;
     dxdbDirectSens_ = vector::zero;
+    bcSens_ = vector::zero;
 
     SIBase::clearSensitivities();
 }
@@ -236,6 +268,9 @@ void sensitivityVolBSplines::clearSensitivities()
 void sensitivityVolBSplines::write(const word& baseName)
 {
     Info<< "Writing control point sensitivities to file" << endl;
+    // Write sensitivity map
+    SIBase::write(baseName);
+    // Write control point sensitivities
     if (Pstream::master())
     {
         OFstream derivFile
@@ -262,7 +297,10 @@ void sensitivityVolBSplines::write(const word& baseName)
             << setw(width) << "dndb::z" << " "
             << setw(width) << "dxdbDirect::x" << " "
             << setw(width) << "dxdbDirect::y" << " "
-            << setw(width) << "dxdbDirect::z" << endl;
+            << setw(width) << "dxdbDirect::z" << " "
+            << setw(width) << "dvdb::x" << " "
+            << setw(width) << "dvdb::y" << " "
+            << setw(width) << "dvdb::z" << endl;
 
         label passedCPs(0);
         label lastActive(-1);
@@ -298,7 +336,10 @@ void sensitivityVolBSplines::write(const word& baseName)
                        << setw(width) << dndbSens_[globalCP].z() << " "
                        << setw(width) << dxdbDirectSens_[globalCP].x() << " "
                        << setw(width) << dxdbDirectSens_[globalCP].y() << " "
-                       << setw(width) << dxdbDirectSens_[globalCP].z()
+                       << setw(width) << dxdbDirectSens_[globalCP].z() << " "
+                       << setw(width) << bcSens_[globalCP].x() << " "
+                       << setw(width) << bcSens_[globalCP].y() << " "
+                       << setw(width) << bcSens_[globalCP].z()
                        << endl;
                 }
             }
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.H
index c42dd72eb0a9ef6ed3e2e45fda5ac9dfedfe4824..5d28be24b595fa5d365287092d25968391c2b725 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -79,12 +79,16 @@ protected:
         //- on x
         vectorField dxdbDirectSens_;
 
+        //- Term dependng on the differentiation of boundary conditions
+        vectorField bcSens_;
+
         fileName derivativesFolder_;
 
 
     // Protected Member Functions
 
         void computeObjectiveContributions();
+        void computeBCContributions();
 
 
 private:
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.C
index 7191f5a90cfd571d48feefc39b01d3168a5ba5f6..3fc71d20601719bf5b8565d60051099e69844ce7 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.C
@@ -83,6 +83,7 @@ sensitivityVolBSplinesFI::sensitivityVolBSplinesFI
     dVdbSens_(0),
     distanceSens_(0),
     optionsSens_(0),
+    bcSens_(0),
 
     derivativesFolder_("optimisation"/type() + "Derivatives")
 {
@@ -97,6 +98,7 @@ sensitivityVolBSplinesFI::sensitivityVolBSplinesFI
     dVdbSens_ = vectorField(nCPs, Zero);
     distanceSens_ = vectorField(nCPs, Zero);
     optionsSens_ = vectorField(nCPs, Zero);
+    bcSens_ = vectorField(nCPs, Zero);
 
     // Create folder to store sensitivities
     mkDir(derivativesFolder_);
@@ -146,6 +148,12 @@ void sensitivityVolBSplinesFI::assembleSensitivities()
             sensitivityPatchIDs_.toc()
         );
 
+        vectorField bcSens = boxes[iNURB].computeControlPointSensitivities
+        (
+            bcDxDbMult_(),
+            sensitivityPatchIDs_.toc()
+        );
+
         for (label cpI = 0; cpI < nb; cpI++)
         {
             label globalCP = passedCPs + cpI;
@@ -267,6 +275,9 @@ void sensitivityVolBSplinesFI::assembleSensitivities()
             // dxdbSens storage
             dxdbDirectSens_[globalCP] = dxdbSens[cpI];
 
+            // bcSens storage
+            bcSens_[globalCP] = bcSens[cpI];
+
             boxSensitivities[cpI] =
                 flowSens_[globalCP]
               + dSdbSens_[globalCP]
@@ -274,7 +285,8 @@ void sensitivityVolBSplinesFI::assembleSensitivities()
               + dVdbSens_[globalCP]
               + distanceSens_[globalCP]
               + dxdbDirectSens_[globalCP]
-              + optionsSens_[globalCP];
+              + optionsSens_[globalCP]
+              + bcSens_[globalCP];
         }
 
         // Zero sensitivities in non-active design variables
@@ -302,6 +314,7 @@ void sensitivityVolBSplinesFI::assembleSensitivities()
     volBSplinesBase_.boundControlPointMovement(distanceSens_);
     volBSplinesBase_.boundControlPointMovement(dxdbDirectSens_);
     volBSplinesBase_.boundControlPointMovement(optionsSens_);
+    volBSplinesBase_.boundControlPointMovement(bcSens_);
 }
 
 
@@ -314,6 +327,7 @@ void sensitivityVolBSplinesFI::clearSensitivities()
     dVdbSens_ = vector::zero;
     distanceSens_ = vector::zero;
     optionsSens_ = vector::zero;
+    bcSens_ = vector::zero;
 
     FIBase::clearSensitivities();
 }
@@ -359,7 +373,10 @@ void sensitivityVolBSplinesFI::write(const word& baseName)
             << setw(width) << "distance::z" << " "
             << setw(width) << "options::x" << " "
             << setw(width) << "options::y" << " "
-            << setw(width) << "options::z" << endl;
+            << setw(width) << "options::z" << " "
+            << setw(width) << "dvdb::x" << " "
+            << setw(width) << "dvdb::y" << " "
+            << setw(width) << "dvdb::z" << endl;
 
         label passedCPs(0);
         label lastActive(-1);
@@ -401,7 +418,10 @@ void sensitivityVolBSplinesFI::write(const word& baseName)
                         << setw(width) << distanceSens_[globalCP].z() << " "
                         << setw(width) << optionsSens_[globalCP].x() << " "
                         << setw(width) << optionsSens_[globalCP].y() << " "
-                        << setw(width) << optionsSens_[globalCP].z() << endl;
+                        << setw(width) << optionsSens_[globalCP].z() << " "
+                        << setw(width) << bcSens_[globalCP].x() << " "
+                        << setw(width) << bcSens_[globalCP].y() << " "
+                        << setw(width) << bcSens_[globalCP].z() << endl;
                 }
             }
             passedCPs += nb;
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.H
index 24267624bafd9d2024fcbe85098ea942ba425a49..b718cdfe9348dfb0dc5ab05ab213bac8cf036cee 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -88,6 +88,9 @@ protected:
         //- Term depending on fvOptions
         vectorField optionsSens_;
 
+        //- Term depending on the differentiation of boundary conditions
+        vectorField bcSens_;
+
         fileName derivativesFolder_;
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/shapeSensitivities/shapeSensitivitiesIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/shapeSensitivities/shapeSensitivitiesIncompressible.C
new file mode 100644
index 0000000000000000000000000000000000000000..1754b986c641afa55c9fd6ec555bb6cc5b2849f5
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/shapeSensitivities/shapeSensitivitiesIncompressible.C
@@ -0,0 +1,184 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 PCOpt/NTUA
+    Copyright (C) 2020 FOSS GP
+-------------------------------------------------------------------------------
+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 "shapeSensitivitiesIncompressible.H"
+#include "adjointBoundaryConditions.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+namespace incompressible
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(shapeSensitivities, 0);
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+void shapeSensitivities::accumulateDirectSensitivityIntegrand(const scalar dt)
+{
+    // Accumulate direct sensitivities
+    PtrList<objective>& functions(objectiveManager_.getObjectiveFunctions());
+    for (const label patchI : sensitivityPatchIDs_)
+    {
+        const scalarField magSfDt(mesh_.boundary()[patchI].magSf()*dt);
+        for (objective& func : functions)
+        {
+            const scalar wei(func.weight());
+            dSfdbMult_()[patchI] += wei*func.dSdbMultiplier(patchI)*dt;
+            dnfdbMult_()[patchI] += wei*func.dndbMultiplier(patchI)*magSfDt;
+            dxdbDirectMult_()[patchI] +=
+                wei*func.dxdbDirectMultiplier(patchI)*magSfDt;
+        }
+    }
+}
+
+
+void shapeSensitivities::accumulateBCSensitivityIntegrand(const scalar dt)
+{
+    auto& UaBoundary = adjointVars_.Ua().boundaryFieldRef();
+    tmp<boundaryVectorField> DvDbMult(dvdbMult());
+
+    // Accumulate sensitivities due to boundary conditions
+    for (const label patchI : sensitivityPatchIDs_)
+    {
+        const scalarField magSfDt(mesh_.boundary()[patchI].magSf()*dt);
+        fvPatchVectorField& Uab = UaBoundary[patchI];
+        if (isA<adjointVectorBoundaryCondition>(Uab))
+        {
+            bcDxDbMult_()[patchI] +=
+            (
+                DvDbMult()[patchI]
+              & refCast<adjointVectorBoundaryCondition>(Uab).dxdbMult()
+            )*magSfDt;
+        }
+    }
+}
+
+
+tmp<boundaryVectorField> shapeSensitivities::dvdbMult() const
+{
+    tmp<boundaryVectorField>
+        tres(createZeroBoundaryPtr<vector>(meshShape_).ptr());
+    boundaryVectorField& res = tres.ref();
+
+    // Grab references
+    const volScalarField& pa = adjointVars_.pa();
+    const volVectorField& Ua = adjointVars_.Ua();
+    const autoPtr<incompressibleAdjoint::adjointRASModel>& adjointTurbulence =
+        adjointVars_.adjointTurbulence();
+
+    // Fields needed to calculate adjoint sensitivities
+    const autoPtr<incompressible::RASModelVariables>&
+       turbVars = primalVars_.RASModelVariables();
+    const singlePhaseTransportModel& lamTransp = primalVars_.laminarTransport();
+    volScalarField nuEff(lamTransp.nu() + turbVars->nutRef());
+    volTensorField gradUa(fvc::grad(Ua));
+
+    for (const label patchI : sensitivityPatchIDs_)
+    {
+        const fvPatch& patch = meshShape_.boundary()[patchI];
+        tmp<vectorField> tnf = patch.nf();
+        const vectorField& nf = tnf();
+
+        res[patchI] =
+            (
+                nuEff.boundaryField()[patchI]
+              * (
+                    Ua.boundaryField()[patchI].snGrad()
+                  + (gradUa.boundaryField()[patchI] & nf)
+                )
+            )
+          - (nf*pa.boundaryField()[patchI])
+          + adjointTurbulence().adjointMomentumBCSource()[patchI];
+    }
+
+    return tres;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+shapeSensitivities::shapeSensitivities
+(
+    const fvMesh& mesh,
+    const dictionary& dict,
+    incompressibleVars& primalVars,
+    incompressibleAdjointVars& adjointVars,
+    objectiveManager& objectiveManager,
+    fv::optionAdjointList& fvOptionsAdjoint
+)
+:
+    adjointSensitivity
+    (
+        mesh,
+        dict,
+        primalVars,
+        adjointVars,
+        objectiveManager,
+        fvOptionsAdjoint
+    ),
+    shapeSensitivitiesBase(mesh, dict),
+    dSfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
+    dnfdbMult_(createZeroBoundaryPtr<vector>(mesh_)),
+    dxdbDirectMult_(createZeroBoundaryPtr<vector>(mesh_)),
+    bcDxDbMult_(createZeroBoundaryPtr<vector>(mesh_))
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void shapeSensitivities::clearSensitivities()
+{
+    dSfdbMult_() = vector::zero;
+    dnfdbMult_() = vector::zero;
+    dxdbDirectMult_() = vector::zero;
+    bcDxDbMult_() = vector::zero;
+
+    adjointSensitivity::clearSensitivities();
+    shapeSensitivitiesBase::clearSensitivities();
+}
+
+
+void shapeSensitivities::write(const word& baseName)
+{
+    adjointSensitivity::write(baseName);
+    shapeSensitivitiesBase::write();
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace incompressible
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/shapeSensitivities/shapeSensitivitiesIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/shapeSensitivities/shapeSensitivitiesIncompressible.H
new file mode 100644
index 0000000000000000000000000000000000000000..6b5ac239a07ac5124b6869ab222aed30be9ae451
--- /dev/null
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/shapeSensitivities/shapeSensitivitiesIncompressible.H
@@ -0,0 +1,144 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 PCOpt/NTUA
+    Copyright (C) 2020 FOSS GP
+-------------------------------------------------------------------------------
+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::incompressible::shapeSensitivitiesBase
+
+Description
+    Base class supporting shape sensitivity derivatives for
+    incompressible flows
+
+SourceFiles
+    shapeSensitivitiesBase.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef shapeSensitivitiesIncompressible_H
+#define shapeSensitivitiesIncompressible_H
+
+#include "adjointSensitivityIncompressible.H"
+#include "shapeSensitivitiesBase.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace incompressible
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class shapeSensitivities Declaration
+\*---------------------------------------------------------------------------*/
+
+class shapeSensitivities
+:
+    public adjointSensitivity,
+    public shapeSensitivitiesBase
+{
+protected:
+
+    // Protected data
+
+        //- Fields related to direct sensitivities
+        autoPtr<boundaryVectorField> dSfdbMult_;
+        autoPtr<boundaryVectorField> dnfdbMult_;
+        autoPtr<boundaryVectorField> dxdbDirectMult_;
+        autoPtr<boundaryVectorField> bcDxDbMult_;
+
+
+    // Protected Member Fuctions
+
+        //- Accumulate direct sensitivities
+        virtual void accumulateDirectSensitivityIntegrand(const scalar dt);
+
+        //- Accumulate sensitivities enamating from the boundary conditions
+        virtual void accumulateBCSensitivityIntegrand(const scalar dt);
+
+        //- Compute multiplier of dv_i/db
+        tmp<boundaryVectorField> dvdbMult() const;
+
+
+private:
+
+    // Private Member Functions
+
+        //- No copy construct
+        shapeSensitivities(const shapeSensitivities&) = delete;
+
+        //- No copy assignment
+        void operator=(const shapeSensitivities&) = delete;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("shapeSensitivities");
+
+
+    // Constructors
+
+        //- Construct from components
+        shapeSensitivities
+        (
+            const fvMesh& mesh,
+            const dictionary& dict,
+            incompressibleVars& primalVars,
+            incompressibleAdjointVars& adjointVars,
+            objectiveManager& objectiveManager,
+            fv::optionAdjointList& fvOptionsAdjoint
+        );
+
+
+    //- Destructor
+    virtual ~shapeSensitivities() = default;
+
+
+    // Member Functions
+
+        //- Accumulate sensitivity integrands
+        virtual void accumulateIntegrand(const scalar dt) = 0;
+
+        //- Assemble sensitivities
+        virtual void assembleSensitivities() = 0;
+
+        //- Zero sensitivity fields and their constituents
+        virtual void clearSensitivities();
+
+        //- Write sensitivity fields.
+        virtual void write(const word& baseName = word::null);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace incompressible
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.C
index df928a8c319739c5f82f64f5102cdc4f9555ee56..4170963659f4f23824f08ef9e835441de4159891 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -172,7 +172,7 @@ void Foam::shapeSensitivitiesBase::setSensitivityPatchIDs
 }
 
 
-void Foam::shapeSensitivitiesBase::clear()
+void Foam::shapeSensitivitiesBase::clearSensitivities()
 {
     // Face-based boundary sens
     if (wallFaceSensVecPtr_.valid())
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.H
index 170683ccb5d5d8924c75150a75352129ef48d437..5389e6de82a74f9ac279dcd8d2cb5590400a1b60 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/shapeSensitivitiesBase/shapeSensitivitiesBase.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -179,7 +179,7 @@ public:
         void setSensitivityPatchIDs(const labelHashSet& sensPatchIDs);
 
         //- Zero sensitivity fields and their constituents
-        void clear();
+        void clearSensitivities();
 
         //- Write sensitivity fields.
         //  If valid, copies boundaryFields to volFields and writes them.
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optMeshMovement/optMeshMovement/optMeshMovement.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/optMeshMovement/optMeshMovement/optMeshMovement.C
index b26898be43b917e28fbdc9fa94563753d8687434..1cce17ff3bf3347a9b9d1b682c320ce652669d9b 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optMeshMovement/optMeshMovement/optMeshMovement.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optMeshMovement/optMeshMovement/optMeshMovement.C
@@ -76,7 +76,7 @@ Foam::optMeshMovement::optMeshMovement
         dict.getOrDefault("writeMeshQualityMetrics", false)
     )
 {
-    //- Set maxAllowedDisplacement if provided
+    // Set maxAllowedDisplacement if provided
     if (dict.found("maxAllowedDisplacement"))
     {
         maxAllowedDisplacement_.reset
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/singleRun/singleRun.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/singleRun/singleRun.H
index 19c3ff912343f00575268f60c44dfaff999d57c9..9f5f6708ad517e345a421c83d603de9fa89dc480 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/singleRun/singleRun.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/singleRun/singleRun.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -107,8 +107,7 @@ public:
         virtual bool update();
 
         //- Update design variables.
-        //  Might employ a line search to find a correction satisfying the step
-        //  convergence criteria
+        //  Does nothing
         virtual void updateDesignVariables();
 };
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/steadyOptimisation/steadyOptimisation.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/steadyOptimisation/steadyOptimisation.C
index 7d7a8dba6159dfc787fa33f9fcde96bb8971e010..470756d7f154a596593a7c73f07c97dbffdd8709 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/steadyOptimisation/steadyOptimisation.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/steadyOptimisation/steadyOptimisation.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -68,8 +68,13 @@ void Foam::steadyOptimisation::updateOptTypeSource()
 
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
-void Foam::steadyOptimisation::lineSearchUpdate(scalarField& direction)
+void Foam::steadyOptimisation::lineSearchUpdate()
 {
+    // Compute direction of update
+    tmp<scalarField> tdirection = optType_->computeDirection();
+    scalarField& direction = tdirection.ref();
+
+    // Grab reference to line search
     autoPtr<lineSearch>& lineSrch = optType_->getLineSearch();
 
     // Store starting point
@@ -121,7 +126,7 @@ void Foam::steadyOptimisation::lineSearchUpdate(scalarField& direction)
         else
         {
             // If maximum number of iteration has been reached, continue
-            if (iter == lineSrch->maxIters()-1)
+            if (iter == lineSrch->maxIters() - 1)
             {
                 Info<< "Line search reached max. number of iterations.\n"
                     << "Proceeding to the next optimisation cycle" << endl;
@@ -141,15 +146,10 @@ void Foam::steadyOptimisation::lineSearchUpdate(scalarField& direction)
 }
 
 
-void Foam::steadyOptimisation::fixedStepUpdate(scalarField& direction)
+void Foam::steadyOptimisation::fixedStepUpdate()
 {
-    // Update based on fixed step
-    optType_->update(direction);
-
-    // If direction has been scaled (say by setting the initial eta), the
-    // old correction has to be updated
-    optType_->updateOldCorrection(direction);
-    optType_->write();
+    // Update design variables
+    optType_->update();
 
     // Solve primal equations
     solvePrimalEquations();
@@ -223,20 +223,15 @@ bool Foam::steadyOptimisation::update()
 
 void Foam::steadyOptimisation::updateDesignVariables()
 {
-    // Compute direction of update
-    tmp<scalarField> tdirection = optType_->computeDirection();
-    scalarField& direction = tdirection.ref();
-    autoPtr<lineSearch>& lineSrch = optType_->getLineSearch();
-
     // Update design variables using either a line-search scheme or
     // a fixed-step update
-    if (lineSrch.valid())
+    if (optType_->getLineSearch().valid())
     {
-        lineSearchUpdate(direction);
+        lineSearchUpdate();
     }
     else
     {
-        fixedStepUpdate(direction);
+        fixedStepUpdate();
     }
 
     // Reset adjoint sensitivities in all adjoint solver managers
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/steadyOptimisation/steadyOptimisation.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/steadyOptimisation/steadyOptimisation.H
index 549b0036878c094fc3c5654d0946c6cb78ddc8c2..0fad239c9c9b806f220d55b85be0a560c557b768 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/steadyOptimisation/steadyOptimisation.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationManager/steadyOptimisation/steadyOptimisation.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -75,10 +75,10 @@ protected:
     // Protected Member Functions
 
         //- Update design variables using a line-search
-        void lineSearchUpdate(scalarField& direction);
+        void lineSearchUpdate();
 
         //- Update design variables using a fixed step
-        void fixedStepUpdate(scalarField& direction);
+        void fixedStepUpdate();
 
 
 public:
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/optimisationType/optimisationTypeIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/optimisationType/optimisationTypeIncompressible.C
index 0cfd8af5de4fdf937cb2e6eb31b9394e3c7bbc4d..06b2de5394b8a89ab1903d7cc4d99dde9ec169ff 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/optimisationType/optimisationTypeIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/optimisationType/optimisationTypeIncompressible.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -157,14 +157,79 @@ autoPtr<optimisationType> optimisationType::New
 
 // * * * * * * * * * * * * * * *  Member Functions   * * * * * * * * * * * * //
 
+void optimisationType::update()
+{
+    // Compute update of the design variables
+    tmp<scalarField> tcorrection(computeDirection());
+    scalarField& correction = tcorrection.ref();
+
+    // Update design variables given the correction
+    update(correction);
+
+    // If direction has been scaled (say by setting the initial eta), the
+    // old correction has to be updated
+    updateOldCorrection(correction);
+    write();
+}
+
+
+void optimisationType::update(scalarField& direction)
+{
+    // Compute eta if needed
+    computeEta(direction);
+
+    // Multiply with line search step, if necessary
+    scalarField correction(direction);
+    if (lineSearch_.valid())
+    {
+        correction *= lineSearch_->step();
+    }
+
+    // Update the design variables
+    updateDesignVariables(correction);
+}
+
+
 tmp<scalarField> optimisationType::computeDirection()
 {
-    // Sum contributions
+    // Sum contributions for sensitivities and objective/constraint values
     scalarField objectiveSens;
     PtrList<scalarField> constraintSens;
     scalar objectiveValue(Zero);
     scalarField constraintValues;
 
+    updateGradientsAndValues
+    (
+        objectiveSens,
+        constraintSens,
+        objectiveValue,
+        constraintValues
+    );
+
+    // Based on the sensitivities, return design variables correction
+    updateMethod_->setObjectiveDeriv(objectiveSens);
+    updateMethod_->setConstraintDeriv(constraintSens);
+    updateMethod_->setObjectiveValue(objectiveValue);
+    updateMethod_->setConstraintValues(constraintValues);
+    tmp<scalarField> tcorrection
+    (
+        new scalarField(objectiveSens.size(), Zero)
+    );
+    scalarField& correction = tcorrection.ref();
+    correction = updateMethod_->returnCorrection();
+
+    return tcorrection;
+}
+
+
+void optimisationType::updateGradientsAndValues
+(
+    scalarField& objectiveSens,
+    PtrList<scalarField>& constraintSens,
+    scalar& objectiveValue,
+    scalarField& constraintValues
+)
+{
     for (adjointSolverManager& adjSolvManager : adjointSolvManagers_)
     {
         const scalar opWeight = adjSolvManager.operatingPointWeight();
@@ -212,20 +277,6 @@ tmp<scalarField> optimisationType::computeDirection()
         }
         constraintValues += opWeight*cValues();
     }
-
-    // Based on the sensitivities, return design variables correction
-    updateMethod_->setObjectiveDeriv(objectiveSens);
-    updateMethod_->setConstraintDeriv(constraintSens);
-    updateMethod_->setObjectiveValue(objectiveValue);
-    updateMethod_->setConstraintValues(constraintValues);
-    tmp<scalarField> tcorrection
-    (
-        new scalarField(objectiveSens.size(), Zero)
-    );
-    scalarField& correction = tcorrection.ref();
-    correction = updateMethod_->returnCorrection();
-
-    return tcorrection;
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/optimisationType/optimisationTypeIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/optimisationType/optimisationTypeIncompressible.H
index 8dd392c0e7ee8ad371393673d2a3706fef1bcad9..1c1a75619fb239e515bfadc3cb1f570457fe4fb7 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/optimisationType/optimisationTypeIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/optimisationType/optimisationTypeIncompressible.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -69,7 +69,11 @@ protected:
         autoPtr<volScalarField> sourcePtr_;
         autoPtr<lineSearch> lineSearch_;
 
-        virtual void computeEta(scalarField& correction)=0;
+        //- Update the design variables given their correction
+        virtual void updateDesignVariables(scalarField& correction) = 0;
+
+        //- Compute eta if not set in the first step
+        virtual void computeEta(scalarField& correction) = 0;
 
 
 private:
@@ -132,10 +136,10 @@ public:
         virtual ~optimisationType() = default;
 
         //- Update design variables
-        virtual void update() = 0;
+        virtual void update();
 
         //- Update design variables based on a given correction
-        virtual void update(scalarField& correction) = 0;
+        virtual void update(scalarField& correction);
 
         //- Store design variables, as the starting point for line search
         virtual void storeDesignVariables() = 0;
@@ -146,6 +150,15 @@ public:
         //- Compute update direction
         virtual tmp<scalarField> computeDirection();
 
+        //- Compute cumulative objective and constraint gradients
+        virtual void updateGradientsAndValues
+        (
+            scalarField& objectiveSens,
+            PtrList<scalarField>& constraintSens,
+            scalar& objectiveValue,
+            scalarField& constraintValues
+        );
+
         //- Compute the merit function of the optimisation problem.
         //  Could be different than the objective function in case of
         //  constraint optimisation
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/shapeOptimisation/shapeOptimisationIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/shapeOptimisation/shapeOptimisationIncompressible.C
index d183c40af4b71b8529a95be5f3ba6aa22c349630..6af773aca9c68d93297f98bc96caff5392998c57 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/shapeOptimisation/shapeOptimisationIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/shapeOptimisation/shapeOptimisationIncompressible.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -49,6 +49,39 @@ addToRunTimeSelectionTable
 
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
+void shapeOptimisation::updateDesignVariables(scalarField& correction)
+{
+    // Communicate the movement to optMeshMovement
+    optMeshMovement_->setCorrection(correction);
+
+    if (updateGeometry_)
+    {
+        // Update the mesh
+        optMeshMovement_->moveMesh();
+
+        if (writeEachMesh_)
+        {
+            Info<< "  Writing new mesh points " << endl;
+            pointIOField points
+            (
+                IOobject
+                (
+                   "points",
+                    mesh_.pointsInstance(),
+                    mesh_.meshSubDir,
+                    mesh_,
+                    IOobject::NO_READ,
+                    IOobject::NO_WRITE,
+                    false
+                ),
+                mesh_.points()
+            );
+            points.write();
+        }
+    }
+}
+
+
 void shapeOptimisation::computeEta
 (
     scalarField& correction
@@ -146,144 +179,6 @@ shapeOptimisation::shapeOptimisation
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-void shapeOptimisation::update()
-{
-    Info<< nl << "Moving Mesh..." << nl << endl;
-
-    // Sum contributions
-    scalarField objectiveSens(0);
-    PtrList<scalarField> constraintSens(0);
-    scalar objectiveValue(Zero);
-    scalarField constraintValues(0);
-    forAll(adjointSolvManagers_, amI)
-    {
-        adjointSolverManager& adjSolvManager(adjointSolvManagers_[amI]);
-        const scalar opWeight(adjSolvManager.operatingPointWeight());
-
-        // Allocate objective sens size if necessary
-        tmp<scalarField> tadjointSolverManagerSens =
-            adjSolvManager.aggregateSensitivities();
-
-        if (objectiveSens.empty())
-        {
-            objectiveSens.setSize(tadjointSolverManagerSens().size(), Zero);
-        }
-        objectiveSens += opWeight*tadjointSolverManagerSens();
-        objectiveValue += opWeight*adjSolvManager.objectiveValue();
-
-        // Allocate constraint sens size if necessary
-        PtrList<scalarField> adjointSolverManagerConstSens
-            = adjSolvManager.constraintSensitivities();
-        tmp<scalarField> cValues = adjSolvManager.constraintValues();
-        if (constraintSens.empty())
-        {
-            constraintSens.setSize(adjointSolverManagerConstSens.size());
-            forAll(constraintSens, cI)
-            {
-                constraintSens.set
-                (
-                    cI,
-                    new scalarField
-                    (
-                        adjointSolverManagerConstSens[cI].size(),
-                        Zero
-                    )
-                );
-                constraintValues.setSize(cValues().size());
-                constraintValues = Zero;
-            }
-        }
-
-        forAll(constraintSens, cI)
-        {
-            constraintSens[cI] += opWeight*adjointSolverManagerConstSens[cI];
-        }
-        constraintValues += opWeight*cValues();
-    }
-
-    // Based on the sensitivities, return design variables correction
-    updateMethod_->setObjectiveDeriv(objectiveSens);
-    updateMethod_->setConstraintDeriv(constraintSens);
-    updateMethod_->setObjectiveValue(objectiveValue);
-    updateMethod_->setConstraintValues(constraintValues);
-    scalarField& correction = updateMethod_->returnCorrection();
-
-    // Computed  eta if needed
-    computeEta(correction);
-    updateMethod_->writeCorrection();
-
-    // Communicate the movement to optMeshMovement
-    optMeshMovement_->setCorrection(correction);
-    if (updateGeometry_)
-    {
-        optMeshMovement_->moveMesh();
-
-        if (writeEachMesh_)
-        {
-            Info<< "  Writing new mesh points " << endl;
-            pointIOField points
-            (
-                IOobject
-                (
-                    "points",
-                     mesh_.pointsInstance(),
-                     mesh_.meshSubDir,
-                     mesh_,
-                     IOobject::NO_READ,
-                     IOobject::NO_WRITE,
-                     false
-                ),
-                mesh_.points()
-            );
-            points.write();
-        }
-    }
-}
-
-
-void shapeOptimisation::update(scalarField& direction)
-{
-    // Computed eta if needed
-    computeEta(direction);
-
-    // Multiply with line search step, if necessary
-    scalarField correction = direction;
-    if (lineSearch_.valid())
-    {
-        correction *= lineSearch_->step();
-    }
-
-    // Communicate the movement to optMeshMovement
-    optMeshMovement_->setCorrection(correction);
-
-    if (updateGeometry_)
-    {
-        // Update the mesh
-        optMeshMovement_->moveMesh();
-
-        if (writeEachMesh_)
-        {
-            Info<< "  Writing new mesh points " << endl;
-            pointIOField points
-            (
-                IOobject
-                (
-                   "points",
-                    mesh_.pointsInstance(),
-                    mesh_.meshSubDir,
-                    mesh_,
-                    IOobject::NO_READ,
-                    IOobject::NO_WRITE,
-                    false
-                ),
-                mesh_.points()
-            );
-            points.write();
-        }
-    }
-}
-
-
 void shapeOptimisation::storeDesignVariables()
 {
     optMeshMovement_->storeDesignVariables();
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/shapeOptimisation/shapeOptimisationIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/shapeOptimisation/shapeOptimisationIncompressible.H
index 5152941fb143d7efddb6cae371f209ce35ea13cc..421feaba671710687f9422582921254b701a11a1 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/shapeOptimisation/shapeOptimisationIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optimisationType/incompressible/shapeOptimisation/shapeOptimisationIncompressible.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -76,6 +76,10 @@ protected:
 
     // Protected Member Functions
 
+        //- Update the design variables given their correction
+        virtual void updateDesignVariables(scalarField& correction);
+
+        //- Compute eta if not set in the first step
         virtual void computeEta(scalarField& correction);
 
 
@@ -113,20 +117,14 @@ public:
 
     // Member Functions
 
-       //- Master function. Calls all the others
-       void update();
-
-       //- Update design variables based on a given correction
-       virtual void update(scalarField& correction);
-
-       //- Store design variables, as the starting point for line search
-       virtual void storeDesignVariables();
+        //- Store design variables, as the starting point for line search
+        virtual void storeDesignVariables();
 
-       //- Store design variables, as the starting point for line search
-       virtual void resetDesignVariables();
+        //- Store design variables, as the starting point for line search
+        virtual void resetDesignVariables();
 
-       //- Write useful quantities to files
-       virtual void write();
+        //- Write useful quantities to files
+        virtual void write();
 };
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/updateMethod/updateMethod/updateMethod.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/updateMethod/updateMethod/updateMethod.C
index 1410824a72b4421bc00ed505a171b533206955ed..2b9b08511969331373ce854ea81fae72e9cb26c6 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/updateMethod/updateMethod/updateMethod.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/updateMethod/updateMethod/updateMethod.C
@@ -127,7 +127,7 @@ Foam::updateMethod::inv(SquareMatrix<scalar> A)
     label n(A.n());
     SquareMatrix<scalar> invA(n, Zero);
 
-    //- LU decomposition of A
+    // LU decomposition of A
     labelList pivotIndices(n, Zero);
     LUDecompose(A, pivotIndices);
     DebugInfo
diff --git a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolume.C b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolume.C
index c6346ac5592fea49da49586878fdb8dd23527022..f8396174de1b52e3fb6ae02f88a1dff8f93d63c7 100644
--- a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolume.C
+++ b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolume.C
@@ -497,9 +497,9 @@ void Foam::NURBS3DVolume::continuityRealatedConfinement()
 
     // Zero movement to a number of x-constant slices of cps in order to
     // preserve continuity at the boundary of the parameterized space
-    forAll(boundUMinCPs_, iCPu)
+    forAll(confineUMinCPs_, iCPu)
     {
-        const FixedList<bool, 3>& confineSlice = boundUMinCPs_[iCPu];
+        const FixedList<bool, 3>& confineSlice = confineUMinCPs_[iCPu];
         // Control points at the start of the parameterized space
         for (label iCPw = 0; iCPw < nCPsW; iCPw++)
         {
@@ -510,9 +510,9 @@ void Foam::NURBS3DVolume::continuityRealatedConfinement()
         }
     }
 
-    forAll(boundUMaxCPs_, sliceI)
+    forAll(confineUMaxCPs_, sliceI)
     {
-        const FixedList<bool, 3>& confineSlice = boundUMaxCPs_[sliceI];
+        const FixedList<bool, 3>& confineSlice = confineUMaxCPs_[sliceI];
         label iCPu = nCPsU - 1 - sliceI;
         // Control points at the end of the parameterized space
         for (label iCPw = 0; iCPw < nCPsW; iCPw++)
@@ -526,9 +526,9 @@ void Foam::NURBS3DVolume::continuityRealatedConfinement()
 
     // Zero movement to a number of y-constant slices of cps in order to
     // preserve continuity at the boundary of the parameterized space
-    forAll(boundVMinCPs_, iCPv)
+    forAll(confineVMinCPs_, iCPv)
     {
-        const FixedList<bool, 3>& confineSlice = boundVMinCPs_[iCPv];
+        const FixedList<bool, 3>& confineSlice = confineVMinCPs_[iCPv];
         // Control points at the start of the parameterized space
         for (label iCPw = 0; iCPw < nCPsW; iCPw++)
         {
@@ -539,9 +539,9 @@ void Foam::NURBS3DVolume::continuityRealatedConfinement()
         }
     }
 
-    forAll(boundVMaxCPs_, sliceI)
+    forAll(confineVMaxCPs_, sliceI)
     {
-        const FixedList<bool, 3>& confineSlice = boundVMaxCPs_[sliceI];
+        const FixedList<bool, 3>& confineSlice = confineVMaxCPs_[sliceI];
         label iCPv = nCPsV - 1 - sliceI;
         // Control points at the end of the parameterized space
         for (label iCPw = 0; iCPw < nCPsW; iCPw++)
@@ -555,9 +555,9 @@ void Foam::NURBS3DVolume::continuityRealatedConfinement()
 
     // Zero movement to a number of w-constant slices of cps in order to
     // preserve continuity at the boundary of the parameterized space
-    forAll(boundWMinCPs_, iCPw)
+    forAll(confineWMinCPs_, iCPw)
     {
-        const FixedList<bool, 3>& confineSlice = boundWMinCPs_[iCPw];
+        const FixedList<bool, 3>& confineSlice = confineWMinCPs_[iCPw];
         // Control points at the start of the parameterized space
         for (label iCPv = 0; iCPv < nCPsV; iCPv++)
         {
@@ -568,9 +568,9 @@ void Foam::NURBS3DVolume::continuityRealatedConfinement()
         }
     }
 
-    forAll(boundWMaxCPs_, sliceI)
+    forAll(confineWMaxCPs_, sliceI)
     {
-        const FixedList<bool, 3>& confineSlice = boundWMaxCPs_[sliceI];
+        const FixedList<bool, 3>& confineSlice = confineWMaxCPs_[sliceI];
         label iCPw = nCPsW - 1 - sliceI;
         // Control points at the end of the parameterized space
         for (label iCPv = 0; iCPv < nCPsV; iCPv++)
@@ -588,9 +588,9 @@ void Foam::NURBS3DVolume::confineControlPointsDirections()
 {
     for (label cpI = 0; cpI < cps_.size(); ++cpI)
     {
-        if (confineX1movement_) activeDesignVariables_[3*cpI] = false;
-        if (confineX2movement_) activeDesignVariables_[3*cpI + 1] = false;
-        if (confineX3movement_) activeDesignVariables_[3*cpI + 2] = false;
+        if (confineUMovement_) activeDesignVariables_[3*cpI] = false;
+        if (confineVMovement_) activeDesignVariables_[3*cpI + 1] = false;
+        if (confineWMovement_) activeDesignVariables_[3*cpI + 2] = false;
     }
 }
 
@@ -657,36 +657,72 @@ Foam::NURBS3DVolume::NURBS3DVolume
     reverseMapPtr_(nullptr),
     parametricCoordinatesPtr_(nullptr),
     localSystemCoordinates_(mesh_.nPoints(), Zero),
-    confineX1movement_(dict.getOrDefault<bool>("confineX1movement", false)),
-    confineX2movement_(dict.getOrDefault<bool>("confineX2movement", false)),
-    confineX3movement_(dict.getOrDefault<bool>("confineX3movement", false)),
+    confineUMovement_
+    (
+        dict.getOrDefaultCompat<bool>
+        (
+            "confineUMovement", {{"confineX1movement", 1912}}, false
+        )
+    ),
+    confineVMovement_
+    (
+        dict.getOrDefaultCompat<bool>
+        (
+            "confineVMovement", {{"confineX2movement", 1912}}, false
+        )
+    ),
+    confineWMovement_
+    (
+        dict.getOrDefaultCompat<bool>
+        (
+            "confineWMovement", {{"confineX3movement", 1912}}, false
+        )
+    ),
     confineBoundaryControlPoints_
     (
         dict.getOrDefault<bool>("confineBoundaryControlPoints", true)
     ),
-    boundUMinCPs_
+    confineUMinCPs_
     (
-        dict.getOrDefault<boolListList3>("boundUMinCPs", boolListList3(0))
+        dict.getOrDefaultCompat<boolListList3>
+        (
+            "confineUMinCPs", {{"boundUMinCPs", 1912}}, boolListList3(0)
+        )
     ),
-    boundUMaxCPs_
+    confineUMaxCPs_
     (
-        dict.getOrDefault<boolListList3>("boundUMaxCPs", boolListList3(0))
+        dict.getOrDefaultCompat<boolListList3>
+        (
+            "confineUMaxCPs", {{"boundUMaxCPs", 1912}}, boolListList3(0)
+        )
     ),
-    boundVMinCPs_
+    confineVMinCPs_
     (
-        dict.getOrDefault<boolListList3>("boundVMinCPs", boolListList3(0))
+        dict.getOrDefaultCompat<boolListList3>
+        (
+            "confineVMinCPs", {{"boundVMinCPs", 1912}}, boolListList3(0)
+        )
     ),
-    boundVMaxCPs_
+    confineVMaxCPs_
     (
-        dict.getOrDefault<boolListList3>("boundVMaxCPs", boolListList3(0))
+        dict.getOrDefaultCompat<boolListList3>
+        (
+            "confineVMaxCPs", {{"boundVMaxCPs", 1912}}, boolListList3(0)
+        )
     ),
-    boundWMinCPs_
+    confineWMinCPs_
     (
-        dict.getOrDefault<boolListList3>("boundWMinCPs", boolListList3(0))
+        dict.getOrDefaultCompat<boolListList3>
+        (
+            "confineWMinCPs", {{"boundWMinCPs", 1912}}, boolListList3(0)
+        )
     ),
-    boundWMaxCPs_
+    confineWMaxCPs_
     (
-        dict.getOrDefault<boolListList3>("boundWMaxCPs", boolListList3(0))
+        dict.getOrDefaultCompat<boolListList3>
+        (
+            "confineWMaxCPs", {{"boundWMaxCPs", 1912}}, boolListList3(0)
+        )
     ),
     activeControlPoints_(0), //zero here, execute sanity checks first
     activeDesignVariables_(0), //zero here, execute sanity checks first
@@ -699,9 +735,9 @@ Foam::NURBS3DVolume::NURBS3DVolume
     // Sanity checks
     if
     (
-        (boundUMinCPs_.size() + boundUMaxCPs_.size() >= basisU_.nCPs())
-     || (boundVMinCPs_.size() + boundVMaxCPs_.size() >= basisV_.nCPs())
-     || (boundWMinCPs_.size() + boundWMaxCPs_.size() >= basisW_.nCPs())
+        (confineUMinCPs_.size() + confineUMaxCPs_.size() >= basisU_.nCPs())
+     || (confineVMinCPs_.size() + confineVMaxCPs_.size() >= basisV_.nCPs())
+     || (confineWMinCPs_.size() + confineWMaxCPs_.size() >= basisW_.nCPs())
     )
     {
         FatalErrorInFunction
@@ -1850,7 +1886,7 @@ void Foam::NURBS3DVolume::writeCps(const fileName& baseName) const
         // Write header
         cpsFile
             << "\"Points : 0\", \"Points : 1\", \"Points : 2\","
-            << "\"u\", \"v\", \"w\","
+            << "\"i\", \"j\", \"k\","
             << "\"active : 0\", \"active : 1\", \"active : 2\"" << endl;
 
         forAll(cpsInCartesian, cpI)
diff --git a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolume.H b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolume.H
index bdfcdc5456c46969d77069d13155ae93e07dd957..67dd94c23b1ce395cf986e0a7355ec9225629f97 100644
--- a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolume.H
+++ b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolume.H
@@ -112,26 +112,26 @@ protected:
 
         //- Confine movement in certain directions and control points. Refers
         //- to the local system
-        label confineX1movement_;
+        label confineUMovement_;
 
-        label confineX2movement_;
+        label confineVMovement_;
 
-        label confineX3movement_;
+        label confineWMovement_;
 
         label confineBoundaryControlPoints_;
 
         //- Which movement components to freeze in each plane
-        boolListList3 boundUMinCPs_;
+        boolListList3 confineUMinCPs_;
 
-        boolListList3 boundUMaxCPs_;
+        boolListList3 confineUMaxCPs_;
 
-        boolListList3 boundVMinCPs_;
+        boolListList3 confineVMinCPs_;
 
-        boolListList3 boundVMaxCPs_;
+        boolListList3 confineVMaxCPs_;
 
-        boolListList3 boundWMinCPs_;
+        boolListList3 confineWMinCPs_;
 
-        boolListList3 boundWMaxCPs_;
+        boolListList3 confineWMaxCPs_;
 
         //- Which of the cps are moved in an optimisation
         boolList activeControlPoints_;
@@ -449,11 +449,11 @@ public:
                 inline const vectorField& getControlPoints() const;
 
                 //- Get confine movements
-                inline bool confineX1movement() const;
+                inline bool confineUMovement() const;
 
-                inline bool confineX2movement() const;
+                inline bool confineVMovement() const;
 
-                inline bool confineX3movement() const;
+                inline bool confineWMovement() const;
 
                 //- Get basis functions
                 inline const NURBSbasis& basisU() const;
diff --git a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolumeI.H b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolumeI.H
index 3e2aa32ee0d8431a0300c8e05a83d0d715951bd4..a3c58650297802c99d426ad75d1965a2785fb9f0 100644
--- a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolumeI.H
+++ b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/NURBS3DVolume/NURBS3DVolumeI.H
@@ -56,21 +56,21 @@ inline const Foam::vectorField& Foam::NURBS3DVolume::getControlPoints() const
 }
 
 
-inline bool Foam::NURBS3DVolume::confineX1movement() const
+inline bool Foam::NURBS3DVolume::confineUMovement() const
 {
-    return confineX1movement_;
+    return confineUMovement_;
 }
 
 
-inline bool Foam::NURBS3DVolume::confineX2movement() const
+inline bool Foam::NURBS3DVolume::confineVMovement() const
 {
-    return confineX2movement_;
+    return confineVMovement_;
 }
 
 
-inline bool Foam::NURBS3DVolume::confineX3movement() const
+inline bool Foam::NURBS3DVolume::confineWMovement() const
 {
-    return confineX3movement_;
+    return confineWMovement_;
 }
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.C b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.C
index 3221257012726cac119b2e61c00ecb7ce6172566..4f8a5f94259e5013dcf1af1220102bfb8e429377 100644
--- a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.C
+++ b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.C
@@ -187,6 +187,24 @@ labelList volBSplinesBase::getStartCpID() const
 }
 
 
+label volBSplinesBase::findBoxID(const label cpI) const
+{
+    const labelList startCPID(getStartCpID());
+    for (label iBox = 0; iBox < startCPID.size() - 1 ; ++iBox)
+    {
+        if (cpI >= startCPID[iBox] || cpI < startCPID[iBox + 1])
+        {
+            return iBox;
+        }
+    }
+
+    FatalErrorInFunction
+        << "Invalid control point ID " << cpI << endl
+        << exit(FatalError);
+    return -1;
+}
+
+
 const Foam::labelList& volBSplinesBase::getActiveDesignVariables() const
 {
     return activeDesignVariables_;
diff --git a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.H b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.H
index b880a932ce2051bc474cca220800adfeaae9bd94..d6fc19d6169a0a73cb4fb00238136d03818fb390 100644
--- a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.H
+++ b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.H
@@ -129,6 +129,9 @@ public:
         //- Get start CP ID for each box
         labelList getStartCpID() const;
 
+        //- Find box of certain control point
+        label findBoxID(const label cpI) const;
+
         //- Get active design variables
         const labelList& getActiveDesignVariables() const;
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C
index d59f6e934718f1cecf73c78cc59ecc58e6cbe329..8b54effb8ac3fb363e79f03e896d6e660810471e 100644
--- a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C
+++ b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -312,9 +312,6 @@ void Foam::adjointSimple::solve()
 {
     if (active_)
     {
-        // Update objective function related quantities
-        objectiveManagerPtr_->updateAndWrite();
-
         // Reset mean fields before solving
         adjointVars_.resetMeanFields();
 
@@ -389,6 +386,15 @@ Foam::sensitivity& Foam::adjointSimple::getSensitivityBase()
 }
 
 
+void Foam::adjointSimple::updatePrimalBasedQuantities()
+{
+    incompressibleAdjointSolver::updatePrimalBasedQuantities();
+
+    // Update objective function related quantities
+    objectiveManagerPtr_->updateAndWrite();
+}
+
+
 bool Foam::adjointSimple::writeData(Ostream& os) const
 {
     os.writeEntry("averageIter", solverControl_().averageIter());
diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.H b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.H
index 14b348f632f1d3b29ecfc306a9e2805f2119ab62..a5884247be4f59e1dc1323bfa71dfc7c176a9610 100644
--- a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.H
+++ b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -168,6 +168,14 @@ public:
             //- Return the base sensitivity object
             virtual sensitivity& getSensitivityBase();
 
+            //- Update primal based quantities
+            //- related to the objective functions.
+            //  Also writes the objective function values to files.
+            //  Written here and not in the postLoop function of the primal
+            //  to make sure we don't pollute the objective files with
+            //  objectives of non-converged linearSearch iterations
+            virtual void updatePrimalBasedQuantities();
+
             //- Write average iteration
             virtual bool writeData(Ostream& os) const;
 };
diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/primalSolvers/incompressible/incompressiblePrimalSolver/incompressiblePrimalSolver.C b/src/optimisation/adjointOptimisation/adjoint/solvers/primalSolvers/incompressible/incompressiblePrimalSolver/incompressiblePrimalSolver.C
index bfc3a4bc11aed0639949f7142bf2642339d0a749..f1f50530e36e924c371e6c23092a43cdd92c8d83 100644
--- a/src/optimisation/adjointOptimisation/adjoint/solvers/primalSolvers/incompressible/incompressiblePrimalSolver/incompressiblePrimalSolver.C
+++ b/src/optimisation/adjointOptimisation/adjoint/solvers/primalSolvers/incompressible/incompressiblePrimalSolver/incompressiblePrimalSolver.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -130,7 +130,7 @@ Foam::incompressiblePrimalSolver::getObjectiveFunctions() const
     {
         adjointSolver& adjoint = *adjointPtr;
 
-        if (adjoint.active() && adjoint.primalSolverName() == solverName_)
+        if (adjoint.primalSolverName() == solverName_)
         {
             PtrList<objective>& managerObjectives =
                 adjoint.getObjectiveManager().getObjectiveFunctions();
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointFarFieldNuaTilda/adjointFarFieldNuaTildaFvPatchScalarField.C b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointFarFieldNuaTilda/adjointFarFieldNuaTildaFvPatchScalarField.C
index e289098d4b907480734af1433b587f72ac49bf5a..edbdc4b09ca1ac869dd95097d50d4ffedd6ca895 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointFarFieldNuaTilda/adjointFarFieldNuaTildaFvPatchScalarField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointFarFieldNuaTilda/adjointFarFieldNuaTildaFvPatchScalarField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -48,7 +48,7 @@ adjointFarFieldNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointScalarBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -62,7 +62,7 @@ adjointFarFieldNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointScalarBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -75,7 +75,7 @@ adjointFarFieldNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointScalarBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<scalar>::operator=
     (
@@ -92,7 +92,7 @@ adjointFarFieldNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(tppsf, iF),
-    adjointBoundaryCondition(tppsf)
+    adjointScalarBoundaryCondition(tppsf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointFarFieldNuaTilda/adjointFarFieldNuaTildaFvPatchScalarField.H b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointFarFieldNuaTilda/adjointFarFieldNuaTildaFvPatchScalarField.H
index ece262211f358c306b9c855069dd52965a4c3242..65d801600cf68b03080e4f8734bcd22e65c186da 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointFarFieldNuaTilda/adjointFarFieldNuaTildaFvPatchScalarField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointFarFieldNuaTilda/adjointFarFieldNuaTildaFvPatchScalarField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -40,7 +40,7 @@ SourceFiles
 #define adjointFarFieldNuaTildaFvPatchScalarField_H
 
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -54,7 +54,7 @@ namespace Foam
 class adjointFarFieldNuaTildaFvPatchScalarField
 :
     public fixedValueFvPatchScalarField,
-    public adjointBoundaryCondition
+    public adjointScalarBoundaryCondition
 {
 public:
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointInletNuaTilda/adjointInletNuaTildaFvPatchScalarField.C b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointInletNuaTilda/adjointInletNuaTildaFvPatchScalarField.C
index ef3eee6b769d40bc5d746f08da5188c052c69b15..a3d75d2fccb6fa3972277cd3f3d923a7b08daf9f 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointInletNuaTilda/adjointInletNuaTildaFvPatchScalarField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointInletNuaTilda/adjointInletNuaTildaFvPatchScalarField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -44,7 +44,7 @@ adjointInletNuaTildaFvPatchScalarField::adjointInletNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointScalarBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -57,7 +57,7 @@ adjointInletNuaTildaFvPatchScalarField::adjointInletNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointScalarBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -69,7 +69,7 @@ adjointInletNuaTildaFvPatchScalarField::adjointInletNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF, dict),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointScalarBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {}
 
 
@@ -80,7 +80,7 @@ adjointInletNuaTildaFvPatchScalarField::adjointInletNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(ptf, iF),
-    adjointBoundaryCondition(ptf)
+    adjointScalarBoundaryCondition(ptf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointInletNuaTilda/adjointInletNuaTildaFvPatchScalarField.H b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointInletNuaTilda/adjointInletNuaTildaFvPatchScalarField.H
index 2920ad074203c8d212beb10566d21db6ffe299ed..5cf3d8cb522860e13b94fd3366c3cf1c07891cfe 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointInletNuaTilda/adjointInletNuaTildaFvPatchScalarField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointInletNuaTilda/adjointInletNuaTildaFvPatchScalarField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -42,7 +42,7 @@ SourceFiles
 
 #include "fvPatchFields.H"
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -56,7 +56,7 @@ namespace Foam
 class adjointInletNuaTildaFvPatchScalarField
 :
     public fixedValueFvPatchScalarField,
-    public adjointBoundaryCondition
+    public adjointScalarBoundaryCondition
 {
 
 public:
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletFlux/adjointOutletFluxFvPatchScalarField.H b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletFlux/adjointOutletFluxFvPatchScalarField.H
index ad7bbce8badfd55483c89dffb1e3f7ed775e86bc..4efe56af5a9a3c1790428468b7df5029ffcbf96c 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletFlux/adjointOutletFluxFvPatchScalarField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletFlux/adjointOutletFluxFvPatchScalarField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -40,7 +40,7 @@ SourceFiles
 #define adjointOutletFluxFvPatchScalarField_H
 
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTilda/adjointOutletNuaTildaFvPatchScalarField.C b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTilda/adjointOutletNuaTildaFvPatchScalarField.C
index fc50925a99b5bbf4fb55c412039eb17a7b3bc45e..ef16a37865c667d389c753c052ffda5147d5acf6 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTilda/adjointOutletNuaTildaFvPatchScalarField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTilda/adjointOutletNuaTildaFvPatchScalarField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -46,7 +46,7 @@ adjointOutletNuaTildaFvPatchScalarField::adjointOutletNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointScalarBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -59,7 +59,7 @@ adjointOutletNuaTildaFvPatchScalarField::adjointOutletNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointScalarBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -71,7 +71,7 @@ adjointOutletNuaTildaFvPatchScalarField::adjointOutletNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointScalarBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<scalar>::operator=
     (
@@ -87,7 +87,7 @@ adjointOutletNuaTildaFvPatchScalarField::adjointOutletNuaTildaFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(tppsf, iF),
-    adjointBoundaryCondition(tppsf)
+    adjointScalarBoundaryCondition(tppsf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTilda/adjointOutletNuaTildaFvPatchScalarField.H b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTilda/adjointOutletNuaTildaFvPatchScalarField.H
index b2f5ee87871ecfb538511f3f0f2f404944b994c0..8f20dcb0ea3425811818fc68cee414146dabea34 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTilda/adjointOutletNuaTildaFvPatchScalarField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTilda/adjointOutletNuaTildaFvPatchScalarField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -40,7 +40,7 @@ SourceFiles
 #define adjointOutletNuaTildaFvPatchScalarField_H
 
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -54,7 +54,7 @@ namespace Foam
 class adjointOutletNuaTildaFvPatchScalarField
 :
     public fixedValueFvPatchScalarField,
-    public adjointBoundaryCondition
+    public adjointScalarBoundaryCondition
 {
 public:
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTildaFlux/adjointOutletNuaTildaFluxFvPatchScalarField.C b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTildaFlux/adjointOutletNuaTildaFluxFvPatchScalarField.C
index b78448441a2df209ba3d62e6071f33ec04d62543..f66e1972e79e8d9e1a70d9c77719a179f7c0a3ec 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTildaFlux/adjointOutletNuaTildaFluxFvPatchScalarField.C
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTildaFlux/adjointOutletNuaTildaFluxFvPatchScalarField.C
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -47,7 +47,7 @@ adjointOutletNuaTildaFluxFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, word::null)
+    adjointScalarBoundaryCondition(p, iF, word::null)
 {}
 
 
@@ -61,7 +61,7 @@ adjointOutletNuaTildaFluxFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(ptf, p, iF, mapper),
-    adjointBoundaryCondition(p, iF, ptf.adjointSolverName_)
+    adjointScalarBoundaryCondition(p, iF, ptf.adjointSolverName_)
 {}
 
 
@@ -74,7 +74,7 @@ adjointOutletNuaTildaFluxFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(p, iF),
-    adjointBoundaryCondition(p, iF, dict.get<word>("solverName"))
+    adjointScalarBoundaryCondition(p, iF, dict.get<word>("solverName"))
 {
     fvPatchField<scalar>::operator=
     (
@@ -91,7 +91,7 @@ adjointOutletNuaTildaFluxFvPatchScalarField
 )
 :
     fixedValueFvPatchScalarField(tppsf, iF),
-    adjointBoundaryCondition(tppsf)
+    adjointScalarBoundaryCondition(tppsf)
 {}
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTildaFlux/adjointOutletNuaTildaFluxFvPatchScalarField.H b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTildaFlux/adjointOutletNuaTildaFluxFvPatchScalarField.H
index cdea8dea95f7023edb68fac10ec6e83c21a6c804..246a33a557bb6635bf0ebf55924fa7c19778f460 100644
--- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTildaFlux/adjointOutletNuaTildaFluxFvPatchScalarField.H
+++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/derivedFvPatchFields/adjointOutletNuaTildaFlux/adjointOutletNuaTildaFluxFvPatchScalarField.H
@@ -5,8 +5,8 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2007-2019 PCOpt/NTUA
-    Copyright (C) 2013-2019 FOSS GP
+    Copyright (C) 2007-2020 PCOpt/NTUA
+    Copyright (C) 2013-2020 FOSS GP
     Copyright (C) 2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
@@ -40,7 +40,7 @@ SourceFiles
 #define adjointOutletNuaTildaFluxFvPatchScalarField_H
 
 #include "fixedValueFvPatchFields.H"
-#include "adjointBoundaryCondition.H"
+#include "adjointBoundaryConditions.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -54,7 +54,7 @@ namespace Foam
 class adjointOutletNuaTildaFluxFvPatchScalarField
 :
     public fixedValueFvPatchScalarField,
-    public adjointBoundaryCondition
+    public adjointScalarBoundaryCondition
 {
 
 public:
diff --git a/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/highRe/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/highRe/constant/dynamicMeshDict
deleted file mode 100644
index a82e4e41baef91a7b1e183d76471fb35b5a3327a..0000000000000000000000000000000000000000
--- a/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/highRe/constant/dynamicMeshDict
+++ /dev/null
@@ -1,49 +0,0 @@
-/*--------------------------------*- C++ -*----------------------------------*\
-| =========                 |                                                 |
-| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
-|  \\    /   O peration     | Version:  v1912                                 |
-|   \\  /    A nd           | Website:  www.openfoam.com                      |
-|    \\/     M anipulation  |                                                 |
-\*---------------------------------------------------------------------------*/
-FoamFile
-{
-    version     2.0;
-    format      ascii;
-    class       dictionary;
-    object      dynamicMeshDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-solver volumetricBSplinesMotionSolver;
-
-volumetricBSplinesMotionSolverCoeffs
-{
-    controlBoxes (duct);
-    duct
-    {
-        name    duct;
-        type    cartesian;
-        nCPsU   9;
-        nCPsV   5;
-        nCPsW   3;
-        degreeU 3;
-        degreeV 3;
-        degreeW 2;
-
-        controlPointsDefinition axisAligned;
-        lowerCpBounds           (-1.1 -0.21 -0.05);
-        upperCpBounds           ( 1.1  0.39  0.15);
-
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
-        confineBoundaryControlPoints false;
-
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
-    }
-}
-
-// ************************************************************************* //
diff --git a/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/lowRe/multiPoint/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/lowRe/multiPoint/constant/dynamicMeshDict
deleted file mode 100644
index a82e4e41baef91a7b1e183d76471fb35b5a3327a..0000000000000000000000000000000000000000
--- a/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/lowRe/multiPoint/constant/dynamicMeshDict
+++ /dev/null
@@ -1,49 +0,0 @@
-/*--------------------------------*- C++ -*----------------------------------*\
-| =========                 |                                                 |
-| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
-|  \\    /   O peration     | Version:  v1912                                 |
-|   \\  /    A nd           | Website:  www.openfoam.com                      |
-|    \\/     M anipulation  |                                                 |
-\*---------------------------------------------------------------------------*/
-FoamFile
-{
-    version     2.0;
-    format      ascii;
-    class       dictionary;
-    object      dynamicMeshDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-solver volumetricBSplinesMotionSolver;
-
-volumetricBSplinesMotionSolverCoeffs
-{
-    controlBoxes (duct);
-    duct
-    {
-        name    duct;
-        type    cartesian;
-        nCPsU   9;
-        nCPsV   5;
-        nCPsW   3;
-        degreeU 3;
-        degreeV 3;
-        degreeW 2;
-
-        controlPointsDefinition axisAligned;
-        lowerCpBounds           (-1.1 -0.21 -0.05);
-        upperCpBounds           ( 1.1  0.39  0.15);
-
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
-        confineBoundaryControlPoints false;
-
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
-    }
-}
-
-// ************************************************************************* //
diff --git a/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/lowRe/singlePoint/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/lowRe/singlePoint/constant/dynamicMeshDict
deleted file mode 100644
index a82e4e41baef91a7b1e183d76471fb35b5a3327a..0000000000000000000000000000000000000000
--- a/tutorials/incompressible/adjointOptimisationFoam/sensitivityMaps/sbend/turbulent/lowRe/singlePoint/constant/dynamicMeshDict
+++ /dev/null
@@ -1,49 +0,0 @@
-/*--------------------------------*- C++ -*----------------------------------*\
-| =========                 |                                                 |
-| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
-|  \\    /   O peration     | Version:  v1912                                 |
-|   \\  /    A nd           | Website:  www.openfoam.com                      |
-|    \\/     M anipulation  |                                                 |
-\*---------------------------------------------------------------------------*/
-FoamFile
-{
-    version     2.0;
-    format      ascii;
-    class       dictionary;
-    object      dynamicMeshDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-solver volumetricBSplinesMotionSolver;
-
-volumetricBSplinesMotionSolverCoeffs
-{
-    controlBoxes (duct);
-    duct
-    {
-        name    duct;
-        type    cartesian;
-        nCPsU   9;
-        nCPsV   5;
-        nCPsW   3;
-        degreeU 3;
-        degreeV 3;
-        degreeW 2;
-
-        controlPointsDefinition axisAligned;
-        lowerCpBounds           (-1.1 -0.21 -0.05);
-        upperCpBounds           ( 1.1  0.39  0.15);
-
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
-        confineBoundaryControlPoints false;
-
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
-    }
-}
-
-// ************************************************************************* //
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/motorBike/Allrun b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/motorBike/Allrun
index a8c290b238f0d07bba0837b6906e97b2e16a5e52..8ebaeb27956bd8713b8b0def6b25f6640b86f865 100755
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/motorBike/Allrun
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/motorBike/Allrun
@@ -39,7 +39,6 @@ runParallel $decompDict patchSummary
 runParallel $decompDict potentialFoam
 runParallel $decompDict checkMesh -writeFields '(nonOrthoAngle)' -constant
 
-runParallel $decompDict writeActiveDesignVariables
 runParallel $decompDict $(getApplication)
 runParallel $decompDict cumulativeDisplacement
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/motorBike/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/motorBike/constant/dynamicMeshDict
index c78d98c798094c3ab6b786efeb9802baf68ed9c5..c04def7f36bac3f181039a0882932ba643b665f1 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/motorBike/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/motorBike/constant/dynamicMeshDict
@@ -30,17 +30,17 @@ volumetricBSplinesMotionSolverCoeffs
 
         controlPointsDefinition fromFile;
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement false;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement false;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) );
-        boundVMinCPs ( (true true true) (true true true) );
-        boundVMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) );
+        confineVMinCPs ( (true true true) (true true true) );
+        confineVMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/naca0012/lift/opt/constraintProjection/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/naca0012/lift/opt/constraintProjection/constant/dynamicMeshDict
index bccb4d7660b821a4db20a18c5f08d2f676a8f68c..39447ce1c85a8416a15269977949eb4f63534de1 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/naca0012/lift/opt/constraintProjection/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/naca0012/lift/opt/constraintProjection/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           ( 0.1 -0.25  -0.1);
         upperCpBounds           ( 0.9  0.25   1.1);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints true;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundVMinCPs ( (true true true) );
-        boundVMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineVMinCPs ( (true true true) );
+        confineVMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/constrained/SQP/Allrun b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/constrained/SQP/Allrun
index 1c5e7996bd44d365917196c26aeb1394a7e6175d..6a63e36ffb520f7090d4d0a6f7e1ec1b82a00c56 100755
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/constrained/SQP/Allrun
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/constrained/SQP/Allrun
@@ -7,7 +7,6 @@ resourcesDir=$FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/resources
 
 \cp -r $resourcesDir/meshes/sbend/polyMesh constant
 runApplication decomposePar
-runParallel writeActiveDesignVariables
 runParallel $(getApplication)
 runParallel cumulativeDisplacement
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/constrained/SQP/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/constrained/SQP/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/constrained/SQP/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/constrained/SQP/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/BFGS/Allrun b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/BFGS/Allrun
index 1c5e7996bd44d365917196c26aeb1394a7e6175d..6a63e36ffb520f7090d4d0a6f7e1ec1b82a00c56 100755
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/BFGS/Allrun
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/BFGS/Allrun
@@ -7,7 +7,6 @@ resourcesDir=$FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/resources
 
 \cp -r $resourcesDir/meshes/sbend/polyMesh constant
 runApplication decomposePar
-runParallel writeActiveDesignVariables
 runParallel $(getApplication)
 runParallel cumulativeDisplacement
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/BFGS/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/BFGS/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/BFGS/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/BFGS/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/SD/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/SD/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/SD/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/SD/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/primalAdjoint/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/primalAdjoint/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/primalAdjoint/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/primalAdjoint/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS-continuation/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS-continuation/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS-continuation/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS-continuation/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/multiPoint/Allrun b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/multiPoint/Allrun
index 1c5e7996bd44d365917196c26aeb1394a7e6175d..6a63e36ffb520f7090d4d0a6f7e1ec1b82a00c56 100755
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/multiPoint/Allrun
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/multiPoint/Allrun
@@ -7,7 +7,6 @@ resourcesDir=$FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/resources
 
 \cp -r $resourcesDir/meshes/sbend/polyMesh constant
 runApplication decomposePar
-runParallel writeActiveDesignVariables
 runParallel $(getApplication)
 runParallel cumulativeDisplacement
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/multiPoint/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/multiPoint/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/multiPoint/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/multiPoint/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op1/Allrun b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op1/Allrun
index 1c5e7996bd44d365917196c26aeb1394a7e6175d..6a63e36ffb520f7090d4d0a6f7e1ec1b82a00c56 100755
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op1/Allrun
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op1/Allrun
@@ -7,7 +7,6 @@ resourcesDir=$FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/resources
 
 \cp -r $resourcesDir/meshes/sbend/polyMesh constant
 runApplication decomposePar
-runParallel writeActiveDesignVariables
 runParallel $(getApplication)
 runParallel cumulativeDisplacement
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op1/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op1/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op1/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op1/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op2/Allrun b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op2/Allrun
index 1c5e7996bd44d365917196c26aeb1394a7e6175d..6a63e36ffb520f7090d4d0a6f7e1ec1b82a00c56 100755
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op2/Allrun
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op2/Allrun
@@ -7,7 +7,6 @@ resourcesDir=$FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/resources
 
 \cp -r $resourcesDir/meshes/sbend/polyMesh constant
 runApplication decomposePar
-runParallel writeActiveDesignVariables
 runParallel $(getApplication)
 runParallel cumulativeDisplacement
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op2/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op2/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op2/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/opt/BFGS/op2/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/primalAdjoint/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/primalAdjoint/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/primalAdjoint/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/primalAdjoint/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }
 
diff --git a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/primalAdjointFullSetup/constant/dynamicMeshDict b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/primalAdjointFullSetup/constant/dynamicMeshDict
index 97e98a99d3cab48d412fa079065e3554a9d49d4a..1d2bc04f8ffb8d23dfd52902f6cdce10d03e97a6 100644
--- a/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/primalAdjointFullSetup/constant/dynamicMeshDict
+++ b/tutorials/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/primalAdjointFullSetup/constant/dynamicMeshDict
@@ -32,15 +32,15 @@ volumetricBSplinesMotionSolverCoeffs
         lowerCpBounds           (-1.1 -0.21 -0.05);
         upperCpBounds           ( 1.1  0.39  0.15);
 
-        confineX1movement false;
-        confineX2movement false;
-        confineX3movement true;
+        confineUMovement false;
+        confineVMovement false;
+        confineWMovement true;
         confineBoundaryControlPoints false;
 
-        boundUMinCPs ( (true true true) (true true true) );
-        boundUMaxCPs ( (true true true) (true true true) );
-        boundWMinCPs ( (true true true) );
-        boundWMaxCPs ( (true true true) );
+        confineUMinCPs ( (true true true) (true true true) );
+        confineUMaxCPs ( (true true true) (true true true) );
+        confineWMinCPs ( (true true true) );
+        confineWMaxCPs ( (true true true) );
     }
 }