diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
index bc94782641e5dd91485a0b44d2b3df7ebc173f59..f9425cc506b90b14426e9532e3618ea96a0cd57e 100644
--- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
+++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -43,6 +43,9 @@ Usage
         Decompose all regions in regionProperties. Does not check for
         existence of processor*.
 
+      - \par -copyZero \n
+        Copy \a 0 directory to processor* rather than decompose the fields.
+
       - \par -copyUniform \n
         Copy any \a uniform directories too.
 
@@ -215,6 +218,11 @@ int main(int argc, char *argv[])
         "decomposition method or as a volScalarField for post-processing."
     );
     argList::addBoolOption
+    (
+        "copyZero",
+        "Copy \a 0 directory to processor* rather than decompose the fields"
+    );
+    argList::addBoolOption
     (
         "copyUniform",
         "copy any uniform/ directories too"
@@ -247,6 +255,7 @@ int main(int argc, char *argv[])
 
     bool allRegions              = args.optionFound("allRegions");
     bool writeCellDist           = args.optionFound("cellDist");
+    bool copyZero                = args.optionFound("copyZero");
     bool copyUniform             = args.optionFound("copyUniform");
     bool decomposeFieldsOnly     = args.optionFound("fields");
     bool decomposeSets           = !args.optionFound("noSets");
@@ -476,668 +485,715 @@ int main(int argc, char *argv[])
         }
 
 
