diff --git a/bin/tools/foamConfigurePaths b/bin/tools/foamConfigurePaths
index 6d77141d90ec11637763638f276d298f45330d73..a85cff83f8b3f68d20dd7ea2c4e7995fdcd326a9 100755
--- a/bin/tools/foamConfigurePaths
+++ b/bin/tools/foamConfigurePaths
@@ -4,7 +4,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  |
+#    \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -26,7 +26,7 @@
 #     foamConfigurePaths
 #
 # Description
-#     hardcode installation directory
+#     Adjust hardcoded installation paths and versions
 #
 #------------------------------------------------------------------------------
 usage() {
@@ -35,53 +35,103 @@ usage() {
     cat<<USAGE
 
 usage: ${0##*/}
-  --foamInstall dir         specify installation directory (e.g. /opt)
-  --projectName name        specify project name (e.g. openfoam220)
-  --projectVersion ver      specify project version (e.g. 2.2.0)
-  --archOption arch         specify architecture option (only 32 or 64 applicable)
-  --paraviewInstall dir     specify ParaView_DIR (e.g. /opt/paraviewopenfoam3120)
-  --paraviewVersion ver     specify ParaView_VERSION (e.g. 3.12.0)
-  --scotchArchPath dir      specify SCOTCH_ARCH_PATH (e.g. /opt/OpenFOAM-scotch-6.0.0/)
-  --scotchVersion ver       specify SCOTCH_VERSION (e.g. 6.0.0)
+  -foamInstall dir        specify installation directory (e.g. /opt)
+  -projectName name       specify project name (e.g. openfoam220)
+  -projectVersion ver     specify project version (e.g. 2.2.0)
+  -archOption 32|64       specify architecture option
+  -label 32|64            specify label size
+  -system name            specify 'system' compiler to be used
+  -thirdParty name        specify 'ThirdParty' compiler to be used
 
-* hardcode paths to installation
+  -boost ver              specify boost_version
+  -boostArchPath dir      specify BOOST_ARCH_PATH
+  -cgal ver               specify cgal_version
+  -cgalArchPath dir       specify CGAL_ARCH_PATH
+  -clang ver              specify clang_version for ThirdParty Clang
+  -cmake ver              specify cmake_version
+  -fftw ver               specify fffw_version
+  -fftwArchPath dir       specify FFTW_ARCH_PATH
+  -metis ver              specify METIS_VERSION
+  -metisArchPath dir      specify METIS_ARCH_PATH
+  -paraview ver           specify ParaView_VERSION (e.g. 3.12.0)
+  -paraviewInstall dir    specify ParaView_DIR (e.g. /opt/paraviewopenfoam3120)
+  -scotch ver             specify SCOTCH_VERSION (e.g. 6.0.0)
+  -scotchArchPath dir     specify SCOTCH_ARCH_PATH (e.g. /opt/OpenFOAM-scotch-6.0.0/)
+
+* Adjust hardcoded installation paths and versions
 
 USAGE
     exit 1
 }
 
+# Report error and exit
+die()
+{
+    exec 1>&2
+    echo
+    echo "Error: see '${0##*/} -help' for usage"
+    while [ "$#" -ge 1 ]; do echo "    $1"; shift; done
+    echo
+    exit 1
+}
+
 
 # Function to do replacement on file. Checks if any replacement has been done.
 # _inlineSed <file> <regexp> <replacement> <msg>
 _inlineSed()
 {
-    file="$1"
+    local file="$1"
+    local regexp="$2"
+    local replacement="$3"
+    local msg="$4"
+    local cmd='/^[^#]/s@'"$regexp"'@'"$replacement"'@'
 
     [ -f "$file" ] || {
         echo "Missing file: $file"
-        exit 1
+        exit 2 # Fatal
     }
 
-    regexp="$2"
-    replacement="$3"
-    msg="$4"
+    grep -q "$regexp" "$file" && sed -i -e "$cmd" "$file" || { \
+        echo "Failed: $msg in $file"
+        return 1
+    }
 
-    cmd='/^[^#]/s@'"$regexp"'@'"$replacement"'@'
+    echo "Okay: $msg in $file"
+    return 0
+}
 
-    grep -q "$regexp" "$file" && sed -i -e "$cmd" "$file" || \
-        (echo "Failed: $msg in $file" && exit 1)
 
-    echo "Okay: $msg in $file"
+# Standard <key> <val> type of replacements.
+# replace <file> <key1> <val1> .. <keyN> <valN>
+# looks for KEYWORD=.*
+replace()
+{
+    local file="$1"
+    shift
 
-    return 0
+    local key
+    local val
+
+    while [ "$#" -ge 2 ]
+    do
+        key=$1
+        val=$2
+        shift 2
+
+        _inlineSed \
+            $file \
+            "$key=.*" \
+            "$key=$val" \
+            "Replacing $key setting by '$val'"
+    done
 }
 
 
 [ -f etc/bashrc ] || usage "Please run from top-level directory of installation"
 
-unset foamInstDir projectName projectVersion archOption
-unset paraviewInstall scotchArchPath
+#------------------------------------------------------------------------------
 
+unset adjusted
 # Parse options
 while [ "$#" -gt 0 ]
 do
@@ -89,131 +139,213 @@ do
     -h | -help | --help)
         usage
         ;;
+
     -foamInstall | --foamInstall)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
