diff --git a/applications/test/IOField/Make/files b/applications/test/IOField/Make/files
index 74e614deae50fd2db849cc673414cb8b1e651153..4b70c3321eef100bb743e70c92743e643095ab7e 100644
--- a/applications/test/IOField/Make/files
+++ b/applications/test/IOField/Make/files
@@ -1,3 +1,3 @@
-Test-IOField.C
+Test-IOField.cxx
 
 EXE = $(FOAM_USER_APPBIN)/Test-IOField
diff --git a/applications/test/IOField/Test-IOField.C b/applications/test/IOField/Test-IOField.cxx
similarity index 94%
rename from applications/test/IOField/Test-IOField.C
rename to applications/test/IOField/Test-IOField.cxx
index d921dc09b0b44cfb00924c099cc0dc6caad3e74f..d9bfc1e0772f46f79e2c8f0230857b32e73befe6 100644
--- a/applications/test/IOField/Test-IOField.C
+++ b/applications/test/IOField/Test-IOField.cxx
@@ -206,6 +206,22 @@ int main(int argc, char *argv[])
         Info<< "Serial: using " << sz << nl;
     }
 
+    {
+        IOobject io
+        (
+            "points",
+            mesh.time().constant(),
+            polyMesh::meshSubDir,
+            mesh
+        );
+
+        Info<< "points path: " << io.typeFilePath<labelIOList>() << nl;
+        Info<< "points path: " << io.typeFilePath<void>() << nl;
+
+        io.resetHeader("bad-points");
+        Info<< "bad path: " << io.typeFilePath<void>() << nl;
+    }
+
     IOobject io
     (
         "bla",
diff --git a/applications/test/IOobject-type/Make/files b/applications/test/IOobject-type/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..9956aabe1255be67196f85e62a925e47bddc17aa
--- /dev/null
+++ b/applications/test/IOobject-type/Make/files
@@ -0,0 +1,3 @@
+Test-IOobject-type.cxx
+
+EXE = $(FOAM_USER_APPBIN)/Test-IOobject-type
diff --git a/applications/test/IOobject-type/Make/options b/applications/test/IOobject-type/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..2526f4eb0e6970a6cc43123f2c5c752687ceb3e9
--- /dev/null
+++ b/applications/test/IOobject-type/Make/options
@@ -0,0 +1,9 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteArea/lnInclude \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude
+
+EXE_LIBS = \
+    -lfiniteArea \
+    -lfiniteVolume \
+    -lmeshTools
diff --git a/applications/test/IOobject-type/Test-IOobject-type.cxx b/applications/test/IOobject-type/Test-IOobject-type.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..a315fdca69e11dbdeb04799ee5a5adb430190e70
--- /dev/null
+++ b/applications/test/IOobject-type/Test-IOobject-type.cxx
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2023 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/>.
+
+Description
+    Report global/local path for various types
+
+\*---------------------------------------------------------------------------*/
+
+#include "argList.H"
+#include "Time.H"
+#include "IOobject.H"
+#include "IOdictionary.H"
+#include "IOMap.H"
+#include "coordinateSystems.H"
+#include "faSchemes.H"
+#include "fvSchemes.H"
+#include "schemesLookup.H"
+#include "scalarIOList.H"
+
+using namespace Foam;
+
+
+template<class Type>
+word report()
+{
+    if (is_globalIOobject<Type>::value)
+    {
+        return "global";
+    }
+    else
+    {
+        return "local";
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
+{
+    Info<< "void: " << report<void>() << nl;
+    Info<< "IOobject: " << report<IOobject>() << nl;
+    Info<< "IOdictionary: " << report<IOdictionary>() << nl;
+    Info<< "faSchemes: " << report<faSchemes>() << nl;
+    Info<< "fvSchemes: " << report<fvSchemes>() << nl;
+    Info<< "schemesLookup: " << report<schemesLookup>() << nl;
+    Info<< "coordinateSystems: " << report<coordinateSystems>() << nl;
+    Info<< "IOMap<labelList>: " << report<IOMap<labelList>>() << nl;
+    Info<< "IOMap<dictionary>: " << report<IOMap<dictionary>>() << nl;
+
+    Info<< "\nEnd\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/preProcessing/foamUpgradeCyclics/foamUpgradeCyclics.C b/applications/utilities/preProcessing/foamUpgradeCyclics/foamUpgradeCyclics.C
index 18552515925c56b27424d953118e105f4b692816..bb2c66d7845da75491b3a66622d8275687ff8381 100644
--- a/applications/utilities/preProcessing/foamUpgradeCyclics/foamUpgradeCyclics.C
+++ b/applications/utilities/preProcessing/foamUpgradeCyclics/foamUpgradeCyclics.C
@@ -79,8 +79,8 @@ void rewriteBoundary
     HashTable<word>& nbrNames
 )
 {
-    Info<< "Reading boundary from " << typeFilePath<IOPtrList<entry>>(io)
-        << endl;
+    Info<< "Reading boundary from "
+        << io.typeFilePath<IOPtrList<entry>>() << nl;
 
     // Read PtrList of dictionary.
     const word oldTypeName = IOPtrList<entry>::typeName;
diff --git a/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C b/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C
index 83f7fb6644565a40d8e49c7951e830e6104433fa..e1f6df7698060fcbaaf47b1b6a56754191967a71 100644
--- a/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C
+++ b/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C
@@ -211,7 +211,7 @@ int main(int argc, char *argv[])
     );
 
     // Look for file (using searchableSurface rules)
-    const fileName actualPath(typeFilePath<searchableSurface>(io));
+    const fileName actualPath(io.typeFilePath<searchableSurface>());
     fileName localPath(actualPath);
     localPath.replace(runTime.rootPath() + '/', "");
 
diff --git a/src/OpenFOAM/db/IOobject/IOobject.C b/src/OpenFOAM/db/IOobject/IOobject.C
index 055d69f76f80568b53c9f340b32a80a2ff6f5421..33c50de2f20c89913935ceb7283c7086082307e2 100644
--- a/src/OpenFOAM/db/IOobject/IOobject.C
+++ b/src/OpenFOAM/db/IOobject/IOobject.C
@@ -561,6 +561,17 @@ Foam::fileName Foam::IOobject::globalFilePath
 }
 
 
+// Foam::fileName Foam::IOobject::filePath
+// (
+//     const bool isGlobal,
+//     const word& typeName,
+//     const bool search
+// ) const
+// {
+//     return fileHandler().filePath(isGlobal, *this, typeName, search);
+// }
+
+
 void Foam::IOobject::setBad(const string& s)
 {
     if (objState_ != objectState::GOOD)
diff --git a/src/OpenFOAM/db/IOobject/IOobject.H b/src/OpenFOAM/db/IOobject/IOobject.H
index 7379595e15c91e92b78804f5073bb7a92c629f3c..0ae8fc61a4005c900933350b39c2b96870719d3e 100644
--- a/src/OpenFOAM/db/IOobject/IOobject.H
+++ b/src/OpenFOAM/db/IOobject/IOobject.H
@@ -105,6 +105,7 @@ SourceFiles
 #include "InfoProxy.H"
 #include "IOobjectOption.H"
 #include "IOstreamOption.H"
+#include <type_traits>
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -196,6 +197,19 @@ private:
         //- Construct from registry, io options. Without name, instance, local
         IOobject(const objectRegistry& registry, IOobjectOption ioOpt);
 
+        //- Read header and check its info.
+        //  Optionally checks headerClassName against the type-name.
+        //  When search is false, simply use the current instance,
+        //  otherwise search previous instances.
+        bool readAndCheckHeader
+        (
+            const bool isGlobal,
+            const word& typeName,
+            const bool checkType = true,
+            const bool search = true,
+            const bool verbose = true
+        );
+
 
 protected:
 
@@ -621,22 +635,42 @@ public:
         //  Saves the header content in the given dictionary.
         bool readHeader(dictionary& headerDict, Istream& is);
 
-        //- Read header (uses typeFilePath to find file) and check its info.
-        //  Optionally checks headerClassName against the type-name.
-        //  When search is false, simply use the current instance,
-        //  otherwise search previous instances.
+        //- Read header (respects is_globalIOobject trait) and check its info.
         template<class Type>
         bool typeHeaderOk
         (
+            //! Check headerClassName against the type-name
             const bool checkType = true,
+            //! Also search previous instances if not found at current instance
             const bool search = true,
+            //! Report any check-type failures
             const bool verbose = true
         );
 
+        //- Call localFilePath or globalFilePath for given type
+        //- depending on its is_globalIOobject trait.
+        template<class Type>
+        fileName typeFilePath(const bool search = true) const;
+
         //- Helper: warn that type does not support re-reading
         template<class Type>
         void warnNoRereading() const;
 
+        //- Read header (localFilePath only) with optional searching
+        template<>
+        bool typeHeaderOk<void>
+        (
+            //! ignored for \c void
+            const bool checkType,
+            const bool search,
+            //! ignored for \c void
+            const bool verbose
+        );
+
+        //- Call localFilePath for \c void type
+        template<>
+        fileName typeFilePath<void>(const bool search) const;
+
 
     // Writing
 
@@ -701,25 +735,9 @@ inline bool IOobject::isHeaderClass<void>() const
 }
 
 
-//- Template function for obtaining global vs. local status
+//- Trait for specifying global vs. local file types
 template<class T>
-inline bool typeGlobal()
-{
-    return false;
-}
-
-
-//- Template function for obtaining local or global filePath
-template<class T>
-inline fileName typeFilePath(const IOobject& io, const bool search = true)
-{
-    return
-    (
-        typeGlobal<T>()
-      ? io.globalFilePath(T::typeName, search)
-      : io.localFilePath(T::typeName, search)
-    );
-}
+struct is_globalIOobject : std::false_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/db/IOobject/IOobjectReadHeader.C b/src/OpenFOAM/db/IOobject/IOobjectReadHeader.C
index 94d764f079c09927f89c3491a48a09680cdb134d..c100acdbfff3df5dc58fb795fab5d225b1bf53b7 100644
--- a/src/OpenFOAM/db/IOobject/IOobjectReadHeader.C
+++ b/src/OpenFOAM/db/IOobject/IOobjectReadHeader.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019-2022 OpenCFD Ltd.
+    Copyright (C) 2019-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -29,6 +29,8 @@ License
 #include "IOobject.H"
 #include "dictionary.H"
 #include "foamVersion.H"
+#include "fileOperation.H"
+#include "Pstream.H"
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
@@ -171,4 +173,136 @@ bool Foam::IOobject::readHeader(Istream& is)
 }
 
 
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+bool Foam::IOobject::readAndCheckHeader
+(
+    const bool isGlobal,
+    const word& typeName,
+    const bool checkType,
+    const bool search,
+    const bool verbose
+)
+{
+    // Mark as not yet read. cf, IOobject::readHeader()
+    headerClassName_.clear();
+
+    // Everyone check or just master
+    const bool masterOnly
+    (
+        isGlobal
+     && (
+            IOobject::fileModificationChecking == IOobject::timeStampMaster
+         || IOobject::fileModificationChecking == IOobject::inotifyMaster
+        )
+    );
+
+    const auto& handler = Foam::fileHandler();
+
+    // Determine local status
+    bool ok = false;
+
+    if (masterOnly)
+    {
+        if (UPstream::master())
+        {
+            // Force master-only header reading
+            const bool oldParRun = UPstream::parRun(false);
+            const fileName fName
+            (
+                handler.filePath(isGlobal, *this, typeName, search)
+            );
+            ok = handler.readHeader(*this, fName, typeName);
+            UPstream::parRun(oldParRun);
+
+            if
+            (
+                ok && checkType
+             && !typeName.empty() && headerClassName_ != typeName
+            )
+            {
+                ok = false;
+                if (verbose)
+                {
+                    WarningInFunction
+                        << "Unexpected class name \"" << headerClassName_
+                        << "\" expected \"" << typeName
+                        << "\" when reading " << fName << endl;
+                }
+            }
+        }
+
+        // If masterOnly make sure all processors know about the read
+        // information. Note: should ideally be inside fileHandler...
+        Pstream::broadcasts
+        (
+            UPstream::worldComm,
+            ok,
+            headerClassName_,
+            note_
+        );
+    }
+    else
+    {
+        // All read header
+        const fileName fName
+        (
+            handler.filePath(isGlobal, *this, typeName, search)
+        );
+        ok = handler.readHeader(*this, fName, typeName);
+
+        if
+        (
+            ok && checkType
+         && !typeName.empty() && headerClassName_ != typeName
+        )
+        {
+            ok = false;
+            if (verbose)
+            {
+                WarningInFunction
+                    << "Unexpected class name \"" << headerClassName_
+                    << "\" expected \"" << typeName
+                    << "\" when reading " << fName << endl;
+            }
+        }
+    }
+
+    return ok;
+}
+
+
+// * * * * * * * * * * * * Template Specializations  * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+template<>
+bool IOobject::typeHeaderOk<void>
+(
+    const bool checkType,
+    const bool search,
+    const bool verbose
+)
+{
+    return readAndCheckHeader
+    (
+        false,      // global = false
+        word::null,
+        false,      // checkType = false (not meaningful)
+        search,
+        false       // verbose = false (not meaningful)
+    );
+}
+
+
+template<>
+fileName IOobject::typeFilePath<void>(const bool search) const
+{
+    return this->localFilePath(word::null, search);
+}
+
+} // End namespace Foam
+
+
 // ************************************************************************* //