-
-        // Caches
-        // ~~~~~~
-        // Cached processor meshes and maps. These are only preserved if running
-        // with multiple times.
-        PtrList<Time> processorDbList(mesh.nProcs());
-        PtrList<fvMesh> procMeshList(mesh.nProcs());
-        PtrList<labelIOList> faceProcAddressingList(mesh.nProcs());
-        PtrList<labelIOList> cellProcAddressingList(mesh.nProcs());
-        PtrList<labelIOList> boundaryProcAddressingList(mesh.nProcs());
-        PtrList<fvFieldDecomposer> fieldDecomposerList(mesh.nProcs());
-        PtrList<dimFieldDecomposer> dimFieldDecomposerList(mesh.nProcs());
-        PtrList<labelIOList> pointProcAddressingList(mesh.nProcs());
-        PtrList<pointFieldDecomposer> pointFieldDecomposerList(mesh.nProcs());
-
-
-
-        // Loop over all times
-        forAll(times, timeI)
+        if (copyZero)
         {
-            runTime.setTime(times[timeI], timeI);
-
-            Info<< "Time = " << runTime.timeName() << endl;
-
-            // Search for list of objects for this time
-            IOobjectList objects(mesh, runTime.timeName());
-
-
-            // Construct the vol fields
-            // ~~~~~~~~~~~~~~~~~~~~~~~~
-            PtrList<volScalarField> volScalarFields;
-            readFields(mesh, objects, volScalarFields);
-            PtrList<volVectorField> volVectorFields;
-            readFields(mesh, objects, volVectorFields);
-            PtrList<volSphericalTensorField> volSphericalTensorFields;
-            readFields(mesh, objects, volSphericalTensorFields);
-            PtrList<volSymmTensorField> volSymmTensorFields;
-            readFields(mesh, objects, volSymmTensorFields);
-            PtrList<volTensorField> volTensorFields;
-            readFields(mesh, objects, volTensorFields);
-
-
-            // Construct the dimensioned fields
-            // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-            PtrList<DimensionedField<scalar, volMesh>> dimScalarFields;
-            readFields(mesh, objects, dimScalarFields);
-            PtrList<DimensionedField<vector, volMesh>> dimVectorFields;
-            readFields(mesh, objects, dimVectorFields);
-            PtrList<DimensionedField<sphericalTensor, volMesh>>
-                dimSphericalTensorFields;
-            readFields(mesh, objects, dimSphericalTensorFields);
-            PtrList<DimensionedField<symmTensor, volMesh>> dimSymmTensorFields;
-            readFields(mesh, objects, dimSymmTensorFields);
-            PtrList<DimensionedField<tensor, volMesh>> dimTensorFields;
-            readFields(mesh, objects, dimTensorFields);
-
-
-            // Construct the surface fields
-            // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-            PtrList<surfaceScalarField> surfaceScalarFields;
-            readFields(mesh, objects, surfaceScalarFields);
-            PtrList<surfaceVectorField> surfaceVectorFields;
-            readFields(mesh, objects, surfaceVectorFields);
-            PtrList<surfaceSphericalTensorField> surfaceSphericalTensorFields;
-            readFields(mesh, objects, surfaceSphericalTensorFields);
-            PtrList<surfaceSymmTensorField> surfaceSymmTensorFields;
-            readFields(mesh, objects, surfaceSymmTensorFields);
-            PtrList<surfaceTensorField> surfaceTensorFields;
-            readFields(mesh, objects, surfaceTensorFields);
-
-
-            // Construct the point fields
-            // ~~~~~~~~~~~~~~~~~~~~~~~~~~
-            const pointMesh& pMesh = pointMesh::New(mesh);
-
-            PtrList<pointScalarField> pointScalarFields;
-            readFields(pMesh, objects, pointScalarFields);
-            PtrList<pointVectorField> pointVectorFields;
-            readFields(pMesh, objects, pointVectorFields);
-            PtrList<pointSphericalTensorField> pointSphericalTensorFields;
-            readFields(pMesh, objects, pointSphericalTensorFields);
-            PtrList<pointSymmTensorField> pointSymmTensorFields;
-            readFields(pMesh, objects, pointSymmTensorFields);
-            PtrList<pointTensorField> pointTensorFields;
-            readFields(pMesh, objects, pointTensorFields);
-
-
-            // Construct the Lagrangian fields
-            // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-            fileNameList cloudDirs
-            (
-                readDir(runTime.timePath()/cloud::prefix, fileName::DIRECTORY)
-            );
-
-            // Particles
-            PtrList<Cloud<indexedParticle>> lagrangianPositions
-            (
-                cloudDirs.size()
-            );
-            // Particles per cell
-            PtrList<List<SLList<indexedParticle*>*>> cellParticles
-            (
-                cloudDirs.size()
-            );
-
-            PtrList<PtrList<labelIOField>> lagrangianLabelFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<labelFieldCompactIOField>>
-            lagrangianLabelFieldFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<scalarIOField>> lagrangianScalarFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<scalarFieldCompactIOField>>
-            lagrangianScalarFieldFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<vectorIOField>> lagrangianVectorFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<vectorFieldCompactIOField>>
-            lagrangianVectorFieldFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<sphericalTensorIOField>>
-            lagrangianSphericalTensorFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<sphericalTensorFieldCompactIOField>>
-                lagrangianSphericalTensorFieldFields(cloudDirs.size());
-            PtrList<PtrList<symmTensorIOField>> lagrangianSymmTensorFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<symmTensorFieldCompactIOField>>
-            lagrangianSymmTensorFieldFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<tensorIOField>> lagrangianTensorFields
-            (
-                cloudDirs.size()
-            );
-            PtrList<PtrList<tensorFieldCompactIOField>>
-            lagrangianTensorFieldFields
-            (
-                cloudDirs.size()
-            );
-
-            label cloudI = 0;
-
-            forAll(cloudDirs, i)
+            // Link the 0 directory into each of the processor directories
+            for (label proci = 0; proci < mesh.nProcs(); proci++)
             {
-                IOobjectList sprayObjs
+                Time processorDb
                 (
-                    mesh,
-                    runTime.timeName(),
-                    cloud::prefix/cloudDirs[i],
-                    IOobject::MUST_READ,
-                    IOobject::NO_WRITE,
-                    false
+                    Time::controlDictName,
+                    args.rootPath(),
+                    args.caseName()/fileName(word("processor") + name(proci))
                 );
+                processorDb.setTime(runTime);
 
-                IOobject* positionsPtr = sprayObjs.lookup(word("positions"));
-
-                if (positionsPtr)
+                if (isDir(runTime.timePath()))
                 {
-                    // Read lagrangian particles
-                    // ~~~~~~~~~~~~~~~~~~~~~~~~~
-
-                    Info<< "Identified lagrangian data set: " << cloudDirs[i]
-                        << endl;
-
-                    lagrangianPositions.set
-                    (
-                        cloudI,
-                        new Cloud<indexedParticle>
-                        (
-                            mesh,
-                            cloudDirs[i],
-                            false
-                        )
-                    );
-
+                    const fileName timePath = processorDb.timePath();
 
-                    // Sort particles per cell
-                    // ~~~~~~~~~~~~~~~~~~~~~~~
-
-                    cellParticles.set
-                    (
-                        cloudI,
-                        new List<SLList<indexedParticle*>*>
-                        (
-                            mesh.nCells(),
-                            static_cast<SLList<indexedParticle*>*>(nullptr)
-                        )
-                    );
+                    Info<< "Processor " << proci
+                        << ": linking " << runTime.timePath() << nl
+                        << " to " << processorDb.timePath() << endl;
+                    cp(runTime.timePath(), processorDb.timePath());
+                }
+            }
+        }
+        else
+        {
+            // Decompose the field files
+
+            // Cached processor meshes and maps. These are only preserved if
+            // running with multiple times.
+            PtrList<Time> processorDbList(mesh.nProcs());
+            PtrList<fvMesh> procMeshList(mesh.nProcs());
+            PtrList<labelIOList> faceProcAddressingList(mesh.nProcs());
+            PtrList<labelIOList> cellProcAddressingList(mesh.nProcs());
+            PtrList<labelIOList> boundaryProcAddressingList(mesh.nProcs());
+            PtrList<fvFieldDecomposer> fieldDecomposerList(mesh.nProcs());
+            PtrList<dimFieldDecomposer> dimFieldDecomposerList(mesh.nProcs());
+            PtrList<labelIOList> pointProcAddressingList(mesh.nProcs());
+            PtrList<pointFieldDecomposer> pointFieldDecomposerList
+            (
+                mesh.nProcs()
+            );
 
-                    label i = 0;
 
-                    forAllIter
+            // Loop over all times
+            forAll(times, timeI)
+            {
+                runTime.setTime(times[timeI], timeI);
+
+                Info<< "Time = " << runTime.timeName() << endl;
+
+                // Search for list of objects for this time
+                IOobjectList objects(mesh, runTime.timeName());
+
+
+                // Construct the vol fields
+                // ~~~~~~~~~~~~~~~~~~~~~~~~
+                PtrList<volScalarField> volScalarFields;
+                readFields(mesh, objects, volScalarFields);
+                PtrList<volVectorField> volVectorFields;
+                readFields(mesh, objects, volVectorFields);
+                PtrList<volSphericalTensorField> volSphericalTensorFields;
+                readFields(mesh, objects, volSphericalTensorFields);
+                PtrList<volSymmTensorField> volSymmTensorFields;
+                readFields(mesh, objects, volSymmTensorFields);
+                PtrList<volTensorField> volTensorFields;
+                readFields(mesh, objects, volTensorFields);
+
+
+                // Construct the dimensioned fields
+                // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+                PtrList<DimensionedField<scalar, volMesh>> dimScalarFields;
+                readFields(mesh, objects, dimScalarFields);
+                PtrList<DimensionedField<vector, volMesh>> dimVectorFields;
+                readFields(mesh, objects, dimVectorFields);
+                PtrList<DimensionedField<sphericalTensor, volMesh>>
+                    dimSphericalTensorFields;
+                readFields(mesh, objects, dimSphericalTensorFields);
+                PtrList<DimensionedField<symmTensor, volMesh>>
+                    dimSymmTensorFields;
+                readFields(mesh, objects, dimSymmTensorFields);
+                PtrList<DimensionedField<tensor, volMesh>> dimTensorFields;
+                readFields(mesh, objects, dimTensorFields);
+
+
+                // Construct the surface fields
+                // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+                PtrList<surfaceScalarField> surfaceScalarFields;
+                readFields(mesh, objects, surfaceScalarFields);
+                PtrList<surfaceVectorField> surfaceVectorFields;
+                readFields(mesh, objects, surfaceVectorFields);
+                PtrList<surfaceSphericalTensorField>
+                    surfaceSphericalTensorFields;
+                readFields(mesh, objects, surfaceSphericalTensorFields);
+                PtrList<surfaceSymmTensorField> surfaceSymmTensorFields;
+                readFields(mesh, objects, surfaceSymmTensorFields);
+                PtrList<surfaceTensorField> surfaceTensorFields;
+                readFields(mesh, objects, surfaceTensorFields);
+
+
+                // Construct the point fields
+                // ~~~~~~~~~~~~~~~~~~~~~~~~~~
+                const pointMesh& pMesh = pointMesh::New(mesh);
+
+                PtrList<pointScalarField> pointScalarFields;
+                readFields(pMesh, objects, pointScalarFields);
+                PtrList<pointVectorField> pointVectorFields;
+                readFields(pMesh, objects, pointVectorFields);
+                PtrList<pointSphericalTensorField> pointSphericalTensorFields;
+                readFields(pMesh, objects, pointSphericalTensorFields);
+                PtrList<pointSymmTensorField> pointSymmTensorFields;
+                readFields(pMesh, objects, pointSymmTensorFields);
+                PtrList<pointTensorField> pointTensorFields;
+                readFields(pMesh, objects, pointTensorFields);
+
+
+                // Construct the Lagrangian fields
+                // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+                fileNameList cloudDirs
+                (
+                    readDir
                     (
-                        Cloud<indexedParticle>,
-                        lagrangianPositions[cloudI],
-                        iter
+                        runTime.timePath()/cloud::prefix, fileName::DIRECTORY
                     )
-                    {
-                        iter().index() = i++;
-
-                        label celli = iter().cell();
-
-                        // Check
-                        if (celli < 0 || celli >= mesh.nCells())
-                        {
-                            FatalErrorInFunction
-                                << "Illegal cell number " << celli
-                                << " for particle with index " << iter().index()
-                                << " at position " << iter().position() << nl
-                                << "Cell number should be between 0 and "
-                                << mesh.nCells()-1 << nl
-                                << "On this mesh the particle should"
-                                << " be in cell "
-                                << mesh.findCell(iter().position())
-                                << exit(FatalError);
-                        }
+                );
 
-                        if (!cellParticles[cloudI][celli])
-                        {
-                            cellParticles[cloudI][celli] =
-                                new SLList<indexedParticle*>();
-                        }
+                // Particles
+                PtrList<Cloud<indexedParticle>> lagrangianPositions
+                (
+                    cloudDirs.size()
+                );
+                // Particles per cell
+                PtrList<List<SLList<indexedParticle*>*>> cellParticles
+                (
+                    cloudDirs.size()
+                );
 
-                        cellParticles[cloudI][celli]->append(&iter());
-                    }
+                PtrList<PtrList<labelIOField>> lagrangianLabelFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<labelFieldCompactIOField>>
+                lagrangianLabelFieldFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<scalarIOField>> lagrangianScalarFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<scalarFieldCompactIOField>>
+                lagrangianScalarFieldFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<vectorIOField>> lagrangianVectorFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<vectorFieldCompactIOField>>
+                lagrangianVectorFieldFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<sphericalTensorIOField>>
+                lagrangianSphericalTensorFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<sphericalTensorFieldCompactIOField>>
+                    lagrangianSphericalTensorFieldFields(cloudDirs.size());
+                PtrList<PtrList<symmTensorIOField>> lagrangianSymmTensorFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<symmTensorFieldCompactIOField>>
+                lagrangianSymmTensorFieldFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<tensorIOField>> lagrangianTensorFields
+                (
+                    cloudDirs.size()
+                );
+                PtrList<PtrList<tensorFieldCompactIOField>>
+                lagrangianTensorFieldFields
+                (
+                    cloudDirs.size()
+                );
 
-                    // Read fields
-                    // ~~~~~~~~~~~
+                label cloudI = 0;
 
-                    IOobjectList lagrangianObjects
+                forAll(cloudDirs, i)
+                {
+                    IOobjectList sprayObjs
                     (
                         mesh,
                         runTime.timeName(),
-                        cloud::prefix/cloudDirs[cloudI],
+                        cloud::prefix/cloudDirs[i],
                         IOobject::MUST_READ,
                         IOobject::NO_WRITE,
                         false
                     );
 
-                    lagrangianFieldDecomposer::readFields
+                    IOobject* positionsPtr = sprayObjs.lookup
                     (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianLabelFields
+                        word("positions")
                     );
 
-                    lagrangianFieldDecomposer::readFieldFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianLabelFieldFields
-                    );
+                    if (positionsPtr)
+                    {
+                        // Read lagrangian particles
+                        // ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-                    lagrangianFieldDecomposer::readFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianScalarFields
-                    );
+                        Info<< "Identified lagrangian data set: "
+                            << cloudDirs[i] << endl;
 
-                    lagrangianFieldDecomposer::readFieldFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianScalarFieldFields
-                    );
+                        lagrangianPositions.set
+                        (
+                            cloudI,
+                            new Cloud<indexedParticle>
+                            (
+                                mesh,
+                                cloudDirs[i],
+                                false
+                            )
+                        );
 
-                    lagrangianFieldDecomposer::readFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianVectorFields
-                    );
 
