diff --git a/buildroot/bin/build_all_examples b/buildroot/bin/build_all_examples
index bce95dce886..73619ab472f 100755
--- a/buildroot/bin/build_all_examples
+++ b/buildroot/bin/build_all_examples
@@ -1,57 +1,97 @@
 #!/usr/bin/env bash
 #
-# build_all_examples base_branch [resume_point]
+# Usage:
 #
+#  build_all_examples [-b|--branch=<branch>]
+#                     [-c|--continue]
+#                     [-d|--debug]
+#                     [-i|--ini]
+#                     [-l|--limit=#]
+#                     [-n|--nobuild]
+#                     [-r|--resume=<path>]
+#                     [-s|--skip]
+#
+# build_all_examples [...] branch [resume-from]
+#
+
+. mfutil
 
 GITREPO=https://github.com/MarlinFirmware/Configurations.git
 STAT_FILE=./.pio/.buildall
 
-# Check dependencies
-which curl 1>/dev/null 2>&1 || { echo "curl not found! Please install it."; exit ; }
-which git 1>/dev/null 2>&1 || { echo "git not found! Please install it."; exit ; }
+usage() { echo "
+Usage: $SELF [-b|--branch=<branch>] [-d|--debug] [-i|--ini] [-r|--resume=<path>]
+       $SELF [-b|--branch=<branch>] [-d|--debug] [-i|--ini] [-c|--continue]
+       $SELF [-b|--branch=<branch>] [-d|--debug] [-i|--ini] [-s|--skip]
+       $SELF [-b|--branch=<branch>] [-d|--debug] [-n|--nobuild]
+       $SELF [...] branch [resume-point]
+"
+}
 
-SED=$(command -v gsed 2>/dev/null || command -v sed 2>/dev/null)
-[[ -z "$SED" ]] && { echo "No sed found, please install sed" ; exit 1 ; }
+# Assume the most recent configs
+BRANCH=import-2.1.x
+unset FIRST_CONF
+EXIT_USAGE=
+LIMIT=1000
 
-SELF=`basename "$0"`
-HERE=`dirname "$0"`
+while getopts 'b:cdhil:nqr:sv-:' OFLAG; do
+  case "${OFLAG}" in
+    b) BRANCH=$OPTARG       ; bugout "Branch: $BRANCH" ;;
+    r) FIRST_CONF="$OPTARG" ; bugout "Resume: $FIRST_CONF" ;;
+    c) CONTINUE=1           ; bugout "Continue" ;;
+    s) CONTSKIP=1           ; bugout "Continue, skipping" ;;
+    i) CREATE_INI=1         ; bugout "Generate an INI file" ;;
+    h) EXIT_USAGE=1 ; break ;;
+    l) LIMIT=$OPTARG        ; bugout "Limit to $LIMIT build(s)" ;;
+  d|v) DEBUG=1              ; bugout "Debug ON" ;;
+    n) DRYRUN=1             ; bugout "Dry Run" ;;
+    -) IFS="=" read -r ONAM OVAL <<< "$OPTARG"
+       case "$ONAM" in
+       branch) BRANCH=$OVAL       ; bugout "Branch: $BRANCH" ;;
+       resume) FIRST_CONF="$OVAL" ; bugout "Resume: $FIRST_CONF" ;;
+     continue) CONTINUE=1   ; bugout "Continue" ;;
+         skip) CONTSKIP=2   ; bugout "Continue, skipping" ;;
+        limit) LIMIT=$OVAL  ; bugout "Limit to $LIMIT build(s)" ;;
+          ini) CREATE_INI=1 ; bugout "Generate an INI file" ;;
+         help) [[ -z "$OVAL" ]] || perror "option can't take value $OVAL" $ONAM ; EXIT_USAGE=1 ;;
+        debug) DEBUG=1      ; bugout "Debug ON" ;;
+      nobuild) DRYRUN=1     ; bugout "Dry Run" ;;
+            *) EXIT_USAGE=2 ; echo "$SELF: unrecognized option \`--$ONAM'" ; break ;;
+       esac
+       ;;
+    *) EXIT_USAGE=2 ; break ;;
+  esac
+done
 
