diff --git a/src/functionObjects/forces/forceCoeffs/forceCoeffs.C b/src/functionObjects/forces/forceCoeffs/forceCoeffs.C
index d9807ec9764dbb06d803c91bbf41d605219cf9db..f793922e4c9b99e4ae3f2458e61bcbbfcf45fddf 100644
--- a/src/functionObjects/forces/forceCoeffs/forceCoeffs.C
+++ b/src/functionObjects/forces/forceCoeffs/forceCoeffs.C
@@ -61,13 +61,69 @@ void Foam::functionObjects::forceCoeffs::initialise()
 }
 
 
+Foam::volVectorField& Foam::functionObjects::forceCoeffs::forceCoeff()
+{
+    auto* coeffPtr =
+        mesh_.getObjectPtr<volVectorField>(scopedName("forceCoeff"));
+
+    if (!coeffPtr)
+    {
+        coeffPtr = new volVectorField
+        (
+            IOobject
+            (
+                scopedName("forceCoeff"),
+                time_.timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            mesh_,
+            dimensionedVector(dimless, Zero)
+        );
+
+        mesh_.objectRegistry::store(coeffPtr);
+    }
+
+    return *coeffPtr;
+}
+
+
+Foam::volVectorField& Foam::functionObjects::forceCoeffs::momentCoeff()
+{
+    auto* coeffPtr =
+        mesh_.getObjectPtr<volVectorField>(scopedName("momentCoeff"));
+
+    if (!coeffPtr)
+    {
+        coeffPtr = new volVectorField
+        (
+            IOobject
+            (
+                scopedName("momentCoeff"),
+                time_.timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            mesh_,
+            dimensionedVector(dimless, Zero)
+        );
+
+        mesh_.objectRegistry::store(coeffPtr);
+    }
+
+    return *coeffPtr;
+}
+
+
 void Foam::functionObjects::forceCoeffs::reset()
 {
     Cf_.reset();
     Cm_.reset();
 
-    forceCoeff_ == dimensionedVector(dimless, Zero);
-    momentCoeff_ == dimensionedVector(dimless, Zero);
+    forceCoeff() == dimensionedVector(dimless, Zero);
+    momentCoeff() == dimensionedVector(dimless, Zero);
 }
 
 
@@ -111,7 +167,7 @@ void Foam::functionObjects::forceCoeffs::calcForceCoeffs()
     const auto& coordSys = coordSysPtr_();
 
     // Calculate force coefficients
-    forceCoeff_ = forceScaling*force_;
+    forceCoeff() = forceScaling*force();
 
     Cf_.reset
     (
@@ -135,7 +191,7 @@ void Foam::functionObjects::forceCoeffs::calcMomentCoeffs()
     const auto& coordSys = coordSysPtr_();
 
     // Calculate moment coefficients
-    momentCoeff_ = momentScaling*moment_;
+    momentCoeff() = momentScaling*moment();
 
     Cm_.reset
     (
@@ -225,32 +281,6 @@ Foam::functionObjects::forceCoeffs::forceCoeffs
     forces(name, runTime, dict, false),
     Cf_(),
     Cm_(),
-    forceCoeff_
-    (
-        IOobject
-        (
-            "forceCoeff", // scopedName() is not available at ctor level
-            mesh_.time().timeName(),
-            mesh_,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
-        mesh_,
-        dimensionedVector(dimless, Zero)
-    ),
-    momentCoeff_
-    (
-        IOobject
-        (
-            "momentCoeff",
-            mesh_.time().timeName(),
-            mesh_,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
-        mesh_,
-        dimensionedVector(dimless, Zero)
-    ),
     coeffFilePtr_(),
     magUInf_(Zero),
     lRef_(Zero),
@@ -342,9 +372,6 @@ bool Foam::functionObjects::forceCoeffs::read(const dictionary& dict)
         }
     }
 
-    forceCoeff_.rename(scopedName("forceCoeff"));
-    momentCoeff_.rename(scopedName("momentCoeff"));
-
     Info<< endl;
 
     return true;
@@ -421,8 +448,8 @@ bool Foam::functionObjects::forceCoeffs::write()
 
     if (writeFields_)
     {
-        forceCoeff_.write();
-        momentCoeff_.write();
+        forceCoeff().write();
+        momentCoeff().write();
     }
 
     Log << endl;
diff --git a/src/functionObjects/forces/forceCoeffs/forceCoeffs.H b/src/functionObjects/forces/forceCoeffs/forceCoeffs.H
index 85fbe23d2ed11ce8184d610ef429ef6d46150950..997f36ac2b0c916c69498d2d05bef285d944582d 100644
--- a/src/functionObjects/forces/forceCoeffs/forceCoeffs.H
+++ b/src/functionObjects/forces/forceCoeffs/forceCoeffs.H
@@ -431,12 +431,6 @@ private:
         //- Moment components
         forceComponents Cm_;
 
-        //- Force coefficient field
-        volVectorField forceCoeff_;
-
-        //- Moment coefficient field
-        volVectorField momentCoeff_;
-
         //- Operand force and moment coefficients
         HashTable<coeffDesc> coeffs_;
 
@@ -470,6 +464,13 @@ protected:
         //- Initialise containers and fields
         void initialise();
 
+        //- Return access to the force coefficients field
+        volVectorField& forceCoeff();
+
+        //- Return access to the moment coefficients field
+        volVectorField& momentCoeff();
+
+
         //- Reset containers and fields
         void reset();
 
diff --git a/src/functionObjects/forces/forces/forces.C b/src/functionObjects/forces/forces/forces.C
index 5916aa2a61fcc6e16837ac5b9cf480dbca28b765..c1509c733d539383764b87b52e6795c1df326170 100644
--- a/src/functionObjects/forces/forces/forces.C
+++ b/src/functionObjects/forces/forces/forces.C
@@ -91,6 +91,60 @@ void Foam::functionObjects::forces::setCoordinateSystem
 }
 
 
+Foam::volVectorField& Foam::functionObjects::forces::force()
+{
+    auto* forcePtr = mesh_.getObjectPtr<volVectorField>(scopedName("force"));
+
+    if (!forcePtr)
+    {
+        forcePtr = new volVectorField
+        (
+            IOobject
+            (
+                scopedName("force"),
+                time_.timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            mesh_,
+            dimensionedVector(dimForce, Zero)
+        );
+
+        mesh_.objectRegistry::store(forcePtr);
+    }
+
+    return *forcePtr;
+}
+
+
+Foam::volVectorField& Foam::functionObjects::forces::moment()
+{
+    auto* momentPtr = mesh_.getObjectPtr<volVectorField>(scopedName("moment"));
+
+    if (!momentPtr)
+    {
+        momentPtr = new volVectorField
+        (
+            IOobject
+            (
+                scopedName("moment"),
+                time_.timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            mesh_,
+            dimensionedVector(dimForce*dimLength, Zero)
+        );
+
+        mesh_.objectRegistry::store(momentPtr);
+    }
+
+    return *momentPtr;
+}
+
+
 void Foam::functionObjects::forces::initialise()
 {
     if (initialised_)
@@ -143,8 +197,10 @@ void Foam::functionObjects::forces::reset()
     sumInternalForces_ = Zero;
     sumInternalMoments_ = Zero;
 
-    force_ == dimensionedVector(force_.dimensions(), Zero);
-    moment_ == dimensionedVector(moment_.dimensions(), Zero);
+    auto& force = this->force();
+    auto& moment = this->moment();
+    force == dimensionedVector(force.dimensions(), Zero);
+    moment == dimensionedVector(moment.dimensions(), Zero);
 }
 
 
@@ -291,14 +347,14 @@ void Foam::functionObjects::forces::addToPatchFields
 {
     sumPatchForcesP_ += sum(fP);
     sumPatchForcesV_ += sum(fV);
-    force_.boundaryFieldRef()[patchi] += fP + fV;
+    force().boundaryFieldRef()[patchi] += fP + fV;
 
     const vectorField mP(Md^fP);
     const vectorField mV(Md^fV);
 
     sumPatchMomentsP_ += sum(mP);
     sumPatchMomentsV_ += sum(mV);
-    moment_.boundaryFieldRef()[patchi] += mP + mV;
+    moment().boundaryFieldRef()[patchi] += mP + mV;
 }
 
 
@@ -309,16 +365,19 @@ void Foam::functionObjects::forces::addToInternalField
     const vectorField& f
 )
 {
+    auto& force = this->force();
+    auto& moment = this->moment();
+
     forAll(cellIDs, i)
     {
         const label celli = cellIDs[i];
 
         sumInternalForces_ += f[i];
-        force_[celli] += f[i];
+        force[celli] += f[i];
 
         const vector m(Md[i]^f[i]);
         sumInternalMoments_ += m;
-        moment_[celli] = m;
+        moment[celli] = m;
     }
 }
 
@@ -449,32 +508,6 @@ Foam::functionObjects::forces::forces
 :
     fvMeshFunctionObject(name, runTime, dict),
     writeFile(mesh_, name),
-    force_
-    (
-        IOobject
-        (
-            "force", // scopedName() is not available at ctor level
-            time_.timeName(),
-            mesh_,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
-        mesh_,
-        dimensionedVector(dimForce, Zero)
-    ),
-    moment_
-    (
-        IOobject
-        (
-            "moment",
-            time_.timeName(),
-            mesh_,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
-        mesh_,
-        dimensionedVector(dimForce*dimLength, Zero)
-    ),
     sumPatchForcesP_(Zero),
     sumPatchForcesV_(Zero),
     sumPatchMomentsP_(Zero),
@@ -515,32 +548,6 @@ Foam::functionObjects::forces::forces
 :
     fvMeshFunctionObject(name, obr, dict),
     writeFile(mesh_, name),
-    force_
-    (
-        IOobject
-        (
-            "force",
-            time_.timeName(),
-            mesh_,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
-        mesh_,
-        dimensionedVector(dimForce, Zero)
-    ),
-    moment_
-    (
-        IOobject
-        (
-            "moment",
-            time_.timeName(),
-            mesh_,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
-        mesh_,
-        dimensionedVector(dimForce*dimLength, Zero)
-    ),
     sumPatchForcesP_(Zero),
     sumPatchForcesV_(Zero),
     sumPatchMomentsP_(Zero),
@@ -645,8 +652,6 @@ bool Foam::functionObjects::forces::read(const dictionary& dict)
         Info<< "    Fields will be written" << endl;
     }
 
-    force_.rename(scopedName("force"));
-    moment_.rename(scopedName("moment"));
 
     return true;
 }
@@ -823,8 +828,8 @@ bool Foam::functionObjects::forces::write()
     {
         Log << "    writing force and moment fields." << endl;
 
-        force_.write();
-        moment_.write();
+        force().write();
+        moment().write();
     }
 
     Log << endl;
diff --git a/src/functionObjects/forces/forces/forces.H b/src/functionObjects/forces/forces/forces.H
index da01eff4af34119614338c52b5ba40dd610f0d5f..808ba321a8ea823091bcbc904a0823673bff5a99 100644
--- a/src/functionObjects/forces/forces/forces.H
+++ b/src/functionObjects/forces/forces/forces.H
@@ -173,7 +173,7 @@ SourceFiles
 #include "fvMeshFunctionObject.H"
 #include "writeFile.H"
 #include "coordinateSystem.H"
-#include "volFields.H"
+#include "volFieldsFwd.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -198,12 +198,6 @@ protected:
 
         // Fields
 
-            //- Forces
-            volVectorField force_;
-
-            //- Moments
-            volVectorField moment_;
-
             //- Sum of patch pressure forces
             vector sumPatchForcesP_;
 
@@ -281,13 +275,18 @@ protected:
             const word& e1Name = word::null
         );
 
+        //- Return access to the force field
+        volVectorField& force();
+
+        //- Return access to the moment field
+        volVectorField& moment();
+
         //- Initialise containers and fields
         void initialise();
 
         //- Reset containers and fields
         void reset();
 
-
     // Evaluation
 
         //- Return the effective stress (viscous + turbulent)