diff --git a/src/OpenFOAM/db/IOobject/IOobjectTemplates.C b/src/OpenFOAM/db/IOobject/IOobjectTemplates.C
index 1ad0a63a30812cbf1982c758c62c6ed3fe8f6cc9..635d0065b3e12cb9351a0d34d63046ab99a65a5f 100644
--- a/src/OpenFOAM/db/IOobject/IOobjectTemplates.C
+++ b/src/OpenFOAM/db/IOobject/IOobjectTemplates.C
@@ -27,10 +27,10 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "IOobject.H"
-#include "fileOperation.H"
-#include "Istream.H"
 #include "IOstreams.H"
-#include "Pstream.H"
+#include "fileOperation.H"  // legacy include
+#include "Istream.H"  // legacy include
+#include "Pstream.H"  // legacy include
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
@@ -42,78 +42,26 @@ bool Foam::IOobject::typeHeaderOk
     const bool verbose
 )
 {
-    // Mark as not yet read. cf, IOobject::readHeader()
-    headerClassName_.clear();
-
-    // Everyone check or just master
-    const bool masterOnly
+    return readAndCheckHeader
     (
-        typeGlobal<Type>()
-     && (
-            IOobject::fileModificationChecking == IOobject::timeStampMaster
-         || IOobject::fileModificationChecking == IOobject::inotifyMaster
-        )
+        is_globalIOobject<Type>::value,
+        Type::typeName,
+        checkType,
+        search,
+        verbose
     );
+}
 
