diff --git a/bin/foamEtcFile b/bin/foamEtcFile
index 544ca7b543a79826c5ddf87dd75323f4e1167a29..fc8cc57bf5385104ed72ae76ab231be15695ed06 100755
--- a/bin/foamEtcFile
+++ b/bin/foamEtcFile
@@ -32,7 +32,13 @@
 #     \endcode
 #
 # Environment
-#     - WM_PROJECT_SITE         (unset defaults to PROJECT/site)
+#     FOAM_CONFIG_ETC
+#         Alternative etc directory for shipped files
+#
+#     FOAM_CONFIG_MODE
+#         Fallback search mode for etc files. Unset is the same as "ugo".
+#
+#     WM_PROJECT_SITE         (unset defaults to PROJECT/site)
 #
 # Note
 #     This script must exist in the project 'bin' directory
@@ -45,8 +51,8 @@
 printHelp() {
     cat<<USAGE
 
-Usage: foamEtcFile [OPTION] fileName [-- args]
-       foamEtcFile [OPTION] [-list|-list-test] [fileName]
+Usage: ${0##*/} [OPTION] fileName [-- args]
+       ${0##*/} [OPTION] [-list|-list-test] [fileName]
 
 options:
   -all (-a)         Return all files (otherwise stop after the first match)
@@ -105,6 +111,20 @@ projectDir="$(\cd $(dirname $binDir) && \pwd -L)"   # Project dir
 
 userDir="$HOME/.OpenFOAM"                           # As per foamVersion.H
 groupDir="${WM_PROJECT_SITE:-$projectDir/site}"     # As per foamVersion.H
+optMode=ugo                                         # Default search = 'ugo'
+
+# Environment overrides
+case "$FOAM_CONFIG_MODE" in ([ugo]*) optMode="$FOAM_CONFIG_MODE" ;; esac
+
+# Verify validity of FOAM_CONFIG_ETC
+if [ -n "$FOAM_CONFIG_ETC" ]
+then
+    if [ ! -d "$FOAM_CONFIG_ETC" ] || [ "$FOAM_CONFIG_ETC" = "$projectDir/etc" ]
+    then
+        # Bad directory or redundant value
+        unset FOAM_CONFIG_ETC
+    fi
+fi
 
 #-------------------------------------------------------------------------------
 
@@ -125,7 +145,6 @@ getApiInfo()
 
 
 #-------------------------------------------------------------------------------
-optMode=ugo         # Default mode is always 'ugo'
 unset shellOutput verboseOutput
 unset optAll optConfig optList projectApi
 
@@ -168,7 +187,7 @@ do
     -config)
         optConfig=true
         ;;
-    -mode=[ugoa]*)
+    -mode=[ugo]*)
         optMode="${1#*=}"
         ;;
     -m | -mode)
@@ -176,7 +195,7 @@ do
         shift
         # Sanity check. Handles missing argument too.
         case "$optMode" in
-        ([ugoa]*)
+        ([ugo]*)
             ;;
         (*)
             die "invalid mode '$optMode'"
@@ -219,7 +238,6 @@ done
 # Establish the API value
 [ -n "$projectApi" ] || projectApi=$(getApiInfo api)
 
-
 # Split arguments into filename (for searching) and trailing bits for shell eval
 # Silently remove leading ~OpenFOAM/ (as per Foam::findEtcFile)
 nArgs=$#
@@ -253,23 +271,23 @@ fi
 
 # Define the various places to be searched:
 unset dirList
-case "$optMode" in (*[au]*) # (A)ll or (U)ser
+case "$optMode" in (*[u]*) # (U)ser
     dirList="$dirList $userDir/$projectApi $userDir"
     ;;
 esac
 
-case "$optMode" in (*[ag]*) # (A)ll or (G)roup == site
+case "$optMode" in (*[g]*) # (G)roup == site
     dirList="$dirList $groupDir/$projectApi/etc $groupDir/etc"
     ;;
 esac
 
-case "$optMode" in (*[ao]*) # (A)ll or (O)ther == shipped
-    dirList="$dirList $projectDir/etc"
+case "$optMode" in (*[o]*) # (O)ther == shipped
+    dirList="$dirList $FOAM_CONFIG_ETC $projectDir/etc"
     ;;
 esac
 set -- $dirList
 
-[ "$#" -ge 1 ] || die "No directories to scan. Programming error?"
+[ "$#" -ge 1 ] || die "No directories to scan. Programming or user error?"
 exitCode=2  # Fallback is a FileNotFound error
 
 
@@ -278,7 +296,7 @@ exitCode=2  # Fallback is a FileNotFound error
 #
 
 # Special handling of config.sh/ , config.csh/ directories
-if [ -n "$optConfig" -a -n "$shellOutput" -a -n "$fileName" ]
+if [ -n "$optConfig" ] && [ -n "$shellOutput" ] && [ -n "$fileName" ]
 then
     case "$shellOutput" in
     csh*)
diff --git a/bin/foamGetDict b/bin/foamGetDict
index ebe5f304d95c0ea748559ecdd377a07096cce9c6..1809013ae9f2c368345d3bef717a5a0978aac6aa 100755
--- a/bin/foamGetDict
+++ b/bin/foamGetDict
@@ -33,7 +33,7 @@
 #     or {user,site} locations and copy it into the case directory.
 #
 # Environment
-#     FOAM_API
+#     FOAM_CONFIG_ETC
 #     WM_PROJECT_DIR
 #     WM_PROJECT_SITE
 #
@@ -81,9 +81,7 @@ die()
 
 #-------------------------------------------------------------------------------
 projectDir="$WM_PROJECT_DIR"                        # Project dir
-userDir="$HOME/.OpenFOAM"                           # As per foamVersion.H
-groupDir="${WM_PROJECT_SITE:-$projectDir/site}"     # As per foamVersion.H
-projectApi="$FOAM_API"
+unset projectApi
 
 #-------------------------------------------------------------------------------
 
@@ -163,20 +161,12 @@ then
 fi
 
 
-# No api specified -with-api= or from environment (FOAM_API)
-if [ -z "$projectApi" ]
-then
-    projectApi="$("$projectDir"/bin/foamEtcFile -show-api 2>/dev/null)"
-fi
-
-
-# Define the various places to be searched.
-# Similar to foamEtcFile, but with etc/caseDicts/ for the projectDir
-# Filter out nonexistent directories later
+# The places to be searched.
+# Like foamEtcFile, but "etc/caseDicts/" for the projectDir
 
-searchDirs="${projectApi:+$userDir/$projectApi} $userDir \
-${projectApi:+$groupDir/$projectApi/etc} $groupDir/etc \
-$projectDir/etc/caseDicts";
+searchDirs="\
+$("$projectDir"/bin/foamEtcFile -list-test -mode=ug ${projectApi:+-with-api=$projectApi} 2>/dev/null) \
+$("$projectDir"/bin/foamEtcFile -list -mode=o caseDicts 2>/dev/null)";
 
 ## echo "Using <$searchDirs>" 1>&2
 
diff --git a/bin/foamLog b/bin/foamLog
index fa35d383bcfe6da027985b313003d3e8f8611dc8..25908fee22ac20fc5460481cd15e969c9273560a 100755
--- a/bin/foamLog
+++ b/bin/foamLog
@@ -7,6 +7,7 @@
 #    \\/     M anipulation  |
 #-------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
+#     Copyright (C) 2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -38,8 +39,6 @@
 #------------------------------------------------------------------------------
 Script="${0##*/}"
 toolsDir="${0%/*}/tools"
