diff --git a/applications/test/testFunctionObjects/Make/files b/applications/test/testFunctionObjects/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..618eaa1dd4f22c63655f5d4b77bdce9ce491bae4
--- /dev/null
+++ b/applications/test/testFunctionObjects/Make/files
@@ -0,0 +1,3 @@
+fakeError/fakeErrorFunctionObject.C
+
+LIB = $(FOAM_USER_LIBBIN)/libtestFunctionObjects
diff --git a/applications/test/testFunctionObjects/Make/options b/applications/test/testFunctionObjects/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..6b8588463d9782589e3443f8bb381f736ff3ddfa
--- /dev/null
+++ b/applications/test/testFunctionObjects/Make/options
@@ -0,0 +1,2 @@
+/* EXE_INC = */
+/* LIB_LIBS = */
diff --git a/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.C b/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.C
new file mode 100644
index 0000000000000000000000000000000000000000..9dda6a4a421caa8d7762cda8be0b4614ea7238b1
--- /dev/null
+++ b/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.C
@@ -0,0 +1,146 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 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/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fakeErrorFunctionObject.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+    defineTypeNameAndDebug(fakeErrorFunctionObject, 0);
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        fakeErrorFunctionObject,
+        dictionary
+    );
+}
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::functionObjects::fakeErrorFunctionObject::emitError
+(
+    const char* what
+) const
+{
+
+    if (ioError_)
+    {
+        FatalIOError
+            << "Error on " << what << " : " << name() << nl
+            << exit(FatalIOError);
+    }
+    else
+    {
+        FatalError
+            << "Error on " << what << " : " << name() << nl
+            << exit(FatalError);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::functionObjects::fakeErrorFunctionObject::fakeErrorFunctionObject
+(
+    const word& name,
+    const Time& runTime,
+    const dictionary& dict
+)
+:
+    timeFunctionObject(name, runTime),
+    ioError_(false),
+    constructError_(false),
+    executeError_(false),
+    writeError_(false)
+{
+    read(dict);
+
+    if (constructError_)
+    {
+        emitError("construct");
+    }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::fakeErrorFunctionObject::read
+(
+    const dictionary& dict
+)
+{
+    functionObject::read(dict);
+
+    ioError_ = false;
+    constructError_ = false;
+    executeError_ = false;
+    writeError_ = false;
+
+    dict.readIfPresent("ioError", ioError_);
+    dict.readIfPresent("constructError", constructError_);
+    dict.readIfPresent("executeError", executeError_);
+    dict.readIfPresent("writeError", writeError_);
+
+    Log << "Reading : " << name() << nl
+        << "    error on construct " << constructError_ << nl
+        << "    error on execute() " << executeError_ << nl
+        << "    error on write()   " << writeError_ << nl
+        << "    using ioerror = " << ioError_ << nl;
+
+    return true;
+}
+
+
+bool Foam::functionObjects::fakeErrorFunctionObject::execute()
+{
+    if (executeError_)
+    {
+        emitError("execute()");
+    }
+
+    return true;
+}
+
+
+bool Foam::functionObjects::fakeErrorFunctionObject::write()
+{
+    if (writeError_)
+    {
+        emitError("write()");
+    }
+
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.H b/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.H
new file mode 100644
index 0000000000000000000000000000000000000000..84c6479bf17ab8c9ce9d05c7b44820e7937b3fd4
--- /dev/null
+++ b/applications/test/testFunctionObjects/fakeError/fakeErrorFunctionObject.H
@@ -0,0 +1,147 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 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::functionObjects::fakeErrorFunctionObject
+
+Description
+    A function object that emits FatalError at different stages
+    (or does nothing), which is useful for testing purposes.
+
+    Can request errors from constructor, execute and write methods.
+
+Usage
+    Example of function object specification:
+
+    \verbatim
+    test
+    {
+        type    fakeError;
+        libs    (testFunctionObjects);
+        ...
+        errors          warn;
+        executeError    true;
+    }
+    \endverbatim
+
+    Where the entries comprise:
+    \table
+        Property        | Description                         | Reqd | Deflt
+        ioError         | FatalIOError instead of FatalError  | no  | no
+        constructError  | generate error on construct         | no  | no
+        executeError    | generate error on execute()         | no  | no
+        writeError      | generate error on write()           | no  | no
+    \endtable
+
+SourceFiles
+    fakeErrorFunctionObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_fakeErrorFunctionObject_H
+#define functionObjects_fakeErrorFunctionObject_H
+
+#include "timeFunctionObject.H"
+#include "Switch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+                   Class fakeErrorFunctionObject Declaration
+\*---------------------------------------------------------------------------*/
+
+class fakeErrorFunctionObject
+:
+    public timeFunctionObject
+{
+    // Private Data
+
+        Switch ioError_;
+        Switch constructError_;
+        Switch executeError_;
+        Switch writeError_;
+
+
+    // Private Member Functions
+
+        //- Emit error for whatever
+        void emitError(const char* what) const;
+
+        //- No copy construct
+        fakeErrorFunctionObject(const fakeErrorFunctionObject&) = delete;
+
+        //- No copy assignment
+        void operator=(const fakeErrorFunctionObject&) = delete;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("fakeError");
+
+
+    // Constructors
+
+        //- Construct from Time and dictionary
+        fakeErrorFunctionObject
+        (
+            const word& name,
+            const Time& runTime,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~fakeErrorFunctionObject() = default;
+
+
+    // Member Functions
+
+        //- Read and report settings
+        virtual bool read(const dictionary& dict);
+
+        //- Execute. Emit error or do nothing.
+        virtual bool execute();
+
+        //- Write. Emit error or do nothing.
+        virtual bool write();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //