diff --git a/src/OpenFOAM/db/IOobjects/CompactIOField/CompactIOField.C b/src/OpenFOAM/db/IOobjects/CompactIOField/CompactIOField.C
index 027ccc53eaf472730daa11631bf72ebdf360e9fc..c5b082cca7703530db99db7c56c579190a8eca93 100644
--- a/src/OpenFOAM/db/IOobjects/CompactIOField/CompactIOField.C
+++ b/src/OpenFOAM/db/IOobjects/CompactIOField/CompactIOField.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2018-2020 OpenCFD Ltd.
+    Copyright (C) 2018-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -51,9 +51,9 @@ void Foam::CompactIOField<T, BaseType>::readFromStream(const bool valid)
         else
         {
             FatalIOErrorInFunction(is)
-                << "unexpected class name " << headerClassName()
-                << " expected " << typeName << " or " << IOField<T>::typeName
-                << endl
+                << "Unexpected class name " << headerClassName()
+                << " expected " << typeName
+                << " or " << IOField<T>::typeName << nl
                 << "    while reading object " << name()
                 << exit(FatalIOError);
         }
@@ -104,7 +104,27 @@ template<class T, class BaseType>
 Foam::CompactIOField<T, BaseType>::CompactIOField
 (
     const IOobject& io,
-    const label size
+    Foam::zero
+)
+:
+    regIOobject(io)
+{
+    if
+    (
+        io.readOpt() == IOobject::MUST_READ
+     || (io.readOpt() == IOobject::READ_IF_PRESENT && headerOk())
+    )
+    {
+        readFromStream();
+    }
+}
+
+
+template<class T, class BaseType>
+Foam::CompactIOField<T, BaseType>::CompactIOField
+(
+    const IOobject& io,
+    const label len
 )
 :
     regIOobject(io)
@@ -119,7 +139,7 @@ Foam::CompactIOField<T, BaseType>::CompactIOField
     }
     else
     {
-        Field<T>::setSize(size);
+        Field<T>::resize(len);
     }
 }
 
diff --git a/src/OpenFOAM/db/IOobjects/CompactIOField/CompactIOField.H b/src/OpenFOAM/db/IOobjects/CompactIOField/CompactIOField.H
index 09b6fb943fe3921a5ca8a6344c74934414b66036..d4e9b193f725f51fe6f13b2e591fe4fde0d5a22e 100644
--- a/src/OpenFOAM/db/IOobjects/CompactIOField/CompactIOField.H
+++ b/src/OpenFOAM/db/IOobjects/CompactIOField/CompactIOField.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2020 OpenCFD Ltd.
+    Copyright (C) 2020-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -39,18 +39,17 @@ SourceFiles
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef CompactIOField_H
-#define CompactIOField_H
+#ifndef Foam_CompactIOField_H
+#define Foam_CompactIOField_H
 
 #include "IOField.H"
-#include "regIOobject.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
 
-// Forward declarations
+// Forward Declarations
 template<class T, class BaseType> class CompactIOField;
 
 template<class T, class BaseType> Istream& operator>>
@@ -94,11 +93,14 @@ public:
         //- Construct from IOobject
         explicit CompactIOField(const IOobject& io);
 
-        //- Construct from IOobject; does local processor require reading?
+        //- Construct from IOobject, with local processor conditional reading
         CompactIOField(const IOobject& io, const bool valid);
 
-        //- Construct from IOobject and size
-        CompactIOField(const IOobject& io, const label size);
+        //- Construct from IOobject and zero size (if not read)
+        CompactIOField(const IOobject& io, Foam::zero);
+
+        //- Construct from IOobject and size (if not read)
+        CompactIOField(const IOobject& io, const label len);
 
         //- Construct from IOobject and a List/Field content
         CompactIOField(const IOobject& io, const UList<T>& content);
diff --git a/src/OpenFOAM/db/IOobjects/CompactIOList/CompactIOList.C b/src/OpenFOAM/db/IOobjects/CompactIOList/CompactIOList.C
index fcedb1ced5c588d1a8ed49bcd751939d71db6412..32620ffd08d145431e4143106d4248a8e079688c 100644
--- a/src/OpenFOAM/db/IOobjects/CompactIOList/CompactIOList.C
+++ b/src/OpenFOAM/db/IOobjects/CompactIOList/CompactIOList.C
@@ -103,6 +103,19 @@ Foam::CompactIOList<T, BaseType>::CompactIOList(const IOobject& io)
 }
 
 
