patch 9.1.1525: tests: testdir/ is a bit messy

Problem:  tests: testdir is a bit messy
Solution: move test scripts into testdir/util/ directory

src/testdir/ has become a dumping ground mixing test cases with utility
functions. Let's fix this by moving all utility functions into the
testdir/util/ directory

Also a few related changes had to be done:
- Update Filelist
- update README.txt and mention the new directory layout
- fix shadowbuild by linking the util directory into the shadow dir

closes: #17677

Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak
index 843ea1e..6ffc12d 100644
--- a/src/testdir/Make_amiga.mak
+++ b/src/testdir/Make_amiga.mak
@@ -21,7 +21,7 @@
 
 .in.out:
 	copy $*.ok test.ok
-	$(VIMPROG) -u amiga.vim -U NONE --noplugin --not-a-term -s dotest.in $*.in
+	$(VIMPROG) -u util/amiga.vim -U NONE --noplugin --not-a-term -s dotest.in $*.in
 	diff test.out $*.ok
 	rename test.out $*.out
 	-delete X#? ALL QUIET
diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak
index 2ffe402..b11d2ea 100644
--- a/src/testdir/Make_ming.mak
+++ b/src/testdir/Make_ming.mak
@@ -46,7 +46,7 @@
 	@rem without the +eval feature test_result.log is a copy of test.log
 	@if exist test.log ( copy /y test.log test_result.log > nul ) \
 		else ( echo No failures reported > test_result.log )
-	$(VIMPROG) -u NONE $(COMMON_ARGS) -S summarize.vim messages
+	$(VIMPROG) -u NONE $(COMMON_ARGS) -S util\summarize.vim messages
 	-if exist starttime del starttime
 	@echo.
 	@echo Test results:
@@ -105,7 +105,7 @@
 $(DOSTMP)/%.in : %.in
 	if not exist $(DOSTMP)\nul mkdir $(DOSTMP)
 	if exist $(DOSTMP)\$< $(DEL) $(DOSTMP)\$<
-	$(VIMPROG) -u dos.vim $(COMMON_ARGS) "+set ff=dos|f $@|wq" $<
+	$(VIMPROG) -u util\dos.vim $(COMMON_ARGS) "+set ff=dos|f $@|wq" $<
 
 # For each input file dostmp/test99.in run the tests.
 # This moves test99.in to test99.in.bak temporarily.
@@ -115,7 +115,7 @@
 	$(MV) $(notdir $<) $(notdir $<).bak > NUL
 	$(CP) $(DOSTMP)\$(notdir $<) $(notdir $<) > NUL
 	$(CP) $(basename $@).ok test.ok > NUL
-	$(VIMPROG) -u dos.vim $(COMMON_ARGS) -s dotest.in $(notdir $<)
+	$(VIMPROG) -u util\dos.vim $(COMMON_ARGS) -s dotest.in $(notdir $<)
 	-@if exist test.out $(MV) test.out $(DOSTMP)\$@ > NUL
 	-@if exist $(notdir $<).bak $(MV) $(notdir $<).bak $(notdir $<) > NUL
 	-@if exist test.ok $(DEL) test.ok
@@ -124,7 +124,7 @@
 	-@if exist XfakeHOME $(DELDIR) XfakeHOME
 	-@del X*
 	-@if exist viminfo del viminfo
