diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 37b095d9..b5db21c 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -109,7 +109,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  1.30.0
+  1.31.0
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -4239,152 +4239,47 @@
     
   <dl><dt class="value">ANNOTATION</dt><dt class="value">BUILT_IN</dt><dt class="value">CLASS</dt><dt class="value">COMMENT_BLOCK</dt><dt class="value">COMMENT_DOCUMENTATION</dt><dt class="value">COMMENT_END_OF_LINE</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">DIRECTIVE</dt><dt class="value">DYNAMIC_TYPE</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
-      </dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_DECLARATION</dt><dd>
+        <p>Deprecated - no longer sent.</p>
+      </dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_DECLARATION</dt><dt class="value">DYNAMIC_LOCAL_VARIABLE_REFERENCE</dt><dt class="value">DYNAMIC_PARAMETER_DECLARATION</dt><dt class="value">DYNAMIC_PARAMETER_REFERENCE</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dd>
         
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">DYNAMIC_PARAMETER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">DYNAMIC_PARAMETER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dd>
-        
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">FIELD_STATIC</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">FUNCTION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">FUNCTION_DECLARATION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER_DECLARATION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
-      </dd><dt class="value">IDENTIFIER_DEFAULT</dt><dt class="value">IMPORT_PREFIX</dt><dt class="value">INSTANCE_FIELD_DECLARATION</dt><dd>
+        <p>Deprecated - no longer sent.</p>
+      </dd><dt class="value">IDENTIFIER_DEFAULT</dt><dt class="value">IMPORT_PREFIX</dt><dt class="value">INSTANCE_FIELD_DECLARATION</dt><dt class="value">INSTANCE_FIELD_REFERENCE</dt><dt class="value">INSTANCE_GETTER_DECLARATION</dt><dt class="value">INSTANCE_GETTER_REFERENCE</dt><dt class="value">INSTANCE_METHOD_DECLARATION</dt><dt class="value">INSTANCE_METHOD_REFERENCE</dt><dt class="value">INSTANCE_SETTER_DECLARATION</dt><dt class="value">INSTANCE_SETTER_REFERENCE</dt><dt class="value">INVALID_STRING_ESCAPE</dt><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY_NAME</dt><dt class="value">LITERAL_BOOLEAN</dt><dt class="value">LITERAL_DOUBLE</dt><dt class="value">LITERAL_INTEGER</dt><dt class="value">LITERAL_LIST</dt><dt class="value">LITERAL_MAP</dt><dt class="value">LITERAL_STRING</dt><dt class="value">LOCAL_FUNCTION_DECLARATION</dt><dt class="value">LOCAL_FUNCTION_REFERENCE</dt><dt class="value">LOCAL_VARIABLE</dt><dd>
         
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_FIELD_REFERENCE</dt><dd>
+        <p>Deprecated - no longer sent.</p>
+      </dd><dt class="value">LOCAL_VARIABLE_DECLARATION</dt><dt class="value">LOCAL_VARIABLE_REFERENCE</dt><dt class="value">METHOD</dt><dd>
         
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_GETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_GETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_METHOD_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_METHOD_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_SETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_SETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INVALID_STRING_ESCAPE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY_NAME</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">LITERAL_BOOLEAN</dt><dt class="value">LITERAL_DOUBLE</dt><dt class="value">LITERAL_INTEGER</dt><dt class="value">LITERAL_LIST</dt><dt class="value">LITERAL_MAP</dt><dt class="value">LITERAL_STRING</dt><dt class="value">LOCAL_FUNCTION_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">LOCAL_FUNCTION_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">LOCAL_VARIABLE</dt><dd>
-        
-        <p>Only for version 1 of highlight.</p>
-      </dd><dt class="value">LOCAL_VARIABLE_DECLARATION</dt><dt class="value">LOCAL_VARIABLE_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">METHOD</dt><dd>
-        
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">METHOD_DECLARATION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">METHOD_DECLARATION_STATIC</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">METHOD_STATIC</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">PARAMETER</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">SETTER_DECLARATION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">TOP_LEVEL_VARIABLE</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
-      </dd><dt class="value">PARAMETER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">PARAMETER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_FIELD_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_GETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_GETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_METHOD_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_METHOD_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_SETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_SETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_FUNCTION_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_FUNCTION_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_GETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_GETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_SETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_SETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_VARIABLE_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TYPE_NAME_DYNAMIC</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNRESOLVED_INSTANCE_MEMBER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">VALID_STRING_ESCAPE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd></dl></dd><dt class="typeDefinition"><a name="type_HoverInformation">HoverInformation: object</a></dt><dd>
+        <p>Deprecated - no longer sent.</p>
+      </dd><dt class="value">PARAMETER_DECLARATION</dt><dt class="value">PARAMETER_REFERENCE</dt><dt class="value">STATIC_FIELD_DECLARATION</dt><dt class="value">STATIC_GETTER_DECLARATION</dt><dt class="value">STATIC_GETTER_REFERENCE</dt><dt class="value">STATIC_METHOD_DECLARATION</dt><dt class="value">STATIC_METHOD_REFERENCE</dt><dt class="value">STATIC_SETTER_DECLARATION</dt><dt class="value">STATIC_SETTER_REFERENCE</dt><dt class="value">TOP_LEVEL_FUNCTION_DECLARATION</dt><dt class="value">TOP_LEVEL_FUNCTION_REFERENCE</dt><dt class="value">TOP_LEVEL_GETTER_DECLARATION</dt><dt class="value">TOP_LEVEL_GETTER_REFERENCE</dt><dt class="value">TOP_LEVEL_SETTER_DECLARATION</dt><dt class="value">TOP_LEVEL_SETTER_REFERENCE</dt><dt class="value">TOP_LEVEL_VARIABLE_DECLARATION</dt><dt class="value">TYPE_NAME_DYNAMIC</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNRESOLVED_INSTANCE_MEMBER_REFERENCE</dt><dt class="value">VALID_STRING_ESCAPE</dt></dl></dd><dt class="typeDefinition"><a name="type_HoverInformation">HoverInformation: object</a></dt><dd>
     <p>
       The hover information associated with a specific location.
     </p>
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 25f5a64..61ada08 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -6,7 +6,7 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
-const String PROTOCOL_VERSION = '1.30.0';
+const String PROTOCOL_VERSION = '1.31.0';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index ce3c063..adbfc57 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -15,7 +15,6 @@
     hide AnalysisOptions;
 import 'package:analysis_server/src/analysis_server_abstract.dart';
 import 'package:analysis_server/src/channel/channel.dart';
-import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/computer/computer_highlights2.dart';
 import 'package:analysis_server/src/computer/new_notifications.dart';
 import 'package:analysis_server/src/context_manager.dart';