-                    lagrangianFieldDecomposer::readFieldFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianVectorFieldFields
-                    );
+                        // Sort particles per cell
+                        // ~~~~~~~~~~~~~~~~~~~~~~~
 
-                    lagrangianFieldDecomposer::readFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianSphericalTensorFields
-                    );
+                        cellParticles.set
+                        (
+                            cloudI,
+                            new List<SLList<indexedParticle*>*>
+                            (
+                                mesh.nCells(),
+                                static_cast<SLList<indexedParticle*>*>(nullptr)
+                            )
+                        );
 
-                    lagrangianFieldDecomposer::readFieldFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianSphericalTensorFieldFields
-                    );
+                        label i = 0;
 
-                    lagrangianFieldDecomposer::readFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianSymmTensorFields
-                    );
+                        forAllIter
+                        (
+                            Cloud<indexedParticle>,
+                            lagrangianPositions[cloudI],
+                            iter
+                        )
+                        {
+                            iter().index() = i++;
+
+                            label celli = iter().cell();
+
+                            // Check
+                            if (celli < 0 || celli >= mesh.nCells())
+                            {
+                                FatalErrorInFunction
+                                    << "Illegal cell number " << celli
+                                    << " for particle with index "
+                                    << iter().index()
+                                    << " at position "
+                                    << iter().position() << nl
+                                    << "Cell number should be between 0 and "
+                                    << mesh.nCells()-1 << nl
+                                    << "On this mesh the particle should"
+                                    << " be in cell "
+                                    << mesh.findCell(iter().position())
+                                    << exit(FatalError);
+                            }
+
+                            if (!cellParticles[cloudI][celli])
+                            {
+                                cellParticles[cloudI][celli] =
+                                    new SLList<indexedParticle*>();
+                            }
+
+                            cellParticles[cloudI][celli]->append(&iter());
+                        }
 