+template<class T, class BaseType>
+Foam::CompactIOList<T, BaseType>::CompactIOList
+(
+    const IOobject& io,
+    Foam::zero
+)
+:
+    regIOobject(io)
+{
+    readContents();
+}
+
+
 template<class T, class BaseType>
 Foam::CompactIOList<T, BaseType>::CompactIOList
 (
diff --git a/src/OpenFOAM/db/IOobjects/CompactIOList/CompactIOList.H b/src/OpenFOAM/db/IOobjects/CompactIOList/CompactIOList.H
index b609985bdf1da2fd58daae6f6bb7aae48cec8aec..b3357a4ee2c0799d377c916c14fa2a884385950d 100644
--- a/src/OpenFOAM/db/IOobjects/CompactIOList/CompactIOList.H
+++ b/src/OpenFOAM/db/IOobjects/CompactIOList/CompactIOList.H
@@ -67,7 +67,7 @@ template<class T, class BaseType> Ostream& operator<<
 );
 
 /*---------------------------------------------------------------------------*\
-                           Class CompactIOList Declaration
+                        Class CompactIOList Declaration
 \*---------------------------------------------------------------------------*/
 
 template<class T, class BaseType>
@@ -106,6 +106,9 @@ public:
         //- Construct from IOobject
         explicit CompactIOList(const IOobject& io);
 
+        //- Construct from IOobject and zero size (if not read)
+        CompactIOList(const IOobject& io, Foam::zero);
+
         //- Construct from IOobject and default length of CompactIOList
         CompactIOList(const IOobject& io, const label len);
 
@@ -115,9 +118,9 @@ public:
         //- Construct by transferring the List content
         CompactIOList(const IOobject& io, List<T>&& content);
 
-    // Destructor
 
-        virtual ~CompactIOList() = default;
+    //- Destructor
+    virtual ~CompactIOList() = default;
 
 
     // Member Functions
diff --git a/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.C b/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.C
index 3c5988a24aacf03ce42c6cff0a4402b2483b831c..c73ff16cba2ac099bc5ac6124ea3c5713e4ffa15 100644
--- a/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.C
+++ b/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
-    Copyright (C) 2016-2018 OpenCFD Ltd.
+    Copyright (C) 2016-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -43,7 +43,19 @@ Foam::GlobalIOList<Type>::GlobalIOList(const IOobject& io)
 
 
 template<class Type>
-Foam::GlobalIOList<Type>::GlobalIOList(const IOobject& io, const label size)
+Foam::GlobalIOList<Type>::GlobalIOList(const IOobject& io, Foam::zero)
+:
+    regIOobject(io)
+{
+    // Check for MUST_READ_IF_MODIFIED
+    warnNoRereading<GlobalIOList<Type>>();
+
+    readHeaderOk(IOstream::BINARY, typeName);
+}
+
+
+template<class Type>
+Foam::GlobalIOList<Type>::GlobalIOList(const IOobject& io, const label len)
 :
     regIOobject(io)
 {
@@ -52,7 +64,7 @@ Foam::GlobalIOList<Type>::GlobalIOList(const IOobject& io, const label size)
 
     if (!readHeaderOk(IOstream::BINARY, typeName))
     {
-        List<Type>::setSize(size);
+        List<Type>::resize(len);
     }
 }
 
diff --git a/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.H b/src/OpenFOAM/db/IOobjects/GlobalIOList/GlobalIOList.H
index 2cf6f9e39f82f2150cf0471b3c08d9fdecfcf8ef..a38a1097f43afeb0fdd5e18e19c7b094bea4ed95 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 OpenCFD Ltd.
+    Copyright (C) 2018-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -69,8 +69,11 @@ public:
         //- Construct from IOobject
         explicit GlobalIOList(const IOobject& io);
 
-        //- Construct from IOobject
-        GlobalIOList(const IOobject& io, const label size);
+        //- Construct from IOobject and zero size (if not read)
+        GlobalIOList(const IOobject& io, Foam::zero);
+
+        //- Construct from IOobject and list size (if not read)
+        GlobalIOList(const IOobject& io, const label len);
 
         //- Construct from IOobject and a List
         GlobalIOList(const IOobject& io, const UList<Type>& content);