@@ -601,8 +600,6 @@
 
 /// Various IDE options.
 class AnalysisServerOptions {
-  bool useAnalysisHighlight2 = false;
-
   String fileReadMode = 'as-is';
   String newAnalysisDriverLog;
 
@@ -829,11 +826,7 @@
   }
 
   List<HighlightRegion> _computeHighlightRegions(CompilationUnit unit) {
-    if (analysisServer.options.useAnalysisHighlight2) {
-      return DartUnitHighlightsComputer2(unit).compute();
-    } else {
-      return DartUnitHighlightsComputer(unit).compute();
-    }
+    return DartUnitHighlightsComputer2(unit).compute();
   }
 
   server.AnalysisNavigationParams _computeNavigationParams(
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
deleted file mode 100644
index 3c280ff..0000000
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ /dev/null
@@ -1,828 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
-
-/// A computer for [HighlightRegion]s in a Dart [CompilationUnit].
-class DartUnitHighlightsComputer {
-  final CompilationUnit _unit;
-
-  final List<HighlightRegion> _regions = <HighlightRegion>[];
-
-  DartUnitHighlightsComputer(this._unit);
-
-  /// Returns the computed highlight regions, not `null`.
-  List<HighlightRegion> compute() {
-    _unit.accept(_DartUnitHighlightsComputerVisitor(this));
-    _addCommentRanges();
-    return _regions;
-  }
-
-  void _addCommentRanges() {
-    var token = _unit.beginToken;
-    while (token != null) {
-      Token commentToken = token.precedingComments;
-      while (commentToken != null) {
-        HighlightRegionType highlightType;
-        if (commentToken.type == TokenType.MULTI_LINE_COMMENT) {
-          if (commentToken.lexeme.startsWith('/**')) {
-            highlightType = HighlightRegionType.COMMENT_DOCUMENTATION;
-          } else {
-            highlightType = HighlightRegionType.COMMENT_BLOCK;
-          }
-        }
-        if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) {
-          highlightType = HighlightRegionType.COMMENT_END_OF_LINE;
-        }
-        if (highlightType != null) {
-          _addRegion_token(commentToken, highlightType);
-        }
-        commentToken = commentToken.next;
-      }
-      if (token.type == TokenType.EOF) {
-        // Only exit the loop *after* processing the EOF token as it may
-        // have preceeding comments.
-        break;
-      }
-      token = token.next;
-    }
-  }
-
-  void _addIdentifierRegion(SimpleIdentifier node) {
-    if (_addIdentifierRegion_keyword(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_class(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_constructor(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_dynamicType(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_getterSetterDeclaration(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_field(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_function(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_functionTypeAlias(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_importPrefix(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_label(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_localVariable(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_method(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_parameter(node)) {
-      return;
-    }
-    if (_addIdentifierRegion_typeParameter(node)) {
-      return;
-    }
-    _addRegion_node(node, HighlightRegionType.IDENTIFIER_DEFAULT);
-  }
-
-  void _addIdentifierRegion_annotation(Annotation node) {
-    var arguments = node.arguments;
-    if (arguments == null) {
-      _addRegion_node(node, HighlightRegionType.ANNOTATION);
-    } else {
-      _addRegion_nodeStart_tokenEnd(
-          node, arguments.beginToken, HighlightRegionType.ANNOTATION);
-      _addRegion_token(arguments.endToken, HighlightRegionType.ANNOTATION);
-    }
-  }
-
-  bool _addIdentifierRegion_class(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! ClassElement) {
-      return false;
-    }
-    ClassElement classElement = element;
-    // prepare type
-    HighlightRegionType type;
-    if (node.parent is TypeName &&
-        node.parent.parent is ConstructorName &&
-        node.parent.parent.parent is InstanceCreationExpression) {
-      // new Class()
-      type = HighlightRegionType.CONSTRUCTOR;
-    } else if (classElement.isEnum) {
-      type = HighlightRegionType.ENUM;
-    } else {
-      type = HighlightRegionType.CLASS;
-    }
-    // add region
-    return _addRegion_node(node, type);
-  }
-
-  bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! ConstructorElement) {
-      return false;
-    }
-    return _addRegion_node(node, HighlightRegionType.CONSTRUCTOR);
-  }
-
-  bool _addIdentifierRegion_dynamicType(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is VariableElement) {
-      var staticType = element.type;
-      if (staticType == null || !staticType.isDynamic) {
-        return false;
-      }
-      return _addRegion_node(node, HighlightRegionType.DYNAMIC_TYPE);
-    }
-    return false;
-  }
-
-  bool _addIdentifierRegion_field(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is FieldFormalParameterElement) {
-      element = (element as FieldFormalParameterElement).field;
-    }
-    if (element is PropertyAccessorElement) {
-      element = (element as PropertyAccessorElement).variable;
-    }
-    // prepare type
-    HighlightRegionType type;
-    if (element is FieldElement) {
-      var enclosingElement = element.enclosingElement;
-      if (enclosingElement is ClassElement && enclosingElement.isEnum) {
-        type = HighlightRegionType.ENUM_CONSTANT;
-      } else if (element.isStatic) {
-        type = HighlightRegionType.FIELD_STATIC;
-      } else {
-        type = HighlightRegionType.FIELD;
-      }
-    } else if (element is TopLevelVariableElement) {
-      type = HighlightRegionType.TOP_LEVEL_VARIABLE;
-    }
-    // add region
-    if (type != null) {
-      return _addRegion_node(node, type);
-    }
-    return false;
-  }
-
-  bool _addIdentifierRegion_function(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! FunctionElement) {
-      return false;
-    }
-    HighlightRegionType type;
-    if (node.inDeclarationContext()) {
-      type = HighlightRegionType.FUNCTION_DECLARATION;
-    } else {
-      type = HighlightRegionType.FUNCTION;
-    }
-    return _addRegion_node(node, type);
-  }
-
-  bool _addIdentifierRegion_functionTypeAlias(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! FunctionTypeAliasElement) {
-      return false;
-    }
-    return _addRegion_node(node, HighlightRegionType.FUNCTION_TYPE_ALIAS);
-  }
-
-  bool _addIdentifierRegion_getterSetterDeclaration(SimpleIdentifier node) {
-    // should be declaration
-    var parent = node.parent;
-    if (!(parent is MethodDeclaration || parent is FunctionDeclaration)) {
-      return false;
-    }
-    // should be property accessor
-    var element = node.writeOrReadElement;
-    if (element is! PropertyAccessorElement) {
-      return false;
-    }
-    // getter or setter
-    var propertyAccessorElement = element as PropertyAccessorElement;
-    if (propertyAccessorElement.isGetter) {
-      return _addRegion_node(node, HighlightRegionType.GETTER_DECLARATION);
-    } else {
-      return _addRegion_node(node, HighlightRegionType.SETTER_DECLARATION);
-    }
-  }
-
-  bool _addIdentifierRegion_importPrefix(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! PrefixElement) {
-      return false;
-    }
-    return _addRegion_node(node, HighlightRegionType.IMPORT_PREFIX);
-  }
-
-  bool _addIdentifierRegion_keyword(SimpleIdentifier node) {
-    var name = node.name;
-    if (name == 'void') {
-      return _addRegion_node(node, HighlightRegionType.KEYWORD);
-    }
-    return false;
-  }
-
-  bool _addIdentifierRegion_label(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! LabelElement) {
-      return false;
-    }
-    return _addRegion_node(node, HighlightRegionType.LABEL);
-  }
-
-  bool _addIdentifierRegion_localVariable(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! LocalVariableElement) {
-      return false;
-    }
-    // OK
-    HighlightRegionType type;
-    if (node.inDeclarationContext()) {
-      type = HighlightRegionType.LOCAL_VARIABLE_DECLARATION;
-    } else {
-      type = HighlightRegionType.LOCAL_VARIABLE;
-    }
-    return _addRegion_node(node, type);
-  }
-
-  bool _addIdentifierRegion_method(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! MethodElement) {
-      return false;
-    }
-    var methodElement = element as MethodElement;
-    var isStatic = methodElement.isStatic;
-    // OK
-    HighlightRegionType type;
-    if (node.inDeclarationContext()) {
-      if (isStatic) {
-        type = HighlightRegionType.METHOD_DECLARATION_STATIC;
-      } else {
-        type = HighlightRegionType.METHOD_DECLARATION;
-      }
-    } else {
-      if (isStatic) {
-        type = HighlightRegionType.METHOD_STATIC;
-      } else {
-        type = HighlightRegionType.METHOD;
-      }
-    }
-    return _addRegion_node(node, type);
-  }
-
-  bool _addIdentifierRegion_parameter(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! ParameterElement) {
-      return false;
-    }
-    return _addRegion_node(node, HighlightRegionType.PARAMETER);
-  }
-
-  bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) {
-    var element = node.writeOrReadElement;
-    if (element is! TypeParameterElement) {
-      return false;
-    }
-    return _addRegion_node(node, HighlightRegionType.TYPE_PARAMETER);
-  }
-
-  void _addRegion(int offset, int length, HighlightRegionType type) {
-    _regions.add(HighlightRegion(type, offset, length));
-  }
-
-  bool _addRegion_node(AstNode node, HighlightRegionType type) {
-    var offset = node.offset;
-    var length = node.length;
-    _addRegion(offset, length, type);
-    return true;
-  }
-
-  void _addRegion_nodeStart_tokenEnd(
-      AstNode a, Token b, HighlightRegionType type) {
-    var offset = a.offset;
-    var end = b.end;
-    _addRegion(offset, end - offset, type);
-  }
-
-  void _addRegion_token(Token token, HighlightRegionType type) {
-    if (token != null) {
-      var offset = token.offset;
-      var length = token.length;
-      _addRegion(offset, length, type);
-    }
-  }
-
-  void _addRegion_tokenStart_tokenEnd(
-      Token a, Token b, HighlightRegionType type) {
-    var offset = a.offset;
-    var end = b.end;
-    _addRegion(offset, end - offset, type);
-  }
-}
-
-/// An AST visitor for [DartUnitHighlightsComputer].
-class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
-  final DartUnitHighlightsComputer computer;
-
-  _DartUnitHighlightsComputerVisitor(this.computer);
-
-  @override
-  void visitAnnotation(Annotation node) {
-    computer._addIdentifierRegion_annotation(node);
-    super.visitAnnotation(node);
-  }
-
-  @override
-  void visitAsExpression(AsExpression node) {
-    computer._addRegion_token(node.asOperator, HighlightRegionType.BUILT_IN);
-    super.visitAsExpression(node);
-  }
-
-  @override
-  void visitAssertStatement(AssertStatement node) {
-    computer._addRegion_token(node.assertKeyword, HighlightRegionType.KEYWORD);
-    super.visitAssertStatement(node);
-  }
-
-  @override
-  void visitAwaitExpression(AwaitExpression node) {
-    computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
-    super.visitAwaitExpression(node);
-  }
-
-  @override
-  void visitBlockFunctionBody(BlockFunctionBody node) {
-    _addRegions_functionBody(node);
-    super.visitBlockFunctionBody(node);
-  }
-
-  @override
-  void visitBooleanLiteral(BooleanLiteral node) {
-    computer._addRegion_node(node, HighlightRegionType.KEYWORD);
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_BOOLEAN);
-    super.visitBooleanLiteral(node);
-  }
-
-  @override
-  void visitBreakStatement(BreakStatement node) {
-    computer._addRegion_token(node.breakKeyword, HighlightRegionType.KEYWORD);
-    super.visitBreakStatement(node);
-  }
-
-  @override
-  void visitCatchClause(CatchClause node) {
-    computer._addRegion_token(node.catchKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
-    super.visitCatchClause(node);
-  }
-
-  @override
-  void visitClassDeclaration(ClassDeclaration node) {
-    computer._addRegion_token(node.classKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(
-        node.abstractKeyword, HighlightRegionType.BUILT_IN);
-    super.visitClassDeclaration(node);
-  }
-
-  @override
-  void visitClassTypeAlias(ClassTypeAlias node) {
-    computer._addRegion_token(
-        node.abstractKeyword, HighlightRegionType.BUILT_IN);
-    super.visitClassTypeAlias(node);
-  }
-
-  @override
-  void visitConstructorDeclaration(ConstructorDeclaration node) {
-    computer._addRegion_token(
-        node.externalKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(
-        node.factoryKeyword, HighlightRegionType.BUILT_IN);
-    super.visitConstructorDeclaration(node);
-  }
-
-  @override
-  void visitContinueStatement(ContinueStatement node) {
-    computer._addRegion_token(
-        node.continueKeyword, HighlightRegionType.KEYWORD);
-    super.visitContinueStatement(node);
-  }
-
-  @override
-  void visitDefaultFormalParameter(DefaultFormalParameter node) {
-    computer._addRegion_token(
-        node.requiredKeyword, HighlightRegionType.KEYWORD);
-    super.visitDefaultFormalParameter(node);
-  }
-
-  @override
-  void visitDoStatement(DoStatement node) {
-    computer._addRegion_token(node.doKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.whileKeyword, HighlightRegionType.KEYWORD);
-    super.visitDoStatement(node);
-  }
-
-  @override
-  void visitDoubleLiteral(DoubleLiteral node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_DOUBLE);
-    super.visitDoubleLiteral(node);
-  }
-
-  @override
-  void visitEnumDeclaration(EnumDeclaration node) {
-    computer._addRegion_token(node.enumKeyword, HighlightRegionType.KEYWORD);
-    super.visitEnumDeclaration(node);
-  }
-
-  @override
-  void visitExportDirective(ExportDirective node) {
-    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
-    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    super.visitExportDirective(node);
-  }
-
-  @override
-  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    _addRegions_functionBody(node);
-    super.visitExpressionFunctionBody(node);
-  }
-
-  @override
-  void visitExtendsClause(ExtendsClause node) {
-    computer._addRegion_token(node.extendsKeyword, HighlightRegionType.KEYWORD);
-    super.visitExtendsClause(node);
-  }
-
-  @override
-  void visitExtensionDeclaration(ExtensionDeclaration node) {
-    computer._addRegion_token(
-        node.extensionKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
-    super.visitExtensionDeclaration(node);
-  }
-
-  @override
-  void visitFieldDeclaration(FieldDeclaration node) {
-    computer._addRegion_token(
-        node.abstractKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(
-        node.externalKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
-    super.visitFieldDeclaration(node);
-  }
-
-  @override
-  void visitFieldFormalParameter(FieldFormalParameter node) {
-    computer._addRegion_token(
-        node.requiredKeyword, HighlightRegionType.KEYWORD);
-    super.visitFieldFormalParameter(node);
-  }
-
-  @override
-  void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
-    computer._addRegion_token(node.inKeyword, HighlightRegionType.KEYWORD);
-    super.visitForEachPartsWithDeclaration(node);
-  }
-
-  @override
-  void visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
-    computer._addRegion_token(node.inKeyword, HighlightRegionType.KEYWORD);
-    super.visitForEachPartsWithIdentifier(node);
-  }
-
-  @override
-  void visitForElement(ForElement node) {
-    computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    super.visitForElement(node);
-  }
-
-  @override
-  void visitForStatement(ForStatement node) {
-    computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    super.visitForStatement(node);
-  }
-
-  @override
-  void visitFunctionDeclaration(FunctionDeclaration node) {
-    computer._addRegion_token(
-        node.externalKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(
-        node.propertyKeyword, HighlightRegionType.BUILT_IN);
-    super.visitFunctionDeclaration(node);
-  }
-
-  @override
-  void visitFunctionTypeAlias(FunctionTypeAlias node) {
-    computer._addRegion_token(
-        node.typedefKeyword, HighlightRegionType.BUILT_IN);
-    super.visitFunctionTypeAlias(node);
-  }
-
-  @override
-  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    computer._addRegion_token(
-        node.requiredKeyword, HighlightRegionType.KEYWORD);
-    super.visitFunctionTypedFormalParameter(node);
-  }
-
-  @override
-  void visitGenericFunctionType(GenericFunctionType node) {
-    computer._addRegion_token(
-        node.functionKeyword, HighlightRegionType.KEYWORD);
-    super.visitGenericFunctionType(node);
-  }
-
-  @override
-  void visitGenericTypeAlias(GenericTypeAlias node) {
-    computer._addRegion_token(node.typedefKeyword, HighlightRegionType.KEYWORD);
-    super.visitGenericTypeAlias(node);
-  }
-
-  @override
-  void visitHideCombinator(HideCombinator node) {
-    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    super.visitHideCombinator(node);
-  }
-
-  @override
-  void visitIfElement(IfElement node) {
-    computer._addRegion_token(node.ifKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.elseKeyword, HighlightRegionType.KEYWORD);
-    super.visitIfElement(node);
-  }
-
-  @override
-  void visitIfStatement(IfStatement node) {
-    computer._addRegion_token(node.ifKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.elseKeyword, HighlightRegionType.KEYWORD);
-    super.visitIfStatement(node);
-  }
-
-  @override
-  void visitImplementsClause(ImplementsClause node) {
-    computer._addRegion_token(
-        node.implementsKeyword, HighlightRegionType.BUILT_IN);
-    super.visitImplementsClause(node);
-  }
-
-  @override
-  void visitImportDirective(ImportDirective node) {
-    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
-    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(
-        node.deferredKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(node.asKeyword, HighlightRegionType.BUILT_IN);
-    super.visitImportDirective(node);
-  }
-
-  @override
-  void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    if (node.keyword != null) {
-      computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    }
-    super.visitInstanceCreationExpression(node);
-  }
-
-  @override
-  void visitIntegerLiteral(IntegerLiteral node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_INTEGER);
-    super.visitIntegerLiteral(node);
-  }
-
-  @override
-  void visitIsExpression(IsExpression node) {
-    computer._addRegion_token(node.isOperator, HighlightRegionType.KEYWORD);
-    super.visitIsExpression(node);
-  }
-
-  @override
-  void visitLibraryDirective(LibraryDirective node) {
-    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
-    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    super.visitLibraryDirective(node);
-  }
-
-  @override
-  void visitListLiteral(ListLiteral node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_LIST);
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitListLiteral(node);
-  }
-
-  @override
-  void visitMethodDeclaration(MethodDeclaration node) {
-    computer._addRegion_token(
-        node.externalKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(
-        node.modifierKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(
-        node.operatorKeyword, HighlightRegionType.BUILT_IN);
-    computer._addRegion_token(
-        node.propertyKeyword, HighlightRegionType.BUILT_IN);
-    super.visitMethodDeclaration(node);
-  }
-
-  @override
-  void visitMixinDeclaration(MixinDeclaration node) {
-    computer._addRegion_token(node.mixinKeyword, HighlightRegionType.BUILT_IN);
-    super.visitMixinDeclaration(node);
-  }
-
-  @override
-  void visitNativeClause(NativeClause node) {
-    computer._addRegion_token(node.nativeKeyword, HighlightRegionType.BUILT_IN);
-    super.visitNativeClause(node);
-  }
-
-  @override
-  void visitNativeFunctionBody(NativeFunctionBody node) {
-    computer._addRegion_token(node.nativeKeyword, HighlightRegionType.BUILT_IN);
-    super.visitNativeFunctionBody(node);
-  }
-
-  @override
-  void visitOnClause(OnClause node) {
-    computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
-    super.visitOnClause(node);
-  }
-
-  @override
-  void visitPartDirective(PartDirective node) {
-    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
-    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    super.visitPartDirective(node);
-  }
-
-  @override
-  void visitPartOfDirective(PartOfDirective node) {
-    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
-    computer._addRegion_tokenStart_tokenEnd(
-        node.partKeyword, node.ofKeyword, HighlightRegionType.BUILT_IN);
-    super.visitPartOfDirective(node);
-  }
-
-  @override
-  void visitRethrowExpression(RethrowExpression node) {
-    computer._addRegion_token(node.rethrowKeyword, HighlightRegionType.KEYWORD);
-    super.visitRethrowExpression(node);
-  }
-
-  @override
-  void visitReturnStatement(ReturnStatement node) {
-    computer._addRegion_token(node.returnKeyword, HighlightRegionType.KEYWORD);
-    super.visitReturnStatement(node);
-  }
-
-  @override
-  void visitSetOrMapLiteral(SetOrMapLiteral node) {
-    if (node.isMap) {
-      computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
-      // TODO(brianwilkerson) Add a highlight region for set literals. This
-      //  would be a breaking change, but would be consistent with list and map
-      //  literals.
-//    } else if (node.isSet) {
-//    computer._addRegion_node(node, HighlightRegionType.LITERAL_SET);
-    }
-    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    super.visitSetOrMapLiteral(node);
-  }
-
-  @override
-  void visitShowCombinator(ShowCombinator node) {
-    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    super.visitShowCombinator(node);
-  }
-
-  @override
-  void visitSimpleFormalParameter(SimpleFormalParameter node) {
-    computer._addRegion_token(
-        node.requiredKeyword, HighlightRegionType.KEYWORD);
-    super.visitSimpleFormalParameter(node);
-  }
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    computer._addIdentifierRegion(node);
-    super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  void visitSimpleStringLiteral(SimpleStringLiteral node) {
-    computer._addRegion_node(node, HighlightRegionType.LITERAL_STRING);
-    super.visitSimpleStringLiteral(node);
-  }
-
-  @override
-  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    computer._addRegion_token(node.superKeyword, HighlightRegionType.KEYWORD);
-    super.visitSuperConstructorInvocation(node);
-  }
-
-  @override
-  void visitSwitchCase(SwitchCase node) {
-    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    super.visitSwitchCase(node);
-  }
-
-  @override
-  void visitSwitchDefault(SwitchDefault node) {
-    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    super.visitSwitchDefault(node);
-  }
-
-  @override
-  void visitSwitchStatement(SwitchStatement node) {
-    computer._addRegion_token(node.switchKeyword, HighlightRegionType.KEYWORD);
-    super.visitSwitchStatement(node);
-  }
-
-  @override
-  void visitThisExpression(ThisExpression node) {
-    computer._addRegion_token(node.thisKeyword, HighlightRegionType.KEYWORD);
-    super.visitThisExpression(node);
-  }
-
-  @override
-  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    computer._addRegion_token(
-        node.externalKeyword, HighlightRegionType.BUILT_IN);
-    super.visitTopLevelVariableDeclaration(node);
-  }
-
-  @override
-  void visitTryStatement(TryStatement node) {
-    computer._addRegion_token(node.tryKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.finallyKeyword, HighlightRegionType.KEYWORD);
-    super.visitTryStatement(node);
-  }
-
-  @override
-  void visitTypeName(TypeName node) {
-    var type = node.type;
-    if (type != null) {
-      if (type.isDynamic && node.name.name == 'dynamic') {
-        computer._addRegion_node(node, HighlightRegionType.TYPE_NAME_DYNAMIC);
-        return null;
-      }
-    }
-    super.visitTypeName(node);
-  }
-
-  @override
-  void visitVariableDeclarationList(VariableDeclarationList node) {
-    computer._addRegion_token(node.lateKeyword, HighlightRegionType.KEYWORD);
-    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    super.visitVariableDeclarationList(node);
-  }
-
-  @override
-  void visitWhileStatement(WhileStatement node) {
-    computer._addRegion_token(node.whileKeyword, HighlightRegionType.KEYWORD);
-    super.visitWhileStatement(node);
-  }
-
-  @override
-  void visitWithClause(WithClause node) {
-    computer._addRegion_token(node.withKeyword, HighlightRegionType.KEYWORD);
-    super.visitWithClause(node);
-  }
-
-  @override
-  void visitYieldStatement(YieldStatement node) {
-    var keyword = node.yieldKeyword;
-    var star = node.star;
-    var offset = keyword.offset;
-    var end = star != null ? star.end : keyword.end;
-    computer._addRegion(offset, end - offset, HighlightRegionType.BUILT_IN);
-    super.visitYieldStatement(node);
-  }
-
-  void _addRegions_functionBody(FunctionBody node) {
-    var keyword = node.keyword;
-    if (keyword != null) {
-      var star = node.star;
-      var offset = keyword.offset;
-      var end = star != null ? star.end : keyword.end;
-      computer._addRegion(offset, end - offset, HighlightRegionType.BUILT_IN);
-    }
-  }
-}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index c26fd4a..1f2391e 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -5,7 +5,6 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/computer/computer_closingLabels.dart';
 import 'package:analysis_server/src/computer/computer_folding.dart';