-                    lagrangianFieldDecomposer::readFieldFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianSymmTensorFieldFields
-                    );
+                        // Read fields
+                        // ~~~~~~~~~~~
 
-                    lagrangianFieldDecomposer::readFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianTensorFields
-                    );
+                        IOobjectList lagrangianObjects
+                        (
+                            mesh,
+                            runTime.timeName(),
+                            cloud::prefix/cloudDirs[cloudI],
+                            IOobject::MUST_READ,
+                            IOobject::NO_WRITE,
+                            false
+                        );
 
-                    lagrangianFieldDecomposer::readFieldFields
-                    (
-                        cloudI,
-                        lagrangianObjects,
-                        lagrangianTensorFieldFields
-                    );
+                        lagrangianFieldDecomposer::readFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianLabelFields
+                        );
 
-                    cloudI++;
-                }
-            }
+                        lagrangianFieldDecomposer::readFieldFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianLabelFieldFields
+                        );
 
-            lagrangianPositions.setSize(cloudI);
-            cellParticles.setSize(cloudI);
-            lagrangianLabelFields.setSize(cloudI);
-            lagrangianLabelFieldFields.setSize(cloudI);
-            lagrangianScalarFields.setSize(cloudI);
-            lagrangianScalarFieldFields.setSize(cloudI);
-            lagrangianVectorFields.setSize(cloudI);
-            lagrangianVectorFieldFields.setSize(cloudI);
-            lagrangianSphericalTensorFields.setSize(cloudI);
-            lagrangianSphericalTensorFieldFields.setSize(cloudI);
-            lagrangianSymmTensorFields.setSize(cloudI);
-            lagrangianSymmTensorFieldFields.setSize(cloudI);
-            lagrangianTensorFields.setSize(cloudI);
-            lagrangianTensorFieldFields.setSize(cloudI);
-
-            Info<< endl;
-
-            // split the fields over processors
-            for (label proci = 0; proci < mesh.nProcs(); proci++)
-            {
-                Info<< "Processor " << proci << ": field transfer" << endl;
+                        lagrangianFieldDecomposer::readFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianScalarFields
+                        );
 
