diff --git a/applications/utilities/postProcessing/graphics/PVReaders/Allwclean b/applications/utilities/postProcessing/graphics/PVReaders/Allwclean
index 7a429617b84a99edaa33237a9100d2346181cdcd..f9777f02d2b82c875811dfe27d0181a3370b700d 100755
--- a/applications/utilities/postProcessing/graphics/PVReaders/Allwclean
+++ b/applications/utilities/postProcessing/graphics/PVReaders/Allwclean
@@ -1,10 +1,8 @@
 #!/bin/sh
-cd ${0%/*} || exit 1    # Run from this directory
+cd ${0%/*} || exit 1                            # Run from this directory
+. $WM_PROJECT_DIR/wmake/scripts/wmakeFunctions  # Source wmake functions
 
-# Source the wmake functions
-. $WM_PROJECT_DIR/wmake/scripts/wmakeFunctions
-
-# Cleanup OpenFOAM libraries
+# Cleanup libraries
 wclean libso foamPv
 wclean libso vtkPVblockMesh
 wclean libso vtkPVFoam
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/Allwmake b/applications/utilities/postProcessing/graphics/PVReaders/Allwmake
index ade3a2637901dfd515dbfd1029137687b2c3aa1e..babf98f51abd64d36026d8de9c4c30878cc394b9 100755
--- a/applications/utilities/postProcessing/graphics/PVReaders/Allwmake
+++ b/applications/utilities/postProcessing/graphics/PVReaders/Allwmake
@@ -2,7 +2,7 @@
 cd ${0%/*} || exit 1                            # Run from this directory
 export WM_CONTINUE_ON_ERROR=true                # Optional unit
 . $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments
-. $WM_PROJECT_DIR/wmake/scripts/cmakeFunctions  # The CMake functions
+. $WM_PROJECT_DIR/wmake/scripts/paraviewFunctions  # CMake and PV functions
 
 # -----------------------------------------------------------------------------
 
@@ -13,31 +13,19 @@ warnIncomplete()
     echo
 }
 
-# major version as per paraview include directory:
-# Eg, "PREFIX/include/paraview-5.0" -> "5.0"
-major="${ParaView_INCLUDE_DIR##*-}"
+if have_pvplugin_support
+then
+(
+    wmakeLibPv foamPv
+    wmakeLibPv vtkPVblockMesh
+    wmakeLibPv vtkPVFoam
 
-case "$major" in
-[45].[0-9]*)
-    if canBuildPlugin
+    if [ "$targetType" != objects ]
     then
-    (
-        wmakeLibPv foamPv
-        wmakeLibPv vtkPVblockMesh
-        wmakeLibPv vtkPVFoam
-
-        if [ "$targetType" != objects ]
-        then
-            cmakePv $PWD/PVblockMeshReader || warnIncomplete "BlockMesh"
-            cmakePv $PWD/PVFoamReader || warnIncomplete "OpenFOAM"
-        fi
-    )
+        cmakePv $PWD/PVblockMeshReader || warnIncomplete "BlockMesh"
+        cmakePv $PWD/PVFoamReader || warnIncomplete "OpenFOAM"
     fi
-    ;;
-*)
-    echo "==> skip build of ParaView plugins"
-    echo "    include directory was for paraview major version '${major:-none}'"
-    ;;
-esac
+)
+fi
 
 #------------------------------------------------------------------------------
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/CMakeLists-Project.txt b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/CMakeLists-Project.txt
index 0adeba5198324474a49bca71f9fbf1fdede1b70e..9b8673260d47913d75aadc0b27394dbdfa9c7d28 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/CMakeLists-Project.txt
+++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/CMakeLists-Project.txt
@@ -26,7 +26,7 @@ set(OPENFOAM_LIBRARIES
 
 # Set output library destination to plugin directory
 set(
-    LIBRARY_OUTPUT_PATH $ENV{PV_PLUGIN_PATH}
+    LIBRARY_OUTPUT_PATH $ENV{FOAM_PV_PLUGIN_LIBBIN}
     CACHE INTERNAL
     "Single output directory for building all libraries."
 )
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/CMakeLists-Project.txt b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/CMakeLists-Project.txt
index 544f3a5478e3b168303d9f92cab62aa7fcf667b5..1b35d22bbe459641e4aa1ae97a6e7fefc20abfdf 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/CMakeLists-Project.txt
+++ b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/CMakeLists-Project.txt
@@ -20,7 +20,7 @@ set(OPENFOAM_LIBRARIES
 
 # Set output library destination to plugin directory
 set(
-    LIBRARY_OUTPUT_PATH $ENV{PV_PLUGIN_PATH}
+    LIBRARY_OUTPUT_PATH $ENV{FOAM_PV_PLUGIN_LIBBIN}
     CACHE INTERNAL
     "Single output directory for building all libraries."
 )
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/foamPv/Make/options b/applications/utilities/postProcessing/graphics/PVReaders/foamPv/Make/options
index bf52ca3659192b5a93d48a69a97287a2f3328b93..b13d6d0a9c6fa04ea3b02277cd3bb1e8f02d04e4 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/foamPv/Make/options
+++ b/applications/utilities/postProcessing/graphics/PVReaders/foamPv/Make/options
@@ -1,11 +1,9 @@
-sinclude $(GENERAL_RULES)/paraview
-
 EXE_INC = \
     ${c++LESSWARN} \
     -I$(LIB_SRC)/conversion/lnInclude \
     -I$(LIB_SRC)/finiteVolume/lnInclude \
-    -I$(ParaView_INCLUDE_DIR) \
-    -I$(ParaView_INCLUDE_DIR)/vtkkwiml
+    -I$(PARAVIEW_INC_DIR) \
+    -I$(PARAVIEW_INC_DIR)/vtkkwiml
 
 LIB_LIBS = \
     $(GLIBS)
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/Make/options b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/Make/options
index ec74dc17d9a37d8d6158b4f3d54733ebed776fcc..1d993b65d7c4aa3fab02bb4fabcf149ae5ba03c5 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/Make/options
+++ b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/Make/options
@@ -1,5 +1,3 @@
-sinclude $(GENERAL_RULES)/paraview
-
 EXE_INC = \
     ${c++LESSWARN} \
     -I$(LIB_SRC)/meshTools/lnInclude \
@@ -9,8 +7,8 @@ EXE_INC = \
     -I$(LIB_SRC)/lagrangian/basic/lnInclude \
     -I$(LIB_SRC)/fileFormats/lnInclude \
     -I$(LIB_SRC)/conversion/lnInclude \
-    -I$(ParaView_INCLUDE_DIR) \
-    -I$(ParaView_INCLUDE_DIR)/vtkkwiml \
+    -I$(PARAVIEW_INC_DIR) \
+    -I$(PARAVIEW_INC_DIR)/vtkkwiml \
     -I../foamPv \
     -I../PVFoamReader
 
@@ -20,5 +18,5 @@ LIB_LIBS = \
     -lconversion \
     -lgenericPatchFields \
     -llagrangian \
-    -L$(FOAM_LIBBIN) -lfoamPv-pv${ParaView_MAJOR} \
+    -L$(FOAM_LIBBIN) -lfoamPv-pv$(PARAVIEW_MAJMIN) \
     $(GLIBS)
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVblockMesh/Make/options b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVblockMesh/Make/options
index dc1999774ae074868515f8be03f201ef1b8e6507..c06b4bb3de04bed876e07b43a2611f9f5d8dec3a 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVblockMesh/Make/options
+++ b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVblockMesh/Make/options
@@ -1,18 +1,16 @@
-sinclude $(GENERAL_RULES)/paraview
-
 EXE_INC = \
     ${c++LESSWARN} \
     -I$(LIB_SRC)/fileFormats/lnInclude \
     -I$(LIB_SRC)/conversion/lnInclude \
     -I$(LIB_SRC)/meshTools/lnInclude \
     -I$(LIB_SRC)/mesh/blockMesh/lnInclude \
-    -I$(ParaView_INCLUDE_DIR) \
-    -I$(ParaView_INCLUDE_DIR)/vtkkwiml \
+    -I$(PARAVIEW_INC_DIR) \
+    -I$(PARAVIEW_INC_DIR)/vtkkwiml \
     -I../foamPv \
     -I../PVblockMeshReader
 
 LIB_LIBS = \
     -lmeshTools \
     -lblockMesh \
-    -L$(FOAM_LIBBIN) -lfoamPv-pv${ParaView_MAJOR} \
+    -L$(FOAM_LIBBIN) -lfoamPv-pv$(PARAVIEW_MAJMIN) \
     $(GLIBS)
diff --git a/bin/paraFoam b/bin/paraFoam
index 93a95e69ec7e78c68d7c7ceb9f679aa607f3aef0..5a82bd58078b30536d0897e78d43fbedfaed176f 100755
--- a/bin/paraFoam
+++ b/bin/paraFoam
@@ -88,37 +88,32 @@ do
     -block*)
         extension=blockMesh
         plugin=PVblockMeshReader
-        shift
         ;;
     -vtk | -built*)
         extension=foam
         unset plugin
-        shift
         ;;
     -case)
         [ "$#" -ge 2 ] || die "'$1' option requires an argument"
         cd "$2" 2>/dev/null || die "directory does not exist: '$2'"
-        shift 2
+        shift
         ;;
     -region)
         [ "$#" -ge 2 ] || die "'$1' option requires an argument"
         regionName=$2
-        shift 2
+        shift
         ;;
     -touch)
         optTouch=true
         unset plugin
-        shift
         ;;
     -touch-all | -touchAll)
         optTouch=all
         unset plugin
-        shift
         ;;
     -touch-proc*)
         optTouch=processor
         unset plugin
-        shift
         ;;
     --)
         shift
@@ -130,59 +125,65 @@ do
         exit 1   # This should not have happened
         ;;
     --*)
-        break    # Stop here, treat this and balance as paraview options
+        break    # Stop here, treat _this_ and balance as paraview options
         ;;
     *)
-        die "unknown option/argument: '$1'"
+        die "Unknown option/argument: '$1'"
         ;;
     esac
+    shift
 done
 
-# If a reader module is needed, check that it exists
-[ -z "$plugin" ] || [ -f "$PV_PLUGIN_PATH/lib${plugin}_SM.so" ] || {
-    cat<< BUILDREADER 1>&2
-
-ERROR: ParaView reader module library ($plugin) does not exist
-Please build the reader module before continuing:
+if [ -n "$plugin" ]
+then
+    pluginError="Cannot use ParaView reader module library ($plugin)"
 
+    # Check if requested reader module exists
+    if [ -z "$PV_PLUGIN_PATH" ]
+    then
+        echo "$pluginError" 1>&2
+        echo "The PV_PLUGIN_PATH environment value is not set" 1>&2
+    elif [ -f "$PV_PLUGIN_PATH/lib${plugin}_SM.so" ]
+    then
+        unset pluginError
+    else
+        echo "$pluginError - not built?" 1>&2
+        cat<< NO_PLUGIN 1>&2
+Consider building the reader module
     cd \$WM_PROJECT_DIR/applications/utilities/postProcessing/graphics/PVReaders
     ./Allwclean
     ./Allwmake
+NO_PLUGIN
+    fi
 
-BUILDREADER
-
-    # Fallback to native reader, if possible
-    if [ "$extension" = OpenFOAM ]
+    if [ -n "$pluginError" ]
     then
-        extension=foam
-        echo "Using the native VTK/OpenFOAM reader instead" 1>&2
-    else
-        exit 1
+        # Fallback to native reader, if possible
+        if [ "$plugin" = PVFoamReader ]
+        then
+            echo 1>&2
+            echo "Continuing with builtin reader:  paraFoam -vtk" 1>&2
+            echo 1>&2
+            extension=foam
+        else
+            echo 1>&2
+            exit 1
+        fi
+        unset plugin
     fi
-}
+fi
 
 
 # Check for --data=... argument
-hasDataArg()
-{
-    hasData=false
-    while [ "$#" -gt 0 ]
-    do
-        case "$1" in
-        (--data=*)
-            hasData=true
-            break
-            ;;
-        esac
-        shift
-    done
-}
-
-hasDataArg "$@"
+unset hasData
+for i
+do
+    case "$i" in (--data=*) hasData=true; break;; esac
+done
 
 
 # Get a sensible caseName from the directory name
-caseName=${PWD##*/}
+caseName="${PWD##*/}"
 caseFile="$caseName.$extension"
 fvControls="system"
 
