diff --git a/Allwmake b/Allwmake
index 6136570be0653026b149d645eb3047dfe31b4542..992d433bf3c3a4a1e314e106a78e66526a646d72 100755
--- a/Allwmake
+++ b/Allwmake
@@ -18,7 +18,7 @@ fi
 #------------------------------------------------------------------------------
 # Preamble. Report tools or at least the mpirun location
 if [ -f "$WM_PROJECT_DIR"/wmake/scripts/list_tools ]
-then  . "$WM_PROJECT_DIR"/wmake/scripts/list_tools
+then sh "$WM_PROJECT_DIR"/wmake/scripts/list_tools || true
 else
     echo "mpirun=$(command -v mpirun || true)"
 fi
diff --git a/applications/test/00-dummy/Allwclean b/applications/test/00-dummy/Allwclean
index c29945245a2c3b680f56e06aa4efa0c019c5cb7f..fe931e34d12834fe48ecc709a541392f5dbffc6d 100755
--- a/applications/test/00-dummy/Allwclean
+++ b/applications/test/00-dummy/Allwclean
@@ -1,7 +1,9 @@
 #!/bin/sh
-cd "${0%/*}" || exit    # Run from this directory
+cd "${0%/*}" || exit                                # Run from this directory
+#------------------------------------------------------------------------------
+
+library/Allwclean
 
-wclean libso dummy
 wclean
 
 #------------------------------------------------------------------------------
diff --git a/applications/test/00-dummy/Allwmake b/applications/test/00-dummy/Allwmake
index a7c0263c11ffe6a4c058de52c2fb9d7e61fa3f77..34307a355910e3297446e8fbb550b0dd33efff73 100755
--- a/applications/test/00-dummy/Allwmake
+++ b/applications/test/00-dummy/Allwmake
@@ -1,13 +1,12 @@
 #!/bin/sh
-cd "${0%/*}" || exit                        # Run from this directory
+cd "${0%/*}" || exit                                # Run from this directory
+#------------------------------------------------------------------------------
 
-# Can never be too certain ...
-# Compile tools for wmake
-( cd "${WM_DIR:-${WM_PROJECT_DIR}/wmake}/src" && ./Allmake )
+# Toolchain binaries (wmake)
+"${WM_DIR:-${WM_PROJECT_DIR}/wmake}"/src/Allmake
 
-#------------------------------------------------------------------------------
+library/Allwmake
 
-wmake libso dummy
 wmake
 
 #------------------------------------------------------------------------------
diff --git a/applications/test/00-dummy/Make/options b/applications/test/00-dummy/Make/options
index a717db36c39d6c62547a953f36c6b0f9f759b983..bcb411c91482dc9ededbe8842b8076504e943e45 100644
--- a/applications/test/00-dummy/Make/options
+++ b/applications/test/00-dummy/Make/options
@@ -1,6 +1,10 @@
-/* Without the normal project defaults */
+/* Disable normal project defaults */
 PROJECT_INC =
 PROJECT_LIBS =
 
-EXE_INC = -Idummy
-EXE_LIBS = -lOpenFOAM-dummy
+EXE_INC = \
+    -I./library
+
+EXE_LIBS = \
+    -lTestDummy-OpenFOAM \
+    -L$(FOAM_LIBBIN)/dummy -lTestDummyMpi
diff --git a/applications/test/00-dummy/Test-dummyLib.C b/applications/test/00-dummy/Test-dummyLib.C
index a8d6d331818f0964633787d7dcd0edd4d3690fde..6e1a6c8aeea90dcfd442b9701607a2ef2277d873 100644
--- a/applications/test/00-dummy/Test-dummyLib.C
+++ b/applications/test/00-dummy/Test-dummyLib.C
@@ -32,6 +32,7 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "dummyLib.H"
+
 #include <cstring>
 #include <iostream>
 
@@ -42,7 +43,7 @@ constexpr const char* const norm = "\\fR";  // nroff
 constexpr const char* const website = "www.openfoam.com";
 
 using std::cout;
-using wmake = Foam::Detail::dummyLib;
+using dummyLib = Foam::Detail::dummyLib;
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -71,6 +72,16 @@ static void printMan(const char* exeName)
 
     cout
         << ".SH OPTIONS" << nl