-	$(VIMPROG) -u dos.vim $(COMMON_ARGS) "+set ff=unix|f test.out|wq" \
+	$(VIMPROG) -u util\dos.vim $(COMMON_ARGS) "+set ff=unix|f test.out|wq" \
 		$(DOSTMP)\$@
 	@diff test.out $(basename $@).ok & if errorlevel 1 \
 		( $(MV) test.out $(basename $@).failed > NUL \
@@ -154,10 +154,10 @@
 
 test_gui_init.res: test_gui_init.vim
 	@echo $(VIMPROG) > vimcmd
-	$(VIMPROG) -u gui_preinit.vim -U gui_init.vim $(NO_PLUGINS) -S runtest.vim $<
+	$(VIMPROG) -u util\gui_preinit.vim -U util\gui_init.vim $(NO_PLUGINS) -S runtest.vim $<
 	@$(DEL) vimcmd
 
-opt_test.vim: gen_opt_test.vim ../optiondefs.h ../../runtime/doc/options.txt
+opt_test.vim: util/gen_opt_test.vim ../optiondefs.h ../../runtime/doc/options.txt
 	$(VIMPROG) -e -s -u NONE $(COMMON_ARGS) --nofork -S $^
 	@if test -f test.log; then \
 		cat test.log; \
diff --git a/src/testdir/Make_mvc.mak b/src/testdir/Make_mvc.mak
index 1a54823..02eb801 100644
--- a/src/testdir/Make_mvc.mak
+++ b/src/testdir/Make_mvc.mak
@@ -40,7 +40,7 @@
 	@rem without the +eval feature test_result.log is a copy of test.log
 	@if exist test.log ( copy /y test.log test_result.log > nul ) \
 		else ( echo No failures reported > test_result.log )
-	$(VIMPROG) -u NONE $(COMMON_ARGS) -S summarize.vim messages
+	$(VIMPROG) -u NONE $(COMMON_ARGS) -S util\summarize.vim messages
 	-if exist starttime del starttime
 	@echo:
 	@echo Test results:
@@ -99,7 +99,7 @@
 $(DOSTMP_INFILES): $(*B).in
 	if not exist $(DOSTMP)\NUL md $(DOSTMP)
 	if exist $@ del $@
-	$(VIMPROG) -u dos.vim $(COMMON_ARGS) "+set ff=dos|f $@|wq" $(*B).in
+	$(VIMPROG) -u util\dos.vim $(COMMON_ARGS) "+set ff=dos|f $@|wq" $(*B).in
 
 # For each input file dostmp/test99.in run the tests.
 # This moves test99.in to test99.in.bak temporarily.
@@ -109,7 +109,7 @@
 	move $(*B).in $(*B).in.bak > nul
 	copy $(DOSTMP)\$(*B).in $(*B).in > nul
 	copy $(*B).ok test.ok > nul
-	$(VIMPROG) -u dos.vim $(COMMON_ARGS) -s dotest.in $(*B).in
+	$(VIMPROG) -u util\dos.vim $(COMMON_ARGS) -s dotest.in $(*B).in
 	-@if exist test.out MOVE /y test.out $(DOSTMP)\$(*B).out > nul
 	-@if exist $(*B).in.bak move /y $(*B).in.bak $(*B).in > nul
 	-@if exist test.ok del test.ok
@@ -118,7 +118,7 @@
 	-@if exist XfakeHOME rd /s /q XfakeHOME
 	-@del X*
 	-@if exist viminfo del viminfo
-	$(VIMPROG) -u dos.vim $(COMMON_ARGS) "+set ff=unix|f test.out|wq" \
+	$(VIMPROG) -u util\dos.vim $(COMMON_ARGS) "+set ff=unix|f test.out|wq" \
 		$(DOSTMP)\$(*B).out
 	@diff test.out $*.ok & if errorlevel 1 \
 		( move /y test.out $*.failed > nul \
@@ -148,10 +148,10 @@
 
 test_gui_init.res: test_gui_init.vim
 	@echo $(VIMPROG) > vimcmd
-	$(VIMPROG) -u gui_preinit.vim -U gui_init.vim $(NO_PLUGINS) -S runtest.vim $*.vim
+	$(VIMPROG) -u util\gui_preinit.vim -U util\gui_init.vim $(NO_PLUGINS) -S runtest.vim $*.vim
 	@del vimcmd
 
-opt_test.vim: gen_opt_test.vim ../optiondefs.h ../../runtime/doc/options.txt
+opt_test.vim: util/gen_opt_test.vim ../optiondefs.h ../../runtime/doc/options.txt
 	$(VIMPROG) -e -s -u NONE $(COMMON_ARGS) --nofork -S $**
 	@if exist test.log ( type test.log & exit /b 1 )
 
diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms
index b6c6fab..ad21395 100644
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -56,7 +56,7 @@
 	-@ write sys$output "                "$*" "
 	-@ write sys$output "-----------------------------------------------"
 	-@ !run the test
-	-@ create/term/wait/nodetach mcr $(VIMPROG) $(GUI_OPTION) -u vms.vim --noplugin -s dotest.in $*.in
+	-@ create/term/wait/nodetach mcr $(VIMPROG) $(GUI_OPTION) -u util/vms.vim --noplugin -s dotest.in $*.in
 	-@ !analyse the result
 	-@ directory /size/date test.out
 	-@ if "''F$SEARCH("test.out.*")'" .NES. "" then rename/nolog test.out $*.out 
@@ -89,9 +89,9 @@
 	-@ write sys$output "-----------------------------------------------"
 	-@ write sys$output "MAKE_VMS.MMS options:"
 	-@ write sys$output "   WANT_GUI   = ""$(WANT_GUI)"" "
-	-@ write sys$output "Default vimrc file is VMS.VIM:"
+	-@ write sys$output "Default vimrc file is util/VMS.VIM:"
 	-@ write sys$output "-----------------------------------------------"
-	-@ type VMS.VIM
+	-@ type util/VMS.VIM
 
 clean :
 	-@ if "''F$SEARCH("*.out")'"        .NES. "" then delete/noconfirm/nolog *.out.*
diff --git a/src/testdir/Makefile b/src/testdir/Makefile
index 680d1a1..f784d80 100644
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -21,7 +21,7 @@
 # VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=45 --log-file=valgrind.$*
 
 # To execute one test, e.g. in gdb, use something like this:
-# run -f -u unix.vim --gui-dialog-file guidialog -U NONE --noplugin --not-a-term -S runtest.vim test_name.vim
+# run -f -u util/unix.vim --gui-dialog-file guidialog -U NONE --noplugin --not-a-term -S runtest.vim test_name.vim
 
 default: nongui
 
@@ -48,7 +48,7 @@
 		then cp test.log test_result.log; \
 		else echo No failures reported > test_result.log; \
 		fi"
-	$(VIMPROG) -u NONE $(NO_INITS) -S summarize.vim messages $(REDIR_TEST_TO_NULL)
+	$(VIMPROG) -u NONE $(NO_INITS) -S util/summarize.vim messages $(REDIR_TEST_TO_NULL)
 	@rm -f starttime
 	@echo
 	@echo 'Test results:'
@@ -87,7 +87,7 @@
 
 RM_ON_RUN = test.out X* viminfo
 RM_ON_START = test.ok benchmark.out
-RUN_VIMPROG = VIMRUNTIME=$(SCRIPTSOURCE) $(VALGRIND) $(VIMPROG) -f $(GUI_FLAG) -u unix.vim $(NO_INITS) -s dotest.in
+RUN_VIMPROG = VIMRUNTIME=$(SCRIPTSOURCE) $(VALGRIND) $(VIMPROG) -f $(GUI_FLAG) -u util/unix.vim $(NO_INITS) -s dotest.in
 
 # Delete files that may interfere with running tests.  This includes some files
 # that may result from working on the tests, not only from running them.
@@ -141,7 +141,7 @@
 # to write and a lot easier to read and debug.
 # Limitation: Only works with the +eval feature.
 # Add --gui-dialog-file to avoid getting stuck in a dialog.
-RUN_VIMTEST = VIMRUNTIME=$(SCRIPTSOURCE) $(VALGRIND) $(VIMPROG) -f $(GUI_FLAG) -u unix.vim --gui-dialog-file guidialog
+RUN_VIMTEST = VIMRUNTIME=$(SCRIPTSOURCE) $(VALGRIND) $(VIMPROG) -f $(GUI_FLAG) -u util/unix.vim --gui-dialog-file guidialog
 
 newtests: newtestssilent
 	@/bin/sh -c "if test -f messages; then cat messages; fi"
@@ -174,13 +174,13 @@
 	@echo "$(VIMPROG)" > vimcmd
 	@echo "$(RUN_GVIMTEST_WITH_GVIMRC)" >> vimcmd
 	if test -n "$${ASAN_OPTIONS}"; then \
-		ASAN_OPTIONS="$${ASAN_OPTIONS}_$*" UBSAN_OPTIONS="$${UBSAN_OPTIONS}_$*" $(RUN_VIMTEST) -u gui_preinit.vim -U gui_init.vim $(NO_PLUGINS) -S runtest.vim $< ; \
+		ASAN_OPTIONS="$${ASAN_OPTIONS}_$*" UBSAN_OPTIONS="$${UBSAN_OPTIONS}_$*" $(RUN_VIMTEST) -u util/gui_preinit.vim -U util/gui_init.vim $(NO_PLUGINS) -S runtest.vim $< ; \
 	else \
-		$(RUN_VIMTEST) -u gui_preinit.vim -U gui_init.vim $(NO_PLUGINS) -S runtest.vim $< ; \
+		$(RUN_VIMTEST) -u util/gui_preinit.vim -U util/gui_init.vim $(NO_PLUGINS) -S runtest.vim $< ; \
 	fi
 	@rm vimcmd
 
-GEN_OPT_DEPS = gen_opt_test.vim ../optiondefs.h ../../runtime/doc/options.txt
+GEN_OPT_DEPS = util/gen_opt_test.vim ../optiondefs.h ../../runtime/doc/options.txt
 
 opt_test.vim: $(GEN_OPT_DEPS)
 	if test -n "$${ASAN_OPTIONS}"; then \
diff --git a/src/testdir/README.txt b/src/testdir/README.txt
index c7067ac..1ae0d28 100644
--- a/src/testdir/README.txt
+++ b/src/testdir/README.txt
@@ -1,5 +1,8 @@
-This directory contains tests for various Vim features.
+This directory contains test cases for various Vim features.
+The auxiliary functions to perform the tests are in the util/ folder.
+
 For testing an indent script see runtime/indent/testdir/README.txt.
+For testing a syntax script see runtime/syntax/testdir/README.txt.
 
 If it makes sense, add a new test method to an already existing file.  You may
 want to separate it from other tests with comment lines.
diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim
index a56679c..7822da9 100644
--- a/src/testdir/runtest.vim
+++ b/src/testdir/runtest.vim
@@ -101,13 +101,13 @@
 set shellslash
 
 " Common with all tests on all systems.
-source setup.vim
+source util/setup.vim
 
 " Needed for RunningWithValgrind().
-source shared.vim
+source util/shared.vim
 
 " Needed for the various Check commands
-source check.vim
+source util/check.vim
 
 " For consistency run all tests with 'nocompatible' set.
 " This also enables use of line continuation.
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index c78088d..43605f7 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -1,7 +1,7 @@
 " Tests for autocommands
 
-source screendump.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+import './util/vim9.vim' as v9
 
 func s:cleanup_buffers() abort
   for bnr in range(1, bufnr('$'))
diff --git a/src/testdir/test_balloon.vim b/src/testdir/test_balloon.vim
index 6f89f2f..1fe0ae8 100644
--- a/src/testdir/test_balloon.vim
+++ b/src/testdir/test_balloon.vim
@@ -4,7 +4,7 @@
 CheckNotGui
 CheckFeature balloon_eval_term
 
-source screendump.vim
+source util/screendump.vim
 
 let s:common_script =<< trim [CODE]
   call setline(1, ["one one one", "two tXo two", "three three three"])
diff --git a/src/testdir/test_blob.vim b/src/testdir/test_blob.vim
index addb395..93005a6 100644
--- a/src/testdir/test_blob.vim
+++ b/src/testdir/test_blob.vim
@@ -1,6 +1,6 @@
 " Tests for the Blob types
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func TearDown()
   " Run garbage collection after every test
diff --git a/src/testdir/test_breakindent.vim b/src/testdir/test_breakindent.vim
index e081307..bb164f7 100644
--- a/src/testdir/test_breakindent.vim
+++ b/src/testdir/test_breakindent.vim
@@ -6,7 +6,7 @@
 " Test_breakindent08())
 CheckOption breakindent
 
-source screendump.vim
+source util/screendump.vim
 
 func SetUp()
   let s:input ="\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP"
diff --git a/src/testdir/test_bufline.vim b/src/testdir/test_bufline.vim
index 1aa0c01..9f0a0a6 100644
--- a/src/testdir/test_bufline.vim
+++ b/src/testdir/test_bufline.vim
@@ -1,6 +1,6 @@
 " Tests for setbufline(), getbufline(), appendbufline(), deletebufline()
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_setbufline_getbufline()
   " similar to Test_set_get_bufline()
diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim
index 6a0ee54..dcd0526 100644
--- a/src/testdir/test_channel.vim
+++ b/src/testdir/test_channel.vim
@@ -3,7 +3,7 @@
 " When +channel is supported then +job is too, so we don't check for that.
 CheckFeature channel
 
-source screendump.vim
+source util/screendump.vim
 
 let s:python = PythonProg()
 if s:python == ''
diff --git a/src/testdir/test_clientserver.vim b/src/testdir/test_clientserver.vim
index 3d69eed..6fe0f69 100644
--- a/src/testdir/test_clientserver.vim
+++ b/src/testdir/test_clientserver.vim
@@ -8,7 +8,7 @@
 
 CheckFeature clientserver
 
-source shared.vim
+source util/shared.vim
 
 func Check_X11_Connection()
   if has('x11')
diff --git a/src/testdir/test_clipmethod.vim b/src/testdir/test_clipmethod.vim
index 31a381c..9b34658 100644
--- a/src/testdir/test_clipmethod.vim
+++ b/src/testdir/test_clipmethod.vim
@@ -1,6 +1,6 @@
 " Tests for clipmethod
 
-source window_manager.vim
+source util/window_manager.vim
 
 CheckFeature clipboard_working
 CheckFeature xterm_clipboard
@@ -123,7 +123,7 @@
 
   let l:lines =<< trim END
     set cpm=x11
-    source shared.vim
+    source util/shared.vim
 
     func Test()
       clipreset
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index cfc64f7..a68d3e1 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -1,7 +1,7 @@
 " Tests for editing the command line.
 
-source screendump.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+import './util/vim9.vim' as v9
 
 func SetUp()
   func SaveLastScreenLine()
diff --git a/src/testdir/test_cmdwin.vim b/src/testdir/test_cmdwin.vim
index 9c37f20..6b2850a 100644
--- a/src/testdir/test_cmdwin.vim
+++ b/src/testdir/test_cmdwin.vim
@@ -1,6 +1,6 @@
 " Tests for editing the command line.
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_getcmdwintype()
   call feedkeys("q/:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
diff --git a/src/testdir/test_conceal.vim b/src/testdir/test_conceal.vim
index ac27dba..360e600 100644
--- a/src/testdir/test_conceal.vim
+++ b/src/testdir/test_conceal.vim
@@ -2,7 +2,7 @@
 
 CheckFeature conceal
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_conceal_two_windows()
   CheckScreendump
diff --git a/src/testdir/test_crash.vim b/src/testdir/test_crash.vim
index f497d9e..ff9b63b 100644
--- a/src/testdir/test_crash.vim
+++ b/src/testdir/test_crash.vim
@@ -1,5 +1,5 @@
 " Some tests, that used to crash Vim
-source screendump.vim
+source util/screendump.vim
 
 CheckScreendump
 
diff --git a/src/testdir/test_cursorline.vim b/src/testdir/test_cursorline.vim
index a497d0e..01a94ba 100644
--- a/src/testdir/test_cursorline.vim
+++ b/src/testdir/test_cursorline.vim
@@ -1,6 +1,6 @@
 " Test for cursorline and cursorlineopt
 
-source screendump.vim
+source util/screendump.vim
 
 func s:screen_attr(lnum) abort
   return map(range(1, 8), 'screenattr(a:lnum, v:val)')
diff --git a/src/testdir/test_debugger.vim b/src/testdir/test_debugger.vim
index be881b5..2644209 100644
--- a/src/testdir/test_debugger.vim
+++ b/src/testdir/test_debugger.vim
@@ -1,6 +1,6 @@
 " Tests for the Vim script debug commands
 
-source screendump.vim
+source util/screendump.vim
 
 CheckRunVimInTerminal
 
diff --git a/src/testdir/test_delete.vim b/src/testdir/test_delete.vim
index 59d569f..63e83d3 100644
--- a/src/testdir/test_delete.vim
+++ b/src/testdir/test_delete.vim
@@ -1,6 +1,6 @@
 " Test for delete().
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_file_delete()
   split Xfdelfile
diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim
index 5c38738..6af3fb0 100644
--- a/src/testdir/test_diffmode.vim
+++ b/src/testdir/test_diffmode.vim
Binary files differ
diff --git a/src/testdir/test_display.vim b/src/testdir/test_display.vim
index be6ca7b..5f597f1 100644
--- a/src/testdir/test_display.vim
+++ b/src/testdir/test_display.vim
@@ -4,7 +4,7 @@
   set term=ansi
 endif
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_display_foldcolumn()
   CheckFeature folding
diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim
index f8ef1d8..c951f3a 100644
--- a/src/testdir/test_edit.vim
+++ b/src/testdir/test_edit.vim
@@ -4,7 +4,7 @@
   let &t_kD="[3;*~"
 endif
 
-source screendump.vim
+source util/screendump.vim
 
 " Needs to come first until the bug in getchar() is
 " fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ
diff --git a/src/testdir/test_eval_stuff.vim b/src/testdir/test_eval_stuff.vim
index ada4667..39bb4ba 100644
--- a/src/testdir/test_eval_stuff.vim
+++ b/src/testdir/test_eval_stuff.vim
Binary files differ
diff --git a/src/testdir/test_excmd.vim b/src/testdir/test_excmd.vim
index 66ef501..8c32828 100644
--- a/src/testdir/test_excmd.vim
+++ b/src/testdir/test_excmd.vim
@@ -1,6 +1,6 @@
 " Tests for various Ex commands.
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_ex_delete()
   new
diff --git a/src/testdir/test_execute_func.vim b/src/testdir/test_execute_func.vim
index e1c85b0..3e6c2fe 100644
--- a/src/testdir/test_execute_func.vim
+++ b/src/testdir/test_execute_func.vim
@@ -1,6 +1,6 @@
 " test execute()
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func NestedEval()
   let nested = execute('echo "nested\nlines"')
diff --git a/src/testdir/test_exists.vim b/src/testdir/test_exists.vim
index 404b15c..c886f0b 100644
--- a/src/testdir/test_exists.vim
+++ b/src/testdir/test_exists.vim
@@ -1,6 +1,6 @@
 " Tests for the exists() function
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Test_exists()
   augroup myagroup
diff --git a/src/testdir/test_expr.vim b/src/testdir/test_expr.vim
index e08019a..ec44d80 100644
--- a/src/testdir/test_expr.vim
+++ b/src/testdir/test_expr.vim
@@ -1,6 +1,6 @@
 " Tests for expressions.
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Test_equal()
   let base = {}
diff --git a/src/testdir/test_filter_map.vim b/src/testdir/test_filter_map.vim
index 39da767..138ca18 100644
--- a/src/testdir/test_filter_map.vim
+++ b/src/testdir/test_filter_map.vim
@@ -1,6 +1,6 @@
 " Test filter() and map()
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 " list with expression string
 func Test_filter_map_list_expr_string()
diff --git a/src/testdir/test_findfile.vim b/src/testdir/test_findfile.vim
index ec380cb..acb26e0 100644
--- a/src/testdir/test_findfile.vim
+++ b/src/testdir/test_findfile.vim
@@ -1,6 +1,6 @@
 " Test findfile() and finddir()
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 let s:files = [ 'Xfinddir1/foo',
       \         'Xfinddir1/bar',
diff --git a/src/testdir/test_float_func.vim b/src/testdir/test_float_func.vim
index 23e3c31..db08dd5 100644
--- a/src/testdir/test_float_func.vim
+++ b/src/testdir/test_float_func.vim
@@ -1,6 +1,6 @@
 " test float functions
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Test_abs()
   call assert_equal('1.23', string(abs(1.23)))
diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim
index 0fc99bc..fc63b15 100644
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
Binary files differ
diff --git a/src/testdir/test_format.vim b/src/testdir/test_format.vim
index b6be204..b192938 100644
--- a/src/testdir/test_format.vim
+++ b/src/testdir/test_format.vim
@@ -1,6 +1,6 @@
 " Tests for expressions.
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Test_printf_pos_misc()
   let lines =<< trim END
diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim
index ae16d1e..4fac472 100644
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -1,7 +1,7 @@
 " Tests for various functions.
 
-source screendump.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+import './util/vim9.vim' as v9
 
 " Must be done first, since the alternate buffer must be unset.
 func Test_00_bufexists()
diff --git a/src/testdir/test_glob2regpat.vim b/src/testdir/test_glob2regpat.vim
index 965ca5c..66ace12 100644
--- a/src/testdir/test_glob2regpat.vim
+++ b/src/testdir/test_glob2regpat.vim
@@ -1,6 +1,6 @@
 " Test glob2regpat()
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Test_glob2regpat_invalid()
   call assert_equal('^1\.33$', glob2regpat(1.33))
diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim
index 45966eb..9fd840a 100644
--- a/src/testdir/test_gui.vim
+++ b/src/testdir/test_gui.vim
@@ -2,7 +2,7 @@
 
 CheckCanRunGui
 
-source setup_gui.vim
+source util/setup_gui.vim
 
 func Setup()
   call GUISetUpCommon()
diff --git a/src/testdir/test_gui_init.vim b/src/testdir/test_gui_init.vim
index f3effff..1a60a49 100644
--- a/src/testdir/test_gui_init.vim
+++ b/src/testdir/test_gui_init.vim
@@ -3,7 +3,7 @@
 
 CheckCanRunGui
 
-source setup_gui.vim
+source util/setup_gui.vim
 
 func Setup()
   call GUISetUpCommon()
diff --git a/src/testdir/test_help.vim b/src/testdir/test_help.vim
index e87d312..dac153d 100644
--- a/src/testdir/test_help.vim
+++ b/src/testdir/test_help.vim
@@ -1,6 +1,6 @@
 " Tests for :help
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Test_help_restore_snapshot()
   help
diff --git a/src/testdir/test_highlight.vim b/src/testdir/test_highlight.vim
index 487eb8d..5ce4f1e 100644
--- a/src/testdir/test_highlight.vim
+++ b/src/testdir/test_highlight.vim
@@ -1,8 +1,8 @@
 " Tests for ":highlight" and highlighting.
 
-source screendump.vim
-source script_util.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+source util/script_util.vim
+import './util/vim9.vim' as v9
 
 func ClearDict(d)
   for k in keys(a:d)
diff --git a/src/testdir/test_hlsearch.vim b/src/testdir/test_hlsearch.vim
index 18992d3..8bf7f0a 100644
--- a/src/testdir/test_hlsearch.vim
+++ b/src/testdir/test_hlsearch.vim
@@ -1,6 +1,6 @@
 " Test for v:hlsearch
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_hlsearch()
   new
diff --git a/src/testdir/test_iminsert.vim b/src/testdir/test_iminsert.vim
index e20cddd..918f17d 100644
--- a/src/testdir/test_iminsert.vim
+++ b/src/testdir/test_iminsert.vim
@@ -1,6 +1,6 @@
 " Test for 'iminsert'
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 let s:imactivatefunc_called = 0
 let s:imstatusfunc_called = 0
diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim
index d906e7a..9ee7876 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -1,7 +1,7 @@
 " Test for insert completion
 
-source screendump.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+import './util/vim9.vim' as v9
 
 " Test for insert expansion
 func Test_ins_complete()
diff --git a/src/testdir/test_lambda.vim b/src/testdir/test_lambda.vim
index 42f53b1..d1daa12 100644
--- a/src/testdir/test_lambda.vim
+++ b/src/testdir/test_lambda.vim
@@ -1,6 +1,6 @@
 " Test for lambda and closure
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Test_lambda_feature()
   call assert_equal(1, has('lambda'))
diff --git a/src/testdir/test_let.vim b/src/testdir/test_let.vim
index a90b55c..0aa8b16 100644
--- a/src/testdir/test_let.vim
+++ b/src/testdir/test_let.vim
@@ -1,6 +1,6 @@
 " Tests for the :let command.
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Test_let()
   " Test to not autoload when assigning.  It causes internal error.
diff --git a/src/testdir/test_listchars.vim b/src/testdir/test_listchars.vim
index 387f6af..38963fa 100644
--- a/src/testdir/test_listchars.vim
+++ b/src/testdir/test_listchars.vim
@@ -1,6 +1,6 @@
 " Tests for 'listchars' display with 'list' and :list
 
-source screendump.vim
+source util/screendump.vim
 
 func Check_listchars(expected, end_lnum, end_scol = -1, leftcol = 0)
   if a:leftcol > 0
diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim
index a7e9cb7..f806eb8 100644
--- a/src/testdir/test_listdict.vim
+++ b/src/testdir/test_listdict.vim
@@ -1,7 +1,7 @@
 " Tests for the List and Dict types
 scriptencoding utf-8
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func TearDown()
   " Run garbage collection after every test
diff --git a/src/testdir/test_listlbr.vim b/src/testdir/test_listlbr.vim
index d186983..7430ec6 100644
--- a/src/testdir/test_listlbr.vim
+++ b/src/testdir/test_listlbr.vim
@@ -6,7 +6,7 @@
 CheckOption linebreak
 CheckFeature conceal
 
-source screendump.vim
+source util/screendump.vim
 
 function s:screen_lines(lnum, width) abort
   return ScreenLines(a:lnum, a:width)
diff --git a/src/testdir/test_listlbr_utf8.vim b/src/testdir/test_listlbr_utf8.vim
index d69cae7..be77566 100644
--- a/src/testdir/test_listlbr_utf8.vim
+++ b/src/testdir/test_listlbr_utf8.vim
@@ -7,7 +7,7 @@
 CheckFeature conceal
 CheckFeature signs
 
-source screendump.vim
+source util/screendump.vim
 
 func s:screen_lines(lnum, width) abort
   return ScreenLines(a:lnum, a:width)
diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim
index 28b0188..01f2d1f 100644
--- a/src/testdir/test_mapping.vim
+++ b/src/testdir/test_mapping.vim
@@ -1,7 +1,7 @@
 " Tests for mappings and abbreviations
 
-source screendump.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+import './util/vim9.vim' as v9
 
 func Test_abbreviation()
   new
diff --git a/src/testdir/test_match.vim b/src/testdir/test_match.vim
index 35311d4..5d598eb 100644
--- a/src/testdir/test_match.vim
+++ b/src/testdir/test_match.vim
@@ -1,7 +1,7 @@
 " Test for :match, :2match, :3match, clearmatches(), getmatches(), matchadd(),
 " matchaddpos(), matcharg(), matchdelete(), and setmatches().
 
-source screendump.vim
+source util/screendump.vim
 
 function Test_match()
   highlight MyGroup1 term=bold ctermbg=red guibg=red
diff --git a/src/testdir/test_menu.vim b/src/testdir/test_menu.vim
index f441190..e42dd0c 100644
--- a/src/testdir/test_menu.vim
+++ b/src/testdir/test_menu.vim
@@ -2,7 +2,7 @@
 
 CheckFeature menu
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_load_menu()
   try
diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim
index e9eb099..61193df 100644
--- a/src/testdir/test_messages.vim
+++ b/src/testdir/test_messages.vim
@@ -1,6 +1,6 @@
 " Tests for :messages, :echomsg, :echoerr
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_messages()
   let oldmore = &more
diff --git a/src/testdir/test_modeless.vim b/src/testdir/test_modeless.vim
index d96be4b..ef597ad 100644
--- a/src/testdir/test_modeless.vim
+++ b/src/testdir/test_modeless.vim
@@ -4,7 +4,7 @@
 CheckNotGui
 CheckUnix
 
-source mouse.vim
+source util/mouse.vim
 
 " Test for modeless characterwise selection (single click)
 func Test_modeless_characterwise_selection()
diff --git a/src/testdir/test_move.vim b/src/testdir/test_move.vim
index c45157f..d0b68f7 100644
--- a/src/testdir/test_move.vim
+++ b/src/testdir/test_move.vim
@@ -1,6 +1,6 @@
 " Test the ":move" command.
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_move()
   enew!
diff --git a/src/testdir/test_mswin_event.vim b/src/testdir/test_mswin_event.vim
index 0a4407c..96d1247 100644
--- a/src/testdir/test_mswin_event.vim
+++ b/src/testdir/test_mswin_event.vim
@@ -2,7 +2,7 @@
 " Most of this works the same in Windows GUI as well as Windows console.
 
 CheckMSWindows
-source mouse.vim
+source util/mouse.vim
 
 " Helper function for sending a grouped sequence of low level key presses
 " The modifier key(s) can be included as VK Key Codes in the sequence
diff --git a/src/testdir/test_netbeans.vim b/src/testdir/test_netbeans.vim
index cfb9736..d3d5e8b 100644
--- a/src/testdir/test_netbeans.vim
+++ b/src/testdir/test_netbeans.vim
@@ -876,7 +876,7 @@
   call delete("Xnetbeans")
   call writefile([], "Xnetbeans", 'D')
   let after =<< trim END
-    source shared.vim
+    source util/shared.vim
     set cpo&vim
 
     func ReadXnetbeans()
diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim
index aa1fa10..3746964 100644
--- a/src/testdir/test_normal.vim
+++ b/src/testdir/test_normal.vim
@@ -1,7 +1,7 @@
 " Test for various Normal mode commands
 
-import './vim9.vim' as v9
-source screendump.vim
+import './util/vim9.vim' as v9
+source util/screendump.vim
 
 func Setup_NewWindow()
   10new
diff --git a/src/testdir/test_number.vim b/src/testdir/test_number.vim
index 10b6988..bac01d1 100644
--- a/src/testdir/test_number.vim
+++ b/src/testdir/test_number.vim
@@ -1,6 +1,6 @@
 " Test for 'number' and 'relativenumber'
 
-source screendump.vim
+source util/screendump.vim
 
 func s:screen_lines(start, end) abort
   return ScreenLines([a:start, a:end], 8)
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index e4bf63a..0846466 100644
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -340,12 +340,12 @@
   " Expand directories.
   call feedkeys(":set cdpath=./\<C-A>\<C-B>\"\<CR>", 'tx')
   call assert_match(' ./samples/ ', @:)
-  call assert_notmatch(' ./summarize.vim ', @:)
+  call assert_notmatch(' ./util/summarize.vim ', @:)
   set cdpath&
 
   " Expand files and directories.
   call feedkeys(":set tags=./\<C-A>\<C-B>\"\<CR>", 'tx')
-  call assert_match(' ./samples/.* ./summarize.vim', @:)
+  call assert_match(' ./samples/.* ./test10.in', @:)
 
   call feedkeys(":set tags=./\\\\ dif\<C-A>\<C-B>\"\<CR>", 'tx')
   call assert_equal('"set tags=./\\ diff diffexpr diffopt', @:)
diff --git a/src/testdir/test_options_all.vim b/src/testdir/test_options_all.vim
index a2330ec..e6da82b 100644
--- a/src/testdir/test_options_all.vim
+++ b/src/testdir/test_options_all.vim
@@ -1,7 +1,7 @@
 " Test for options
 
 " opt_test.vim is generated from src/optiondefs.h and runtime/doc/options.txt
-" using gen_opt_test.vim
+" using util/gen_opt_test.vim
 if filereadable('opt_test.vim')
   source opt_test.vim
 else
diff --git a/src/testdir/test_plugin_matchparen.vim b/src/testdir/test_plugin_matchparen.vim
index 47fd3ed..a05fc5d 100644
--- a/src/testdir/test_plugin_matchparen.vim
+++ b/src/testdir/test_plugin_matchparen.vim
@@ -4,7 +4,7 @@
   set term=ansi
 endif
 
-source screendump.vim
+source util/screendump.vim
 
 " Test for scrolling that modifies buffer during visual block
 func Test_visual_block_scroll()
diff --git a/src/testdir/test_plugin_termdebug.vim b/src/testdir/test_plugin_termdebug.vim
index 9017bda..ed20247 100644
--- a/src/testdir/test_plugin_termdebug.vim
+++ b/src/testdir/test_plugin_termdebug.vim
@@ -1,6 +1,6 @@
 " Test for the termdebug plugin
 
-source screendump.vim
+source util/screendump.vim
 
 CheckUnix
 CheckFeature terminal
diff --git a/src/testdir/test_plugin_tutor.vim b/src/testdir/test_plugin_tutor.vim
index 5c3dcd9..da97fcf 100644
--- a/src/testdir/test_plugin_tutor.vim
+++ b/src/testdir/test_plugin_tutor.vim
@@ -1,7 +1,7 @@
 " Test for the new-tutor plugin
 
-source screendump.vim
-source script_util.vim
+source util/screendump.vim
+source util/script_util.vim
 
 func SetUp()
   set nocompatible
diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim
index 7e268e8..2ae0165 100644
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -1,6 +1,6 @@
 " Test for completion menu
 
-source screendump.vim
+source util/screendump.vim
 
 let g:months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
 let g:setting = ''
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 6464e1e..21d6819 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -2,7 +2,7 @@
 
 CheckFeature popupwin
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_simple_popup()
   CheckScreendump
diff --git a/src/testdir/test_popupwin_textprop.vim b/src/testdir/test_popupwin_textprop.vim
index a099383..2f30831 100644
--- a/src/testdir/test_popupwin_textprop.vim
+++ b/src/testdir/test_popupwin_textprop.vim
@@ -3,7 +3,7 @@
 CheckFeature popupwin
 CheckFeature textprop
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_textprop_popup()
   CheckScreendump
diff --git a/src/testdir/test_profile.vim b/src/testdir/test_profile.vim
index 8c0260c..fe35e49 100644
--- a/src/testdir/test_profile.vim
+++ b/src/testdir/test_profile.vim
@@ -2,7 +2,7 @@
 
 CheckFeature profile
 
-source screendump.vim
+source util/screendump.vim
 
 if has('prof_nsec')
   let s:header = 'count     total (s)      self (s)'
diff --git a/src/testdir/test_prompt_buffer.vim b/src/testdir/test_prompt_buffer.vim
index 414ed6e..72882e2 100644
--- a/src/testdir/test_prompt_buffer.vim
+++ b/src/testdir/test_prompt_buffer.vim
@@ -2,7 +2,7 @@
 
 CheckFeature channel
 
-source screendump.vim
+source util/screendump.vim
 
 func CanTestPromptBuffer()
   " We need to use a terminal window to be able to feed keys without leaving
diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim
index 91a01a4..514a24e 100644
--- a/src/testdir/test_put.vim
+++ b/src/testdir/test_put.vim
Binary files differ
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 7047d8c..fed9dcf 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -1,9 +1,9 @@
 " Test for the quickfix feature.
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 CheckFeature quickfix
 
-source screendump.vim
+source util/screendump.vim
 
 set encoding=utf-8
 
diff --git a/src/testdir/test_remote.vim b/src/testdir/test_remote.vim
index a10cb12..742c8e2 100644
--- a/src/testdir/test_remote.vim
+++ b/src/testdir/test_remote.vim
@@ -3,8 +3,8 @@
 CheckFeature clientserver
 CheckFeature terminal
 
-source screendump.vim
-source mouse.vim
+source util/screendump.vim
+source util/mouse.vim
 
 let s:remote_works = 0
 let s:skip = 'Skipped: --remote feature is not possible'
diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim
index b4780eb..4e29976 100644
--- a/src/testdir/test_scroll_opt.vim
+++ b/src/testdir/test_scroll_opt.vim
@@ -1,7 +1,7 @@
 " Test for 'scroll', 'scrolloff', 'smoothscroll', etc.
 
-source screendump.vim
-source mouse.vim
+source util/screendump.vim
+source util/mouse.vim
 
 func Test_reset_scroll()
   let scr = &l:scroll
diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim
index 2921e19..4e5fd06 100644
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -1,6 +1,6 @@
 " Test for the search command
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_search_cmdline()
   CheckOption incsearch
diff --git a/src/testdir/test_search_stat.vim b/src/testdir/test_search_stat.vim
index 72d4bcd..5a0f163 100644
--- a/src/testdir/test_search_stat.vim
+++ b/src/testdir/test_search_stat.vim
@@ -1,6 +1,6 @@
 " Tests for search_stats, when "S" is not in 'shortmess'
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_search_stat()
   new
diff --git a/src/testdir/test_selectmode.vim b/src/testdir/test_selectmode.vim
index 705c4ce..285ccb4 100644
--- a/src/testdir/test_selectmode.vim
+++ b/src/testdir/test_selectmode.vim
@@ -4,7 +4,7 @@
 CheckNotGui
 CheckUnix
 
-source mouse.vim
+source util/mouse.vim
 
 " Test for select mode
 func Test_selectmode_basic()
diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim
index 78988b2..83cfc5f 100644
--- a/src/testdir/test_signs.vim
+++ b/src/testdir/test_signs.vim
@@ -2,7 +2,7 @@
 
 CheckFeature signs
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_sign()
   new
diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim
index 0d8ec99..170ea57 100644
--- a/src/testdir/test_spell.vim
+++ b/src/testdir/test_spell.vim
@@ -3,7 +3,7 @@
 
 CheckFeature spell
 
-source screendump.vim
+source util/screendump.vim
 
 func TearDown()
   set nospell
diff --git a/src/testdir/test_stacktrace.vim b/src/testdir/test_stacktrace.vim
index fc8510a..77ea28f 100644
--- a/src/testdir/test_stacktrace.vim
+++ b/src/testdir/test_stacktrace.vim
@@ -1,6 +1,6 @@
 " Test for getstacktrace() and v:stacktrace
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 let s:thisfile = expand('%:p')
 let s:testdir = s:thisfile->fnamemodify(':h')
diff --git a/src/testdir/test_startup.vim b/src/testdir/test_startup.vim
index cd99355..02d1adf 100644
--- a/src/testdir/test_startup.vim
+++ b/src/testdir/test_startup.vim
@@ -1,6 +1,6 @@
 " Tests for startup.
 
-source screendump.vim
+source util/screendump.vim
 
 " Check that loading startup.vim works.
 func Test_startup_script()
diff --git a/src/testdir/test_startup_utf8.vim b/src/testdir/test_startup_utf8.vim
index f31c150..f4de090 100644
--- a/src/testdir/test_startup_utf8.vim
+++ b/src/testdir/test_startup_utf8.vim
@@ -1,6 +1,6 @@
 " Tests for startup using utf-8.
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_read_stdin_utf8()
   let linesin = ['ใƒ†ใ‚นใƒˆ', '€ÀÈÌÒÙ']
diff --git a/src/testdir/test_statusline.vim b/src/testdir/test_statusline.vim
index 7883af3..401eb2a 100644
--- a/src/testdir/test_statusline.vim
+++ b/src/testdir/test_statusline.vim
@@ -3,7 +3,7 @@
 " Not tested yet:
 "   %N
 
-source screendump.vim
+source util/screendump.vim
 
 func SetUp()
   set laststatus=2
diff --git a/src/testdir/test_substitute.vim b/src/testdir/test_substitute.vim
index ef352b9..7108143 100644
--- a/src/testdir/test_substitute.vim
+++ b/src/testdir/test_substitute.vim
@@ -1,6 +1,6 @@
 " Tests for the substitute (:s) command
 
-source screendump.vim
+source util/screendump.vim
 
 " NOTE: This needs to be the first test to be
 "       run in the file, since it depends on
diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim
index 6c56ceb..0374077 100644
--- a/src/testdir/test_syntax.vim
+++ b/src/testdir/test_syntax.vim
@@ -2,7 +2,7 @@
 
 CheckFeature syntax
 
-source screendump.vim
+source util/screendump.vim
 
 func GetSyntaxItem(pat)
   let c = ''
diff --git a/src/testdir/test_tabline.vim b/src/testdir/test_tabline.vim
index d00626a..ce8cb58 100644
--- a/src/testdir/test_tabline.vim
+++ b/src/testdir/test_tabline.vim
@@ -1,6 +1,6 @@
 " Test for tabline
 
-source screendump.vim
+source util/screendump.vim
 
 func TablineWithCaughtError()
   let s:func_in_tabline_called = 1
diff --git a/src/testdir/test_tabpage.vim b/src/testdir/test_tabpage.vim
index a99753e..05c5669 100644
--- a/src/testdir/test_tabpage.vim
+++ b/src/testdir/test_tabpage.vim
@@ -1,6 +1,6 @@
 " Tests for tabpage
 
-source screendump.vim
+source util/screendump.vim
 
 function Test_tabpage()
   CheckFeature quickfix
diff --git a/src/testdir/test_tabpanel.vim b/src/testdir/test_tabpanel.vim
index 257c38d..f292550 100644
--- a/src/testdir/test_tabpanel.vim
+++ b/src/testdir/test_tabpanel.vim
@@ -1,6 +1,6 @@
 " Tests for tabpanel
 
-source screendump.vim
+source util/screendump.vim
 CheckFeature tabpanel
 
 function s:reset()
diff --git a/src/testdir/test_tagfunc.vim b/src/testdir/test_tagfunc.vim
index cceaf45..11a105b 100644
--- a/src/testdir/test_tagfunc.vim
+++ b/src/testdir/test_tagfunc.vim
@@ -1,7 +1,7 @@
 " Test 'tagfunc'
 
-import './vim9.vim' as v9
-source screendump.vim
+import './util/vim9.vim' as v9
+source util/screendump.vim
 
 func TagFunc(pat, flag, info)
   let g:tagfunc_args = [a:pat, a:flag, a:info]
diff --git a/src/testdir/test_tagjump.vim b/src/testdir/test_tagjump.vim
index 1947ab2..47618d0 100644
--- a/src/testdir/test_tagjump.vim
+++ b/src/testdir/test_tagjump.vim
@@ -1,6 +1,6 @@
 " Tests for tagjump (tags and special searches)
 
-source screendump.vim
+source util/screendump.vim
 
 " SEGV occurs in older versions.  (At least 7.4.1748 or older)
 func Test_ptag_with_notagstack()
diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim
index e44ca46..1f2ea7d 100644
--- a/src/testdir/test_termcodes.vim
+++ b/src/testdir/test_termcodes.vim
@@ -4,7 +4,7 @@
 CheckNotGui
 CheckUnix
 
-source mouse.vim
+source util/mouse.vim
 
 func s:TermGuiColorsTest()
   CheckNotMSWindows
diff --git a/src/testdir/test_termencoding.vim b/src/testdir/test_termencoding.vim
index 86b7341..f4f5231 100644
--- a/src/testdir/test_termencoding.vim
+++ b/src/testdir/test_termencoding.vim
@@ -4,7 +4,8 @@
 " This only works with "iconv".
 CheckFeature iconv
 
-source screendump.vim
+source util/screendump.vim
+
 if !CanRunVimInTerminal()
   throw 'Skipped: cannot make screendumps'
 endif
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 7e088b2..0597c36 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -4,8 +4,8 @@
 
 CheckFeature terminal
 
-source screendump.vim
-source mouse.vim
+source util/screendump.vim
+source util/mouse.vim
 
 let s:python = PythonProg()
 let $PROMPT_COMMAND=''
diff --git a/src/testdir/test_terminal2.vim b/src/testdir/test_terminal2.vim
index 996cd98..d2fc4fc 100644
--- a/src/testdir/test_terminal2.vim
+++ b/src/testdir/test_terminal2.vim
@@ -4,8 +4,8 @@
 
 CheckFeature terminal
 
-source screendump.vim
-source mouse.vim
+source util/screendump.vim
+source util/mouse.vim
 
 let $PROMPT_COMMAND=''
 
diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim
index e86fdf0..218b4e6 100644
--- a/src/testdir/test_terminal3.vim
+++ b/src/testdir/test_terminal3.vim
@@ -4,10 +4,10 @@
 
 CheckFeature terminal
 
-source screendump.vim
-source mouse.vim
+source util/screendump.vim
+source util/mouse.vim
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 let $PROMPT_COMMAND=''
 
@@ -806,7 +806,7 @@
 " Test for sync buffer cwd with shell's pwd
 func Test_terminal_sync_shell_dir()
   CheckUnix
-  " The test always use sh (see src/testdir/unix.vim).
+  " The test always use sh (see src/testdir/util/unix.vim).
   " BSD's sh doesn't seem to play well with the OSC 7 escape sequence.
   CheckNotBSD
 
diff --git a/src/testdir/test_terminal_fail.vim b/src/testdir/test_terminal_fail.vim
index 0ee00a1..c2bc4bd 100644
--- a/src/testdir/test_terminal_fail.vim
+++ b/src/testdir/test_terminal_fail.vim
@@ -4,8 +4,6 @@
 
 CheckFeature terminal
 
-source shared.vim
-
 func Test_terminal_redir_fails()
   CheckUnix
 
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index 856a526..b5c9f63 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -3,8 +3,8 @@
 
 CheckFeature textprop
 
-source screendump.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+import './util/vim9.vim' as v9
 
 func Test_proptype_global()
   call prop_type_add('comment', {'highlight': 'Directory', 'priority': 123, 'start_incl': 1, 'end_incl': 1})
diff --git a/src/testdir/test_timers.vim b/src/testdir/test_timers.vim
index 0f9fddb..9ba5d0f 100644
--- a/src/testdir/test_timers.vim
+++ b/src/testdir/test_timers.vim
@@ -2,7 +2,7 @@
 
 CheckFeature timers
 
-source screendump.vim
+source util/screendump.vim
 
 func SetUp()
   " The tests here use timers, thus are sensitive to timing.
diff --git a/src/testdir/test_trycatch.vim b/src/testdir/test_trycatch.vim
index 1fde607..0488861 100644
--- a/src/testdir/test_trycatch.vim
+++ b/src/testdir/test_trycatch.vim
@@ -1,7 +1,7 @@
 " Test try-catch-finally exception handling
 " Most of this was formerly in test49.
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 "-------------------------------------------------------------------------------
 " Test environment							    {{{1
diff --git a/src/testdir/test_tuple.vim b/src/testdir/test_tuple.vim
index 45f730d..c6d8e81 100644
--- a/src/testdir/test_tuple.vim
+++ b/src/testdir/test_tuple.vim
@@ -1,6 +1,6 @@
 " Tests for the Tuple types
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func TearDown()
   " Run garbage collection after every test
diff --git a/src/testdir/test_undo.vim b/src/testdir/test_undo.vim
index b4506cb..a68321f 100644
--- a/src/testdir/test_undo.vim
+++ b/src/testdir/test_undo.vim
@@ -3,7 +3,7 @@
 " undo-able pieces.  Do that by setting 'undolevels'.
 " Also tests :earlier and :later.
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_undotree()
   new
diff --git a/src/testdir/test_user_func.vim b/src/testdir/test_user_func.vim
index 8a32afe..d12ad8e 100644
--- a/src/testdir/test_user_func.vim
+++ b/src/testdir/test_user_func.vim
@@ -3,7 +3,7 @@
 " Also test that a builtin function cannot be replaced.
 " Also test for regression when calling arbitrary expression.
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func Table(title, ...)
   let ret = a:title
diff --git a/src/testdir/test_usercommands.vim b/src/testdir/test_usercommands.vim
index e61a9ce..636ac2b 100644
--- a/src/testdir/test_usercommands.vim
+++ b/src/testdir/test_usercommands.vim
@@ -1,8 +1,8 @@
 " Tests for user defined commands
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
-source screendump.vim
+source util/screendump.vim
 
 " Test for <mods> in user defined commands
 function Test_cmdmods()
diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim
index 9c2a749..a0cd5bd 100644
--- a/src/testdir/test_utf8.vim
+++ b/src/testdir/test_utf8.vim
@@ -1,6 +1,6 @@
 " Tests for Unicode manipulations
 
-source screendump.vim
+source util/screendump.vim
 
 " Visual block Insert adjusts for multi-byte char
 func Test_visual_block_insert()
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index dde750b..c0f56d9 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1,6 +1,6 @@
 " Test Vim9 assignments
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 let s:appendToMe = 'xxx'
 let s:addToMe = 111
diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim
index a653c7c..675dcd0 100644
--- a/src/testdir/test_vim9_builtin.vim
+++ b/src/testdir/test_vim9_builtin.vim
@@ -1,7 +1,7 @@
 " Test using builtin functions in the Vim9 script language.
 
-source screendump.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+import './util/vim9.vim' as v9
 
 " Test for passing too many or too few arguments to builtin functions
 func Test_internalfunc_arg_error()
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index e08c40c..4c8c1cd 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -1,6 +1,6 @@
 " Test Vim9 classes
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 def Test_class_basic()
   # Class supported only in "vim9script"
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 0d525b4..1380440 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -1,6 +1,6 @@
 " Test commands that are not compiled in a :def function
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 def Test_vim9cmd()
   var lines =<< trim END
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index f1059fb..4a86a9b 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -1,6 +1,6 @@
 " Test the :disassemble command, and compilation as a side effect
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 func s:NotCompiled()
   echo "not"
diff --git a/src/testdir/test_vim9_enum.vim b/src/testdir/test_vim9_enum.vim
index 0ce7dad..d2ccb77 100644
--- a/src/testdir/test_vim9_enum.vim
+++ b/src/testdir/test_vim9_enum.vim
@@ -1,6 +1,6 @@
 " Test Vim9 enums
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 " Test for parsing an enum definition
 def Test_enum_parse()
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 22d6681..d47c451 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -1,6 +1,6 @@
 " Tests for Vim9 script expressions
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 let g:cond = v:false
 def FuncOne(arg: number): string
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 42b8b4f..e214d95 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
Binary files differ
diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim
index 0eeaa7f..191008e 100644
--- a/src/testdir/test_vim9_import.vim
+++ b/src/testdir/test_vim9_import.vim
@@ -1,7 +1,7 @@
 " Test import/export of the Vim9 script language.
 " Also the autoload mechanism.
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 let s:export_script_lines =<< trim END
   vim9script
diff --git a/src/testdir/test_vim9_python3.vim b/src/testdir/test_vim9_python3.vim
index 9817dd8..42a112a 100644
--- a/src/testdir/test_vim9_python3.vim
+++ b/src/testdir/test_vim9_python3.vim
@@ -1,5 +1,5 @@
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 CheckFeature python3
 
 def Test_python3_py3eval_locals()
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 52d64c6..d4043d1 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -1,7 +1,7 @@
 " Test various aspects of the Vim9 script language.
 
-import './vim9.vim' as v9
-source screendump.vim
+import './util/vim9.vim' as v9
+source util/screendump.vim
 
 def Test_vim9script_feature()
   # example from the help, here the feature is always present
@@ -3652,12 +3652,12 @@
       ], 'E1144:')
   v9.CheckScriptSuccess([
       'vim9script',
-      'import "./vim9.vim" as v9',
+      'import "./util/vim9.vim" as v9',
       'function v9.CheckScriptSuccess # comment',
       ])
   v9.CheckScriptFailure([
       'vim9script',
-      'import "./vim9.vim" as v9',
+      'import "./util/vim9.vim" as v9',
       'function v9.CheckScriptSuccess# comment',
       ], 'E1048: Item not found in script: CheckScriptSuccess#')
 
diff --git a/src/testdir/test_vim9_typealias.vim b/src/testdir/test_vim9_typealias.vim
index 9d7bd89..f09f5d8 100644
--- a/src/testdir/test_vim9_typealias.vim
+++ b/src/testdir/test_vim9_typealias.vim
@@ -1,6 +1,6 @@
 " Test Vim9 type aliases
 
-import './vim9.vim' as v9
+import './util/vim9.vim' as v9
 
 " Test for :type command to create type aliases
 def Test_typealias()
diff --git a/src/testdir/test_vimscript.vim b/src/testdir/test_vimscript.vim
index e1000fb..af78d1c 100644
--- a/src/testdir/test_vimscript.vim
+++ b/src/testdir/test_vimscript.vim
@@ -2,7 +2,7 @@
 " Most of this was formerly in test49.vim (developed by Servatius Brandt
 " <Servatius.Brandt@fujitsu-siemens.com>)
 
-source script_util.vim
+source util/script_util.vim
 
 "-------------------------------------------------------------------------------
 " Test environment							    {{{1
@@ -23,7 +23,7 @@
 func RunInNewVim(test, verify)
   let init =<< trim END
     set cpo-=C            " support line-continuation in sourced script
-    source script_util.vim
+    source util/script_util.vim
     XpathINIT
     XloopINIT
   END
diff --git a/src/testdir/test_visual.vim b/src/testdir/test_visual.vim
index df9fe99..4fab925 100644
--- a/src/testdir/test_visual.vim
+++ b/src/testdir/test_visual.vim
@@ -1,7 +1,7 @@
 " Tests for various Visual modes.
 
-source screendump.vim
-import './vim9.vim' as v9
+source util/screendump.vim
+import './util/vim9.vim' as v9
 
 func Test_block_shift_multibyte()
   " Uses double-wide character.
diff --git a/src/testdir/test_wayland.vim b/src/testdir/test_wayland.vim
index e72a37f..8aa9abc 100644
--- a/src/testdir/test_wayland.vim
+++ b/src/testdir/test_wayland.vim
@@ -1,4 +1,4 @@
-source window_manager.vim
+source util/window_manager.vim
 
 CheckFeature wayland
 CheckFeature wayland_clipboard
diff --git a/src/testdir/test_winbar.vim b/src/testdir/test_winbar.vim
index f6185f8..5924174 100644
--- a/src/testdir/test_winbar.vim
+++ b/src/testdir/test_winbar.vim
@@ -2,7 +2,7 @@
 
 CheckFeature menu
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_add_remove_menu()
   new
diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim
index bc1aaa9..2e00ab4 100644
--- a/src/testdir/test_window_cmd.vim
+++ b/src/testdir/test_window_cmd.vim
@@ -1,6 +1,6 @@
 " Tests for window cmd (:wincmd, :split, :vsplit, :resize and etc...)
 
-source screendump.vim
+source util/screendump.vim
 
 func Test_window_cmd_ls0_with_split()
   set ls=0
diff --git a/src/testdir/test_xdg.vim b/src/testdir/test_xdg.vim
index 218714d..abded47 100644
--- a/src/testdir/test_xdg.vim
+++ b/src/testdir/test_xdg.vim
@@ -206,7 +206,7 @@
 
   " Is setup in Github Runner
   unlet $XDG_CONFIG_HOME
-  source setup_gui.vim
+  source util/setup_gui.vim
   call GUISetUpCommon()
 
   " This tests, that the GUI initialization file from
diff --git a/src/testdir/test_xxd.vim b/src/testdir/test_xxd.vim
index b2ef4e5..79fc9bf 100644
--- a/src/testdir/test_xxd.vim
+++ b/src/testdir/test_xxd.vim
@@ -1,6 +1,6 @@
 " Test for the xxd command
 
-source screendump.vim
+source util/screendump.vim
 
 if empty($XXD) && executable('..\xxd\xxd.exe')
   let s:xxd_cmd = '..\xxd\xxd.exe'
diff --git a/src/testdir/amiga.vim b/src/testdir/util/amiga.vim
similarity index 79%
rename from src/testdir/amiga.vim
rename to src/testdir/util/amiga.vim
index 79956d7..2837fe5 100644
--- a/src/testdir/amiga.vim
+++ b/src/testdir/util/amiga.vim
@@ -3,4 +3,4 @@
 map! /tmp t:
 cmap !rm !Delete all
 
-source setup.vim
+source util/setup.vim
diff --git a/src/testdir/check.vim b/src/testdir/util/check.vim
similarity index 98%
rename from src/testdir/check.vim
rename to src/testdir/util/check.vim
index fd160b0..aa8eceb 100644
--- a/src/testdir/check.vim
+++ b/src/testdir/util/check.vim
@@ -1,5 +1,5 @@
-source shared.vim
-source term_util.vim
+source util/shared.vim
+source util/term_util.vim
 
 " uses line-continuation
 let s:cpo_save = &cpo
@@ -154,7 +154,7 @@
 endfunc
 
 " Command to check that making screendumps is supported.
-" Caller must source screendump.vim
+" Caller must source util/screendump.vim
 command CheckScreendump call CheckScreendump()
 func CheckScreendump()
   let g:check_screendump_called = v:true
diff --git a/src/testdir/color_ramp.vim b/src/testdir/util/color_ramp.vim
similarity index 100%
rename from src/testdir/color_ramp.vim
rename to src/testdir/util/color_ramp.vim
diff --git a/src/testdir/dos.vim b/src/testdir/util/dos.vim
similarity index 93%
rename from src/testdir/dos.vim
rename to src/testdir/util/dos.vim
index 6301af5..3134d34 100644
--- a/src/testdir/dos.vim
+++ b/src/testdir/util/dos.vim
@@ -6,4 +6,4 @@
    set shell=cmd.exe shellcmdflag=/D\ /c
 endif
 
-source setup.vim
+source util/setup.vim
diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/util/gen_opt_test.vim
similarity index 99%
rename from src/testdir/gen_opt_test.vim
rename to src/testdir/util/gen_opt_test.vim
index 78a783e..1e0f39c 100644
--- a/src/testdir/gen_opt_test.vim
+++ b/src/testdir/util/gen_opt_test.vim
@@ -50,7 +50,7 @@
 " Script header.
 " The test values contains multibyte characters.
 let script = [
-      \ '" DO NOT EDIT: Generated with gen_opt_test.vim',
+      \ '" DO NOT EDIT: Generated with util/gen_opt_test.vim',
       \ '" Used by test_options_all.vim.',
       \ '',
       \ 'scriptencoding utf-8',
diff --git a/src/testdir/gui_init.vim b/src/testdir/util/gui_init.vim
similarity index 100%
rename from src/testdir/gui_init.vim
rename to src/testdir/util/gui_init.vim
diff --git a/src/testdir/gui_preinit.vim b/src/testdir/util/gui_preinit.vim
similarity index 100%
rename from src/testdir/gui_preinit.vim
rename to src/testdir/util/gui_preinit.vim
diff --git a/src/testdir/mouse.vim b/src/testdir/util/mouse.vim
similarity index 100%
rename from src/testdir/mouse.vim
rename to src/testdir/util/mouse.vim
diff --git a/src/testdir/popupbounce.vim b/src/testdir/util/popupbounce.vim
similarity index 96%
rename from src/testdir/popupbounce.vim
rename to src/testdir/util/popupbounce.vim
index b9f7bd1..5e63aca 100644
--- a/src/testdir/popupbounce.vim
+++ b/src/testdir/util/popupbounce.vim
@@ -3,7 +3,7 @@
 "    cd src
 "    # Edit Makefile to uncomment PROFILE_CFLAGS and PROFILE_LIBS
 "    make reconfig
-"    ./vim --clean -S testdir/popupbounce.vim main.c
+"    ./vim --clean -S testdir/util/popupbounce.vim main.c
 "    gprof vim gmon.out | vim -
 
 " using line continuation
diff --git a/src/testdir/screendump.vim b/src/testdir/util/screendump.vim
similarity index 100%
rename from src/testdir/screendump.vim
rename to src/testdir/util/screendump.vim
diff --git a/src/testdir/script_util.vim b/src/testdir/util/script_util.vim
similarity index 100%
rename from src/testdir/script_util.vim
rename to src/testdir/util/script_util.vim
diff --git a/src/testdir/setup.vim b/src/testdir/util/setup.vim
similarity index 100%
rename from src/testdir/setup.vim
rename to src/testdir/util/setup.vim
diff --git a/src/testdir/setup_gui.vim b/src/testdir/util/setup_gui.vim
similarity index 100%
rename from src/testdir/setup_gui.vim
rename to src/testdir/util/setup_gui.vim
diff --git a/src/testdir/shared.vim b/src/testdir/util/shared.vim
similarity index 99%
rename from src/testdir/shared.vim
rename to src/testdir/util/shared.vim
index f459d87..ddd3f37 100644
--- a/src/testdir/shared.vim
+++ b/src/testdir/util/shared.vim
@@ -5,7 +5,7 @@
   finish
 endif
 
-source view_util.vim
+source util/view_util.vim
 
 " When 'term' is changed some status requests may be sent.  The responses may
 " interfere with what is being tested.  A short sleep is used to process any of
diff --git a/src/testdir/summarize.vim b/src/testdir/util/summarize.vim
similarity index 100%
rename from src/testdir/summarize.vim
rename to src/testdir/util/summarize.vim
diff --git a/src/testdir/term_util.vim b/src/testdir/util/term_util.vim
similarity index 99%
rename from src/testdir/term_util.vim
rename to src/testdir/util/term_util.vim
index 19362aa..61ff9ce 100644
--- a/src/testdir/term_util.vim
+++ b/src/testdir/util/term_util.vim
@@ -5,7 +5,7 @@
   finish
 endif
 
-source shared.vim
+source util/shared.vim
 
 " For most tests we need to be able to run terminal Vim with 256 colors.  On
 " MS-Windows the console only has 16 colors and the GUI can't run in a
diff --git a/src/testdir/unix.vim b/src/testdir/util/unix.vim
similarity index 94%
rename from src/testdir/unix.vim
rename to src/testdir/util/unix.vim
index 366c9b1..8a97129 100644
--- a/src/testdir/unix.vim
+++ b/src/testdir/util/unix.vim
@@ -10,4 +10,4 @@
   let g:tester_HOME = $HOME
 endif
 
-source setup.vim
+source util/setup.vim
diff --git a/src/testdir/view_util.vim b/src/testdir/util/view_util.vim
similarity index 100%
rename from src/testdir/view_util.vim
rename to src/testdir/util/view_util.vim
diff --git a/src/testdir/vim9.vim b/src/testdir/util/vim9.vim
similarity index 100%
rename from src/testdir/vim9.vim
rename to src/testdir/util/vim9.vim
diff --git a/src/testdir/vms.vim b/src/testdir/util/vms.vim
similarity index 81%
rename from src/testdir/vms.vim
rename to src/testdir/util/vms.vim
index 64b390e..0a264e9 100644
--- a/src/testdir/vms.vim
+++ b/src/testdir/util/vms.vim
@@ -3,4 +3,4 @@
 " Do not use any swap files
 set noswapfile
 
-source setup.vim
+source util/setup.vim
diff --git a/src/testdir/window_manager.vim b/src/testdir/util/window_manager.vim
similarity index 100%
rename from src/testdir/window_manager.vim
rename to src/testdir/util/window_manager.vim