@@ -211,14 +212,14 @@ all)
     do
         if [ -d "$region" ] && [ -d "$region/polyMesh" ]
         then
-            regionName=${region##*/}
+            regionName="${region##*/}"
             touch "$caseName{$regionName}.$extension"
             echo "Created '$caseName{$regionName}.$extension'" 1>&2
         fi
     done
     exit 0
     ;;
-processor)
+proc*)
     for i in processor*
     do
     (
@@ -286,8 +287,8 @@ else
 
     # Check existence of essential files
     warn=false
-    case "$extension" in
-        blockMesh)
+    case "$plugin" in
+        PVblockMeshReader)
             blockMeshDict=system/blockMeshDict
             if [ -f constant/polyMesh/blockMeshDict ]
             then
@@ -297,7 +298,7 @@ else
             hasFiles system/controlDict "$blockMeshDict" || warn=true
             ;;
 
-        OpenFOAM)
+        PVFoamReader)
             hasFiles \
                 system/controlDict \
                 "$fvControls/fvSchemes" \
@@ -312,7 +313,7 @@ else
         exit
     }
 
-    # Only create/remove caseFile if it didn't already exist
+    # Only create/remove caseFile if it did not previously exist
     [ -e "$caseFile" ] || {
         trap "rm -f $caseFile 2>/dev/null; exit 0" EXIT TERM INT
         touch "$caseFile"
diff --git a/etc/config.csh/paraview b/etc/config.csh/paraview
index 4ff0163fee7882fa2feb558147e8c0ba1e4839dd..e8acdadc637a4914355c0e85e7b777c648f8d1c5 100644
--- a/etc/config.csh/paraview
+++ b/etc/config.csh/paraview
@@ -16,25 +16,30 @@
 # Description
 #     Setup for PARAVIEW (partially cmake, qt too)
 #
-#     For system-wide cmake:            cmake_version=cmake-system
-#     For system-wide qt:               ParaView_QT=qt-system
+#     To disable use of the PV_PLUGIN_PATH:
+#         ParaView_VERSION=none
+#
+#     For system-wide installations:
+#         cmake_version=cmake-system
+#         ParaView_QT=qt-system
+#         ParaView_VERSION=system       [EXPERIMENTAL]
 #
 # Note
 #     The following env. variables are required for building plugins:
 #         ParaView_DIR
-#         ParaView_INCLUDE_DIR
 #         PV_PLUGIN_PATH
+#     The OpenFOAM plugin must be the first in PV_PLUGIN_PATH and have
+#     paraview-major.minor version encoded in its name.
 #
 #     For central installations not located under ThirdParty, the environment
 #     values must be set manually. For example,
 #
-#         setenv ParaView_DIR /opt/paraview/paraview-5.5.0
-#         setenv ParaView_INCLUDE_DIR $ParaView_DIR/include/paraview-5.5
-#         setenv PV_PLUGIN_PATH $FOAM_LIBBIN/paraview-5.5
+#         setenv ParaView_DIR /opt/paraview/paraview-5.6.0
+#         setenv PV_PLUGIN_PATH $FOAM_LIBBIN/paraview-5.6
 #
 #         setenv PATH $ParaView_DIR/bin:${PATH}
 #         setenv LD_LIBRARY_PATH $ParaView_DIR/lib:$LD_LIBRARY_PATH
-#         unsetenv ParaView_VERSION     # avoid using ThirdParty settings
+#         unsetenv ParaView_VERSION     # skip ThirdParty settings
 #
 #     In paraview-5.4 and earlier, the libraries were in the sub-directory:
 #
@@ -43,8 +48,8 @@
 #------------------------------------------------------------------------------
 # USER EDITABLE PART: Changes made here may be lost with the next upgrade
 
-setenv ParaView_VERSION 5.6.0
-set    ParaView_QT=qt-system
+set ParaView_VERSION=5.6.0
+set ParaView_QT=qt-system
 set cmake_version=cmake-system
 
 # END OF (NORMAL) USER EDITABLE PART
@@ -62,10 +67,10 @@ eval `$WM_PROJECT_DIR/bin/foamCleanPath -csh-env=PATH "$ParaView_DIR $archDir/Pa
 eval `$WM_PROJECT_DIR/bin/foamCleanPath -csh-env=LD_LIBRARY_PATH "$ParaView_DIR $archDir/ParaView- $archDir/qt-"`
 
 # ThirdParty cmake
-set cmake=$archDir/$cmake_version
-if ( -r $cmake/bin/cmake ) then
+set cmake="$archDir/$cmake_version"
+if ( -r "$cmake/bin/cmake" ) then
     # _foamAddPath not available when foamPV alias is used
-    setenv PATH $cmake/bin:${PATH}
+    setenv PATH "$cmake/bin:${PATH}"
 endif
 
 # Evaluate command-line parameters for ParaView
@@ -79,10 +84,47 @@ while ( $#argv > 0 )
     shift
 end
 
+if (! $?ParaView_VERSION ) set ParaView_VERSION=''
+
+switch ("$ParaView_VERSION")
+case "":
+    # empty - do nothing
+    setenv ParaView_DIR   # Defined but empty (used by foamPV alias)
+    breaksw
+
+case "none":
+    unsetenv PV_PLUGIN_PATH
+    setenv ParaView_DIR   # Defined but empty (used by foamPV alias)
+
+    if ($?FOAM_VERBOSE && $?prompt) then
+        echo "Using paraview (disabled)"
+    endif
+    breaksw
+
+case "system":
+    # Obtain major.minor from `paraview --version`
+    set pv_api=`paraview --version | \
+        sed -ne 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'`
+
+    if ( "${%pv_api}" ) then
+        setenv PV_PLUGIN_PATH "$FOAM_LIBBIN/paraview-$pv_api"
+    else
+        unsetenv ParaView_DIR PV_PLUGIN_PATH
+    endif
 
-# Require that ParaView_VERSION has not been unset.
-# Avoids conflict with an alternative (non-ThirdParty) installation.
-if ( $?ParaView_VERSION ) then
+    if ($?FOAM_VERBOSE && $?prompt) then
+        echo "Using paraview (disabled)"
+        if ( $?PV_PLUGIN_PATH ) then
+            echo "Using paraview (system)"
+            echo "    PV_PLUGIN_PATH       : $PV_PLUGIN_PATH"
+        else
+            echo "system paraview (not found)"
+        endif
+    endif
+    breaksw
+
+default:
+    # ParaView_VERSION set and non-empty
 
     # Set API to correspond to VERSION
     # pv_api is <digits>.<digits> from ParaView_VERSION
@@ -94,20 +136,21 @@ if ( $?ParaView_VERSION ) then
 
     case [0-9]*:
         # Extract API from VERSION
-        set pv_api=`echo ${ParaView_VERSION} | \
-            sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/'`
+        set pv_api=`echo "$ParaView_VERSION" | \
+            sed -ne 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'`
         breaksw
     endsw
 
-    setenv ParaView_DIR $archDir/ParaView-$ParaView_VERSION
+    setenv ParaView_DIR "$archDir/ParaView-$ParaView_VERSION"
 
     # Set paths if binaries are present
-    if ( -r $ParaView_DIR ) then
-        setenv PATH ${ParaView_DIR}/bin:${PATH}
-        setenv ParaView_INCLUDE_DIR $ParaView_DIR/include/paraview-$pv_api
-        setenv PV_PLUGIN_PATH $FOAM_LIBBIN/paraview-$pv_api
+    if ( -r "$ParaView_DIR" ) then
+        # The OpenFOAM plugin directory must be the first in PV_PLUGIN_PATH
+        # and have paraview-major.minor encoded in its name
+        setenv PV_PLUGIN_PATH "$FOAM_LIBBIN/paraview-$pv_api"
 
-        set pvLibDir=${ParaView_DIR}/lib/paraview-$pv_api
+        setenv PATH "${ParaView_DIR}/bin:${PATH}"
+        set pvLibDir="${ParaView_DIR}/lib/paraview-$pv_api"
         #OBSOLETE? set pvPython=$ParaView_DIR/Utilities/VTKPythonWrapping
 
         #OBSOLETE? # Python libraries as required
@@ -115,7 +158,7 @@ if ( $?ParaView_VERSION ) then
         #OBSOLETE?     if ($?PYTHONPATH) then
         #OBSOLETE?         setenv PYTHONPATH ${PYTHONPATH}:${pvPython}:$pvLibDir
         #OBSOLETE?     else
-        #OBSOLETE?         setenv PYTHONPATH ${pvPython}:$pvLibDir
+        #OBSOLETE?         setenv PYTHONPATH ${pvPython}:${pvLibDir}
         #OBSOLETE?     endif
         #OBSOLETE? endif
 
@@ -125,9 +168,9 @@ if ( $?ParaView_VERSION ) then
 
         set qtDir="$archDir/$ParaView_QT"
         if ( -d "$qtDir" ) then
-            switch ($ParaView_QT)
+            switch ("$ParaView_QT")
             case *-5*:
-                setenv Qt5_DIR $qtDir
+                setenv Qt5_DIR "$qtDir"
                 breaksw
             endsw
             foreach qtLibDir ("$qtDir/lib$WM_COMPILER_LIB_ARCH" "$qtDir/lib")
@@ -143,17 +186,16 @@ if ( $?ParaView_VERSION ) then
         # - 5.5 and later:   lib/
         switch ("$pv_api")
         case 5.[0-4]*:
-            setenv LD_LIBRARY_PATH $pvLibDir:${LD_LIBRARY_PATH}
+            setenv LD_LIBRARY_PATH "${pvLibDir}:${LD_LIBRARY_PATH}"
             breaksw
         default:
-            setenv LD_LIBRARY_PATH ${ParaView_DIR}/lib:${LD_LIBRARY_PATH}
+            setenv LD_LIBRARY_PATH "${ParaView_DIR}/lib:${LD_LIBRARY_PATH}"
             breaksw
         endsw
 
         if ($?FOAM_VERBOSE && $?prompt) then
             echo "Using paraview"
             echo "    ParaView_DIR         : $ParaView_DIR"
-            echo "    ParaView_INCLUDE_DIR : $ParaView_INCLUDE_DIR"
             echo "    library dir          : $pvLibDir"
             echo "    PV_PLUGIN_PATH       : $PV_PLUGIN_PATH"
         endif
@@ -163,11 +205,12 @@ if ( $?ParaView_VERSION ) then
             echo "    ParaView_DIR         : $ParaView_DIR"
         endif
 
-        unsetenv ParaView_INCLUDE_DIR PV_PLUGIN_PATH
+        unsetenv PV_PLUGIN_PATH
         setenv ParaView_DIR   # Defined but empty (used by foamPV alias)
     endif
+    breaksw
 
-endif
+endsw
 
 unset cleaned archDir
 unset cmake cmake_version
diff --git a/etc/config.sh/paraview b/etc/config.sh/paraview
index 4b7c8ad4f23acd43d89ea06c392bc60cdef17608..b909281d98576990189474aab7ec2752889810ba 100644
--- a/etc/config.sh/paraview
+++ b/etc/config.sh/paraview
@@ -16,25 +16,30 @@
 # Description
 #     Setup for PARAVIEW (partially cmake, qt too)
 #
-#     For system-wide cmake:            cmake_version=cmake-system
-#     For system-wide qt:               ParaView_QT=qt-system
+#     To disable use of the PV_PLUGIN_PATH:
+#         ParaView_VERSION=none
+#
+#     For system-wide installations:
+#         cmake_version=cmake-system
+#         ParaView_QT=qt-system
+#         ParaView_VERSION=system       [EXPERIMENTAL]
 #
 # Note
 #     The following env. variables are required for building plugins:
 #         ParaView_DIR
-#         ParaView_INCLUDE_DIR
 #         PV_PLUGIN_PATH
+#     The OpenFOAM plugin must be the first in PV_PLUGIN_PATH and have
+#     paraview-major.minor encoded in its name.
 #
 #     For central installations not located under ThirdParty, the environment
 #     values must be set manually. For example,
 #
-#         export ParaView_DIR=/opt/paraview/paraview-5.5.0
-#         export ParaView_INCLUDE_DIR=$ParaView_DIR/include/paraview-5.5
-#         export PV_PLUGIN_PATH=$FOAM_LIBBIN/paraview-5.5
+#         export ParaView_DIR=/opt/paraview/paraview-5.6.0
+#         export PV_PLUGIN_PATH=$FOAM_LIBBIN/paraview-5.6
 #
 #         export PATH=$ParaView_DIR/bin:$PATH
 #         export LD_LIBRARY_PATH=$ParaView_DIR/lib:$LD_LIBRARY_PATH
-#         unset ParaView_VERSION        # avoid using ThirdParty settings
+#         unset ParaView_VERSION        # skip ThirdParty settings
 #
 #     In paraview-5.4 and earlier, the libraries were in the sub-directory:
 #
@@ -75,52 +80,82 @@ then
 fi
 
 # Evaluate command-line parameters for ParaView
-_foamParaviewEval()
-{
-    while [ $# -gt 0 ]
-    do
-        case "$1" in
-        ParaView*=*)
-            # name=value  -> export name=value
-            eval "export $1"
-            ;;
-        esac
-        shift
-    done
-}
+for i
+do
+    case "$i" in
+    (ParaView*=*)
+        # name=value  -> export name=value
+        eval "export $i"
+        ;;
+    esac
+done
 
-# Evaluate command-line parameters
-_foamParaviewEval $@
+case "$ParaView_VERSION" in
+('')
+    # empty - do nothing
+    ;;
 
-# Require that ParaView_VERSION has not been unset.
-# Avoids conflict with an alternative (non-ThirdParty) installation.
-if [ -n "$ParaView_VERSION" ]
-then
+(none)
+    unset ParaView_DIR PV_PLUGIN_PATH
+
+    if [ -n "$FOAM_VERBOSE" ] && [ -n "$PS1" ]
+    then
+        echo "Using paraview (disabled)" 1>&2
+    fi
+    ;;
+
+(system)
+    # Obtain major.minor from `paraview --version`
+    pv_api="$(paraview --version 2>/dev/null | \
+        sed -ne 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p')"
+
+    if [ -n "$pv_api" ]
+    then
+        export PV_PLUGIN_PATH="$FOAM_LIBBIN/paraview-$pv_api"
+    else
+        unset ParaView_DIR PV_PLUGIN_PATH
+    fi
+
+    if [ -n "$FOAM_VERBOSE" ] && [ -n "$PS1" ]
+    then
+        if [ -n "$PV_PLUGIN_PATH" ]
+        then
+            echo "Using paraview (system)" 1>&2
+            echo "    PV_PLUGIN_PATH       : $PV_PLUGIN_PATH" 1>&2
+        else
+            echo "system paraview (not found)" 1>&2
+        fi
+    fi
+    ;;
+
+(*)
+    # ParaView_VERSION set and non-empty
 
     # Set API to correspond to VERSION
     # pv_api is <digits>.<digits> from ParaView_VERSION
     case "$ParaView_VERSION" in
-    "$pv_api".* )
+    ("$pv_api".*)
         # API and VERSION appear to correspond
         ;;
 