-groupDir="${WM_PROJECT_SITE:-${WM_PROJECT_DIR:-<unknown>}/site}"
-userDir="$HOME/.OpenFOAM"
 
 usage() {
     exec 1>&2
@@ -91,13 +90,9 @@ cat <<HELP
     The value taken will be the first (non-space)word after this column.
 
     The database ($Script.db) will taken from these locations:
-        .
-        $userDir/$FOAM_API/
-        $userDir/
-        $groupDir/$FOAM_API/etc/
-        $groupDir/etc/
-        $WM_PROJECT_DIR/etc/
-        $toolsDir
+      ./
+$(foamEtcFile -list | sed -e 's#^#      #')
+      $toolsDir
 
     option -quiet : suppresses the default information and only prints the
     extracted variables.
diff --git a/bin/foamNewApp b/bin/foamNewApp
index 756724fc5800a6d9d77d73371288c50cd3c12fee..9590a55199048c0d04c6f02ee0fabd69c0f79268 100755
--- a/bin/foamNewApp
+++ b/bin/foamNewApp
@@ -7,6 +7,7 @@
 #    \\/     M anipulation  |
 #-------------------------------------------------------------------------------
 #     Copyright (C) 2015-2017 OpenFOAM Foundation
+#     Copyright (C) 2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -32,7 +33,7 @@
 #
 #------------------------------------------------------------------------------
 Script=${0##*/}
-DIR="$FOAM_ETC/codeTemplates/app"
+DIR="$WM_PROJECT_DIR/etc/codeTemplates/app"
 
 usage() {
     while [ "$#" -ge 1 ]; do echo "$1"; shift; done
diff --git a/bin/foamNewBC b/bin/foamNewBC
index 496f13ba049be049fe2e9124eb0818fc7170414e..5b5384a9cb6f910b3f25047eec74c3d5bca7e3ec 100755
--- a/bin/foamNewBC
+++ b/bin/foamNewBC
@@ -7,6 +7,7 @@
 #    \\/     M anipulation  |
 #-------------------------------------------------------------------------------
 #     Copyright (C) 2015-2017 OpenFOAM Foundation
+#     Copyright (C) 2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -32,7 +33,7 @@
 #
 #------------------------------------------------------------------------------
 Script=${0##*/}
-DIR="$FOAM_ETC/codeTemplates/BC"
+DIR="$WM_PROJECT_DIR/etc/codeTemplates/BC"
 
 usage() {
     while [ "$#" -ge 1 ]; do echo "$1"; shift; done
diff --git a/bin/foamNewFunctionObject b/bin/foamNewFunctionObject
index 19feaf4a956e606a04da8d127404a3d6993f39aa..50763f8f66321727c80a80dca20e11f8b7e867e5 100755
--- a/bin/foamNewFunctionObject
+++ b/bin/foamNewFunctionObject
@@ -7,6 +7,7 @@
 #    \\/     M anipulation  |
 #-------------------------------------------------------------------------------
 #     Copyright (C) 2016-2017 OpenFOAM Foundation
+#     Copyright (C) 2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -33,7 +34,7 @@
 #
 #------------------------------------------------------------------------------
 Script=${0##*/}
-DIR="$FOAM_ETC/codeTemplates/functionObject"
+DIR="$WM_PROJECT_DIR/etc/codeTemplates/functionObject"
 
 usage() {
     while [ "$#" -ge 1 ]; do echo "$1"; shift; done
diff --git a/bin/tools/foamConfigurePaths b/bin/tools/foamConfigurePaths
index b267a235e266d3a9c4cf1e8cd7360e326c9c3542..f2d400ab2ff2df0fa0eb8edd21a0ee23debd4dda 100755
--- a/bin/tools/foamConfigurePaths
+++ b/bin/tools/foamConfigurePaths
@@ -19,15 +19,22 @@
 #     Adjust hardcoded installation versions and paths
 #     in etc/{bashrc,cshrc} and etc/config.{sh,csh}/
 #
+# Requires
+#     - sed
+#     - bin/foamEtcFile
+#
+# Environment
+#     FOAM_CONFIG_ETC
+#         Alternative etc directory for shipped files
+#
 #------------------------------------------------------------------------------
-usage() {
-    exec 1>&2
-    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
+printHelp() {
     cat<<USAGE
 
-usage: ${0##*/} options
+usage: $0 options
 
 Basic
+  -etc=DIR            set FOAM_CONFIG_ETC for alternative project files
   -project-path DIR   specify 'WM_PROJECT_DIR' (eg, /opt/openfoam1806-patch1)
   -version VER        specify project version (eg, v1806)
   -sp | -SP | -float32 single precision (WM_PRECISION_OPTION)
@@ -36,13 +43,13 @@ Basic
   -int32 | -int64     the 'WM_LABEL_SIZE'
 
 Compiler
-  -system NAME        specify 'system' compiler to use (eg, Gcc, Icc,...)
-  -third  NAME        specify 'ThirdParty' compiler to use (eg, Clang40,...)
-  -gcc VER            specify 'default_gcc_version' for ThirdParty Gcc
-  -clang VER          specify 'default_clang_version' for ThirdParty Clang
-  gmp-VERSION         for ThirdParty gcc (gmp-system for system library)
-  mpfr-VERSION        for ThirdParty gcc (mpfr-system for system library)
-  mpc-VERSION         for ThirdParty gcc (mpc-system for system library)
+  -system-compiler NAME The 'system' compiler to use (eg, Gcc, Clang, Icc,...)
+  -third-compiler NAME  The 'ThirdParty' compiler to use (eg, Clang40,...)
+  -gcc VER            The 'default_gcc_version' for ThirdParty Gcc
+  -clang VER          The 'default_clang_version' for ThirdParty Clang
+  gmp-VERSION         For ThirdParty gcc (gmp-system for system library)
+  mpfr-VERSION        For ThirdParty gcc (mpfr-system for system library)
+  mpc-VERSION         For ThirdParty gcc (mpc-system for system library)
 
 MPI
   -mpi NAME           specify 'WM_MPLIB' type (eg, INTELMPI, etc)
@@ -50,22 +57,24 @@ MPI
   -openmpi-system     use system openmpi
   -openmpi-third      use ThirdParty openmpi (using default version)
 
-Components
+ThirdParty versions
   -adios VER          specify 'adios2_version'
-  -adios-path DIR     specify 'ADIOS2_ARCH_PATH'
   -boost VER          specify 'boost_version'
-  -boost-path DIR     specify 'BOOST_ARCH_PATH'
   -cgal ver           specify 'cgal_version'
-  -cgal-path DIR      specify 'CGAL_ARCH_PATH'
   -cmake VER          specify 'cmake_version'
   -fftw VER           specify 'fffw_version'
-  -fftw-path DIR      specify 'FFTW_ARCH_PATH'
   -kahip VER          specify 'KAHIP_VERSION'
-  -kahip-path DIR     specify 'KAHIP_ARCH_PATH'
   -metis ver          specify 'METIS_VERSION'
-  -metis-path DIR     specify 'METIS_ARCH_PATH'
   -scotch VER         specify 'SCOTCH_VERSION' (eg, scotch_6.0.4)
-  -scotch-path DIR    specify 'SCOTCH_ARCH_PATH' (eg, /opt/scotch_6.0.4)
+
+Components specified by absolute path
+  -adios-path DIR     Path for 'ADIOS2_ARCH_PATH' (overrides -adios)
+  -boost-path DIR     Path for 'BOOST_ARCH_PATH'  (overrides -boost)
+  -cgal-path DIR      Path for 'CGAL_ARCH_PATH'   (overrides -cgal)
+  -fftw-path DIR      Path for 'FFTW_ARCH_PATH'   (overrides -fftw)
+  -kahip-path DIR     Path for 'KAHIP_ARCH_PATH'  (overrides -kahip)
+  -metis-path DIR     Path for 'METIS_ARCH_PATH'  (overrides -metis)
+  -scotch-path DIR    Path for 'SCOTCH_ARCH_PATH' (overrides -scotch)
 
 Graphics
   -paraview VER       specify 'ParaView_VERSION' (eg, 5.4.1 or system)
@@ -92,11 +101,14 @@ Equivalent options:
   -paraview-path        --paraviewInstall | -paraviewInstall
   -scotch               --scotchVersion | -scotchVersion
   -scotch-path          --scotchArchPath | -scotchArchPath
+  -system-compiler      -system
+  -third-compiler       -third
 
 USAGE
-    exit 1
+    exit 0 # clean exit
 }
 
+
 # Report error and exit
 die()
 {
@@ -105,7 +117,7 @@ die()
     echo "Error encountered:"
     while [ "$#" -ge 1 ]; do echo "    $1"; shift; done
     echo
-    echo "See '${0##*/} -help' for usage"
+    echo "See '$0 -help' for usage"
     echo
     exit 1
 }
@@ -113,8 +125,23 @@ die()
 # -----------------------------------------------------------------------------
 
 # Check that it appears to be an OpenFOAM installation
-[ -f etc/bashrc -a -d etc/config.sh ] || \
-    usage "Please run from top-level directory of installation"
+if [ -f etc/bashrc ] && [ -d "META-INFO" ]
+then
+    echo "Configuring OpenFOAM" 1>&2
+else
+    die "Please run from the OpenFOAM top-level installation directory" \
+        "No etc/bashrc or META-INFO/ found"
+fi
+
+# Use foamEtcFile to locate files, but only edit shipped files
+if [ -x bin/foamEtcFile ]
+then
+    _foamEtc() {
+        ./bin/foamEtcFile -mode=o "$@"
+    }
+else
+    die "No bin/foamEtcFile found in installation"
+fi
 
 
 # Check if argument matches the expected input. Respects case.
@@ -211,6 +238,28 @@ replaceCsh()
     done
 }
 
+# Locate file with foamEtcFile -mode=o and forward to replace()
+replaceEtc()
+{
+    local file="$1"
+    shift
+
+    file=$(_foamEtc "$file")
+    replace $file "$@"
+}
+
+
+# Locate file with foamEtcFile -mode=o and forward to replaceCsh()
+replaceEtcCsh()
+{
+    local file="$1"
+    shift
+
+    file=$(_foamEtc "$file")
+    replaceCsh $file "$@"
+}
+
+
 # Get the option's value (argument), or die on missing or empty argument
 # $1 option
 # $2 value
@@ -275,22 +324,55 @@ while [ "$#" -gt 0 ]
 do
     case "$1" in
     -h | -help* | --help*)
-        usage
+        printHelp
         ;;
     '')
         # Discard empty arguments
         ;;
 
+    -debug-list)
+        # Undocumented (experimental)
+        # TDB: List files that can be edited by this script
+        cat << CONFIG_SH
+etc/bashrc
+etc/config.sh/adios2
+etc/config.sh/compiler
+etc/config.sh/paraview
+etc/config.sh/vtk
+etc/config.sh/CGAL
+etc/config.sh/FFTW
+etc/config.sh/metis
+etc/config.sh/kahip
+etc/config.sh/scotch
+CONFIG_SH
+
+        cat << CONFIG_CSH
+etc/cshrc
+etc/config.csh/adios2
+etc/config.csh/compiler
+etc/config.csh/paraview
+etc/config.csh/vtk
+etc/config.csh/CGAL
+etc/config.csh/FFTW
+CONFIG_CSH
+        exit 0
+        ;;
+
 ## Basic ##
 
+   -etc=*)
+        # Define FOAM_CONFIG_ETC for finding files
+        export FOAM_CONFIG_ETC="${1#*=}"
+        ;;
+
    -project-path)
         # Replace WM_PROJECT_DIR=...
         optionValue=$(getOptionValue "$@")
-        replace    etc/bashrc  WM_PROJECT_DIR "\"$optionValue\""
-        replaceCsh etc/cshrc   WM_PROJECT_DIR "\"$optionValue\""
+        replaceEtc     bashrc  WM_PROJECT_DIR "\"$optionValue\""
+        replaceEtcCsh  cshrc   WM_PROJECT_DIR "\"$optionValue\""
 
-        removeBashMagic etc/bashrc
-        removeCshMagic  etc/cshrc
+        removeBashMagic $(_foamEtc bashrc)
+        removeCshMagic  $(_foamEtc cshrc)
 
         adjusted=true
         shift
@@ -299,8 +381,8 @@ do
    -version | -foamVersion | --projectVersion)
         # Replace WM_PROJECT_VERSION=...
         optionValue=$(getOptionValue "$@")
-        replace    etc/bashrc  WM_PROJECT_VERSION "$optionValue"
-        replaceCsh etc/cshrc   WM_PROJECT_VERSION "$optionValue"
+        replaceEtc     bashrc  WM_PROJECT_VERSION "$optionValue"
+        replaceEtcCsh  cshrc   WM_PROJECT_VERSION "$optionValue"
         adjusted=true
         shift
         ;;
@@ -314,30 +396,30 @@ do
 
     -sp | -SP | -float32)
         # Replace WM_PRECISION_OPTION=...
-        replace    etc/bashrc  WM_PRECISION_OPTION "SP"
-        replaceCsh etc/cshrc   WM_PRECISION_OPTION "SP"
+        replaceEtc     bashrc  WM_PRECISION_OPTION "SP"
+        replaceEtcCsh  cshrc   WM_PRECISION_OPTION "SP"
         adjusted=true
         ;;
 
     -dp | -DP | -float64)
         # Replace WM_PRECISION_OPTION=...