-    const fileOperation& fp = Foam::fileHandler();
-
-    // Determine local status
-    bool ok = false;
-
-    if (masterOnly)
-    {
-        if (UPstream::master())
-        {
-            // Force master-only header reading
-            const bool oldParRun = UPstream::parRun(false);
-            const fileName fName(typeFilePath<Type>(*this, search));
-            ok = fp.readHeader(*this, fName, Type::typeName);
-            UPstream::parRun(oldParRun);
-
-            if (ok && checkType && headerClassName_ != Type::typeName)
-            {
-                ok = false;
-                if (verbose)
-                {
-                    WarningInFunction
-                        << "Unexpected class name \"" << headerClassName_
-                        << "\" expected \"" << Type::typeName
-                        << "\" when reading " << fName << endl;
-                }
-            }
-        }
-
-        // If masterOnly make sure all processors know about the read
-        // information. Note: should ideally be inside fileHandler...
-        Pstream::broadcasts
-        (
-            UPstream::worldComm,
-            ok,
-            headerClassName_,
-            note_
-        );
-    }
-    else
-    {
-        const fileName fName(typeFilePath<Type>(*this, search));
-
-        // All read header
-        ok = fp.readHeader(*this, fName, Type::typeName);
-
-        if (ok && checkType && headerClassName_ != Type::typeName)
-        {
-            ok = false;
-            if (verbose)
-            {
-                WarningInFunction
-                    << "Unexpected class name \"" << headerClassName_
-                    << "\" expected \"" << Type::typeName
-                    << "\" when reading " << fName << endl;
-            }
-        }
-    }
 