-    [0-9]*)
+    ([0-9]*)
         # Extract API from VERSION
-        pv_api=$(echo $ParaView_VERSION | \
-            sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/')
+        pv_api=$(echo "$ParaView_VERSION" | \
+            sed -ne 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p')
         ;;
     esac
 
-    export ParaView_DIR=$archDir/ParaView-$ParaView_VERSION
+    export ParaView_DIR="$archDir/ParaView-$ParaView_VERSION"
 
     # Set paths if binaries are present
-    if [ -r $ParaView_DIR ]
+    if [ -r "$ParaView_DIR" ]
     then
-        export PATH=$ParaView_DIR/bin:$PATH
-        export ParaView_INCLUDE_DIR=$ParaView_DIR/include/paraview-$pv_api
-        export PV_PLUGIN_PATH=$FOAM_LIBBIN/paraview-$pv_api
+        # The OpenFOAM plugin directory must be the first in PV_PLUGIN_PATH
+        # and have paraview-major.minor encoded in its name
+        export PV_PLUGIN_PATH="$FOAM_LIBBIN/paraview-$pv_api"
 
-        pvLibDir=$ParaView_DIR/lib/paraview-$pv_api
+        export PATH="$ParaView_DIR/bin:$PATH"
+        pvLibDir="$ParaView_DIR/lib/paraview-$pv_api"
         #OBSOLETE? pvPython=$ParaView_DIR/Utilities/VTKPythonWrapping
 
         #OBSOLETE? # Python libraries as required
@@ -135,15 +170,15 @@ then
         if [ -d "$qtDir" ]
         then
             case "$ParaView_QT" in
-            *-5*)
-                export Qt5_DIR=$qtDir
+            (*-5*)
+                export Qt5_DIR="$qtDir"
                 ;;
             esac
-            for qtLibDir in $qtDir/lib$WM_COMPILER_LIB_ARCH $qtDir/lib
+            for qtLibDir in "$qtDir/lib$WM_COMPILER_LIB_ARCH" "$qtDir/lib"
             do
                 if [ -d "$qtLibDir" ]
                 then
-                    export LD_LIBRARY_PATH=$qtLibDir:$LD_LIBRARY_PATH
+                    export LD_LIBRARY_PATH="$qtLibDir:$LD_LIBRARY_PATH"
                     break
                 fi
             done
@@ -153,33 +188,32 @@ then
         # - 5.4 and earlier: lib/paraview-X.X
         # - 5.5 and later:   lib/
         case "$pv_api" in
-        5.[0-4]*)
-            export LD_LIBRARY_PATH=$pvLibDir:$LD_LIBRARY_PATH
+        (5.[0-4]*)
+            export LD_LIBRARY_PATH="$pvLibDir:$LD_LIBRARY_PATH"
             ;;
