diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C
index 6aabf93eabea0809280c6969484807012cf90118..b1a67daf3088a0acaaa0e452db4a554f07475462 100644
--- a/src/OpenFOAM/db/Time/Time.C
+++ b/src/OpenFOAM/db/Time/Time.C
@@ -468,6 +468,7 @@ Foam::Time::Time
     (
         args.parRunControl().parRun(),
         args.rootPath(),
+        args.distributed(),
         args.globalCaseName(),
         args.caseName(),
         systemName,
@@ -943,6 +944,17 @@ bool Foam::Time::run() const
                 addProfiling(functionObjects, "functionObjects.execute()");
                 functionObjects_.execute();
             }
+
+            // Check if the execution of functionObjects require re-reading
+            // any files. This moves effect of e.g. 'timeActivatedFileUpdate'
+            // one time step forward. Note that we cannot call
+            // readModifiedObjects from within timeActivatedFileUpdate since
+            // it might re-read the functionObjects themselves (and delete
+            // the timeActivatedFileUpdate one)
+            if (functionObjects_.filesModified())
+            {
+                const_cast<Time&>(*this).readModifiedObjects();
+            }
         }
 
         // Update the "running" status following the
diff --git a/src/OpenFOAM/db/Time/TimePaths.C b/src/OpenFOAM/db/Time/TimePaths.C
index ae5b5d182f9ba19f7107730c5429ac50ab7b92d5..05126252c6d3943f347a7a718a92d74c3f6f815e 100644
--- a/src/OpenFOAM/db/Time/TimePaths.C
+++ b/src/OpenFOAM/db/Time/TimePaths.C
@@ -70,6 +70,7 @@ Foam::TimePaths::TimePaths
 :
     processorCase_(false),
     rootPath_(rootPath),
+    distributed_(false),
     globalCaseName_(caseName),
     case_(caseName),
     system_(systemName),
@@ -84,6 +85,7 @@ Foam::TimePaths::TimePaths
 (
     const bool processorCase,
     const fileName& rootPath,
+    const bool distributed,
     const fileName& globalCaseName,
     const fileName& caseName,
     const word& systemName,
@@ -92,6 +94,7 @@ Foam::TimePaths::TimePaths
 :
     processorCase_(processorCase),
     rootPath_(rootPath),
+    distributed_(distributed),
     globalCaseName_(globalCaseName),
     case_(caseName),
     system_(systemName),
diff --git a/src/OpenFOAM/db/Time/TimePaths.H b/src/OpenFOAM/db/Time/TimePaths.H
index f7bbc25d2956b6f1a9f41ef5790061f8c2d27f7c..32674008b2382d39b083b56172046c97125a41ff 100644
--- a/src/OpenFOAM/db/Time/TimePaths.H
+++ b/src/OpenFOAM/db/Time/TimePaths.H
@@ -53,6 +53,7 @@ class TimePaths
 
         bool processorCase_;
         const fileName rootPath_;
+        bool distributed_;
         fileName globalCaseName_;
         fileName case_;
         const word system_;
@@ -84,6 +85,7 @@ public:
         (
             const bool processorCase,
             const fileName& rootPath,
+            const bool distributed,
             const fileName& globalCaseName,
             const fileName& caseName,
             const word& systemName,
@@ -139,6 +141,13 @@ public:
                 return constant_;
             }
 
+            //- Is case running with parallel distributed directories
+            //  (i.e. not NFS mounted)
+            bool distributed() const
+            {
+                return distributed_;
+            }
+
             //- Return constant name for the case
             //  which for parallel runs returns ../constant()
             fileName caseConstant() const;
diff --git a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C
index b0a92bc5c1363ce94fd28127a4bd5293bb51d311..4ce4821b46426a12f956665a6196dbd7dba25947 100644
--- a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C
+++ b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -146,6 +146,12 @@ bool Foam::functionObject::adjustTimeStep()
 }
 
 
+bool Foam::functionObject::filesModified() const
+{
+    return false;
+}
+
+
 void Foam::functionObject::updateMesh(const mapPolyMesh&)
 {}
 
diff --git a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.H b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.H
index 9c7d56a340d99c9a9bebecdc29ee1ea7329ff5dc..367c0094ee5edbd8c80c2341bdc38831815ce42e 100644
--- a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.H
+++ b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -233,6 +233,9 @@ public:
         //- Called at the end of Time::adjustDeltaT() if adjustTime is true
         virtual bool adjustTimeStep();
 
+        //- Did any file get changed during execution?
+        virtual bool filesModified() const;
+
         //- Update for changes of mesh
         virtual void updateMesh(const mapPolyMesh& mpm);
 
diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C
index 142da30fa6a69ec903ea19965708b02b3a89915e..d64e264eda0a7948d84cd1e4ee29aab5c4de3be0 100644
--- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C
+++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -819,6 +819,21 @@ bool Foam::functionObjectList::read()
 }
 
 
