diff --git a/src/functionObjects/utilities/Make/files b/src/functionObjects/utilities/Make/files
index e9bb23307d..240c0a24e9 100644
--- a/src/functionObjects/utilities/Make/files
+++ b/src/functionObjects/utilities/Make/files
@@ -10,6 +10,8 @@ ensightWrite/ensightWriteUpdate.C
vtkWrite/vtkWrite.C
vtkWrite/vtkWriteUpdate.C
+multiRegion/multiRegion.C
+
removeRegisteredObject/removeRegisteredObject.C
parProfiling/parProfiling.C
diff --git a/src/functionObjects/utilities/multiRegion/multiRegion.C b/src/functionObjects/utilities/multiRegion/multiRegion.C
new file mode 100644
index 0000000000..c09eefa572
--- /dev/null
+++ b/src/functionObjects/utilities/multiRegion/multiRegion.C
@@ -0,0 +1,169 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "multiRegion.H"
+#include "fvMesh.H"
+#include "timeControlFunctionObject.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+ defineTypeNameAndDebug(multiRegion, 0);
+
+ addToRunTimeSelectionTable
+ (
+ functionObject,
+ multiRegion,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::functionObjects::multiRegion::multiRegion
+(
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+)
+:
+ timeFunctionObject(name, runTime)
+{
+ read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::multiRegion::read(const dictionary& dict)
+{
+ if (functionObject::read(dict))
+ {
+ Info<< type() << ' ' << name() << ':' << nl;
+
+ wordRes regionMatcher;
+
+ const bool matchAny =
+ !dict.readIfPresent("regions", regionMatcher);
+
+ const dictionary& functionDict = dict.subDict("function");
+
+ const wordList allRegions(time_.sortedNames());
+ functions_.resize(allRegions.size());
+
+ const bool needsTimeControl = timeControl::entriesPresent(functionDict);
+
+ label functioni = 0;
+ for (const word& regionName : allRegions)
+ {
+ if (matchAny || regionMatcher.match(regionName))
+ {
+ const word localName(IOobject::scopedName(name(), regionName));
+
+ dictionary regionDict(functionDict);
+ regionDict.add("region", regionName);
+
+ if (needsTimeControl)
+ {
+ functions_.set
+ (
+ functioni,
+ new timeControl(localName, time_, regionDict)
+ );
+ }
+ else
+ {
+ functions_.set
+ (
+ functioni,
+ functionObject::New(localName, time_, regionDict)
+ );
+ }
+
+ ++functioni;
+ }
+ }
+
+ functions_.resize(functioni);
+
+ if (functions_.empty())
+ {
+ WarningInFunction
+ << "No regions applied"
+ << endl;
+
+ return false;
+ }
+
+ Info<< " Spawned additional object(s):" << nl;
+ for (const auto& f : functions_)
+ {
+ Info<< " " << f.name() << nl;
+ }
+
+ Info<< endl;
+
+ return true;
+ }
+
+ return false;
+}
+
+
+bool Foam::functionObjects::multiRegion::execute()
+{
+ bool result = true;
+
+ for (auto& f : functions_)
+ {
+ result = f.execute() && result;
+ }
+
+ return result;
+}
+
+
+bool Foam::functionObjects::multiRegion::write()
+{
+ bool result = true;
+
+ for (auto& f : functions_)
+ {
+ result = f.write() && result;
+ }
+
+ return result;
+}
+
+
+// ************************************************************************* //
diff --git a/src/functionObjects/utilities/multiRegion/multiRegion.H b/src/functionObjects/utilities/multiRegion/multiRegion.H
new file mode 100644
index 0000000000..41f9c19464
--- /dev/null
+++ b/src/functionObjects/utilities/multiRegion/multiRegion.H
@@ -0,0 +1,158 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+Class
+ Foam::functionObjects::multiRegion
+
+Group
+ grpUtilitiesFunctionObjects
+
+Description
+ Wrapper that clones the supplied function object for each region.
+
+ Simplifies the setup of identical post-processing requirements for
+ multi-region cases.
+ Applies the supplied function to all regions by default.
+
+Usage
+ Minimal example by using \c system/controlDict.functions:
+ \verbatim
+ multiRegion
+ {
+ // Mandatory entries
+ type multiRegion;
+ libs (utilityFunctionObjects);
+
+ function
+ {
+ // Actual object specification
+ type fieldMinMax;
+ libs (fieldFunctionObjects);
+ fields ( ... );
+ }
+
+ // Optional entries
+ regions (region1 region2);
+ }
+ \endverbatim
+
+ where the entries mean:
+ \table
+ Property | Description | Type | Reqd | Deflt
+ type | Type name: multiRegion | word | yes | -
+ libs | Library name: utilityFunctionObjects | word | yes | -
+ function | Function object sub-dictionary | dict | yes | -
+ regions | List of region names | wordList | no | all
+ \endtable
+
+See also
+ - Foam::functionObject
+
+SourceFiles
+ multiRegion.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_multiRegion_H
+#define functionObjects_multiRegion_H
+
+#include "timeFunctionObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+ Class multiRegion Declaration
+\*---------------------------------------------------------------------------*/
+
+class multiRegion
+:
+ public functionObjects::timeFunctionObject
+{
+protected:
+
+ // Protected Data
+
+ //- List of cloned objects (1 per region)
+ PtrList functions_;
+
+
+ // Protected Member Functions
+
+ //- No copy construct
+ multiRegion(const multiRegion&) = delete;
+
+ //- No copy assignment
+ void operator=(const multiRegion&) = delete;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("multiRegion");
+
+
+ // Constructors
+
+ //- Construct from Time and dictionary
+ multiRegion
+ (
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+ );
+
+
+ //- Destructor
+ virtual ~multiRegion() = default;
+
+
+ // Member Functions
+
+ //- Read the controls
+ virtual bool read(const dictionary& dict);
+
+ //- Execute, currently does nothing
+ virtual bool execute();
+
+ //- Write the multiRegion
+ virtual bool write();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/system/controlDict b/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/system/controlDict
index 80636743d5..4483c1eec3 100644
--- a/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/system/controlDict
+++ b/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/system/controlDict
@@ -1,7 +1,7 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
-| \\ / O peration | Version: v2012 |
+| \\ / O peration | Version: v2106 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
@@ -44,5 +44,24 @@ timePrecision 6;
runTimeModifiable true;
+functions
+{
+ multiRegion
+ {
+ type multiRegion;
+ libs (utilityFunctionObjects);
+
+ // regions ( ".*Air" );
+
+ function
+ {
+ // Actual object specification
+ type fieldMinMax;
+ libs (fieldFunctionObjects);
+ fields (T);
+ }
+ }
+}
+
// ************************************************************************* //