-        *)
-            export LD_LIBRARY_PATH=$ParaView_DIR/lib:$LD_LIBRARY_PATH
+        (*)
+            export LD_LIBRARY_PATH="$ParaView_DIR/lib:$LD_LIBRARY_PATH"
             ;;
         esac
 
         if [ -n "$FOAM_VERBOSE" ] && [ -n "$PS1" ]
         then
-            echo "Using paraview"
-            echo "    ParaView_DIR         : $ParaView_DIR"
-            echo "    ParaView_INCLUDE_DIR : $ParaView_INCLUDE_DIR"
-            echo "    library dir          : $pvLibDir"
-            echo "    PV_PLUGIN_PATH       : $PV_PLUGIN_PATH"
+            echo "Using paraview" 1>&2
+            echo "    ParaView_DIR         : $ParaView_DIR" 1>&2
+            echo "    library dir          : $pvLibDir" 1>&2
+            echo "    PV_PLUGIN_PATH       : $PV_PLUGIN_PATH" 1>&2
         fi
     else
         if [ "$FOAM_VERBOSE" -a "$PS1" ]
         then
-            echo "No paraview found"
-            echo "    ParaView_DIR         : $ParaView_DIR"
+            echo "No paraview found" 1>&2
+            echo "    ParaView_DIR         : $ParaView_DIR" 1>&2
         fi
 