+        << ".TP" << nl
+        << "-parallel" << nl
+        << "Run parallel and provide simple report" << nl;
+
+    if (!Foam::Detail::dummyLib::hasMPI())
+    {
+        cout << "[warning: no mpi]" << nl;
+    }
+
+    cout
         << ".TP" << nl
         << "-help-man" << nl
         << "Display manpage" << nl;
@@ -78,28 +89,28 @@ static void printMan(const char* exeName)
     cout
         << ".SH INFORMATION" << nl
         << ".nf" << nl
-        << "label    = " << wmake::label_size << nl
-        << "scalar   = " << wmake::scalar_size;
+        << "label    = " << dummyLib::label_size << nl
+        << "scalar   = " << dummyLib::scalar_size;
 
     if
     (
-        wmake::solveScalar_size
-     && wmake::solveScalar_size != wmake::scalar_size
+        dummyLib::solveScalar_size
+     && dummyLib::solveScalar_size != dummyLib::scalar_size
     )
     {
         cout
-            << " [solve=" << wmake::solveScalar_size << "]";
+            << " [solve=" << dummyLib::solveScalar_size << "]";
     }
     cout
-        << " (" << wmake::precision << ')' << nl
-        << "arch     = " << wmake::arch << nl
-        << "compiler = " << wmake::compiler << nl;
+        << " (" << dummyLib::precision << ')' << nl
+        << "arch     = " << dummyLib::arch << nl
+        << "compiler = " << dummyLib::compiler << nl;
 
     cout
         << nl
-        << "archComp     = " << wmake::archComp << nl
-        << "archCompBase = " << wmake::archCompBase << nl
-        << "archCompFull = " << wmake::archCompFull << nl;
+        << "archComp     = " << dummyLib::archComp << nl
+        << "archCompBase = " << dummyLib::archCompBase << nl
+        << "archCompFull = " << dummyLib::archCompFull << nl;
     cout
         << ".fi" << nl;
 
@@ -110,43 +121,61 @@ static void printMan(const char* exeName)
 }
 
 
-int main(int argc, char *argv[])
+static void printInfo()
 {
-    // Process -help-man
-    if (argc > 1 && strcmp(argv[1], "-help-man") == 0)
-    {
-        printMan("Test-dummyLib");
-        return 0;
-    }
-
     cout
         << nl
         << "OPENFOAM  = " << OPENFOAM << nl
-        << "label     = " << wmake::label_size << nl
-        << "scalar    = " << wmake::scalar_size
-        << " (" << wmake::precision << ')' << nl;
+        << "label     = " << dummyLib::label_size << nl
+        << "scalar    = " << dummyLib::scalar_size
+        << " (" << dummyLib::precision << ')' << nl;
 
     if
     (
-        wmake::solveScalar_size
-     && wmake::solveScalar_size != wmake::scalar_size
+        dummyLib::solveScalar_size
+     && dummyLib::solveScalar_size != dummyLib::scalar_size
     )
     {
         cout
-            << "solve     = " << wmake::solveScalar_size << nl;
+            << "solve     = " << dummyLib::solveScalar_size << nl;
     }
 
     cout
-        << "arch      = " << wmake::arch << nl
-        << "compiler  = " << wmake::compiler << nl;
+        << "arch      = " << dummyLib::arch << nl
+        << "compiler  = " << dummyLib::compiler << nl;
 
     cout
         << nl
-        << "archComp     = " << wmake::archComp << nl
-        << "archCompBase = " << wmake::archCompBase << nl
-        << "archCompFull = " << wmake::archCompFull << nl;
+        << "archComp     = " << dummyLib::archComp << nl
+        << "archCompBase = " << dummyLib::archCompBase << nl
+        << "archCompFull = " << dummyLib::archCompFull << nl;
 
     cout<< nl;
+}
+
+
+int main(int argc, char *argv[])
+{
+    bool master = true;
+
+    if (argc > 1)
+    {
+        if (strcmp(argv[1], "-help-man") == 0)
+        {
+            printMan("Test-dummyLib");
+            return 0;
+        }
+
+        if (strcmp(argv[1], "-parallel") == 0)
+        {
+            master = dummyLib::printMPI();
+        }
+    }
+
+    if (master)
+    {
+        printInfo();
+    }
 
     return 0;
 }
