diff --git a/cmake/Install.cmake b/cmake/Install.cmake
index f1537344a..1bc71a923 100644
--- a/cmake/Install.cmake
+++ b/cmake/Install.cmake
@@ -216,7 +216,7 @@ ENDIF()
 
 # Group install targets into a InstallTargets folder
 SET_PROPERTY(TARGET build_fish_pc CHECK-FISH-BUILD-VERSION-FILE
-                    test_invocation test_fishscript
+                    test_fishscript
                     test_prep tests_buildroot_target
              PROPERTY FOLDER cmake/InstallTargets)
 
diff --git a/cmake/Tests.cmake b/cmake/Tests.cmake
index 425c05c64..90d18ce9a 100644
--- a/cmake/Tests.cmake
+++ b/cmake/Tests.cmake
@@ -76,12 +76,6 @@ FOREACH(TESTTYPE test serial_test)
     DEPENDS fish_tests
     USES_TERMINAL)
 
-  ADD_CUSTOM_TARGET(${TESTTYPE}_invocation
-                    COMMAND ./invocation.sh
-                    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tests/
-                    DEPENDS test_prep
-                    USES_TERMINAL)
-
   ADD_CUSTOM_TARGET(${TESTTYPE}_fishscript
                     COMMAND cd tests && ${TEST_ROOT_DIR}/bin/fish test.fish
                     DEPENDS test_prep
@@ -96,12 +90,11 @@ ENDFOREACH(TESTTYPE)
 # Now add a dependency chain between the serial versions.
 # This ensures they run in order.
 ADD_DEPENDENCIES(serial_test_fishscript serial_test_low_level)
-ADD_DEPENDENCIES(serial_test_invocation serial_test_fishscript)
-ADD_DEPENDENCIES(serial_test_interactive serial_test_invocation)
+ADD_DEPENDENCIES(serial_test_interactive serial_test_fishscript)
 
 
 ADD_CUSTOM_TARGET(serial_test_high_level
-                  DEPENDS serial_test_invocation serial_test_interactive serial_test_fishscript)
+                  DEPENDS serial_test_interactive serial_test_fishscript)
 
 # Create the 'test' target.
 # Set a policy so CMake stops complaining about the name 'test'.
@@ -118,13 +111,11 @@ SET_PROPERTY(TARGET test tests_dir
                     test_low_level
                     test_fishscript
                     test_interactive
-                    test_invocation
-                    test_invocation test_fishscript test_prep
+                    test_fishscript test_prep
                     tests_buildroot_target
                     serial_test_high_level
                     serial_test_low_level
                     serial_test_fishscript
                     serial_test_interactive
-                    serial_test_invocation
                     symlink_functions
              PROPERTY FOLDER cmake/TestTargets)