-        foamInstDir="$2"
         # Replace FOAM_INST_DIR=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        foamInstDir="$2"
         _inlineSed \
             etc/bashrc \
             '\(.*BASH_SOURCE.*\)' \
-            '#\1' \
+            '##\1' \
             "Removing default FOAM_INST_DIR setting"
         _inlineSed \
             etc/bashrc \
-            '^export FOAM_INST_DIR=.*' \
-            'export FOAM_INST_DIR='"$foamInstDir" \
+            '^ *FOAM_INST_DIR=.*' \
+            'FOAM_INST_DIR='"$foamInstDir" \
             "Setting FOAM_INST_DIR to '$foamInstDir'"
-        shift 2
+
+        adjusted=true
+        shift
         ;;
+
    -projectName | --projectName)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
+        # Replace WM_PROJECT_DIR=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
         projectName="$2"
-        # replace WM_PROJECT_DIR=...
         _inlineSed \
             etc/bashrc \
             'WM_PROJECT_DIR=.*' \
             'WM_PROJECT_DIR=$WM_PROJECT_INST_DIR/'"$projectName" \
             "Replacing WM_PROJECT_DIR setting by $projectName"
-        shift 2
+
+        adjusted=true
+        shift
         ;;
-   --projectVersion)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
-        projectVersion="$2"
-        # replace WM_PROJECT_VERSION=...
-        echo "Replacing WM_PROJECT_VERSION setting by $projectVersion"
-        _inlineSed \
-            etc/bashrc \
-            'WM_PROJECT_VERSION=.*' \
-            'WM_PROJECT_VERSION='"$projectVersion" \
-            "Replacing WM_PROJECT_VERSION setting by $projectVersion"
 
-        shift 2
+   -projectVersion | --projectVersion)
+        # Replace WM_PROJECT_VERSION=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/bashrc  WM_PROJECT_VERSION "$2"
+        adjusted=true
+        shift
         ;;
+
     -archOption | --archOption)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
+        # Replace WM_ARCH_OPTION=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
         archOption="$2"
-        current_archOption=`grep WM_ARCH_OPTION= etc/bashrc | sed "s/export WM_ARCH_OPTION=//"`
-        if [ "$archOption" != "$current_archOption" ]
+        current="$(sed -ne '/^[^#]/s/^.* WM_ARCH_OPTION=//p' etc/bashrc)"
+        if [ "$archOption" = "$current" ]
         then
-            # replace WM_ARCH_OPTION=...
-            _inlineSed \
-                etc/bashrc \
-                'WM_ARCH_OPTION=.*' \
-                'WM_ARCH_OPTION='"$archOption" \
-                "Replacing WM_ARCH_OPTION setting by '$archOption'"
-        else
             echo "WM_ARCH_OPTION already set to $archOption"
+        else
+            replace etc/bashrc  WM_ARCH_OPTION "$2"
         fi
-        shift 2
+        adjusted=true
+        shift
         ;;