-# Check if called in the right location
-[[ -e "Marlin/src" ]] || { echo -e "This script must be called from a Marlin working copy with:\n ./buildroot/bin/$SELF $1" ; exit ; }
+# Extra arguments count as BRANCH, FIRST_CONF
+shift $((OPTIND - 1))
+[[ $# > 0 ]] && { BRANCH=$1 ; shift 1 ; bugout "BRANCH=$BRANCH" ; }
+[[ $# > 0 ]] && { FIRST_CONF=$1 ; shift 1 ; bugout "FIRST_CONF=$FIRST_CONF" ; }
+[[ $# > 0 ]] && { EXIT_USAGE=2 ; echo "too many arguments" ; }
 
-if [[ $# -lt 1 || $# -gt 2 ]]; then
-  echo "Usage: $SELF base_branch [resume_point]
-  base_branch  - Configuration branch to download and build
-  resume_point - Configuration path to start from"
-  exit
-fi
+((EXIT_USAGE)) && { usage ; let EXIT_USAGE-- ; exit $EXIT_USAGE ; }
 
-echo "This script downloads all Configurations and builds Marlin with each one."
+echo "This script downloads each Configuration and attempts to build it."
 echo "On failure the last-built configs will be left in your working copy."
 echo "Restore your configs with 'git checkout -f' or 'git reset --hard HEAD'."
 
-unset BRANCH
-unset FIRST_CONF
 if [[ -f "$STAT_FILE" ]]; then
   IFS='*' read BRANCH FIRST_CONF <"$STAT_FILE"
 fi
 
 # If -c is given start from the last attempted build
-if [[ $1 == '-c' ]]; then
+if ((CONTINUE)); then
   if [[ -z $BRANCH || -z $FIRST_CONF ]]; then
     echo "Nothing to continue"
     exit
   fi
-elif [[ $1 == '-s' ]]; then
+elif ((CONTSKIP)); then
   if [[ -n $BRANCH && -n $FIRST_CONF ]]; then
     SKIP_CONF=1
   else
     echo "Nothing to skip"
     exit
   fi
-else
-  BRANCH=${1:-"import-2.0.x"}
-  FIRST_CONF=$2
 fi
 
 # Check if the current repository has unmerged changes
@@ -69,33 +109,61 @@ TMP=./.pio/build-$BRANCH
 
 # Download Configurations into the temporary folder
 if [[ ! -e "$TMP/README.md" ]]; then
-  echo "Downloading Configurations from GitHub into $TMP"
+  echo "Fetching Configurations from GitHub to $TMP"
   git clone --depth=1 --single-branch --branch "$BRANCH" $GITREPO "$TMP" || { echo "Failed to clone the configuration repository"; exit ; }
 else
-  echo "Using previously downloaded Configurations at $TMP"
+  echo "Using cached Configurations at $TMP"
 fi
 
-echo -e "Start building now...\n====================="
+echo -e "Start build...\n====================="
 shopt -s nullglob
 IFS='
 '
 CONF_TREE=$( ls -d "$TMP"/config/examples/*/ "$TMP"/config/examples/*/*/ "$TMP"/config/examples/*/*/*/ "$TMP"/config/examples/*/*/*/*/ | grep -vE ".+\.(\w+)$" )
-DOSKIP=0
 for CONF in $CONF_TREE ; do
+
   # Get a config's directory name
   DIR=$( echo $CONF | sed "s|$TMP/config/examples/||" )
+
   # If looking for a config, skip others
   [[ $FIRST_CONF ]] && [[ $FIRST_CONF != $DIR && "$FIRST_CONF/" != $DIR ]] && continue
   # Once found, stop looking
   unset FIRST_CONF
+
   # If skipping, don't build the found one
   [[ $SKIP_CONF ]] && { unset SKIP_CONF ; continue ; }
+
   # ...if skipping, don't build this one
   compgen -G "${CONF}Con*.h" > /dev/null || continue
+
+  # Remember where we are in case of failure
   echo "${BRANCH}*${DIR}" >"$STAT_FILE"
-  "$HERE/build_example" "internal" "$TMP" "$DIR" || { echo "Failed to build $DIR"; exit ; }
+
+  # Build or pretend to build
+  if [[ $DRYRUN ]]; then
+    echo "[DRYRUN] build_example internal \"$TMP\" \"$DIR\""
+  else
+    # Build folder is unknown so delete all "config.ini" files
+    [[ $CREATE_INI ]] && find ./.pio/build/ -name "config.ini" -exec rm "{}" \;
+    ((DEBUG)) && echo "\"$HERE/build_example\" \"internal\" \"$TMP\" \"$DIR\""
+    "$HERE/build_example" "internal" "$TMP" "$DIR" || { echo "Failed to build $DIR"; exit ; }
+    # Build folder is unknown so copy any "config.ini"
+    [[ $CREATE_INI ]] && find ./.pio/build/ -name "config.ini" -exec cp "{}" "$CONF" \;
+  fi
+
+  ((--LIMIT)) || { echo "Limit reached" ; PAUSE=1 ; break ; }
+
 done
 
-# Delete the temp folder and build state
-[[ -e "$TMP/config/examples" ]] && rm -rf "$TMP"
-rm "$STAT_FILE"
+# Delete the build state if not paused early
+[[ $PAUSE ]] || rm "$STAT_FILE"
+
+# Delete the temp folder if not preserving generated INI files
+if [[ -e "$TMP/config/examples" ]]; then
+  if [[ $CREATE_INI ]]; then
+    OPEN=$( which gnome-open xdg-open open | head -n1 )
+    $OPEN "$TMP"
+  elif [[ ! $PAUSE ]]; then
+    rm -rf "$TMP"
+  fi
+fi
diff --git a/buildroot/bin/build_example b/buildroot/bin/build_example
index cff8ea253e6..34549769bbb 100755
--- a/buildroot/bin/build_example
+++ b/buildroot/bin/build_example
@@ -5,6 +5,8 @@
 # Usage: build_example internal config-home config-folder
 #
 
+. mfutil
+
 # Require 'internal' as the first argument
 [[ "$1" == "internal" ]] || { echo "Don't call this script directly, use build_all_examples instead." ; exit 1 ; }
 
@@ -22,8 +24,15 @@ cp "$SUB"/Configuration_adv.h Marlin/ 2>/dev/null
 cp "$SUB"/_Bootscreen.h       Marlin/ 2>/dev/null
 cp "$SUB"/_Statusscreen.h     Marlin/ 2>/dev/null
 
+set -e
+
+# Strip #error lines from Configuration.h
+IFS=$'\n'; set -f
+$SED -i~ -e "20,30{/#error/d}" Marlin/Configuration.h
+rm Marlin/Configuration.h~
+unset IFS; set +f
+
 echo "Building the firmware now..."
-HERE=`dirname "$0"`
 $HERE/mftest -s -a -n1 || { echo "Failed"; exit 1; }
 
 echo "Success"
diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest
index edb4068546b..8a4f3afd4f3 100755
--- a/buildroot/bin/mftest
+++ b/buildroot/bin/mftest
@@ -3,7 +3,7 @@
 #  mftest                             Select a test to apply and build
 #  mftest -b [#]                      Build the auto-detected environment
 #  mftest -u [#]                      Upload the auto-detected environment
-#  mftest [name] [index] [-y]         Set config options and optionally build a test
+#  mftest -tname -n# [-y]             Set config options and optionally build a test
 #
 
 [[ -d Marlin/src ]] || { echo "Please 'cd' to the Marlin repo root." ; exit 1 ; }
diff --git a/buildroot/bin/mfutil b/buildroot/bin/mfutil
new file mode 100755
index 00000000000..75a2791cfed
--- /dev/null
+++ b/buildroot/bin/mfutil
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+#
+# mfutil - check env and define helpers
+#
+
+# Check dependencies
+which curl 1>/dev/null 2>&1 || { echo "curl not found! Please install it."; exit ; }
+which git 1>/dev/null 2>&1 || { echo "git not found! Please install it."; exit ; }
+
+SED=$(command -v gsed 2>/dev/null || command -v sed 2>/dev/null)
+[[ -z "$SED" ]] && { echo "No sed found, please install sed" ; exit 1 ; }
+
+OPEN=$( which gnome-open xdg-open open | head -n1 )
+
+SELF=`basename "$0"`
+HERE=`dirname "$0"`
+
+# Check if called in the right location
+[[ -e "Marlin/src" ]] || { echo -e "This script must be called from a Marlin working copy with:\n ./buildroot/bin/$SELF $1" ; exit ; }
+
+perror() { echo -e "$0: \033[0;31m$1 -- $2\033[0m" ; }
+bugout() { ((DEBUG)) && echo -e "\033[0;32m$1\033[0m" ; }
diff --git a/buildroot/share/git/firstpush b/buildroot/share/git/firstpush
index 9a68fc5afde..db025f6c52c 100755
--- a/buildroot/share/git/firstpush
+++ b/buildroot/share/git/firstpush
@@ -16,7 +16,7 @@ BRANCH=${INFO[5]}
 
 git push --set-upstream origin HEAD:$BRANCH
 
-OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }')
+OPEN=$( which gnome-open xdg-open open | head -n1 )
 URL="https://github.com/$FORK/$REPO/commits/$BRANCH"
 
 if [ -z "$OPEN" ]; then
diff --git a/buildroot/share/git/mfdoc b/buildroot/share/git/mfdoc
index ce214190164..29f0ec6873f 100755
--- a/buildroot/share/git/mfdoc
+++ b/buildroot/share/git/mfdoc
@@ -17,7 +17,7 @@ BRANCH=${INFO[5]}
 
 opensite() {
   URL="http://127.0.0.1:4000/"
-  OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }')
+  OPEN=$( which gnome-open xdg-open open | head -n1 )
   if [ -z "$OPEN" ]; then
     echo "Can't find a tool to open the URL:"
     echo $URL
diff --git a/buildroot/share/git/mfpr b/buildroot/share/git/mfpr
index 230bd2886cf..c5eb4522c79 100755
--- a/buildroot/share/git/mfpr
+++ b/buildroot/share/git/mfpr
@@ -23,7 +23,7 @@ OLDBRANCH=${INFO[5]}
 # See if it's been pushed yet
 if [ -z "$(git branch -vv | grep ^\* | grep \\[origin)" ]; then firstpush; fi
 
-OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }')
+OPEN=$( which gnome-open xdg-open open | head -n1 )
 URL="https://github.com/$ORG/$REPO/compare/$TARG...$FORK:$BRANCH?expand=1"
 
 if [ -z "$OPEN" ]; then
diff --git a/buildroot/share/git/mfpub b/buildroot/share/git/mfpub
index 6a912e5515b..6ffe627b925 100755
--- a/buildroot/share/git/mfpub
+++ b/buildroot/share/git/mfpub
@@ -45,7 +45,7 @@ git clean -d -f
 
 opensite() {
   URL="$1"
-  OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }')
+  OPEN=$( which gnome-open xdg-open open | head -n1 )
   if [ -z "$OPEN" ]; then
     echo "Can't find a tool to open the URL:"
     echo $URL