-import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/computer/computer_highlights2.dart';
 import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analysis_server/src/computer/computer_overrides.dart';
@@ -100,12 +99,7 @@
 void sendAnalysisNotificationHighlights(
     AnalysisServer server, String file, CompilationUnit dartUnit) {
   _sendNotification(server, () {
-    List<protocol.HighlightRegion> regions;
-    if (server.options.useAnalysisHighlight2) {
-      regions = DartUnitHighlightsComputer2(dartUnit).compute();
-    } else {
-      regions = DartUnitHighlightsComputer(dartUnit).compute();
-    }
+    var regions = DartUnitHighlightsComputer2(dartUnit).compute();
     var params = protocol.AnalysisHighlightsParams(file, regions);
     server.sendNotification(params.toNotification());
   });
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 8e7af39..36cd808 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -252,10 +252,6 @@
   /// The name of the option used to describe the new analysis driver logger.
   static const String NEW_ANALYSIS_DRIVER_LOG = 'new-analysis-driver-log';
 
-  /// The name of the flag used to enable version 2 of semantic highlight
-  /// notification.
-  static const String USE_ANALYSIS_HIGHLIGHT2 = 'useAnalysisHighlight2';
-
   /// The option for specifying the http diagnostic port.
   /// If specified, users can review server status and performance information
   /// by opening a web browser on http://localhost:<port>
@@ -309,8 +305,6 @@
     var results = parser.parse(arguments, <String, String>{});
 
     var analysisServerOptions = AnalysisServerOptions();
-    analysisServerOptions.useAnalysisHighlight2 =
-        results[USE_ANALYSIS_HIGHLIGHT2];
     analysisServerOptions.fileReadMode = results[FILE_READ_MODE];
     analysisServerOptions.newAnalysisDriverLog =
         results[NEW_ANALYSIS_DRIVER_LOG];
@@ -769,10 +763,6 @@
             ' status and performance information');
     parser.addOption(SDK_OPTION,
         valueHelp: 'path', help: 'Path to the Dart sdk');