+
+    -label)
+        # Replace WM_LABEL_SIZE=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/bashrc  WM_LABEL_SIZE "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -system)
+        # Replace WM_COMPILER_TYPE=... and WM_COMPILER=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/bashrc  WM_COMPILER_TYPE system  WM_COMPILER "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -third[Pp]arty)
+        # Replace WM_COMPILER_TYPE=... and WM_COMPILER=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/bashrc  WM_COMPILER_TYPE ThirdParty  WM_COMPILER "$2"
+        adjusted=true
+        shift
+        ;;
+
+
+    -boost)
+        # Replace boost_version=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/CGAL  boost_version "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -boostArchPath)
+        # Replace BOOST_ARCH_PATH=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/CGAL  BOOST_ARCH_PATH "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -cgal)
+        # Replace cgal_version=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/CGAL  cgal_version "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -cgalArchPath)
+        # Replace CGAL_ARCH_PATH=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/CGAL  CGAL_ARCH_PATH "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -fftw)
+        # Replace fftw_version=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/FFTW  fftw_version "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -fftwArchPath)
+        # Replace FFTW_ARCH_PATH=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/FFTW  FFTW_ARCH_PATH "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -clang)
+        # Replace clang_version=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/compiler  clang_version "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -cmake)
+        # Replace cmake_version=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/paraview  cmake_version "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -paraview | -paraviewVersion | --paraviewVersion)
+        # Replace ParaView_VERSION=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/paraview  ParaView_VERSION "$2"
+        adjusted=true
+        shift
+        ;;
+
     -paraviewInstall | --paraviewInstall)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
-        paraviewInstall="$2"
-        # replace ParaView_DIR=...
-        _inlineSed \
-            etc/config.sh/paraview \
-            'ParaView_DIR=.*' \
-            'ParaView_DIR='"$paraviewInstall" \
-            "Replacing ParaView_DIR setting by '$paraviewInstall'"
-        shift 2
+        # Replace ParaView_DIR=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/paraview  ParaView_DIR "$2"
+        adjusted=true
+        shift
         ;;
-    -paraviewVersion | --paraviewVersion)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
-        paraviewVersion="$2"
-        # replace ParaView_VERSION=...
-        _inlineSed \
-            etc/config.sh/paraview \
-            'ParaView_VERSION=.*' \
-            'ParaView_VERSION='"$paraviewVersion" \
-            "Replacing ParaView_VERSION setting by '$paraviewVersion'"
-        shift 2
+
+    -metis)
+        # Replace METIS_VERSION=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/metis  METIS_VERSION "$2"
+        adjusted=true
+        shift
         ;;
-    -scotchVersion | --scotchVersion)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
-        scotchVersion="$2"
-        _inlineSed \
-            etc/config.sh/scotch \
-            'SCOTCH_VERSION=.*' \
-            'SCOTCH_VERSION='"$scotchVersion" \
-            "Replacing SCOTCH_VERSION setting by '$scotchVersion'"
-        shift 2
+
+    -metisArchPath)
+        # Replace METIS_ARCH_PATH=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/metis  METIS_ARCH_PATH "$2"
+        adjusted=true
+        shift
+        ;;
+
+    -scotch | -scotchVersion | --scotchVersion)
+        # Replace SCOTCH_VERSION=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/scotch  SCOTCH_VERSION "$2"
+        adjusted=true
+        shift
         ;;
+
     -scotchArchPath | --scotchArchPath)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
-        scotchArchPath="$2"
-        _inlineSed \
-            etc/config.sh/scotch \
-            'SCOTCH_ARCH_PATH=.*' \
-            'SCOTCH_ARCH_PATH='"$scotchArchPath" \
-            "Replacing SCOTCH_ARCH_PATH setting by '$scotchArchPath'"
-        shift 2
+        # Replace SCOTCH_ARCH_PATH=...
+        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
+        replace etc/config.sh/scotch  SCOTCH_ARCH_PATH "$2"
+        adjusted=true
+        shift
         ;;
+
     *)
-        usage "unknown option/argument: '$*'"
+        die "unknown option/argument: '$1'"
         ;;
     esac
+    shift
 done
 
-[ -n "$foamInstDir" -o -n "$projectName" -o -n "$projectVersion" -o -n "$archOption" \
--o -n "$paraviewInstall" -o -n "$paraviewVersion" \
--o -n "$scotchVersion" -o -n "$scotchArchPath" \
-] || usage "Please specify at least one configure option"
-
-#echo "Replacing WM_PROJECT setting by '$projectName'"
-#sed -i -e 's@WM_PROJECT=.*@WM_PROJECT='"$projectName@" etc/bashrc
+[ -n "$adjusted" ] || die "Please specify at least one configure option"
 
 # Set WM_MPLIB=SYSTEMOPENMPI always
