diff --git a/DEPS b/DEPS
index c7ffc18..402eae5 100644
--- a/DEPS
+++ b/DEPS
@@ -172,7 +172,7 @@
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_rev": "6448ce532445a8a458fa191d9346df071ae0acad",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
-  "webdev_rev": "50fe70a3137d9665fbe94cd34af5277b65d95079",
+  "webdev_rev": "832b096c0c24798d3df46faa7b7661fe930573c2",
   "webkit_inspection_protocol_rev": "dd6fb5d8b536e19cedb384d0bbf1f5631923f1e8",
   "yaml_rev": "b4c4411631bda556ce9a45af1ab0eecaf9f3ac53",
   "zlib_rev": "bf44340d1b6be1af8950bbdf664fec0cf5a831cc",
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index fb9d441..94e46a7 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -300,20 +300,6 @@
   }
 }
 
-mixin WithNonFunctionTypeAliasesMixin on AbstractContextTest {
-  @override
-  String? get testPackageLanguageVersion => null;
-
-  @override
-  void setUp() {
-    super.setUp();
-
-    createAnalysisOptionsFile(
-      experiments: [EnableString.nonfunction_type_aliases],
-    );
-  }
-}
-
 mixin WithNullSafetyMixin on AbstractContextTest {
   @override
   String get testPackageLanguageVersion => '2.12';
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index 2f7ae488..85c36ff 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -9,7 +9,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../abstract_context.dart';
 import '../abstract_single_unit.dart';
 
 void main() {
@@ -74,8 +73,7 @@
 }
 
 @reflectiveTest
-class ConvertElementTest extends AbstractSingleUnitTest
-    with WithNonFunctionTypeAliasesMixin {
+class ConvertElementTest extends AbstractSingleUnitTest {
   Future<void> test_CLASS() async {
     await resolveTestCode('''
 @deprecated
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 546faf8..55a731a 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -63,8 +63,7 @@
   }
 }
 
-abstract class _BaseDartCompletionContributorTest extends AbstractContextTest
-    with WithNonFunctionTypeAliasesMixin {
+abstract class _BaseDartCompletionContributorTest extends AbstractContextTest {
   static const String _UNCHECKED = '__UNCHECKED__';
   late String testFile;
   int _completionOffset = -1;
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
index 1ab4b27..4fa30e3 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
@@ -12,7 +12,6 @@
     show RefactoringProblemSeverity, SourceChange, SourceEdit;
 import 'package:test/test.dart';
 
-import '../../abstract_context.dart';
 import '../../abstract_single_unit.dart';
 
 int findIdentifierLength(String search) {
@@ -30,8 +29,7 @@
 }
 
 /// The base class for all [Refactoring] tests.
-abstract class RefactoringTest extends AbstractSingleUnitTest
-    with WithNonFunctionTypeAliasesMixin {
+abstract class RefactoringTest extends AbstractSingleUnitTest {
   late SearchEngine searchEngine;
 
   late SourceChange refactoringChange;
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 512db98..10cb93c 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -441,7 +441,7 @@
 
 @reflectiveTest
 class SearchEngineImplWithNonFunctionTypeAliasesTest
-    extends SearchEngineImplTest with WithNonFunctionTypeAliasesMixin {
+    extends SearchEngineImplTest {
   Future<void> test_searchReferences_typeAlias_interfaceType() async {
     await resolveTestCode('''
 typedef A<T> = Map<T, String>;
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index a005ff2..185338f 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -17,8 +17,7 @@
   });
 }
 
-class AbstractOutlineComputerTest extends AbstractContextTest
-    with WithNonFunctionTypeAliasesMixin {
+class AbstractOutlineComputerTest extends AbstractContextTest {
   late String testPath;
   late String testCode;
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
index fd2fea7..2d663fc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -17,8 +16,7 @@
 }
 
 @reflectiveTest
-class CreateFunctionTest extends FixProcessorTest
-    with WithNonFunctionTypeAliasesMixin {
+class CreateFunctionTest extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.CREATE_FUNCTION;
 
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index d315c84..1b7a17f 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -141,7 +141,6 @@
   CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
   CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
   CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
-  CompileTimeErrorCode.CONSTRUCTOR_TEAROFFS_NOT_ENABLED,
   CompileTimeErrorCode.CONTINUE_LABEL_ON_SWITCH,
   CompileTimeErrorCode.COULD_NOT_INFER,
   CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR,
@@ -594,6 +593,7 @@
   HintCode.SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT,
   HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE,
   HintCode.SDK_VERSION_BOOL_OPERATOR_IN_CONST_CONTEXT,
+  HintCode.SDK_VERSION_CONSTRUCTOR_TEAROFFS,
   HintCode.SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT,
   HintCode.SDK_VERSION_EXTENSION_METHODS,
   HintCode.SDK_VERSION_GT_GT_GT_OPERATOR,
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index afaad1f..24533f2 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -96,37 +96,6 @@
       correction: "Replace the '.' with a '?.' in the invocation.");
 
   /**
-   * Generate a hint for method, property or function annotated with
-   * `@useResult` whose invocation is unchecked.
-   *
-   * Parameters:
-   * 0: the name of the annotated method, property or function
-   */
-  static const HintCode UNUSED_RESULT = HintCode(
-      'UNUSED_RESULT', "'{0}' should be used.",
-      correction:
-          "Try using the result by invoking a member, passing it to a function, or returning it from this function.",
-      hasPublishedDocs: false);
-
-  /**
-   * Generate a hint for method, property or function annotated with
-   * `@useResult` whose invocation is unchecked.
-   *
-   * Parameters:
-   * 0: the name of the annotated method, property or function
-   * 1: message details
-   */
-  static const HintCode UNUSED_RESULT_WITH_MESSAGE = HintCode(
-    'UNUSED_RESULT',
-    "'{0}' should be used. {1}.",
-    // todo(pq): consider passing in correction details: https://github.com/dart-lang/sdk/issues/46066
-    correction:
-        "Try using the result by invoking a member, passing it to a function, or returning it from this function.",
-    hasPublishedDocs: false,
-    uniqueName: 'HintCode.UNUSED_RESULT_WITH_MESSAGE',
-  );
-
-  /**
    * Dead code is code that is never reached, this can happen for instance if a
    * statement follows a return statement.
    *
@@ -2245,6 +2214,25 @@
       hasPublishedDocs: true);
 
   /**
+   * A constructor cannot be torn off without the 'constructor-tearoffs'
+   * language feature.
+   *
+   * There is also a [ParserError.EXPERIMENT_NOT_ENABLED] code which catches
+   * some cases of constructor tearoff features (like `List<int>.filled;`).
+   * Other constructor tearoff cases are not realized until resolution
+   * (like `List.filled;`).
+   */
+  static const HintCode SDK_VERSION_CONSTRUCTOR_TEAROFFS = HintCode(
+      'SDK_VERSION_CONSTRUCTOR_TEAROFFS',
+      "Tearing off a constructor requires the 'constructor-tearoffs' "
+          "language feature.",
+      // TODO(srawlins): Update this text to something like "Try updating
+      // your pubspec.yaml to set the minimum SDK constraint to 2.14 or
+      // higher, and running 'pub get'."
+      correction: "Try enabling the experiment by including "
+          "'--enable-experiments=constructor-tearoffs' in the 'dart' command.");
+
+  /**
    * No parameters.
    */
   // #### Description
@@ -3474,6 +3462,43 @@
       hasPublishedDocs: true);
 
   /**
+   * The result of invoking a method, property, or function annotated with
+   * `@useResult` must be used (assigned, passed to a function as an argument,
+   * or returned by a function).
+   *
+   * Parameters:
+   * 0: the name of the annotated method, property or function
+   */
+  static const HintCode UNUSED_RESULT = HintCode(
+    'UNUSED_RESULT',
+    "'{0}' should be used.",
+    correction: "Try using the result by invoking a member, passing it to a "
+        "function, or returning it from this function.",
+    hasPublishedDocs: false,
+  );
+
+  /**
+   * The result of invoking a method, property, or function annotated with
+   * `@useResult` must be used (assigned, passed to a function as an argument,
+   * or returned by a function).
+   *
+   * Parameters:
+   * 0: the name of the annotated method, property or function
+   * 1: message details
+   */
+  static const HintCode UNUSED_RESULT_WITH_MESSAGE = HintCode(
+    'UNUSED_RESULT',
+    "'{0}' should be used. {1}.",
+    // todo(pq): consider passing in correction details:
+    // https://github.com/dart-lang/sdk/issues/46066
+    correction:
+        "Try using the result by invoking a member, passing it to a function, "
+        "or returning it from this function.",
+    hasPublishedDocs: false,
+    uniqueName: 'HintCode.UNUSED_RESULT_WITH_MESSAGE',
+  );
+
+  /**
    * Parameters:
    * 0: the name that is shown but not used
    */
diff --git a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
index ce1fd84..ac1868d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
@@ -22,7 +22,7 @@
       // Only report this if [node] has no explicit type arguments; otherwise
       // the parser has already reported an error.
       _resolver.errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.CONSTRUCTOR_TEAROFFS_NOT_ENABLED, node, []);
+          HintCode.SDK_VERSION_CONSTRUCTOR_TEAROFFS, node, []);
     }
     node.constructorName.accept(_resolver);
     _inferArgumentTypes(node);
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index dce95dc..cadf3c7 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -2263,23 +2263,6 @@
               "IntegerDivisionByZeroException.");
 
   /**
-   * A constructor cannot be torn off without the 'constructor-tearoffs'
-   * language feature.
-   *
-   * There is also a [ParserError.EXPERIMENT_NOT_ENABLED] code which catches
-   * some cases of constructor tearoff features (like `List<int>.filled;`).
-   * Other constructor tearoff cases are not realized until resolution
-   * (like `List.filled;`).
-   */
-  static const CompileTimeErrorCode CONSTRUCTOR_TEAROFFS_NOT_ENABLED =
-      CompileTimeErrorCode(
-          'CONSTRUCTOR_TEAROFFS_NOT_ENABLED',
-          "Tearing off a constructor requires the 'constructor-tearoffs' "
-              "language feature.",
-          correction: "Try updating your pubspec.yaml to set the minimum SDK "
-              "constraint to 2.14 or higher, and running 'pub get'.");
-
-  /**
    * 16.12.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2,
    * where e, e1 and e2 are constant expressions that evaluate to a boolean
    * value.
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index f698b3d7..873ca31 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -23,7 +23,6 @@
         messageInvalidInitializer,
         messageInvalidSuperInInitializer,
         messageInvalidThisInInitializer,
-        messageMetadataTypeArguments,
         messageMissingAssignableSelector,
         messageNativeClauseShouldBeAnnotation,
         messageOperatorWithTypeParameters,
@@ -1867,8 +1866,15 @@
     var typeArguments = pop() as TypeArgumentList?;
     if (typeArguments != null &&
         !_featureSet.isEnabled(Feature.generic_metadata)) {
-      handleRecoverableError(messageMetadataTypeArguments,
-          typeArguments.beginToken, typeArguments.beginToken);
+      var feature = Feature.generic_metadata;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(feature.releaseVersion!),
+        ),
+        typeArguments.beginToken,
+        typeArguments.beginToken,
+      );
     }
     var name = pop() as Identifier;
     push(ast.annotation(
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index b41a15b..00cf9f8 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -87,6 +87,8 @@
         return _readFunctionExpression();
       case Tag.FunctionExpressionInvocation:
         return _readFunctionExpressionInvocation();
+      case Tag.FunctionReference:
+        return _readFunctionReference();
       case Tag.FunctionTypedFormalParameter:
         return _readFunctionTypedFormalParameter();
       case Tag.GenericFunctionType:
@@ -568,6 +570,19 @@
     return node;
   }
 
+  FunctionReference _readFunctionReference() {
+    var function = readNode() as Expression;
+    var typeArguments = _readOptionalNode() as TypeArgumentList?;
+
+    var node = astFactory.functionReference(
+      function: function,
+      typeArguments: typeArguments,
+    );
+    node.typeArgumentTypes = _reader.readOptionalTypeList();
+    _readExpressionResolution(node);
+    return node;
+  }
+
   FunctionTypedFormalParameter _readFunctionTypedFormalParameter() {
     var typeParameters = _readOptionalNode() as TypeParameterList?;
     var returnType = _readOptionalNode() as TypeAnnotation?;
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart b/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
index 8e4b91c..91f911c 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
@@ -50,6 +50,7 @@
   static const int FunctionDeclaration_setter = 58;
   static const int FunctionExpressionStub = 19;
   static const int FunctionExpressionInvocation = 93;
+  static const int FunctionReference = 103;
   static const int FunctionTypedFormalParameter = 20;
   static const int GenericFunctionType = 21;
   static const int HideCombinator = 48;
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index c867be4..7f49c50 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -313,6 +313,15 @@
   }
 
   @override
+  void visitFunctionReference(FunctionReference node) {
+    _writeByte(Tag.FunctionReference);
+    _writeNode(node.function);
+    _writeOptionalNode(node.typeArguments);
+    _sink.writeOptionalTypeList(node.typeArgumentTypes);
+    _storeExpression(node);
+  }
+
+  @override
   void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     _writeByte(Tag.FunctionTypedFormalParameter);
 
diff --git a/pkg/analyzer/test/generated/generic_metadata_parser_test.dart b/pkg/analyzer/test/generated/generic_metadata_parser_test.dart
index d3ff54e..05e1c6d 100644
--- a/pkg/analyzer/test/generated/generic_metadata_parser_test.dart
+++ b/pkg/analyzer/test/generated/generic_metadata_parser_test.dart
@@ -49,8 +49,8 @@
 mixin GenericMetadataParserTest on FastaParserTestCase {
   void test_className_prefixed_constructorName_absent() {
     var compilationUnit = _parseCompilationUnit('@p.A<B>() class C {}',
-        disabledError: expectedError(
-            ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS, 4, 1));
+        disabledError:
+            expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 4, 1));
     var classDeclaration =
         compilationUnit.declarations.single as ClassDeclaration;
     var annotation = classDeclaration.metadata.single;
@@ -65,8 +65,8 @@
 
   void test_className_prefixed_constructorName_present() {
     var compilationUnit = _parseCompilationUnit('@p.A<B>.ctor() class C {}',
-        disabledError: expectedError(
-            ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS, 4, 1));
+        disabledError:
+            expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 4, 1));
     var classDeclaration =
         compilationUnit.declarations.single as ClassDeclaration;
     var annotation = classDeclaration.metadata.single;
@@ -81,8 +81,8 @@
 
   void test_className_unprefixed_constructorName_absent() {
     var compilationUnit = _parseCompilationUnit('@A<B>() class C {}',
-        disabledError: expectedError(
-            ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS, 2, 1));
+        disabledError:
+            expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 2, 1));
     var classDeclaration =
         compilationUnit.declarations.single as ClassDeclaration;
     var annotation = classDeclaration.metadata.single;
@@ -96,8 +96,8 @@
 
   void test_className_unprefixed_constructorName_present() {
     var compilationUnit = _parseCompilationUnit('@A<B>.ctor() class C {}',
-        disabledError: expectedError(
-            ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS, 2, 1));
+        disabledError:
+            expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 2, 1));
     var classDeclaration =
         compilationUnit.declarations.single as ClassDeclaration;
     var annotation = classDeclaration.metadata.single;
@@ -117,8 +117,8 @@
               6,
               1),
         ],
-        disabledError: expectedError(
-            ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS, 4, 1));
+        disabledError:
+            expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 4, 1));
     var classDeclaration =
         compilationUnit.declarations.single as ClassDeclaration;
     var annotation = classDeclaration.metadata.single;
@@ -139,8 +139,8 @@
               4,
               1),
         ],
-        disabledError: expectedError(
-            ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS, 2, 1));
+        disabledError:
+            expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 2, 1));
     var classDeclaration =
         compilationUnit.declarations.single as ClassDeclaration;
     var annotation = classDeclaration.metadata.single;
@@ -174,8 +174,8 @@
           expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 7, 1),
           expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 15, 5),
         ],
-        disabledError: expectedError(
-            ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS, 2, 1));
+        disabledError:
+            expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 2, 1));
   }
 
   CompilationUnit _parseCompilationUnit(String content,
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 367f7ef..9da6792 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
@@ -788,23 +787,6 @@
   }
 
   test_binaryExpression_gtGtGt() async {
-    var latestLanguageVersionStr = '${ExperimentStatus.currentVersion.major}.'
-        '${ExperimentStatus.currentVersion.minor}';
-
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: latestLanguageVersionStr,
-    );
-
-    writeTestPackageAnalysisOptionsFile(
-      AnalysisOptionsFileConfig(
-        experiments: [
-          EnableString.non_nullable,
-          EnableString.triple_shift,
-        ],
-      ),
-    );
-
     await resolveTestCode('''
 class A {
   A operator >>>(int amount) => this;
diff --git a/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
index 0c94b3c..21b86f7 100644
--- a/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constructor_reference_test.dart
@@ -584,7 +584,7 @@
   A.foo;
 }
 ''', [
-      error(CompileTimeErrorCode.CONSTRUCTOR_TEAROFFS_NOT_ENABLED, 39, 5),
+      error(HintCode.SDK_VERSION_CONSTRUCTOR_TEAROFFS, 39, 5),
     ]);
 
     var classElement = findElement.class_('A');
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 1b5b4f4..db0e26c 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -251,9 +251,6 @@
   List<String> get collectionIncludedPaths => [workspaceRootPath];
 
   List<String> get experiments => [
-        EnableString.generic_metadata,
-        EnableString.nonfunction_type_aliases,
-        EnableString.triple_shift,
         EnableString.constructor_tearoffs,
       ];
 
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index fd4210e..9b9051e 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -693,6 +693,19 @@
   }
 
   @override
+  void visitFunctionReference(FunctionReference node) {
+    _writeln('FunctionReference');
+    _withIndent(() {
+      var properties = _Properties();
+      properties.addNode('function', node.function);
+      properties.addNode('typeArguments', node.typeArguments);
+      properties.addTypeList('typeArgumentTypes', node.typeArgumentTypes!);
+      _addExpression(properties, node);
+      _writeProperties(properties);
+    });
+  }
+
+  @override
   void visitFunctionTypeAlias(FunctionTypeAlias node) {
     _writeNextCodeLine(node);
     _writeln('FunctionTypeAlias');
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index c18ab0cf..d85eb96 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -151,7 +151,7 @@
   }
 
   void setUp() {
-    featureSet = FeatureSets.nullSafe;
+    featureSet = FeatureSets.latestWithExperiments;
   }
 
   void _addLibraryUnits(
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index ebf403c..9ea82b2 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -81,29 +81,21 @@
 }
 
 class FeatureSets {
-  static final FeatureSet beforeNullSafe = FeatureSet.fromEnableFlags2(
+  static final FeatureSet language_2_9 = FeatureSet.fromEnableFlags2(
     sdkLanguageVersion: Version.parse('2.9.0'),
     flags: [],
   );
 
-  static final FeatureSet nullSafe = FeatureSet.fromEnableFlags2(
+  static final FeatureSet language_2_12 = FeatureSet.fromEnableFlags2(
     sdkLanguageVersion: Version.parse('2.12.0'),
     flags: [],
   );
 
-  static final FeatureSet nonFunctionTypeAliases = FeatureSet.fromEnableFlags2(
-    sdkLanguageVersion: Version.parse('2.12.0'),
-    flags: [EnableString.nonfunction_type_aliases],
-  );
-
-  static final FeatureSet genericMetadata = FeatureSet.fromEnableFlags2(
-    sdkLanguageVersion: Version.parse('2.13.0'),
-    flags: [EnableString.generic_metadata],
-  );
-
-  static final FeatureSet constructorTearOffs = FeatureSet.fromEnableFlags2(
+  static final FeatureSet latestWithExperiments = FeatureSet.fromEnableFlags2(
     sdkLanguageVersion: Version.parse('2.15.0'),
-    flags: [EnableString.constructor_tearoffs],
+    flags: [
+      EnableString.constructor_tearoffs,
+    ],
   );
 }
 
@@ -2623,17 +2615,17 @@
       notSimplyBounded class C @6
         typeParameters
           covariant T @8
-            bound: dynamic Function()
-            defaultType: dynamic Function()
+            bound: dynamic
+            defaultType: dynamic
         constructors
           synthetic @-1
     typeAliases
       functionTypeAliasBased notSimplyBounded F @32
-        aliasedType: dynamic Function(C<dynamic Function()>)
+        aliasedType: dynamic Function(C<dynamic>)
         aliasedElement: GenericFunctionTypeElement
           parameters
             requiredPositional value @36
-              type: C<dynamic Function()>
+              type: C<dynamic>
           returnType: dynamic
 ''');
   }
@@ -2696,7 +2688,7 @@
       notSimplyBounded C @8
         typeParameters
           unrelated T @10
-            bound: dynamic Function()
+            bound: dynamic
             defaultType: dynamic
         aliasedType: void Function()
         aliasedElement: GenericFunctionTypeElement
@@ -2704,7 +2696,7 @@
       notSimplyBounded D @50
         typeParameters
           unrelated T @52
-            bound: dynamic Function()
+            bound: dynamic
             defaultType: dynamic
         aliasedType: void Function()
         aliasedElement: GenericFunctionTypeElement
@@ -2713,7 +2705,6 @@
   }
 
   test_class_notSimplyBounded_complex_by_cycle_typedef_interfaceType() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary('''
 typedef C<T extends D> = List<T>;
 typedef D<T extends C> = List<T>;
@@ -2835,7 +2826,7 @@
   }
 
   test_class_notSimplyBounded_function_typed_bound_complex_via_parameter_type_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 class C<T extends void Function(T)> {}
 ''');
@@ -2905,24 +2896,24 @@
       notSimplyBounded class C @6
         typeParameters
           covariant T @8
-            bound: dynamic Function()
-            defaultType: dynamic Function()
+            bound: dynamic
+            defaultType: dynamic
         constructors
           synthetic @-1
     typeAliases
       functionTypeAliasBased notSimplyBounded F @32
-        aliasedType: dynamic Function(dynamic Function())
+        aliasedType: dynamic Function(dynamic)
         aliasedElement: GenericFunctionTypeElement
           parameters
             requiredPositional value @36
-              type: dynamic Function()
+              type: dynamic
           returnType: dynamic
       functionTypeAliasBased notSimplyBounded G @52
-        aliasedType: dynamic Function(dynamic Function())
+        aliasedType: dynamic Function(dynamic)
         aliasedElement: GenericFunctionTypeElement
           parameters
             requiredPositional value @56
-              type: dynamic Function()
+              type: dynamic
           returnType: dynamic
 ''');
   }
@@ -3058,7 +3049,7 @@
   }
 
   test_class_ref_nullability_star() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 class C {}
 C c;
@@ -3546,7 +3537,6 @@
   }
 
   test_class_typeParameters_defaultType_cycle_genericFunctionType2() async {
-    featureSet = FeatureSets.genericMetadata;
     var library = await checkLibrary(r'''
 class C<T extends void Function<U extends C>()> {}
 ''');
@@ -3565,7 +3555,7 @@
   }
 
   test_class_typeParameters_defaultType_functionTypeAlias_contravariant_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary(r'''
 typedef F<X> = void Function(X);
 
@@ -3748,7 +3738,7 @@
   }
 
   test_class_typeParameters_defaultType_genericFunctionType_both_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary(r'''
 class A<X extends X Function(X)> {}
 ''');
@@ -3785,7 +3775,7 @@
   }
 
   test_class_typeParameters_defaultType_genericFunctionType_contravariant_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary(r'''
 class A<X extends void Function(X)> {}
 ''');
@@ -3858,7 +3848,6 @@
   }
 
   test_class_typeParameters_defaultType_typeAlias_interface_contravariant() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<X> = List<void Function(X)>;
 
@@ -3891,7 +3880,6 @@
   }
 
   test_class_typeParameters_defaultType_typeAlias_interface_covariant() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<X> = Map<X, int>;
 
@@ -6005,7 +5993,7 @@
   }
 
   test_compilationUnit_nnbd_disabled_via_feature_set() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('');
     expect(library.isNonNullableByDefault, isFalse);
   }
@@ -6312,7 +6300,6 @@
   }
 
   test_const_constructorReference() async {
-    featureSet = FeatureSets.constructorTearOffs;
     var library = await checkLibrary(r'''
 class A {
   A.named();
@@ -6380,6 +6367,50 @@
 ''');
   }
 
+  test_const_functionReference() async {
+    var library = await checkLibrary(r'''
+void f<T>(T a) {}
+const v = f<int>;
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    topLevelVariables
+      static const v @24
+        type: void Function(int)
+        constantInitializer
+          FunctionReference
+            function: SimpleIdentifier
+              staticElement: self::@function::f
+              staticType: void Function<T>(T)
+              token: f @28
+            staticType: void Function(int)
+            typeArgumentTypes
+              int
+            typeArguments: TypeArgumentList
+              arguments
+                TypeName
+                  name: SimpleIdentifier
+                    staticElement: dart:core::@class::int
+                    staticType: null
+                    token: int @30
+                  type: int
+              leftBracket: < @29
+              rightBracket: > @33
+    accessors
+      synthetic static get v @-1
+        returnType: void Function(int)
+    functions
+      f @5
+        typeParameters
+          covariant T @7
+        parameters
+          requiredPositional a @12
+            type: T
+        returnType: void
+''');
+  }
+
   test_const_indexExpression() async {
     var library = await checkLibrary(r'''
 const a = [0];
@@ -11140,7 +11171,7 @@
   }
 
   test_const_topLevel_throw_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary(r'''
 const c = throw 42;
 ''');
@@ -11804,7 +11835,6 @@
   }
 
   test_const_typeLiteral() async {
-    featureSet = FeatureSets.constructorTearOffs;
     var library = await checkLibrary(r'''
 const v = List<int>;
 ''');
@@ -12786,7 +12816,6 @@
   }
 
   test_constructor_redirected_factory_named_generic_viaTypeAlias() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary('''
 typedef A<T, U> = C<T, U>;
 class B<T, U> {
@@ -13086,7 +13115,6 @@
   }
 
   test_constructor_redirected_factory_unnamed_generic_viaTypeAlias() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary('''
 typedef A<T, U> = C<T, U>;
 class B<T, U> {
@@ -13203,7 +13231,6 @@
   }
 
   test_constructor_redirected_factory_unnamed_imported_viaTypeAlias() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     addLibrarySource('/foo.dart', '''
 import 'test.dart';
 typedef A = B;
@@ -13302,7 +13329,6 @@
   }
 
   test_constructor_redirected_factory_unnamed_prefixed_viaTypeAlias() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     addLibrarySource('/foo.dart', '''
 import 'test.dart';
 typedef A = B;
@@ -13353,7 +13379,6 @@
   }
 
   test_constructor_redirected_factory_unnamed_viaTypeAlias() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary('''
 typedef A = C;
 class B {
@@ -13701,7 +13726,7 @@
   }
 
   test_defaultValue_eliminateTypeParameters_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 class A<T> {
   const X({List<T> a = const []});
@@ -13890,7 +13915,7 @@
   }
 
   test_defaultValue_methodMember_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 void f([Comparator<T> compare = Comparable.compare]) {}
 ''');
@@ -14118,7 +14143,7 @@
   }
 
   test_defaultValue_refersToGenericClass_constructor2_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 abstract class A<T> {}
 class B<T> implements A<T> {
@@ -14178,7 +14203,7 @@
   }
 
   test_defaultValue_refersToGenericClass_constructor_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 class B<T> {
   const B();
@@ -17250,7 +17275,7 @@
   }
 
   test_generic_function_type_nullability_star() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 void Function() f;
 ''');
@@ -17440,7 +17465,7 @@
             atSign: @ @29
             element: ConstructorMember
               base: self::@class::A::@constructor::•
-              substitution: {T: dynamic}
+              substitution: {T: int Function(String)}
             name: SimpleIdentifier
               staticElement: self::@class::A
               staticType: null
@@ -17516,7 +17541,7 @@
             atSign: @ @29
             element: ConstructorMember
               base: self::@class::A::@constructor::•
-              substitution: {T: dynamic}
+              substitution: {T: int Function(String)}
             name: SimpleIdentifier
               staticElement: self::@class::A
               staticType: null
@@ -18037,13 +18062,13 @@
       notSimplyBounded F @8
         typeParameters
           unrelated X @10
-            bound: dynamic Function()
+            bound: dynamic
             defaultType: dynamic
-        aliasedType: dynamic Function(dynamic Function())
+        aliasedType: dynamic Function(dynamic)
         aliasedElement: GenericFunctionTypeElement
           parameters
             requiredPositional @-1
-              type: dynamic Function()
+              type: dynamic
           returnType: dynamic
 ''');
   }
@@ -20209,7 +20234,7 @@
   }
 
   test_instanceInference_operator_equal_legacy_from_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     addLibrarySource('/legacy.dart', r'''
 // @dart = 2.7
 class LegacyDefault {
@@ -20511,7 +20536,7 @@
   }
 
   test_instantiateToBounds_boundRefersToItself_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 class C<T extends C<T>> {}
 C c;
@@ -22281,7 +22306,6 @@
   }
 
   test_metadata_constructor_call_named_generic_inference() async {
-    featureSet = FeatureSets.genericMetadata;
     var library = await checkLibrary('''
 class A<T> {
   const A.named(T _);
@@ -22341,7 +22365,6 @@
   }
 
   test_metadata_constructor_call_named_generic_typeArguments() async {
-    featureSet = FeatureSets.genericMetadata;
     var library = await checkLibrary('''
 class A<T> {
   const A.named();
@@ -22428,12 +22451,12 @@
             constructorName: SimpleIdentifier
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::named
-                substitution: {T: dynamic}
+                substitution: {T: int}
               staticType: null
               token: named @43
             element: ConstructorMember
               base: self::@class::A::@constructor::named
-              substitution: {T: dynamic}
+              substitution: {T: int}
             name: SimpleIdentifier
               staticElement: self::@class::A
               staticType: null
@@ -22505,7 +22528,6 @@
   }
 
   test_metadata_constructor_call_named_prefixed_generic_inference() async {
-    featureSet = FeatureSets.genericMetadata;
     addLibrarySource('/home/test/lib/foo.dart', '''
 class A<T> {
   const A.named(T _);
@@ -22561,7 +22583,6 @@
   }
 
   test_metadata_constructor_call_named_prefixed_generic_typeArguments() async {
-    featureSet = FeatureSets.genericMetadata;
     addLibrarySource('/home/test/lib/foo.dart', '''
 class A<T> {
   const A.named();
@@ -22743,7 +22764,6 @@
   }
 
   test_metadata_constructor_call_unnamed_generic_inference() async {
-    featureSet = FeatureSets.genericMetadata;
     var library = await checkLibrary('''
 class A<T> {
   const A(T _);
@@ -22789,7 +22809,6 @@
   }
 
   test_metadata_constructor_call_unnamed_generic_typeArguments() async {
-    featureSet = FeatureSets.genericMetadata;
     var library = await checkLibrary('''
 class A<T> {
   const A();
@@ -22878,7 +22897,6 @@
   }
 
   test_metadata_constructor_call_unnamed_prefixed_generic_inference() async {
-    featureSet = FeatureSets.genericMetadata;
     addLibrarySource('/home/test/lib/foo.dart', '''
 class A<T> {
   const A(T _);
@@ -22928,7 +22946,6 @@
   }
 
   test_metadata_constructor_call_unnamed_prefixed_generic_typeArguments() async {
-    featureSet = FeatureSets.genericMetadata;
     addLibrarySource('/home/test/lib/foo.dart', '''
 class A<T> {
   const A();
@@ -26463,7 +26480,7 @@
   }
 
   test_mixin_inference_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary(r'''
 class A<T> {}
 mixin M<U> on A<U> {}
@@ -27249,13 +27266,13 @@
   definingUnit
     typeAliases
       notSimplyBounded F @8
-        aliasedType: dynamic Function() Function()
+        aliasedType: dynamic Function()
         aliasedElement: GenericFunctionTypeElement
-          returnType: dynamic Function()
+          returnType: dynamic
       notSimplyBounded G @34
-        aliasedType: dynamic Function() Function()
+        aliasedType: dynamic Function()
         aliasedElement: GenericFunctionTypeElement
-          returnType: dynamic Function()
+          returnType: dynamic
 ''');
   }
 
@@ -27268,9 +27285,9 @@
   definingUnit
     typeAliases
       notSimplyBounded F @8
-        aliasedType: List<dynamic Function()> Function()
+        aliasedType: List<dynamic> Function()
         aliasedElement: GenericFunctionTypeElement
-          returnType: List<dynamic Function()>
+          returnType: List<dynamic>
 ''');
   }
 
@@ -27285,7 +27302,7 @@
       notSimplyBounded F @8
         typeParameters
           unrelated T @10
-            bound: dynamic Function()
+            bound: dynamic
             defaultType: dynamic
         aliasedType: void Function()
         aliasedElement: GenericFunctionTypeElement
@@ -27327,7 +27344,6 @@
   }
 
   test_new_typedef_nonFunction_notSimplyBounded_self() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary('''
 typedef F<T extends F> = List<int>;
 ''');
@@ -27345,7 +27361,6 @@
   }
 
   test_new_typedef_nonFunction_notSimplyBounded_viaInterfaceType() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary('''
 typedef F = List<F>;
 ''');
@@ -27773,7 +27788,7 @@
       functionTypeAliasBased notSimplyBounded F @13
         typeParameters
           unrelated T @15
-            bound: dynamic Function()
+            bound: dynamic
             defaultType: dynamic
         aliasedType: void Function()
         aliasedElement: GenericFunctionTypeElement
@@ -29631,7 +29646,7 @@
   }
 
   test_type_never_disableNnbd() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('Never d;');
     checkElementText(library, r'''
 library
@@ -29730,7 +29745,7 @@
   }
 
   test_type_param_ref_nullability_star() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('''
 class C<T> {
   T t;
@@ -31108,7 +31123,6 @@
   }
 
   test_typeAlias_typeParameters_variance_interface_contravariant() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<T> = List<void Function(T)>;
 ''');
@@ -31125,7 +31139,6 @@
   }
 
   test_typeAlias_typeParameters_variance_interface_contravariant2() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<T> = void Function(T);
 typedef B<T> = List<A<T>>;
@@ -31153,7 +31166,6 @@
   }
 
   test_typeAlias_typeParameters_variance_interface_covariant() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<T> = List<T>;
 ''');
@@ -31170,7 +31182,6 @@
   }
 
   test_typeAlias_typeParameters_variance_interface_covariant2() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<T> = Map<int, T>;
 typedef B<T> = List<A<T>>;
@@ -31297,19 +31308,19 @@
   definingUnit
     typeAliases
       F @8
-        aliasedType: dynamic Function()
+        aliasedType: int
     topLevelVariables
       static f @19
-        type: dynamic Function()
+        type: int
           aliasElement: self::@typeAlias::F
     accessors
       synthetic static get f @-1
-        returnType: dynamic Function()
+        returnType: int
           aliasElement: self::@typeAlias::F
       synthetic static set f @-1
         parameters
           requiredPositional _f @-1
-            type: dynamic Function()
+            type: int
               aliasElement: self::@typeAlias::F
         returnType: void
 ''');
@@ -31320,7 +31331,6 @@
     reason: 'Type dynamic is special, no support for its aliases yet',
   )
   test_typedef_nonFunction_aliasElement_dynamic() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A = dynamic;
 void f(A a) {}
@@ -31333,7 +31343,6 @@
   }
 
   test_typedef_nonFunction_aliasElement_functionType() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A1 = void Function();
 typedef A2<R> = R Function();
@@ -31375,7 +31384,6 @@
   }
 
   test_typedef_nonFunction_aliasElement_interfaceType() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A1 = List<int>;
 typedef A2<T, U> = Map<T, U>;
@@ -31420,7 +31428,6 @@
     reason: 'Type Never is special, no support for its aliases yet',
   )
   test_typedef_nonFunction_aliasElement_never() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A1 = Never;
 typedef A2<T> = Never?;
@@ -31437,7 +31444,6 @@
   }
 
   test_typedef_nonFunction_aliasElement_typeParameterType() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<T> = T;
 void f<U>(A<U> a) {}
@@ -31471,7 +31477,6 @@
     reason: 'Type void is special, no support for its aliases yet',
   )
   test_typedef_nonFunction_aliasElement_void() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A = void;
 void f(A a) {}
@@ -31484,7 +31489,6 @@
   }
 
   test_typedef_nonFunction_asInterfaceType_interfaceType_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X<T> = A<int, T>;
 class A<T, U> {}
@@ -31520,7 +31524,6 @@
   }
 
   test_typedef_nonFunction_asInterfaceType_interfaceType_question() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X<T> = A<T>?;
 class A<T> {}
@@ -31560,7 +31563,6 @@
   }
 
   test_typedef_nonFunction_asInterfaceType_interfaceType_question2() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X<T> = A<T?>;
 class A<T> {}
@@ -31604,7 +31606,6 @@
   }
 
   test_typedef_nonFunction_asInterfaceType_Never_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = Never;
 class A implements X {}
@@ -31623,7 +31624,6 @@
   }
 
   test_typedef_nonFunction_asInterfaceType_Null_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = Null;
 class A implements X {}
@@ -31642,7 +31642,6 @@
   }
 
   test_typedef_nonFunction_asInterfaceType_typeParameterType() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X<T> = T;
 class A {}
@@ -31678,7 +31677,6 @@
   }
 
   test_typedef_nonFunction_asInterfaceType_void() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = void;
 class A {}
@@ -31708,7 +31706,6 @@
   }
 
   test_typedef_nonFunction_asMixinType_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = A<int>;
 class A<T> {}
@@ -31738,7 +31735,6 @@
   }
 
   test_typedef_nonFunction_asMixinType_question() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = A<int>?;
 class A<T> {}
@@ -31781,7 +31777,6 @@
   }
 
   test_typedef_nonFunction_asMixinType_question2() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = A<int?>;
 class A<T> {}
@@ -31826,7 +31821,6 @@
   }
 
   test_typedef_nonFunction_asSuperType_interfaceType_Never_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = Never;
 class A extends X {}
@@ -31845,7 +31839,6 @@
   }
 
   test_typedef_nonFunction_asSuperType_interfaceType_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = A<int>;
 class A<T> {}
@@ -31873,7 +31866,6 @@
   }
 
   test_typedef_nonFunction_asSuperType_interfaceType_none_viaTypeParameter() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X<T> = T;
 class A<T> {}
@@ -31906,7 +31898,6 @@
   }
 
   test_typedef_nonFunction_asSuperType_interfaceType_Null_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = Null;
 class A extends X {}
@@ -31925,7 +31916,6 @@
   }
 
   test_typedef_nonFunction_asSuperType_interfaceType_question() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = A<int>?;
 class A<T> {}
@@ -31951,7 +31941,6 @@
   }
 
   test_typedef_nonFunction_asSuperType_interfaceType_question2() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = A<int?>;
 class A<T> {}
@@ -31979,7 +31968,6 @@
   }
 
   test_typedef_nonFunction_asSuperType_Never_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = Never;
 class A extends X {}
@@ -31998,7 +31986,6 @@
   }
 
   test_typedef_nonFunction_asSuperType_Null_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef X = Null;
 class A extends X {}
@@ -32017,7 +32004,6 @@
   }
 
   test_typedef_nonFunction_using_dynamic() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A = dynamic;
 void f(A a) {}
@@ -32038,6 +32024,7 @@
   }
 
   test_typedef_nonFunction_using_interface_disabled() async {
+    featureSet = FeatureSets.language_2_12;
     var library = await checkLibrary(r'''
 typedef A = int;
 void f(A a) {}
@@ -32063,7 +32050,6 @@
   }
 
   test_typedef_nonFunction_using_interface_noTypeParameters() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A = int;
 void f(A a) {}
@@ -32085,7 +32071,6 @@
   }
 
   test_typedef_nonFunction_using_interface_noTypeParameters_legacy() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     newFile('/a.dart', content: r'''
 typedef A = List<int>;
 ''');
@@ -32110,7 +32095,6 @@
   }
 
   test_typedef_nonFunction_using_interface_noTypeParameters_question() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A = int?;
 void f(A a) {}
@@ -32132,7 +32116,6 @@
   }
 
   test_typedef_nonFunction_using_interface_withTypeParameters() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<T> = Map<int, T>;
 void f(A<String> a) {}
@@ -32159,7 +32142,6 @@
   }
 
   test_typedef_nonFunction_using_Never_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A = Never;
 void f(A a) {}
@@ -32180,7 +32162,6 @@
   }
 
   test_typedef_nonFunction_using_Never_question() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A = Never?;
 void f(A a) {}
@@ -32201,7 +32182,6 @@
   }
 
   test_typedef_nonFunction_using_typeParameter_none() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<T> = T;
 void f1(A a) {}
@@ -32234,7 +32214,6 @@
   }
 
   test_typedef_nonFunction_using_typeParameter_question() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A<T> = T?;
 void f1(A a) {}
@@ -32267,7 +32246,6 @@
   }
 
   test_typedef_nonFunction_using_void() async {
-    featureSet = FeatureSets.nonFunctionTypeAliases;
     var library = await checkLibrary(r'''
 typedef A = void;
 void f(A a) {}
@@ -32687,7 +32665,7 @@
       functionTypeAliasBased notSimplyBounded F @13
         typeParameters
           unrelated T @15
-            bound: dynamic Function()
+            bound: dynamic
             defaultType: dynamic
         aliasedType: void Function()
         aliasedElement: GenericFunctionTypeElement
@@ -32705,7 +32683,7 @@
       functionTypeAliasBased notSimplyBounded F @13
         typeParameters
           unrelated T @15
-            bound: List<dynamic Function()>
+            bound: List<dynamic>
             defaultType: dynamic
         aliasedType: void Function()
         aliasedElement: GenericFunctionTypeElement
@@ -32736,7 +32714,7 @@
   }
 
   test_typedef_type_parameters_f_bound_complex_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('typedef U F<T extends List<U>, U>(T t);');
     checkElementText(library, r'''
 library
@@ -32781,7 +32759,7 @@
   }
 
   test_typedef_type_parameters_f_bound_simple_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library = await checkLibrary('typedef U F<T extends U, U>(T t);');
     checkElementText(library, r'''
 library
@@ -32827,7 +32805,7 @@
   }
 
   test_typedef_type_parameters_f_bound_simple_new_syntax_legacy() async {
-    featureSet = FeatureSets.beforeNullSafe;
+    featureSet = FeatureSets.language_2_9;
     var library =
         await checkLibrary('typedef F<T extends U, U> = U Function(T t);');
     checkElementText(library, r'''
diff --git a/pkg/dartdev/benchmark/bench.dart b/pkg/dartdev/benchmark/bench.dart
deleted file mode 100644
index abfeaff..0000000
--- a/pkg/dartdev/benchmark/bench.dart
+++ /dev/null
@@ -1,253 +0,0 @@
-// Copyright (c) 2020, 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:convert';
-import 'dart:io' as io;
-
-import 'package:args/args.dart';
-import 'package:meta/meta.dart';
-
-List<Benchmark> benchmarks = [
-  DartStartup(),
-  DartRunStartup(),
-  SdkSize(),
-];
-
-void main(List<String> args) async {
-  ArgParser argParser = _createArgParser();
-
-  ArgResults argResults;
-
-  try {
-    argResults = argParser.parse(args);
-  } on FormatException catch (e) {
-    print(e.message);
-    print('');
-    printUsage(argParser, includeDescription: false);
-    io.exit(1);
-  }
-
-  if (argResults['help'] || argResults.arguments.isEmpty) {
-    printUsage(argParser);
-    io.exit(0);
-  }
-
-  if (!argResults.wasParsed('dart-sdk')) {
-    print('No value passed for `dart-sdk`.');
-    print('');
-    printUsage(argParser);
-    io.exit(1);
-  }
-
-  if (!argResults.wasParsed('run')) {
-    print('No value passed for `run`.');
-    print('');
-    printUsage(argParser);
-    io.exit(1);
-  }
-
-  Context context = Context(argResults['dart-sdk']);
-
-  String benchmarkName = argResults['run'];
-  Benchmark benchmark = benchmarks.singleWhere((b) => b.id == benchmarkName);
-
-  BenchmarkResult result = await benchmark.run(context);
-  print(result.toJson());
-  io.exit(0);
-}
-
-void printUsage(ArgParser argParser, {bool includeDescription = true}) {
-  print('usage: dart bin/bench.dart <options>');
-  print('');
-  if (includeDescription) {
-    print('Run benchmarks for the dartdev tool.');
-    print('');
-  }
-  print('Options:');
-  print(argParser.usage);
-}
-
-ArgParser _createArgParser() {
-  ArgParser argParser = ArgParser(usageLineLength: io.stdout.terminalColumns);
-  argParser.addFlag(
-    'help',
-    abbr: 'h',
-    negatable: false,
-    help: 'Print this usage information.',
-  );
-  argParser.addOption(
-    'dart-sdk',
-    valueHelp: 'sdk path',
-    help: 'The path to the Dart SDK to use for benchmarking.',
-  );
-  argParser.addOption(
-    'run',
-    valueHelp: 'benchmark',
-    allowed: benchmarks.map((b) => b.id).toList(),
-    allowedHelp: {
-      for (var benchmark in benchmarks) benchmark.id: benchmark.description,
-    },
-    help: 'The benchmark to run.',
-  );
-  return argParser;
-}
-
-abstract class Benchmark {
-  final String id;
-  final String description;
-
-  Benchmark(this.id, this.description);
-
-  Future<BenchmarkResult> run(Context context);
-}
-
-class DartStartup extends Benchmark {
-  DartStartup()
-      : super(
-          'script-startup',
-          'Benchmark the startup time of a minimal Dart script (μs).',
-        );
-
-  @override
-  Future<BenchmarkResult> run(Context context) async {
-    // setup
-    io.Directory dir = io.Directory.systemTemp.createTempSync('dartdev');
-    io.File file = io.File('${dir.path}/hello.dart');
-    file.writeAsStringSync('void main() => print(\'hello\');');
-
-    // perform the benchmark
-    Stopwatch timer = Stopwatch()..start();
-    io.Process.runSync(
-      '${context.sdkPath}/bin/dart',
-      [file.absolute.path],
-    );
-    timer.stop();
-
-    // cleanup
-    dir.deleteSync(recursive: true);
-
-    // report the result
-    int micros = timer.elapsedMicroseconds;
-    return BenchmarkResult(
-      id: id,
-      value: micros,
-      units: 'microseconds',
-      userDescription: '${(micros / 1000.0).toStringAsFixed(2)}ms',
-    );
-  }
-}
-
-class DartRunStartup extends Benchmark {
-  DartRunStartup()
-      : super(
-          'run-script-startup',
-          'Benchmark the startup time of a minimal Dart script, executed with '
-              '`dart run` (μs).',
-        );
-
-  @override
-  Future<BenchmarkResult> run(Context context) async {
-    // setup
-    io.Directory dir = io.Directory.systemTemp.createTempSync('dartdev');
-    io.File file = io.File('${dir.path}/hello.dart');
-    file.writeAsStringSync('void main() => print(\'hello\');');
-
-    // perform the benchmark
-    Stopwatch timer = Stopwatch()..start();
-    io.Process.runSync(
-      '${context.sdkPath}/bin/dart',
-      ['run', file.absolute.path],
-    );
-    timer.stop();
-
-    // cleanup
-    dir.deleteSync(recursive: true);
-
-    // report the result
-    int micros = timer.elapsedMicroseconds;
-    return BenchmarkResult(
-      id: id,
-      value: micros,
-      units: 'microseconds',
-      userDescription: '${(micros / 1000.0).toStringAsFixed(2)}ms',
-    );
-  }
-}
-
-class SdkSize extends Benchmark {
-  SdkSize()
-      : super(
-          'sdk-size',
-          'Benchmark the compressed size of the Dart SDK (bytes).',
-        );
-
-  @override
-  Future<BenchmarkResult> run(Context context) async {
-    // setup
-    io.Directory tempDir = io.Directory.systemTemp.createTempSync('dartdev');
-
-    // perform the benchmark
-    io.File sdkArchive = compress(io.Directory(context.sdkPath), tempDir);
-    int bytes = sdkArchive.lengthSync();
-
-    // cleanup
-    tempDir.deleteSync(recursive: true);
-
-    // report the result
-    return BenchmarkResult(
-      id: id,
-      value: bytes,
-      units: 'bytes',
-      userDescription: '${(bytes / (1024.0 * 1024.0)).toStringAsFixed(1)}MB',
-    );
-  }
-
-  io.File compress(io.Directory sourceDir, io.Directory targetDir) {
-    String name = sourceDir.path.substring(sourceDir.path.lastIndexOf('/') + 1);
-    io.File outFile = io.File('${targetDir.absolute.path}/$name.zip');
-
-    if (io.Platform.isMacOS || io.Platform.isLinux) {
-      io.Process.runSync('zip', [
-        '-r',
-        '-9', // optimized for compressed size
-        outFile.absolute.path,
-        sourceDir.absolute.path,
-      ]);
-    } else {
-      throw Exception('platform not supported: ${io.Platform.operatingSystem}');
-    }
-
-    return outFile;
-  }
-}
-
-class Context {
-  final String sdkPath;
-
-  Context(this.sdkPath);
-}
-
-class BenchmarkResult {
-  final String id;
-  final int value;
-  final String units;
-  final String userDescription;
-
-  BenchmarkResult({
-    @required this.id,
-    @required this.value,
-    @required this.units,
-    @required this.userDescription,
-  });
-
-  String toJson() {
-    Map m = {
-      'id': id,
-      'value': value,
-      'units': units,
-      'userDescription': userDescription,
-    };
-    return JsonEncoder.withIndent('  ').convert(m);
-  }
-}
diff --git a/tests/language/constructor/reference_test.dart b/tests/language/constructor/reference_test.dart
index 36ca27d..3755880 100644
--- a/tests/language/constructor/reference_test.dart
+++ b/tests/language/constructor/reference_test.dart
@@ -88,8 +88,6 @@
   Foo.bar.baz();
   //  ^^^
   // [cfe] Getter not found: 'bar'.
-//^^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.CONSTRUCTOR_TEAROFFS_NOT_ENABLED
   //      ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   Foo<int>();
@@ -117,8 +115,6 @@
   Foo.bar.baz<int>();
   //  ^^^
   // [cfe] Getter not found: 'bar'.
-//^^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.CONSTRUCTOR_TEAROFFS_NOT_ENABLED
   //      ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
 }
diff --git a/tests/language/generic/metadata_in_function_body_test.dart b/tests/language/generic/metadata_in_function_body_test.dart
index 8b64190..de229e5 100644
--- a/tests/language/generic/metadata_in_function_body_test.dart
+++ b/tests/language/generic/metadata_in_function_body_test.dart
@@ -17,11 +17,11 @@
   @C()
   @C<dynamic>()
   //^
-  // [analyzer] SYNTACTIC_ERROR.ANNOTATION_WITH_TYPE_ARGUMENTS
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
   // [cfe] An annotation can't use type arguments.
   @C<int>()
   //^
-  // [analyzer] SYNTACTIC_ERROR.ANNOTATION_WITH_TYPE_ARGUMENTS
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
   // [cfe] An annotation can't use type arguments.
   int i = 0;
   ignore(i);
diff --git a/tests/language/generic/metadata_test.dart b/tests/language/generic/metadata_test.dart
index 70156d6..851dda9 100644
--- a/tests/language/generic/metadata_test.dart
+++ b/tests/language/generic/metadata_test.dart
@@ -13,10 +13,10 @@
 @C()
 @C<dynamic>()
 //^
-// [analyzer] SYNTACTIC_ERROR.ANNOTATION_WITH_TYPE_ARGUMENTS
+// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
 // [cfe] An annotation can't use type arguments.
 @C<int>()
 //^
-// [analyzer] SYNTACTIC_ERROR.ANNOTATION_WITH_TYPE_ARGUMENTS
+// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
 // [cfe] An annotation can't use type arguments.
 main() {}
diff --git a/tests/language_2/constructor/reference_test.dart b/tests/language_2/constructor/reference_test.dart
index 6dff1ad..03d4c56 100644
--- a/tests/language_2/constructor/reference_test.dart
+++ b/tests/language_2/constructor/reference_test.dart
@@ -90,8 +90,6 @@
   Foo.bar.baz();
   //  ^^^
   // [cfe] Getter not found: 'bar'.
-//^^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.CONSTRUCTOR_TEAROFFS_NOT_ENABLED
   //      ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
   Foo<int>();
@@ -119,8 +117,6 @@
   Foo.bar.baz<int>();
   //  ^^^
   // [cfe] Getter not found: 'bar'.
-//^^^^^^^
-// [analyzer] COMPILE_TIME_ERROR.CONSTRUCTOR_TEAROFFS_NOT_ENABLED
   //      ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
 }
diff --git a/tests/language_2/generic/metadata_in_function_body_test.dart b/tests/language_2/generic/metadata_in_function_body_test.dart
index d98f743..79af7e0 100644
--- a/tests/language_2/generic/metadata_in_function_body_test.dart
+++ b/tests/language_2/generic/metadata_in_function_body_test.dart
@@ -19,11 +19,11 @@
   @C()
   @C<dynamic>()
   //^
-  // [analyzer] SYNTACTIC_ERROR.ANNOTATION_WITH_TYPE_ARGUMENTS
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
   // [cfe] An annotation can't use type arguments.
   @C<int>()
   //^
-  // [analyzer] SYNTACTIC_ERROR.ANNOTATION_WITH_TYPE_ARGUMENTS
+  // [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
   // [cfe] An annotation can't use type arguments.
   int i = 0;
   ignore(i);
diff --git a/tests/language_2/generic/metadata_test.dart b/tests/language_2/generic/metadata_test.dart
index 4a4dcad..29ec0d9 100644
--- a/tests/language_2/generic/metadata_test.dart
+++ b/tests/language_2/generic/metadata_test.dart
@@ -15,10 +15,10 @@
 @C()
 @C<dynamic>()
 //^
-// [analyzer] SYNTACTIC_ERROR.ANNOTATION_WITH_TYPE_ARGUMENTS
+// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
 // [cfe] An annotation can't use type arguments.
 @C<int>()
 //^
-// [analyzer] SYNTACTIC_ERROR.ANNOTATION_WITH_TYPE_ARGUMENTS
+// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
 // [cfe] An annotation can't use type arguments.
 main() {}
diff --git a/tools/VERSION b/tools/VERSION
index 9673472..f951325 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 35
+PRERELEASE 36
 PRERELEASE_PATCH 0
\ No newline at end of file
