diff --git a/applications/utilities/mesh/generation/blockMesh/blockMesh.C b/applications/utilities/mesh/generation/blockMesh/blockMesh.C
index cdea2a93ba1ccd0438824574372d06fdae1c921e..4441f15e4934c61cf8135312682ea1e59c98c292 100644
--- a/applications/utilities/mesh/generation/blockMesh/blockMesh.C
+++ b/applications/utilities/mesh/generation/blockMesh/blockMesh.C
@@ -128,16 +128,12 @@ int main(int argc, char *argv[])
     fileName dictPath;
 
     // Check if the dictionary is specified on the command-line
-    if (args.optionFound("dict"))
+    if (args.optionReadIfPresent("dict", dictPath))
     {
-        dictPath = args["dict"];
-
-        dictPath =
-        (
-            isDir(dictPath)
-          ? dictPath/dictName
-          : dictPath
-        );
+        if (isDir(dictPath))
+        {
+            dictPath = dictPath / dictName;
+        }
     }
     // Check if dictionary is present in the constant directory
     else if
diff --git a/applications/utilities/mesh/generation/foamyMesh/foamyHexMesh/foamyHexMesh.C b/applications/utilities/mesh/generation/foamyMesh/foamyHexMesh/foamyHexMesh.C
index 3588a9878f634f72758a6f2a98a4fe1565517a86..88c9c82e01da03283d0bc30fbe25983f61999c71 100644
--- a/applications/utilities/mesh/generation/foamyMesh/foamyHexMesh/foamyHexMesh.C
+++ b/applications/utilities/mesh/generation/foamyMesh/foamyHexMesh/foamyHexMesh.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) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -67,14 +67,7 @@ int main(int argc, char *argv[])
 
     // Allow override of decomposeParDict location
     fileName decompDictFile;
-    if (args.optionReadIfPresent("decomposeParDict", decompDictFile))
-    {
-        if (isDir(decompDictFile))
-        {
-            decompDictFile = decompDictFile / "decomposeParDict";
-        }
-    }
-
+    args.optionReadIfPresent("decomposeParDict", decompDictFile);
 
     IOdictionary foamyHexMeshDict
     (
diff --git a/applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh/foamyHexMeshBackgroundMesh.C b/applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh/foamyHexMeshBackgroundMesh.C
index 5e009ea114a1aec38da3d7737daddc555f376d96..410182e01c2a68cda0484476d507ed1731a60bfb 100644
--- a/applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh/foamyHexMeshBackgroundMesh.C
+++ b/applications/utilities/mesh/generation/foamyMesh/foamyHexMeshBackgroundMesh/foamyHexMeshBackgroundMesh.C
@@ -524,13 +524,7 @@ int main(int argc, char *argv[])
 
         // Allow override of decomposeParDict location
         fileName decompDictFile;
-        if (args.optionReadIfPresent("decomposeParDict", decompDictFile))
-        {
-            if (isDir(decompDictFile))
-            {
-                decompDictFile = decompDictFile / "decomposeParDict";
-            }
-        }
+        args.optionReadIfPresent("decomposeParDict", decompDictFile);
 
         labelList decomp = decompositionModel::New
         (
diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
index 1f4414fcbdd0e5d16ef92bc0e6d21081f8c66fe2..7b998241d65bb686f7e2f22cfc751aca95b86587 100644
--- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
+++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.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 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -905,13 +905,7 @@ int main(int argc, char *argv[])
         if (Pstream::parRun())
         {
             fileName decompDictFile;
-            if (args.optionReadIfPresent("decomposeParDict", decompDictFile))
-            {
-                if (isDir(decompDictFile))
-                {
-                    decompDictFile = decompDictFile/"decomposeParDict";
-                }
-            }
+            args.optionReadIfPresent("decomposeParDict", decompDictFile);
 
             decomposeDict = IOdictionary
             (
diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
index 62723280b3b2777cda3672ff2911727ddde7ee5c..4eea56f1c0fa6290bfeffe8adbee281307b3353a 100644
--- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
+++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
@@ -270,14 +270,7 @@ int main(int argc, char *argv[])
 
     // Allow override of decomposeParDict location
     fileName decompDictFile;
-    if (args.optionReadIfPresent("decomposeParDict", decompDictFile))
-    {
-        if (isDir(decompDictFile))
-        {
-            decompDictFile = decompDictFile/"decomposeParDict";
-        }
-    }
-
+    args.optionReadIfPresent("decomposeParDict", decompDictFile);
 
     wordList regionNames;
     wordList regionDirs;
@@ -360,7 +353,6 @@ int main(int argc, char *argv[])
                     ),
                     decompDictFile
                 )
-
             ).lookup("numberOfSubdomains")
         );
 
