diff --git a/bin/foamGet b/bin/foamGet
new file mode 100755
index 000000000..67940c106
--- /dev/null
+++ b/bin/foamGet
@@ -0,0 +1,218 @@
+#!/bin/sh
+#------------------------------------------------------------------------------
+# ========= |
+# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+# \\ / O peration |
+# \\ / A nd | Copyright (C) 2018 OpenFOAM Foundation
+# \\/ M anipulation |
+#-------------------------------------------------------------------------------
+# 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 .
+#
+# Script
+# foamGet
+#
+# Description
+# Finds an example OpenFOAM case dictionary in $FOAM_ETC/caseDicts and
+# copies it into the respective case directory.
+#
+#-------------------------------------------------------------------------------
+usage() {
+ cat<
+options:
+ -case | -c specify case directory (default = local dir)
+ -ext | -e specify file extension, e.g -e cfg for files with ".cfg"
+ -help | -h print the usage
+ -no-ext | -n specify file without extension
+ -target | -t specify target directory (default = system)
+
+Finds an example OpenFOAM case dictionary file in $FOAM_ETC/caseDicts and
+copies it into the respective case directory, e.g.
+
+ foamGet decomposeParDict
+ foamGet extrudeMeshDict
+ foamGet createPatchDict
+ foamGet surfaces
+
+USAGE
+}
+
+error() {
+ exec 1>&2
+ while [ "$#" -ge 1 ]; do echo "$1"; shift; done
+ usage
+ exit 1
+}
+
+findFilesInDirs () {
+ _dirs="$1"
+ _str="$2"
+ _out=""
+ for _d in $_dirs
+ do
+ [ -d "$_d" ] && _out="$(find "$_d" -name "$_str" -type f | sort) $_out"
+ done
+
+ # Remove whitespace
+ echo "$_out" | xargs -n 1
+}
+
+findFiles () {
+ _dirs="$1"
+ _prefix="$2"
+ _ext="$3"
+
+ if [ -z "$_ext" -o "$_ext" = "ANY" ] ; then
+ findFilesInDirs "$_dirs" "$_prefix"
+ else
+ findFilesInDirs "$_dirs" "${_prefix}.${_ext}"
+ fi
+ [ "$_ext" = "ANY" ] && findFilesInDirs "$_dirs" "${_prefix}.*"
+}
+
+nArgs () {
+ echo "$1" | xargs -n 1 | wc -l
+}
+
+listArgs () {
+ _i=0
+ _suggest=""
+ _pri=100
+
+ for _a in $1
+ do
+ _i=$(( _i + 1))
+ echo "${_i}) $_a" >&2
+
+ # Prioritise suggestion locations
+ _tests="\
+ caseDicts/postProcessing/ \
+ caseDicts/preProcessing/ \
+ caseDicts/general/ \
+ caseDicts/mesh/ \
+ caseDicts/surface/ \
+ caseDicts/solvers/"
+
+ _n=0
+ for _t in $_tests
+ do
+ _n=$(( _n + 1))
+ [ "$_n" -lt "$_pri" ] && \
+ echo "$_a" | grep -q "$_t" && _suggest="$_i" && _pri="$_n"
+ done
+ done
+
+ echo "$_suggest"
+}
+
+cpFile () {
+ _file="$1"
+ _dir="$2"
+ echo "Copying $_file to $_dir"
+ cp "$_file" "$_dir"
+}
+
+setFile () {
+ _files="$1"
+ _n="$2"
+ echo "$_files" | tr -s "\n" " " | awk -v n="$_n" '{print $n}'
+}
+
+noFilesMessage () {
+ _ext="$1"
+ [ "$_ext" = "ANY" ] && echo "(with or without file extensions)" && return 1
+ [ -n "$_ext" ] && echo "with file extension $_ext" && return 1
+}
+
+searchDirs="\
+ ${HOME}/.OpenFOAM \
+ $WM_PROJECT_SITE \
+ $WM_PROJECT_INST_DIR/site \
+ $FOAM_ETC/caseDicts"
+
+ext="ANY"
+tgt="system"
+while [ "$#" -gt 0 ]
+do
+ case "$1" in
+ -c | -case)
+ [ "$#" -ge 2 ] || error "'$1' option requires an argument"
+ cd "$2" 2>/dev/null || error "directory does not exist: '$2'"
+ shift 2
+ ;;
+ -e | -ext)
+ [ "$#" -ge 2 ] || error "'$1' option requires an argument"
+ ext="$2"
+ shift 2
+ ;;
+ -h | -help)
+ usage && exit 0
+ ;;
+ -n | -no-ext)
+ ext=""
+ shift
+ ;;
+ -t | -target)
+ [ "$#" -ge 2 ] || error "'$1' option requires an argument"
+ tgt="$2"
+ [ -d "$tgt" ] || error "directory with -t option does not exist: '$tgt'"
+ shift 2
+ ;;
+ -*)
+ error "invalid option '$1'"
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+[ $# -gt 1 ] && error "$# arguments \"$*\" specified: only 1 permitted"
+[ $# -eq 1 ] || error "Missing argument: no file name/prefix supplied"
+prefix="$1"
+
+[ -s "system/controlDict" ] || \
+ error "Cannot find OpenFOAM case directory (no system/controlDict file)"
+
+files="$(findFiles "$searchDirs" "$prefix" "$ext")"
+[ -z "$files" ] && \
+ error "No file $prefix found $(noFilesMessage "$ext")"
+
+nFiles="$(nArgs "$files")"
+[ "$nFiles" -eq 1 ] && cpFile "$files" "$tgt" && exit 0
+
+echo "Multiple files with \"$prefix\" prefix found:"
+suggest="$(listArgs "$files")"
+echo "$files" | grep -q "annotated/" && \
+ echo "** Note: it is easier to use files NOT in the \"annotated\" directory"
+
+printf "\n%s" "Enter file number (1-$nFiles) to obtain description "
+[ -n "$suggest" ] && printf "%s" "(suggest $suggest) "
+printf "%s" ": "
+read nFile
+
+[ -z "$nFile" -a -n "$suggest" ] && nFile="$suggest"
+[ -z "$nFile" ] && \
+ echo "Cannot specify nothing; re-run and enter a file number" && exit 1
+! [ "$nFile" -eq "$nFile" ] 2>/dev/null && \
+ echo "\"$nFile\" is not a number between 1 and $nFiles" && exit 1
+[ "$nFile" -lt 1 -o "$nFile" -gt "$nFiles" ] && \
+ echo "\"$nFile\" is not a number between 1 and $nFiles" && exit 1
+
+file="$(setFile "$files" "$nFile")"
+cpFile "$file" "$tgt"