-        replace    etc/bashrc  WM_PRECISION_OPTION "DP"
-        replaceCsh etc/cshrc   WM_PRECISION_OPTION "DP"
+        replaceEtc     bashrc  WM_PRECISION_OPTION "DP"
+        replaceEtcCsh  cshrc   WM_PRECISION_OPTION "DP"
         adjusted=true
         ;;
 
     -spdp | -SPDP)
         # Replace WM_PRECISION_OPTION=...
-        replace    etc/bashrc  WM_PRECISION_OPTION "SPDP"
-        replaceCsh etc/cshrc   WM_PRECISION_OPTION "SPDP"
+        replaceEtc     bashrc  WM_PRECISION_OPTION "SPDP"
+        replaceEtcCsh  cshrc   WM_PRECISION_OPTION "SPDP"
         adjusted=true
         ;;
 
     -int32 | -int64)
         # Replace WM_LABEL_SIZE=...
         optionValue="${1#-int}"
-        replace    etc/bashrc  WM_LABEL_SIZE "$optionValue"
-        replaceCsh etc/cshrc   WM_LABEL_SIZE "$optionValue"
+        replaceEtc     bashrc  WM_LABEL_SIZE "$optionValue"
+        replaceEtcCsh  cshrc   WM_LABEL_SIZE "$optionValue"
         adjusted=true
         ;;
 
@@ -347,8 +429,8 @@ do
     -clang)
         # Replace default_clang_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/compiler   default_clang_version "$optionValue"
-        replace etc/config.csh/compiler  default_clang_version "$optionValue"
+        replaceEtc  config.sh/compiler   default_clang_version "$optionValue"
+        replaceEtc  config.csh/compiler  default_clang_version "$optionValue"
         adjusted=true
         shift
         ;;
@@ -356,32 +438,32 @@ do
     -gcc)
         # Replace default_gcc_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/compiler   default_gcc_version "$optionValue"
-        replace etc/config.csh/compiler  default_gcc_version "$optionValue"
+        replaceEtc  config.sh/compiler   default_gcc_version "$optionValue"
+        replaceEtc  config.csh/compiler  default_gcc_version "$optionValue"
         adjusted=true
         shift
         ;;
 
-    -system)
+    -system-compiler | -system)
         # Replace WM_COMPILER_TYPE=... and WM_COMPILER=...
         optionValue=$(getOptionValue "$@")
-        replace etc/bashrc  \
+        replaceEtc  bashrc  \
             WM_COMPILER_TYPE system \
             WM_COMPILER "$optionValue"
-        replaceCsh etc/cshrc \
+        replaceEtcCsh  cshrc \
             WM_COMPILER_TYPE system \
             WM_COMPILER "$optionValue"
         adjusted=true
         shift
         ;;
 
-    -third | -ThirdParty)
+    -third-compiler | -third | -ThirdParty)
         # Replace WM_COMPILER_TYPE=... and WM_COMPILER=...
         optionValue=$(getOptionValue "$@")
-        replace etc/bashrc  \
+        replaceEtc  bashrc  \
             WM_COMPILER_TYPE ThirdParty \
             WM_COMPILER "$optionValue"
-        replaceCsh etc/cshrc  \
+        replaceEtcCsh  cshrc  \
             WM_COMPILER_TYPE ThirdParty \
             WM_COMPILER "$optionValue"
         adjusted=true
@@ -390,22 +472,22 @@ do
 
     gmp-[4-9]* | gmp-system)
         # gcc-related package
-        replace etc/config.sh/compiler   default_gmp_version "$1"
-        replace etc/config.csh/compiler  default_gmp_version "$1"
+        replaceEtc  config.sh/compiler   default_gmp_version "$1"
+        replaceEtc  config.csh/compiler  default_gmp_version "$1"
         adjusted=true
         ;;
 
     mpfr-[2-9]* | mpfr-system)
         # gcc-related package
-        replace etc/config.sh/compiler   default_mpfr_version "$1"
-        replace etc/config.csh/compiler  default_mpfr_version "$1"
+        replaceEtc  config.sh/compiler   default_mpfr_version "$1"
+        replaceEtc  config.csh/compiler  default_mpfr_version "$1"
         adjusted=true
         ;;
 
     mpc-[0-9]* | mpc-system)
         # gcc-related package
-        replace etc/config.sh/compiler   default_mpc_version "$1"
-        replace etc/config.csh/compiler  default_mpc_version "$1"
+        replaceEtc  config.sh/compiler   default_mpc_version "$1"
+        replaceEtc  config.csh/compiler  default_mpc_version "$1"
         adjusted=true
         ;;
 
@@ -415,8 +497,8 @@ do
     -mpi)
         # Explicitly set WM_MPLIB=...
         optionValue=$(getOptionValue "$@")
-        replace    etc/bashrc  WM_MPLIB "$optionValue"
-        replaceCsh etc/bashrc  WM_MPLIB "$optionValue"
+        replaceEtc     bashrc  WM_MPLIB "$optionValue"
+        replaceEtcCsh  cshrc   WM_MPLIB "$optionValue"
         optMpi=system
         adjusted=true
         shift
@@ -431,34 +513,34 @@ do
         _matches "$optMpi" "$expected" || \
             die "'$1' has bad value: '$optMpi'"
 
-        _inlineSed etc/config.sh/mpi \
+        _inlineSed  $(_foamEtc config.sh/mpi) \
             "FOAM_MPI=$expected" \
             "FOAM_MPI=$optMpi" \
             "Replaced 'FOAM_MPI=$expected' setting by 'FOAM_MPI=$optMpi'"
 
-        _inlineSed etc/config.csh/mpi \
+        _inlineSed  $(_foamEtc config.csh/mpi) \
             "FOAM_MPI $expected" \
             "FOAM_MPI $optMpi" \
             "Replaced 'FOAM_MPI $expected' setting by 'FOAM_MPI $optMpi'"
 
-        replace    etc/bashrc  WM_MPLIB OPENMPI
-        replaceCsh etc/cshrc   WM_MPLIB OPENMPI
+        replaceEtc     bashrc  WM_MPLIB OPENMPI
+        replaceEtcCsh  cshrc   WM_MPLIB OPENMPI
         adjusted=true
         shift
         ;;
 
     -openmpi-system)
         # Explicitly set WM_MPLIB=SYSTEMOPENMPI
-        replace    etc/bashrc  WM_MPLIB SYSTEMOPENMPI
-        replaceCsh etc/cshrc   WM_MPLIB SYSTEMOPENMPI
+        replaceEtc     bashrc  WM_MPLIB SYSTEMOPENMPI
+        replaceEtcCsh  cshrc   WM_MPLIB SYSTEMOPENMPI
         optMpi=system
         adjusted=true
         ;;
 
     -openmpi-third)
         # Explicitly set WM_MPLIB=OPENMPI, using default setting for openmpi
