diff --git a/src/functionObjects/forces/forces/forces.C b/src/functionObjects/forces/forces/forces.C
index 750b3c560ac8e4805dc1230d9947c3773c8ff62e..ed012a65f5812e611d2f12fa737eaf9f9667d037 100644
--- a/src/functionObjects/forces/forces/forces.C
+++ b/src/functionObjects/forces/forces/forces.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2015-2019 OpenCFD Ltd.
+    Copyright (C) 2015-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -530,17 +530,13 @@ void Foam::functionObjects::forces::addToFields
         return;
     }
 
-    volVectorField& force =
-        lookupObjectRef<volVectorField>(fieldName("force"));
-
+    auto& force = lookupObjectRef<volVectorField>(fieldName("force"));
     vectorField& pf = force.boundaryFieldRef()[patchi];
     pf += fN + fT + fP;
 
-    volVectorField& moment =
-        lookupObjectRef<volVectorField>(fieldName("moment"));
-
+    auto& moment = lookupObjectRef<volVectorField>(fieldName("moment"));
     vectorField& pm = moment.boundaryFieldRef()[patchi];
-    pm += Md;
+    pm = Md^pf;
 }
 
 
@@ -558,17 +554,14 @@ void Foam::functionObjects::forces::addToFields
         return;
     }
 
-    volVectorField& force =
-        lookupObjectRef<volVectorField>(fieldName("force"));
-
-    volVectorField& moment =
-        lookupObjectRef<volVectorField>(fieldName("moment"));
+    auto& force = lookupObjectRef<volVectorField>(fieldName("force"));
+    auto& moment = lookupObjectRef<volVectorField>(fieldName("moment"));
 
     forAll(cellIDs, i)
     {
         label celli = cellIDs[i];
         force[celli] += fN[i] + fT[i] + fP[i];
-        moment[celli] += Md[i];
+        moment[celli] = Md[i]^force[celli];
     }
 }
 
diff --git a/wmake/rules/General/Clang/openmp b/wmake/rules/General/Clang/openmp
deleted file mode 100644
index 070a2c5d3ad0b2ef0b54b458bffa78b8ac915812..0000000000000000000000000000000000000000
--- a/wmake/rules/General/Clang/openmp
+++ /dev/null
@@ -1,8 +0,0 @@
-# Flags for compiling/linking openmp
-# The USE_OMP is for OpenFOAM-specific use (general use is _OPENMP)
-# -
-# Clang provides 'omp' and a link for 'gomp'.
-# With 'gomp' we can use system libs.
-
-COMP_OPENMP = -DUSE_OMP -fopenmp
-LINK_OPENMP = -lgomp
diff --git a/wmake/rules/General/Clang/openmp b/wmake/rules/General/Clang/openmp
new file mode 120000
index 0000000000000000000000000000000000000000..1320b58055ea958b1a33ed43a3e15f5b75dbcacf
--- /dev/null
+++ b/wmake/rules/General/Clang/openmp
@@ -0,0 +1 @@
+openmp-gomp
\ No newline at end of file
diff --git a/wmake/rules/General/Clang/openmp-gomp b/wmake/rules/General/Clang/openmp-gomp
new file mode 100644
index 0000000000000000000000000000000000000000..1cbfe932205cc41ebc2f9b7438924084cf457ba9
--- /dev/null
+++ b/wmake/rules/General/Clang/openmp-gomp
@@ -0,0 +1,8 @@
+# Flags for compiling/linking openmp
+# The USE_OMP is for OpenFOAM-specific use (general use is _OPENMP)
+# -
+# Clang provides 'omp' and a link for 'gomp'.
+# With 'gomp' we can also use system libs.
+
+COMP_OPENMP = -DUSE_OMP -fopenmp
+LINK_OPENMP = -lgomp
diff --git a/wmake/rules/General/Clang/openmp-omp b/wmake/rules/General/Clang/openmp-omp
new file mode 100644
index 0000000000000000000000000000000000000000..b54782f8cf090e0f4d0a5c080bdd373772536d63
--- /dev/null
+++ b/wmake/rules/General/Clang/openmp-omp
@@ -0,0 +1,5 @@
+# Flags for compiling/linking openmp
+# The USE_OMP is for OpenFOAM-specific use (general use is _OPENMP)
+
+COMP_OPENMP = -DUSE_OMP -fopenmp
+LINK_OPENMP = -lomp
diff --git a/wmake/rules/General/general b/wmake/rules/General/general
index 879ed13b9b006bb9b6dfd6df1ee3320db7920c9f..c9df83528c7c16f2eb698b1c98f1ff4fc04bac38 100644
--- a/wmake/rules/General/general
+++ b/wmake/rules/General/general
@@ -14,25 +14,29 @@ GLIBS      = -lm
 GLIB_LIBS  =
 
 
