diff --git a/applications/utilities/preProcessing/setExprBoundaryFields/readFields.H b/applications/utilities/preProcessing/setExprBoundaryFields/readFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..224b906fd2551676fc7e4058984fc81d922ea0f2
--- /dev/null
+++ b/applications/utilities/preProcessing/setExprBoundaryFields/readFields.H
@@ -0,0 +1,190 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2021 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::readFieldsHandler
+
+Description
+    A simple field-loader, as per the readFields function object
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef readFieldsHander_H
+#define readFieldsHander_H
+
+#include "fvMesh.H"
+#include "volFields.H"
+#include "surfaceFields.H"
+#include "messageStream.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class readFieldsHandler Declaration
+\*---------------------------------------------------------------------------*/
+
+class readFieldsHandler
+{
+    // Private Data
+
+        //- Mesh reference
+        fvMesh& mesh_;
+
+        //- Output logging (verbosity)
+        bool log;
+
+
+    // Private Member Functions
+
+        //- Attempt load from io, store on database if successful
+        template<class FieldType>
+        bool loadAndStore(const IOobject& io)
+        {
+            if (FieldType::typeName == io.headerClassName())
+            {
+                // Store field on mesh database
+                Log << "    Reading " << io.name()
+                    << " (" << FieldType::typeName << ')' << endl;
+
+                mesh_.objectRegistry::store(new FieldType(io, mesh_));
+                return true;
+            }
+
+            return false;
+        }
+
+        //- Forward to loadAndStore for supported types
+        template<class Type>
+        bool loadField(const IOobject& io)
+        {
+            typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
+            typedef typename VolFieldType::Internal IntVolFieldType;
+            typedef GeometricField<Type, fvsPatchField, surfaceMesh>
+                SurfaceFieldType;
+
+            return
+            (
+                loadAndStore<VolFieldType>(io)
+             || loadAndStore<IntVolFieldType>(io)
+             || loadAndStore<SurfaceFieldType>(io)
+            );
+        }
+
+
+        //- Load all fields
+        label loadFields(const UList<word>& fieldSet_)
+        {
+            label nLoaded = 0;
+
+            for (const word& fieldName : fieldSet_)
+            {
+                // Already loaded?
+                const auto* ptr = mesh_.cfindObject<regIOobject>(fieldName);
+
+                if (ptr)
+                {
+                    ++nLoaded;
+                    DebugInfo
+                        << "readFields : "
+                        << ptr->name() << " (" << ptr->type()
+                            << ") already in database" << endl;
+                    continue;
+                }
+
+                // Load field as necessary
+                IOobject io
+                (
+                    fieldName,
+                    mesh_.time().timeName(),
+                    mesh_,
+                    IOobject::MUST_READ,
+                    IOobject::NO_WRITE
+                );
+
+                const bool ok =
+                (
+                    io.typeHeaderOk<regIOobject>(false) // Preload header info
+                 && !io.headerClassName().empty()       // Extra safety
+                 &&
+                    (
+                        loadField<scalar>(io)
+                     || loadField<vector>(io)
+                     || loadField<sphericalTensor>(io)
+                     || loadField<symmTensor>(io)
+                     || loadField<tensor>(io)
+                    )
+                );
+
+                if (ok)
+                {
+                    ++nLoaded;
+                }
+                else
+                {
+                    DebugInfo
+                        << "readFields : failed to load " << fieldName
+                        << endl;
+                }
+        }
+
+        return nLoaded;
+    }
+
+
+public:
+
+    static const bool debug = false;
+
+
+    // Constructors
+
+        //- Construct
+        explicit readFieldsHandler(fvMesh& mesh, bool verbose=true)
+        :
+            mesh_(mesh),
+            log(verbose)
+        {}
+
+
+    // Member Functions
+
+        bool execute(const UList<word>& fieldNames)
+        {
+            loadFields(fieldNames);
+            return true;
+        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/preProcessing/setExprBoundaryFields/setExprBoundaryFields.C b/applications/utilities/preProcessing/setExprBoundaryFields/setExprBoundaryFields.C
index 179361cdc36a2b2b726ac778778bc47011b34b6d..d6d240ba9e9d81e6cce9ed9e50725d983233ccea 100644
--- a/applications/utilities/preProcessing/setExprBoundaryFields/setExprBoundaryFields.C
+++ b/applications/utilities/preProcessing/setExprBoundaryFields/setExprBoundaryFields.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -44,10 +44,10 @@ Note
 #include "pointMesh.H"
 #include "volFields.H"
 #include "surfaceFields.H"
-#include "surfaceFields.H"
 #include "pointFields.H"
 #include "patchExprDriver.H"
 #include "timeSelector.H"
+#include "readFields.H"
 
 using namespace Foam;
 
@@ -67,20 +67,25 @@ int main(int argc, char *argv[])
         "file",
         "Alternative dictionary for setExprBoundaryFieldsDict"
     );
-
     argList::addBoolOption
     (
         "cache-fields",
         "Cache fields between calls",
         true // Advanced
     );
+    argList::addOption
+    (
+        "load-fields",
+        "wordList",
+        "Specify field or fields to preload. Eg, 'T' or '(p T U)'",
+        true // Advanced
+    );
     argList::addBoolOption
     (
         "backup",
         "Preserve sub-entry as .backup",
         true // Advanced
     );
-
     argList::addBoolOption
     (
         "dry-run",
@@ -128,12 +133,29 @@ int main(int argc, char *argv[])
 
         mesh.readUpdate();
 
+        // preload fields specified on command-line
+        if (timei == 0)
+        {
+            wordList preloadFields;
+            args.readListIfPresent("load-fields", preloadFields);
+            readFieldsHandler(mesh).execute(preloadFields);
+        }
+        // preload fields specified in dictionary
+        {
+            wordList preloadFields;
+            setExprDict.readIfPresent("readFields", preloadFields);
+            readFieldsHandler(mesh).execute(preloadFields);
+        }
+
         for (const entry& dEntry : setExprDict)
         {
             if (!dEntry.isDict())
             {
-                Info<< "Ignoring non-dictionary entry "
-                    << dEntry.keyword() << nl;
+                if (dEntry.keyword() != "readFields")
+                {
+                    Info<< "Ignoring non-dictionary entry "
+                        << dEntry.keyword() << nl;
+                }
                 continue;
             }
 
@@ -193,8 +215,8 @@ int main(int argc, char *argv[])
 
             for (const dictionary& currDict : exprDicts)
             {
-                const word targetName = currDict.get<word>("target");
-                const word patchName = currDict.get<word>("patch");
+                const word patchName(currDict.get<word>("patch"));
+                const word targetName(currDict.get<word>("target"));
 
                 dictionary& patchDict = boundaryFieldDict.subDict(patchName);
 
diff --git a/applications/utilities/preProcessing/setExprFields/readFields.H b/applications/utilities/preProcessing/setExprFields/readFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..224b906fd2551676fc7e4058984fc81d922ea0f2
--- /dev/null
+++ b/applications/utilities/preProcessing/setExprFields/readFields.H
@@ -0,0 +1,190 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2021 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::readFieldsHandler
+
+Description
+    A simple field-loader, as per the readFields function object
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef readFieldsHander_H
+#define readFieldsHander_H
+
+#include "fvMesh.H"
+#include "volFields.H"
+#include "surfaceFields.H"
+#include "messageStream.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class readFieldsHandler Declaration
+\*---------------------------------------------------------------------------*/
+
+class readFieldsHandler
+{
+    // Private Data
+
+        //- Mesh reference
+        fvMesh& mesh_;
+
+        //- Output logging (verbosity)
+        bool log;
+
+
+    // Private Member Functions
+
+        //- Attempt load from io, store on database if successful
+        template<class FieldType>
+        bool loadAndStore(const IOobject& io)
+        {
+            if (FieldType::typeName == io.headerClassName())
+            {
+                // Store field on mesh database
+                Log << "    Reading " << io.name()
+                    << " (" << FieldType::typeName << ')' << endl;
+
+                mesh_.objectRegistry::store(new FieldType(io, mesh_));
+                return true;
+            }
+
+            return false;
+        }
+
+        //- Forward to loadAndStore for supported types
+        template<class Type>
+        bool loadField(const IOobject& io)
+        {
+            typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
+            typedef typename VolFieldType::Internal IntVolFieldType;
+            typedef GeometricField<Type, fvsPatchField, surfaceMesh>
+                SurfaceFieldType;
+
+            return
+            (
+                loadAndStore<VolFieldType>(io)
+             || loadAndStore<IntVolFieldType>(io)
+             || loadAndStore<SurfaceFieldType>(io)
+            );
+        }
+
+
+        //- Load all fields
+        label loadFields(const UList<word>& fieldSet_)
+        {
+            label nLoaded = 0;
+
+            for (const word& fieldName : fieldSet_)
+            {
+                // Already loaded?
+                const auto* ptr = mesh_.cfindObject<regIOobject>(fieldName);
+
+                if (ptr)
+                {
+                    ++nLoaded;
+                    DebugInfo
+                        << "readFields : "
+                        << ptr->name() << " (" << ptr->type()
+                            << ") already in database" << endl;
+                    continue;
+                }
+
+                // Load field as necessary
+                IOobject io
+                (
+                    fieldName,
+                    mesh_.time().timeName(),
+                    mesh_,
+                    IOobject::MUST_READ,
+                    IOobject::NO_WRITE
+                );
+
+                const bool ok =
+                (
+                    io.typeHeaderOk<regIOobject>(false) // Preload header info
+                 && !io.headerClassName().empty()       // Extra safety
+                 &&
+                    (
+                        loadField<scalar>(io)
+                     || loadField<vector>(io)
+                     || loadField<sphericalTensor>(io)
+                     || loadField<symmTensor>(io)
+                     || loadField<tensor>(io)
+                    )
+                );
+
+                if (ok)
+                {
+                    ++nLoaded;
+                }
+                else
+                {
+                    DebugInfo
+                        << "readFields : failed to load " << fieldName
+                        << endl;
+                }
+        }
+
+        return nLoaded;
+    }
+
+
+public:
+
+    static const bool debug = false;
+
+
+    // Constructors
+
+        //- Construct
+        explicit readFieldsHandler(fvMesh& mesh, bool verbose=true)
+        :
+            mesh_(mesh),
+            log(verbose)
+        {}
+
+
+    // Member Functions
+
+        bool execute(const UList<word>& fieldNames)
+        {
+            loadFields(fieldNames);
+            return true;
+        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/preProcessing/setExprFields/setExprFields.C b/applications/utilities/preProcessing/setExprFields/setExprFields.C
index 57e05ad4cb3a184b132da2b1176c1885a1ae62ed..0865b407af68cb27dc54dd2c6e2636cb48f1f9cb 100644
--- a/applications/utilities/preProcessing/setExprFields/setExprFields.C
+++ b/applications/utilities/preProcessing/setExprFields/setExprFields.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2019-2020 OpenCFD Ltd.
+    Copyright (C) 2019-2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -44,12 +44,11 @@ Note
 #include "pointMesh.H"
 #include "volFields.H"
 #include "surfaceFields.H"
-#include "surfaceFields.H"
 #include "pointFields.H"
 #include "exprOps.H"
 #include "volumeExprDriver.H"
 #include "timeSelector.H"
-#include "dlLibraryTable.H"
+#include "readFields.H"
 
 
 using namespace Foam;
@@ -175,7 +174,7 @@ void setField
 
     if (cond.empty())
     {
-        // No condition
+        // No condition - set all
         output = result;
 
         setCells = output.size();
@@ -288,12 +287,16 @@ void evaluate
         << "Expression:" << nl
         << ">>>>" << nl
         << expression.c_str() << nl
-        << "<<<<" << nl
-        << "Condition:" << nl
-        << ">>>>" << nl
-        << condition.c_str() << nl
         << "<<<<" << nl;
 
+    if (condition.size() && condition != "true")
+    {
+        Info<< "Condition:" << nl
+            << ">>>>" << nl
+            << condition.c_str() << nl
+            << "<<<<" << nl;
+    }
+
     if (ctrl.keepPatches)
     {
         Info<< "Keeping patches unaltered" << endl;
@@ -542,32 +545,38 @@ int main(int argc, char *argv[])
         "file",
         "Alternative dictionary for setExprFieldsDict"
     );
-
     argList::addBoolOption
     (
         "dry-run",
         "Evaluate but do not write"
     );
-
     argList::addBoolOption
     (
         "verbose",
         "Additional verbosity",
         true // Advanced option
     );
-
+    argList::addOption
+    (
+        "load-fields",
+        "wordList",
+        "Specify field or fields to preload. Eg, 'T' or '(p T U)'",
+        true // Advanced option
+    );
     argList::addOption
     (
         "field",
         "name",
-        "The field to overwrite command-line operation)",
+        "The field to overwrite"
+        " (command-line operation)",
         true // Advanced option
     );
     argList::addOption
     (
         "expression",
         "expr",
-        "The expression to evaluate (command-line operation)",
+        "The expression to evaluate"
+        " (command-line operation)",
         true // Advanced option
     );
     argList::addOption
@@ -582,7 +591,7 @@ int main(int argc, char *argv[])
     (
         "dimension",
         "dims",
-        "The dimensions to apply for created fields"
+        "The dimensions for created fields"
         " (command-line operation)",
         true // Advanced option
     );
@@ -601,7 +610,8 @@ int main(int argc, char *argv[])
     argList::addBoolOption
     (
         "create",
-        "Create a new field (command-line operation)",
+        "Create a new field"
+        " (command-line operation)",
         true // Advanced option
     );
     argList::addBoolOption
@@ -714,7 +724,6 @@ int main(int argc, char *argv[])
         exprDictPtr.reset(new IOdictionary(dictIO));
     }
 
-
     forAll(times, timei)
     {
         runTime.setTime(times[timei], timei);
@@ -723,6 +732,14 @@ int main(int argc, char *argv[])
 
         mesh.readUpdate();
 
+        // preload fields specified on command-line
+        if (timei == 0)
+        {
+            wordList preloadFields;
+            args.readListIfPresent("load-fields", preloadFieldNames);
+            readFieldsHandler(mesh).execute(preloadFields);
+        }
+
         if (args.found("dummy-phi") && !dummyPhi)
         {
             Info<< "Adding a dummy phi" << endl;
@@ -806,6 +823,13 @@ int main(int argc, char *argv[])
         {
             const dictionary& exprDict = *exprDictPtr;
 
+            // preload fields specified in dictionary
+            {
+                wordList preloadFields;
+                exprDict.readIfPresent("readFields", preloadFields);
+                readFieldsHandler(mesh).execute(preloadFields);
+            }
+
             // Read set construct info from dictionary
             PtrList<entry> actions(exprDict.lookup("expressions"));
 
diff --git a/etc/caseDicts/annotated/setExprBoundaryFieldsDict b/etc/caseDicts/annotated/setExprBoundaryFieldsDict
index 4435b6b622379760b5950710df54f7b811394ea6..54562d32b01249b95b6e3765daf4aa7926d94dff 100644
--- a/etc/caseDicts/annotated/setExprBoundaryFieldsDict
+++ b/etc/caseDicts/annotated/setExprBoundaryFieldsDict
@@ -14,6 +14,9 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+// Preload any required fields (optional)
+readFields      ( U );
+
 pattern
 {
     field   T;
diff --git a/etc/caseDicts/annotated/setExprFieldsDict b/etc/caseDicts/annotated/setExprFieldsDict
index ad72aed963f903f982cbc47032f21d1158f94ab9..c2066852d7a997d1a28ffde884331f78db62d5f3 100644
--- a/etc/caseDicts/annotated/setExprFieldsDict
+++ b/etc/caseDicts/annotated/setExprFieldsDict
@@ -14,6 +14,9 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+// Preload any required fields (optional)
+readFields      ( U );
+
 expressions
 (
     T
diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/Allrun b/tutorials/incompressible/simpleFoam/turbineSiting/Allrun
index 86a3f1fc77c957dace816317476ec0e6edba89c4..426d4057b4f20e478889b1606d40f405e5354a89 100755
--- a/tutorials/incompressible/simpleFoam/turbineSiting/Allrun
+++ b/tutorials/incompressible/simpleFoam/turbineSiting/Allrun
@@ -28,4 +28,8 @@ runApplication reconstructParMesh -constant
 
 runApplication reconstructPar
 
+runApplication setExprFields -latestTime  ## -load-fields U
+
+runApplication setExprBoundaryFields -latestTime  ## -load-fields '(U)'
+
 #------------------------------------------------------------------------------
diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprBoundaryFieldsDict b/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprBoundaryFieldsDict
new file mode 100644
index 0000000000000000000000000000000000000000..4cf97c4ea89959d3db1ba4ac5fe11f5ead33485c
--- /dev/null
+++ b/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprBoundaryFieldsDict
@@ -0,0 +1,41 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2012                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      setExprBoundaryFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Preload any required fields (optional)
+readFields      ( U );
+
+updateBCs
+{
+    field   windPowerDensity;
+
+    _value1
+    {
+        target      value;
+        variables   ( "rho=1.2" );
+        expression  #{ 0.5*rho*cbrt(mag(U)) #};
+    }
+
+    expressions
+    (
+        { $_value1; patch inlet; }
+        { $_value1; patch outlet; }
+        { $_value1; patch sides; }
+        { $_value1; patch top; }
+    );
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprFieldsDict b/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprFieldsDict
new file mode 100644
index 0000000000000000000000000000000000000000..73092c745f433fdb743b87007b1e77b894d5210e
--- /dev/null
+++ b/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprFieldsDict
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2012                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      setExprFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Preload any required fields (optional)
+readFields      ( U );
+
+_value1
+{
+    variables   ( "rho=1.2" );
+    expression  #{ 0.5*rho*cbrt(mag(U)) #};
+}
+
+expressions
+(
+    windPowerDensity
+    {
+        field   windPowerDensity;
+        create  yes;
+        $_value1;
+    }
+);
+
+
+// ************************************************************************* //