-    return ok;
+template<class Type>
+Foam::fileName Foam::IOobject::typeFilePath(const bool search) const
+{
+    return
+    (
+        is_globalIOobject<Type>::value
+      ? this->globalFilePath(Type::typeName, search)
+      : this->localFilePath(Type::typeName, search)
+    );
 }
 
 
diff --git a/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.H b/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.H
index 666a02bb529b3acae0d55baf7242c57806492ddd..966a5976d98f62501ebb67485d7bd803bef2749f 100644
--- a/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.H
+++ b/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015-2017 OpenFOAM Foundation
-    Copyright (C) 2018-2022 OpenCFD Ltd.
+    Copyright (C) 2018-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -121,6 +121,13 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for GlobalIOList
+template<class T>
+struct is_globalIOobject<GlobalIOList<T>> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/db/IOobjects/GlobalIOList/globalIOLists.H b/src/OpenFOAM/db/IOobjects/GlobalIOList/globalIOLists.H
index 3f3cc0e1fc947286a3b3c77a4d09d872ce6e2197..3a5278070b2944061ddd4acfe490f8a738e44af6 100644
--- a/src/OpenFOAM/db/IOobjects/GlobalIOList/globalIOLists.H
+++ b/src/OpenFOAM/db/IOobjects/GlobalIOList/globalIOLists.H
@@ -32,8 +32,8 @@ Description
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef globalIOLists_H
-#define globalIOLists_H
+#ifndef Foam_globalIOLists_H
+#define Foam_globalIOLists_H
 
 #include "primitiveFields.H"
 #include "GlobalIOList.H"
@@ -48,43 +48,6 @@ namespace Foam
     typedef GlobalIOList<sphericalTensor> sphericalTensorGlobalIOList;
     typedef GlobalIOList<symmTensor> symmTensorGlobalIOList;
     typedef GlobalIOList<tensor> tensorGlobalIOList;
-
-    //- Template function for obtaining global status
-    template<>
-    inline bool typeGlobal<labelGlobalIOList>()
-    {
-        return true;
-    }
-
-    template<>
-    inline bool typeGlobal<scalarGlobalIOList>()
-    {
-        return true;
-    }
-
-    template<>
-    inline bool typeGlobal<vectorGlobalIOList>()
-    {
-        return true;
-    }
-
-    template<>
-    inline bool typeGlobal<sphericalTensorGlobalIOList>()
-    {
-        return true;
-    }
-
-    template<>
-    inline bool typeGlobal<symmTensorGlobalIOList>()
-    {
-        return true;
-    }
-
-    template<>
-    inline bool typeGlobal<tensorGlobalIOList>()
-    {
-        return true;
-    }
 }
 
 
diff --git a/src/OpenFOAM/db/IOobjects/IOMap/IOMap.H b/src/OpenFOAM/db/IOobjects/IOMap/IOMap.H
index 637c302a24090f2fa0963f4a65dbae91a22f9d23..9cf43adee26c2d95b25541e7230709475138b1d0 100644
--- a/src/OpenFOAM/db/IOobjects/IOMap/IOMap.H
+++ b/src/OpenFOAM/db/IOobjects/IOMap/IOMap.H
@@ -127,6 +127,13 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for IOMap
+template<class T>
+struct is_globalIOobject<IOMap<T>> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/db/IOobjects/IOMap/IOMaps.C b/src/OpenFOAM/db/IOobjects/IOMap/IOMaps.C
index 97c84eb0d91d39a822df7f04dc2ce7cbb2da546f..5d99f1940f5d7dcf55b94b253f507a17b3ae79b2 100644
--- a/src/OpenFOAM/db/IOobjects/IOMap/IOMaps.C
+++ b/src/OpenFOAM/db/IOobjects/IOMap/IOMaps.C
@@ -29,27 +29,10 @@ License
 #include "IOMap.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
 namespace Foam
 {
     defineTemplateTypeNameAndDebug(IOMap<dictionary>, 0);
-
-    //- Template specialization for global status
-    template<>
-    bool typeGlobal<IOMap<dictionary>>()
-    {
-        return true;
-    }
-
-    //- Template specialisation for obtaining filePath
-    template<>
-    fileName typeFilePath<IOMap<dictionary>>
-    (
-        const IOobject& io,
-        const bool search
-    )
-    {
-        return io.globalFilePath(IOMap<dictionary>::typeName, search);
-    }
 }
 
 