-_inlineSed \
-    etc/bashrc \
-    'export WM_MPLIB=.*' \
-    'export WM_MPLIB=SYSTEMOPENMPI' \
-    "Replacing WM_MPLIB setting by 'SYSTEMOPENMPI'"
-
-## set WM_COMPILER_TYPE=system always
-#_inlineSed \
-#    etc/bashrc \
-#    'WM_COMPILER_TYPE=.*' \
-#    'WM_COMPILER_TYPE=system' \
-#    "Replacing WM_COMPILER_TYPE setting by 'system'"
+replace etc/bashrc  WM_MPLIB SYSTEMOPENMPI
+
+## Set WM_COMPILER_TYPE=system always
+# replace etc/bashrc  WM_COMPILER_TYPE system
 
 #------------------------------------------------------------------------------
diff --git a/etc/config.sh/metis b/etc/config.sh/metis
index 70260f97f06ffd0b6ffc24288569863cf2ba3eff..54ecba0466f1ca42f435a30cac6953f9c2e52d9d 100644
--- a/etc/config.sh/metis
+++ b/etc/config.sh/metis
@@ -28,13 +28,33 @@
 #     Setup file for metis include/libraries.
 #     Sourced during wmake process only.
 #
+#     Normally used to specify the metis version and location for a
+#     ThirdParty installation.
+#
+#     If using system-wide installations, use the following setting:
+#
+#         METIS_VERSION=metis-system
+#
+#     If the system metis is unusable (eg, too old) and you don't
+#     have or want a ThirdParty installation:
+#
+#         METIS_VERSION=metis-none
+#
+#     If using a central installation, but not located under ThirdParty:
+#         - specify metis-system
+#         - provide full paths for METIS_ARCH_PATH
+#
 # Note
 #     A csh version is not needed, since the values here are only sourced
-#     during the wmake process
+#     during the wmake process.
+#
+#     Metis can also be entirely disabled, by either renaming this file or
+#     by creating an empty one with the same name at a user or site location.
 #
 #------------------------------------------------------------------------------
 
-export METIS_VERSION=metis-5.1.0
+METIS_VERSION=metis-5.1.0
+
 export METIS_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER$WM_PRECISION_OPTION$WM_LABEL_OPTION/$METIS_VERSION
 
 #------------------------------------------------------------------------------
diff --git a/etc/config.sh/scotch b/etc/config.sh/scotch
index 7f9800965d8bbe9734700c74c5459bad503cf4a1..203f394eb930e2ed5caf77140b689c180543bae8 100644
--- a/etc/config.sh/scotch
+++ b/etc/config.sh/scotch
@@ -28,16 +28,33 @@
 #     Setup file for scotch include/libraries.
 #     Sourced during wmake process only.
 #
+#     Normally used to specify the metis version and location for a
+#     ThirdParty installation.
+#
+#     If using system-wide installations, use the following setting:
+#
+#         SCOTCH_VERSION=scotch-system
+#
+#     If the system scotch is unusable (eg, too old) and you don't
+#     have or want a ThirdParty installation:
+#
+#         SCOTCH_VERSION=scotch-none
+#
+#     If using a central installation, but not located under ThirdParty:
+#         - specify scotch-system
+#         - provide full path for SCOTCH_ARCH_PATH
+#
 # Note
 #     A csh version is not needed, since the values here are only sourced
-#     during the wmake process
+#     during the wmake process.
 #
-#     If Scotch is to be entirely disabled, either rename this file or create
-#     an empty one with the same name at a user or site location.
+#     Scotch can also be entirely disabled, by either renaming this file or
+#     by creating an empty one with the same name at a user or site location.
 #
 #------------------------------------------------------------------------------
 
-export SCOTCH_VERSION=scotch_6.0.3
+SCOTCH_VERSION=scotch_6.0.3
+
 export SCOTCH_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER$WM_PRECISION_OPTION$WM_LABEL_OPTION/$SCOTCH_VERSION
 
 #------------------------------------------------------------------------------