+bool Foam::functionObjectList::filesModified() const
+{
+    bool ok = false;
+    if (execution_)
+    {
+        forAll(*this, objectI)
+        {
+            bool changed = operator[](objectI).filesModified();
+            ok = ok || changed;
+        }
+    }
+    return ok;
+}
+
+
 void Foam::functionObjectList::updateMesh(const mapPolyMesh& mpm)
 {
     if (execution_)
diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H
index 41e6a1fd468767f7698efcab747720a3175fea28..2a3efb45ed3d2e7beb6b0826e1919236ade85c16 100644
--- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H
+++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -264,6 +264,9 @@ public:
         //- Called at the end of Time::adjustDeltaT() if adjustTime is true
         bool adjustTimeStep();
 
+        //- Did any file get changed during execution?
+        bool filesModified() const;
+
         //- Update for changes of mesh
         void updateMesh(const mapPolyMesh& mpm);
 
diff --git a/src/OpenFOAM/db/functionObjects/timeControl/timeControlFunctionObject.C b/src/OpenFOAM/db/functionObjects/timeControl/timeControlFunctionObject.C
index 02b174d419f3471a8fe53d274cc3583053f591f2..8e99aebe071bd8ba74829165bca0195bd61ae7dc 100644
--- a/src/OpenFOAM/db/functionObjects/timeControl/timeControlFunctionObject.C
+++ b/src/OpenFOAM/db/functionObjects/timeControl/timeControlFunctionObject.C
@@ -220,6 +220,17 @@ bool Foam::functionObjects::timeControl::read
 }
 
 
+bool Foam::functionObjects::timeControl::filesModified() const
+{
+    bool mod = false;
+    if (active())
+    {
+        mod = foPtr_->filesModified();
+    }
+    return mod;
+}
+
+
 void Foam::functionObjects::timeControl::updateMesh
 (
     const mapPolyMesh& mpm
diff --git a/src/OpenFOAM/db/functionObjects/timeControl/timeControlFunctionObject.H b/src/OpenFOAM/db/functionObjects/timeControl/timeControlFunctionObject.H
index 9108d12f52cfee4afa60385e4dc74f2ab21898ef..aac5343c424ededd4a4f2eec0a1f94dd033d7ec9 100644
--- a/src/OpenFOAM/db/functionObjects/timeControl/timeControlFunctionObject.H
+++ b/src/OpenFOAM/db/functionObjects/timeControl/timeControlFunctionObject.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -177,6 +177,9 @@ public:
             //- Called at the end of Time::adjustDeltaT() if adjustTime is true
             virtual bool adjustTimeStep();
 
+            //- Did any file get changed during execution?
+            virtual bool filesModified() const;
+
             //- Read and set the function object if its data have changed
             virtual bool read(const dictionary&);
 
diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C
index 1139bbb8f163d9d931f6eeb67c94950e9f72e56e..198a1b4e2078db040b5037edafe272ca77473ff3 100644
--- a/src/OpenFOAM/global/argList/argList.C
+++ b/src/OpenFOAM/global/argList/argList.C
@@ -429,7 +429,8 @@ Foam::argList::argList
 )
 :
     args_(argc),
-    options_(argc)
+    options_(argc),
+    distributed_(false)
 {
     // Check if this run is a parallel run by searching for any parallel option
     // If found call runPar which might filter argv
@@ -669,6 +670,7 @@ void Foam::argList::parse
             label dictNProcs = -1;
             if (options_.found("roots"))
             {
+                distributed_ = true;
                 source = "-roots";
                 IStringStream is(options_["roots"]);
                 roots = readList<fileName>(is);
@@ -702,6 +704,7 @@ void Foam::argList::parse
 
                 if (decompDict.lookupOrDefault("distributed", false))
                 {
+                    distributed_ = true;
                     decompDict.lookup("roots") >> roots;
                 }
             }
@@ -771,7 +774,7 @@ void Foam::argList::parse
                     options_.set("case", roots[slave-1]/globalCase_);
 
                     OPstream toSlave(Pstream::scheduled, slave);
-                    toSlave << args_ << options_;
+                    toSlave << args_ << options_ << roots.size();
                 }
                 options_.erase("case");
 
@@ -818,7 +821,7 @@ void Foam::argList::parse
                 )
                 {
                     OPstream toSlave(Pstream::scheduled, slave);
-                    toSlave << args_ << options_;
+                    toSlave << args_ << options_ << roots.size();
                 }
             }
         }