diff --git a/src/OpenFOAM/db/IOobjects/IOdictionary/IOdictionary.H b/src/OpenFOAM/db/IOobjects/IOdictionary/IOdictionary.H
index a10a3e25279a133aa2c293584106093206be4afb..5c10205622ca47ec86bd03acc7337b4f48055d4b 100644
--- a/src/OpenFOAM/db/IOobjects/IOdictionary/IOdictionary.H
+++ b/src/OpenFOAM/db/IOobjects/IOdictionary/IOdictionary.H
@@ -116,12 +116,9 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-//- Template function for obtaining global status
+//- Global file type for IOdictionary
 template<>
-inline bool typeGlobal<IOdictionary>()
-{
-    return true;
-}
+struct is_globalIOobject<IOdictionary> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/db/IOobjects/IOdictionary/unwatchedIOdictionary.H b/src/OpenFOAM/db/IOobjects/IOdictionary/unwatchedIOdictionary.H
index 549666a02786dfbf2a356650535ba8c2cb099af1..bded2b07770fe3a1881dcca76f036adef2ffe3a1 100644
--- a/src/OpenFOAM/db/IOobjects/IOdictionary/unwatchedIOdictionary.H
+++ b/src/OpenFOAM/db/IOobjects/IOdictionary/unwatchedIOdictionary.H
@@ -137,12 +137,9 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-//- Template function for obtaining global status
+//- Global file type for unwatchedIOdictionary
 template<>
-inline bool typeGlobal<unwatchedIOdictionary>()
-{
-    return true;
-}
+struct is_globalIOobject<unwatchedIOdictionary> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/fields/Fields/globalFields/globalIOFields.H b/src/OpenFOAM/fields/Fields/globalFields/globalIOFields.H
index 179a55cb19f0484217f6b3b6634a7336e9ae349a..a5c249d1da28a212df50aa28f09ee8e0d84d2a73 100644
--- a/src/OpenFOAM/fields/Fields/globalFields/globalIOFields.H
+++ b/src/OpenFOAM/fields/Fields/globalFields/globalIOFields.H
@@ -32,8 +32,8 @@ Description
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef globalIOFields_H
-#define globalIOFields_H
+#ifndef Foam_globalIOFields_H
+#define Foam_globalIOFields_H
 
 #include "primitiveFields.H"
 #include "GlobalIOField.H"
@@ -48,39 +48,6 @@ namespace Foam
     typedef GlobalIOField<sphericalTensor> sphericalTensorGlobalIOField;
     typedef GlobalIOField<symmTensor> symmTensorGlobalIOField;
     typedef GlobalIOField<tensor> tensorGlobalIOField;
-
-    //- Template function for obtaining global status
-    template<>
-    inline bool typeGlobal<labelGlobalIOField>()
-    {
-        return true;
-    }
-    template<>
-    inline bool typeGlobal<scalarGlobalIOField>()
-    {
-        return true;
-    }
-    template<>
-    inline bool typeGlobal<vectorGlobalIOField>()
-    {
-        return true;
-    }
-    template<>
-    inline bool typeGlobal<sphericalTensorGlobalIOField>()
-    {
-        return true;
-    }
-    template<>
-    inline bool typeGlobal<symmTensorGlobalIOField>()
-    {
-        return true;
-    }
-    template<>
-    inline bool typeGlobal<tensorGlobalIOField>()
-    {
-        return true;
-    }
-
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/fields/UniformDimensionedFields/UniformDimensionedField.H b/src/OpenFOAM/fields/UniformDimensionedFields/UniformDimensionedField.H
index 0bd5ff35d3986fb67a3fa502b9a06045df8a6311..c970ca0c413770b1c4afb1f2f855cdf01b6cbd7c 100644
--- a/src/OpenFOAM/fields/UniformDimensionedFields/UniformDimensionedField.H
+++ b/src/OpenFOAM/fields/UniformDimensionedFields/UniformDimensionedField.H
@@ -152,6 +152,13 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for UniformDimensionedField
+template<class Type>
+struct is_globalIOobject<UniformDimensionedField<Type>> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/fields/UniformDimensionedFields/uniformDimensionedFieldsFwd.H b/src/OpenFOAM/fields/UniformDimensionedFields/uniformDimensionedFieldsFwd.H
index 13b8d8c76f79dfa1bda1ce5e9b66f53821d5bdb5..b288240f02deb488149eaa2cd330a33143b7e5be 100644
--- a/src/OpenFOAM/fields/UniformDimensionedFields/uniformDimensionedFieldsFwd.H
+++ b/src/OpenFOAM/fields/UniformDimensionedFields/uniformDimensionedFieldsFwd.H
@@ -73,40 +73,6 @@ typedef
     uniformDimensionedTensorField;
 
 