-        unset ParaView_DIR ParaView_INCLUDE_DIR PV_PLUGIN_PATH
+        unset ParaView_DIR PV_PLUGIN_PATH
     fi
-
-fi
+    ;;
+esac
 
 unset -f _foamParaviewEval 2> /dev/null
 unset cleaned archDir
diff --git a/src/functionObjects/graphics/runTimePostProcessing/Allwclean b/src/functionObjects/graphics/runTimePostProcessing/Allwclean
index 7a118a43495684eca6c6b33dbdd92e3517008e12..e3340097cff656ba346f2fdb35884aa5274ee83f 100755
--- a/src/functionObjects/graphics/runTimePostProcessing/Allwclean
+++ b/src/functionObjects/graphics/runTimePostProcessing/Allwclean
@@ -1,8 +1,6 @@
 #!/bin/sh
-cd ${0%/*} || exit 1    # Run from this directory
-
-# Source the wmake functions
-. $WM_PROJECT_DIR/wmake/scripts/wmakeFunctions
+cd ${0%/*} || exit 1                            # Run from this directory
+. $WM_PROJECT_DIR/wmake/scripts/wmakeFunctions  # Source wmake functions
 
 # Cleanup library
 rm -f $FOAM_LIBBIN/librunTimePostProcessing* 2>/dev/null
diff --git a/wmake/rules/General/paraview b/wmake/rules/General/paraview
deleted file mode 100644
index 1df6ded1bc9d54fe550e27a88177f7036ccbc2f2..0000000000000000000000000000000000000000
--- a/wmake/rules/General/paraview
+++ /dev/null
@@ -1,8 +0,0 @@
-#-------------------------------*- makefile -*---------------------------------
-# paraview values
-
-# major.minor: eg, /path/paraview-5.0 -> 5.0
-#
-ParaView_MAJOR := $(shell echo $(ParaView_INCLUDE_DIR) | sed -e 's/^.*-//')
-
-#------------------------------------------------------------------------------
diff --git a/wmake/scripts/cmakeFunctions b/wmake/scripts/cmakeFunctions
index 327fc873edbf2f71a82f24833655fb6510c327d1..a1b9e5e5d1f42c0a92a5df8e8b01344111a78cbc 100644
--- a/wmake/scripts/cmakeFunctions
+++ b/wmake/scripts/cmakeFunctions
@@ -15,9 +15,7 @@
 # Description
 #     Helper functions for CMake
 #------------------------------------------------------------------------------
-
-# Source the wmake functions
-. $WM_PROJECT_DIR/wmake/scripts/wmakeFunctions
+. $WM_PROJECT_DIR/wmake/scripts/wmakeFunctions  # Require some wmake functions
 
 # Ensure CMake gets the correct C/C++ compilers
 [ -n "$WM_CC" ]  && export CC="$WM_CC"
@@ -39,7 +37,7 @@ sameDependency()
     objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal
     sentinel="$objectsDir/ThirdParty"
 
-    echo $sentinel
+    echo "$sentinel"
 
     if read -r prev 2>/dev/null < $sentinel
     then
@@ -75,10 +73,16 @@ _cmake()
 
 # CMake into objectsDir with external dependency
 # - use sentinel file(s) to handle paraview/vtk version changes
+#
+# 1 - depend
+# 2 - sourceDir
+# 3... optional cmake defines
+#
 cmakeVersioned()
 {
     local depend="$1"
     local sourceDir="$2"
+    shift 2
     local objectsDir sentinel
 
     # Where generated files are stored
@@ -88,76 +92,35 @@ cmakeVersioned()
     sentinel=$(sameDependency "$depend" "$sourceDir") || \
         rm -rf "$objectsDir" > /dev/null 2>&1
 
-    mkdir -p $objectsDir \
-    && (cd $objectsDir && _cmake $sourceDir && make) \
+    mkdir -p "$objectsDir" \
+    && (cd "$objectsDir" && _cmake "$@" "$sourceDir" && make) \
     && echo "$depend" >| "${sentinel:-/dev/null}"
 }
 
 
-# CMake into objectsDir with VTK_DIR dependency
-cmakeVtk()
-{
-    cmakeVersioned "VTK_DIR=$VTK_DIR" "$1"
-}
-
-
-# CMake into objectsDir with ParaView_DIR dependency
-cmakePv()
-{
-    cmakeVersioned "ParaView_DIR=$ParaView_DIR" "$1"
-}
-
-
-#
-# Build library - use sentinel file(s) to handle paraview version changes
-#
-wmakeLibPv()
-{
-    local depend="ParaView_DIR=$ParaView_DIR"
-    local sentinel
-
-    for libName
-    do
-        sentinel=$(sameDependency "$depend" $libName) || \
-            wclean $libName
-
-        wmake $targetType $libName \
-        && echo "$depend" > ${sentinel:-/dev/null}
-    done
-}
-
-
+# CMake into objectsDir with external dependency
 #
-# There are several prerequisites for building plugins
+# 1 - depend
+# 2 - sourceDir
+# 3... optional cmake defines
 #
-canBuildPlugin()
+cmakeVersionedInstall()
 {
-    [ -d "$ParaView_DIR" -a -r "$ParaView_DIR" ] || {
-        echo "==> cannot build ParaView plugins without paraview directory"
-        echo "    ParaView_DIR=$ParaView_DIR"
-        return 1
-    }
-
-    [ -n "$PV_PLUGIN_PATH" ] || {
-        echo "==> ${PWD##*/} : invalid PV_PLUGIN_PATH for building ParaView plugins"
-        echo "    PV_PLUGIN_PATH=${PV_PLUGIN_PATH:-unset}"
-        return 1
-    }
+    local depend="$1"
+    local sourceDir="$2"
+    shift 2
+    local objectsDir sentinel
 