diff --git a/src/Pstream/Allwmake b/src/Pstream/Allwmake
index a73b43cf0328962877b75544545502cf5683e634..d32bc5503d76e5013e50e96930b5a869903e7714 100755
--- a/src/Pstream/Allwmake
+++ b/src/Pstream/Allwmake
@@ -10,27 +10,26 @@ cd ${0%/*} || exit 1    # Run from this directory
 # use sentinel file to handle version changes
 wmakeMpiLib()
 {
-    set +x
     for libName
     do
     (
         WM_OPTIONS="$WM_OPTIONS$WM_MPLIB"
-        whichmpi="$WM_PROJECT_DIR/platforms/$WM_OPTIONS/src/Pstream/$libName/using:$FOAM_MPI"
+        libDir="$WM_PROJECT_DIR/platforms/$WM_OPTIONS/src/Pstream/$libName"
+        whichmpi="$libDir/using:$FOAM_MPI"
         [ -e "$whichmpi" ] || wclean $libName
         echo "wmake $targetType $libName"
         wmake $targetType $libName
+        mkdir -p "$libDir"
         touch "$whichmpi"
     )
     done
-    set -x
 }
 
-set -x
+echo "wmake $targetType dummy"
 wmake $targetType dummy
 
 case "$WM_MPLIB" in
 *MPI*)
-    set +x
     wmakeMpiLib mpi
     ;;
 esac
diff --git a/src/parallel/decompose/Allwmake b/src/parallel/decompose/Allwmake
index 9be81484758a98b4a90dcfd10a735bf4f1ee719b..cf42f4c0bee22fc4f174a8b167dadb60afc0258f 100755
--- a/src/parallel/decompose/Allwmake
+++ b/src/parallel/decompose/Allwmake
@@ -4,88 +4,196 @@ cd ${0%/*} || exit 1    # Run from this directory
 # Parse arguments for library compilation
 . $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments
 
-unset METIS_ARCH_PATH SCOTCH_ARCH_PATH
 
-# get METIS_VERSION, METIS_ARCH_PATH
-if settings=$($WM_PROJECT_DIR/bin/foamEtcFile config.sh/metis)
-then
+# Extract an integer value from '#define NAME ...'
+getIntDefine()
+{
+    local name="$1"
+    local file="$2"
+    local val=$(sed -ne \
+        's/^[ tab]*#[ tab]*define[ tab][ tab]*'"$name"'[ tab][ tab]*\([1-9][0-9]\).*/\1/p' \
+        "$file")
+    echo "${val:-0}"
+}
+
+
+# Test for metis.
+# - return 0 and export METIS_ARCH_PATH on success
+hasMetis()
+{
+    echo
+    echo "Metis decomposition"
+
+    unset METIS_ARCH_PATH METIS_VERSION
+    settings=$($WM_PROJECT_DIR/bin/foamEtcFile config.sh/metis) || {
+        echo
+        echo "Error: no config.sh/metis settings"
+        echo
+        return 1
+    }
+
     . $settings
+    if [ -z "$METIS_ARCH_PATH" -o "${METIS_ARCH_PATH##*-}" = none ]
+    then
+        echo "   skipping - no metis"
+        echo
+        return 1
+    fi
+
+    # Header
+    local header=$METIS_ARCH_PATH/include/metis.h
+    if [ "${METIS_ARCH_PATH##*-}" = system ]
+    then
+        [ -f "$header" ] || header=/usr/include/metis.h
+    fi
+    [ -f "$header" ] || {
+        echo "    skipping - no metis header"
+        echo
+        return 2  # file not found
+    }
+
+    # Library
+    [ -r $FOAM_EXT_LIBBIN/libmetis.so ] || \
+    [ -r $METIS_ARCH_PATH/lib$WM_COMPILER_LIB_ARCH/libmetis.so ] || \
+    [ "${METIS_ARCH_PATH##*-}" = system ] || {
+        echo "   skipping - missing library"
+        echo
+        return 2
+    }
+
+    # Ensure consistent sizes between OpenFOAM and metis header
+    local label=$(getIntDefine  IDXTYPEWIDTH  $header)
+    local scalar=$(getIntDefine REALTYPEWIDTH $header)
+
+    [ "$WM_LABEL_SIZE" = "$label" ] || {
+        echo "   skipping - label=$WM_LABEL_SIZE, metis.h has '$label'"
+        echo
+        return 1
+    }
+
+    [ "$WM_PRECISION_OPTION" = SP -a "$scalar" = 32 ] || \
+    [ "$WM_PRECISION_OPTION" = DP -a "$scalar" = 64 ] || {
+        echo "   skipping - scalar='$WM_PRECISION_OPTION', metis.h has '$scalar'"
+        echo
+        return 1
+    }
+
     echo "using METIS_ARCH_PATH=$METIS_ARCH_PATH"
-else
+    echo "    label=$label, scalar=$scalar"
     echo
-    echo "Error: no config.sh/metis settings"
+    export METIS_ARCH_PATH
+    return 0 # success
+}
+
+
+# Test for scotch.
+# - return 0 and export SCOTCH_ARCH_PATH, SCOTCH_VERSION on success
+hasScotch()
+{
     echo
-fi
+    echo "Scotch decomposition"
+
+    unset SCOTCH_ARCH_PATH SCOTCH_VERSION
+    settings=$($WM_PROJECT_DIR/bin/foamEtcFile config.sh/scotch) || {
+        echo
+        echo "Error: no config.sh/scotch settings"
+        echo
+        return 1
+    }
 
-# get SCOTCH_VERSION, SCOTCH_ARCH_PATH
-if settings=$($WM_PROJECT_DIR/bin/foamEtcFile config.sh/scotch)
-then
     . $settings
+    if [ -z "$SCOTCH_ARCH_PATH" -o "${SCOTCH_ARCH_PATH##*-}" = none ]
+    then
+        echo "    skipping - no scotch"
+        echo
+        return 1
+    fi
+
+    # Header
+    local header=$SCOTCH_ARCH_PATH/include/scotch.h
+    if [ "${SCOTCH_ARCH_PATH##*-}" = system ]
+    then
+        [ -f "$header" ] || header=/usr/include/scotch.h
+    fi
+    [ -f "$header" ] || {
+        echo "    skipping - no scotch header"
+        echo
+        return 2  # file not found
+    }
+
+    # Library
+    [ -r $FOAM_EXT_LIBBIN/libscotch.so ] || \
+    [ -r $SCOTCH_ARCH_PATH/lib$WM_COMPILER_LIB_ARCH/libscotch.so ] || \
+    [ "${SCOTCH_ARCH_PATH##*-}" = system ] || {
+        echo "    skipping - missing library"
+        echo
+        return 2
+    }
+
+    # Ensure consistent sizes between OpenFOAM and scotch header
+    # extract 'typedef int64_t SCOTCH_Num' or equivalent
+    local label=$(sed -ne \
+        's/^.*typedef *\([^ ]*\) *SCOTCH_Num.*/\1/ip' \
+        "$header")
+
+    : ${label:=unknown}
+    [ "$WM_LABEL_SIZE" = 32 -a \( "$label" = int32_t -o "$label" = int  \) ] || \
+    [ "$WM_LABEL_SIZE" = 64 -a \( "$label" = int64_t -o "$label" = long \) ] || {
+        echo "   skipping - label='$WM_LABEL_SIZE', scotch.h has '$label'"
+        echo
+        return 1
+    }
+
     echo "using SCOTCH_ARCH_PATH=$SCOTCH_ARCH_PATH"
-else
+    echo "    label=$label ($WM_LABEL_SIZE)"
     echo
-    echo "Error: no config.sh/scotch settings"
-    echo
-fi
+    export SCOTCH_ARCH_PATH SCOTCH_VERSION
+    return 0 # success
+}
 
 
 #