+                        lagrangianFieldDecomposer::readFieldFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianScalarFieldFields
+                        );
 
-                // open the database
-                if (!processorDbList.set(proci))
-                {
-                    processorDbList.set
-                    (
-                        proci,
-                        new Time
+                        lagrangianFieldDecomposer::readFields
                         (
-                            Time::controlDictName,
-                            args.rootPath(),
-                            args.caseName()
-                           /fileName(word("processor") + name(proci))
-                        )
-                    );
-                }
-                Time& processorDb = processorDbList[proci];
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianVectorFields
+                        );
 
+                        lagrangianFieldDecomposer::readFieldFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianVectorFieldFields
+                        );
 
-                processorDb.setTime(runTime);
+                        lagrangianFieldDecomposer::readFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianSphericalTensorFields
+                        );
 
-                // read the mesh
-                if (!procMeshList.set(proci))
-                {
-                    procMeshList.set
-                    (
-                        proci,
-                        new fvMesh
+                        lagrangianFieldDecomposer::readFieldFields
                         (
-                            IOobject
-                            (
-                                regionName,
-                                processorDb.timeName(),
-                                processorDb
-                            )
-                        )
-                    );
-                }
-                const fvMesh& procMesh = procMeshList[proci];
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianSphericalTensorFieldFields
+                        );
 
-                const labelIOList& faceProcAddressing = procAddressing
-                (
-                    procMeshList,
-                    proci,
-                    "faceProcAddressing",
-                    faceProcAddressingList
-                );
+                        lagrangianFieldDecomposer::readFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianSymmTensorFields
+                        );
 
-                const labelIOList& cellProcAddressing = procAddressing
-                (
-                    procMeshList,
-                    proci,
-                    "cellProcAddressing",
-                    cellProcAddressingList
-                );
+                        lagrangianFieldDecomposer::readFieldFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianSymmTensorFieldFields
+                        );
 
-                const labelIOList& boundaryProcAddressing = procAddressing
-                (
-                    procMeshList,
-                    proci,
-                    "boundaryProcAddressing",
-                    boundaryProcAddressingList
-                );
+                        lagrangianFieldDecomposer::readFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianTensorFields
+                        );
 
+                        lagrangianFieldDecomposer::readFieldFields
+                        (
+                            cloudI,
+                            lagrangianObjects,
+                            lagrangianTensorFieldFields
+                        );
+
+                        cloudI++;
+                    }
+                }
 
-                // FV fields
+                lagrangianPositions.setSize(cloudI);
+                cellParticles.setSize(cloudI);
+                lagrangianLabelFields.setSize(cloudI);
+                lagrangianLabelFieldFields.setSize(cloudI);
+                lagrangianScalarFields.setSize(cloudI);
+                lagrangianScalarFieldFields.setSize(cloudI);
+                lagrangianVectorFields.setSize(cloudI);
+                lagrangianVectorFieldFields.setSize(cloudI);
+                lagrangianSphericalTensorFields.setSize(cloudI);
+                lagrangianSphericalTensorFieldFields.setSize(cloudI);
+                lagrangianSymmTensorFields.setSize(cloudI);
+                lagrangianSymmTensorFieldFields.setSize(cloudI);
+                lagrangianTensorFields.setSize(cloudI);
+                lagrangianTensorFieldFields.setSize(cloudI);
+
+                Info<< endl;
+
+                // split the fields over processors
+                for (label proci = 0; proci < mesh.nProcs(); proci++)
                 {
-                    if (!fieldDecomposerList.set(proci))
+                    Info<< "Processor " << proci << ": field transfer" << endl;
+
+
+                    // open the database
+                    if (!processorDbList.set(proci))
                     {
-                        fieldDecomposerList.set
+                        processorDbList.set
                         (
                             proci,
-                            new fvFieldDecomposer
+                            new Time
                             (
-                                mesh,
-                                procMesh,
-                                faceProcAddressing,
-                                cellProcAddressing,
-                                boundaryProcAddressing
+                                Time::controlDictName,
+                                args.rootPath(),
+                                args.caseName()
+                               /fileName(word("processor") + name(proci))
                             )
                         );
                     }
-                    const fvFieldDecomposer& fieldDecomposer =
-                        fieldDecomposerList[proci];
-
-                    fieldDecomposer.decomposeFields(volScalarFields);
-                    fieldDecomposer.decomposeFields(volVectorFields);
-                    fieldDecomposer.decomposeFields(volSphericalTensorFields);
-                    fieldDecomposer.decomposeFields(volSymmTensorFields);
-                    fieldDecomposer.decomposeFields(volTensorFields);
-
-                    fieldDecomposer.decomposeFields(surfaceScalarFields);
-                    fieldDecomposer.decomposeFields(surfaceVectorFields);
-                    fieldDecomposer.decomposeFields
-                    (
-                        surfaceSphericalTensorFields
-                    );
-                    fieldDecomposer.decomposeFields(surfaceSymmTensorFields);
-                    fieldDecomposer.decomposeFields(surfaceTensorFields);
+                    Time& processorDb = processorDbList[proci];
 
-                    if (times.size() == 1)
-                    {
-                        // Clear cached decomposer
-                        fieldDecomposerList.set(proci, nullptr);
-                    }
-                }
 
-                // Dimensioned fields
-                {
-                    if (!dimFieldDecomposerList.set(proci))
+                    processorDb.setTime(runTime);
+
+                    // read the mesh
+                    if (!procMeshList.set(proci))
                     {
-                        dimFieldDecomposerList.set
+                        procMeshList.set
                         (
                             proci,
-                            new dimFieldDecomposer
+                            new fvMesh
                             (
-                                mesh,
-                                procMesh,
-                                faceProcAddressing,
-                                cellProcAddressing
+                                IOobject
+                                (
+                                    regionName,
+                                    processorDb.timeName(),
+                                    processorDb
+                                )
                             )
                         );
                     }
-                    const dimFieldDecomposer& dimDecomposer =
-                        dimFieldDecomposerList[proci];
+                    const fvMesh& procMesh = procMeshList[proci];
 
-                    dimDecomposer.decomposeFields(dimScalarFields);
-                    dimDecomposer.decomposeFields(dimVectorFields);
-                    dimDecomposer.decomposeFields(dimSphericalTensorFields);
-                    dimDecomposer.decomposeFields(dimSymmTensorFields);
-                    dimDecomposer.decomposeFields(dimTensorFields);
-
-                    if (times.size() == 1)
-                    {
-                        dimFieldDecomposerList.set(proci, nullptr);
-                    }
-                }
+                    const labelIOList& faceProcAddressing = procAddressing
+                    (
+                        procMeshList,
+                        proci,
+                        "faceProcAddressing",
+                        faceProcAddressingList
+                    );
 
+                    const labelIOList& cellProcAddressing = procAddressing
+                    (
+                        procMeshList,
+                        proci,
+                        "cellProcAddressing",
+                        cellProcAddressingList
+                    );
 
-                // Point fields
-                if
-                (
-                    pointScalarFields.size()
-                 || pointVectorFields.size()
-                 || pointSphericalTensorFields.size()
-                 || pointSymmTensorFields.size()
-                 || pointTensorFields.size()
-                )
-                {
-                    const labelIOList& pointProcAddressing = procAddressing
+                    const labelIOList& boundaryProcAddressing = procAddressing
                     (
                         procMeshList,
                         proci,
-                        "pointProcAddressing",
-                        pointProcAddressingList
+                        "boundaryProcAddressing",
+                        boundaryProcAddressingList
                     );
 
-                    const pointMesh& procPMesh = pointMesh::New(procMesh);
 
-                    if (!pointFieldDecomposerList.set(proci))
+                    // FV fields
                     {
-                        pointFieldDecomposerList.set
-                        (
-                            proci,
-                            new pointFieldDecomposer
+                        if (!fieldDecomposerList.set(proci))
+                        {
+                            fieldDecomposerList.set
                             (
-                                pMesh,
-                                procPMesh,
-                                pointProcAddressing,
-                                boundaryProcAddressing
-                            )
+                                proci,
+                                new fvFieldDecomposer
+                                (
+                                    mesh,
+                                    procMesh,
+                                    faceProcAddressing,
+                                    cellProcAddressing,
+                                    boundaryProcAddressing
+                                )
+                            );
+                        }
+                        const fvFieldDecomposer& fieldDecomposer =
+                            fieldDecomposerList[proci];
+
+                        fieldDecomposer.decomposeFields(volScalarFields);
+                        fieldDecomposer.decomposeFields(volVectorFields);
+                        fieldDecomposer.decomposeFields
+                        (
+                            volSphericalTensorFields
                         );
-                    }
-                    const pointFieldDecomposer& pointDecomposer =
-                        pointFieldDecomposerList[proci];
+                        fieldDecomposer.decomposeFields(volSymmTensorFields);
+                        fieldDecomposer.decomposeFields(volTensorFields);
 
-                    pointDecomposer.decomposeFields(pointScalarFields);
-                    pointDecomposer.decomposeFields(pointVectorFields);
-                    pointDecomposer.decomposeFields(pointSphericalTensorFields);
-                    pointDecomposer.decomposeFields(pointSymmTensorFields);
-                    pointDecomposer.decomposeFields(pointTensorFields);
+                        fieldDecomposer.decomposeFields(surfaceScalarFields);
+                        fieldDecomposer.decomposeFields(surfaceVectorFields);
+                        fieldDecomposer.decomposeFields
+                        (
+                            surfaceSphericalTensorFields
+                        );
+                        fieldDecomposer.decomposeFields
+                        (
+                            surfaceSymmTensorFields
+                        );
+                        fieldDecomposer.decomposeFields(surfaceTensorFields);
 
+                        if (times.size() == 1)
+                        {
+                            // Clear cached decomposer
+                            fieldDecomposerList.set(proci, nullptr);
+                        }
+                    }
 
-                    if (times.size() == 1)
+                    // Dimensioned fields
                     {
-                        pointProcAddressingList.set(proci, nullptr);
-                        pointFieldDecomposerList.set(proci, nullptr);
+                        if (!dimFieldDecomposerList.set(proci))
+                        {
+                            dimFieldDecomposerList.set
+                            (
+                                proci,
+                                new dimFieldDecomposer
+                                (
+                                    mesh,
+                                    procMesh,
+                                    faceProcAddressing,
+                                    cellProcAddressing
+                                )
+                            );
+                        }
+                        const dimFieldDecomposer& dimDecomposer =
+                            dimFieldDecomposerList[proci];
+
+                        dimDecomposer.decomposeFields(dimScalarFields);
+                        dimDecomposer.decomposeFields(dimVectorFields);
+                        dimDecomposer.decomposeFields(dimSphericalTensorFields);
+                        dimDecomposer.decomposeFields(dimSymmTensorFields);
+                        dimDecomposer.decomposeFields(dimTensorFields);
+
+                        if (times.size() == 1)
+                        {
+                            dimFieldDecomposerList.set(proci, nullptr);
+                        }
                     }
-                }
 
 
-                // If there is lagrangian data write it out
-                forAll(lagrangianPositions, cloudI)
-                {
-                    if (lagrangianPositions[cloudI].size())
+                    // Point fields
+                    if
+                    (
+                        pointScalarFields.size()
+                     || pointVectorFields.size()
+                     || pointSphericalTensorFields.size()
+                     || pointSymmTensorFields.size()
+                     || pointTensorFields.size()
+                    )
                     {
-                        lagrangianFieldDecomposer fieldDecomposer
+                        const labelIOList& pointProcAddressing = procAddressing
                         (
-                            mesh,
-                            procMesh,
-                            faceProcAddressing,
-                            cellProcAddressing,
-                            cloudDirs[cloudI],
-                            lagrangianPositions[cloudI],
-                            cellParticles[cloudI]
+                            procMeshList,
+                            proci,
+                            "pointProcAddressing",
+                            pointProcAddressingList
                         );
 
-                        // Lagrangian fields
+                        const pointMesh& procPMesh = pointMesh::New(procMesh);
+
+                        if (!pointFieldDecomposerList.set(proci))
                         {
-                            fieldDecomposer.decomposeFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianLabelFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFieldFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianLabelFieldFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianScalarFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFieldFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianScalarFieldFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianVectorFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFieldFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianVectorFieldFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFields
+                            pointFieldDecomposerList.set
                             (
-                                cloudDirs[cloudI],
-                                lagrangianSphericalTensorFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFieldFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianSphericalTensorFieldFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianSymmTensorFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFieldFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianSymmTensorFieldFields[cloudI]
+                                proci,
+                                new pointFieldDecomposer
+                                (
+                                    pMesh,
+                                    procPMesh,
+                                    pointProcAddressing,
+                                    boundaryProcAddressing
+                                )
                             );
-                            fieldDecomposer.decomposeFields
-                            (
-                                cloudDirs[cloudI],
-                                lagrangianTensorFields[cloudI]
-                            );
-                            fieldDecomposer.decomposeFieldFields
+                        }
+                        const pointFieldDecomposer& pointDecomposer =
+                            pointFieldDecomposerList[proci];
+
+                        pointDecomposer.decomposeFields(pointScalarFields);
+                        pointDecomposer.decomposeFields(pointVectorFields);
+                        pointDecomposer.decomposeFields
+                        (
+                            pointSphericalTensorFields
+                        );
+                        pointDecomposer.decomposeFields(pointSymmTensorFields);
+                        pointDecomposer.decomposeFields(pointTensorFields);
+
+
+                        if (times.size() == 1)
+                        {
+                            pointProcAddressingList.set(proci, nullptr);
+                            pointFieldDecomposerList.set(proci, nullptr);
+                        }
+                    }
+
+
+                    // If there is lagrangian data write it out
+                    forAll(lagrangianPositions, cloudI)
+                    {
+                        if (lagrangianPositions[cloudI].size())
+                        {
+                            lagrangianFieldDecomposer fieldDecomposer
                             (
+                                mesh,
+                                procMesh,
+                                faceProcAddressing,
+                                cellProcAddressing,
                                 cloudDirs[cloudI],
-                                lagrangianTensorFieldFields[cloudI]
+                                lagrangianPositions[cloudI],
+                                cellParticles[cloudI]
                             );
+
+                            // Lagrangian fields
+                            {
+                                fieldDecomposer.decomposeFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianLabelFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFieldFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianLabelFieldFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianScalarFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFieldFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianScalarFieldFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianVectorFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFieldFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianVectorFieldFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianSphericalTensorFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFieldFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianSphericalTensorFieldFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianSymmTensorFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFieldFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianSymmTensorFieldFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianTensorFields[cloudI]
+                                );
+                                fieldDecomposer.decomposeFieldFields
+                                (
+                                    cloudDirs[cloudI],
+                                    lagrangianTensorFieldFields[cloudI]
+                                );
+                            }
                         }
                     }
-                }
 
-                // Decompose the "uniform" directory in the time region
-                // directory
-                decomposeUniform(copyUniform, mesh, processorDb, regionDir);
+                    // Decompose the "uniform" directory in the time region
+                    // directory
+                    decomposeUniform(copyUniform, mesh, processorDb, regionDir);
 
-                // For the first region of a multi-region case additionally
-                // decompose the "uniform" directory in the time directory
-                if (regionNames.size() > 1 && regioni == 0)
-                {
-                    decomposeUniform(copyUniform, mesh, processorDb);
-                }
+                    // For the first region of a multi-region case additionally
+                    // decompose the "uniform" directory in the time directory
+                    if (regionNames.size() > 1 && regioni == 0)
+                    {
+                        decomposeUniform(copyUniform, mesh, processorDb);
+                    }
 
-                // We have cached all the constant mesh data for the current
-                // processor. This is only important if running with multiple
-                // times, otherwise it is just extra storage.
-                if (times.size() == 1)
-                {
-                    boundaryProcAddressingList.set(proci, nullptr);
-                    cellProcAddressingList.set(proci, nullptr);
-                    faceProcAddressingList.set(proci, nullptr);
-                    procMeshList.set(proci, nullptr);
-                    processorDbList.set(proci, nullptr);
+                    // We have cached all the constant mesh data for the current
+                    // processor. This is only important if running with
+                    // multiple times, otherwise it is just extra storage.
+                    if (times.size() == 1)
+                    {
+                        boundaryProcAddressingList.set(proci, nullptr);
+                        cellProcAddressingList.set(proci, nullptr);
+                        faceProcAddressingList.set(proci, nullptr);
+                        procMeshList.set(proci, nullptr);
+                        processorDbList.set(proci, nullptr);
+                    }
                 }
             }
         }
diff --git a/src/OpenFOAM/db/Time/timeSelector.C b/src/OpenFOAM/db/Time/timeSelector.C
index ecffc55dc9839f7b5d3e32416c9b593d7d833dc8..7e47c12a9a8f291308da1856f2d3f9cd5beac7fa 100644
--- a/src/OpenFOAM/db/Time/timeSelector.C
+++ b/src/OpenFOAM/db/Time/timeSelector.C
@@ -135,8 +135,12 @@ void Foam::timeSelector::addOptions
     argList::addBoolOption
     (
         "noZero",
-        "exclude the '0/' dir from the times list, "
-        "has precedence over the -withZero option"
+        string("exclude the '0/' dir from the times list")
+      + (
+            withZero
+          ? ", has precedence over the -withZero option"
+          : ""
+        )
     );
     argList::addBoolOption
     (
diff --git a/tutorials/incompressible/simpleFoam/motorBike/Allclean b/tutorials/incompressible/simpleFoam/motorBike/Allclean
index 68a1d17d7b95d4325ac62967c787eb8a3e01709c..93a0975c85c7684f496b951d261c5952d3e58881 100755
--- a/tutorials/incompressible/simpleFoam/motorBike/Allclean
+++ b/tutorials/incompressible/simpleFoam/motorBike/Allclean
@@ -1,9 +1,10 @@
 #!/bin/sh
+cd ${0%/*} || exit 1    # Run from this directory
 
 # Source tutorial clean functions
 . $WM_PROJECT_DIR/bin/tools/CleanFunctions
 
-# remove surface and features
+# Remove surface and features
 rm -f constant/triSurface/motorBike.obj.gz > /dev/null 2>&1
 rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1
 rm -f constant/triSurface/motorBike.eMesh > /dev/null 2>&1
@@ -11,3 +12,5 @@ rm -f constant/triSurface/motorBike.eMesh > /dev/null 2>&1
 rm -rf 0 > /dev/null 2>&1
 
 cleanCase
+
+#------------------------------------------------------------------------------
diff --git a/tutorials/incompressible/simpleFoam/motorBike/Allrun b/tutorials/incompressible/simpleFoam/motorBike/Allrun
index 32e10a4eee61cd89b26616142eb13e4088c4c730..07069da13588b1272cc50ca8b31e70d1dfd719b6 100755
--- a/tutorials/incompressible/simpleFoam/motorBike/Allrun
+++ b/tutorials/incompressible/simpleFoam/motorBike/Allrun
@@ -4,21 +4,16 @@ cd ${0%/*} || exit 1    # Run from this directory
 # Source tutorial run functions
 . $WM_PROJECT_DIR/bin/tools/RunFunctions
 
-# copy motorbike surface from resources directory
+# Copy motorbike surface from resources directory
 cp $FOAM_TUTORIALS/resources/geometry/motorBike.obj.gz constant/triSurface/
 runApplication surfaceFeatureExtract
 
 runApplication blockMesh
 
-runApplication decomposePar
-runParallel snappyHexMesh -overwrite
-
-#- For non-parallel running
-#cp -r 0.orig 0 > /dev/null 2>&1
+[ ! -d 0 ] && cp -r 0.orig 0
 
-#- For parallel running
-ls -d processor* | xargs -I {} rm -rf ./{}/0
-ls -d processor* | xargs -I {} cp -r 0.orig ./{}/0
+runApplication decomposePar -copyZero
+runParallel snappyHexMesh -overwrite
 
 runParallel patchSummary
 runParallel potentialFoam