-COMPILER_FAMILY = $(shell echo "$(WM_COMPILER)" | sed -e 's/[0-9].*//')
-DEFAULT_RULES   = $(WM_DIR)/rules/$(WM_ARCH)$(COMPILER_FAMILY)
-RULES           = $(WM_DIR)/rules/$(WM_ARCH)$(WM_COMPILER)
+ARCHITECTURE_RULES = $(WM_DIR)/rules/$(WM_ARCH)
+COMPILER_FAMILY = $(shell echo "$(WM_COMPILER)" | sed -e 's/[-+.0-9~].*//')
+DEFAULT_RULES   = $(ARCHITECTURE_RULES)$(COMPILER_FAMILY)
+RULES           = $(ARCHITECTURE_RULES)$(WM_COMPILER)
 WMAKE_BIN       = $(WM_PROJECT_DIR)/platforms/tools/$(WM_ARCH)$(WM_COMPILER)
 
 # Default compilation is 'Opt' - never permit an empty value
-ifeq ($(WM_COMPILE_OPTION),)
+ifeq (,$(WM_COMPILE_OPTION))
     WM_COMPILE_OPTION = Opt
 endif
 
-ifeq ($(WM_SCHEDULER),)
+ifeq (,$(WM_SCHEDULER))
     AND = &&
 else
     AND = '&&'
 endif
 
 include $(DEFAULT_RULES)/general
+sinclude $(DEFAULT_RULES)/override
+ifneq ("$(COMPILER_FAMILY)","$(WM_COMPILER)")
 sinclude $(RULES)/general
 sinclude $(RULES)/c++
+endif
 include $(GENERAL_RULES)/transform
 
 #------------------------------------------------------------------------------
diff --git a/wmake/rules/General/mplib b/wmake/rules/General/mplib
deleted file mode 100644
index 294bd86150160e40c0ac6bd51f5e6d5a6368cb0f..0000000000000000000000000000000000000000
--- a/wmake/rules/General/mplib
+++ /dev/null
@@ -1,3 +0,0 @@
-PFLAGS     =
-PINC       =
-PLIBS      =
diff --git a/wmake/rules/General/mplib b/wmake/rules/General/mplib
new file mode 120000
index 0000000000000000000000000000000000000000..b7d2b8d468cc632db0ac13b9728aab45bec2d8c5
--- /dev/null
+++ b/wmake/rules/General/mplib
@@ -0,0 +1 @@
+no-mpi
\ No newline at end of file
diff --git a/wmake/rules/General/no-mpi b/wmake/rules/General/no-mpi
new file mode 100644
index 0000000000000000000000000000000000000000..a682d31029b903edb7d5b05130d05218b6af4e25
--- /dev/null
+++ b/wmake/rules/General/no-mpi
@@ -0,0 +1,7 @@
+# Empty flags for not compiling/linking MPI
+
+PFLAGS     =
+PINC       =
+PLIBS      =
+
+#------------------------------------------------------------------------------
diff --git a/wmake/rules/General/no-openmp b/wmake/rules/General/no-openmp
new file mode 100644
index 0000000000000000000000000000000000000000..36ff42c0d986bac23bfcd72fe783ead0da47c497
--- /dev/null
+++ b/wmake/rules/General/no-openmp
@@ -0,0 +1,6 @@
+# Empty flags for not compiling/linking OPENMP
+
+COMP_OPENMP =
+LINK_OPENMP =
+
+#------------------------------------------------------------------------------
diff --git a/wmake/rules/darwin64Clang/general b/wmake/rules/darwin64Clang/general
index 1409ef1e6e96f6772cacec47c4774b3e306fc58b..eea19222602cb7ff19c703b56f902d933f46afc7 100644
--- a/wmake/rules/darwin64Clang/general
+++ b/wmake/rules/darwin64Clang/general
@@ -3,7 +3,16 @@ CPP        = cpp -traditional-cpp $(GFLAGS)
 PROJECT_LIBS = -l$(WM_PROJECT) -ldl
 
 include $(GENERAL_RULES)/standard
-include $(GENERAL_RULES)/Clang/openmp
+## include $(GENERAL_RULES)/Clang/openmp
+
+# Darwin-specific
+# ----
+COMP_OPENMP = -DUSE_OMP -Xpreprocessor -fopenmp
+LINK_OPENMP = -lomp
+# ----
+# Or disable
+# include $(GENERAL_RULES)/no-openmp
+# ----
 
 include $(DEFAULT_RULES)/c
 include $(DEFAULT_RULES)/c++
diff --git a/wmake/scripts/cmakeFunctions b/wmake/scripts/cmakeFunctions
index 56b75611c16de848738304a71c8332928c2ecac2..bceed70f9e4d6e7348c275bfc888bc44b5d65d70 100644
--- a/wmake/scripts/cmakeFunctions
+++ b/wmake/scripts/cmakeFunctions
@@ -8,14 +8,14 @@
 #     Copyright (C) 2017-2020 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
 #     cmakeFunctions
 #
 # Description
 #     Helper functions for CMake