-# define how to create an mpi-versioned library of $targetType
+# Define how to create an mpi-versioned library of $targetType
 # compile into qualified directory
-# use sentinel file to handle version changes
+# use sentinel file(s) to handle version changes
 #
 wmakeMpiLib()
 {
-    set +x
+    local decompName="$1"
+    shift
     for libName
     do
     (
         WM_OPTIONS="$WM_OPTIONS$WM_MPLIB"
         libDir="$WM_PROJECT_DIR/platforms/$WM_OPTIONS/src/parallel/decompose/$libName"
         whichmpi="$libDir/using:$FOAM_MPI"
-        whichscotch="$libDir/using:$SCOTCH_VERSION"
-        [ -e "$whichmpi" -a -e "$whichscotch" ] || wclean $libName
+        whichdecomp="$libDir/using:$decompName"
+        [ -e "$whichmpi" -a -e "$whichdecomp" ] || wclean $libName
         echo "wmake $targetType $libName"
         wmake $targetType $libName
         mkdir -p "$libDir"
-        touch "$whichmpi" "$whichscotch"
+        touch "$whichdecomp" "$whichmpi"
     )
     done
-    set -x
 }
 
-set -x
-
 wmakeLnInclude decompositionMethods
 
-if [ -f $SCOTCH_ARCH_PATH/include/scotch.h \
-  -a -r $FOAM_EXT_LIBBIN/libscotch.so ]
+if hasScotch
 then
     wmake $targetType scotchDecomp
     if [ -d "$FOAM_LIBBIN/$FOAM_MPI" ]
     then