-        replace    etc/bashrc  WM_MPLIB OPENMPI
-        replaceCsh etc/cshrc   WM_MPLIB OPENMPI
+        replaceEtc     bashrc  WM_MPLIB OPENMPI
+        replaceEtcCsh  cshrc   WM_MPLIB OPENMPI
         optMpi=third
         adjusted=true
         ;;
@@ -469,8 +551,8 @@ do
     -adios | -adios2)
         # Replace adios2_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/adios2   adios2_version "$optionValue"
-        replace etc/config.csh/adios2  adios2_version "$optionValue"
+        replaceEtc  config.sh/adios2   adios2_version "$optionValue"
+        replaceEtc  config.csh/adios2  adios2_version "$optionValue"
         adjusted=true
         shift
         ;;
@@ -478,8 +560,8 @@ do
     -adios-path | -adios2-path)
         # Replace ADIOS2_ARCH_PATH=...
         optionValue=$(getOptionValue "$@")
-        replace    etc/config.sh/adios2   ADIOS2_ARCH_PATH "\"$optionValue\""
-        replaceCsh etc/config.csh/adios2  ADIOS2_ARCH_PATH "\"$optionValue\""
+        replaceEtc     config.sh/adios2   ADIOS2_ARCH_PATH "\"$optionValue\""
+        replaceEtcCsh  config.csh/adios2  ADIOS2_ARCH_PATH "\"$optionValue\""
         adjusted=true
         shift
         ;;
@@ -487,8 +569,8 @@ do
     -boost)
         # Replace boost_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/CGAL   boost_version "$optionValue"
-        replace etc/config.csh/CGAL  boost_version "$optionValue"
+        replaceEtc  config.sh/CGAL   boost_version "$optionValue"
+        replaceEtc  config.csh/CGAL  boost_version "$optionValue"
         adjusted=true
         shift
         ;;
@@ -496,8 +578,8 @@ do
     -boost-path)
         # Replace BOOST_ARCH_PATH=...
         optionValue=$(getOptionValue "$@")
-        replace    etc/config.sh/CGAL   BOOST_ARCH_PATH "\"$optionValue\""
-        replaceCsh etc/config.csh/CGAL  BOOST_ARCH_PATH "\"$optionValue\""
+        replaceEtc     config.sh/CGAL   BOOST_ARCH_PATH "\"$optionValue\""
+        replaceEtcCsh  config.csh/CGAL  BOOST_ARCH_PATH "\"$optionValue\""
         adjusted=true
         shift
         ;;
@@ -505,8 +587,8 @@ do
     -cgal)
         # Replace cgal_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/CGAL   cgal_version "$optionValue"
-        replace etc/config.csh/CGAL  cgal_version "$optionValue"
+        replaceEtc  config.sh/CGAL   cgal_version "$optionValue"
+        replaceEtc  config.csh/CGAL  cgal_version "$optionValue"
         adjusted=true
         shift
         ;;
@@ -514,8 +596,8 @@ do
     -cgal-path)
         # Replace CGAL_ARCH_PATH=...
         optionValue=$(getOptionValue "$@")
-        replace    etc/config.sh/CGAL   CGAL_ARCH_PATH "$optionValue"
-        replaceCsh etc/config.csh/CGAL  CGAL_ARCH_PATH "$optionValue"
+        replaceEtc     config.sh/CGAL   CGAL_ARCH_PATH "$optionValue"
+        replaceEtcCsh  config.csh/CGAL  CGAL_ARCH_PATH "$optionValue"
         adjusted=true
         shift
         ;;
@@ -523,8 +605,8 @@ do
     -fftw)
         # Replace fftw_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/FFTW   fftw_version "$optionValue"
-        replace etc/config.csh/FFTW  fftw_version "$optionValue"
+        replaceEtc  config.sh/FFTW   fftw_version "$optionValue"
+        replaceEtc  config.csh/FFTW  fftw_version "$optionValue"
         adjusted=true
         shift
         ;;
@@ -532,8 +614,8 @@ do
     -fftw-path)
         # Replace FFTW_ARCH_PATH=...
         optionValue=$(getOptionValue "$@")
-        replace    etc/config.sh/FFTW   FFTW_ARCH_PATH "\"$optionValue\""
-        replaceCsh etc/config.csh/FFTW  FFTW_ARCH_PATH "\"$optionValue\""
+        replaceEtc     config.sh/FFTW   FFTW_ARCH_PATH "\"$optionValue\""
+        replaceEtcCsh  config.csh/FFTW  FFTW_ARCH_PATH "\"$optionValue\""
         adjusted=true
         shift
         ;;
@@ -541,8 +623,8 @@ do
     -cmake)
         # Replace cmake_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/paraview   cmake_version "$optionValue"
-        replace etc/config.csh/paraview  cmake_version "$optionValue"
+        replaceEtc  config.sh/paraview   cmake_version "$optionValue"
+        replaceEtc  config.csh/paraview  cmake_version "$optionValue"
         adjusted=true
         shift
         ;;
@@ -550,7 +632,7 @@ do
     -kahip)
         # Replace KAHIP_VERSION=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/kahip  KAHIP_VERSION "$optionValue"
+        replaceEtc  config.sh/kahip  KAHIP_VERSION "$optionValue"
         adjusted=true
         shift
         ;;
@@ -558,7 +640,7 @@ do
     -kahip-path)
         # Replace KAHIP_ARCH_PATH=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/kahip  KAHIP_ARCH_PATH "\"$optionValue\""
+        replaceEtc  config.sh/kahip  KAHIP_ARCH_PATH "\"$optionValue\""
         adjusted=true
         shift
         ;;
@@ -566,7 +648,7 @@ do
     -metis)
         # Replace METIS_VERSION=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/metis  METIS_VERSION "$optionValue"
+        replaceEtc  config.sh/metis  METIS_VERSION "$optionValue"
         adjusted=true
         shift
         ;;
@@ -574,7 +656,7 @@ do
     -metis-path)
         # Replace METIS_ARCH_PATH=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/metis  METIS_ARCH_PATH "\"$optionValue\""
+        replaceEtc  config.sh/metis  METIS_ARCH_PATH "\"$optionValue\""
         adjusted=true
         shift
         ;;
@@ -582,7 +664,7 @@ do
     -scotch | -scotchVersion | --scotchVersion)
         # Replace SCOTCH_VERSION=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/scotch  SCOTCH_VERSION "$optionValue"
+        replaceEtc  config.sh/scotch  SCOTCH_VERSION "$optionValue"
         adjusted=true
         shift
         ;;
@@ -590,7 +672,7 @@ do
     -scotch-path | -scotchArchPath | --scotchArchPath)
         # Replace SCOTCH_ARCH_PATH=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/scotch  SCOTCH_ARCH_PATH "\"$optionValue\""
+        replaceEtc  config.sh/scotch  SCOTCH_ARCH_PATH "\"$optionValue\""
         adjusted=true
         shift
         ;;
@@ -605,8 +687,8 @@ do
         _matches "$optionValue" "$expected" || \
             [ "$optionValue" != "${optionValue%system}" ] || \
             die "'$1' has bad value: '$optionValue'"
-        replace etc/config.sh/paraview   ParaView_VERSION "$optionValue"
-        replace etc/config.csh/paraview  ParaView_VERSION "$optionValue"
+        replaceEtc  config.sh/paraview   ParaView_VERSION "$optionValue"
+        replaceEtc  config.csh/paraview  ParaView_VERSION "$optionValue"
         adjusted=true
         shift
         ;;
@@ -614,8 +696,8 @@ do
     -paraview-qt)
         # Replace ParaView_QT=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/paraview   ParaView_QT "$optionValue"
-        replace etc/config.csh/paraview  ParaView_QT "$optionValue"
+        replaceEtc  config.sh/paraview   ParaView_QT "$optionValue"
+        replaceEtc  config.csh/paraview  ParaView_QT "$optionValue"
         adjusted=true
         shift
         ;;
@@ -623,8 +705,8 @@ do
     -paraview-path | -paraviewInstall | --paraviewInstall)
         # Replace ParaView_DIR=...
         optionValue=$(getOptionValue "$@")
-        replace    etc/config.sh/paraview   ParaView_DIR \""$optionValue\""
-        replaceCsh etc/config.csh/paraview  ParaView_DIR \""$optionValue\""
+        replaceEtc     config.sh/paraview   ParaView_DIR \""$optionValue\""
+        replaceEtcCsh  config.csh/paraview  ParaView_DIR \""$optionValue\""
         adjusted=true
         shift
         ;;
@@ -632,8 +714,8 @@ do
     -vtk)
         # Replace vtk_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/vtk   vtk_version "$optionValue"
-        replace etc/config.csh/vtk  vtk_version "$optionValue"
+        replaceEtc  config.sh/vtk   vtk_version "$optionValue"
+        replaceEtc  config.csh/vtk  vtk_version "$optionValue"
         adjusted=true
         shift
         ;;
@@ -641,8 +723,8 @@ do
     -mesa)
         # Replace mesa_version=...
         optionValue=$(getOptionValue "$@")
-        replace etc/config.sh/vtk   mesa_version "$optionValue"
-        replace etc/config.csh/vtk  mesa_version "$optionValue"
+        replaceEtc  config.sh/vtk   mesa_version "$optionValue"
+        replaceEtc  config.csh/vtk  mesa_version "$optionValue"
         adjusted=true
         shift
         ;;