+#
 #------------------------------------------------------------------------------
 . ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions  # Require wmake functions
 
diff --git a/wmake/scripts/have_adios2 b/wmake/scripts/have_adios2
index 821eea7e1be53bbc37e5d516d993c48edca48306..f6afaf123d33371bcc5da2fad8651b9d54a7b4f4 100644
--- a/wmake/scripts/have_adios2
+++ b/wmake/scripts/have_adios2
@@ -37,7 +37,6 @@
 no_adios2()
 {
     unset HAVE_ADIOS2 ADIOS2_INC_DIR ADIOS2_LIB_DIR
-    return 0
 }
 
 
@@ -88,11 +87,10 @@ query_adios2()
 # -> HAVE_ADIOS2, ADIOS2_INC_DIR, ADIOS2_LIB_DIR
 have_adios2()
 {
+    local warn # warn="==> skip adios2"
     local config="config.sh/adios2"
-    local prefix header library incName libName settings warn
-    # warn="==> skip adios2"
+    local settings
 
-    # Setup
     if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
     then
         . "$settings"
@@ -102,9 +100,10 @@ have_adios2()
     fi
 
     # Expected location, include/library names
-    prefix="$ADIOS2_ARCH_PATH"
-    incName="adios2.h"
-    libName="libadios2"
+    local prefix="$ADIOS2_ARCH_PATH"
+    local incName="adios2.h"
+    local libName="libadios2"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_boost b/wmake/scripts/have_boost
index d901e7a27703f4d90cbbfb95bb3f554935013b53..133f15d772b8a1792fadf83061b8ebd3585726f6 100644
--- a/wmake/scripts/have_boost
+++ b/wmake/scripts/have_boost
@@ -18,6 +18,7 @@
 #
 # Requires
 #     BOOST_ARCH_PATH
+# or  config.sh/CGAL (when BOOST_ARCH_PATH is empty)
 #
 # Functions provided
 #     have_boost, no_boost, echo_boost, query_boost
@@ -37,7 +38,6 @@
 no_boost()
 {
     unset HAVE_BOOST BOOST_INC_DIR BOOST_LIB_DIR
-    return 0
 }
 
 
@@ -72,15 +72,27 @@ query_boost()
 # -> HAVE_BOOST, BOOST_INC_DIR, BOOST_LIB_DIR
 have_boost()
 {
-    local prefix header library incName libName settings warn
-    # warn="==> skip boost"
+    local warn # warn="==> skip boost"
+    local config="config.sh/CGAL"
+    local settings
 
-    # Setup - from the current environment
+    # Setup - current environment if set
+    if [ -z "$BOOST_ARCH_PATH" ]
+    then
+        if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
+        then
+            . "$settings"
+        else
+            [ -n "$warn" ] && echo "$warn (no $config settings)"
+            return 2
+        fi
+    fi
 
     # Expected location, include/library names
-    prefix="$BOOST_ARCH_PATH"
-    incName="boost/version.hpp"
-    libName="libboost_system"
+    local prefix="$BOOST_ARCH_PATH"
+    local incName="boost/version.hpp"
+    local libName="libboost_system"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_ccmio b/wmake/scripts/have_ccmio
index c3dc3f3595156b373ca30b90feb407580402797f..47e32ff8a5eec18d50fae2e9bda3d36228b339ad 100644
--- a/wmake/scripts/have_ccmio
+++ b/wmake/scripts/have_ccmio
@@ -37,9 +37,9 @@
 no_ccmio()
 {
     unset HAVE_CCMIO CCMIO_INC_DIR CCMIO_LIB_DIR
-    return 0
 }
 
+
 # Report
 echo_ccmio()
 {
@@ -71,9 +71,9 @@ query_ccmio()
 # -> HAVE_CCMIO, CCMIO_INC_DIR, CCMIO_LIB_DIR
 have_ccmio()
 {
+    local warn="==> skip ccmio"
     local config="config.sh/ccmio"
-    local prefix header library incName libName settings warn
-    warn="==> skip ccmio"
+    local settings
 
     if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
     then
@@ -85,9 +85,10 @@ have_ccmio()
 
     # Expected location, include/library names
     # Link with static libccmio only (fewer issues)
-    prefix="$CCMIO_ARCH_PATH"
-    incName="libccmio/ccmio.h"
-    libName="libccmio.a"
+    local prefix="$CCMIO_ARCH_PATH"
+    local incName="libccmio/ccmio.h"
+    local libName="libccmio.a"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_cgal b/wmake/scripts/have_cgal
index ae6b9362cd6dc6bacb0c4b71c5f736a75e88fa37..f99d1ce7efbdeae454711dad3f196750893c7848 100644
--- a/wmake/scripts/have_cgal
+++ b/wmake/scripts/have_cgal
@@ -18,6 +18,7 @@
 #
 # Requires
 #     CGAL_ARCH_PATH
+# or  config.sh/CGAL (when CGAL_ARCH_PATH is empty)
 #
 # Functions provided
 #     have_cgal, no_cgal, echo_cgal, query_cgal
@@ -37,7 +38,6 @@
 no_cgal()
 {
     unset HAVE_CGAL CGAL_INC_DIR CGAL_LIB_DIR
-    return 0
 }
 
 
@@ -72,15 +72,27 @@ query_cgal()
 # -> HAVE_CGAL, CGAL_INC_DIR, CGAL_LIB_DIR
 have_cgal()
 {
-    local prefix header library incName libName settings warn
-    # warn="==> skip cgal"
+    local warn # warn="==> skip cgal"
+    local config="config.sh/CGAL"
+    local settings
 
-    # Setup - from the current environment
+    # Setup - current environment if set
+    if [ -z "$CGAL_ARCH_PATH" ]
+    then
+        if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
+        then
+            . "$settings"
+        else
+            [ -n "$warn" ] && echo "$warn (no $config settings)"
+            return 2
+        fi
+    fi
 
     # Expected location, include/library names
-    prefix="$CGAL_ARCH_PATH"
-    incName="CGAL/version.h"
-    libName="libCGAL"
+    local prefix="$CGAL_ARCH_PATH"
+    local incName="CGAL/version.h"
+    local libName="libCGAL"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_fftw b/wmake/scripts/have_fftw
index 17004910acb904fce5e6155c7389eaaed3a7888e..fd8d2aebf63a86f1eb48f61f235d6a36b80ad346 100644
--- a/wmake/scripts/have_fftw
+++ b/wmake/scripts/have_fftw
@@ -18,6 +18,7 @@
 #
 # Requires
 #     FFTW_ARCH_PATH
+# or  config.sh/FFTW (when FFTW_ARCH_PATH is empty)
 #
 # Functions provided
 #     have_fftw, no_fftw, echo_fftw, query_fftw
@@ -37,7 +38,6 @@
 no_fftw()
 {
     unset HAVE_FFTW FFTW_INC_DIR FFTW_LIB_DIR
-    return 0
 }
 
 
@@ -72,15 +72,27 @@ query_fftw()
 # -> HAVE_FFTW, FFTW_INC_DIR, FFTW_LIB_DIR
 have_fftw()
 {
-    local prefix header library incName libName settings warn
-    # warn="==> skip fftw"
+    local warn # warn="==> skip fftw"
+    local config="config.sh/FFTW"
+    local settings
 
-    # Setup - from the current environment
+    # Setup - current environment if set
+    if [ -z "$FFTW_ARCH_PATH" ]
+    then
+        if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
+        then
+            . "$settings"
+        else
+            [ -n "$warn" ] && echo "$warn (no $config settings)"
+            return 2
+        fi
+    fi
 
     # Expected location, include/library names
-    prefix="$FFTW_ARCH_PATH"
-    incName="fftw3.h"
-    libName="libfftw3"
+    local prefix="$FFTW_ARCH_PATH"
+    local incName="fftw3.h"
+    local libName="libfftw3"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_hypre b/wmake/scripts/have_hypre
index d09239ed149959291a4159069ba8ba7d2674ca62..b4256dd1e31e718c5a031a69790e7cd4adba3817 100644
--- a/wmake/scripts/have_hypre
+++ b/wmake/scripts/have_hypre
@@ -18,6 +18,7 @@
 #
 # Requires
 #     HYPRE_ARCH_PATH
+# or  config.sh/hypre
 #
 # Functions provided
 #     have_hypre, no_hypre, echo_hypre, query_hypre
@@ -37,7 +38,6 @@
 no_hypre()
 {
     unset HAVE_HYPRE HYPRE_INC_DIR HYPRE_LIB_DIR
-    return 0
 }
 
 
@@ -72,9 +72,9 @@ query_hypre()
 # -> HAVE_HYPRE, HYPRE_INC_DIR, HYPRE_LIB_DIR
 have_hypre()
 {
+    local warn="==> skip hypre"
     local config="config.sh/hypre"
-    local prefix header library incName libName settings warn
-    warn="==> skip hypre"
+    local settings
 
     # Setup - prefer current environment value? (TDB)
     if [ ! -d "$HYPRE_ARCH_PATH" ]
@@ -89,9 +89,10 @@ have_hypre()
     fi
 
     # Expected location, include/library names
-    prefix="$HYPRE_ARCH_PATH"
-    incName="HYPRE.h"
-    libName="libHYPRE"
+    local prefix="$HYPRE_ARCH_PATH"
+    local incName="HYPRE.h"
+    local libName="libHYPRE"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_kahip b/wmake/scripts/have_kahip
index 336a3d69c7df4539043254b3553722d2ad5d353d..78c6bc03ac3ecdaeb2190f275bfed91c0d4e9ab3 100644
--- a/wmake/scripts/have_kahip
+++ b/wmake/scripts/have_kahip
@@ -38,7 +38,6 @@ no_kahip()
 {
     unset HAVE_KAHIP KAHIP_ARCH_PATH KAHIP_INC_DIR KAHIP_LIB_DIR
     unset KAHIP_VERSION
-    return 0
 }
 
 
@@ -73,9 +72,9 @@ query_kahip()
 # -> HAVE_KAHIP, KAHIP_ARCH_PATH, KAHIP_INC_DIR, KAHIP_LIB_DIR
 have_kahip()
 {
+    local warn="==> skip kahip"
     local config="config.sh/kahip"
-    local prefix header library incName libName settings warn
-    warn="==> skip kahip"
+    local settings
 
     if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
     then
@@ -86,9 +85,10 @@ have_kahip()
     fi
 
     # Expected location, include/library names
-    prefix="$KAHIP_ARCH_PATH"
-    incName="kaHIP_interface.h"
-    libName="libkahip"
+    local prefix="$KAHIP_ARCH_PATH"
+    local incName="kaHIP_interface.h"
+    local libName="libkahip"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_metis b/wmake/scripts/have_metis
index 8fe54d3ad94553fb66b592658b2e7d32b22d2c66..e251281a6deb31a3717a7f370ecec14725e11fc6 100644
--- a/wmake/scripts/have_metis
+++ b/wmake/scripts/have_metis
@@ -38,7 +38,6 @@ no_metis()
 {
     unset HAVE_METIS METIS_ARCH_PATH METIS_INC_DIR METIS_LIB_DIR
     unset METIS_VERSION
-    return 0
 }
 
 
@@ -73,9 +72,9 @@ query_metis()
 # -> HAVE_METIS, METIS_ARCH_PATH, METIS_INC_DIR, METIS_LIB_DIR
 have_metis()
 {
+    local warn="==> skip metis"
     local config="config.sh/metis"
-    local prefix header library incName libName settings warn
-    warn="==> skip metis"
+    local settings
 
     if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
     then
@@ -86,9 +85,10 @@ have_metis()
     fi
 
     # Expected location, include/library names
-    prefix="$METIS_ARCH_PATH"
-    incName="metis.h"
-    libName="libmetis"
+    local prefix="$METIS_ARCH_PATH"
+    local incName="metis.h"
+    local libName="libmetis"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_mgridgen b/wmake/scripts/have_mgridgen
index 50e71f3851666b0a718240b4ab423b0f58292b48..84be5ce520601dfb0218d41c1d06dd61add81b00 100644
--- a/wmake/scripts/have_mgridgen
+++ b/wmake/scripts/have_mgridgen
@@ -38,7 +38,6 @@ no_mgridgen()
 {
     unset HAVE_MGRIDGEN MGRIDGEN_ARCH_PATH MGRIDGEN_INC_DIR MGRIDGEN_LIB_DIR
     unset MGRIDGEN_VERSION
-    return 0
 }
 
 
@@ -73,9 +72,9 @@ query_mgridgen()
 # -> HAVE_MGRIDGEN, MGRIDGEN_ARCH_PATH, MGRIDGEN_INC_DIR, MGRIDGEN_LIB_DIR
 have_mgridgen()
 {
+    local warn="==> skip mgridgen"
     local config="config.sh/mgridgen"
-    local prefix header library incName libName libName2 settings warn
-    warn="==> skip mgridgen"
+    local settings
 
     if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
     then
@@ -86,10 +85,11 @@ have_mgridgen()
     fi
 
     # Expected location, include/library names
-    prefix="$MGRIDGEN_ARCH_PATH"
-    incName="mgridgen.h"
-    libName="libMGridGen"
-    libName2="libmgrid"
+    local prefix="$MGRIDGEN_ARCH_PATH"
+    local incName="mgridgen.h"
+    local libName="libMGridGen"
+    local libName2="libmgrid"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
@@ -126,7 +126,7 @@ have_mgridgen()
 
     # ----------------------------------
 
-    local good label scalar
+    local label scalar
 
     # Ensure consistent sizes with OpenFOAM and mgridgen header
     # Extract typedef for idxtype, realtype
@@ -142,7 +142,6 @@ have_mgridgen()
 
     case "$WM_LABEL_SIZE:$label" in
     (32:int32_t | 32:int | 64:int64_t | 64:long)
-        good=true
         ;;
 
     (*)
@@ -156,7 +155,6 @@ have_mgridgen()
     esac
     case "$WM_PRECISION_OPTION:$scalar" in
     (SP:float | SPDP:float | DP:double)
-        good=true
         ;;
 
     (*)
diff --git a/wmake/scripts/have_petsc b/wmake/scripts/have_petsc
index 7726a4ded4033155848a9ed2b534d0579c3ccbd5..4e9413c39515c5c9a45b0c78a5a8499432db2412 100644
--- a/wmake/scripts/have_petsc
+++ b/wmake/scripts/have_petsc
@@ -18,6 +18,7 @@
 #
 # Requires
 #     PETSC_ARCH_PATH
+# or  config.sh/petsc
 #
 # Functions provided
 #     have_petsc, no_petsc, echo_petsc, hint_petsc, query_petsc
@@ -37,7 +38,6 @@
 no_petsc()
 {
     unset HAVE_PETSC PETSC_INC_DIR PETSC_LIB_DIR
-    return 0
 }
 
 
@@ -88,9 +88,9 @@ query_petsc()
 # -> HAVE_PETSC, PETSC_INC_DIR, PETSC_LIB_DIR
 have_petsc()
 {
+    local warn="==> skip petsc"
     local config="config.sh/petsc"
-    local prefix header library incName libName pkgName settings warn
-    warn="==> skip petsc"
+    local settings
 
     # Setup - prefer current environment value? (TDB)
     if [ ! -d "$PETSC_ARCH_PATH" ]
@@ -105,10 +105,11 @@ have_petsc()
     fi
 
     # Expected location, include/library names
-    prefix="$PETSC_ARCH_PATH"
-    incName="petsc.h"
-    libName="libpetsc"
-    pkgName="PETSc"
+    local prefix="$PETSC_ARCH_PATH"
+    local incName="petsc.h"
+    local libName="libpetsc"
+    local pkgName="PETSc"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_readline b/wmake/scripts/have_readline
index 5f32a08cedba2a28a5e83b8e3316aaad1fdf386d..51d264155fa7abcc344381f0b4ec16267f35c5c6 100644
--- a/wmake/scripts/have_readline
+++ b/wmake/scripts/have_readline
@@ -36,7 +36,6 @@
 no_readline()
 {
     unset HAVE_LIBREADLINE READLINE_INC_DIR READLINE_LIB_DIR
-    return 0
 }
 
 
@@ -53,13 +52,14 @@ echo_readline()
 # -> HAVE_LIBREADLINE, READLINE_INC_DIR, READLINE_LIB_DIR
 have_readline()
 {
-    local prefix header library incName libName settings warn
-    # warn="==> skip readline"
+    local warn # warn="==> skip readline"
+    local settings
 
     # Expected location, include/library names
-    prefix=system
-    incName="readline/readline.h"
-    libName="libreadline"
+    local prefix=system
+    local incName="readline/readline.h"
+    local libName="libreadline"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/have_scotch b/wmake/scripts/have_scotch
index 87466b382d08edab4917b435ddf324dc13eefe9d..3dd2fa4308712776c2318156486d068b4e856d43 100644
--- a/wmake/scripts/have_scotch
+++ b/wmake/scripts/have_scotch
@@ -39,7 +39,6 @@ no_scotch()
     unset HAVE_SCOTCH SCOTCH_ARCH_PATH SCOTCH_INC_DIR SCOTCH_LIB_DIR
     unset SCOTCH_VERSION
     unset HAVE_PTSCOTCH PTSCOTCH_ARCH_PATH PTSCOTCH_INC_DIR PTSCOTCH_LIB_DIR
-    return 0
 }
 
 
@@ -79,9 +78,9 @@ query_scotch()
 # -> HAVE_SCOTCH, SCOTCH_ARCH_PATH, SCOTCH_INC_DIR, SCOTCH_LIB_DIR
 have_scotch()
 {
+    local warn="==> skip scotch"
     local config="config.sh/scotch"
-    local prefix header library incName libName settings warn
-    warn="==> skip scotch"
+    local settings
 
     if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
     then
@@ -92,9 +91,11 @@ have_scotch()
     fi
 
     # Expected location, include/library names
-    prefix="$SCOTCH_ARCH_PATH"
-    incName="scotch.h"
-    libName="libscotch"
+    local prefix="$SCOTCH_ARCH_PATH"
+    local incName="scotch.h"
+    local libName="libscotch"
+    local localDir="scotch-int$WM_LABEL_SIZE"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
@@ -103,13 +104,18 @@ have_scotch()
         return 1
     elif hasAbsdir "$prefix"
     then
-        header=$(findFirstFile "$prefix/include/$incName")
+        header=$(findFirstFile \
+            "$prefix/include/$localDir/$incName" \
+            "$prefix/include/$incName" \
+        )
         library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
         header=$(findFirstFile \
+            "/usr/local/include/$localDir/$incName" \
             "/usr/local/include/scotch/$incName" \
             "/usr/local/include/$incName" \
+            "/usr/include/$localDir/$incName" \
             "/usr/include/scotch/$incName" \
             "/usr/include/$incName" \
         )
@@ -118,6 +124,7 @@ have_scotch()
         unset prefix
     fi
     # ----------------------------------
+    equalBaseName "${header%/*}" "$localDir" || unset localDir
 
     # Header
     [ -n "$header" ] || {
@@ -127,7 +134,7 @@ have_scotch()
 
     # Library
     [ -n "$library" ] \
-    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName" -local="$localDir") \
     || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
@@ -135,7 +142,7 @@ have_scotch()
 
     # ----------------------------------
 
-    local good label
+    local label
 
     # Ensure consistent sizes between OpenFOAM and scotch header
     # extract 'typedef int64_t SCOTCH_Num' or equivalent
@@ -163,7 +170,6 @@ have_scotch()
 
     case "$WM_LABEL_SIZE:$label" in
     (32:int32_t | 32:int | 64:int64_t | 64:long)
-        good=true
         ;;
 
     (*)
@@ -192,8 +198,7 @@ have_scotch()
 # -> HAVE_PTSCOTCH, PTSCOTCH_ARCH_PATH, PTSCOTCH_INC_DIR, PTSCOTCH_LIB_DIR
 have_ptscotch()
 {
-    local prefix header library incName libName settings warn
-    warn="==> skip ptscotch"
+    local warn="==> skip ptscotch"
 
     if [ "$HAVE_SCOTCH" != true ]
     then
@@ -205,9 +210,11 @@ have_ptscotch()
     [ -n "$PTSCOTCH_ARCH_PATH" ] || PTSCOTCH_ARCH_PATH="$SCOTCH_ARCH_PATH"
 
     # Expected location, include/library names
-    prefix="$PTSCOTCH_ARCH_PATH"
-    incName="ptscotch.h"
-    libName="libptscotch"
+    local prefix="$PTSCOTCH_ARCH_PATH"
+    local incName="ptscotch.h"
+    local libName="libptscotch"
+    local localDir="scotch-int$WM_LABEL_SIZE"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
@@ -218,25 +225,27 @@ have_ptscotch()
     then
         header=$(findFirstFile  \
             "$prefix/include/$FOAM_MPI/$incName" \
+            "$prefix/include/$localDir/$incName" \
             "$prefix/include/$incName"
         )
         library="$(findExtLib $FOAM_MPI/$libName $libName)"
     elif isSystem "$prefix"
     then
-        prefix=/usr
         header=$(findFirstFile \
             "/usr/local/include/ptscotch/$incName" \
             "/usr/local/include/scotch/$incName" \
             "/usr/local/include/$incName" \
+            "/usr/include/$localDir/$incName" \
             "/usr/include/ptscotch/$incName" \
             "/usr/include/scotch/$incName" \
             "/usr/include/$incName" \
         )
-        case "$header" in (/usr/local/*) prefix=/usr/local ;; esac
+        prefix=$(sysPrefix "$header")
     else
         unset prefix
     fi
     # ----------------------------------
+    equalBaseName "${header%/*}" "$localDir" || unset localDir
 
     # Header
     [ -n "$header" ] || {
@@ -246,7 +255,7 @@ have_ptscotch()
 
     # Library
     [ -n "$library" ] \
-    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName" -local="$localDir") \
     || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
diff --git a/wmake/scripts/have_zoltan b/wmake/scripts/have_zoltan
index 5ef4073797777de06036ee015dd4bdfc07584676..bf43ca58522578f5baca855f4973a164017bd8fd 100644
--- a/wmake/scripts/have_zoltan
+++ b/wmake/scripts/have_zoltan
@@ -37,7 +37,6 @@
 no_zoltan()
 {
     unset HAVE_ZOLTAN ZOLTAN_INC_DIR ZOLTAN_LIB_DIR
-    return 0
 }
 
 
@@ -72,9 +71,9 @@ query_zoltan()
 # -> HAVE_ZOLTAN, ZOLTAN_INC_DIR, ZOLTAN_LIB_DIR
 have_zoltan()
 {
+    local warn # warn="==> skip zoltan"
     local config="config.sh/zoltan"
-    local prefix header library incName libName settings warn
-    # warn="==> skip zoltan"
+    local settings
 
     if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
     then
@@ -85,9 +84,10 @@ have_zoltan()
     fi
 
     # Expected location, include/library names
-    prefix="$ZOLTAN_ARCH_PATH"
-    incName="zoltan.h"
-    libName="libzoltan"
+    local prefix="$ZOLTAN_ARCH_PATH"
+    local incName="zoltan.h"
+    local libName="libzoltan"
+    local header library
 
     # ----------------------------------
     if isNone "$prefix"
diff --git a/wmake/scripts/paraviewFunctions b/wmake/scripts/paraviewFunctions
index 2aac0d65a2b152d61dc772747da4a2ea43d62a85..5a4ea1dec773c52d8ee3d9f1b2d318c2d88a921a 100644
--- a/wmake/scripts/paraviewFunctions
+++ b/wmake/scripts/paraviewFunctions
@@ -46,7 +46,6 @@ no_paraview()
 {
     unset HAVE_PVPLUGIN_SUPPORT FOAM_PV_PLUGIN_LIBBIN
     unset PARAVIEW_API PARAVIEW_INC_DIR
-    return 0
 }
 
 
@@ -92,7 +91,7 @@ cmakePvInstall()
 wmakeLibPv()
 {
     local depend="ParaView_DIR=$ParaView_DIR"
-    local sentinel
+    local sentinel libName
 
     for libName
     do
@@ -147,8 +146,8 @@ get_pvplugin_api()
 #
 have_pvplugin_support()
 {
-    local header warn pv_api installDir binDir includeDir targetDir
-    warn="==> skip paraview-plugin"
+    local warn="==> skip paraview-plugin"
+    local settings pv_api installDir binDir includeDir targetDir
 
     # Trivial check
     command -v cmake >/dev/null || {
@@ -171,7 +170,7 @@ have_pvplugin_support()
     fi
 
     # Include/library names
-    header="pqServerManagerModel.h"
+    local header="pqServerManagerModel.h"
 
     if [ -n "$ParaView_DIR" ]
     then
diff --git a/wmake/scripts/sysFunctions b/wmake/scripts/sysFunctions
index c5ce94cd227165e8bebc2663e128ebcda7edf368..2330bf6f59f81f8f7ac3db208d8c60f15e04df0a 100644
--- a/wmake/scripts/sysFunctions
+++ b/wmake/scripts/sysFunctions
@@ -39,7 +39,7 @@ then
     # Load once, but do not rely on this variable elsewhere
     WMAKE_SCRIPTS_SYSFUNCTIONS=loaded
 
-    # Handle Debian multi-arch, ignore missing/bad dpkg-architecture.
+    # Debian multi-arch, ignore missing/bad dpkg-architecture.
     if [ -z "$DEB_TARGET_MULTIARCH" ]
     then
         DEB_TARGET_MULTIARCH=$(dpkg-architecture -qDEB_TARGET_MULTIARCH 2>/dev/null || true)
@@ -100,6 +100,15 @@ then
     }
 
 
+    # True if '$1' and '$2' have the same directory basename
+    # Eg,
+    #    equalBaseName "/usr/include/scotch-int32" "scotch-int32"
+    equalBaseName()
+    {
+        test "${1##*/}" = "${2##*/}"
+    }
+
+
     # Simple output for -query
     # $1 = software
     # $2 = setting
@@ -189,15 +198,15 @@ then
     # This function has two modes of operation.
     #
     # 1) Automated search.
-    #    Specify -prefix=dirName -name=libName and search for
-    #    (lib, lib64, lib/x86_64..) etc.
+    #    Specify -prefix=dirName -name=libName, optionally -local=subdirName
+    #    and search for (lib, lib64, lib/x86_64..) etc.
     #
     # 2) Directed search.
     #    specify the fully qualified names to search on the parameter list
     #
     findLibrary()
     {
-        local prefixDir searchDir searchName
+        local prefixDir localDir searchDir searchName
         local file ext
 
         searchDir=true
@@ -210,6 +219,12 @@ then
                 shift
                 ;;
 
+            -local=*)
+                # Prefix with directory separator
+                localDir="/${1#*=}"
+                shift
+                ;;
+
             -name=*)
                 searchName="${1#*=}"
                 shift
@@ -223,18 +238,30 @@ then
 
         if [ -n "$searchName" ]
         then
-            # Automated search
-            # Eg, lib/ lib64/, lib/x86_64-linux-gnu
+            # Automated search (eg, lib/ lib64/, lib/x86_64-linux-gnu)
+            # but also handle possible local versions (eg, lib/scotch-int32)
 
             : "${prefixDir:=/usr}"  # A reasonable default
             [ -d "$prefixDir" ] || return 2
 
-            for searchDir in \
-                lib \
-                "${WM_COMPILER_LIB_ARCH:+lib}$WM_COMPILER_LIB_ARCH" \
-                "${DEB_TARGET_MULTIARCH:+lib/}${DEB_TARGET_MULTIARCH}" \
+            # Local and regular search paths
+            set -- \
+                "lib${localDir}" \
+                "${WM_COMPILER_LIB_ARCH:+lib${WM_COMPILER_LIB_ARCH}${localDir}}" \
+                "${DEB_TARGET_MULTIARCH:+lib/${DEB_TARGET_MULTIARCH}${localDir}}" \
+                "lib" \
+                "${WM_COMPILER_LIB_ARCH:+lib${WM_COMPILER_LIB_ARCH}}" \
+                "${DEB_TARGET_MULTIARCH:+lib/${DEB_TARGET_MULTIARCH}}" \
                 ;
+
+            # Ignore empty local search path ("/")
+            [ "${#localDir}" -gt 1 ] || shift 3
+
+            ## echo "search: $# $@" 1>&2
+
+            for searchDir in "$@"
             do
+                [ -n "$searchDir" ] || continue
                 for ext in '' $extLibraries
                 do
                     file="$prefixDir/$searchDir/$searchName$ext"