diff --git a/etc/controlDict b/etc/controlDict
index 5be9a1166468ae191aa9e67e01f47c4351a359a2..02bdf85dbd4c5257794ab8006fda7a93474b1802 100644
--- a/etc/controlDict
+++ b/etc/controlDict
@@ -82,6 +82,10 @@ OptimisationSwitches
     // updated. Set to 0 on distributed case.
     fileModificationSkew 10;
 
+    // How often retest (using above fileModificationSkew) before giving up.
+    // Default is 1.
+    //maxFileModificationPolls 100;
+
     //- Modification checking:
     //  - timeStamp         : use modification time on file
     //  - inotify           : use inotify framework
diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C
index bc9c22c355d596463f916da4173534886337e345..72a1f92778f3851d0c946ea32caf3f07c5ec7314 100644
--- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C
+++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C
@@ -222,44 +222,77 @@ Foam::functionEntries::codeStream::getFunction
             off_t masterSize = mySize;
             Pstream::scatter(masterSize);
 
-            DebugPout
-                << nl << "on processor " << Pstream::myProcNo()
-                << " have masterSize:" << masterSize
-                << " and localSize:" << mySize << endl;
-
-            if (mySize < masterSize)
+            for
+            (
+                label iter = 0;
+                iter < regIOobject::maxFileModificationPolls;
+                iter++
+            )
             {
                 DebugPout
-                    << "Local file " << libPath
-                    << " not of same size (" << mySize
-                    << ") as master ("
-                    << masterSize << "). Waiting for "
-                    << regIOobject::fileModificationSkew
-                    << " seconds." << endl;
-
-                Foam::sleep(regIOobject::fileModificationSkew);
+                    << "on processor " << Pstream::myProcNo()
+                    << "masterSize:" << masterSize
+                    << " and localSize:" << mySize
+                    << endl;
 
-                // Recheck local size
-                mySize = Foam::fileSize(libPath);
-
-                if (mySize < masterSize)
+                if (mySize == masterSize)
                 {
-                    FatalIOErrorInFunction(parentDict)
-                        << "Cannot read (NFS mounted) library " << nl
-                        << libPath << nl
+                    break;
+                }
+                else if (mySize > masterSize)
+                {
+                    FatalIOErrorInFunction(context.dict())
+                        << "Excessive size when reading (NFS mounted) library "
+                        << nl << libPath << nl
                         << "on processor " << Pstream::myProcNo()
                         << " detected size " << mySize
                         << " whereas master size is " << masterSize
                         << " bytes." << nl
-                        << "If your case is not NFS mounted"
+                        << "If your case is NFS mounted increase"
+                        << " fileModificationSkew or maxFileModificationPolls;"
+                        << nl << "If your case is not NFS mounted"
                         << " (so distributed) set fileModificationSkew"
                         << " to 0"
                         << exit(FatalIOError);
                 }
+                else
+                {
+                    DebugPout
+                        << "Local file " << libPath
+                        << " not of same size (" << mySize
+                        << ") as master ("
+                        << masterSize << "). Waiting for "
+                        << regIOobject::fileModificationSkew
+                        << " seconds." << endl;
+
+                    Foam::sleep(regIOobject::fileModificationSkew);
+
+                    // Recheck local size
+                    mySize = Foam::fileSize(libPath);
+                }
+            }
+
+
+            // Finished doing iterations. Do final check
+            if (mySize != masterSize)
+            {
+                FatalIOErrorInFunction(context.dict())
+                    << "Cannot read (NFS mounted) library " << nl
+                    << libPath << nl
+                    << "on processor " << Pstream::myProcNo()
+                    << " detected size " << mySize
+                    << " whereas master size is " << masterSize
+                    << " bytes." << nl
+                    << "If your case is NFS mounted increase"
+                    << " fileModificationSkew or maxFileModificationPolls;"
+                    << nl << "If your case is not NFS mounted"
+                    << " (so distributed) set fileModificationSkew"
+                    << " to 0"
+                    << exit(FatalIOError);
             }
 
             DebugPout
-                << nl << "on processor " << Pstream::myProcNo()
+                << "on processor " << Pstream::myProcNo()
                 << " after waiting: have masterSize:" << masterSize
                 << " and localSize:" << mySize << endl;
         }
diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C
index 2be000110e952b29b52c1b3d63ccc5b409f037ba..37731c909acc9ca3683bfc66d63c8a08c69e4bb0 100644
--- a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C
+++ b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C
@@ -250,54 +250,79 @@ void Foam::codedBase::createLibrary
         off_t masterSize = mySize;
         Pstream::scatter(masterSize);
 
-        if (debug)
+        for
+        (
+            label iter = 0;
+            iter < regIOobject::maxFileModificationPolls;
+            iter++
+        )
         {
-            Pout<< endl<< "on processor " << Pstream::myProcNo()
+            DebugPout
+                << "on processor " << Pstream::myProcNo()
                 << " have masterSize:" << masterSize
                 << " and localSize:" << mySize
                 << endl;
-        }
-
 