diff --git a/bin/tools/foamCreateModuleInclude b/bin/tools/foamCreateModuleInclude
index dd616ae30d1dec6c68cc61ad079985859ee117aa..7a955740575367048a3d47ce9a6eb64b439059a3 100755
--- a/bin/tools/foamCreateModuleInclude
+++ b/bin/tools/foamCreateModuleInclude
@@ -7,23 +7,10 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2016-2017 CINECA
-#     Copyright (C) 2017-2019 OpenCFD Ltd.
+#     Copyright (C) 2017-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/>.
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
 #
 # Script
 #     foamCreateModuleInclude
@@ -134,15 +121,24 @@ syspath() {
 # Frontend: do all basic sanity checks in the front-end only
 if [ -z "$optBackend" ]
 then
-    # Check that it appears to be an OpenFOAM installation
-    [ -d "$projectDir" -a -f "$projectDir/etc/bashrc" ] || \
-        die "Incorrect projectDir? $projectDir"
-
     # Check preloads
-    for file in "$preloads"
-    do
-        [ -f "$file" ] || echo "No such file to preload: $file" 1>&2
-    done
+    if [ -n "$preloads" ]
+    then
+        for file in $preloads
+        do
+            [ -f "$file" ] || echo "No such file to preload: $file" 1>&2
+        done
+    fi
+
+    # Check that it appears to be an OpenFOAM installation
+    # could also check [ -d "$projectDir/META-INFO" ]
+    if [ -d "$projectDir" ] && [ -f "etc/bashrc" ]
+    then
+        echo "Appears to be an OpenFOAM installation" 1>&2
+    else
+        die "Incorrect OpenFOAM projectDir?" \
+        "    $projectDir"
+    fi
 
     # Call itself with clean environment.
     # Tag the start/end of the original PATH, MANPATH, LD_LIBRARY_PATH
@@ -234,6 +230,9 @@ unset FOAM_INST_DIR WM_PROJECT_INST_DIR
 unset WM_PROJECT_USER_DIR WM_THIRD_PARTY_DIR
 unset SCOTCH_VERSION
 
+# Probably don't want these either
+unset FOAM_CONFIG_MODE
+
 
 # Also remove user directories as being unreliable
 
@@ -283,7 +282,7 @@ unalias util        2>/dev/null
 #------------------------------------------------
 
 # Generalize environment.
-# This needs rethinking since it largely duplicates logic from the etc/config.sh/settings
+# Needs rethinking, it largely duplicates logic from etc/config.sh/settings
 rewriteEnv()
 {
     sed \
diff --git a/bin/tools/lib-dir b/bin/tools/lib-dir
index 5cc178019db991b096f5342f881e45a8162f24a0..12651b22b6b9a2f48a19a8e6f6d7dd7a80269681 100755
--- a/bin/tools/lib-dir
+++ b/bin/tools/lib-dir
@@ -6,11 +6,10 @@
 #   \\  /    A nd           | www.openfoam.com
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
-#     Copyright (C) 2018 OpenCFD Ltd.
+#     Copyright (C) 2018-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
 #     tools/lib-dir [OPTION] DIR [LIBEXT]
@@ -135,7 +134,7 @@ then
 fi
 
 # 2) Use fallback if the previous failed
-if [ -z "$resolved" -a -n "$alt" ]
+if [ -z "$resolved" ] && [ -n "$alt" ]
 then
     # Fallback
     case "$alt" in
diff --git a/etc/bashrc b/etc/bashrc
index c242f6cd438c9bee5206f0a7249d75c60ce524ee..228d709edcb7f698ae26bc6c982953ec288531d4 100644
--- a/etc/bashrc
+++ b/etc/bashrc
@@ -35,10 +35,16 @@
 #       . /path/etc/bashrc WM_COMPILER=Clang WM_LABEL_SIZE=64
 #
 # Environment
-#     FOAM_CONFIG_NOUSER (set/unset)
-#         - suppress use of user/group configuration files
+#     FOAM_CONFIG_ETC
+#     - alternative/additional location for OpenFOAM etc/ directory
+#
+#     FOAM_CONFIG_MODE (search mode for etc config files - see foamEtcFile)
+#         - eg, FOAM_CONFIG_MODE="o" to only use OpenFOAM config files
+#         - no influence on OpenFOAM applications, just the config files
+#
 #     FOAM_VERBOSE (set/unset)
 #         - add extra verbosity when sourcing files
+#
 #     WM_PROJECT_SITE (optional directory)
 #         - local site-specific directory, uses WM_PROJECT_DIR/site if unset
 #
diff --git a/etc/caseDicts/postProcessing/solvers/scalarTransport/scalarTransport b/etc/caseDicts/postProcessing/solvers/scalarTransport/scalarTransport
index 24fc867895aac8be7878408fc535754bfa729da3..b7434eb2bec9f9f156bd3b858223152894beaa97 100644
--- a/etc/caseDicts/postProcessing/solvers/scalarTransport/scalarTransport
+++ b/etc/caseDicts/postProcessing/solvers/scalarTransport/scalarTransport
@@ -8,9 +8,10 @@
 Description
     Solves a transport equation for a scalar field.
 
-    The name of the scalar field is specified in this file.  A sample scalar
-    field file, that must be initialised for the case, typically in the 0
-    directory, is available in $FOAM_ETC/caseDicts/solvers/scalarTransport.
+    The name of the scalar field is specified in this file.
+    A sample scalar field file, that must be initialised for the case,
+    typically in the 0 directory,
+    is available in tetc/caseDicts/solvers/scalarTransport
 
 \*---------------------------------------------------------------------------*/
 
diff --git a/etc/config.csh/functions b/etc/config.csh/functions
index f71dd99015b9681447ee7d5ce5132c3fcd06331c..685b6462b0db20d593e540bf83ae5dc23c83ad07 100644
--- a/etc/config.csh/functions
+++ b/etc/config.csh/functions
@@ -5,11 +5,10 @@
 #   \\  /    A nd           | www.openfoam.com
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
-#     Copyright (C) 2018 OpenCFD Ltd.
+#     Copyright (C) 2018-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.
 #
 # File
 #     etc/config.csh/functions
@@ -36,25 +35,13 @@ alias _foamAddLib  'setenv LD_LIBRARY_PATH \!*\:${LD_LIBRARY_PATH}'
 alias _foamAddLibAuto 'eval `$WM_PROJECT_DIR/bin/tools/lib-dir -csh \!*`'
 
 # Echo values when FOAM_VERBOSE is on, no-op otherwise
+# Source an etc file, possibly with some verbosity
 if ($?FOAM_VERBOSE && $?prompt) then
     alias _foamEcho 'echo \!*'
+    alias _foamEtc 'eval `$WM_PROJECT_DIR/bin/foamEtcFile -csh-verbose \!*`'
 else
     alias _foamEcho 'true'
-endif
-
-# Source an etc file, possibly with some verbosity
-if ($?FOAM_VERBOSE && $?prompt) then
-    if ($?FOAM_CONFIG_NOUSER) then
-        alias _foamEtc 'eval `$WM_PROJECT_DIR/bin/foamEtcFile -csh-verbose -mode=o \!*`'
-    else
-        alias _foamEtc 'eval `$WM_PROJECT_DIR/bin/foamEtcFile -csh-verbose \!*`'
-    endif
-else
-    if ($?FOAM_CONFIG_NOUSER) then
-        alias _foamEtc 'eval `$WM_PROJECT_DIR/bin/foamEtcFile -csh -mode=o \!*`'
-    else
-        alias _foamEtc 'eval `$WM_PROJECT_DIR/bin/foamEtcFile -csh \!*`'
-    endif
+    alias _foamEtc 'eval `$WM_PROJECT_DIR/bin/foamEtcFile -csh \!*`'
 endif
 
 
diff --git a/etc/config.csh/settings b/etc/config.csh/settings
index 206846e18ff656fac1915b153db9723470c7c6ff..196f66ebb01c010e9e7014460cc31037fc8f50f0 100644
--- a/etc/config.csh/settings
+++ b/etc/config.csh/settings
@@ -6,11 +6,10 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2019 OpenCFD Ltd.
+#     Copyright (C) 2016-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.
 #
 # File
 #     etc/config.csh/settings
diff --git a/etc/config.csh/setup b/etc/config.csh/setup
index ecdea3b40f5a75d88896f89ba551895c05e5908c..497fdd795d14684984dbf0f78b3f7836ceaeadf2 100644
--- a/etc/config.csh/setup
+++ b/etc/config.csh/setup
@@ -18,10 +18,11 @@
 #     Finalize setup of OpenFOAM environment for C-shell (csh, tcsh)
 #
 # Environment
+#     FOAM_CONFIG_MODE (search mode for etc config files - see foamEtcFile)
+#         - eg, FOAM_CONFIG_MODE="o" to only use OpenFOAM config files
+#
 #     FOAM_VERBOSE (set/unset)
 #         - add extra verbosity when sourcing files
-#     FOAM_CONFIG_NOUSER (set/unset)
-#         - suppress use of user/group configuration files
 #
 #------------------------------------------------------------------------------
 
@@ -77,14 +78,21 @@ endif
 
 
 # Overrides via <prefs.csh>
-# 1. other (system) values
+# 1. Always use (O)ther values from the OpenFOAM project etc/ directory
 _foamEtc -mode=o prefs.csh
 
-# 2. user or group values (unless disabled)
-if (! $?FOAM_CONFIG_NOUSER ) then
-    _foamEtc -mode=ug prefs.csh
+# 2. (U)ser or (G)roup values (unless disabled). Could use some more work
+if ($?FOAM_CONFIG_MODE) then
+    set configMode="${FOAM_CONFIG_MODE:s/o//}"  # Already handled O(ther)
+else
+    set configMode="ug"
 endif
-
+# Is the remainder valid - has U(ser) or G(roup)?
+switch ("$configMode")
+case *[ug]*:
+    _foamEtc -mode="$configMode" prefs.csh
+    breaksw
+endsw
 
 # Capture and evaluate any command-line parameters
 # These can be used to set/unset values, specify additional files etc.
@@ -119,6 +127,16 @@ while ( $#argv > 0 )
     shift
 end
 
+# The prefs may have injected a FOAM_CONFIG_ETC value.
+# Verify that it makes sense before continuing.
+if ( $?FOAM_CONFIG_ETC ) then
+    if ( ! -d "$FOAM_CONFIG_ETC" ) then
+        echo "Ignore invalid FOAM_CONFIG_ETC = $FOAM_CONFIG_ETC"
+    else if ( "$FOAM_CONFIG_ETC" == "$WM_PROJECT_DIR/etc" ) then
+        unsetenv FOAM_CONFIG_ETC
+    endif
+endif
+
 
 # Clean standard environment variables (PATH, MANPATH, LD_LIBRARY_PATH)
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/etc/config.csh/unset b/etc/config.csh/unset
index 94dc6f84908bb6d43094f31085e2ac9e7f41d43a..580fb8c85639b79cf9ad9ca1ca514b40a0f16263 100644
--- a/etc/config.csh/unset
+++ b/etc/config.csh/unset
@@ -6,7 +6,7 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2019 OpenCFD Ltd.
+#     Copyright (C) 2016-2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
@@ -82,6 +82,8 @@ unsetenv FOAM_API
 unsetenv FOAM_APPBIN
 unsetenv FOAM_APP
 unsetenv FOAM_CODE_TEMPLATES
+unsetenv FOAM_CONFIG_ETC
+unsetenv FOAM_CONFIG_MODE
 unsetenv FOAM_ETC
 unsetenv FOAM_EXTRA_CXXFLAGS
 unsetenv FOAM_EXTRA_LDFLAGS
diff --git a/etc/config.sh/functions b/etc/config.sh/functions
index 6bd5ac74f028d34895878931b8c84847f5d631d6..30ca825534383825afd3e2f7f35dbde0acd17692 100644
--- a/etc/config.sh/functions
+++ b/etc/config.sh/functions
@@ -6,11 +6,10 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2017-2018 OpenCFD Ltd.
+#     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.
 #
 # File
 #     etc/config.sh/functions
@@ -39,32 +38,25 @@ then
     {
          foamVar_name="$1"
          shift
-         eval "$($foamClean -sh-env=$foamVar_name $@)"
+         eval "$($foamClean -sh-env="$foamVar_name" "$@")"
          unset "foamVar_name"
     }
 
     # Echo values to stderr when FOAM_VERBOSE is on, no-op otherwise
-    unset -f _foamEcho 2>/dev/null
-    if [ -n "$FOAM_VERBOSE" ] && [ -n "$PS1" ]
-    then
-        _foamEcho() { echo "$@" 1>&2; }
-    else
-        _foamEcho() { true; }
-    fi
-
     # Source an etc file, possibly with some verbosity
     # - use eval to avoid intermediate variables (ksh doesn't have 'local')
+    unset -f _foamEcho 2>/dev/null
     unset -f _foamEtc 2>/dev/null
     if [ -n "$FOAM_VERBOSE" ] && [ -n "$PS1" ]
     then
-        _foamEtc()
-        {
-            eval "$($WM_PROJECT_DIR/bin/foamEtcFile -sh-verbose ${FOAM_CONFIG_NOUSER:+-mode=o} $@)";
+        _foamEcho() { echo "$@" 1>&2; }
+        _foamEtc() {
+            eval "$("$WM_PROJECT_DIR"/bin/foamEtcFile -sh-verbose "$@")";
         }
     else
-        _foamEtc()
-        {
-            eval "$($WM_PROJECT_DIR/bin/foamEtcFile -sh ${FOAM_CONFIG_NOUSER:+-mode=o} $@)";
+        _foamEcho() { true; }
+        _foamEtc() {
+            eval "$("$WM_PROJECT_DIR"/bin/foamEtcFile -sh "$@")";
         }
     fi
 
@@ -162,7 +154,7 @@ then
         # - use lib-dir script instead of rewriting
         _foamAddLibAuto()
         {
-            eval "$($WM_PROJECT_DIR/bin/tools/lib-dir -sh $@)";
+            eval "$("$WM_PROJECT_DIR"/bin/tools/lib-dir -sh "$@")";
         }
     fi
 
diff --git a/etc/config.sh/paraview b/etc/config.sh/paraview
index ab2f12e6044f3fac0b3aa7e5fb763a320be25a6a..d850ccf307b9f93ec3a0ffc76c81fbf8be1d66b8 100644
--- a/etc/config.sh/paraview
+++ b/etc/config.sh/paraview
@@ -6,11 +6,10 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2019 OpenCFD Ltd.
+#     Copyright (C) 2016-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.
 #
 # File
 #     etc/config.sh/paraview
@@ -109,7 +108,7 @@ case "$ParaView_VERSION" in
 
 (system)
     unset PV_PLUGIN_PATH
-    eval "$($WM_PROJECT_DIR/bin/foamEtcFile -sh ${FOAM_CONFIG_NOUSER:+-mode=o} -config paraview-system)"
+    eval "$($WM_PROJECT_DIR/bin/foamEtcFile -sh -config paraview-system)"
     ;;
 
 (*)
diff --git a/etc/config.sh/settings b/etc/config.sh/settings
index 8b3ba1248fccb52a7aca795bb97279108b9ecc6a..fefba566bc47f5b30e13c13ed9557c727a6938a4 100644
--- a/etc/config.sh/settings
+++ b/etc/config.sh/settings
@@ -6,11 +6,10 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2019 OpenCFD Ltd.
+#     Copyright (C) 2016-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.
 #
 # File
 #     etc/config.sh/settings
diff --git a/etc/config.sh/setup b/etc/config.sh/setup
index afead38f9ff69a509f4d08f33bb062536502b4ff..407aa4cce68050705da87b30ce2f570d915aeaea 100644
--- a/etc/config.sh/setup
+++ b/etc/config.sh/setup
@@ -5,11 +5,10 @@
 #   \\  /    A nd           | www.openfoam.com
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
-#     Copyright (C) 2018 OpenCFD Ltd.
+#     Copyright (C) 2018-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.
 #
 # File
 #     etc/config.sh/setup
@@ -19,15 +18,16 @@
 #     Finalize setup of OpenFOAM environment for POSIX shell.
 #
 # Environment
+#     FOAM_CONFIG_MODE (search mode for etc config files - see foamEtcFile)
+#         - eg, FOAM_CONFIG_MODE="o" to only use OpenFOAM config files
+#
 #     FOAM_VERBOSE (set/unset)
 #         - add extra verbosity when sourcing files
-#     FOAM_CONFIG_NOUSER (set/unset)
-#         - suppress use of user/group configuration files
 #
 #------------------------------------------------------------------------------
 
 # [FOAM_API] - The API level for the project
-export FOAM_API="$($WM_PROJECT_DIR/bin/foamEtcFile -show-api)"
+export FOAM_API=$("$WM_PROJECT_DIR/bin/foamEtcFile" -show-api)
 
 # The installation parent directory
 prefixDir="${WM_PROJECT_DIR%/*}"
@@ -83,11 +83,22 @@ fi
 
 
 # Overrides via <prefs.sh>
-# 1. other (system) values
+# 1. Always use O(ther) values from the OpenFOAM project etc/ directory
 _foamEtc -mode=o prefs.sh
 
-# 2. user or group values (unless disabled)
-[ -z "$FOAM_CONFIG_NOUSER" ] && _foamEtc -mode=ug prefs.sh
+# 2. (U)ser or (G)roup values (unless disabled).
+unset configMode
+if [ -z "$FOAM_CONFIG_MODE" ]
+then
+    configMode="ug"
+else
+    case "$FOAM_CONFIG_MODE" in (*[u]*) configMode="${configMode}u" ;; esac
+    case "$FOAM_CONFIG_MODE" in (*[g]*) configMode="${configMode}g" ;; esac
+fi
+if [ -n "$configMode" ]
+then
+    _foamEtc -mode="$configMode" prefs.sh
+fi
 
 
 # Capture and evaluate any command-line parameters
@@ -104,6 +115,21 @@ else
     _foamEval "$@"
 fi
 
+# The prefs may have injected a FOAM_CONFIG_ETC value.
+# Verify that it makes sense before continuing.
+if [ -n "$FOAM_CONFIG_ETC" ]
+then
+    if [ ! -d "$FOAM_CONFIG_ETC" ]
+    then
+        echo "Ignore invalid FOAM_CONFIG_ETC = $FOAM_CONFIG_ETC" 1>&2
+        unset FOAM_CONFIG_ETC
+    elif [ "$FOAM_CONFIG_ETC" = "$WM_PROJECT_DIR/etc" ]
+    then
+        # Redundant value
+        unset FOAM_CONFIG_ETC
+    fi
+fi
+
 
 # Clean standard environment variables (PATH, MANPATH, LD_LIBRARY_PATH)
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/etc/config.sh/unset b/etc/config.sh/unset
index 4b9bcbf15f7799bc49fd30f383315a8601c844a3..6f05533f1ba0485779468bdec78cdeb3f90e4c5d 100644
--- a/etc/config.sh/unset
+++ b/etc/config.sh/unset
@@ -69,6 +69,8 @@ unset FOAM_API
 unset FOAM_APPBIN
 unset FOAM_APP
 unset FOAM_CODE_TEMPLATES
+unset FOAM_CONFIG_ETC
+unset FOAM_CONFIG_MODE
 unset FOAM_ETC
 unset FOAM_EXTRA_CXXFLAGS
 unset FOAM_EXTRA_LDFLAGS
diff --git a/etc/cshrc b/etc/cshrc
index db231b57de0a39be328a8c7f68ec03652cc77fd5..380f9d3d495afd0f9af08b85e1869fd245d62c8f 100644
--- a/etc/cshrc
+++ b/etc/cshrc
@@ -35,10 +35,16 @@
 #       source /path/etc/cshrc WM_COMPILER=Clang WM_LABEL_SIZE=64
 #
 # Environment
-#     FOAM_CONFIG_NOUSER (set/unset)
-#         - suppress use of user/group configuration files
+#     FOAM_CONFIG_ETC
+#     - alternative/additional location for OpenFOAM etc/ directory
+#
+#     FOAM_CONFIG_MODE (search mode for etc config files - see foamEtcFile)
+#         - eg, FOAM_CONFIG_MODE="o" to only use OpenFOAM config files
+#         - no influence on OpenFOAM applications, just the config files
+#
 #     FOAM_VERBOSE (set/unset)
 #         - add extra verbosity when sourcing files
+#
 #     WM_PROJECT_SITE (optional directory)
 #         - local site-specific directory, uses WM_PROJECT_DIR/site if unset
 #
diff --git a/etc/openfoam b/etc/openfoam
index e6d67dcb5754339c070c2f30604808c8f8610061..7bbe622fe3c5b15523c3fc1c79fa6331e2de1f2f 100755
--- a/etc/openfoam
+++ b/etc/openfoam
@@ -51,6 +51,7 @@ options:
   -dp                   Double precision
   -spdp                 Mixed single/double precision
   -int32 | -int64       The label-size
+  -etc=DIR              Additional project etc/ directory
   -prefix=DIR           Alternative OpenFOAM project directory
   -show-api | -version  Print META-INFO api value and exit
   -show-patch           Print META-INFO patch value and exit
@@ -91,7 +92,7 @@ getApiInfo()
 
 # No inheritance of FOAM_SETTINGS
 unset FOAM_SETTINGS
-unset _foamSettings _foamScriptCommand
+unset _foamEtcDir _foamSettings _foamScriptCommand
 
 # Parse options
 while [ "$#" -gt 0 ]
@@ -142,6 +143,11 @@ do
         _foamSettings="$_foamSettings${_foamSettings:+ }WM_LABEL_SIZE=${1#-int}"
         ;;
 
+    -etc=*)
+        # Define FOAM_CONFIG_ETC for finding files
+        _foamEtcDir="${1#*=}"
+        ;;
+
     -prefix=*)
         projectDir="${1#*=}"
         ;;
@@ -205,6 +211,14 @@ fi
     exit 2
 }
 
+if [ -n "$_foamEtcDir" ] && [ -d "$_foamEtcDir" ]
+then
+    # Additional etc directory
+    export FOAM_CONFIG_ETC="$_foamEtcDir"
+else
+    unset FOAM_CONFIG_ETC
+fi
+
 if [ -n "$interactive" ]
 then
     # Interactive shell
diff --git a/etc/templates/closedVolume/README b/etc/templates/closedVolume/README
index e82f1320ee6dbc3b3c155d93031516e658e5b26c..0ff3c261e72786c57c8c09e9f75548df15a14a00 100644
--- a/etc/templates/closedVolume/README
+++ b/etc/templates/closedVolume/README
@@ -11,7 +11,7 @@ Overview
 Meshing
 =======
 + Meshing is setup as in the inflowOutflow template
-+ See $FOAM_ETC/templates/inflowOutflow/README for details
++ See etc/templates/inflowOutflow/README for details
 + The setup includes an example for one named patch to be generated in the mesh
 + In snappyHexMeshDict, replace <CADregionName> with the name of region in the
   trisurface; replace <patchName> with the name of the resulting mesh patch
@@ -21,4 +21,4 @@ Initialisation
 + In the field files in the 0 directory, set initial values
 + The template includes a fixedValue boundary condition on <patchName> in 0/T
 + The user can replace <patchName> with a real mesh patch name and apply a
-  fixed temperature on that patch
\ No newline at end of file
+  fixed temperature on that patch
diff --git a/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C b/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C
index 4ae1f70db00e018dbc31d67c45aae9fb9086a28b..935084e476e49ab5b574d82320e61c0ff9b2452e 100644
--- a/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C
+++ b/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C
@@ -294,7 +294,7 @@ Foam::fileOperations::collatedFileOperation::collatedFileOperation
                    "enabled, deactivate" << nl
                 << "         threading by setting maxThreadFileBufferSize "
                     "to 0 in" << nl
-                << "         $FOAM_ETC/controlDict"
+                << "         OpenFOAM etc/controlDict"
                 << endl;
         }
 
diff --git a/wmake/scripts/have_adios2 b/wmake/scripts/have_adios2
index e5503993d6238765e4be160456762cb7835b54b0..821eea7e1be53bbc37e5d516d993c48edca48306 100644
--- a/wmake/scripts/have_adios2
+++ b/wmake/scripts/have_adios2
@@ -51,7 +51,7 @@ echo_adios2()
 }
 
 