diff --git a/applications/test/00-dummy/dummy/Make/files b/applications/test/00-dummy/dummy/Make/files
deleted file mode 100644
index 36f5ad877f7de490101a8063e620a4205e976adc..0000000000000000000000000000000000000000
--- a/applications/test/00-dummy/dummy/Make/files
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Install into FOAM_LIBBIN to support 'fake' builds (to test packaging) */
-dummyLib.C
-
-LIB = $(FOAM_LIBBIN)/libOpenFOAM-dummy
diff --git a/applications/test/00-dummy/library/Allwclean b/applications/test/00-dummy/library/Allwclean
new file mode 100755
index 0000000000000000000000000000000000000000..25a12c1865b7a9b8df1a0e409b99924834fcb829
--- /dev/null
+++ b/applications/test/00-dummy/library/Allwclean
@@ -0,0 +1,11 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+#------------------------------------------------------------------------------
+
+wclean dummy
+
+./Allwclean-mpi
+
+wclean
+
+#------------------------------------------------------------------------------
diff --git a/applications/test/00-dummy/library/Allwclean-mpi b/applications/test/00-dummy/library/Allwclean-mpi
new file mode 100755
index 0000000000000000000000000000000000000000..d238e435a145f267c9777ff9753336f7e3810621
--- /dev/null
+++ b/applications/test/00-dummy/library/Allwclean-mpi
@@ -0,0 +1,9 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions  # Require wmake functions
+
+#------------------------------------------------------------------------------
+
+wcleanLibMpi mpi
+
+#------------------------------------------------------------------------------
diff --git a/applications/test/00-dummy/library/Allwmake b/applications/test/00-dummy/library/Allwmake
new file mode 100755
index 0000000000000000000000000000000000000000..b36f036445a9bab9000ff85d9438579b6dd68889
--- /dev/null
+++ b/applications/test/00-dummy/library/Allwmake
@@ -0,0 +1,11 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+#------------------------------------------------------------------------------
+
+wmake libso dummy
+
+./Allwmake-mpi
+
+wmake libso
+
+#------------------------------------------------------------------------------
diff --git a/applications/test/00-dummy/library/Allwmake-mpi b/applications/test/00-dummy/library/Allwmake-mpi
new file mode 100755
index 0000000000000000000000000000000000000000..9b72d0f821c5fe69fdc1300076ad41027dd30e1d
--- /dev/null
+++ b/applications/test/00-dummy/library/Allwmake-mpi
@@ -0,0 +1,12 @@
+#!/bin/sh
+cd "${0%/*}" || exit                                # Run from this directory
+. ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments -no-recursion "$@"
+. ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions  # Require wmake functions
+
+#------------------------------------------------------------------------------
+# Environment
+#   - FOAM_MPI_LIBBIN (optional: defaults to FOAM_LIBBIN/FOAM_MPI)
+
+wmakeLibMpi mpi
+
+#------------------------------------------------------------------------------
diff --git a/applications/test/00-dummy/library/Make/files b/applications/test/00-dummy/library/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..680663a97ba864899e3e0ef36ff825ffca423262
--- /dev/null
+++ b/applications/test/00-dummy/library/Make/files
@@ -0,0 +1,4 @@
+/* Install into central FOAM_LIBBIN for 'fake' builds (test packaging) */
+dummyLib.C
+
+LIB = $(FOAM_LIBBIN)/libTestDummy-OpenFOAM
diff --git a/applications/test/00-dummy/dummy/Make/options b/applications/test/00-dummy/library/Make/options
similarity index 93%
rename from applications/test/00-dummy/dummy/Make/options
rename to applications/test/00-dummy/library/Make/options
index 8ce0038ce82090739a62723c60f67f32d6aed525..8ada299b3acb40b19d6d3ef9e9a49e51e6d8a7b6 100644
--- a/applications/test/00-dummy/dummy/Make/options
+++ b/applications/test/00-dummy/library/Make/options
@@ -8,4 +8,4 @@ EXE_INC = \
     -DWM_COMPILE_OPTION=\"$(WM_COMPILE_OPTION)\" \
     -DWM_OPTIONS=\"$(WM_OPTIONS)\"
 