-    parser.addFlag(USE_ANALYSIS_HIGHLIGHT2,
-        help: 'enable version 2 of semantic highlight',
-        defaultsTo: false,
-        negatable: false);
     parser.addOption(FILE_READ_MODE,
         help: 'an option for reading files (some clients normalize eol '
             'characters, which make the file offset and range information '
@@ -820,6 +810,8 @@
     parser.addFlag('enable-instrumentation', hide: true);
     // Removed 11/8/2020.
     parser.addFlag('preview-dart-2', hide: true);
+    // Removed 11/11/2020.
+    parser.addFlag('useAnalysisHighlight2', hide: true);
     // Removed 9/23/2020.
     parser.addFlag('use-fasta-parser', hide: true);
 
diff --git a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
index 411e163..8d9c2bb 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
@@ -1142,7 +1142,6 @@
   @override
   void setUp() {
     super.setUp();
-    server.options.useAnalysisHighlight2 = true;
     createProject();
   }
 
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test.dart b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
deleted file mode 100644
index 9432795..0000000
--- a/pkg/analysis_server/test/analysis/notification_highlights_test.dart
+++ /dev/null
@@ -1,1194 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:analysis_server/protocol/protocol.dart';
-import 'package:analysis_server/protocol/protocol_constants.dart';
-import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../analysis_abstract.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(AnalysisNotificationHighlightsTest);
-    defineReflectiveTests(HighlightsWithControlFlowCollectionsTest);
-    defineReflectiveTests(HighlightsWithNullSafetyTest);
-    defineReflectiveTests(HighlightTypeTest);
-  });
-}
-
-@reflectiveTest
-class AnalysisNotificationHighlightsTest extends HighlightsTestSupport {
-  Future<void> test_ANNOTATION_hasArguments() async {
-    addTestFile('''
-class AAA {
-  const AAA(a, b, c);
-}
-@AAA(1, 2, 3) main() {}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.ANNOTATION, '@AAA(', '@AAA('.length);
-    assertHasRegion(HighlightRegionType.ANNOTATION, ') main', ')'.length);
-  }
-
-  Future<void> test_ANNOTATION_noArguments() async {
-    addTestFile('''
-const AAA = 42;
-@AAA main() {}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.ANNOTATION, '@AAA');
-  }
-
-  Future<void> test_BUILT_IN_abstract() async {
-    addTestFile('''
-abstract class A {};
-abstract class B = Object with A;
-main() {
-  var abstract = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'abstract class A');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'abstract class B');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'abstract = 42');
-  }
-
-  Future<void> test_BUILT_IN_as() async {
-    addTestFile('''
-import 'dart:math' as math;
-main() {
-  p as int;
-  var as = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'as math');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'as int');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'as = 42');
-  }
-
-  Future<void> test_BUILT_IN_async() async {
-    addTestFile('''
-fa() async {}
-fb() async* {}
-main() {
-  bool async = false;
-}
-''');
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.BUILT_IN, 'async');
-    assertHasStringRegion(HighlightRegionType.BUILT_IN, 'async*');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'async = false');
-  }
-
-  Future<void> test_BUILT_IN_await() async {
-    addTestFile('''
-main() async {
-  await 42;
-  await for (var item in []) {
-    print(item);
-  }
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'await 42');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'await for');
-  }
-
-  Future<void> test_BUILT_IN_deferred() async {
-    addTestFile('''
-import 'dart:math' deferred as math;
-main() {
-  var deferred = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'deferred as math');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'deferred = 42');
-  }
-
-  Future<void> test_BUILT_IN_export() async {
-    addTestFile('''
-export "dart:math";
-main() {
-  var export = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'export "dart:');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'export = 42');
-  }
-
-  Future<void> test_BUILT_IN_external() async {
-    addTestFile('''
-class A {
-  external A();
-  external aaa();
-}
-external main() {
-  var external = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'external A()');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'external aaa()');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'external main()');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'external = 42');
-  }
-
-  Future<void> test_BUILT_IN_factory() async {
-    addTestFile('''
-class A {
-  A.named();
-  factory A() => A();
-}
-main() {
-  var factory = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'factory A()');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'factory = 42');
-  }
-
-  Future<void> test_BUILT_IN_get() async {
-    addTestFile('''
-get aaa => 1;
-class A {
-  get bbb => 2;
-}
-main() {
-  var get = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'get aaa =>');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'get bbb =>');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'get = 42');
-  }
-
-  Future<void> test_BUILT_IN_hide() async {
-    addTestFile('''
-import 'foo.dart' hide Foo;
-main() {
-  var hide = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'hide Foo');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'hide = 42');
-  }
-
-  Future<void> test_BUILT_IN_implements() async {
-    addTestFile('''
-class A {}
-class B implements A {}
-main() {
-  var implements = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'implements A {}');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'implements = 42');
-  }
-
-  Future<void> test_BUILT_IN_import() async {
-    addTestFile('''
-import "foo.dart";
-main() {
-  var import = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'import "');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'import = 42');
-  }
-
-  Future<void> test_BUILT_IN_library() async {
-    addTestFile('''
-library lib;
-main() {
-  var library = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'library lib;');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'library = 42');
-  }
-
-  Future<void> test_BUILT_IN_native() async {
-    addTestFile('''
-class A native "A_native" {}
-class B {
-  bbb() native "bbb_native";
-}
-main() {
-  var native = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'native "A_');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'native "bbb_');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'native = 42');
-  }
-
-  Future<void> test_BUILT_IN_on_inMixin() async {
-    addTestFile('''
-mixin M on N {}
-class N {}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'on N');
-  }
-
-  Future<void> test_BUILT_IN_on_inTry() async {
-    addTestFile('''
-main() {
-  try {
-  } on int catch (e) {
-  }
-  var on = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'on int');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'on = 42');
-  }
-
-  Future<void> test_BUILT_IN_operator() async {
-    addTestFile('''
-class A {
-  operator +(x) => null;
-}
-main() {
-  var operator = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'operator +(');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'operator = 42');
-  }
-
-  Future<void> test_BUILT_IN_part() async {
-    addTestFile('''
-part "my_part.dart";
-main() {
-  var part = 42;
-}''');
-    newFile('/project/bin/my_part.dart', content: 'part of lib;');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'part "my_');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'part = 42');
-  }
-
-  Future<void> test_BUILT_IN_partOf() async {
-    addTestFile('''
-part of lib;
-main() {
-  var part = 1;
-  var of = 2;
-}''');
-    _addLibraryForTestPart();
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'part of', 'part of'.length);
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'part = 1');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'of = 2');
-  }
-
-  Future<void> test_BUILT_IN_set() async {
-    addTestFile('''
-set aaa(x) {}
-class A
-  set bbb(x) {}
-}
-main() {
-  var set = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'set aaa(');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'set bbb(');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'set = 42');
-  }
-
-  Future<void> test_BUILT_IN_show() async {
-    addTestFile('''
-import 'foo.dart' show Foo;
-main() {
-  var show = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'show Foo');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'show = 42');
-  }
-
-  Future<void> test_BUILT_IN_static() async {
-    addTestFile('''
-class A {
-  static aaa;
-  static bbb() {}
-}
-main() {
-  var static = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'static aaa;');
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'static bbb()');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'static = 42');
-  }
-
-  Future<void> test_BUILT_IN_sync() async {
-    addTestFile('''
-fa() sync {}
-fb() sync* {}
-main() {
-  bool sync = false;
-}
-''');
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.BUILT_IN, 'sync');
-    assertHasStringRegion(HighlightRegionType.BUILT_IN, 'sync*');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'sync = false');
-  }
-
-  Future<void> test_BUILT_IN_typedef() async {
-    addTestFile('''
-typedef A();
-main() {
-  var typedef = 42;
-}''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'typedef A();');
-    assertNoRegion(HighlightRegionType.BUILT_IN, 'typedef = 42');
-  }
-
-  Future<void> test_BUILT_IN_yield() async {
-    addTestFile('''
-main() async* {
-  yield 42;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'yield 42');
-  }
-
-  Future<void> test_BUILT_IN_yieldStar() async {
-    addTestFile('''
-main() async* {
-  yield* [];
-}
-''');
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.BUILT_IN, 'yield*');
-  }
-
-  Future<void> test_CLASS() async {
-    addTestFile('''
-class AAA {}
-AAA aaa;
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.CLASS, 'AAA {}');
-    assertHasRegion(HighlightRegionType.CLASS, 'AAA aaa');
-  }
-
-  Future<void> test_CLASS_notDynamic() async {
-    addTestFile('''
-dynamic f() {}
-''');
-    await prepareHighlights();
-    assertNoRegion(HighlightRegionType.CLASS, 'dynamic f()');
-  }
-
-  Future<void> test_CLASS_notVoid() async {
-    addTestFile('''
-void f() {}
-''');
-    await prepareHighlights();
-    assertNoRegion(HighlightRegionType.CLASS, 'void f()');
-  }
-
-  Future<void> test_COMMENT() async {
-    addTestFile('''
-/**
- * documentation comment
- */
-void main() {
-  // end-of-line comment
-  my_function(1);
-}
-
-void my_function(String a) {
- /* block comment */
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.COMMENT_DOCUMENTATION, '/**', 32);
-    assertHasRegion(HighlightRegionType.COMMENT_END_OF_LINE, '//', 22);
-    assertHasRegion(HighlightRegionType.COMMENT_BLOCK, '/* b', 19);
-  }
-
-  Future<void> test_CONSTRUCTOR_explicitNew() async {
-    addTestFile('''
-class AAA<T> {
-  AAA() {}
-  AAA.name(p) {}
-}
-main() {
-  new AAA<int>();
-  new AAA<int>.name(42);
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'AAA<int>(');
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'AAA<int>.name(');
-    assertHasRegion(HighlightRegionType.CLASS, 'int>(');
-    assertHasRegion(HighlightRegionType.CLASS, 'int>.name(');
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'name(p)');
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'name(42)');
-  }
-
-  Future<void> test_CONSTRUCTOR_implicitNew() async {
-    addTestFile('''
-class AAA<T> {
-  AAA() {}
-  AAA.name(p) {}
-}
-main() {
-  AAA<int>();
-  AAA<int>.name(42);
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'AAA<int>(');
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'AAA<int>.name(');
-    assertHasRegion(HighlightRegionType.CLASS, 'int>(');
-    assertHasRegion(HighlightRegionType.CLASS, 'int>.name(');
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'name(p)');
-    assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'name(42)');
-  }
-
-  Future<void> test_DIRECTIVE() async {
-    addTestFile('''
-library lib;
-import 'dart:math';
-export 'dart:math';
-part 'part.dart';
-''');
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, 'library lib;');
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, "import 'dart:math';");
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, "export 'dart:math';");
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, "part 'part.dart';");
-  }
-
-  Future<void> test_DIRECTIVE_partOf() async {
-    addTestFile('''
-part of lib;
-''');
-    _addLibraryForTestPart();
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.DIRECTIVE, 'part of lib;');
-  }
-
-  Future<void> test_DYNAMIC_TYPE() async {
-    addTestFile('''
-f() {}
-main(p) {
-  print(p);
-  var v1 = f();
-  int v2;
-  var v3 = v2;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.DYNAMIC_TYPE, 'p)');
-    assertHasRegion(HighlightRegionType.DYNAMIC_TYPE, 'v1 =');
-    assertNoRegion(HighlightRegionType.DYNAMIC_TYPE, 'v2;');
-    assertNoRegion(HighlightRegionType.DYNAMIC_TYPE, 'v3 =');
-  }
-
-  Future<void> test_ENUM() async {
-    addTestFile('''
-enum MyEnum {A, B, C}
-MyEnum value;
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.ENUM, 'MyEnum {');
-    assertHasRegion(HighlightRegionType.ENUM, 'MyEnum value;');
-  }
-
-  Future<void> test_ENUM_CONSTANT() async {
-    addTestFile('''
-enum MyEnum {AAA, BBB}
-main() {
-  print(MyEnum.AAA);
-  print(MyEnum.BBB);
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.ENUM_CONSTANT, 'AAA, ');
-    assertHasRegion(HighlightRegionType.ENUM_CONSTANT, 'BBB}');
-    assertHasRegion(HighlightRegionType.ENUM_CONSTANT, 'AAA);');
-    assertHasRegion(HighlightRegionType.ENUM_CONSTANT, 'BBB);');
-  }
-
-  Future<void> test_FIELD() async {
-    addTestFile('''
-class A {
-  int aaa = 1;
-  int bbb = 2;
-  A([this.bbb = 3]);
-}
-main(A a) {
-  a.aaa = 4;
-  a.bbb = 5;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.FIELD, 'aaa = 1');
-    assertHasRegion(HighlightRegionType.FIELD, 'bbb = 2');
-    assertHasRegion(HighlightRegionType.FIELD, 'bbb = 3');
-    assertHasRegion(HighlightRegionType.FIELD, 'aaa = 4');
-    assertHasRegion(HighlightRegionType.FIELD, 'bbb = 5');
-  }
-
-  Future<void> test_FIELD_STATIC() async {
-    addTestFile('''
-class A {
-  static aaa = 1;
-  static get bbb => null;
-  static set ccc(x) {}
-}
-main() {
-  A.aaa = 2;
-  A.bbb;
-  A.ccc = 3;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.FIELD_STATIC, 'aaa = 1');
-    assertHasRegion(HighlightRegionType.FIELD_STATIC, 'aaa = 2');
-    assertHasRegion(HighlightRegionType.FIELD_STATIC, 'bbb;');
-    assertHasRegion(HighlightRegionType.FIELD_STATIC, 'ccc = 3');
-  }
-
-  Future<void> test_FUNCTION() async {
-    addTestFile('''
-fff(p) {}
-main() {
-  fff(42);
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.FUNCTION_DECLARATION, 'fff(p) {}');
-    assertHasRegion(HighlightRegionType.FUNCTION, 'fff(42)');
-  }
-
-  Future<void> test_FUNCTION_TYPE_ALIAS() async {
-    addTestFile('''
-typedef FFF(p);
-main(FFF fff) {
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
-    assertHasRegion(HighlightRegionType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
-  }
-
-  Future<void> test_GETTER_DECLARATION() async {
-    addTestFile('''
-get aaa => null;
-class A {
-  get bbb => null;
-}
-main(A a) {
-  aaa;
-  a.bbb;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.GETTER_DECLARATION, 'aaa => null');
-    assertHasRegion(HighlightRegionType.GETTER_DECLARATION, 'bbb => null');
-    assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'aaa;');
-    assertHasRegion(HighlightRegionType.FIELD, 'bbb;');
-  }
-
-  Future<void> test_IDENTIFIER_DEFAULT() async {
-    addTestFile('''
-main() {
-  aaa = 42;
-  bbb(84);
-  CCC ccc;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.IDENTIFIER_DEFAULT, 'aaa = 42');
-    assertHasRegion(HighlightRegionType.IDENTIFIER_DEFAULT, 'bbb(84)');
-    assertHasRegion(HighlightRegionType.IDENTIFIER_DEFAULT, 'CCC ccc');
-  }
-
-  Future<void> test_IMPORT_PREFIX() async {
-    addTestFile('''
-import 'dart:math' as ma;
-main() {
-  ma.max(1, 2);
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.IMPORT_PREFIX, 'ma;');
-    assertHasRegion(HighlightRegionType.IMPORT_PREFIX, 'ma.max');
-  }
-
-  Future<void> test_KEYWORD() async {
-    addTestFile('''
-main() {
-  assert(true);
-  for (;;) break;
-  switch (0) {
-    case 0: break;
-    default: break;
-  }
-  try {} catch (e) {}
-  const v1 = 0;
-  for (;;) continue;
-  do {} while (true);
-  if (true) {} else {}
-  var v2 = false;
-  final v3 = 1;
-  try {} finally {}
-  for (var v4 in []) {}
-  v3 is int;
-  new A();
-  try {} catch (e) {rethrow;}
-  var v5 = true;
-  while (true) {}
-}
-class A {}
-class B extends A {
-  B() : super();
-  m() {
-    return this;
-  }
-}
-class C = Object with A;
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'assert(true)');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'for (;;)');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'for (var v4 in');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'break;');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'case 0:');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'catch (e) {}');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'class A {}');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'const v1');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'continue;');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'default:');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'do {} while');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'if (true)');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'false;');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'final v3 =');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'finally {}');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'in []');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'is int');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'new A();');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'rethrow;');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'return this');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'super();');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'switch (0)');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'this;');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'true;');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'try {');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'while (true) {}');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'while (true);');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'with A;');
-  }
-
-  Future<void> test_KEYWORD_ifElse_statement() async {
-    addTestFile('''
-f(a, b) {
-  if (a < b) {} else {}
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'if');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'else');
-  }
-
-  Future<void> test_KEYWORD_mixin() async {
-    addTestFile('''
-mixin M {}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.BUILT_IN, 'mixin');
-  }
-
-  Future<void> test_KEYWORD_void() async {
-    addTestFile('''
-void main() {
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'void main()');
-  }
-
-  Future<void> test_LABEL() async {
-    addTestFile('''
-main() {
-myLabel:
-  while (true) {
-    break myLabel;
-  }
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.LABEL, 'myLabel:');
-    assertHasRegion(HighlightRegionType.LABEL, 'myLabel;');
-  }
-
-  Future<void> test_LITERAL_BOOLEAN() async {
-    addTestFile('var V = true;');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.LITERAL_BOOLEAN, 'true;');
-  }
-
-  Future<void> test_LITERAL_DOUBLE() async {
-    addTestFile('var V = 4.2;');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
-  }
-
-  Future<void> test_LITERAL_INTEGER() async {
-    addTestFile('var V = 42;');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.LITERAL_INTEGER, '42;');
-  }
-
-  Future<void> test_LITERAL_LIST() async {
-    addTestFile('var V = <int>[1, 2, 3];');
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.LITERAL_LIST, '<int>[1, 2, 3]');
-  }
-
-  Future<void> test_LITERAL_MAP() async {
-    addTestFile("var V = const <int, String>{1: 'a', 2: 'b', 3: 'c'};");
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.LITERAL_MAP,
-        "const <int, String>{1: 'a', 2: 'b', 3: 'c'}");
-  }
-
-  Future<void> test_LITERAL_STRING() async {
-    addTestFile('var V = "abc";');
-    await prepareHighlights();
-    assertHasRegion(
-        HighlightRegionType.LITERAL_STRING, '"abc";', '"abc"'.length);
-  }
-
-  Future<void> test_LOCAL_VARIABLE() async {
-    addTestFile('''
-main() {
-  int vvv = 0;
-  vvv;
-  vvv = 1;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
-    assertHasRegion(HighlightRegionType.LOCAL_VARIABLE, 'vvv;');
-    assertHasRegion(HighlightRegionType.LOCAL_VARIABLE, 'vvv = 1;');
-  }
-
-  Future<void> test_METHOD() async {
-    addTestFile('''
-class A {
-  aaa() {}
-  static bbb() {}
-}
-main(A a) {
-  a.aaa();
-  a.aaa;
-  A.bbb();
-  A.bbb;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.METHOD_DECLARATION, 'aaa() {}');
-    assertHasRegion(HighlightRegionType.METHOD_DECLARATION_STATIC, 'bbb() {}');
-    assertHasRegion(HighlightRegionType.METHOD, 'aaa();');
-    assertHasRegion(HighlightRegionType.METHOD, 'aaa;');
-    assertHasRegion(HighlightRegionType.METHOD_STATIC, 'bbb();');
-    assertHasRegion(HighlightRegionType.METHOD_STATIC, 'bbb;');
-  }
-
-  Future<void> test_METHOD_bestType() async {
-    addTestFile('''
-main(p) {
-  if (p is List) {
-    p.add(null);
-  }
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.METHOD, 'add(null)');
-  }
-
-  Future<void> test_PARAMETER() async {
-    addTestFile('''
-main(int p) {
-  p;
-  p = 42;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.PARAMETER, 'p) {');
-    assertHasRegion(HighlightRegionType.PARAMETER, 'p;');
-    assertHasRegion(HighlightRegionType.PARAMETER, 'p = 42');
-  }
-
-  Future<void> test_SETTER_DECLARATION() async {
-    addTestFile('''
-set aaa(x) {}
-class A {
-  set bbb(x) {}
-}
-main(A a) {
-  aaa = 1;
-  a.bbb = 2;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.SETTER_DECLARATION, 'aaa(x)');
-    assertHasRegion(HighlightRegionType.SETTER_DECLARATION, 'bbb(x)');
-    assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'aaa = 1');
-    assertHasRegion(HighlightRegionType.FIELD, 'bbb = 2');
-  }
-
-  Future<void> test_TOP_LEVEL_VARIABLE() async {
-    addTestFile('''
-const VVV = 0;
-@VVV // annotation
-main() {
-  print(VVV);
-  VVV = 1;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV = 0');
-    assertHasRegion(
-        HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV // annotation');
-    assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV);');
-    assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV = 1');
-  }
-
-  Future<void> test_TYPE_NAME_DYNAMIC() async {
-    addTestFile('''
-dynamic main() {
-  dynamic = 42;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.TYPE_NAME_DYNAMIC, 'dynamic main()');
-    assertNoRegion(HighlightRegionType.IDENTIFIER_DEFAULT, 'dynamic main()');
-    assertNoRegion(HighlightRegionType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
-  }
-
-  Future<void> test_TYPE_PARAMETER() async {
-    addTestFile('''
-class A<T> {
-  T fff;
-  T mmm(T p) => null;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.TYPE_PARAMETER, 'T> {');
-    assertHasRegion(HighlightRegionType.TYPE_PARAMETER, 'T fff;');
-    assertHasRegion(HighlightRegionType.TYPE_PARAMETER, 'T mmm(');
-    assertHasRegion(HighlightRegionType.TYPE_PARAMETER, 'T p)');
-  }
-}
-
-class HighlightsTestSupport extends AbstractAnalysisTest {
-  List<HighlightRegion> regions;
-
-  final Completer<void> _resultsAvailable = Completer();
-
-  void assertHasRawRegion(HighlightRegionType type, int offset, int length) {
-    for (var region in regions) {
-      if (region.offset == offset &&
-          region.length == length &&
-          region.type == type) {
-        return;
-      }
-    }
-    fail('Expected to find (offset=$offset; length=$length; type=$type) in\n'
-        '${regions.join('\n')}');
-  }
-
-  void assertHasRegion(HighlightRegionType type, String search,
-      [int length = -1]) {
-    var offset = findOffset(search);
-    length = findRegionLength(search, length);
-    assertHasRawRegion(type, offset, length);
-  }
-
-  void assertHasStringRegion(HighlightRegionType type, String str) {
-    var offset = findOffset(str);
-    var length = str.length;
-    assertHasRawRegion(type, offset, length);
-  }
-
-  void assertNoRawRegion(HighlightRegionType type, int offset, int length) {
-    for (var region in regions) {
-      if (region.offset == offset &&
-          region.length == length &&
-          region.type == type) {
-        fail(
-            'Not expected to find (offset=$offset; length=$length; type=$type) in\n'
-            '${regions.join('\n')}');
-      }
-    }
-  }
-
-  void assertNoRegion(HighlightRegionType type, String search,
-      [int length = -1]) {
-    var offset = findOffset(search);
-    length = findRegionLength(search, length);
-    assertNoRawRegion(type, offset, length);
-  }
-
-  int findRegionLength(String search, int length) {
-    if (length == -1) {
-      length = 0;
-      while (length < search.length) {
-        var c = search.codeUnitAt(length);
-        if (length == 0 && c == '@'.codeUnitAt(0)) {
-          length++;
-          continue;
-        }
-        if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
-            c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
-            c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
-          break;
-        }
-        length++;
-      }
-    }
-    return length;
-  }
-
-  Future prepareHighlights() {
-    addAnalysisSubscription(AnalysisService.HIGHLIGHTS, testFile);
-    return _resultsAvailable.future;
-  }
-
-  @override
-  void processNotification(Notification notification) {
-    if (notification.event == SERVER_NOTIFICATION_ERROR) {
-      print('SERVER_NOTIFICATION_ERROR: ${notification.toJson()}');
-      _resultsAvailable.complete();
-      fail('SERVER_NOTIFICATION_ERROR');
-    }
-    if (notification.event == ANALYSIS_NOTIFICATION_HIGHLIGHTS) {
-      var params = AnalysisHighlightsParams.fromNotification(notification);
-      if (params.file == testFile) {
-        regions = params.regions;
-        _resultsAvailable.complete();
-      }
-    }
-  }
-
-  @override
-  void setUp() {
-    super.setUp();
-    createProject();
-  }
-
-  void _addLibraryForTestPart() {
-    newFile(join(testFolder, 'my_lib.dart'), content: '''
-library lib;
-part 'test.dart';
-    ''');
-  }
-}
-
-@reflectiveTest
-class HighlightsWithControlFlowCollectionsTest extends HighlightsTestSupport {
-  @failingTest
-  Future<void> test_KEYWORD_awaitForIn_list() async {
-    addTestFile('''
-f(a) async {
-  return [await for(var b in a) b];
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'await');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'for');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'in');
-  }
-
-  @failingTest
-  Future<void> test_KEYWORD_awaitForIn_map() async {
-    addTestFile('''
-f(a) async {
-  return {await for(var b in a) b : 0};
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'await');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'for');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'in');
-  }
-
-  @failingTest
-  Future<void> test_KEYWORD_awaitForIn_set() async {
-    addTestFile('''
-f(a) async {
-  return {await for(var b in a) b};
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'await');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'for');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'in');
-  }
-
-  Future<void> test_KEYWORD_const_list() async {
-    addTestFile('''
-var v = const [];
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'const');
-  }
-
-  Future<void> test_KEYWORD_const_map() async {
-    addTestFile('''
-var v = const {0 : 1};
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'const');
-  }
-
-  Future<void> test_KEYWORD_const_set() async {
-    addTestFile('''
-var v = const {0};
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'const');
-  }
-
-  Future<void> test_KEYWORD_if_list() async {
-    addTestFile('''
-f(a, b) {
-  return [if (a < b) 'a'];
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'if');
-  }
-
-  Future<void> test_KEYWORD_if_map() async {
-    addTestFile('''
-f(a, b) {
-  return {if (a < b) 'a' : 1};
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'if');
-  }
-
-  Future<void> test_KEYWORD_if_set() async {
-    addTestFile('''
-f(a, b) {
-  return {if (a < b) 'a'};
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'if');
-  }
-
-  Future<void> test_KEYWORD_ifElse_list() async {
-    addTestFile('''
-f(a, b) {
-  return [if (a < b) 'a' else 'b'];
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'if');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'else');
-  }
-
-  Future<void> test_KEYWORD_ifElse_map() async {
-    addTestFile('''
-f(a, b) {
-  return {if (a < b) 'a' : 1 else 'b' : 2};
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'if');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'else');
-  }
-
-  Future<void> test_KEYWORD_ifElse_set() async {
-    addTestFile('''
-f(a, b) {
-  return {if (a < b) 'a' else 'b'};
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'if');
-    assertHasRegion(HighlightRegionType.KEYWORD, 'else');
-  }
-
-  Future<void> test_LITERAL_LIST_withControlFlow() async {
-    addTestFile('var V = <int>[1, 2, 3];');
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.LITERAL_LIST, '<int>[1, 2, 3]');
-  }
-
-  Future<void> test_LITERAL_MAP_withControlFlow() async {
-    addTestFile("var V = const <int, String>{1: 'a', 2: 'b', 3: 'c'};");
-    await prepareHighlights();
-    assertHasStringRegion(HighlightRegionType.LITERAL_MAP,
-        "const <int, String>{1: 'a', 2: 'b', 3: 'c'}");
-  }
-}
-
-@reflectiveTest
-class HighlightsWithNullSafetyTest extends HighlightsTestSupport {
-  @override
-  void createProject({Map<String, String> packageRoots}) {
-    addAnalysisOptionsFile('''
-analyzer:
-  enable-experiment:
-    - non-nullable
-''');
-    super.createProject(packageRoots: packageRoots);
-  }
-
-  Future<void> test_KEYWORD_late() async {
-    addTestFile('''
-class C {
-  late int x;
-}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'late');
-  }
-
-  Future<void> test_KEYWORD_required() async {
-    addTestFile('''
-void f({required int x}) {}
-''');
-    await prepareHighlights();
-    assertHasRegion(HighlightRegionType.KEYWORD, 'required');
-  }
-}
-
-@reflectiveTest
-class HighlightTypeTest {
-  void test_constructor() {
-    expect(HighlightRegionType.CLASS,
-        HighlightRegionType(HighlightRegionType.CLASS.name));
-  }
-
-  void test_toString() {
-    expect(HighlightRegionType.CLASS.toString(), 'HighlightRegionType.CLASS');
-  }
-
-  void test_valueOf_unknown() {
-    expect(() {
-      HighlightRegionType('no-such-type');
-    }, throwsException);
-  }
-}
diff --git a/pkg/analysis_server/test/analysis/test_all.dart b/pkg/analysis_server/test/analysis/test_all.dart
index 702a96c..1187065 100644
--- a/pkg/analysis_server/test/analysis/test_all.dart
+++ b/pkg/analysis_server/test/analysis/test_all.dart
@@ -15,7 +15,6 @@
 import 'notification_errors_test.dart' as notification_errors;
 import 'notification_folding_test.dart' as notification_folding;
 import 'notification_highlights2_test.dart' as notification_highlights2;
-import 'notification_highlights_test.dart' as notification_highlights;
 import 'notification_implemented_test.dart' as notification_implemented;
 import 'notification_navigation_test.dart' as notification_navigation;
 import 'notification_occurrences_test.dart' as notification_occurrences;
@@ -37,7 +36,6 @@
     notification_folding.main();
     notification_errors.main();
     notification_highlights2.main();
-    notification_highlights.main();
     notification_implemented.main();
     notification_navigation.main();
     notification_occurrences.main();
diff --git a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
deleted file mode 100644
index 9dfcaf7..0000000
--- a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../support/integration_tests.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(AnalysisHighlightsTest);
-  });
-}
-
-@reflectiveTest
-class AnalysisHighlightsTest extends AbstractAnalysisServerIntegrationTest {
-  Map<HighlightRegionType, Set<String>> highlights;
-
-  void check(HighlightRegionType type, List<String> expected) {
-    expect(highlights[type], equals(expected.toSet()));
-    highlights.remove(type);
-  }
-
-  Future<void> computeHighlights(String pathname, String text) async {
-    writeFile(pathname, text);
-    standardAnalysisSetup();
-    sendAnalysisSetSubscriptions({
-      AnalysisService.HIGHLIGHTS: [pathname]
-    });
-    // Map from highlight type to highlighted text
-    onAnalysisHighlights.listen((AnalysisHighlightsParams params) {
-      expect(params.file, equals(pathname));
-      highlights = <HighlightRegionType, Set<String>>{};
-      for (var region in params.regions) {
-        var startIndex = region.offset;
-        var endIndex = startIndex + region.length;
-        var highlightedText = text.substring(startIndex, endIndex);
-        var type = region.type;
-        if (!highlights.containsKey(type)) {
-          highlights[type] = <String>{};
-        }
-        highlights[type].add(highlightedText);
-      }
-    });
-    await analysisFinished;
-  }
-
-  @override
-  Future startServer({
-    int diagnosticPort,
-    int servicesPort,
-  }) {
-    return server.start(
-        diagnosticPort: diagnosticPort,
-        servicesPort: servicesPort,
-        useAnalysisHighlight2: true);
-  }
-
-  Future<void> test_highlights() async {
-    var pathname = sourcePath('test.dart');
-    var text = r'''
-import 'dart:async' as async;
-
-/**
- * Doc comment
- */
-class Class<TypeParameter> {
-  Class() {
-    field = {1.0: [].toList()};
-  }
-
-  Class.constructor() {
-    dynamic local = true;
-    field = {2: local};
-  }
-
-  Map field = {3: 4};
-  static int staticField = 0;
-
-  method() {
-    // End of line comment
-    /* Block comment */
-  }
-
-  static staticMethod() {
-  }
-
-  get getter {
-  }
-
-  set setter(int parameter) {
-    print(parameter);
-  }
-}
-
-class Class2<TypeParameter> extends Class<TypeParameter> {
-  @override
-  method() {
-  }
-}
-
-typedef functionType();
-
-function(dynamicType) {
-  print('string');
-  unresolvedIdentifier = 42;
-  return async.Future.wait([]);
-}
-
-int topLevelVariable = 0;
-''';
-    await computeHighlights(pathname, text);
-    // There should be 1 error due to the fact that unresolvedIdentifier is
-    // unresolved.
-    expect(currentAnalysisErrors[pathname], hasLength(1));
-
-    check(HighlightRegionType.ANNOTATION, ['@override']);
-    check(HighlightRegionType.BUILT_IN,
-        ['as', 'get', 'import', 'set', 'static', 'typedef']);
-    check(
-        HighlightRegionType.CLASS, ['Class', 'Class2', 'Future', 'Map', 'int']);
-    check(HighlightRegionType.COMMENT_BLOCK, ['/* Block comment */']);
-    check(HighlightRegionType.COMMENT_DOCUMENTATION,
-        ['/**\n * Doc comment\n */']);
-    check(HighlightRegionType.COMMENT_END_OF_LINE, ['// End of line comment']);
-    check(HighlightRegionType.CONSTRUCTOR, ['constructor']);
-    check(HighlightRegionType.DIRECTIVE, ["import 'dart:async' as async;"]);
-    check(HighlightRegionType.DYNAMIC_PARAMETER_DECLARATION, ['dynamicType']);
-    check(HighlightRegionType.INSTANCE_FIELD_DECLARATION, ['field']);
-    check(HighlightRegionType.INSTANCE_SETTER_REFERENCE, ['field']);
-    check(HighlightRegionType.STATIC_FIELD_DECLARATION, ['staticField']);
-    check(HighlightRegionType.TOP_LEVEL_FUNCTION_REFERENCE, ['print']);
-    check(HighlightRegionType.TOP_LEVEL_FUNCTION_DECLARATION, ['function']);
-    check(HighlightRegionType.FUNCTION_TYPE_ALIAS, ['functionType']);
-    check(HighlightRegionType.INSTANCE_GETTER_DECLARATION, ['getter']);
-    check(HighlightRegionType.IDENTIFIER_DEFAULT, ['unresolvedIdentifier']);
-    check(HighlightRegionType.IMPORT_PREFIX, ['async']);
-    check(HighlightRegionType.KEYWORD, ['class', 'extends', 'true', 'return']);
-    check(HighlightRegionType.LITERAL_BOOLEAN, ['true']);
-    check(HighlightRegionType.LITERAL_DOUBLE, ['1.0']);
-    check(HighlightRegionType.LITERAL_INTEGER, ['2', '3', '4', '0', '42']);
-    check(HighlightRegionType.LITERAL_LIST, ['[]']);
-    check(HighlightRegionType.LITERAL_MAP,
-        ['{1.0: [].toList()}', '{2: local}', '{3: 4}']);
-    check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
-    check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_DECLARATION, ['local']);
-    check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_REFERENCE, ['local']);
-    check(HighlightRegionType.INSTANCE_METHOD_REFERENCE, ['toList']);
-    check(HighlightRegionType.INSTANCE_METHOD_DECLARATION, ['method']);
-    check(HighlightRegionType.STATIC_METHOD_DECLARATION, ['staticMethod']);
-    check(HighlightRegionType.STATIC_METHOD_REFERENCE, ['wait']);
-    check(HighlightRegionType.PARAMETER_DECLARATION, ['parameter']);
-    check(HighlightRegionType.PARAMETER_REFERENCE, ['parameter']);
-    check(HighlightRegionType.INSTANCE_SETTER_DECLARATION, ['setter']);
-    check(HighlightRegionType.TOP_LEVEL_GETTER_REFERENCE, ['override']);
-    check(HighlightRegionType.TOP_LEVEL_VARIABLE_DECLARATION,
-        ['topLevelVariable']);
-    check(HighlightRegionType.TYPE_NAME_DYNAMIC, ['dynamic']);
-    check(HighlightRegionType.TYPE_PARAMETER, ['TypeParameter']);
-    expect(highlights, isEmpty);
-  }
-
-  Future<void> test_highlights_mixin() async {
-    var pathname = sourcePath('test.dart');
-    var text = r'''
-mixin M on A implements B {}
-class A {}
-class B {}
-''';
-    await computeHighlights(pathname, text);
-    expect(currentAnalysisErrors[pathname], hasLength(0));
-
-    check(HighlightRegionType.BUILT_IN, ['implements', 'mixin', 'on']);
-    check(HighlightRegionType.KEYWORD, ['class']);
-  }
-}
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index 63f668b..9dfcaf7 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -48,6 +48,17 @@
     await analysisFinished;
   }
 
+  @override
+  Future startServer({
+    int diagnosticPort,
+    int servicesPort,
+  }) {
+    return server.start(
+        diagnosticPort: diagnosticPort,
+        servicesPort: servicesPort,
+        useAnalysisHighlight2: true);
+  }
+
   Future<void> test_highlights() async {
     var pathname = sourcePath('test.dart');
     var text = r'''
@@ -81,6 +92,7 @@
   }
 
   set setter(int parameter) {
+    print(parameter);
   }
 }
 
@@ -116,13 +128,14 @@
     check(HighlightRegionType.COMMENT_END_OF_LINE, ['// End of line comment']);
     check(HighlightRegionType.CONSTRUCTOR, ['constructor']);
     check(HighlightRegionType.DIRECTIVE, ["import 'dart:async' as async;"]);
-    check(HighlightRegionType.DYNAMIC_TYPE, ['dynamicType', 'local']);
-    check(HighlightRegionType.FIELD, ['field']);
-    check(HighlightRegionType.FIELD_STATIC, ['staticField']);
-    check(HighlightRegionType.FUNCTION, ['print']);
-    check(HighlightRegionType.FUNCTION_DECLARATION, ['function']);
+    check(HighlightRegionType.DYNAMIC_PARAMETER_DECLARATION, ['dynamicType']);
+    check(HighlightRegionType.INSTANCE_FIELD_DECLARATION, ['field']);
+    check(HighlightRegionType.INSTANCE_SETTER_REFERENCE, ['field']);
+    check(HighlightRegionType.STATIC_FIELD_DECLARATION, ['staticField']);
+    check(HighlightRegionType.TOP_LEVEL_FUNCTION_REFERENCE, ['print']);
+    check(HighlightRegionType.TOP_LEVEL_FUNCTION_DECLARATION, ['function']);
     check(HighlightRegionType.FUNCTION_TYPE_ALIAS, ['functionType']);
-    check(HighlightRegionType.GETTER_DECLARATION, ['getter']);
+    check(HighlightRegionType.INSTANCE_GETTER_DECLARATION, ['getter']);
     check(HighlightRegionType.IDENTIFIER_DEFAULT, ['unresolvedIdentifier']);
     check(HighlightRegionType.IMPORT_PREFIX, ['async']);
     check(HighlightRegionType.KEYWORD, ['class', 'extends', 'true', 'return']);
@@ -133,16 +146,18 @@
     check(HighlightRegionType.LITERAL_MAP,
         ['{1.0: [].toList()}', '{2: local}', '{3: 4}']);
     check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
-    //check(HighlightRegionType.LOCAL_VARIABLE, ['local']);
-    //check(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, ['local']);
-    check(HighlightRegionType.METHOD, ['toList']);
-    check(HighlightRegionType.METHOD_DECLARATION, ['method']);
-    check(HighlightRegionType.METHOD_DECLARATION_STATIC, ['staticMethod']);
-    check(HighlightRegionType.METHOD_STATIC, ['wait']);
-    check(HighlightRegionType.PARAMETER, ['parameter']);
-    check(HighlightRegionType.SETTER_DECLARATION, ['setter']);
-    check(HighlightRegionType.TOP_LEVEL_VARIABLE,
-        ['override', 'topLevelVariable']);
+    check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_DECLARATION, ['local']);
+    check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_REFERENCE, ['local']);
+    check(HighlightRegionType.INSTANCE_METHOD_REFERENCE, ['toList']);
+    check(HighlightRegionType.INSTANCE_METHOD_DECLARATION, ['method']);
+    check(HighlightRegionType.STATIC_METHOD_DECLARATION, ['staticMethod']);
+    check(HighlightRegionType.STATIC_METHOD_REFERENCE, ['wait']);
+    check(HighlightRegionType.PARAMETER_DECLARATION, ['parameter']);
+    check(HighlightRegionType.PARAMETER_REFERENCE, ['parameter']);
+    check(HighlightRegionType.INSTANCE_SETTER_DECLARATION, ['setter']);
+    check(HighlightRegionType.TOP_LEVEL_GETTER_REFERENCE, ['override']);
+    check(HighlightRegionType.TOP_LEVEL_VARIABLE_DECLARATION,
+        ['topLevelVariable']);
     check(HighlightRegionType.TYPE_NAME_DYNAMIC, ['dynamic']);
     check(HighlightRegionType.TYPE_PARAMETER, ['TypeParameter']);
     expect(highlights, isEmpty);
@@ -157,6 +172,7 @@
 ''';
     await computeHighlights(pathname, text);
     expect(currentAnalysisErrors[pathname], hasLength(0));
+
     check(HighlightRegionType.BUILT_IN, ['implements', 'mixin', 'on']);
     check(HighlightRegionType.KEYWORD, ['class']);
   }
diff --git a/pkg/analysis_server/test/integration/analysis/test_all.dart b/pkg/analysis_server/test/integration/analysis/test_all.dart
index 2a760bf..2e463f0 100644
--- a/pkg/analysis_server/test/integration/analysis/test_all.dart
+++ b/pkg/analysis_server/test/integration/analysis/test_all.dart
@@ -13,7 +13,6 @@
 import 'get_library_dependencies_test.dart' as get_library_dependencies_test;
 import 'get_navigation_test.dart' as get_navigation_test;
 import 'get_reachable_sources_test.dart' as get_reachable_sources_test;
-import 'highlights2_test.dart' as highlights2_test;
 import 'highlights_test.dart' as highlights_test;
 import 'hint_sdk_version_async_exported_from_core_test.dart'
     as hint_sdk_version_async_exported_from_core_test;
@@ -44,7 +43,6 @@
     get_imported_elements_test.main();
     get_navigation_test.main();
     get_reachable_sources_test.main();
-    highlights2_test.main();
     highlights_test.main();
     hint_sdk_version_async_exported_from_core_test.main();
     lint_test.main();
diff --git a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
deleted file mode 100644
index b9d1af4..0000000
--- a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/src/computer/computer_highlights.dart';
-import 'package:analysis_server/src/protocol_server.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../abstract_context.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(HighlightsComputerTest);
-  });
-}
-
-@reflectiveTest
-class HighlightsComputerTest extends AbstractContextTest {
-  String sourcePath;
-  String content;
-  List<HighlightRegion> highlights;
-
-  @override
-  void setUp() {
-    super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
-  }
-
-  Future<void> test_comment() async {
-    await _computeHighlights('''
-// A trailing comment
-''');
-    _check(HighlightRegionType.COMMENT_END_OF_LINE, '// A trailing comment');
-  }
-
-  Future<void> test_comment_trailing() async {
-    await _computeHighlights('''
-class A {}
-// A trailing comment
-''');
-    _check(HighlightRegionType.COMMENT_END_OF_LINE, '// A trailing comment');
-  }
-
-  Future<void> test_extension() async {
-    await _computeHighlights('''
-extension E on String {}
-''');
-    _check(HighlightRegionType.KEYWORD, 'extension');
-    _check(HighlightRegionType.BUILT_IN, 'on');
-  }
-
-  Future<void> test_methodInvocation_ofExtensionOverride_unresolved() async {
-    await _computeHighlights('''
-extension E on int {}
-
-main() {
-  E(0).foo();
-}
-''', hasErrors: true);
-    _check(HighlightRegionType.IDENTIFIER_DEFAULT, 'foo');
-  }
-
-  void _check(HighlightRegionType expectedType, String expectedText) {
-    for (var region in highlights) {
-      if (region.type == expectedType) {
-        var startIndex = region.offset;
-        var endIndex = startIndex + region.length;
-        var highlightedText = content.substring(startIndex, endIndex);
-        if (highlightedText == expectedText) {
-          return;
-        }
-      }
-    }
-    fail('Expected region of type $expectedType with text "$expectedText"');
-  }
-
-  Future<void> _computeHighlights(
-    String content, {
-    bool hasErrors = false,
-  }) async {
-    this.content = content;
-    newFile(sourcePath, content: content);
-    var result = await session.getResolvedUnit(sourcePath);
-
-    if (hasErrors) {
-      expect(result.errors, isNotEmpty);
-    } else {
-      expect(result.errors, isEmpty);
-    }
-
-    var computer = DartUnitHighlightsComputer(result.unit);
-    highlights = computer.compute();
-  }
-}
diff --git a/pkg/analysis_server/test/src/computer/test_all.dart b/pkg/analysis_server/test/src/computer/test_all.dart
index 8d7653e..b35ad77 100644
--- a/pkg/analysis_server/test/src/computer/test_all.dart
+++ b/pkg/analysis_server/test/src/computer/test_all.dart
@@ -7,7 +7,6 @@
 import 'closing_labels_computer_test.dart' as closing_labels_computer;
 import 'folding_computer_test.dart' as folding_computer;
 import 'highlights2_computer_test.dart' as highlights2_computer;
-import 'highlights_computer_test.dart' as highlights_computer;
 import 'import_elements_computer_test.dart' as import_elements_computer;
 import 'imported_elements_computer_test.dart' as imported_elements_computer;
 import 'outline_computer_test.dart' as outline_computer;
@@ -17,7 +16,6 @@
     closing_labels_computer.main();
     folding_computer.main();
     highlights2_computer.main();
-    highlights_computer.main();
     import_elements_computer.main();
     imported_elements_computer.main();
     outline_computer.main();
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegionType.java b/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegionType.java
index 21d7fbc..2b1e1d2 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegionType.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegionType.java
@@ -32,28 +32,16 @@
   public static final String DIRECTIVE = "DIRECTIVE";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String DYNAMIC_TYPE = "DYNAMIC_TYPE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String DYNAMIC_LOCAL_VARIABLE_DECLARATION = "DYNAMIC_LOCAL_VARIABLE_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String DYNAMIC_LOCAL_VARIABLE_REFERENCE = "DYNAMIC_LOCAL_VARIABLE_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String DYNAMIC_PARAMETER_DECLARATION = "DYNAMIC_PARAMETER_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String DYNAMIC_PARAMETER_REFERENCE = "DYNAMIC_PARAMETER_REFERENCE";
 
   public static final String ENUM = "ENUM";
@@ -61,29 +49,29 @@
   public static final String ENUM_CONSTANT = "ENUM_CONSTANT";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String FIELD = "FIELD";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String FIELD_STATIC = "FIELD_STATIC";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String FUNCTION = "FUNCTION";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String FUNCTION_DECLARATION = "FUNCTION_DECLARATION";
 
   public static final String FUNCTION_TYPE_ALIAS = "FUNCTION_TYPE_ALIAS";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String GETTER_DECLARATION = "GETTER_DECLARATION";
 
@@ -91,58 +79,28 @@
 
   public static final String IMPORT_PREFIX = "IMPORT_PREFIX";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INSTANCE_FIELD_DECLARATION = "INSTANCE_FIELD_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INSTANCE_FIELD_REFERENCE = "INSTANCE_FIELD_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INSTANCE_GETTER_DECLARATION = "INSTANCE_GETTER_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INSTANCE_GETTER_REFERENCE = "INSTANCE_GETTER_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INSTANCE_METHOD_DECLARATION = "INSTANCE_METHOD_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INSTANCE_METHOD_REFERENCE = "INSTANCE_METHOD_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INSTANCE_SETTER_DECLARATION = "INSTANCE_SETTER_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INSTANCE_SETTER_REFERENCE = "INSTANCE_SETTER_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String INVALID_STRING_ESCAPE = "INVALID_STRING_ESCAPE";
 
   public static final String KEYWORD = "KEYWORD";
 
   public static final String LABEL = "LABEL";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String LIBRARY_NAME = "LIBRARY_NAME";
 
   public static final String LITERAL_BOOLEAN = "LITERAL_BOOLEAN";
@@ -157,155 +115,92 @@
 
   public static final String LITERAL_STRING = "LITERAL_STRING";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String LOCAL_FUNCTION_DECLARATION = "LOCAL_FUNCTION_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String LOCAL_FUNCTION_REFERENCE = "LOCAL_FUNCTION_REFERENCE";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String LOCAL_VARIABLE = "LOCAL_VARIABLE";
 
   public static final String LOCAL_VARIABLE_DECLARATION = "LOCAL_VARIABLE_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String LOCAL_VARIABLE_REFERENCE = "LOCAL_VARIABLE_REFERENCE";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String METHOD = "METHOD";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String METHOD_DECLARATION = "METHOD_DECLARATION";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String METHOD_DECLARATION_STATIC = "METHOD_DECLARATION_STATIC";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String METHOD_STATIC = "METHOD_STATIC";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String PARAMETER = "PARAMETER";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String SETTER_DECLARATION = "SETTER_DECLARATION";
 
   /**
-   * Only for version 1 of highlight.
+   * Deprecated - no longer sent.
    */
   public static final String TOP_LEVEL_VARIABLE = "TOP_LEVEL_VARIABLE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String PARAMETER_DECLARATION = "PARAMETER_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String PARAMETER_REFERENCE = "PARAMETER_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String STATIC_FIELD_DECLARATION = "STATIC_FIELD_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String STATIC_GETTER_DECLARATION = "STATIC_GETTER_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String STATIC_GETTER_REFERENCE = "STATIC_GETTER_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String STATIC_METHOD_DECLARATION = "STATIC_METHOD_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String STATIC_METHOD_REFERENCE = "STATIC_METHOD_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String STATIC_SETTER_DECLARATION = "STATIC_SETTER_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String STATIC_SETTER_REFERENCE = "STATIC_SETTER_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String TOP_LEVEL_FUNCTION_DECLARATION = "TOP_LEVEL_FUNCTION_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String TOP_LEVEL_FUNCTION_REFERENCE = "TOP_LEVEL_FUNCTION_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String TOP_LEVEL_GETTER_DECLARATION = "TOP_LEVEL_GETTER_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String TOP_LEVEL_GETTER_REFERENCE = "TOP_LEVEL_GETTER_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String TOP_LEVEL_SETTER_DECLARATION = "TOP_LEVEL_SETTER_DECLARATION";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String TOP_LEVEL_SETTER_REFERENCE = "TOP_LEVEL_SETTER_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String TOP_LEVEL_VARIABLE_DECLARATION = "TOP_LEVEL_VARIABLE_DECLARATION";
 
   public static final String TYPE_NAME_DYNAMIC = "TYPE_NAME_DYNAMIC";
 
   public static final String TYPE_PARAMETER = "TYPE_PARAMETER";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String UNRESOLVED_INSTANCE_MEMBER_REFERENCE = "UNRESOLVED_INSTANCE_MEMBER_REFERENCE";
 
-  /**
-   * Only for version 2 of highlight.
-   */
   public static final String VALID_STRING_ESCAPE = "VALID_STRING_ESCAPE";
 
 }
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index eb8cf23..262ca7c 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -7,7 +7,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  <version>1.30.0</version>
+  <version>1.31.0</version>
 </h1>
 <p>
   This document contains a specification of the API provided by the
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
index 25f5a64..61ada08 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -6,7 +6,7 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
-const String PROTOCOL_VERSION = '1.30.0';
+const String PROTOCOL_VERSION = '1.31.0';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
diff --git a/pkg/analyzer_plugin/doc/api.html b/pkg/analyzer_plugin/doc/api.html
index 76ba245..777a128 100644
--- a/pkg/analyzer_plugin/doc/api.html
+++ b/pkg/analyzer_plugin/doc/api.html
@@ -1354,152 +1354,47 @@
     
   <dl><dt class="value">ANNOTATION</dt><dt class="value">BUILT_IN</dt><dt class="value">CLASS</dt><dt class="value">COMMENT_BLOCK</dt><dt class="value">COMMENT_DOCUMENTATION</dt><dt class="value">COMMENT_END_OF_LINE</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">DIRECTIVE</dt><dt class="value">DYNAMIC_TYPE</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
-      </dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_DECLARATION</dt><dd>
+        <p>Deprecated - no longer sent.</p>
+      </dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_DECLARATION</dt><dt class="value">DYNAMIC_LOCAL_VARIABLE_REFERENCE</dt><dt class="value">DYNAMIC_PARAMETER_DECLARATION</dt><dt class="value">DYNAMIC_PARAMETER_REFERENCE</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dd>
         
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">DYNAMIC_PARAMETER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">DYNAMIC_PARAMETER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dd>
-        
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">FIELD_STATIC</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">FUNCTION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">FUNCTION_DECLARATION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER_DECLARATION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
-      </dd><dt class="value">IDENTIFIER_DEFAULT</dt><dt class="value">IMPORT_PREFIX</dt><dt class="value">INSTANCE_FIELD_DECLARATION</dt><dd>
+        <p>Deprecated - no longer sent.</p>
+      </dd><dt class="value">IDENTIFIER_DEFAULT</dt><dt class="value">IMPORT_PREFIX</dt><dt class="value">INSTANCE_FIELD_DECLARATION</dt><dt class="value">INSTANCE_FIELD_REFERENCE</dt><dt class="value">INSTANCE_GETTER_DECLARATION</dt><dt class="value">INSTANCE_GETTER_REFERENCE</dt><dt class="value">INSTANCE_METHOD_DECLARATION</dt><dt class="value">INSTANCE_METHOD_REFERENCE</dt><dt class="value">INSTANCE_SETTER_DECLARATION</dt><dt class="value">INSTANCE_SETTER_REFERENCE</dt><dt class="value">INVALID_STRING_ESCAPE</dt><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY_NAME</dt><dt class="value">LITERAL_BOOLEAN</dt><dt class="value">LITERAL_DOUBLE</dt><dt class="value">LITERAL_INTEGER</dt><dt class="value">LITERAL_LIST</dt><dt class="value">LITERAL_MAP</dt><dt class="value">LITERAL_STRING</dt><dt class="value">LOCAL_FUNCTION_DECLARATION</dt><dt class="value">LOCAL_FUNCTION_REFERENCE</dt><dt class="value">LOCAL_VARIABLE</dt><dd>
         
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_FIELD_REFERENCE</dt><dd>
+        <p>Deprecated - no longer sent.</p>
+      </dd><dt class="value">LOCAL_VARIABLE_DECLARATION</dt><dt class="value">LOCAL_VARIABLE_REFERENCE</dt><dt class="value">METHOD</dt><dd>
         
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_GETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_GETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_METHOD_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_METHOD_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_SETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INSTANCE_SETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">INVALID_STRING_ESCAPE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY_NAME</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">LITERAL_BOOLEAN</dt><dt class="value">LITERAL_DOUBLE</dt><dt class="value">LITERAL_INTEGER</dt><dt class="value">LITERAL_LIST</dt><dt class="value">LITERAL_MAP</dt><dt class="value">LITERAL_STRING</dt><dt class="value">LOCAL_FUNCTION_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">LOCAL_FUNCTION_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">LOCAL_VARIABLE</dt><dd>
-        
-        <p>Only for version 1 of highlight.</p>
-      </dd><dt class="value">LOCAL_VARIABLE_DECLARATION</dt><dt class="value">LOCAL_VARIABLE_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">METHOD</dt><dd>
-        
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">METHOD_DECLARATION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">METHOD_DECLARATION_STATIC</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">METHOD_STATIC</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">PARAMETER</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">SETTER_DECLARATION</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </dd><dt class="value">TOP_LEVEL_VARIABLE</dt><dd>
         
-        <p>Only for version 1 of highlight.</p>
-      </dd><dt class="value">PARAMETER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">PARAMETER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_FIELD_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_GETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_GETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_METHOD_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_METHOD_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_SETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">STATIC_SETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_FUNCTION_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_FUNCTION_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_GETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_GETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_SETTER_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_SETTER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TOP_LEVEL_VARIABLE_DECLARATION</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">TYPE_NAME_DYNAMIC</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNRESOLVED_INSTANCE_MEMBER_REFERENCE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd><dt class="value">VALID_STRING_ESCAPE</dt><dd>
-        
-        <p>Only for version 2 of highlight.</p>
-      </dd></dl></dd><dt class="typeDefinition"><a name="type_KytheEntry">KytheEntry: object</a></dt><dd>
+        <p>Deprecated - no longer sent.</p>
+      </dd><dt class="value">PARAMETER_DECLARATION</dt><dt class="value">PARAMETER_REFERENCE</dt><dt class="value">STATIC_FIELD_DECLARATION</dt><dt class="value">STATIC_GETTER_DECLARATION</dt><dt class="value">STATIC_GETTER_REFERENCE</dt><dt class="value">STATIC_METHOD_DECLARATION</dt><dt class="value">STATIC_METHOD_REFERENCE</dt><dt class="value">STATIC_SETTER_DECLARATION</dt><dt class="value">STATIC_SETTER_REFERENCE</dt><dt class="value">TOP_LEVEL_FUNCTION_DECLARATION</dt><dt class="value">TOP_LEVEL_FUNCTION_REFERENCE</dt><dt class="value">TOP_LEVEL_GETTER_DECLARATION</dt><dt class="value">TOP_LEVEL_GETTER_REFERENCE</dt><dt class="value">TOP_LEVEL_SETTER_DECLARATION</dt><dt class="value">TOP_LEVEL_SETTER_REFERENCE</dt><dt class="value">TOP_LEVEL_VARIABLE_DECLARATION</dt><dt class="value">TYPE_NAME_DYNAMIC</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNRESOLVED_INSTANCE_MEMBER_REFERENCE</dt><dt class="value">VALID_STRING_ESCAPE</dt></dl></dd><dt class="typeDefinition"><a name="type_KytheEntry">KytheEntry: object</a></dt><dd>
     <p>
       This object matches the format and documentation of the Entry object
       documented in the
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index 6e2aeae..2d0391d 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -2307,23 +2307,19 @@
   static const HighlightRegionType DIRECTIVE =
       HighlightRegionType._('DIRECTIVE');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType DYNAMIC_TYPE =
       HighlightRegionType._('DYNAMIC_TYPE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_LOCAL_VARIABLE_DECLARATION =
       HighlightRegionType._('DYNAMIC_LOCAL_VARIABLE_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_LOCAL_VARIABLE_REFERENCE =
       HighlightRegionType._('DYNAMIC_LOCAL_VARIABLE_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_PARAMETER_DECLARATION =
       HighlightRegionType._('DYNAMIC_PARAMETER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType DYNAMIC_PARAMETER_REFERENCE =
       HighlightRegionType._('DYNAMIC_PARAMETER_REFERENCE');
 
@@ -2332,24 +2328,24 @@
   static const HighlightRegionType ENUM_CONSTANT =
       HighlightRegionType._('ENUM_CONSTANT');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType FIELD = HighlightRegionType._('FIELD');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType FIELD_STATIC =
       HighlightRegionType._('FIELD_STATIC');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType FUNCTION = HighlightRegionType._('FUNCTION');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType FUNCTION_DECLARATION =
       HighlightRegionType._('FUNCTION_DECLARATION');
 
   static const HighlightRegionType FUNCTION_TYPE_ALIAS =
       HighlightRegionType._('FUNCTION_TYPE_ALIAS');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType GETTER_DECLARATION =
       HighlightRegionType._('GETTER_DECLARATION');
 
@@ -2359,39 +2355,30 @@
   static const HighlightRegionType IMPORT_PREFIX =
       HighlightRegionType._('IMPORT_PREFIX');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_FIELD_DECLARATION =
       HighlightRegionType._('INSTANCE_FIELD_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_FIELD_REFERENCE =
       HighlightRegionType._('INSTANCE_FIELD_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_GETTER_DECLARATION =
       HighlightRegionType._('INSTANCE_GETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_GETTER_REFERENCE =
       HighlightRegionType._('INSTANCE_GETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_METHOD_DECLARATION =
       HighlightRegionType._('INSTANCE_METHOD_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_METHOD_REFERENCE =
       HighlightRegionType._('INSTANCE_METHOD_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_SETTER_DECLARATION =
       HighlightRegionType._('INSTANCE_SETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INSTANCE_SETTER_REFERENCE =
       HighlightRegionType._('INSTANCE_SETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType INVALID_STRING_ESCAPE =
       HighlightRegionType._('INVALID_STRING_ESCAPE');
 
@@ -2399,7 +2386,6 @@
 
   static const HighlightRegionType LABEL = HighlightRegionType._('LABEL');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType LIBRARY_NAME =
       HighlightRegionType._('LIBRARY_NAME');
 
@@ -2421,113 +2407,94 @@
   static const HighlightRegionType LITERAL_STRING =
       HighlightRegionType._('LITERAL_STRING');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_FUNCTION_DECLARATION =
       HighlightRegionType._('LOCAL_FUNCTION_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_FUNCTION_REFERENCE =
       HighlightRegionType._('LOCAL_FUNCTION_REFERENCE');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType LOCAL_VARIABLE =
       HighlightRegionType._('LOCAL_VARIABLE');
 
   static const HighlightRegionType LOCAL_VARIABLE_DECLARATION =
       HighlightRegionType._('LOCAL_VARIABLE_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType LOCAL_VARIABLE_REFERENCE =
       HighlightRegionType._('LOCAL_VARIABLE_REFERENCE');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType METHOD = HighlightRegionType._('METHOD');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType METHOD_DECLARATION =
       HighlightRegionType._('METHOD_DECLARATION');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType METHOD_DECLARATION_STATIC =
       HighlightRegionType._('METHOD_DECLARATION_STATIC');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType METHOD_STATIC =
       HighlightRegionType._('METHOD_STATIC');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType PARAMETER =
       HighlightRegionType._('PARAMETER');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType SETTER_DECLARATION =
       HighlightRegionType._('SETTER_DECLARATION');
 
-  /// Only for version 1 of highlight.
+  /// Deprecated - no longer sent.
   static const HighlightRegionType TOP_LEVEL_VARIABLE =
       HighlightRegionType._('TOP_LEVEL_VARIABLE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType PARAMETER_DECLARATION =
       HighlightRegionType._('PARAMETER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType PARAMETER_REFERENCE =
       HighlightRegionType._('PARAMETER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_FIELD_DECLARATION =
       HighlightRegionType._('STATIC_FIELD_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_GETTER_DECLARATION =
       HighlightRegionType._('STATIC_GETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_GETTER_REFERENCE =
       HighlightRegionType._('STATIC_GETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_METHOD_DECLARATION =
       HighlightRegionType._('STATIC_METHOD_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_METHOD_REFERENCE =
       HighlightRegionType._('STATIC_METHOD_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_SETTER_DECLARATION =
       HighlightRegionType._('STATIC_SETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType STATIC_SETTER_REFERENCE =
       HighlightRegionType._('STATIC_SETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_FUNCTION_DECLARATION =
       HighlightRegionType._('TOP_LEVEL_FUNCTION_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_FUNCTION_REFERENCE =
       HighlightRegionType._('TOP_LEVEL_FUNCTION_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_GETTER_DECLARATION =
       HighlightRegionType._('TOP_LEVEL_GETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_GETTER_REFERENCE =
       HighlightRegionType._('TOP_LEVEL_GETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_SETTER_DECLARATION =
       HighlightRegionType._('TOP_LEVEL_SETTER_DECLARATION');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_SETTER_REFERENCE =
       HighlightRegionType._('TOP_LEVEL_SETTER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType TOP_LEVEL_VARIABLE_DECLARATION =
       HighlightRegionType._('TOP_LEVEL_VARIABLE_DECLARATION');
 
@@ -2537,11 +2504,9 @@
   static const HighlightRegionType TYPE_PARAMETER =
       HighlightRegionType._('TYPE_PARAMETER');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType UNRESOLVED_INSTANCE_MEMBER_REFERENCE =
       HighlightRegionType._('UNRESOLVED_INSTANCE_MEMBER_REFERENCE');
 
-  /// Only for version 2 of highlight.
   static const HighlightRegionType VALID_STRING_ESCAPE =
       HighlightRegionType._('VALID_STRING_ESCAPE');
 
diff --git a/pkg/analyzer_plugin/tool/spec/common_types_spec.html b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
index f4acea4..b14bca8 100644
--- a/pkg/analyzer_plugin/tool/spec/common_types_spec.html
+++ b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
@@ -6,7 +6,7 @@
 </head>
 <body>
 <h1>Common Types</h1>
-<version>1.3.0</version>
+<version>1.4.0</version>
 <p>
   This document contains a specification of the types that are common between
   the analysis server wire protocol and the analysis server plugin wire
@@ -645,90 +645,76 @@
       <value><code>DIRECTIVE</code></value>
       <value>
         <code>DYNAMIC_TYPE</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>DYNAMIC_LOCAL_VARIABLE_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>DYNAMIC_LOCAL_VARIABLE_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>DYNAMIC_PARAMETER_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>DYNAMIC_PARAMETER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value><code>ENUM</code></value>
       <value><code>ENUM_CONSTANT</code></value>
       <value>
         <code>FIELD</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>FIELD_STATIC</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>FUNCTION</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>FUNCTION_DECLARATION</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value><code>FUNCTION_TYPE_ALIAS</code></value>
       <value>
         <code>GETTER_DECLARATION</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value><code>IDENTIFIER_DEFAULT</code></value>
       <value><code>IMPORT_PREFIX</code></value>
       <value>
         <code>INSTANCE_FIELD_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>INSTANCE_FIELD_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>INSTANCE_GETTER_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>INSTANCE_GETTER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>INSTANCE_METHOD_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>INSTANCE_METHOD_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>INSTANCE_SETTER_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>INSTANCE_SETTER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>INVALID_STRING_ESCAPE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value><code>KEYWORD</code></value>
       <value><code>LABEL</code></value>
       <value>
         <code>LIBRARY_NAME</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value><code>LITERAL_BOOLEAN</code></value>
       <value><code>LITERAL_DOUBLE</code></value>
@@ -738,122 +724,101 @@
       <value><code>LITERAL_STRING</code></value>
       <value>
         <code>LOCAL_FUNCTION_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>LOCAL_FUNCTION_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>LOCAL_VARIABLE</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value><code>LOCAL_VARIABLE_DECLARATION</code></value>
       <value>
         <code>LOCAL_VARIABLE_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>METHOD</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>METHOD_DECLARATION</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>METHOD_DECLARATION_STATIC</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>METHOD_STATIC</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>PARAMETER</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>SETTER_DECLARATION</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>TOP_LEVEL_VARIABLE</code>
-        <p>Only for version 1 of highlight.</p>
+        <p>Deprecated - no longer sent.</p>
       </value>
       <value>
         <code>PARAMETER_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>PARAMETER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>STATIC_FIELD_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>STATIC_GETTER_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>STATIC_GETTER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>STATIC_METHOD_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>STATIC_METHOD_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>STATIC_SETTER_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>STATIC_SETTER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>TOP_LEVEL_FUNCTION_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>TOP_LEVEL_FUNCTION_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>TOP_LEVEL_GETTER_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>TOP_LEVEL_GETTER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>TOP_LEVEL_SETTER_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>TOP_LEVEL_SETTER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>TOP_LEVEL_VARIABLE_DECLARATION</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value><code>TYPE_NAME_DYNAMIC</code></value>
       <value><code>TYPE_PARAMETER</code></value>
       <value>
         <code>UNRESOLVED_INSTANCE_MEMBER_REFERENCE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
       <value>
         <code>VALID_STRING_ESCAPE</code>
-        <p>Only for version 2 of highlight.</p>
       </value>
     </enum>
   </type>