-# Provide hint for enabling
+# Hint for enabling
 hint_adios2()
 {
     /bin/cat<<INFORMATION 1>&2
@@ -114,10 +114,10 @@ have_adios2()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -131,10 +131,9 @@ have_adios2()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -149,7 +148,7 @@ have_adios2()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_adios2
 
 # Test/query
diff --git a/wmake/scripts/have_boost b/wmake/scripts/have_boost
index 9e9d168ef59a3281973d2717e8be6cd18cca9662..d901e7a27703f4d90cbbfb95bb3f554935013b53 100644
--- a/wmake/scripts/have_boost
+++ b/wmake/scripts/have_boost
@@ -90,10 +90,10 @@ have_boost()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -107,10 +107,9 @@ have_boost()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -127,7 +126,7 @@ have_boost()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_boost
 
 # Test/query
diff --git a/wmake/scripts/have_ccmio b/wmake/scripts/have_ccmio
index c9962fcf0609f96323effb36d5dd6b387e8c7cda..c3dc3f3595156b373ca30b90feb407580402797f 100644
--- a/wmake/scripts/have_ccmio
+++ b/wmake/scripts/have_ccmio
@@ -97,7 +97,7 @@ have_ccmio()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     else
         unset prefix
     fi
@@ -110,10 +110,9 @@ have_ccmio()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -153,7 +152,7 @@ have_ccmio()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_ccmio
 
 # Test/query
diff --git a/wmake/scripts/have_cgal b/wmake/scripts/have_cgal
index e4bce0da18caba3ee5193aa4172ca76f64f0834e..ae6b9362cd6dc6bacb0c4b71c5f736a75e88fa37 100644
--- a/wmake/scripts/have_cgal
+++ b/wmake/scripts/have_cgal
@@ -90,10 +90,10 @@ have_cgal()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -107,10 +107,9 @@ have_cgal()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -127,7 +126,7 @@ have_cgal()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_cgal
 
 # Test/query
diff --git a/wmake/scripts/have_fftw b/wmake/scripts/have_fftw
index 75f0ce623bd5bedefbc8905e2ddee37dbd5991b0..17004910acb904fce5e6155c7389eaaed3a7888e 100644
--- a/wmake/scripts/have_fftw
+++ b/wmake/scripts/have_fftw
@@ -90,10 +90,10 @@ have_fftw()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -107,10 +107,9 @@ have_fftw()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -125,7 +124,7 @@ have_fftw()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_fftw
 
 # Test/query
diff --git a/wmake/scripts/have_hypre b/wmake/scripts/have_hypre
index 6ab53a8fbb7d1fce2e3888d642a30e9e2976042c..d09239ed149959291a4159069ba8ba7d2674ca62 100644
--- a/wmake/scripts/have_hypre
+++ b/wmake/scripts/have_hypre
@@ -101,10 +101,10 @@ have_hypre()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -118,10 +118,9 @@ have_hypre()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -136,7 +135,7 @@ have_hypre()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_hypre
 
 # Test/query
diff --git a/wmake/scripts/have_kahip b/wmake/scripts/have_kahip
index 78b0da6d54609fc26b9cf28a15eb87274c41404b..336a3d69c7df4539043254b3553722d2ad5d353d 100644
--- a/wmake/scripts/have_kahip
+++ b/wmake/scripts/have_kahip
@@ -98,10 +98,10 @@ have_kahip()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -115,10 +115,9 @@ have_kahip()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -136,7 +135,7 @@ have_kahip()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_kahip
 
 # Test/query
diff --git a/wmake/scripts/have_metis b/wmake/scripts/have_metis
index 7f98a420dfa7a0b3d215a5a62c920c6101250ac0..8fe54d3ad94553fb66b592658b2e7d32b22d2c66 100644
--- a/wmake/scripts/have_metis
+++ b/wmake/scripts/have_metis
@@ -98,10 +98,10 @@ have_metis()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -115,10 +115,9 @@ have_metis()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -143,7 +142,7 @@ have_metis()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_metis
 
 # Test/query
diff --git a/wmake/scripts/have_mgridgen b/wmake/scripts/have_mgridgen
index f87bd36bde10b6349da7356c9f01c2897a1e8671..50e71f3851666b0a718240b4ab423b0f58292b48 100644
--- a/wmake/scripts/have_mgridgen
+++ b/wmake/scripts/have_mgridgen
@@ -99,10 +99,10 @@ have_mgridgen()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName $libName2)"
+        library=$(findExtLib "$libName" "$libName2")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -116,12 +116,10 @@ have_mgridgen()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib/$libName2" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName2" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName2") \
+    || {
         #silent# [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -181,7 +179,7 @@ have_mgridgen()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_mgridgen
 
 # Test/query