-/* LIB_LIBS = */
+LIB_LIBS =
diff --git a/applications/test/00-dummy/library/dummy/Make/files b/applications/test/00-dummy/library/dummy/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..946086a06410cec2f4388033cf1be0fbe118aa7a
--- /dev/null
+++ b/applications/test/00-dummy/library/dummy/Make/files
@@ -0,0 +1,4 @@
+/* Install into central FOAM_LIBBIN/dummy for 'fake' builds (test packaging) */
+dummyMpiLib.C
+
+LIB = $(FOAM_LIBBIN)/dummy/libTestDummyMpi
diff --git a/applications/test/00-dummy/library/dummy/Make/options b/applications/test/00-dummy/library/dummy/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..a367c338001529cf19bd65f34e45b80fa0b1ae84
--- /dev/null
+++ b/applications/test/00-dummy/library/dummy/Make/options
@@ -0,0 +1,8 @@
+/* Disable normal project defaults */
+PROJECT_INC =
+PROJECT_LIBS =
+
+EXE_INC = \
+    -I../
+
+/* LIB_LIBS = */
diff --git a/applications/test/00-dummy/library/dummy/dummyMpiLib.C b/applications/test/00-dummy/library/dummy/dummyMpiLib.C
new file mode 100644
index 0000000000000000000000000000000000000000..ae0670b8a40f4ef80622ca73e00fc7875c316919
--- /dev/null
+++ b/applications/test/00-dummy/library/dummy/dummyMpiLib.C
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "dummyLib.H"
+#include <iostream>
+
+// * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * * //
+
+bool Foam::Detail::dummyLib::hasMPI()
+{
+    return false;
+}
+
+
+bool Foam::Detail::dummyLib::printMPI()
+{
+    std::cout << "Compiled without mpi\n";
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/00-dummy/dummy/dummyLib.C b/applications/test/00-dummy/library/dummyLib.C
similarity index 98%
rename from applications/test/00-dummy/dummy/dummyLib.C
rename to applications/test/00-dummy/library/dummyLib.C
index 1130023f406f59a150451cec959a1cdc3e7d7220..bd079632e904ba329dd396f6d04e46045c3587ee 100644
--- a/applications/test/00-dummy/dummy/dummyLib.C
+++ b/applications/test/00-dummy/library/dummyLib.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2019 OpenCFD Ltd.
+    Copyright (C) 2018-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
diff --git a/applications/test/00-dummy/dummy/dummyLib.H b/applications/test/00-dummy/library/dummyLib.H
similarity index 86%
rename from applications/test/00-dummy/dummy/dummyLib.H
rename to applications/test/00-dummy/library/dummyLib.H
index 7189b250a2b5547a808bb5efbf901dc432a5683d..31934eb7ccbff0a86d984a2abe822632a48acd3c 100644
--- a/applications/test/00-dummy/dummy/dummyLib.H
+++ b/applications/test/00-dummy/library/dummyLib.H
@@ -24,20 +24,22 @@ License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
 Class
-    Foam::Detail::dummyLib
+    Foam::Detail::dummy
 
 Description
-    This class serves little useful purpose, but can be used to compile
-    into a dummy library and link against for a minimal application
-    that uses the wmake framework
+    No useful purpose other than to use the wmake framework to generate
+    a dummy library for testing/packaging purposes
+
+Note
+    Pure C++ without any OpenFOAM classes or libraries.
 
 SourceFiles
     dummyLib.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef dummyLib_H
-#define dummyLib_H
+#ifndef testing_dummyLib_H
+#define testing_dummyLib_H
 
 #include <string>
 
@@ -80,6 +82,12 @@ struct dummyLib
 
     //- DIY Compile-time value of WM_OPTIONS
     static const std::string archCompFull;
+
+    //- Compiled/linked with mpi?
+    static bool hasMPI();
+
+    //- Print ranks (trivial mpi test). Return true for master only.
+    static bool printMPI();
 };
 
 