diff --git a/src/OpenFOAM/db/IOobjects/IOField/IOField.C b/src/OpenFOAM/db/IOobjects/IOField/IOField.C
index bb84a52e0c863de0382470fcef2c6951bc0812d2..c4edcd27daf90a7f0d2fa69dc7c6f14e116d99c5 100644
--- a/src/OpenFOAM/db/IOobjects/IOField/IOField.C
+++ b/src/OpenFOAM/db/IOobjects/IOField/IOField.C
@@ -102,6 +102,18 @@ Foam::IOField<Type>::IOField(const IOobject& io, const bool valid)
 }
 
 
+template<class Type>
+Foam::IOField<Type>::IOField(const IOobject& io, Foam::zero)
+:
+    regIOobject(io)
+{
+    // Check for MUST_READ_IF_MODIFIED
+    warnNoRereading<IOField<Type>>();
+
+    readContents();
+}
+
+
 template<class Type>
 Foam::IOField<Type>::IOField(const IOobject& io, const label len)
 :
diff --git a/src/OpenFOAM/db/IOobjects/IOField/IOField.H b/src/OpenFOAM/db/IOobjects/IOField/IOField.H
index 7dc71fdf145c67bc2a9661eab673f9fead60f703..e7ac808430da9e66c28d9ab60126b236765ee7ee 100644
--- a/src/OpenFOAM/db/IOobjects/IOField/IOField.H
+++ b/src/OpenFOAM/db/IOobjects/IOField/IOField.H
@@ -79,13 +79,16 @@ public:
         //- Construct from IOobject
         explicit IOField(const IOobject& io);
 
-        //- Construct from IOobject; does local processor require reading?
+        //- Construct from IOobject, with local processor conditional reading
         IOField(const IOobject& io, const bool valid);
 
-        //- Construct from IOobject and size (does not set values)
-        IOField(const IOobject& io, const label size);
+        //- Construct from IOobject and zero size (if not read)
+        IOField(const IOobject& io, Foam::zero);
 
-        //- Construct from IOobject and a List/Field content
+        //- Construct from IOobject and field size (if not read)
+        IOField(const IOobject& io, const label len);
+
+        //- Construct from IOobject and copy of List/Field content
         IOField(const IOobject& io, const UList<Type>& content);
 
         //- Construct by transferring the Field content
diff --git a/src/OpenFOAM/db/IOobjects/IOList/IOList.C b/src/OpenFOAM/db/IOobjects/IOList/IOList.C
index a058b524428cea08a64439b8704a64c59d285f8e..79c9cd690e8751d789a38f765a3e142f3fe09a93 100644
--- a/src/OpenFOAM/db/IOobjects/IOList/IOList.C
+++ b/src/OpenFOAM/db/IOobjects/IOList/IOList.C
@@ -65,6 +65,18 @@ Foam::IOList<T>::IOList(const IOobject& io)
 }
 
 
+template<class T>
+Foam::IOList<T>::IOList(const IOobject& io, Foam::zero)
+:
+    regIOobject(io)
+{
+    // Check for MUST_READ_IF_MODIFIED
+    warnNoRereading<IOList<T>>();
+
+    readContents();
+}
+
+
 template<class T>
 Foam::IOList<T>::IOList(const IOobject& io, const label len)
 :
diff --git a/src/OpenFOAM/db/IOobjects/IOList/IOList.H b/src/OpenFOAM/db/IOobjects/IOList/IOList.H
index 3894f96a3dfb8b6f0dccee57139953c603025920..d22d73e7c524543f1f316aec9c911effb1d9c5d9 100644
--- a/src/OpenFOAM/db/IOobjects/IOList/IOList.H
+++ b/src/OpenFOAM/db/IOobjects/IOList/IOList.H
@@ -79,13 +79,16 @@ public:
         //- Construct from IOobject
         explicit IOList(const IOobject& io);
 
-        //- Construct from IOobject and size of IOList
+        //- Construct from IOobject and zero size (if not read)
+        IOList(const IOobject& io, Foam::zero);
+
+        //- Construct from IOobject and list size (if not read)
         IOList(const IOobject& io, const label len);
 
-        //- Construct from IOobject and a copy of UList content
+        //- Construct from IOobject and a copy of content
         IOList(const IOobject& io, const UList<T>& content);
 
-        //- Construct by transferring the List content
+        //- Construct by transferring the content
         IOList(const IOobject& io, List<T>&& content);