diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 403932c7..8941f735 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -109,7 +109,7 @@
 | pascal | ✓ | ✓ |  | `pasls` |
 | passwd | ✓ |  |  |  |
 | pem | ✓ |  |  |  |
-| perl | ✓ | ✓ | ✓ | `perlnavigator` |
+| perl | ✓ |  |  | `perlnavigator` |
 | php | ✓ | ✓ | ✓ | `intelephense` |
 | po | ✓ | ✓ |  |  |
 | ponylang | ✓ | ✓ | ✓ |  |
diff --git a/languages.toml b/languages.toml
index a13e35b4..7f774296 100644
--- a/languages.toml
+++ b/languages.toml
@@ -1112,7 +1112,7 @@ indent = { tab-width = 2, unit = "  " }
 
 [[grammar]]
 name = "perl"
-source = { git = "https://github.com/ganezdragon/tree-sitter-perl", rev = "0ac2c6da562c7a2c26ed7e8691d4a590f7e8b90a" }
+source = { git = "https://github.com/tree-sitter-perl/tree-sitter-perl", rev = "ed21ecbcc128a6688770ebafd3ef68a1c9bc1ea9" }
 
 [[language]]
 name = "racket"
diff --git a/runtime/queries/perl/fold.scm b/runtime/queries/perl/fold.scm
new file mode 100644
index 00000000..17fd114b
--- /dev/null
+++ b/runtime/queries/perl/fold.scm
@@ -0,0 +1,19 @@
+(comment) @fold
+(pod) @fold
+
+; fold the block-typed package statements only
+(package_statement (block)) @fold
+
+[(subroutine_declaration_statement)
+ (conditional_statement)
+ (loop_statement)
+ (for_statement)
+ (cstyle_for_statement)
+ (block_statement)
+ (phaser_statement)] @fold
+
+(anonymous_subroutine_expression) @fold
+
+; perhaps folks want to fold these too?
+[(anonymous_array_expression)
+ (anonymous_hash_expression)] @fold
diff --git a/runtime/queries/perl/highlights.scm b/runtime/queries/perl/highlights.scm
index b6f04291..961ff5ea 100644
--- a/runtime/queries/perl/highlights.scm
+++ b/runtime/queries/perl/highlights.scm
@@ -1,181 +1,100 @@
-; Variables
-(variable_declaration
-  .
-  (scope) @keyword)
 [
-(single_var_declaration)
-(scalar_variable)
-(array_variable)
-(hash_variable)
-(hash_variable)
-] @variable
-
+  "use" "no" "require" "package"
+] @keyword.control.import
 
 [
-(package_name)
-(special_scalar_variable)
-(special_array_variable)
-(special_hash_variable)
-(special_literal)
-(super)
-] @constant
-
-(
-  [
-  (package_name)
-  (super)
-  ]
-  .
-  ("::" @operator)
-)
-
-(comments) @comment
-(pod_statement) @comment.block.documentation
-
-[
-(use_no_statement)
-(use_no_feature_statement)
-(use_no_if_statement)
-(use_no_version)
-(use_constant_statement)
-(use_parent_statement)
-] @keyword
-
-(use_constant_statement
-  constant: (identifier) @constant)
-
-[
-"require"
-] @keyword
-
-(method_invocation
-  .
-  (identifier) @variable)
-
-(method_invocation
-  (arrow_operator)
-  .
-  (identifier) @function)
-(method_invocation
-  function_name: (identifier) @function)
-(named_block_statement
-  function_name: (identifier) @function)
-
-(call_expression
-  function_name: (identifier) @function)
-(function_definition
-  name: (identifier) @function)
-[
-(function)
-(map)
-(grep)
-(bless)
-] @function
-
-[
-"return"
-"sub"
-"package"
-"BEGIN"
-"END"
+  "sub"
 ] @keyword.function
 
 [
-"("
-")"
-"["
-"]"
-"{"
-"}"
-] @punctuation.bracket
-(standard_input_to_variable) @punctuation.bracket
-
-[
-"=~"
-"or"
-"="
-"=="
-"+"
-"-"
-"."
-"//"
-"||"
-(arrow_operator)
-(hash_arrow_operator)
-(array_dereference)
-(hash_dereference)
-(to_reference)
-(type_glob)
-(hash_access_variable)
-(ternary_expression)
-(ternary_expression_in_hash)
-] @operator
-
-[
-(regex_option)
-(regex_option_for_substitution)
-(regex_option_for_transliteration)
-] @variable.parameter
-
-(type_glob
-  (identifier) @variable)
-(
-  (scalar_variable)
-  .
-  ("->" @operator))
-
-[
-(word_list_qw)
-(command_qx_quoted)
-(string_single_quoted)
-(string_double_quoted)
-(string_qq_quoted)
-(bareword)
-(transliteration_tr_or_y)
-] @string
-
-[
-(regex_pattern_qr) 
-(patter_matcher_m)
-(substitution_pattern_s)
-] @string.regexp
-
-(escape_sequence) @string.special
-
-[
-","
-(semi_colon)
-(start_delimiter)
-(end_delimiter)
-(ellipsis_statement)
-] @punctuation.delimiter
-
-[
-(integer)
-(floating_point)
-(scientific_notation)
-(hexadecimal)
-] @constant.numeric
-
-[
-; (if_statement)
-(unless_statement)
-(if_simple_statement)
-(unless_simple_statement)
+  "if" "elsif" "else" "unless"
 ] @keyword.control.conditional
 
 [
-"if"
-"elsif"
-"else"
-] @keyword.control.conditional 
+  "while" "until"
+  "for" "foreach"
+  "do"
+] @keyword.control.repeat
 