@@ -826,7 +829,7 @@ void Foam::argList::parse
         {
             // Collect the master's argument list
             IPstream fromMaster(Pstream::scheduled, Pstream::masterNo());
-            fromMaster >> args_ >> options_;
+            fromMaster >> args_ >> options_ >> distributed_;
 
             // Establish rootPath_/globalCase_/case_ for slave
             getRootCase();
diff --git a/src/OpenFOAM/global/argList/argList.H b/src/OpenFOAM/global/argList/argList.H
index f2635744536ebd549396349718072010a139345f..8ff04458c4d5ea5d0aac0bbe87bad80313d8c715 100644
--- a/src/OpenFOAM/global/argList/argList.H
+++ b/src/OpenFOAM/global/argList/argList.H
@@ -109,6 +109,7 @@ class argList
 
         word executable_;
         fileName rootPath_;
+        bool distributed_;
         fileName globalCase_;
         fileName case_;
         string argListStr_;
@@ -221,6 +222,10 @@ public:
             //- Return root path
             inline const fileName& rootPath() const;
 
+            //- Return distributed flag (i.e. are rootPaths different on
+            //  different machines)
+            inline bool distributed() const;
+
             //- Return case name (parallel run) or global case (serial run)
             inline const fileName& caseName() const;
 
diff --git a/src/OpenFOAM/global/argList/argListI.H b/src/OpenFOAM/global/argList/argListI.H
index 47ad29a58eb208a5c21b44b6e2ade8336b5e2fd4..28caff6acbcd561a0928471a13fae7aa6c59e364 100644
--- a/src/OpenFOAM/global/argList/argListI.H
+++ b/src/OpenFOAM/global/argList/argListI.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -39,6 +39,12 @@ inline const Foam::fileName& Foam::argList::rootPath() const
 }
 
 
+inline bool Foam::argList::distributed() const
+{
+    return distributed_;
+}
+
+
 inline const Foam::fileName& Foam::argList::caseName() const
 {
     return case_;
diff --git a/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.C b/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.C
index 18b233e64c3cfd5c234f3520dce7c47b1d3a362f..ed48e24fcf45620d36a88ab4cdfdc6e0b151780c 100644
--- a/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.C
+++ b/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.C
@@ -48,11 +48,10 @@ namespace functionObjects
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-void Foam::functionObjects::timeActivatedFileUpdate::updateFile
-(
-    const bool checkFiles
-)
+void Foam::functionObjects::timeActivatedFileUpdate::updateFile()
 {
+    modified_ = false;
+
     label i = lastIndex_;
     while
     (
@@ -68,19 +67,15 @@ void Foam::functionObjects::timeActivatedFileUpdate::updateFile
         Log << nl << type() << ": copying file" << nl << timeVsFile_[i].second()
             << nl << "to:" << nl << fileToUpdate_ << nl << endl;
 
-        fileName destFile(fileToUpdate_ + Foam::name(pid()));
-        cp(timeVsFile_[i].second(), destFile);
-        mv(destFile, fileToUpdate_);
-        lastIndex_ = i;
-
-        if (checkFiles)
+        if (Pstream::master() || time_.distributed())
         {
-            // Do an early check to avoid an additional iteration before
-            // any changes are picked up (see Time::run : does readModified
-            // before executing FOs). Note we have to protect the read
-            // constructor of *this from triggering this behaviour.
-            const_cast<Time&>(time_).Time::readModifiedObjects();
+            // Slaves do not copy if running non-distributed
+            fileName destFile(fileToUpdate_ + Foam::name(pid()));
+            cp(timeVsFile_[i].second(), destFile);
+            mv(destFile, fileToUpdate_);
         }
+        lastIndex_ = i;
+        modified_ = true;
     }
 }
 
@@ -98,7 +93,8 @@ Foam::functionObjects::timeActivatedFileUpdate::timeActivatedFileUpdate
     time_(runTime),
     fileToUpdate_("unknown-fileToUpdate"),
     timeVsFile_(),
-    lastIndex_(-1)
+    lastIndex_(-1),
+    modified_(false)
 {
     read(dict);
 }
@@ -142,8 +138,8 @@ bool Foam::functionObjects::timeActivatedFileUpdate::read
             << timeVsFile_[i].second() << endl;
     }
 
-    // Copy starting files. Avoid recursion by not checking for modified files.
-    updateFile(false);
+    // Copy starting files
+    updateFile();
 
     return true;
 }
@@ -151,7 +147,7 @@ bool Foam::functionObjects::timeActivatedFileUpdate::read
 
 bool Foam::functionObjects::timeActivatedFileUpdate::execute()
 {
-    updateFile(true);
+    updateFile();
 
     return true;
 }
@@ -163,4 +159,10 @@ bool Foam::functionObjects::timeActivatedFileUpdate::write()
 }
 
 
+bool Foam::functionObjects::timeActivatedFileUpdate::filesModified() const
+{
+    return modified_;
+}
+
+
 // ************************************************************************* //
diff --git a/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.H b/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.H
index 4e0981ee33886c563a49c41c6c5e0b3743400626..e6fbedcc82e8d7657cd0a1d8022aa86aedaad3c2 100644
--- a/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.H
+++ b/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.H
@@ -106,11 +106,14 @@ class timeActivatedFileUpdate
         //- Index of last file copied
         label lastIndex_;
 
+        //- Has anything been copied?
+        bool modified_;
+
 
     // Private Member Functions
 
         //- Update file
-        void updateFile(const bool checkFiles);
+        void updateFile();
 
         //- Disallow default bitwise copy construct
         timeActivatedFileUpdate(const timeActivatedFileUpdate&);
@@ -150,6 +153,9 @@ public:
 
         //- Do nothing
         virtual bool write();
+
+        //- Did any file get changed during execution?
+        virtual bool filesModified() const;
 };