-        if (mySize < masterSize)
-        {
-            if (debug)
+            if (mySize == masterSize)
             {
-                Pout<< "Local file " << libPath
-                    << " not of same size (" << mySize
-                    << ") as master ("
-                    << masterSize << "). Waiting for "
-                    << regIOobject::fileModificationSkew
-                    << " seconds." << endl;
+                break;
             }
-            Foam::sleep(regIOobject::fileModificationSkew);
-
-            // Recheck local size
-            mySize = Foam::fileSize(libPath);
-
-            if (mySize < masterSize)
+            else if (mySize > masterSize)
             {
                 FatalIOErrorInFunction(context.dict())
-                    << "Cannot read (NFS mounted) library " << nl
-                    << libPath << nl
+                    << "Excessive size when reading (NFS mounted) library "
+                    << nl << libPath << nl
                     << "on processor " << Pstream::myProcNo()
                     << " detected size " << mySize
                     << " whereas master size is " << masterSize
                     << " bytes." << nl
-                    << "If your case is not NFS mounted"
+                    << "If your case is NFS mounted increase"
+                    << " fileModificationSkew or maxFileModificationPolls;"
+                    << nl << "If your case is not NFS mounted"
                     << " (so distributed) set fileModificationSkew"
                     << " to 0"
                     << exit(FatalIOError);
             }
+            else
+            {
+                DebugPout
+                    << "Local file " << libPath
+                    << " not of same size (" << mySize
+                    << ") as master ("
+                    << masterSize << "). Waiting for "
+                    << regIOobject::fileModificationSkew
+                    << " seconds." << endl;
+
+                Foam::sleep(regIOobject::fileModificationSkew);
+
+                // Recheck local size
+                mySize = Foam::fileSize(libPath);
+            }
         }
 
-        if (debug)
+
+        // Finished doing iterations. Do final check
+        if (mySize != masterSize)
         {
-            Pout<< endl<< "on processor " << Pstream::myProcNo()
-                << " after waiting: have masterSize:" << masterSize
-                << " and localSize:" << mySize
-                << endl;
+            FatalIOErrorInFunction(context.dict())
+                << "Cannot read (NFS mounted) library " << nl
+                << libPath << nl
+                << "on processor " << Pstream::myProcNo()
+                << " detected size " << mySize
+                << " whereas master size is " << masterSize
+                << " bytes." << nl
+                << "If your case is NFS mounted increase"
+                << " fileModificationSkew or maxFileModificationPolls;"
+                << nl << "If your case is not NFS mounted"
+                << " (so distributed) set fileModificationSkew"
+                << " to 0"
+                << exit(FatalIOError);
         }
+
+        DebugPout
+            << "on processor " << Pstream::myProcNo()
+            << " after waiting: have masterSize:" << masterSize
+            << " and localSize:" << mySize << endl;
     }
     reduce(create, orOp<bool>());
 }
diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.C b/src/OpenFOAM/db/regIOobject/regIOobject.C
index 3fe337f1b6506a9cba3546c2a3f85b21e7309f0f..eb938a6605be4218cde5711ea18157de9415a1a4 100644
--- a/src/OpenFOAM/db/regIOobject/regIOobject.C
+++ b/src/OpenFOAM/db/regIOobject/regIOobject.C
@@ -50,6 +50,17 @@ registerOptSwitch
     Foam::regIOobject::fileModificationSkew
 );
 
+int Foam::regIOobject::maxFileModificationPolls
+(
+    Foam::debug::optimisationSwitch("maxFileModificationPolls", 1)
+);
+registerOptSwitch
+(
+    "maxFileModificationPolls",
+    int,
+    Foam::regIOobject::maxFileModificationPolls
+);
+
 
 bool Foam::regIOobject::masterOnlyReading = false;
 
diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.H b/src/OpenFOAM/db/regIOobject/regIOobject.H
index 0f9ae1196c6c608f67f16932b051271d2b595c8b..e990fa7ab67d6730ccacd7e80bdd84a941d3ff4e 100644
--- a/src/OpenFOAM/db/regIOobject/regIOobject.H
+++ b/src/OpenFOAM/db/regIOobject/regIOobject.H
@@ -131,6 +131,8 @@ public:
 
         static float fileModificationSkew;
 
+        static int maxFileModificationPolls;
+
 
     // Constructors
 
diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C
index 99d2f04e2eee50021331aa0b69f3879ffc5e03f9..01f1bddc5e7c0eee9aafdec6253cd83cbe8a3f28 100644
--- a/src/OpenFOAM/global/argList/argList.C
+++ b/src/OpenFOAM/global/argList/argList.C
@@ -1501,8 +1501,27 @@ void Foam::argList::parse
                 )
             )
             {
-                Info<< " (fileModificationSkew "
-                    << regIOobject::fileModificationSkew << ")";
+                if (regIOobject::maxFileModificationPolls == 1)
+                {
+                    Info<< " (fileModificationSkew "
+                        << regIOobject::fileModificationSkew
+                        << ")";
+                }
+                else if (regIOobject::maxFileModificationPolls > 1)
+                {
+                    Info<< " (fileModificationSkew "
+                        << regIOobject::fileModificationSkew
+                        << ", maxFileModificationPolls "
+                        << regIOobject::maxFileModificationPolls
+                        << ")";
+                }
+                else
+                {
+                    FatalErrorInFunction
+                        << "Invalid setting for maxFileModificationPolls "
+                        << regIOobject::maxFileModificationPolls
+                        << exit(FatalError);
+                }
             }
             Info<< nl;