diff --git a/applications/test/00-dummy/library/mpi/Make/files b/applications/test/00-dummy/library/mpi/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..bb3cd16a46302a121631674f418073a7d7fb7a1f
--- /dev/null
+++ b/applications/test/00-dummy/library/mpi/Make/files
@@ -0,0 +1,4 @@
+/* Install into central FOAM_MPI_LIBBIN for 'fake' builds (test packaging) */
+dummyMpiLib.C
+
+LIB = $(FOAM_MPI_LIBBIN)/libTestDummyMpi
diff --git a/applications/test/00-dummy/library/mpi/Make/options b/applications/test/00-dummy/library/mpi/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..2c788d6c922509228ca896d4afdd1cb16d9e2c61
--- /dev/null
+++ b/applications/test/00-dummy/library/mpi/Make/options
@@ -0,0 +1,17 @@
+/* Disable normal project defaults */
+PROJECT_INC =
+PROJECT_LIBS =
+
+sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)
+sinclude $(DEFAULT_RULES)/mplib$(WM_MPLIB)
+
+/* Default is PROJECT LIB/mpi target */
+ifeq (,$(FOAM_MPI_LIBBIN))
+    FOAM_MPI_LIBBIN := $(FOAM_LIBBIN)/$(FOAM_MPI)
+endif
+
+EXE_INC = \
+    -I.. \
+    $(PFLAGS) $(PINC) $(c++LESSWARN) -DFOAM_MPI=\"$(FOAM_MPI)\"
+
+LIB_LIBS = $(PLIBS)
diff --git a/applications/test/00-dummy/library/mpi/dummyMpiLib.C b/applications/test/00-dummy/library/mpi/dummyMpiLib.C
new file mode 100644
index 0000000000000000000000000000000000000000..a0c5ed34300f5ae36da35a33e8df539c3bddc96f
--- /dev/null
+++ b/applications/test/00-dummy/library/mpi/dummyMpiLib.C
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "dummyLib.H"
+#include <iostream>
+#include <mpi.h>
+
+// * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * * //
+
+bool Foam::Detail::dummyLib::hasMPI()
+{
+    return true;
+}
+
+
+bool Foam::Detail::dummyLib::printMPI()
+{
+    int rank = 0, nprocs = 0;
+
+    MPI_Init(nullptr, nullptr);
+
+    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+    // Hello world
+    std::cout
+        <<
+        (
+            std::string("mpi rank ")
+          + std::to_string(rank) + '/' + std::to_string(nprocs)
+          + '\n'
+        );
+
+    MPI_Finalize();
+
+    #ifdef FOAM_MPI
+    if (rank == 0)
+    {
+        std::cout
+            <<
+            (
+                std::string("FOAM_MPI=") + std::string(FOAM_MPI)
+              + '\n'
+            );
+    }
+    #endif
+
+    return rank == 0;
+}
+
+
+// ************************************************************************* //
diff --git a/bin/tools/query-detect b/bin/tools/query-detect
new file mode 100755
index 0000000000000000000000000000000000000000..5d5cf61286f938acb2439044cf12d382fd93ab59
--- /dev/null
+++ b/bin/tools/query-detect
@@ -0,0 +1,169 @@
+#!/bin/sh
+#------------------------------------------------------------------------------
+# =========                 |
+# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+#  \\    /   O peration     |
+#   \\  /    A nd           | www.openfoam.com
+#    \\/     M anipulation  |
+#------------------------------------------------------------------------------
+#     Copyright (C) 2020 OpenCFD Ltd.
+#------------------------------------------------------------------------------
+# License
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
+#
+# Script
+#     query-detect
+#
+# Description
+#     Calls various wmake 'have_*' scripts with -test to report the
+#     detected software locations
+#
+# Environment
+#     Needs the OpenFOAM environment
+#
+#------------------------------------------------------------------------------
+printHelp() {
+    cat<<USAGE
+
+Usage: ${0##*/} [OPTIONS] [name1 .. [nameN]]
+options:
+  -all              Test all
+  -mode=MODE        Pass-through option for foamEtcFile
+  -help             Display short help and exit
+
+Calls various wmake 'have_*' scripts with -test to report the
+detected software locations
+
+USAGE
+    exit 0  # A clean exit
+}
+
+
+# Report error and exit
+die()
+{
+    exec 1>&2
+    echo
+    echo "Error encountered:"
+    while [ "$#" -ge 1 ]; do echo "    $1"; shift; done
+    echo
+    echo "See '${0##*/} -help' for usage"
+    echo
+    exit 1
+}
+
+
+#-------------------------------------------------------------------------------
+# Parse options
+unset optAall optMode
+
+while [ "$#" -gt 0 ]
+do
+    case "$1" in
+    (-h | -help*)
+        printHelp
+        ;;
+    (-all | all)
+        optAll=true
+        ;;
+    (-mode=[ugo]*)
+        optMode="${1#*=}"
+        ;;
+    (--)
+        shift
+        break    # Stop here
+        ;;
+    (-*)
+        echo "Ignore unknown option: $1" 1>&2
+        ;;
+    (*)
+        break
+        ;;
+    esac
+    shift
+done
+
+
+#------------------------------------------------------------------------------
+projectDir="$WM_PROJECT_DIR"
+scriptsDir="$projectDir/wmake/scripts"
+
+[ -d "$projectDir" ] || {
+    echo "OpenFOAM environment appears to be missing" 1>&2
+    echo "    $projectDir" 1>&2
+    exit 2
+}
+[ -d "$scriptsDir" ] || {
+    echo "No scripts directory: $scriptsDir" 1>&2
+    exit 2
+}
+
+if [ "$#" = 0 ] && [ -z "$optAll" ]
+then
+    echo "Nothing specified" 1>&2
+    exit 0
+fi
+
+if [ -n "$optMode" ]
+then
+    export FOAM_CONFIG_MODE="$optMode"
+fi
+
+
+#------------------------------------------------------------------------------
+
+# Examine the "wmake/scripts/have_..." scripts for query_...() functions,
+# assume they also have a -query option
+
+if [ -n "$optAll" ]
+then
+    set -- $(
+        for script in "$scriptsDir"/have_*
+        do
+            if [ -f "$script" ]
+            then
+                script="${script##*/}"
+
+                case "$script" in
+                (*.bak | *.orig)
+                    ;;
+
+                (*)
+                    echo "${script#have_}"
+                    ;;
+                esac
+            fi
+        done
+    )
+fi
+
+
+## echo "Test: $@" 1>&2
+
+echo "#----------------"
+# Assume they each have a -test option
+for name
+do
+    script="$scriptsDir/have_${name}"
+    case "$name" in
+    (*.bak | *.orig)
+        continue
+        ;;
+    esac
+
+    echo
+    if [ -f "$script" ]
+    then
+        echo "# Detection for '$name'"
+        bash "$script" -test
+    else
+        echo "# No detection support for '$name'"
+    fi
+done
+
+echo
+echo "#----------------"
+
+exit 0  # A clean exit
+
+#------------------------------------------------------------------------------
diff --git a/etc/config.csh/setup b/etc/config.csh/setup
index 5f9bec387fb9302f98f7d590eaa2982c2477a076..070233ddc809d8f6dda86a91121612095084c395 100644
--- a/etc/config.csh/setup
+++ b/etc/config.csh/setup
@@ -39,40 +39,43 @@ source "$WM_PROJECT_DIR/etc/config.csh/functions"
 # [WM_THIRD_PARTY_DIR] - Location of third-party software components
 # \- This may be installed in a directory parallel to the OpenFOAM project
 #    directory, with the same version name or using the API value.
-#    It may also not be required at all, in which case a dummy "ThirdParty"
-#    directory inside of the OpenFOAM project directory.
+#    It may also not be required at all, in which case use a dummy
+#    "ThirdParty" inside of the OpenFOAM project directory.
 #
-# Note: only accept if the directory exists and contains either
-#   a "Allwmake" file (source) or a "platforms" directory (runtime-only)
-
-setenv WM_THIRD_PARTY_DIR
-set foundDir=''
-
-_foamEcho "Locating ThirdParty directory"
-
-foreach foamDir (\
-    "$WM_PROJECT_DIR/ThirdParty" \
-    "$prefixDir/ThirdParty-$WM_PROJECT_VERSION" \
-    "$prefixDir/ThirdParty-v$FOAM_API" \
-    "$prefixDir/ThirdParty-$FOAM_API" \
-    "$prefixDir/ThirdParty-common" \
-)
-    _foamEcho "... $foamDir"
-    if ( -d "$foamDir" ) then
-        if ( -f "$foamDir/Allwmake" || -d "$foamDir/platforms" ) then
-            setenv WM_THIRD_PARTY_DIR "$foamDir"
-            set foundDir=true
-            break
-        endif
-    endif
-end
+# Test out-of-source directories for an "Allwmake" file (source)
+# or a "platforms/" directory (runtime-only)
 
-if ("${foundDir}" == true) then
-    _foamEcho "Using $WM_THIRD_PARTY_DIR"
+setenv WM_THIRD_PARTY_DIR ""  # Empty value (before detection)
+
+if ( -e "$WM_PROJECT_DIR/ThirdParty" ) then
+    # Directory or file (masks use of ThirdParty entirely)
+    setenv WM_THIRD_PARTY_DIR "$WM_PROJECT_DIR/ThirdParty"
 else
+    _foamEcho "Locating ThirdParty directory"
+    foreach foundDir (\
+        "$prefixDir/ThirdParty-$WM_PROJECT_VERSION" \
+        "$prefixDir/ThirdParty-v$FOAM_API" \
+        "$prefixDir/ThirdParty-$FOAM_API" \
+        "$prefixDir/ThirdParty-common" \
+    )
+        _foamEcho "... $foundDir"
+        if ( -d "$foundDir" ) then
+            if ( -f "$foundDir/Allwmake" || -d "$foundDir/platforms" ) then
+                setenv WM_THIRD_PARTY_DIR "$foundDir"
+                break
+            else
+                _foamEcho "    does not have Allwmake or platforms/"
+            endif
+        endif
+    end
+endif
+
+if ("${WM_THIRD_PARTY_DIR}" == "") then
     # Dummy fallback value
     setenv WM_THIRD_PARTY_DIR "$WM_PROJECT_DIR/ThirdParty"
-    _foamEcho "Dummy $WM_THIRD_PARTY_DIR"
+    _foamEcho "Dummy ThirdParty $WM_THIRD_PARTY_DIR"
+else
+    _foamEcho "ThirdParty $WM_THIRD_PARTY_DIR"
 endif
 # Done with ThirdParty discovery
 
@@ -206,6 +209,6 @@ unalias _foamAddLib
 unalias _foamAddLibAuto
 
 # Variables (done as final statement for a clean exit code)
-unset cleaned foamOldDirs foundDir foamDir prefixDir
+unset cleaned foamOldDirs foundDir prefixDir
 
 #------------------------------------------------------------------------------
diff --git a/etc/config.sh/setup b/etc/config.sh/setup
index ed4df86dbfb22836bbf97c4f059464f0ffed2087..b5adaa08f8be466ce95a8205eb94559523c1e792 100644
--- a/etc/config.sh/setup
+++ b/etc/config.sh/setup
@@ -40,44 +40,49 @@ unset WM_SHELL_FUNCTIONS
 # [WM_THIRD_PARTY_DIR] - Location of third-party software components
 # \- This may be installed in a directory parallel to the OpenFOAM project
 #    directory, with the same version name or using the API value.
-#    It may also not be required at all, in which case a dummy "ThirdParty"
-#    directory inside of the OpenFOAM project directory.
+#    It may also not be required at all, in which case use a dummy
+#    "ThirdParty" inside of the OpenFOAM project directory.
 #
-# Note: only accept if the directory exists and contains either
-#   a "Allwmake" file (source) or a "platforms" directory (runtime-only)
-
-export WM_THIRD_PARTY_DIR
-unset foundDir
-
-_foamEcho "Locating ThirdParty directory"
-
-for WM_THIRD_PARTY_DIR in \
-    "$WM_PROJECT_DIR/ThirdParty" \
-    "$prefixDir/ThirdParty-$WM_PROJECT_VERSION" \
-    "$prefixDir/ThirdParty-v$FOAM_API" \
-    "$prefixDir/ThirdParty-$FOAM_API" \
-    "$prefixDir/ThirdParty-common" \
-    ;
-do
-    _foamEcho "... $WM_THIRD_PARTY_DIR"
-    if [ -d "$WM_THIRD_PARTY_DIR" ]
-    then
-        if [ -f "$WM_THIRD_PARTY_DIR/Allwmake" ] || \
-           [ -d "$WM_THIRD_PARTY_DIR/platforms" ]
+# Test out-of-source directories for an "Allwmake" file (source)
+# or a "platforms/" directory (runtime-only)
+
+export WM_THIRD_PARTY_DIR=""  # Empty value (before detection)
+
+if [ -e "$WM_PROJECT_DIR/ThirdParty" ]
+then
+    # Directory or file (masks use of ThirdParty entirely)
+    WM_THIRD_PARTY_DIR="$WM_PROJECT_DIR/ThirdParty"
+else
+    _foamEcho "Locating ThirdParty directory"
+    for foundDir in \
+        "$prefixDir/ThirdParty-$WM_PROJECT_VERSION" \
+        "$prefixDir/ThirdParty-v$FOAM_API" \
+        "$prefixDir/ThirdParty-$FOAM_API" \
+        "$prefixDir/ThirdParty-common" \
+        ;
+    do
+        _foamEcho "... $foundDir"
+        if [ -d "$foundDir" ]
         then
-            foundDir=true
-            break
+            if [ -f "$foundDir/Allwmake" ] || \
+               [ -d "$foundDir/platforms" ]
+            then
+                WM_THIRD_PARTY_DIR="$foundDir"
+                break
+            else
+                _foamEcho "    does not have Allwmake or platforms/"
+            fi
         fi
-    fi
-done
+    done
+fi
 
-if [ -n "$foundDir" ]
+if [ -z "$WM_THIRD_PARTY_DIR" ]
 then
-    _foamEcho "Using $WM_THIRD_PARTY_DIR"
-else
     # Dummy fallback value
     WM_THIRD_PARTY_DIR="$WM_PROJECT_DIR/ThirdParty"
-    _foamEcho "Dummy $WM_THIRD_PARTY_DIR"
+    _foamEcho "Dummy ThirdParty $WM_THIRD_PARTY_DIR"
+else
+    _foamEcho "ThirdParty $WM_THIRD_PARTY_DIR"
 fi
 # Done with ThirdParty discovery
 
diff --git a/wmake/scripts/list_tools b/wmake/scripts/list_tools
index 2184bc7e33a2e607de55ccf96bd7734699d60b8f..758808fd169dbcd74f44d8e38e17a8632cb5e3f3 100644
--- a/wmake/scripts/list_tools
+++ b/wmake/scripts/list_tools
@@ -8,8 +8,7 @@
 #     Copyright (C) 2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
 #
 # Script
 #     list_tools
diff --git a/wmake/wmake b/wmake/wmake
index 572fea82567c5be42622ef7b527bbbb2c450e0e2..d7cabb880f7f99929b3650999cb8cefeb7267d50 100755
--- a/wmake/wmake
+++ b/wmake/wmake
@@ -195,7 +195,7 @@ allCores()
 #------------------------------------------------------------------------------
 
 # Default to compiling the local target only
-unset optAll optUpdate optDebug optQuiet optShow optPwd
+unset optAll optUpdate optCxx optDebug optQuiet optShow optPwd
 
 # Consistency with inherited values
 if [ "$WM_QUIET" = true ]
@@ -231,7 +231,7 @@ do
             export WM_QUIET=true
             ;;
         -debug)