diff --git a/tests/invocation.sh b/tests/invocation.sh
deleted file mode 100755
index 728636ca4..000000000
--- a/tests/invocation.sh
+++ /dev/null
@@ -1,328 +0,0 @@
-#!/bin/sh
-##
-# Test that the invocation of the fish executable works as we hope.
-#
-# We try to run the 'fish' binary with different command line switches.
-# Each time we check against an output that we expect.
-#
-# We are testing fish's invocation itself, so this is not written in
-# fish itself - if the invocation wasn't working, we'd never even
-# be able to use this test to check that the invocation wasn't working.
-#
-# What we test...
-#
-# * The environment is cleaned so that (hopefully) differences in
-#   the host terminal, language or user settings do not affect the
-#   tests.
-#
-# * The files 'tests/invocation/*.invoke' contain the arguments that
-#   will be passed to the 'fish' command under test. The arguments
-#   may be split over multiple lines for clarity.
-#
-# * Before execution, if the file 'tests/invocation/<name>.config'
-#   exists, it will be copied as the 'config.fish' file in the
-#   configuration directory.
-#
-# * The stdout and stderr are captured into files and will be
-#   processed before comparison with the
-#   'tests/invocation/<name>.(out|err)' files. A missing file is
-#   considered to be no output.
-#   Either file may be given a further suffix of '.<system name>'
-#   which will be used in preference to the default. This allows
-#   the expected output to change depending on the system being
-#   used - to allow for differences in behaviour.
-#   The '<system name>' can be found with 'uname -s'.
-#   This facility should be used sparingly as system differences
-#   will confuse users.
-#
-# * The file 'tests/invocation/<name>.grep' is used to select the
-#   sections of the file we are interested in within the stdout.
-#   Only the parts that match will be compared to the '*.out' file.
-#   This can be used to filter out changeable parts of the output
-#   leaving just the parts we are interested in.
-#
-# * The stderr output will have the 'RC: <return code>' appended
-#   if the command returned a non-zero value.
-#   The stderr output will have the 'XDG_CONFIG_HOME' location
-#   substituted, to allow error reports to be compared consistently.
-#
-# * If the processed output differs from the supplied output,
-#   the test will fail, and the differences will be shown on the
-#   console.
-#
-# * If anything fails, the return code for this script will be
-#   non-zero.
-#
-
-# With this, errors would be fatal.
-# However, a return value of non-zero doesn't signal something that necessarily should be fatal.
-# For instance, `tput` returns 1 if an attribute isn't defined.
-# But we don't want it to kill our script, especially not without any indication.
-#
-# set -e
-
-# The directory this script is in (as everything is relative to here)
-here="$(cd "$(dirname "$0")" && pwd -P)"
-cd "$here"
-
-# The temporary directory to use
-temp_dir="$here/../test"
-
-# The fish binary we are testing - for manual testing, may be overridden
-fish_exe="${fish_exe:-../test/root/bin/fish}"
-fish_dir="$(dirname "${fish_exe}")"
-fish_leaf="$(basename "${fish_exe}")"
-
-
-# Which system are we on.
-# fish has slightly different behaviour depending on the system it is
-# running on (and the libraries that it is linked with), so for special
-# cases, we'll use a suffixed file.
-system_name="$(uname -s)"
-
-
-# Check whether we have the 'colordiff' tool - if not, we'll revert to
-# boring regular 'diff'.
-if command -v colordiff >/dev/null 2>&1; then
-    difftool='colordiff'
-else
-    difftool='diff'
-fi
-
-
-##
-# Set variables to known values so that they will not affect the
-# execution of the test.
-clean_environment() {
-
-    # Reset the terminal variables to a known type.
-    export TERM=xterm
-    unset ITERM_PROFILE
-
-    # And the language as well, so that we do not see differences in
-    # output dur to the user's locale
-    export LANGUAGE=en_US:en
-
-    # Ensure that the fish environment we use is in a clean state
-    rm -rf "${temp_dir}/data" "${temp_dir}/home"
-    mkdir -p "${temp_dir}/data" "${temp_dir}/home" "${temp_dir}/home/fish"
-    export XDG_DATA_HOME="${temp_dir}/data"
-    export XDG_CONFIG_HOME="${temp_dir}/home"
-}
-
-
-##
-# Fail completely :-(
-fail() {
-    say "$term_red" "FAIL: $*" >&2
-    exit 1
-}
-
-
-##
-# Coloured output
-#
-# Use like `say "$term_green" "message".
-say() {
-    echo "$1$2$term_reset"
-}
-
-run_rc() {
-    # Write the return code on to the end of the stderr, so that it can be
-    # checked like anything else.
-    eval "$*" || echo "RC: $?" >&2
-}
-
-filter() {
-    # In some cases we want to check only a part of the output.
-    # For those we filter the output through grep'd matches.
-    if [ -f "$1" ] ; then
-        # grep '-o', '-E' and '-f' are supported by the tools in modern GNU
-        # environments, and on OS X.
-        #
-        # But not on OpenIndiana/Illumos, so we use ggrep if available.
-        if command -v ggrep >/dev/null 2>&1; then
-            ggrep -oE -f "$1"
-        else
-            grep -oE -f "$1"
-        fi
-    else
-        cat
-    fi
-}
-
-##
-# Actual testing of a .invoke file.
-test_file() (
-    file="$1"
-    dir="$(dirname "$file")"
-    base="$(basename "$file" .invoke)"
-    test_config="${dir}/${base}.config"
-    test_stdout="${dir}/${base}.tmp.out"
-    test_stderr="${dir}/${base}.tmp.err"
-    want_stdout="${dir}/${base}.out"
-    grep_stdout="${dir}/${base}.grep"
-    want_stderr="${dir}/${base}.err"
-    empty="${dir}/${base}.empty"
-    rc=0
-    test_args_literal=
-    test_args=
-    out_status=0
-    err_status=0
-
-    # Literal arguments, for printing
-    test_args_literal="$(cat "$file")"
-    # Read the test arguments, escaping things that might be processed by us
-    test_args="$(sed 's/\$/\$/' "$file" | tr '\n' ' ')"
-
-    # Select system-specific files if they are present.
-    system_specific=
-    if [ -f "${test_config}.${system_name}" ] ; then
-        test_config="${test_config}.${system_name}"
-        system_specific=true
-    fi
-    if [ -f "${want_stdout}.${system_name}" ] ; then
-        want_stdout="${want_stdout}.${system_name}"
-        system_specific=true
-    fi
-    if [ -f "${want_stderr}.${system_name}" ] ; then
-        want_stderr="${want_stderr}.${system_name}"
-        system_specific=true
-    fi
-    if [ -f "${grep_stdout}.${system_name}" ] ; then
-        grep_stdout="${grep_stdout}.${system_name}"
-        system_specific=true
-    fi
-
-    # Create an empty file so that we can compare against it if needed
-    touch "${empty}"
-
-    # If they supplied a configuration file, we create it here
-    if [ -f "$test_config" ] ; then
-        cat "$test_config" > "${temp_dir}/home/fish/config.fish"
-    else
-        rm -f "${temp_dir}/home/fish/config.fish"
-    fi
-
-    printf '%s' "Testing file $file ${system_specific:+($system_name specific) }... "
-
-    # The hoops we are jumping through here, with changing directory are
-    # so that we always execute fish as './fish', which means that any
-    # error messages will appear the same, even if the tested binary
-    # is not one that we built here.
-    # We disable the exit-on-error here, so that we can catch the return
-    # code.
-    set +e
-    run_rc "cd \"$fish_dir\" && \"./$fish_leaf\" $test_args" \
-           2> "$test_stderr" \
-           < /dev/null       \
-           | filter "$grep_stdout" \
-           > "$test_stdout"
-    set -e
-
-    # If the wanted output files are not present, they are assumed empty.
-    if [ ! -f "$want_stdout" ] ; then
-        want_stdout="$empty"
-    fi
-    if [ ! -f "$want_stderr" ] ; then
-        want_stderr="$empty"
-    fi
-
-    # The standard error that we get will report errors using non-relative
-    # filenames, so we try to replace these with the variable names.
-    #
-    # However, fish will also have helpfully translated the home directory
-    # into '~/' in the error report. Consequently, we need to perform a
-    # small fix-up so that we can replace the string sanely.
-    xdg_config_in_home="${XDG_CONFIG_HOME#$HOME}"
-    if [ "${#xdg_config_in_home}" -lt "${#XDG_CONFIG_HOME}" ]; then
-        xdg_config_in_home="~$xdg_config_in_home"
-    fi
-    # 'sed -i' (inplace) has different syntax on BSD and GNU versions of
-    # the tool, so cannot be used here, hence we write to a separate file,
-    # and then move back.
-    sed "s,$xdg_config_in_home,\$XDG_CONFIG_HOME,g" "${test_stderr}" > "${test_stderr}.new"
-    mv -f "${test_stderr}.new" "${test_stderr}"
-
-    # Check the results
-    if ! diff "${want_stdout}" "${test_stdout}" >/dev/null 2>/dev/null ; then
-        out_status=1
-    fi
-    if ! diff "${want_stderr}" "${test_stderr}" >/dev/null 2>/dev/null ; then
-        err_status=1
-    fi
-
-    if [ "$out_status" = '0' ] && \
-       [ "$err_status" = '0' ] ; then
-        say "$term_green" "ok"
-        # clean up tmp files
-        rm -f "${test_stdout}" "${test_stderr}" "${empty}"
-        rc=0
-    else
-        say "$term_red" "fail"
-        say "$term_blue" "$test_args_literal" | sed 's/^/    /'
-
-        if [ "$out_status" != '0' ] ; then
-            say "$term_yellow" "Output differs for file $file. Diff follows:"
-            "$difftool" -u "${want_stdout}" "${test_stdout}"
-        fi
-        if [ "$err_status" != '0' ] ; then
-            say "$term_yellow" "Error output differs for file $file. Diff follows:"
-            "$difftool" -u  "${want_stderr}" "${test_stderr}"
-        fi
-        rc=1
-    fi
-
-    return $rc
-)
-
-
-########################################################################
-# Main harness
-
-if [ ! -x "${fish_exe}" ] ; then
-    fail "Fish executable not found at '${fish_exe}'"
-fi
-
-clean_environment
-
-# Terminal colouring
-# Only do this after setting up $TERM.
-term_red=""
-term_green=""
-term_yellow=""
-term_blue=""
-term_magenta=""
-term_cyan=""
-term_white=""
-term_reset=""
-# Some systems don't have tput. Disable coloring.
-if command -v tput >/dev/null 2>&1; then
-    term_red="$(tput setaf 1)"
-    term_green="$(tput setaf 2)"
-    term_yellow="$(tput setaf 3)"
-    term_blue="$(tput setaf 4)"
-    term_magenta="$(tput setaf 5)"
-    term_cyan="$(tput setaf 6)"
-    term_white="$(tput setaf 7)"
-    term_reset="$(tput sgr0)"
-fi
-
-say "$term_cyan" "Testing shell invocation functionality"
-
-passed=0
-failed=0
-for file in invocation/*.invoke; do
-   if ! test_file "$file" ; then
-       failed=$(( failed + 1 ))
-   else
-       passed=$(( passed + 1 ))
-   fi
-done
-
-echo "Encountered $failed errors in the invocation tests (out of $(( failed + passed )))."
-
-if [ "$failed" != 0 ] ; then
-    exit 1
-fi
-exit 0
diff --git a/tests/invocation/broken-config-continues.config b/tests/invocation/broken-config-continues.config
deleted file mode 100644
index 9884fb83a..000000000
--- a/tests/invocation/broken-config-continues.config
+++ /dev/null
@@ -1,2 +0,0 @@
-echo broken
-syntax-error
diff --git a/tests/invocation/broken-config-continues.err b/tests/invocation/broken-config-continues.err
deleted file mode 100644
index d15aebbd8..000000000
--- a/tests/invocation/broken-config-continues.err
+++ /dev/null
@@ -1,6 +0,0 @@
-fish: Unknown command: syntax-error
-$XDG_CONFIG_HOME/fish/config.fish (line 2): 
-syntax-error
-^
-from sourcing file $XDG_CONFIG_HOME/fish/config.fish
-	called during startup
diff --git a/tests/invocation/broken-config-continues.invoke b/tests/invocation/broken-config-continues.invoke
deleted file mode 100644
index 56d0c77d6..000000000
--- a/tests/invocation/broken-config-continues.invoke
+++ /dev/null
@@ -1 +0,0 @@
--c 'echo but still going'
diff --git a/tests/invocation/broken-config-continues.out b/tests/invocation/broken-config-continues.out
deleted file mode 100644
index 2b7a3d4fa..000000000
--- a/tests/invocation/broken-config-continues.out
+++ /dev/null
@@ -1,2 +0,0 @@
-broken
-but still going
diff --git a/tests/invocation/config-command-ordering.config b/tests/invocation/config-command-ordering.config
deleted file mode 100644
index 426d81082..000000000
--- a/tests/invocation/config-command-ordering.config
+++ /dev/null
@@ -1 +0,0 @@
-echo in config.fish
diff --git a/tests/invocation/config-command-ordering.invoke b/tests/invocation/config-command-ordering.invoke
deleted file mode 100644
index 07cb6dbb8..000000000
--- a/tests/invocation/config-command-ordering.invoke
+++ /dev/null
@@ -1 +0,0 @@
--c "echo command" -C "echo init-command"
diff --git a/tests/invocation/config-command-ordering.out b/tests/invocation/config-command-ordering.out
deleted file mode 100644
index 52cf61ca2..000000000
--- a/tests/invocation/config-command-ordering.out
+++ /dev/null
@@ -1,3 +0,0 @@
-in config.fish
-init-command
-command
diff --git a/tests/invocation/config.config b/tests/invocation/config.config
deleted file mode 100644
index 426d81082..000000000
--- a/tests/invocation/config.config
+++ /dev/null
@@ -1 +0,0 @@
-echo in config.fish
diff --git a/tests/invocation/config.invoke b/tests/invocation/config.invoke
deleted file mode 100644
index 8b1378917..000000000
--- a/tests/invocation/config.invoke
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/tests/invocation/config.out b/tests/invocation/config.out
deleted file mode 100644
index 5d7216610..000000000
--- a/tests/invocation/config.out
+++ /dev/null
@@ -1 +0,0 @@
-in config.fish