diff --git a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
index 65ebbc1c6f3c862f2877599f09716cde4acd4dba..c21d94b3dddcff4b7ef8e45b2d9f8ee1ef3c8a9a 100644
--- a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
+++ b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
@@ -64,6 +64,7 @@ Usage
 #include "fvMeshTools.H"
 #include "fvMeshDistribute.H"
 #include "decompositionMethod.H"
+#include "decompositionModel.H"
 #include "timeSelector.H"
 #include "PstreamReduceOps.H"
 #include "volFields.H"
@@ -74,7 +75,6 @@ Usage
 #include "loadOrCreateMesh.H"
 #include "processorFvPatchField.H"
 #include "zeroGradientFvPatchFields.H"
-#include "decompositionModel.H"
 
 #include "parFvFieldReconstructor.H"
 #include "parLagrangianRedistributor.H"
@@ -2152,7 +2152,6 @@ int main(int argc, char *argv[])
     bool newTimes = args.optionFound("newTimes");
 
 
-
     if (env("FOAM_SIGFPE"))
     {
         WarningInFunction
@@ -2245,8 +2244,6 @@ int main(int argc, char *argv[])
     Pstream::scatter(decompose);
 
 
-
-
     // If running distributed we have problem of new processors not finding
     // a system/controlDict. However if we switch on the master-only reading
     // the problem becomes that the time directories are differing sizes and
@@ -2330,7 +2327,6 @@ int main(int argc, char *argv[])
     // Determine any region
     word regionName = polyMesh::defaultRegion;
     fileName meshSubDir;
-
     if (args.optionReadIfPresent("region", regionName))
     {
         meshSubDir = regionName/polyMesh::meshSubDir;
@@ -2774,13 +2770,7 @@ int main(int argc, char *argv[])
 
         // Allow override of decomposeParDict location
         fileName decompDictFile;
-        if (args.optionReadIfPresent("decomposeParDict", decompDictFile))
-        {
-            if (isDir(decompDictFile))
-            {
-                decompDictFile = decompDictFile / "decomposeParDict";
-            }
-        }
+        args.optionReadIfPresent("decomposeParDict", decompDictFile);
 
 
         // Determine decomposition
diff --git a/applications/utilities/preProcessing/mapFields/mapFields.C b/applications/utilities/preProcessing/mapFields/mapFields.C
index 106f1b2bc2ee3e6952a249be1886412252e4c2ca..35d4faccc6072e7ccd93e5ae55ec8f59a2587ebc 100644
--- a/applications/utilities/preProcessing/mapFields/mapFields.C
+++ b/applications/utilities/preProcessing/mapFields/mapFields.C
@@ -51,13 +51,11 @@ int readNumProcs
     const Time& runTime
 )
 {
+    const word dictName = "decomposeParDict";
     fileName dictFile;
-    if (args.optionReadIfPresent(optionName, dictFile))
+    if (args.optionReadIfPresent(optionName, dictFile) && isDir(dictFile))
     {
-        if (isDir(dictFile))
-        {
-            dictFile = dictFile/"decomposeParDict";
-        }
+        dictFile = dictFile / dictName;
     }
 
     return readInt
@@ -68,7 +66,7 @@ int readNumProcs
             (
                 IOobject
                 (
-                    "decomposeParDict",
+                    dictName,
                     runTime.system(),
                     runTime,
                     IOobject::MUST_READ_IF_MODIFIED,
@@ -376,7 +374,7 @@ int main(int argc, char *argv[])
 
     if (parallelSource && !parallelTarget)
     {
-        int nProcs = readNumProcs
+        const int nProcs = readNumProcs
         (
             args,
             "sourceDecomposeParDict",
@@ -448,7 +446,7 @@ int main(int argc, char *argv[])
     }
     else if (!parallelSource && parallelTarget)
     {
-        int nProcs = readNumProcs
+        const int nProcs = readNumProcs
         (
             args,
             "targetDecomposeParDict",
@@ -521,13 +519,13 @@ int main(int argc, char *argv[])
     }
     else if (parallelSource && parallelTarget)
     {
-        int nProcsSource = readNumProcs
+        const int nProcsSource = readNumProcs
         (
             args,
             "sourceDecomposeParDict",
             runTimeSource
         );
-        int nProcsTarget = readNumProcs
+        const int nProcsTarget = readNumProcs
         (
             args,
             "targetDecomposeParDict",
diff --git a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
index d61fbc67cd0f92302e705367946b8f3b51c9a626..d79323b718e1362d35676b0f344fba82250abec3 100644
--- a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
+++ b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
@@ -157,14 +157,10 @@ int main(int argc, char *argv[])
         // Note: cannot use setSystemRunTimeDictionaryIO.H since dictionary
         //       is in constant
 
-        fileName dictPath = "";
-        if (args.optionFound("dict"))
+        fileName dictPath;
+        if (args.optionReadIfPresent("dict", dictPath) && isDir(dictPath))
         {
-            dictPath = args["dict"];
-            if (isDir(dictPath))
-            {
-                dictPath = dictPath / dictName;
-            }
+            dictPath = dictPath / dictName;
         }
 
         if (dictPath.size())
diff --git a/applications/utilities/surface/surfaceRedistributePar/Make/options b/applications/utilities/surface/surfaceRedistributePar/Make/options
index c46a4c3f38edbafb8de987a029e545d61e8ac793..d836881301c692a5747929349d88ed55c2c79c5d 100644
--- a/applications/utilities/surface/surfaceRedistributePar/Make/options
+++ b/applications/utilities/surface/surfaceRedistributePar/Make/options
@@ -1,9 +1,12 @@
 EXE_INC = \
     -I$(LIB_SRC)/triSurface/lnInclude \
     -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude \
+    -I$(LIB_SRC)/parallel/decompose/decompose/lnInclude \
     -I$(LIB_SRC)/parallel/distributed/lnInclude
 
 EXE_LIBS = \
     -ldistributed \
     -lmeshTools \
-    -ltriSurface
+    -ltriSurface \
+    -ldecompose
diff --git a/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C b/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C
index f5e113f845efa8d6ed75392a6432ed9d44fe3387..d478f8ab4071577eec16612442e90937e956eca9 100644
--- a/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C
+++ b/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.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 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -46,6 +46,7 @@ Note
 #include "distributedTriSurfaceMesh.H"
 #include "mapDistribute.H"
 #include "localIOdictionary.H"
+#include "decompositionModel.H"
 
 using namespace Foam;
 
@@ -103,7 +104,8 @@ int main(int argc, char *argv[])
 {
     argList::addNote
     (
-        "redistribute a triSurface"
+        "Redistribute a triSurface. "
+        "The specified surface must be located in the constant/triSurface directory"
     );
 
     argList::validArgs.append("triSurfaceMesh");
@@ -127,7 +129,7 @@ int main(int argc, char *argv[])
         << "Using distribution method "
         << distTypeName << nl << endl;
 
-    const bool keepNonMapped = args.options().found("keepNonMapped");
+    const bool keepNonMapped = args.optionFound("keepNonMapped");
 
     if (keepNonMapped)
     {
@@ -151,6 +153,37 @@ int main(int argc, char *argv[])
 
     Random rndGen(653213);
 
+    // For independent decomposition, ensure that distributedTriSurfaceMesh
+    // can find the alternative decomposeParDict specified via the
+    // -decomposeParDict option.
+    if (distType == distributedTriSurfaceMesh::INDEPENDENT)
+    {
+        fileName decompDictFile;
+        args.optionReadIfPresent("decomposeParDict", decompDictFile);
+
+        IOdictionary* dict = new IOdictionary
+        (
+            decompositionModel::selectIO
+            (
+                IOobject
+                (
+                    "decomposeParDict",
+                    runTime.system(),
+                    runTime,
+                    IOobject::MUST_READ_IF_MODIFIED,
+                    IOobject::NO_WRITE
+                ),
+                decompDictFile
+            )
+        );
+
+        // The object must have the expected "decomposeParDict" name.
+        // This also implies that it cannot be changed during the run.
+        dict->rename("decomposeParDict");
+
+        runTime.store(dict);
+    }
+
     // Determine mesh bounding boxes:
     List<List<treeBoundBox>> meshBb(Pstream::nProcs());
     if (distType == distributedTriSurfaceMesh::FOLLOW)
diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C
index 77ee53eec3faca5161479f055f6b7e55882b3634..5ab933097287d48961903fff47257b4d2290cac8 100644
--- a/src/OpenFOAM/global/argList/argList.C
+++ b/src/OpenFOAM/global/argList/argList.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 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -614,10 +614,29 @@ void Foam::argList::parse
             // Establish rootPath_/globalCase_/case_ for master
             getRootCase();
 
-            // See if running distributed (different roots for different procs)
-            label dictNProcs = -1;
-            fileName source;
+            // Establish location of decomposeParDict, allow override with
+            // the -decomposeParDict option.
+            fileName source = rootPath_/globalCase_/"system"/"decomposeParDict";
+            if (options_.found("decomposeParDict"))
+            {
+                bool adjustOpt = false;
 
+                source = options_["decomposeParDict"];
+                if (isDir(source))
+                {
+                    adjustOpt = true;
+                    source = source/"decomposeParDict";
+                }
+                // Could also check for absolute path, but shouldn't be needed
+                if (adjustOpt)
+                {
+                    source.clean();
+                    options_.set("decomposeParDict", source);
+                }
+            }
+
+            // If running distributed (different roots for different procs)
+            label dictNProcs = -1;
             if (options_.found("roots"))
             {
                 source = "-roots";
@@ -631,16 +650,8 @@ void Foam::argList::parse
             }
             else
             {
-                source = rootPath_/globalCase_/"system"/"decomposeParDict";
-                // Override with -decomposeParDict
-                if (options_.found("decomposeParDict"))
-                {
-                    source = options_["decomposeParDict"];
-                    if (isDir(source))
-                    {
-                        source = source/"decomposeParDict";
-                    }
-                }
+                // Use values from decomposeParDict, the location was already
+                // established above.
 
                 IFstream decompDictStream(source);
 
diff --git a/src/OpenFOAM/include/setConstantMeshDictionaryIO.H b/src/OpenFOAM/include/setConstantMeshDictionaryIO.H
index aa5a68004c27c5e72b6e9d69fd8b795543e273fc..503dff369aa992a8efbfd0821d2965f3435b6fb3 100644
--- a/src/OpenFOAM/include/setConstantMeshDictionaryIO.H
+++ b/src/OpenFOAM/include/setConstantMeshDictionaryIO.H
@@ -1,7 +1,6 @@
-fileName dictPath = "";
-if (args.optionFound("dict"))
+fileName dictPath;
+if (args.optionReadIfPresent("dict", dictPath))
 {
-    dictPath = args["dict"];
     if (isDir(dictPath))
     {
         dictPath = dictPath / dictName;
diff --git a/src/OpenFOAM/include/setSystemMeshDictionaryIO.H b/src/OpenFOAM/include/setSystemMeshDictionaryIO.H
index 4d5f2e68ec900c92f33af06385173fc1e487b35b..c4e5a27ae9d3c7df29908720377a40a9683a1713 100644
--- a/src/OpenFOAM/include/setSystemMeshDictionaryIO.H
+++ b/src/OpenFOAM/include/setSystemMeshDictionaryIO.H
@@ -1,7 +1,6 @@
-fileName dictPath = "";
-if (args.optionFound("dict"))
+fileName dictPath;
+if (args.optionReadIfPresent("dict", dictPath))
 {
-    dictPath = args["dict"];
     if (isDir(dictPath))
     {
         dictPath = dictPath / dictName;
diff --git a/src/OpenFOAM/include/setSystemRunTimeDictionaryIO.H b/src/OpenFOAM/include/setSystemRunTimeDictionaryIO.H
index ceebb43815ad0d230e221a5b858f74506fa51141..510f278c6087258bb0174da8f7a7a4ab7b42726a 100644
--- a/src/OpenFOAM/include/setSystemRunTimeDictionaryIO.H
+++ b/src/OpenFOAM/include/setSystemRunTimeDictionaryIO.H
@@ -1,7 +1,6 @@
-fileName dictPath = "";
-if (args.optionFound("dict"))
+fileName dictPath;
+if (args.optionReadIfPresent("dict", dictPath))
 {
-    dictPath = args["dict"];
     if (isDir(dictPath))
     {
         dictPath = dictPath / dictName;
diff --git a/tutorials/incompressible/simpleFoam/motorBike/Allrun b/tutorials/incompressible/simpleFoam/motorBike/Allrun
index b2bee4f0109859c2569a5ecfa17beacae8045042..f2d7ed6bb0f4d12f52191115084a78f20adc688b 100755
--- a/tutorials/incompressible/simpleFoam/motorBike/Allrun
+++ b/tutorials/incompressible/simpleFoam/motorBike/Allrun
@@ -4,14 +4,16 @@ cd ${0%/*} || exit 1    # Run from this directory
 # Source tutorial run functions
 . $WM_PROJECT_DIR/bin/tools/RunFunctions
 
+decompDict="-decomposeParDict system/decomposeParDict.6"
+
 # 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
+runApplication decomposePar $decompDict
+runParallel $decompDict snappyHexMesh -overwrite
 
 #- For non-parallel running: - set the initial fields
 # restore0Dir
@@ -19,9 +21,9 @@ runParallel snappyHexMesh -overwrite
 #- For parallel running: set the initial fields
 restore0Dir -processor
 
-runParallel patchSummary
-runParallel potentialFoam
-runParallel $(getApplication)
+runParallel $decompDict patchSummary
+runParallel $decompDict potentialFoam
+runParallel $decompDict $(getApplication)
 
 runApplication reconstructParMesh -constant
 runApplication reconstructPar -latestTime
diff --git a/tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict b/tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict.6
similarity index 97%
rename from tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict
rename to tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict.6
index eb9bb3ad5e9eb308ebcceb21be97e305af2ea724..1f9924aa37b073084371f32b3edbe75f0f0cb1aa 100644
--- a/tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict
+++ b/tutorials/incompressible/simpleFoam/motorBike/system/decomposeParDict.6
@@ -28,7 +28,7 @@ simpleCoeffs
 
 hierarchicalCoeffs
 {
-    n               (3 2 1);
+    n               (2 2 1);
     delta           0.001;
     order           xyz;
 }