-(foreach_statement) @keyword.control.repeat
-(foreach_statement
-  .
-  (scope) @keyword)
+[
+  "my" "our" "local"
+] @keyword.storage.modifier
 
-(function_attribute) @label
+[
+  "last" "next" "redo" "goto" "return"
+] @keyword.control.return
 
-(function_signature) @type
+[
+  "undef"
+] @constant.builtin
 
+(phaser_statement phase: _ @keyword.directive)
+
+[
+  "or" "and"
+  "eq" "ne" "cmp" "lt" "le" "ge" "gt"
+  "isa"
+] @keyword.operator
+
+(comment) @comment
+
+(eof_marker) @keyword.directive
+(data_section) @comment
+
+(pod) @comment.block.documentation
+
+(number) @constant.numeric
+(version) @constant
+
+(string_literal) @string
+(interpolated_string_literal) @string
+(quoted_word_list) @string
+(command_string) @string
+[(heredoc_token) (command_heredoc_token)] @string.special
+(heredoc_content) @string
+(heredoc_end) @string.special
+[(escape_sequence) (escaped_delimiter)] @constant.character.escape
+
+[(quoted_regexp) (match_regexp)] @string.regexp
+
+(autoquoted_bareword _?) @string.special
+
+[(scalar) (arraylen)] @variable
+(scalar_deref_expression ["->" "$" "*"] @variable)
+(array) @variable
+(array_deref_expression ["->" "@" "*"] @variable)
+(hash) @variable
+(hash_deref_expression ["->" "%" "*"] @variable)
+
+(array_element_expression [array:(_) "->" "[" "]"] @variable)
+(slice_expression [array:(_) "->" "[" "]"] @variable)
+(keyval_expression [array:(_) "->" "[" "]"] @variable)
+
+(hash_element_expression [hash:(_) "->" "{" "}"] @variable)
+(slice_expression [hash:(_) "->" "[" "]"] @variable)
+(keyval_expression [hash:(_) "->" "[" "]"] @variable)
+
+(hash_element_expression key: (bareword) @string.special)
+
+(use_statement (package) @type)
+(package_statement (package) @type)
+(require_expression (bareword) @type)
+
+(subroutine_declaration_statement name: (_) @function)
+(attrlist (attribute) @attribute)
+
+(goto_expression (label) @label)
+(loopex_expression (label) @label)
+
+(statement_label label: _ @label)
+
+(relational_expression operator: "isa" right: (bareword) @type)
+
+(function_call_expression (function) @function)
+(method_call_expression (method) @function.method)
+(method_call_expression invocant: (bareword) @type)
+
+(func0op_call_expression function: _ @function.builtin)
+(func1op_call_expression function: _ @function.builtin)
+
+(function) @function
diff --git a/runtime/queries/perl/indents.scm b/runtime/queries/perl/indents.scm
deleted file mode 100644
index 5ae34f5e..00000000
--- a/runtime/queries/perl/indents.scm
+++ /dev/null
@@ -1,15 +0,0 @@
-[
-  (function)
-  (identifier)
-  (method_invocation)
-  (if_statement)
-  (unless_statement)
-  (if_simple_statement)
-  (unless_simple_statement)
-  (variable_declaration)
-  (block)
-  (list_item)
-  (word_list_qw)
-] @indent
-
-"}" @outdent
diff --git a/runtime/queries/perl/injections.scm b/runtime/queries/perl/injections.scm
index cab5f53d..321c90ad 100644
--- a/runtime/queries/perl/injections.scm
+++ b/runtime/queries/perl/injections.scm
@@ -1,2 +1,2 @@
-((comments) @injection.content
+((comment) @injection.content
  (#set! injection.language "comment"))
diff --git a/runtime/queries/perl/textobjects.scm b/runtime/queries/perl/textobjects.scm
deleted file mode 100644
index 972b8774..00000000
--- a/runtime/queries/perl/textobjects.scm
+++ /dev/null
@@ -1,17 +0,0 @@
-(function_definition 
-  (identifier) (_) @function.inside) @function.around
-
-(anonymous_function 
-  (_) @function.inside) @function.around
-
-(argument 
-  (_) @parameter.inside)
-
-[
-  (comments)
-  (pod_statement)
-] @comment.inside
-
-(comments)+ @comment.around
-
-(pod_statement) @comment.around