-        wmakeMpiLib ptscotchDecomp
+        wmakeMpiLib "$SCOTCH_VERSION" ptscotchDecomp
     fi
-else
-    echo
-    echo "Skipping scotchDecomp (ptscotchDecomp)"
-    echo
 fi
 
-
-if [ -f $METIS_ARCH_PATH/include/metis.h \
-  -a -r $FOAM_EXT_LIBBIN/libmetis.so ]
+if hasMetis
 then
     wmake $targetType metisDecomp
-else
-    echo
-    echo "Skipping metisDecomp: metis not installed"
-    echo
 fi
 
-
 wmake $targetType decompositionMethods
-
 wmake $targetType decompose
 
 #------------------------------------------------------------------------------
diff --git a/src/parallel/decompose/metisDecomp/Make/options b/src/parallel/decompose/metisDecomp/Make/options
index fdb35bf1e2708ee79d78d32fa176b3c28e864d6f..b1cce000a224b0c26b948b45f8f2ff35b76083ba 100644
--- a/src/parallel/decompose/metisDecomp/Make/options
+++ b/src/parallel/decompose/metisDecomp/Make/options
@@ -3,6 +3,11 @@ EXE_INC = \
     -I$(METIS_ARCH_PATH)/include \
     -I../decompositionMethods/lnInclude
 
+/*
+ * The $(METIS_ARCH_PATH)/lib$WM_COMPILER_LIB_ARCH path is provided
+ * to support central, non-thirdparty installations
+ */
 LIB_LIBS = \
+    -L$(METIS_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \
     -L$(FOAM_EXT_LIBBIN) \
     -lmetis
diff --git a/src/parallel/decompose/ptscotchDecomp/Make/options b/src/parallel/decompose/ptscotchDecomp/Make/options
index 37286e91aa0141ba5cb8ca0dd7e918e583ce3d6d..9dab60dab532e6a17060875beb81a7fe6f6316a8 100644
--- a/src/parallel/decompose/ptscotchDecomp/Make/options
+++ b/src/parallel/decompose/ptscotchDecomp/Make/options
@@ -11,8 +11,12 @@ EXE_INC = \
 /*
  * The '-lscotch' is a slight hack:
  * ptscotch 6 requires scotch linked in, but does not declare the dependency
+ *
+ * The $(SCOTCH_ARCH_PATH)/lib$WM_COMPILER_LIB_ARCH path is provided
+ * to support central, non-thirdparty installations
  */
 LIB_LIBS = \
+    -L$(SCOTCH_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \
     -L$(FOAM_EXT_LIBBIN) \
     -L$(FOAM_EXT_LIBBIN)/$(FOAM_MPI) \
     -lptscotch \
diff --git a/src/parallel/decompose/scotchDecomp/Make/options b/src/parallel/decompose/scotchDecomp/Make/options
index 4bee67053c2708e0acf1a5f9626c526d1d15bc1e..5cc3e25d8c19332e66727b17a67ee5b1d7cacca3 100644
--- a/src/parallel/decompose/scotchDecomp/Make/options
+++ b/src/parallel/decompose/scotchDecomp/Make/options
@@ -11,7 +11,12 @@ EXE_INC = \
     -I/usr/include/scotch \
     -I../decompositionMethods/lnInclude
 
+/*
+ * The $(SCOTCH_ARCH_PATH)/lib$WM_COMPILER_LIB_ARCH path is provided
+ * to support central, non-thirdparty installations
+ */
 LIB_LIBS = \
+    -L$(SCOTCH_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \
     -L$(FOAM_EXT_LIBBIN) \
     -lscotch \
     -lscotcherrexit \