diff --git a/wmake/scripts/have_petsc b/wmake/scripts/have_petsc
index 1a6a1d8edcf79285bb637d3b96465c4888d3ee22..7726a4ded4033155848a9ed2b534d0579c3ccbd5 100644
--- a/wmake/scripts/have_petsc
+++ b/wmake/scripts/have_petsc
@@ -41,7 +41,7 @@ no_petsc()
 }
 
 
-# Reset variables
+# Report
 echo_petsc()
 {
     echo "petsc=${HAVE_PETSC:-false}"
@@ -51,7 +51,7 @@ echo_petsc()
 }
 
 
-# Provide hint for enabling
+# Hint for enabling
 hint_petsc()
 {
     /bin/cat<<INFORMATION 1>&2
@@ -118,10 +118,10 @@ have_petsc()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
 
         # No system header, attempt discovery with pkg-config
@@ -148,10 +148,9 @@ have_petsc()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -168,7 +167,7 @@ have_petsc()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_petsc
 
 # Test/query
diff --git a/wmake/scripts/have_readline b/wmake/scripts/have_readline
index 2e6aec3ae8f1e3105555b1e4dc9c3f6d7beef944..5f32a08cedba2a28a5e83b8e3316aaad1fdf386d 100644
--- a/wmake/scripts/have_readline
+++ b/wmake/scripts/have_readline
@@ -69,10 +69,10 @@ have_readline()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -86,10 +86,9 @@ have_readline()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -105,7 +104,7 @@ have_readline()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_readline
 
 # Test/query
diff --git a/wmake/scripts/have_scotch b/wmake/scripts/have_scotch
index bb830fd9043b1774e616e533524f7c0932e286cd..87466b382d08edab4917b435ddf324dc13eefe9d 100644
--- a/wmake/scripts/have_scotch
+++ b/wmake/scripts/have_scotch
@@ -104,7 +104,7 @@ have_scotch()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
         header=$(findFirstFile \
@@ -126,10 +126,9 @@ have_scotch()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -246,10 +245,9 @@ have_ptscotch()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -265,7 +263,7 @@ have_ptscotch()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_scotch
 
 # Test/query
diff --git a/wmake/scripts/have_zoltan b/wmake/scripts/have_zoltan
index 2ae42024c32bce57c1b92b5d7f75b6ef5f97276c..5ef4073797777de06036ee015dd4bdfc07584676 100644
--- a/wmake/scripts/have_zoltan
+++ b/wmake/scripts/have_zoltan
@@ -97,10 +97,10 @@ have_zoltan()
     elif hasAbsdir "$prefix"
     then
         header=$(findFirstFile "$prefix/include/$incName")
-        library="$(findExtLib $libName)"
+        library=$(findExtLib "$libName")
     elif isSystem "$prefix"
     then
-        header=$(findFirstFile "/usr/local/include/$incName" "/usr/include/$incName")
+        header=$(findSystemInclude -name="$incName")
         prefix=$(sysPrefix "$header")
     else
         unset prefix
@@ -114,10 +114,9 @@ have_zoltan()
     }
 
     # Library
-    [ -n "$library" ] || library=$(findLibrary \
-        "$prefix/lib/$libName" \
-        "$prefix/lib$WM_COMPILER_LIB_ARCH/$libName" \
-    ) || {
+    [ -n "$library" ] \
+    || library=$(findLibrary -prefix="$prefix" -name="$libName") \
+    || {
         [ -n "$warn" ] && echo "$warn (no library)"
         return 2
     }
@@ -132,7 +131,7 @@ have_zoltan()
 }
 
 
-# Force reset of old variables
+# Reset variables
 no_zoltan
 
 # Test/query
diff --git a/wmake/scripts/sysFunctions b/wmake/scripts/sysFunctions
index a0c3daecb6a778421a2561c5cd6aa11c3a895f60..c5ce94cd227165e8bebc2663e128ebcda7edf368 100644
--- a/wmake/scripts/sysFunctions
+++ b/wmake/scripts/sysFunctions
@@ -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, distributed under GPL-3.0-or-later.
@@ -20,12 +20,18 @@
 #     isNone, isSystem, isAbsdir, hasAbsdir
 #     isDarwin, isWindows
 #     findFirstFile
+#     findSystemInclude
 #     findLibrary
 #     findExtLib
 #
 # Internal variables used
 #     extLibraries
 #
+# External variables used
+#     WM_OSTYPE  (is set for Windows)
+#     WM_COMPILER_LIB_ARCH
+#     DEB_TARGET_MULTIARCH
+#
 #------------------------------------------------------------------------------
 
 if [ -z "$WMAKE_SCRIPTS_SYSFUNCTIONS" ]
@@ -33,14 +39,19 @@ then
     # Load once, but do not rely on this variable elsewhere
     WMAKE_SCRIPTS_SYSFUNCTIONS=loaded
 
+    # Handle 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)
+    fi
+
     # True if OS is Darwin.
     isDarwin()
     {
-        test Darwin = "$(uname -s 2>/dev/null)"
+        test Darwin = "$(uname -s 2>/dev/null || true)"
     }
 
     # True if target OS is Windows
-    # Uses cached value from libso extension
     isWindows()
     {
         test MSwindows = "$WM_OSTYPE"
@@ -57,7 +68,6 @@ then
         extLibraries=".a .dll .dll.a"  # including cross-compiling
     fi
 
-
     # True if '$1' begins with '/'
     isAbsdir()
     {
@@ -145,26 +155,113 @@ then
         return 2
     }
 
+    # Check system /usr/local/include /usr/include paths
+    #
+    # On success, echoes the resolved file and returns 0, otherwise returns 2
+    #
+    # Specify -name=incName to search for
+    #
+    findSystemInclude()
+    {
+        local searchName
+
+        case "$1" in
+        -name=*)
+            searchName="${1#*=}"
+            ;;
+        esac
+
+        if [ -z "$searchName" ]
+        then
+            return 1
+        fi
+
+        findFirstFile \
+            "/usr/local/include/$searchName" \
+            "/usr/include/$searchName" \
+            ;
+    }
 
     # Check existence of library with ending '.a', '.so' ...
     #
     # On success, echoes the resolved file and returns 0, otherwise returns 2
+    #
+    # This function has two modes of operation.
+    #
+    # 1) Automated search.
+    #    Specify -prefix=dirName -name=libName 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 file ext
 
-        for file
+        searchDir=true
+
+        while [ "$searchDir" = true ] && [ "$#" -gt 0 ]
         do
-            [ -n "$file" ] || continue
-            for ext in '' $extLibraries
+            case "$1" in
+            -prefix=*)
+                prefixDir="${1#*=}"
+                shift
+                ;;
+
+            -name=*)
+                searchName="${1#*=}"
+                shift
+                ;;
+
+            (*)
+                unset searchDir
+                ;;
+            esac
+        done
+
+        if [ -n "$searchName" ]
+        then
+            # Automated search
+            # Eg, lib/ lib64/, lib/x86_64-linux-gnu
+
+            : "${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}" \
+                ;
             do
-                if [ -f "$file$ext" ] && [ -r "$file$ext" ]
-                then
-                    echo "$file$ext"  # Found
-                    return 0
-                fi
+                for ext in '' $extLibraries
+                do
+                    file="$prefixDir/$searchDir/$searchName$ext"
+                    if [ -f "$file" ] && [ -r "$file" ]
+                    then
+                        echo "$file"  # Found
+                        return 0
+                    fi
+                done
             done
-        done
+
+        else
+            # Directed search
+
+            for file
+            do
+                [ -n "$file" ] || continue
+                for ext in '' $extLibraries
+                do
+                    if [ -f "$file$ext" ] && [ -r "$file$ext" ]
+                    then
+                        echo "$file$ext"  # Found
+                        return 0
+                    fi
+                done
+            done
+        fi
 
         return 2
     }