-// Global file status
-
-template<>
-inline bool typeGlobal<uniformDimensionedLabelField>()
-{
-    return true;
-}
-template<>
-inline bool typeGlobal<uniformDimensionedScalarField>()
-{
-    return true;
-}
-template<>
-inline bool typeGlobal<uniformDimensionedVectorField>()
-{
-    return true;
-}
-template<>
-inline bool typeGlobal<uniformDimensionedSphericalTensorField>()
-{
-    return true;
-}
-template<>
-inline bool typeGlobal<uniformDimensionedSymmTensorField>()
-{
-    return true;
-}
-template<>
-inline bool typeGlobal<uniformDimensionedTensorField>()
-{
-    return true;
-}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/matrices/schemes/schemesLookup.H b/src/OpenFOAM/matrices/schemes/schemesLookup.H
index 357dbc1070f6ddfad606e7a8c24c9adf53c112d9..7c32e55be7dd05212f1dd84be0d12a8a5af5d68e 100644
--- a/src/OpenFOAM/matrices/schemes/schemesLookup.H
+++ b/src/OpenFOAM/matrices/schemes/schemesLookup.H
@@ -385,6 +385,13 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for schemesLookup - same content for all ranks
+template<>
+struct is_globalIOobject<schemesLookup> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/coordinate/systems/coordinateSystems.H b/src/OpenFOAM/primitives/coordinate/systems/coordinateSystems.H
index 3f4b483f8a74736f7309434fc1496110534d05d0..6dcce33a9003282e7a54e250c334f7db78ec3012 100644
--- a/src/OpenFOAM/primitives/coordinate/systems/coordinateSystems.H
+++ b/src/OpenFOAM/primitives/coordinate/systems/coordinateSystems.H
@@ -208,6 +208,13 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for coordinateSystems - same content for all ranks
+template<>
+struct is_globalIOobject<coordinateSystems> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/dynamicMesh/motionSolvers/componentDisplacement/componentDisplacementMotionSolver.C b/src/dynamicMesh/motionSolvers/componentDisplacement/componentDisplacementMotionSolver.C
index 76ea901109ee5323d92d221e18732e0cdbc5ea5e..b0a98da1995d533a4d70119c5f3e2b00cffc2c59 100644
--- a/src/dynamicMesh/motionSolvers/componentDisplacement/componentDisplacementMotionSolver.C
+++ b/src/dynamicMesh/motionSolvers/componentDisplacement/componentDisplacementMotionSolver.C
@@ -110,23 +110,24 @@ Foam::componentDisplacementMotionSolver::componentDisplacementMotionSolver
 {
     if (points0_.size() != mesh.nPoints())
     {
+        const fileName fName
+        (
+            IOobject
+            (
+                "points",
+                mesh.time().constant(),
+                polyMesh::meshSubDir,
+                mesh,
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                IOobject::NO_REGISTER
+            ).typeFilePath<pointIOField>()
+        );
+
         FatalErrorInFunction
             << "Number of points in mesh " << mesh.nPoints()
             << " differs from number of points " << points0_.size()
-            << " read from file "
-            <<  typeFilePath<pointIOField>
-                (
-                    IOobject
-                    (
-                        "points",
-                        mesh.time().constant(),
-                        polyMesh::meshSubDir,
-                        mesh,
-                        IOobject::MUST_READ,
-                        IOobject::NO_WRITE,
-                        IOobject::NO_REGISTER
-                    )
-                )
+            << " read from file " << fName << nl
             << exit(FatalError);
     }
 }
diff --git a/src/dynamicMesh/motionSolvers/displacement/points0/points0MotionSolver.C b/src/dynamicMesh/motionSolvers/displacement/points0/points0MotionSolver.C
index f79067ef29e4095b89804f21f09027f89a038933..4e3381d0e83be03c5644cf4cf7dba2f590cb6607 100644
--- a/src/dynamicMesh/motionSolvers/displacement/points0/points0MotionSolver.C
+++ b/src/dynamicMesh/motionSolvers/displacement/points0/points0MotionSolver.C
@@ -97,23 +97,24 @@ Foam::points0MotionSolver::points0MotionSolver
     }
     else if (points0_.size() != mesh.nPoints())
     {
+        const fileName fName
+        (
+            IOobject
+            (
+                "points",
+                time().constant(),
+                polyMesh::meshSubDir,
+                mesh,
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                IOobject::NO_REGISTER
+            ).typeFilePath<pointIOField>()
+        );
+
         FatalErrorInFunction
             << "Number of points in mesh " << mesh.nPoints()
             << " differs from number of points " << points0_.size()
-            << " read from file "
-            <<  typeFilePath<pointIOField>
-                (
-                    IOobject
-                    (
-                        "points",
-                        time().constant(),
-                        polyMesh::meshSubDir,
-                        mesh,
-                        IOobject::MUST_READ,
-                        IOobject::NO_WRITE,
-                        IOobject::NO_REGISTER
-                    )
-                )
+            << " read from file " << fName << nl
             << exit(FatalError);
     }
 }
diff --git a/src/finiteArea/finiteArea/faSchemes/faSchemes.H b/src/finiteArea/finiteArea/faSchemes/faSchemes.H
index 3c2b345e8ebe5275d728d0f1f69462187a91124e..43cc914034344a0f20a74f7a02d4f277cebe1311 100644
--- a/src/finiteArea/finiteArea/faSchemes/faSchemes.H
+++ b/src/finiteArea/finiteArea/faSchemes/faSchemes.H
@@ -129,6 +129,13 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for faSchemes - same content for all ranks
+template<>
+struct is_globalIOobject<faSchemes> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/finiteVolume/cfdTools/general/porosityModel/porosityModel/porosityModel.H b/src/finiteVolume/cfdTools/general/porosityModel/porosityModel/porosityModel.H
index e6a8d62deffd2d99edfd8a094c982a2722fd090e..1d6bb1f610321e4560eabcb3825ef6123184c2c6 100644
--- a/src/finiteVolume/cfdTools/general/porosityModel/porosityModel/porosityModel.H
+++ b/src/finiteVolume/cfdTools/general/porosityModel/porosityModel/porosityModel.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2018 OpenFOAM Foundation
-    Copyright (C) 2021-2022 OpenCFD Ltd.
+    Copyright (C) 2021-2023 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -287,12 +287,11 @@ public:
 };
 
 