-    [ -d "$ParaView_INCLUDE_DIR" ] && \
-    [ -f "$ParaView_INCLUDE_DIR/pqServerManagerModel.h" ] || {
-        echo "==> cannot build ParaView plugins without an include directory"
-        echo "    ... or without GUI support"
-        echo "    ParaView_INCLUDE_DIR=$ParaView_INCLUDE_DIR"
-        return 1
-    }
+    # Where generated files are stored
+    objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal
 
-    command -v cmake > /dev/null 2>&1 || {
-        echo "==> cannot build ParaView plugins without cmake"
-        return 1
-    }
+    # Version changed
+    sentinel=$(sameDependency "$depend" "$sourceDir") || \
+        rm -rf "$objectsDir" > /dev/null 2>&1
 
-    return 0 # success
+    mkdir -p "$objectsDir" \
+    && (cd "$objectsDir" && _cmake "$@" "$sourceDir" && make install) \
+    && echo "$depend" >| "${sentinel:-/dev/null}"
 }
 
 
diff --git a/wmake/scripts/paraviewFunctions b/wmake/scripts/paraviewFunctions
new file mode 100644
index 0000000000000000000000000000000000000000..4e2a8106ddbaddf30f1964e2028c754e1681d827
--- /dev/null
+++ b/wmake/scripts/paraviewFunctions
@@ -0,0 +1,202 @@
+#----------------------------------*-sh-*--------------------------------------
+# =========                 |
+# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+#  \\    /   O peration     |
+#   \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+#    \\/     M anipulation  |
+#------------------------------------------------------------------------------
+# License
+#     This file is part of OpenFOAM, licensed under GNU General Public License
+#     <http://www.gnu.org/licenses/>.
+#
+# Script
+#     paraviewFunctions
+#
+# Description
+#     Helper functions for CMake with ParaView.
+#     Setup of variables for creating ParaView plugins
+#
+# Requires
+#     ParaView_DIR  (unless system)
+#     PV_PLUGIN_PATH
+#
+# Provides Functions
+#     have_pvplugin_support, no_paraview, echo_paraview
+#     cmakeVtk, cmakePv
+#
+# Variables on success
+#     HAVE_PVPLUGIN_SUPPORT
+#     FOAM_PV_PLUGIN_LIBBIN
+#     PARAVIEW_INC_DIR
+#     PARAVIEW_MAJMIN
+#
+# Note
+#     The OpenFOAM plugin must be the first in PV_PLUGIN_PATH and have
+#     paraview-major.minor encoded in its name.
+#
+#------------------------------------------------------------------------------
+. $WM_PROJECT_DIR/wmake/scripts/sysFunctions # General system functions
+. $WM_PROJECT_DIR/wmake/scripts/cmakeFunctions  # Require cmake functions
+
+#------------------------------------------------------------------------------
+
+# Reset variables
+no_paraview()
+{
+    unset HAVE_PVPLUGIN_SUPPORT FOAM_PV_PLUGIN_LIBBIN
+    unset PARAVIEW_INC_DIR PARAVIEW_MAJMIN
+    return 0
+}
+
+
+# Report
+echo_paraview()
+{
+    echo "paraview=${HAVE_PVPLUGIN_SUPPORT:-false}"
+    echo "root=$ParaView_DIR"
+    echo "include=$PARAVIEW_INC_DIR"
+    echo "plugin=$FOAM_PV_PLUGIN_LIBBIN"
+    echo "ver=$PARAVIEW_MAJMIN"
+}
+
+
+# CMake into objectsDir with VTK_DIR dependency
+cmakeVtk()
+{
+    cmakeVersioned "VTK_DIR=$VTK_DIR" "$1"
+}
+
+
+# CMake into objectsDir with ParaView_DIR dependency
+cmakePv()
+{
+    cmakeVersioned "ParaView_DIR=$ParaView_DIR" "$1"
+}
+
+#
+# Build library - use sentinel file(s) to handle paraview version changes
+#
+wmakeLibPv()
+{
+    local depend="ParaView_DIR=$ParaView_DIR"
+    local sentinel
+
+    for libName
+    do
+        sentinel=$(sameDependency "$depend" $libName) || \
+            wclean $libName
+
+        wmake $targetType $libName \
+        && echo "$depend" > ${sentinel:-/dev/null}
+    done
+}
+
+
+# Test if a ParaView plugin can be built.
+# On success, return 0 and export variables
+# -> HAVE_PVPLUGIN_SUPPORT, FOAM_PV_PLUGIN_LIBBIN,
+#    PARAVIEW_INC_DIR, PARAVIEW_MAJMIN
+#
+# There are several prerequisites for building plugins
+#
+have_pvplugin_support()
+{
+    local header settings warn majmin installDir binDir includeDir targetDir
+    warn="==> skip paraview-plugin"
+
+    # Trivial check
+    command -v cmake > /dev/null 2>&1 || {
+        echo "$warn (no cmake)"
+        return 1
+    }
+
+
+    # The OpenFOAM plugin must be the first in PV_PLUGIN_PATH
+    # and must have the paraview major+minor version encoded in its name!
+    # Eg, PV_PLUGIN_PATH="$FOAM_LIBBIN/paraview-5.5"
+
+    # Get the first entry from PV_PLUGIN_PATH=dir1;dir2;...
+    targetDir="${PV_PLUGIN_PATH##;}"
+    targetDir="${targetDir%%;*}"
+
+    # Extract the paraview major+minor version from the directory name
+    # From /path/paraview-5.6 -> 5.6
+    majmin=$(echo "${targetDir##*/}" | \
+        sed -n -e 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/p')
+
+    [ -n "$targetDir" ] || {
+        echo "$warn (could determine target)"
+        echo "    PV_PLUGIN_PATH=${PV_PLUGIN_PATH:-???}"
+        return 1
+    }
+
+    [ -n "$majmin" ] || {
+        echo "$warn (could determine major.minor version)"
+        return 1
+    }
+
+    # Header/library names
+    header="pqServerManagerModel.h"
+
+    if [ -n "$ParaView_DIR" ]
+    then
+        # ParaView_DIR defined. Look for include/
+
+        header=$(findFirstFile \
+            "$ParaView_DIR/include/paraview-$majmin/$header" \
+            "$ParaView_DIR/include/paraview/$header"
+        )
+
+    else
+        # No ParaView_DIR defined
+        # - use location of 'paraview' to guess an equivalent ParaView_DIR
+        # - assume we can use paraview-config
+
+        binDir="$(command -v paraview 2>/dev/null)"
+        binDir="${binDir%/*}"       # Eg, /usr/bin/paraview -> /usr/bin
+        installDir="${binDir%/*}"   # Eg, /usr/bin -> /usr
+
+        case "$installDir" in
+        (/*)    # An absolute path
+            includeDir="$installDir/include"  # Eg, /usr -> /usr/include
+        ;;
+        esac
+
+        header=$(findFirstFile \
+            "$(paraview-config --include 2>/dev/null |sed -ne 's/^ *-I//p')/$header"\
+            "${includeDir:+$includeDir/paraview-$majmin/$header}" \
+            "${includeDir:+$includeDir/paraview/$header}" \
+            /usr/local/include/"paraview-$majmin/$header" \
+            /usr/local/include/paraview/"$header" \
+            /usr/include/"paraview-$majmin/$header" \
+            /usr/include/paraview/"$header" \
+            )
+    fi
+
+
+    # Header found?
+    [ -n "$header" ] || {
+        [ -n "$warn" ] && echo "$warn (no header)"
+        return 2
+    }
+
+    export HAVE_PVPLUGIN_SUPPORT=true
+    export FOAM_PV_PLUGIN_LIBBIN="$targetDir"
+    export PARAVIEW_INC_DIR="${header%/*}"      # Basename
+    export PARAVIEW_MAJMIN="$majmin"
+
+    return 0 # success
+}
+
+
+# Force reset of old variables
+no_paraview
+
+# Testing
+if [ "$1" = "-test" ]
+then
+    have_pvplugin_support
+    echo_paraview
+fi
+
+#------------------------------------------------------------------------------