diff --git a/runtime/import/dist/vimhighlight.vim b/runtime/import/dist/vimhighlight.vim
new file mode 100644
index 0000000..4664961
--- /dev/null
+++ b/runtime/import/dist/vimhighlight.vim
@@ -0,0 +1,119 @@
+vim9script
+
+# Maintainer:	github user lacygoill
+# Last Change:	2023 Mar 08
+
+# Init {{{1
+
+const LINK: string = '->'
+
+# Interface {{{1
+export def HighlightTest() # {{{2
+    # Open a new window if the current one isn't empty
+    if line('$') != 1 || getline(1) != ''
+        new
+    endif
+
+    edit Highlight\ test
+
+    # `:help scratch-buffer`
+    &l:bufhidden = 'hide'
+    &l:buftype = 'nofile'
+    &l:swapfile = false
+
+    var report: list<string> =<< trim END
+        Highlighting groups for various occasions
+        -----------------------------------------
+    END
+
+    var various_groups: list<string> = GetVariousGroups()
+        ->filter((_, group: string): bool => group->hlexists() && !group->IsCleared())
+        ->sort()
+        ->uniq()
+
+    report->extend(various_groups->FollowChains())
+
+    var language_section: list<string> =<< trim END
+
+        Highlighting groups for language syntaxes
+        -----------------------------------------
+    END
+    report->extend(language_section)
+
+    var syntax_groups: list<string> = getcompletion('', 'highlight')
+        ->filter((_, group: string): bool =>
+            various_groups->index(group) == -1
+            && !group->IsCleared()
+            && group !~ '^HighlightTest')
+
+    # put the report
+    report
+        ->extend(syntax_groups->FollowChains())
+        ->setline(1)
+
+    # highlight the group names
+    execute $'silent! global /^\w\+\%(\%(\s*{LINK}\s*\)\w\+\)*$/ Highlight({bufnr('%')})'
+
+    cursor(1, 1)
+enddef
+# }}}1
+# Core {{{1
+def Highlight(buf: number) # {{{2
+    var lnum: number = line('.')
+    for group: string in getline('.')->split($'\s*{LINK}\s*')
+        silent! prop_type_add($'highlight-test-{group}', {
+            bufnr: buf,
+            highlight: group,
+            combine: false,
+        })
+        prop_add(lnum, col('.'), {
+            length: group->strlen(),
+            type: $'highlight-test-{group}'
+        })
+        search('\<\w\+\>', '', lnum)
+    endfor
+enddef
+# }}}1
+# Util {{{1
+def IsCleared(name: string): bool # {{{2
+    return name
+        ->hlget()
+        ->get(0, {})
+        ->get('cleared')
+enddef
+
+def FollowChains(groups: list<string>): list<string> # {{{2
+    # A group might be linked to another, which itself might be linked...
+    # We want the whole chain, for every group.
+    var chains: list<string>
+    for group: string in groups
+        var target: string = group->LinksTo()
+        var chain: string = group
+        while !target->empty()
+            chain ..= $' {LINK} {target}'
+            target = target->LinksTo()
+        endwhile
+        var a_link_is_cleared: bool = chain
+            ->split($'\s*{LINK}\s*')
+            ->indexof((_, g: string): bool => g->IsCleared()) >= 0
+        if a_link_is_cleared
+            continue
+        endif
+        chains->add(chain)
+    endfor
+    return chains
+enddef
+
+def LinksTo(group: string): string # {{{2
+    return group
+        ->hlget()
+        ->get(0, {})
+        ->get('linksto', '')
+enddef
+
+def GetVariousGroups(): list<string> # {{{2
+    return getcompletion('hl-', 'help')
+        ->filter((_, helptag: string): bool => helptag =~ '^hl-\w\+$')
+        ->map((_, helptag: string) => helptag->substitute('^hl-', '', ''))
+        ->extend(range(1, 9)->map((_, n: number) => $'User{n}'))
+enddef
diff --git a/runtime/syntax/hitest.vim b/runtime/syntax/hitest.vim
index 9d60cec..27b8eab 100644
--- a/runtime/syntax/hitest.vim
+++ b/runtime/syntax/hitest.vim
@@ -1,149 +1,10 @@
 " Vim syntax file
 " Language:	none; used to see highlighting
-" Maintainer:	Ronald Schild <rs@scutum.de>
-" Last Change:	2019 Jun 06
-" Version:	5.4n.1
-" Additional Changes By: Lifepillar, Bram
+" Maintainer:	github user lacygoill
+" Last Change:	2023 Mar 08
 
 " To see your current highlight settings, do
 "    :so $VIMRUNTIME/syntax/hitest.vim
 
-" save global options and registers
-let s:hidden      = &hidden
-let s:lazyredraw  = &lazyredraw
-let s:more	  = &more
-let s:report      = &report
-let s:whichwrap   = &whichwrap
-let s:shortmess   = &shortmess
-let s:wrapscan    = &wrapscan
-let s:register_a  = @a
-let s:register_se = @/
-
-" set global options
-set hidden lazyredraw nomore report=99999 shortmess=aoOstTW wrapscan
-set whichwrap&
-
-" print current highlight settings into register a
-redir @a
-silent highlight
-redir END
-
-" Open a new window if the current one isn't empty
-if line("$") != 1 || getline(1) != ""
-  new
-endif
-
-" edit temporary file
-edit Highlight\ test
-
-" set local options
-setlocal autoindent noexpandtab formatoptions=t shiftwidth=18 noswapfile tabstop=18
-let &textwidth=&columns
-
-" insert highlight settings
-% delete
-put a
-
-" remove cleared groups
-silent! g/ cleared$/d
-
-" remove the colored xxx items
-g/xxx /s///e
-
-" remove color settings (not needed here)
-global! /links to/ substitute /\s.*$//e
-
-" Move split 'links to' lines to the same line
-% substitute /^\(\w\+\)\n\s*\(links to.*\)/\1\t\2/e
-
-" move linked groups to the end of file
-global /links to/ move $
-
-" move linked group names to the matching preferred groups
-" TODO: this fails if the group linked to isn't defined
-% substitute /^\(\w\+\)\s*\(links to\)\s*\(\w\+\)$/\3\t\2 \1/e
-silent! global /links to/ normal mz3ElD0#$p'zdd
-
-" delete empty lines
-global /^ *$/ delete
-
-" precede syntax command
-% substitute /^[^ ]*/syn keyword &\t&/
-
-" execute syntax commands
-syntax clear
-% yank a
-@a
-
-" remove syntax commands again
-% substitute /^syn keyword //
-
-" pretty formatting
-global /^/ exe "normal Wi\<CR>\t\eAA\ex"
-global /^\S/ join
-
-" find out first syntax highlighting
-let b:various = &highlight.',:Normal,:Cursor,:,'
-let b:i = 1
-while b:various =~ ':'.substitute(getline(b:i), '\s.*$', ',', '')
-   let b:i = b:i + 1
-   if b:i > line("$") | break | endif
-endwhile
-
-" insert headlines
-call append(0, "Highlighting groups for various occasions")
-call append(1, "-----------------------------------------")
-
-if b:i < line("$")-1
-   let b:synhead = "Syntax highlighting groups"
-   if exists("hitest_filetypes")
-      redir @a
-      let
-      redir END
-      let @a = substitute(@a, 'did_\(\w\+\)_syn\w*_inits\s*#1', ', \1', 'g')
-      let @a = substitute(@a, "\n\\w[^\n]*", '', 'g')
-      let @a = substitute(@a, "\n", '', 'g')
-      let @a = substitute(@a, '^,', '', 'g')
-      if @a != ""
-	 let b:synhead = b:synhead." - filetype"
-	 if @a =~ ','
-	    let b:synhead = b:synhead."s"
-	 endif
-	 let b:synhead = b:synhead.":".@a
-      endif
-   endif
-   call append(b:i+1, "")
-   call append(b:i+2, b:synhead)
-   call append(b:i+3, substitute(b:synhead, '.', '-', 'g'))
-endif
-
-" remove 'hls' highlighting
-nohlsearch
-normal 0
-
-" we don't want to save this temporary file
-set nomodified
-
-" the following trick avoids the "Press RETURN ..." prompt
-0 append
-.
-
-" restore global options and registers
-let &hidden      = s:hidden
-let &lazyredraw  = s:lazyredraw
-let &more	 = s:more
-let &report	 = s:report
-let &shortmess	 = s:shortmess
-let &whichwrap   = s:whichwrap
-let &wrapscan	 = s:wrapscan
-let @a		 = s:register_a
-
-" restore last search pattern
-call histdel("search", -1)
-let @/ = s:register_se
-
-" remove variables
-unlet s:hidden s:lazyredraw s:more s:report s:shortmess
-unlet s:whichwrap s:wrapscan s:register_a s:register_se
-
-" vim: ts=8
+import 'dist/vimhighlight.vim'
+call vimhighlight.HighlightTest()