-//- Template function for obtaining global status
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for porosityModel
 template<>
-inline bool typeGlobal<porosityModel>()
-{
-    return true;
-}
+struct is_globalIOobject<porosityModel> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/finiteVolume/finiteVolume/fvSchemes/fvSchemes.H b/src/finiteVolume/finiteVolume/fvSchemes/fvSchemes.H
index a1d8bb401a7bc24a6284b43683a8a13cd971bf90..fe49cd90923d73c3881151827da09b530fa7a59d 100644
--- a/src/finiteVolume/finiteVolume/fvSchemes/fvSchemes.H
+++ b/src/finiteVolume/finiteVolume/fvSchemes/fvSchemes.H
@@ -129,6 +129,13 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for fvSchemes - same content for all ranks
+template<>
+struct is_globalIOobject<fvSchemes> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/mesh/snappyHexMesh/refinementFeatures/refinementFeatures.C b/src/mesh/snappyHexMesh/refinementFeatures/refinementFeatures.C
index 4522e3e3a23cdb788e9bfab5a1f615ef3c88a305..45e3db5e568b6e2811bc7ce146619c9d2ae4144b 100644
--- a/src/mesh/snappyHexMesh/refinementFeatures/refinementFeatures.C
+++ b/src/mesh/snappyHexMesh/refinementFeatures/refinementFeatures.C
@@ -71,7 +71,10 @@ void Foam::refinementFeatures::read
             IOobject::NO_REGISTER
         );
 
-        const fileName fName(typeFilePath<extendedFeatureEdgeMesh>(extFeatObj));
+        const fileName fName
+        (
+            extFeatObj.typeFilePath<extendedFeatureEdgeMesh>()
+        );
 
         if (!fName.empty() && extendedEdgeMesh::canRead(fName))
         {
@@ -105,7 +108,10 @@ void Foam::refinementFeatures::read
                 IOobject::NO_REGISTER
             );
 
-            const fileName fName(typeFilePath<featureEdgeMesh>(featObj));
+            const fileName fName
+            (
+                featObj.typeFilePath<featureEdgeMesh>()
+            );
 
             if (fName.empty())
             {
diff --git a/src/meshTools/edgeMesh/edgeFormats/edgeMesh/edgeMeshFormat.C b/src/meshTools/edgeMesh/edgeFormats/edgeMesh/edgeMeshFormat.C
index 19790815700903f5f59dcd25b58d0f19329d7a16..1fd4d01a58ef52f5adbc30648e7564e0b9042394 100644
--- a/src/meshTools/edgeMesh/edgeFormats/edgeMesh/edgeMeshFormat.C
+++ b/src/meshTools/edgeMesh/edgeFormats/edgeMesh/edgeMeshFormat.C
@@ -74,7 +74,7 @@ bool Foam::fileFormats::edgeMeshFormat::read
             << exit(FatalError);
     }
 
-    const fileName fName(typeFilePath<featureEdgeMesh>(io));
+    const fileName fName(io.typeFilePath<featureEdgeMesh>());
 
     autoPtr<IFstream> isPtr(new IFstream(fName));
     bool ok = false;
diff --git a/src/meshTools/edgeMesh/extendedEdgeMesh/extendedEdgeMeshFormat.C b/src/meshTools/edgeMesh/extendedEdgeMesh/extendedEdgeMeshFormat.C
index f33e32215b4e9a1cac499dc11608ed3d65fb809c..52c8080595968979b784ebb94bbe636aec69a0fd 100644
--- a/src/meshTools/edgeMesh/extendedEdgeMesh/extendedEdgeMeshFormat.C
+++ b/src/meshTools/edgeMesh/extendedEdgeMesh/extendedEdgeMeshFormat.C
@@ -72,7 +72,7 @@ bool Foam::fileFormats::extendedEdgeMeshFormat::read
             << exit(FatalError);
     }
 
-    const fileName fName(typeFilePath<extendedFeatureEdgeMesh>(io));
+    const fileName fName(io.typeFilePath<extendedFeatureEdgeMesh>());
 
     autoPtr<IFstream> isPtr(new IFstream(fName));
     bool ok = false;
diff --git a/src/meshTools/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H b/src/meshTools/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H
index 26190e2f1a8942f006f9ad0dacb1c8d6593fb4fb..b5fdf4162413949eec0f0cce327dbf754b15fcdf 100644
--- a/src/meshTools/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H
+++ b/src/meshTools/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H
@@ -154,12 +154,11 @@ public:
 };
 
 
-//- Template function for obtaining global status
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for extendedFeatureEdgeMesh
 template<>
-inline bool typeGlobal<extendedFeatureEdgeMesh>()
-{
-    return true;
-}
+struct is_globalIOobject<extendedFeatureEdgeMesh> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/edgeMesh/featureEdgeMesh/featureEdgeMesh.H b/src/meshTools/edgeMesh/featureEdgeMesh/featureEdgeMesh.H
index d89db6b362fb62ff3bb1aaf82cc3ae00165a027e..b556f0af1aaf0e5a22ce0920478f377e3bf102d4 100644
--- a/src/meshTools/edgeMesh/featureEdgeMesh/featureEdgeMesh.H
+++ b/src/meshTools/edgeMesh/featureEdgeMesh/featureEdgeMesh.H
@@ -102,12 +102,11 @@ public:
 };
 
 
