diff --git a/src/functionObjects/utilities/foamReport/foamReport.C b/src/functionObjects/utilities/foamReport/foamReport.C
index 349fbf777bed5ea7d048a43d5f2a8019d01bf07d..e033d065f18191d74da4fea9826d17a02cffbef8 100644
--- a/src/functionObjects/utilities/foamReport/foamReport.C
+++ b/src/functionObjects/utilities/foamReport/foamReport.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2024 OpenCFD Ltd.
+    Copyright (C) 2024-2025 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -32,6 +32,7 @@ License
 #include "cloud.H"
 #include "foamVersion.H"
 #include "fvMesh.H"
+#include "globalMeshData.H"
 #include "IFstream.H"
 #include "stringOps.H"
 #include "substitutionModel.H"
@@ -56,7 +57,7 @@ void Foam::functionObjects::foamReport::setStaticBuiltins()
     substitutionModel::addBuiltinStr
     (
         "OF_PROC_ZERO_DIR",
-        Pstream::parRun() ? "processor0" : ""
+        UPstream::parRun() ? "processor0" : ""
     );
 
     substitutionModel::addBuiltin("OF_API", foamVersion::api);
@@ -72,26 +73,45 @@ void Foam::functionObjects::foamReport::setStaticBuiltins()
     substitutionModel::addBuiltinStr("OF_CASE_PATH", argList::envGlobalPath());
     substitutionModel::addBuiltinStr("OF_CASE_NAME", time().globalCaseName());
 
-    substitutionModel::addBuiltin("OF_NPROCS", Pstream::nProcs());
+    substitutionModel::addBuiltin("OF_NPROCS", UPstream::nProcs());
 
     // Set mesh builtins when there is only 1 mesh
-    const auto meshes = time_.lookupClass<fvMesh>();
+    const auto meshes = time_.csorted<fvMesh>();
+
     if (meshes.size() == 1)
     {
-        const auto& mesh = *(meshes.begin().val());
-        substitutionModel::addBuiltin("OF_MESH_NCELLS", mesh.nCells());
-        substitutionModel::addBuiltin("OF_MESH_NFACES", mesh.nFaces());
-        substitutionModel::addBuiltin("OF_MESH_NEDGES", mesh.nEdges());
-        substitutionModel::addBuiltin("OF_MESH_NPOINTS", mesh.nPoints());
+        const auto& mesh = meshes[0];
+
+        substitutionModel::addBuiltin
+        (
+            "OF_MESH_NCELLS",
+            mesh.globalData().nTotalCells()
+        );
+        substitutionModel::addBuiltin
+        (
+            "OF_MESH_NFACES",
+            mesh.globalData().nTotalFaces()
+        );
+        substitutionModel::addBuiltin
+        (
+            "OF_MESH_NEDGES",
+            returnReduce(mesh.nEdges(), sumOp<label>())
+        );
+        substitutionModel::addBuiltin
+        (
+            "OF_MESH_NPOINTS",
+            mesh.globalData().nTotalPoints()
+        );
         substitutionModel::addBuiltin
         (
             "OF_MESH_NINTERNALFACES",
-            mesh.nInternalFaces()
+            returnReduce(mesh.nInternalFaces(), sumOp<label>())
         );
         substitutionModel::addBuiltin
         (
             "OF_MESH_NBOUNDARYFACES",
-            mesh.nBoundaryFaces()
+            // TBD: use mesh.boundaryMesh().nNonProcessorFaces() ?
+            returnReduce(mesh.nBoundaryFaces(), sumOp<label>())
         );
         substitutionModel::addBuiltin
         (
@@ -123,8 +143,8 @@ void Foam::functionObjects::foamReport::setDynamicBuiltins()
     substitutionModel::setBuiltinStr("OF_DATE_NOW", clock::date());
     substitutionModel::setBuiltinStr("OF_CLOCK_NOW", clock::clockTime());
 
-    substitutionModel::setBuiltin("OF_NREGIONS", time().names<fvMesh>().size());
-    substitutionModel::setBuiltin("OF_NCLOUDS", time().names<cloud>().size());
+    substitutionModel::setBuiltin("OF_NREGIONS", time().count<fvMesh>());
+    substitutionModel::setBuiltin("OF_NCLOUDS", time().count<cloud>());
 }