-            optDebug="-DFULLDEBUG -g -O0"
+            optDebug=true
             ;;
 
         -module-prefix=*)
@@ -489,13 +489,29 @@ unset exitCode
 # Recurse the source tree to compile "all" targets
 #------------------------------------------------------------------------------
 
+if [ -n "$optDebug" ]
+then
+    # Convey -debug via FOAM_EXTRA_CXXFLAGS
+    optDebug="-DFULLDEBUG -g"
+    oldFlags="$FOAM_EXTRA_CXXFLAGS"
+
+    case "$oldFlags" in
+    (*-DFULLDEBUG*)
+        # Already there
+    ;;
+    (*)
+        export FOAM_EXTRA_CXXFLAGS="$oldFlags${oldFlags:+ }$optDebug"
+    ;;
+    esac
+fi
+
 if [ "$optAll" = all ]
 then
     if [ -e Allwmake.override ]
     then
         if [ -x Allwmake.override ]
         then
-            ./Allwmake.override -fromWmake ${optDebug:+-debug} $targetType
+            ./Allwmake.override -fromWmake $targetType
             exitCode="$?"
         else
             # Allow empty or non-executable file (eg, touch Allwmake.override)
@@ -503,7 +519,7 @@ then
         fi
     elif [ -e Allwmake ]
     then
-        ./Allwmake -fromWmake ${optDebug:+-debug} $targetType
+        ./Allwmake -fromWmake $targetType
         exitCode="$?"
     fi
 
@@ -531,7 +547,6 @@ then
         # Compile all applications in sub-directories
         $make ${WM_CONTINUE_ON_ERROR:+-k} \
               -f $WM_DIR/makefiles/apps \
-              ${optDebug:+c++DBUG="$optDebug"} \
               TARGET="$targetType" FOAM_APPS="$FOAM_APPS"
         exitCode=$?
     fi
@@ -558,7 +573,7 @@ then
         "$WM_SCHEDULER" -clean \
      && wmake -all objects   \
      && "$WM_SCHEDULER"
-    ) && wmake -all ${optDebug:+-debug}
+    ) && wmake -all
     exit $?
 fi
 
@@ -678,7 +693,6 @@ fi
 #------------------------------------------------------------------------------
 
 exec $make -f $WM_DIR/makefiles/general \
-     ${optDebug:+c++DBUG="$optDebug"} \
      MAKE_DIR=$MakeDir OBJECTS_DIR=$objectsDir $targetType
 
 exit 0 # clean exit