-//- Template function for obtaining global status
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for featureEdgeMesh
 template<>
-inline bool typeGlobal<featureEdgeMesh>()
-{
-    return true;
-}
+struct is_globalIOobject<featureEdgeMesh> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/searchableSurfaces/searchableSurface/searchableSurface.H b/src/meshTools/searchableSurfaces/searchableSurface/searchableSurface.H
index a05928b6058f1bdd2fa6f0b6a66c42c1f4ee2ae3..3dd458818bbe108946c705a9a5b8249f7f743d63 100644
--- a/src/meshTools/searchableSurfaces/searchableSurface/searchableSurface.H
+++ b/src/meshTools/searchableSurfaces/searchableSurface/searchableSurface.H
@@ -393,12 +393,11 @@ public:
 };
 
 
-//- Template function for obtaining global status
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for searchableSurface
 template<>
-inline bool typeGlobal<searchableSurface>()
-{
-    return true;
-}
+struct is_globalIOobject<searchableSurface> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/searchableSurfaces/triSurfaceMesh/triSurfaceMesh.C b/src/meshTools/searchableSurfaces/triSurfaceMesh/triSurfaceMesh.C
index a8347693067b4486d1a9ae7f4f927ee31180a6d8..8976887905924d6c8f0fe559955959f44af87b7a 100644
--- a/src/meshTools/searchableSurfaces/triSurfaceMesh/triSurfaceMesh.C
+++ b/src/meshTools/searchableSurfaces/triSurfaceMesh/triSurfaceMesh.C
@@ -431,6 +431,11 @@ Foam::triSurfaceMesh::triSurfaceMesh(const IOobject& io, const readAction r)
           : io.localFilePath(typeName)
         );
 
+        // const fileName actualFile
+        // (
+        //     io.filePath(searchGlobal, typeName)
+        // );
+
         if (debug)
         {
             Pout<< "triSurfaceMesh(const IOobject& io) :"
@@ -537,6 +542,11 @@ Foam::triSurfaceMesh::triSurfaceMesh
           : io.localFilePath(typeName)
         );
 
+        // const fileName actualFile
+        // (
+        //     io.filePath(searchGlobal, typeName)
+        // );
+
         // Reading from supplied file name instead of objectPath/filePath
         if (dict.readIfPresent("file", fName_, keyType::LITERAL))
         {
diff --git a/src/meshTools/searchableSurfaces/triSurfaceMesh/triSurfaceMesh.H b/src/meshTools/searchableSurfaces/triSurfaceMesh/triSurfaceMesh.H
index 79502a40f6ea66c56e6e48be9a91955d53a6c08c..e5a18bdeb4bbc417cb1c817a79c28dfb58b64cd8 100644
--- a/src/meshTools/searchableSurfaces/triSurfaceMesh/triSurfaceMesh.H
+++ b/src/meshTools/searchableSurfaces/triSurfaceMesh/triSurfaceMesh.H
@@ -334,12 +334,11 @@ public:
 };
 
 
-//- Template function for obtaining global status
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for triSurfaceMesh
 template<>
-inline bool typeGlobal<triSurfaceMesh>()
-{
-    return true;
-}
+struct is_globalIOobject<triSurfaceMesh> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/topoSet/cellSources/fieldToCell/fieldToCell.C b/src/meshTools/topoSet/cellSources/fieldToCell/fieldToCell.C
index 16e273f6654457b8dfec0c090018d5b3136b88bc..f991f2f24b4ead3e7c0a18ff2f20a4c26203583e 100644
--- a/src/meshTools/topoSet/cellSources/fieldToCell/fieldToCell.C
+++ b/src/meshTools/topoSet/cellSources/fieldToCell/fieldToCell.C
@@ -203,7 +203,7 @@ void Foam::fieldToCell::applyToSet
         // Note: cannot use volScalarField::typeName since that would
         //    introduce linkage problems (finiteVolume needs meshTools)
 
-        IFstream str(typeFilePath<labelIOList>(fieldObject));
+        IFstream str(fieldObject.typeFilePath<labelIOList>());
 
         // Read as dictionary
         fieldDictionary fieldDict(fieldObject, fieldObject.headerClassName());
@@ -217,7 +217,7 @@ void Foam::fieldToCell::applyToSet
         // Note: cannot use volVectorField::typeName since that would
         //    introduce linkage problems (finiteVolume needs meshTools)
 
-        IFstream str(typeFilePath<labelIOList>(fieldObject));
+        IFstream str(fieldObject.typeFilePath<labelIOList>());
 
         // Read as dictionary
         fieldDictionary fieldDict(fieldObject, fieldObject.headerClassName());
diff --git a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.H b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.H
index 3a38ad33f5b9c2f109b81168893ec430a8958e4f..05adb82d5c8d08746b7a500b339c410b6cfa4af4 100644
--- a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.H
+++ b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.H
@@ -602,12 +602,11 @@ public:
 };
 
 
-//- Template function for obtaining global status
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Global file type for distributedTriSurfaceMesh
 template<>
-inline bool typeGlobal<distributedTriSurfaceMesh>()
-{
-    return false;
-}
+struct is_globalIOobject<distributedTriSurfaceMesh> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //