diff --git a/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C b/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C
index 561a00bde75bf4899147cf53419fcef96cbd727a..e7c5f74ff6afa4c5208b788a08d524b3111032e1 100644
--- a/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C
+++ b/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -461,13 +461,15 @@ int main(int argc, char *argv[])
 
 
                 // Do local scan for valid cloud objects
-                IOobjectList sprayObjs(runTime, runTime.timeName(), dir);
+                wordList cloudFields
+                (
+                    IOobjectList(runTime, runTime.timeName(), dir).sortedNames()
+                );
 
                 // Combine with all other cloud objects
-                wordList sprayFields(sprayObjs.sortedToc());
-                combineReduce(sprayFields, uniqueEqOp<word>());
+                combineReduce(cloudFields, uniqueEqOp<word>());
 
-                for (const word& name : sprayFields)
+                for (const word& name : cloudFields)
                 {
                     // Note: try the various field types. Make sure to
                     //       exit once successful conversion to avoid re-read
diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
index 5bb6729f1718f438145020e80e1bb5c78d7f8052..ca235479e30af55c52ff5da011ae39783a374f35 100644
--- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
+++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
@@ -807,7 +807,7 @@ int main(int argc, char *argv[])
 
                 for (const fileName& cloudDir : cloudDirs)
                 {
-                    IOobjectList sprayObjs
+                    IOobjectList cloudObjects
                     (
                         mesh,
                         runTime.timeName(),
@@ -817,12 +817,12 @@ int main(int argc, char *argv[])
                         false
                     );
 
-                    // Note: looking up "positions" for backwards compatibility
-                    IOobject* positionsPtr =
-                        sprayObjs.lookup(word("positions"));
-                    IOobject* coordsPtr = sprayObjs.lookup(word("coordinates"));
-
-                    if (positionsPtr || coordsPtr)
+                    // Note: look up "positions" for backwards compatibility
+                    if
+                    (
+                        cloudObjects.found("coordinates")
+                     || cloudObjects.found("positions")
+                    )
                     {
                         // Read lagrangian particles
                         // ~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C b/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
index b47fad7758134105add5aa3284183ddfa60b5791..7a5de58ed4b8172a52fcfc8bc64a6246054a0cf1 100644
--- a/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
+++ b/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
@@ -538,7 +538,7 @@ int main(int argc, char *argv[])
 
             if (!noLagrangian)
             {
-                HashTable<IOobjectList> cloudObjects;
+                HashTable<IOobjectList> allCloudObjects;
 
                 forAll(databases, proci)
                 {
@@ -566,39 +566,38 @@ int main(int argc, char *argv[])
                     {
                         // Check if we already have cloud objects for this
                         // cloudname
-                        if (!cloudObjects.found(cloudDir))
+                        if (!allCloudObjects.found(cloudDir))
                         {
                             // Do local scan for valid cloud objects
-                            IOobjectList sprayObjs
+                            IOobjectList localObjs
                             (
                                 procMeshes.meshes()[proci],
                                 databases[proci].timeName(),
                                 cloud::prefix/cloudDir
                             );
 
-                            IOobject* positionsPtr =
-                                sprayObjs.lookup(word("positions"));
-                            IOobject* coordsPtr =
-                                sprayObjs.lookup(word("coordinates"));
-
-                            if (coordsPtr || positionsPtr)
+                            if
+                            (
+                                localObjs.found("coordinates")
+                             || localObjs.found("positions")
+                            )
                             {
-                                cloudObjects.insert(cloudDir, sprayObjs);
+                                allCloudObjects.insert(cloudDir, localObjs);
                             }
                         }
                     }
                 }
 
 
-                if (cloudObjects.size())
+                if (allCloudObjects.size())
                 {
                     // Pass2: reconstruct the cloud
-                    forAllConstIter(HashTable<IOobjectList>, cloudObjects, iter)
+                    forAllConstIters(allCloudObjects, iter)
                     {
                         const word cloudName = word::validate(iter.key());
 
                         // Objects (on arbitrary processor)
-                        const IOobjectList& sprayObjs = iter.object();
+                        const IOobjectList& cloudObjs = iter.object();
 
                         Info<< "Reconstructing lagrangian fields for cloud "
                             << cloudName << nl << endl;
@@ -616,7 +615,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFieldFields<label>
@@ -624,7 +623,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFields<scalar>
@@ -632,7 +631,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFieldFields<scalar>
@@ -640,7 +639,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFields<vector>
@@ -648,7 +647,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFieldFields<vector>
@@ -656,7 +655,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFields<sphericalTensor>
@@ -664,7 +663,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFieldFields<sphericalTensor>
@@ -672,7 +671,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFields<symmTensor>
@@ -680,7 +679,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFieldFields<symmTensor>
@@ -688,7 +687,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFields<tensor>
@@ -696,7 +695,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                         reconstructLagrangianFieldFields<tensor>
@@ -704,7 +703,7 @@ int main(int argc, char *argv[])
                             cloudName,
                             mesh,
                             procMeshes.meshes(),
-                            sprayObjs,
+                            cloudObjs,
                             selectedLagrangianFields
                         );
                     }
diff --git a/applications/utilities/parallelProcessing/redistributePar/parLagrangianRedistributor.C b/applications/utilities/parallelProcessing/redistributePar/parLagrangianRedistributor.C
index 81d6872079dfd9f764bcc667995a0f2ab1bbbc13..25ca360e5971bb08054c9d5ea532b1120a48a0fc 100644
--- a/applications/utilities/parallelProcessing/redistributePar/parLagrangianRedistributor.C
+++ b/applications/utilities/parallelProcessing/redistributePar/parLagrangianRedistributor.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2015 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015-2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2018 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -89,30 +89,30 @@ void Foam::parLagrangianRedistributor::findClouds
     for (const fileName& localCloudName : localCloudDirs)
     {
         // Do local scan for valid cloud objects
-        IOobjectList sprayObjs
+        IOobjectList localObjs
         (
             mesh,
             mesh.time().timeName(),
             cloud::prefix/localCloudName
         );
 
-        if (sprayObjs.found("coordinates") || sprayObjs.found("positions"))
+        bool isCloud = false;
+        if (localObjs.erase("coordinates"))
+        {
+            isCloud = true;
+        }
+        if (localObjs.erase("positions"))
+        {
+            isCloud = true;
+        }
+
+        if (isCloud)
         {
             // Has coordinates/positions - so must be a valid cloud
 
-            const label cloudI = cloudNames.find(localCloudName);
+            const label cloudi = cloudNames.find(localCloudName);
 
-            objectNames[cloudI].setSize(sprayObjs.size());
-            label objectI = 0;
-            forAllConstIters(sprayObjs, iter)
-            {
-                const word& name = iter.key();
-                if (name != "coordinates" && name != "positions")
-                {
-                    objectNames[cloudI][objectI++] = name;
-                }
-            }
-            objectNames[cloudI].setSize(objectI);
+            objectNames[cloudi] = localObjs.sortedNames();
         }
     }
 
diff --git a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
index 671460068e6a318398a3de7b3de47ac9f157b89a..c986ca413c831e6adfc9b49d458731814c08d7db 100644
--- a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
+++ b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
@@ -1807,13 +1807,14 @@ void reconstructLagrangian
                 << cloudName << nl << endl;
 
             autoPtr<mapDistributeBase> lagrangianMapPtr =
-            lagrangianReconstructor.redistributeLagrangianPositions
-            (
-                cloudName
-            );
+                lagrangianReconstructor.redistributeLagrangianPositions
+                (
+                    cloudName
+                );
+
             const mapDistributeBase& lagrangianMap = *lagrangianMapPtr;
 
-            IOobjectList sprayObjs
+            IOobjectList cloudObjs
             (
                 mesh,
                 mesh.time().timeName(),
@@ -1824,42 +1825,42 @@ void reconstructLagrangian
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFieldFields<label>
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFields<scalar>
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFieldFields<scalar>
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFields<vector>
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFieldFields<vector>
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFields
@@ -1867,7 +1868,7 @@ void reconstructLagrangian
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFieldFields
@@ -1875,14 +1876,14 @@ void reconstructLagrangian
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFields<symmTensor>
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFieldFields
@@ -1890,21 +1891,21 @@ void reconstructLagrangian
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFields<tensor>
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
             lagrangianReconstructor.redistributeLagrangianFieldFields<tensor>
             (
                 lagrangianMap,
                 cloudName,
-                sprayObjs,
+                cloudObjs,
                 selectedLagrangianFields
             );
         }
@@ -1947,29 +1948,29 @@ void readLagrangian
         //}
 
 
-        IOobjectList sprayObjs(clouds[i], clouds[i].time().timeName());
+        IOobjectList cloudObjs(clouds[i], clouds[i].time().timeName());
 
-        //Pout<< "Found clould objects:" << sprayObjs.names() << endl;
+        //Pout<< "Found clould objects:" << cloudObjs.names() << endl;
 
         parLagrangianRedistributor::readLagrangianFields
         <IOField<label>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <IOField<Field<label>>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <CompactIOField<Field<label>, label>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
 
@@ -1978,21 +1979,21 @@ void readLagrangian
         <IOField<scalar>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <IOField<Field<scalar>>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <CompactIOField<Field<scalar>, scalar>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
 
@@ -2001,21 +2002,21 @@ void readLagrangian
         <IOField<vector>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <IOField<Field<vector>>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <CompactIOField<Field<vector>, vector>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
 
@@ -2024,21 +2025,21 @@ void readLagrangian
         <IOField<sphericalTensor>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <IOField<Field<sphericalTensor>>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <CompactIOField<Field<sphericalTensor>, sphericalTensor>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
 
@@ -2047,21 +2048,21 @@ void readLagrangian
         <IOField<symmTensor>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <IOField<Field<symmTensor>>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <CompactIOField<Field<symmTensor>, symmTensor>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
 
@@ -2070,21 +2071,21 @@ void readLagrangian
         <IOField<tensor>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <IOField<Field<tensor>>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
         parLagrangianRedistributor::readLagrangianFields
         <CompactIOField<Field<tensor>, tensor>>
         (
             clouds[i],
-            sprayObjs,
+            cloudObjs,
             selectedLagrangianFields
         );
     }
diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/findCloudFields.H b/applications/utilities/postProcessing/dataConversion/foamToEnsight/findCloudFields.H
index 895da258ab4a56b265de4668669a3f4fb3965adf..e25b6c244393faef2c208437546de41bae3edee8 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/findCloudFields.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/findCloudFields.H
@@ -37,7 +37,19 @@ if (timeDirs.size() && !noLagrangian)
 
             // Clouds require "coordinates".
             // The "positions" are for v1706 and lower.
-            if (cloudObjs.found("coordinates") || cloudObjs.found("positions"))
+            // - detect and remove since these are treated specially
+
+            bool isCloud = false;
+            if (cloudObjs.erase("coordinates"))
+            {
+                isCloud = true;
+            }
+            if (cloudObjs.erase("positions"))
+            {
+                isCloud = true;
+            }
+
+            if (isCloud)
             {
                 // Save the cloud fields on a per cloud basis
                 auto& fieldsPerCloud = cloudFields(cloudName);
@@ -53,13 +65,6 @@ if (timeDirs.size() && !noLagrangian)
         }
     }
 
-    // Prune out geometry again since it gets treated specially
-    forAllIters(cloudFields, cloudIter)
-    {
-        cloudIter().erase("coordinates");
-        cloudIter().erase("positions");
-    }
-
     if (Pstream::parRun())
     {
         Pstream::mapCombineGather(cloudFields, HashTableOps::plusEqOp<word>());
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/vtkPVFoamMeshLagrangian.C b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/vtkPVFoamMeshLagrangian.C
index 350ec9a17e3a3a06f888717f1d3d90a70fdba69d..378e8fcd55f0c009c03f3e6575a2025afdd1e082 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/vtkPVFoamMeshLagrangian.C
+++ b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/vtkPVFoamMeshLagrangian.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) 2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -55,17 +55,19 @@ vtkSmartPointer<vtkPolyData> Foam::vtkPVFoam::lagrangianVTKMesh
     }
 
 
-    // the region name is already in the mesh db
-    IOobjectList sprayObjs
+    // The region name is already in the mesh db
+    IOobjectList cloudObjects
     (
         mesh,
         mesh.time().timeName(),
         cloud::prefix/cloudName
     );
 
-    IOobject* positionsPtr = sprayObjs.lookup(word("positions"));
-    IOobject* coordinatesPtr = sprayObjs.lookup(word("coordinates"));
-    if (positionsPtr || coordinatesPtr)
+    if
+    (
+        cloudObjects.found("positions")
+     || cloudObjects.found("coordinates")
+    )
     {
         Cloud<passiveParticle> parcels(mesh, cloudName, false);
 
diff --git a/applications/utilities/preProcessing/mapFields/mapLagrangian.C b/applications/utilities/preProcessing/mapFields/mapLagrangian.C
index ebc89520afdfa5a2d2ff44cd352fefad84fca120..d3f4a9c5afec8eb06422464463c981b442afe4e6 100644
--- a/applications/utilities/preProcessing/mapFields/mapLagrangian.C
+++ b/applications/utilities/preProcessing/mapFields/mapLagrangian.C
@@ -119,10 +119,7 @@ void mapLagrangian(const meshToMesh0& meshToMesh0Interp)
             cloud::prefix/cloudDirs[cloudI]
         );
 
-        IOobject* positionsPtr = objects.lookup("positions");
-        IOobject* coordinatesPtr = objects.lookup("coordinates");
-
-        if (positionsPtr || coordinatesPtr)
+        if (objects.found("coordinates") || objects.found("positions"))
         {
             Info<< nl << "    processing cloud " << cloudDirs[cloudI] << endl;