diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index 760e76a..ca8de48 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,5 +1,5 @@
 name: _fe_analyzer_shared
-version: 7.0.0
+version: 8.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/_fe_analyzer_shared
 
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index d82ba92..0835f08 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,21 +6,24 @@
   sdk: '>=2.6.0 <3.0.0'
 
 dependencies:
+  _fe_analyzer_shared:
+    path: ../_fe_analyzer_shared
   analyzer: any
   analyzer_plugin: any
   args: any
-  charcode: any
+  cli_util: any
+  collection: any
   convert: any
   crypto: any
   dart_style: any
-  front_end: any
+  html: any
+  intl: any
   linter: any
-  logging: any
   meta: any
-  pub_semver: any
-  source_span: any
   stream_channel: any
-  package_config: any
+  telemetry:
+    path: ../telemetry
+  test: any
   path: any
   tflite_native: any
   watcher: any
@@ -30,6 +33,8 @@
   analysis_tool: any
   html: any
   http: any
+  logging: any
+  matcher: any
+  mockito: any
   pedantic: ^1.8.0
   test_reflective_loader: any
-  test: any
diff --git a/pkg/analysis_server_client/pubspec.yaml b/pkg/analysis_server_client/pubspec.yaml
index bc8b89f..9ee4b0e 100644
--- a/pkg/analysis_server_client/pubspec.yaml
+++ b/pkg/analysis_server_client/pubspec.yaml
@@ -11,4 +11,8 @@
   path: ^1.7.0
   pub_semver: ^1.4.4
 dev_dependencies:
+  analyzer:
+    path: ../analyzer
+  analysis_server:
+    path: ../analysis_server
   test: ^1.14.2
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 57b0902..b6f824d 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,5 +1,44 @@
-## 0.39.18-dev
+## 0.40.0
 * Added `LibraryElement.featureSet`.
+* Removed deprecated `EmbedderSdk` and related classes.
+* `FunctionType` returned from `ExecutableElement.type` return `null`
+   as its `element`. Use `ExecutableElement`s directly if necessary.
+* `FunctionTypeAliasElement` does not implement `FunctionTypedElement`
+   anymore, implements `TypeParameterizedElement` instead.
+* Removed deprecated `CustomUriResolver`.
+* Removed deprecated `ExplicitSourceResolver`, `FileUriResolver`,
+  `LocalSourcePredicate`, `PackageUriResolver`, `RelativeFileUriResolver`.
+* Removed deprecated `ErrorCode` instances.
+* The `withNullability` flag in `DartType.getDisplayString()` is now required.
+* Removed deprecated `DartType.substitute2`, and `FunctionType.substitute3`,
+  use `ClassElement.instantiate`, `FunctionTypeAliasElement.instantiate()`,
+  or `FunctionType.instantiate()`.
+* Removed deprecated `FunctionType.boundTypeParameters`, use `typeFormals`
+  for now. Later, it will be deprecated, and replaced with `typeParameters`.
+* Removed `InterfaceType.instantiate()`, `InterfaceType.substitute4`,
+  use `ClassElement.instantiate()`.
+* Removed `typeParameters` and `instantiate()` from `ParameterizedType`.
+  Use `typeParameters` and `instantiate()` from `ClassElement`.
+* Removed deprecated methods from `DeclaredVariables`.
+* Removed deprecated `typeProvider` and `typeSystem` getters.
+  Use corresponding `LibraryElement` getters instead.
+* Removed deprecated options from `AnalysisOptions`.
+* Removed deprecated `ClassElement.hasReferenceToSuper`.
+* Removed deprecated `DartType.isObject`.
+  Use `DartType.isDartCoreObject` instead.
+* Removed deprecated declarations in `AnalysisContext` and `ContextLocator`.
+* Removed deprecated libraries.
+* Removed deprecated declarations from TypeProvider.
+* Removed deprecated `ParseResult` and `ResolveResult`.
+* Removed deprecated `AnalysisContext.typeProvider` and `typeSystem`.
+  Use the corresponding getters of `LibraryElement`.
+* Removed deprecated methods of `AnalysisSession`.
+* Removed deprecated declarations from `dart/ast/ast.dart`.
+* Removed deprecated methods from `AstFactory`.
+* Removed deprecated `parseFile2`..
+* Removed deprecated `TypeDefiningElement.type`.
+* Features in `Feature` are not constants anymore.
+* Replaced `Feature.firstSupportedVersion` with `releaseVersion`.
 
 ## 0.39.17
 * Depend on cli_util 0.2.0.
diff --git a/pkg/analyzer/lib/context/context_root.dart b/pkg/analyzer/lib/context/context_root.dart
deleted file mode 100644
index df4a4b4..0000000
--- a/pkg/analyzer/lib/context/context_root.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2017, 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.
-
-@deprecated
-library context.context_root;
-
-export 'package:analyzer/src/context/context_root.dart';
diff --git a/pkg/analyzer/lib/context/declared_variables.dart b/pkg/analyzer/lib/context/declared_variables.dart
deleted file mode 100644
index 74dc187..0000000
--- a/pkg/analyzer/lib/context/declared_variables.dart
+++ /dev/null
@@ -1,8 +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.
-
-@deprecated
-library analyzer.context.declared_variables;
-
-export 'package:analyzer/dart/analysis/declared_variables.dart';
diff --git a/pkg/analyzer/lib/dart/analysis/analysis_context.dart b/pkg/analyzer/lib/dart/analysis/analysis_context.dart
index f4258ca..37035e4 100644
--- a/pkg/analyzer/lib/dart/analysis/analysis_context.dart
+++ b/pkg/analyzer/lib/dart/analysis/analysis_context.dart
@@ -27,43 +27,6 @@
   /// Return the currently active analysis session.
   AnalysisSession get currentSession;
 
-  /// A list of the absolute, normalized paths of files and directories that
-  /// will not be analyzed.
-  ///
-  /// Deprecated: Use `contextRoot.excludedPaths`.
-  @deprecated
-  List<String> get excludedPaths;
-
-  /// A list of the absolute, normalized paths of files and directories that
-  /// will be analyzed. If a path in the list represents a file, then that file
-  /// will be analyzed, even if it is in the list of [excludedPaths]. If path in
-  /// the list represents a directory, then all of the files contained in that
-  /// directory, either directly or indirectly, and that are not explicitly
-  /// excluded by the list of [excludedPaths] will be analyzed.
-  ///
-  /// Deprecated: Use `contextRoot.includedPaths`.
-  @deprecated
-  List<String> get includedPaths;
-
   /// Return the workspace for containing the context root.
   Workspace get workspace;
-
-  /// Return the absolute, normalized paths of all of the files that are
-  /// contained in this context. These are all of the files that are included
-  /// directly or indirectly by one or more of the [includedPaths] and that are
-  /// not excluded by any of the [excludedPaths].
-  ///
-  /// Deprecated: Use `contextRoot.analyzedFiles`.
-  @deprecated
-  Iterable<String> analyzedFiles();
-
-  /// Return `true` if the file or directory with the given [path] will be
-  /// analyzed in this context. A file (or directory) will be analyzed if it is
-  /// either the same as or contained in one of the [includedPaths] and, if it
-  /// is contained in one of the [includedPaths], is not the same as or
-  /// contained in one of the [excludedPaths].
-  ///
-  /// Deprecated: Use `contextRoot.isAnalyzed`.
-  @deprecated
-  bool isAnalyzed(String path);
 }
diff --git a/pkg/analyzer/lib/dart/analysis/context_locator.dart b/pkg/analyzer/lib/dart/analysis/context_locator.dart
index 9ee427d..484099e 100644
--- a/pkg/analyzer/lib/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/dart/analysis/context_locator.dart
@@ -2,7 +2,6 @@
 // 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/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/context_locator.dart';
@@ -20,29 +19,6 @@
   factory ContextLocator({ResourceProvider resourceProvider}) =
       ContextLocatorImpl;
 
-  /// Return a list of the analysis contexts that should be used to analyze the
-  /// files that are included by the list of [includedPaths] and not excluded by
-  /// the list of [excludedPaths].
-  ///
-  /// If an [optionsFile] is specified, then it is assumed to be the path to the
-  /// `analysis_options.yaml` (or `.analysis_options`) file that should be used
-  /// in place of the ones that would be found by looking in the directories
-  /// containing the context roots.
-  ///
-  /// If a [packagesFile] is specified, then it is assumed to be the path to the
-  /// `.packages` file that should be used in place of the one that would be
-  /// found by looking in the directories containing the context roots.
-  ///
-  /// If the [sdkPath] is specified, then it is used as the path to the root of
-  /// the SDK that should be used during analysis.
-  @deprecated
-  List<AnalysisContext> locateContexts(
-      {@required List<String> includedPaths,
-      List<String> excludedPaths = const <String>[],
-      String optionsFile,
-      String packagesFile,
-      String sdkPath});
-
   /// Return a list of the context roots that should be used to analyze the
   /// files that are included by the list of [includedPaths] and not excluded by
   /// the list of [excludedPaths].
diff --git a/pkg/analyzer/lib/dart/analysis/declared_variables.dart b/pkg/analyzer/lib/dart/analysis/declared_variables.dart
index 0104180..bb835a4 100644
--- a/pkg/analyzer/lib/dart/analysis/declared_variables.dart
+++ b/pkg/analyzer/lib/dart/analysis/declared_variables.dart
@@ -2,11 +2,6 @@
 // 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/constant/value.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/src/dart/constant/from_environment_evaluator.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
-
 /// An object used to provide access to the values of variables that have been
 /// defined on the command line using the `-D` option.
 ///
@@ -29,59 +24,7 @@
   /// Return the names of the variables for which a value has been defined.
   Iterable<String> get variableNames => _declaredVariables.keys;
 
-  /// Add all variables of [other] to this object.
-  @deprecated
-  void addAll(DeclaredVariables other) {
-    _declaredVariables.addAll(other._declaredVariables);
-  }
-
-  /// Define a variable with the given [name] to have the given [value].
-  @deprecated
-  void define(String name, String value) {
-    _declaredVariables[name] = value;
-  }
-
   /// Return the raw string value of the variable with the given [name],
   /// or `null` of the variable is not defined.
   String get(String name) => _declaredVariables[name];
-
-  /// Return the value of the variable with the given [name] interpreted as a
-  /// 'boolean' value. If the variable is not defined (or [name] is `null`), a
-  /// DartObject representing "unknown" is returned. If the value cannot be
-  /// parsed as a boolean, a DartObject representing 'null' is returned. The
-  /// [typeProvider] is the type provider used to find the type 'bool'.
-  @Deprecated("Clients don't need this functionality")
-  DartObject getBool(TypeProvider typeProvider, String name) {
-    return _evaluator(typeProvider).getBool(name);
-  }
-
-  /// Return the value of the variable with the given [name] interpreted as an
-  /// integer value. If the variable is not defined (or [name] is `null`), a
-  /// DartObject representing "unknown" is returned. If the value cannot be
-  /// parsed as an integer, a DartObject representing 'null' is returned.
-  @Deprecated("Clients don't need this functionality")
-  DartObject getInt(TypeProvider typeProvider, String name) {
-    return _evaluator(typeProvider).getInt(name);
-  }
-
-  /// Return the value of the variable with the given [name] interpreted as a
-  /// String value, or `null` if the variable is not defined. Return the value
-  /// of the variable with the given name interpreted as a String value. If the
-  /// variable is not defined (or [name] is `null`), a DartObject representing
-  /// "unknown" is returned. The [typeProvider] is the type provider used to
-  /// find the type 'String'.
-  @Deprecated("Clients don't need this functionality")
-  DartObject getString(TypeProvider typeProvider, String name) {
-    return _evaluator(typeProvider).getString(name);
-  }
-
-  FromEnvironmentEvaluator _evaluator(TypeProvider typeProvider) {
-    var typeSystem = TypeSystemImpl(
-      implicitCasts: false,
-      isNonNullableByDefault: false,
-      strictInference: false,
-      typeProvider: typeProvider,
-    );
-    return FromEnvironmentEvaluator(typeSystem, this);
-  }
 }
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index 1d46e72..7aa01d2 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -11,29 +11,29 @@
 /// experimental flags.
 abstract class Feature {
   /// Feature information for the 2018 constant update.
-  static const constant_update_2018 = ExperimentalFeatures.constant_update_2018;
+  static final constant_update_2018 = ExperimentalFeatures.constant_update_2018;
 
   /// Feature information for non-nullability by default.
-  static const non_nullable = ExperimentalFeatures.non_nullable;
+  static final non_nullable = ExperimentalFeatures.non_nullable;
 
   /// Feature information for control flow collections.
-  static const control_flow_collections =
+  static final control_flow_collections =
       ExperimentalFeatures.control_flow_collections;
 
   /// Feature information for extension methods.
-  static const extension_methods = ExperimentalFeatures.extension_methods;
+  static final extension_methods = ExperimentalFeatures.extension_methods;
 
   /// Feature information for spread collections.
-  static const spread_collections = ExperimentalFeatures.spread_collections;
+  static final spread_collections = ExperimentalFeatures.spread_collections;
 
   /// Feature information for set literals.
-  static const set_literals = ExperimentalFeatures.set_literals;
+  static final set_literals = ExperimentalFeatures.set_literals;
 
   /// Feature information for the triple-shift operator.
-  static const triple_shift = ExperimentalFeatures.triple_shift;
+  static final triple_shift = ExperimentalFeatures.triple_shift;
 
   /// Feature information for variance.
-  static const variance = ExperimentalFeatures.variance;
+  static final variance = ExperimentalFeatures.variance;
 
   /// If the feature may be enabled or disabled on the command line, the
   /// experimental flag that may be used to enable it.  Otherwise `null`.
@@ -41,9 +41,9 @@
   /// Should be `null` if [status] is `current` or `abandoned`.
   String get experimentalFlag;
 
-  /// If [status] is not `future`, the first version of the Dart SDK in which
-  /// the given feature was supported.  Otherwise `null`.
-  Version get firstSupportedVersion;
+  /// If [status] is not `future`, the first language version in which this
+  /// feature was enabled by default.  Otherwise `null`.
+  Version get releaseVersion;
 
   /// The status of the feature.
   FeatureStatus get status;
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 9acd4ad..d76add7 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -6,8 +6,8 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /// The result of performing some kind of analysis on a single file. Every
@@ -90,15 +90,7 @@
 /// those discovered during scanning and parsing.
 ///
 /// Clients may not extend, implement or mix-in this class.
-// ignore: deprecated_member_use_from_same_package
-abstract class ParsedUnitResult implements ParseResult {}
-
-/// The result of parsing of a single file. The errors returned include only
-/// those discovered during scanning and parsing.
-///
-/// Clients may not extend, implement or mix-in this class.
-@deprecated
-abstract class ParseResult implements AnalysisResultWithErrors {
+abstract class ParsedUnitResult implements AnalysisResultWithErrors {
   /// The content of the file that was scanned and parsed.
   String get content;
 
@@ -150,15 +142,7 @@
 /// include both syntactic and semantic errors.
 ///
 /// Clients may not extend, implement or mix-in this class.
-// ignore: deprecated_member_use_from_same_package
-abstract class ResolvedUnitResult implements ResolveResult {}
-
-/// The result of building a resolved AST for a single file. The errors returned
-/// include both syntactic and semantic errors.
-///
-/// Clients may not extend, implement or mix-in this class.
-@deprecated
-abstract class ResolveResult implements AnalysisResultWithErrors {
+abstract class ResolvedUnitResult implements AnalysisResultWithErrors {
   /// The content of the file that was scanned, parsed and resolved.
   String get content;
 
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index 28450cb..a4db043 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -9,10 +9,8 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/uri_converter.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /// A consistent view of the results of analyzing one or more files.
@@ -32,21 +30,6 @@
   /// Return the [ResourceProvider] that is used to access the file system.
   ResourceProvider get resourceProvider;
 
-  /// Return the source factory used to resolve URIs.
-  ///
-  /// Deprecated: Use the methods on [uriConverter] instead.
-  @deprecated
-  SourceFactory get sourceFactory;
-
-  /// Return a type provider that is consistent with the results returned by
-  /// this session.
-  @Deprecated('Use LibraryElement.typeProvider')
-  Future<TypeProvider> get typeProvider;
-
-  /// Return the type system being used by this session.
-  @Deprecated('Use LibraryElement.typeSystem')
-  Future<TypeSystem> get typeSystem;
-
   /// Return the URI converter used to convert between URI's and file paths.
   UriConverter get uriConverter;
 
@@ -65,20 +48,6 @@
   /// the library with the given [uri].
   Future<LibraryElement> getLibraryByUri(String uri);
 
-  /// Return a future that will complete with information about the results of
-  /// parsing the file with the given absolute, normalized [path].
-  ///
-  /// Deprecated: Use [getParsedUnit] instead.
-  @deprecated
-  Future<ParseResult> getParsedAst(String path);
-
-  /// Return information about the results of parsing the file with the given
-  /// absolute, normalized [path].
-  ///
-  /// Deprecated: Use [getParsedUnit] instead.
-  @deprecated
-  ParseResult getParsedAstSync(String path);
-
   /// Return information about the results of parsing units of the library file
   /// with the given absolute, normalized [path].
   ///
@@ -97,13 +66,6 @@
   ParsedUnitResult getParsedUnit(String path);
 
   /// Return a future that will complete with information about the results of
-  /// resolving the file with the given absolute, normalized [path].
-  ///
-  /// Deprecated: Use [getResolvedUnit] instead.
-  @deprecated
-  Future<ResolveResult> getResolvedAst(String path);
-
-  /// Return a future that will complete with information about the results of
   /// resolving all of the files in the library with the given absolute,
   /// normalized [path].
   ///
diff --git a/pkg/analyzer/lib/dart/analysis/utilities.dart b/pkg/analyzer/lib/dart/analysis/utilities.dart
index 2103cbb..585da88 100644
--- a/pkg/analyzer/lib/dart/analysis/utilities.dart
+++ b/pkg/analyzer/lib/dart/analysis/utilities.dart
@@ -56,39 +56,6 @@
       throwIfDiagnostics: throwIfDiagnostics);
 }
 
-/// Return the result of parsing the file at the given [path].
-///
-/// If a [resourceProvider] is given, it will be used to access the file system.
-///
-/// [featureSet] determines what set of features will be assumed by the parser.
-/// This parameter is required because the analyzer does not yet have a
-/// performant way of computing the correct feature set for a single file to be
-/// parsed.  Callers that need the feature set to be strictly correct must
-/// create an [AnalysisContextCollection], query it to get an [AnalysisContext],
-/// query it to get an [AnalysisSession], and then call `getParsedUnit`.
-///
-/// Callers that don't need the feature set to be strictly correct can pass in
-/// `FeatureSet.fromEnableFlags([])` to enable the default set of features; this
-/// is much more performant than using an analysis session, because it doesn't
-/// require the analyzer to process the SDK.
-///
-/// If [throwIfDiagnostics] is `true` (the default), then if any diagnostics are
-/// produced because of syntactic errors in the [content] an `ArgumentError`
-/// will be thrown. If the parameter is `false`, then the caller can check the
-/// result to see whether there are any errors.
-@Deprecated('Use parseFile')
-ParseStringResult parseFile2(
-    {@required String path,
-    ResourceProvider resourceProvider,
-    @required FeatureSet featureSet,
-    bool throwIfDiagnostics = true}) {
-  return parseFile(
-      path: path,
-      resourceProvider: resourceProvider,
-      featureSet: featureSet,
-      throwIfDiagnostics: throwIfDiagnostics);
-}
-
 /// Returns the result of parsing the given [content] as a compilation unit.
 ///
 /// If a [featureSet] is provided, it will be the default set of features that
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 2e621bc..f528230 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -1353,16 +1353,6 @@
   /// Set the token for the left parenthesis to the given [token].
   set leftParenthesis(Token token);
 
-  /// Return the URI of the implementation library to be used if the condition
-  /// is true.
-  @deprecated
-  StringLiteral get libraryUri;
-
-  /// Set the URI of the implementation library to be used if the condition is
-  /// true to the given [uri].
-  @deprecated
-  set libraryUri(StringLiteral uri);
-
   /// Return the name of the declared variable whose value is being used in the
   /// condition.
   DottedName get name;
@@ -1439,9 +1429,6 @@
   @override
   ConstructorElement get declaredElement;
 
-  /// Set the element associated with this constructor to the given [element].
-  set element(ConstructorElement element);
-
   /// Return the token for the 'external' keyword to the given [token].
   Token get externalKeyword;
 
@@ -2388,10 +2375,6 @@
   /// parameter.
   bool get isRequiredPositional;
 
-  /// Return the kind of this parameter.
-  @deprecated
-  ParameterKind get kind;
-
   /// Return the annotations associated with this parameter.
   NodeList<Annotation> get metadata;
 
@@ -2682,9 +2665,6 @@
   /// structure has not been resolved.
   ExecutableElement get declaredElement;
 
-  /// Set the element associated with the function to the given [element].
-  set element(ExecutableElement element);
-
   /// Return the parameters associated with the function, or `null` if the
   /// function is part of a top-level getter.
   FormalParameterList get parameters;
@@ -3288,8 +3268,7 @@
 ///        ('new' | 'const')? [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class InstanceCreationExpression
-    implements Expression, ConstructorReferenceNode {
+abstract class InstanceCreationExpression implements Expression {
   /// Return the list of arguments to the constructor.
   ArgumentList get argumentList;
 
@@ -3315,14 +3294,6 @@
   /// Set the 'new' or 'const' keyword used to indicate how an object should be
   /// created to the given [token].
   set keyword(Token token);
-
-  @Deprecated('Use constructorName.staticElement')
-  @override
-  ConstructorElement get staticElement;
-
-  @Deprecated('Use constructorName.staticElement')
-  @override
-  set staticElement(ConstructorElement staticElement);
 }
 
 /// An integer literal expression.
@@ -4032,11 +4003,6 @@
   /// Return the node that is the parent of each of the elements in the list.
   AstNode get owner;
 
-  /// Set the node that is the parent of each of the elements in the list to the
-  /// given [node].
-  @deprecated // Never intended for public use.
-  set owner(AstNode node);
-
   /// Return the node at the given [index] in the list or throw a [RangeError]
   /// if [index] is out of bounds.
   @override
@@ -5186,14 +5152,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class UriBasedDirective implements Directive {
-  /// Return the source to which the URI was resolved.
-  @deprecated
-  Source get source;
-
-  /// Set the source to which the URI was resolved to the given [source].
-  @deprecated
-  set source(Source source);
-
   /// Return the URI referenced by this directive.
   StringLiteral get uri;
 
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 632484c..65b253e 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -346,16 +346,6 @@
       TypeArgumentList typeArguments,
       @required ArgumentList argumentList});
 
-  /// Returns a newly created field declaration. Either or both of the [comment]
-  /// and [metadata] can be `null` if the declaration does not have the
-  /// corresponding attribute. The [staticKeyword] can be `null` if the field is
-  /// not a static field.
-  ///
-  /// Use [fieldDeclaration2] instead.
-  @deprecated
-  FieldDeclaration fieldDeclaration(Comment comment, List<Annotation> metadata,
-      Token staticKeyword, VariableDeclarationList fieldList, Token semicolon);
-
   /// Returns a newly created field declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The [staticKeyword] can be `null` if the
@@ -377,27 +367,6 @@
   /// [period] can be `null` if the keyword 'this' was not provided.  The
   /// [parameters] can be `null` if this is not a function-typed field formal
   /// parameter.
-  ///
-  /// Use [fieldFormalParameter2] instead.
-  @deprecated
-  FieldFormalParameter fieldFormalParameter(
-      Comment comment,
-      List<Annotation> metadata,
-      Token keyword,
-      TypeAnnotation type,
-      Token thisKeyword,
-      Token period,
-      SimpleIdentifier identifier,
-      TypeParameterList typeParameters,
-      FormalParameterList parameters);
-
-  /// Returns a newly created formal parameter. Either or both of the [comment]
-  /// and [metadata] can be `null` if the parameter does not have the
-  /// corresponding attribute. The [keyword] can be `null` if there is a type.
-  /// The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
-  /// [period] can be `null` if the keyword 'this' was not provided.  The
-  /// [parameters] can be `null` if this is not a function-typed field formal
-  /// parameter.
   FieldFormalParameter fieldFormalParameter2(
       {Comment comment,
       List<Annotation> metadata,
@@ -512,21 +481,6 @@
   /// [comment] and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [returnType] can be `null` if no return type
   /// was specified.
-  ///
-  /// Use [functionTypedFormalParameter2] instead.
-  @deprecated
-  FunctionTypedFormalParameter functionTypedFormalParameter(
-      Comment comment,
-      List<Annotation> metadata,
-      TypeAnnotation returnType,
-      SimpleIdentifier identifier,
-      TypeParameterList typeParameters,
-      FormalParameterList parameters);
-
-  /// Returns a newly created formal parameter. Either or both of the
-  /// [comment] and [metadata] can be `null` if the parameter does not have the
-  /// corresponding attribute. The [returnType] can be `null` if no return type
-  /// was specified.
   FunctionTypedFormalParameter functionTypedFormalParameter2(
       {Comment comment,
       List<Annotation> metadata,
@@ -608,12 +562,6 @@
       List<Combinator> combinators,
       Token semicolon);
 
-  /// Returns a newly created index expression suitable for use in a cascade
-  /// expression.
-  @Deprecated('Use indexExpressionForCascade2')
-  IndexExpression indexExpressionForCascade(
-      Token period, Token leftBracket, Expression index, Token rightBracket);
-
   /// Returns a newly created index expression.
   IndexExpression indexExpressionForCascade2(
       {@required Token period,
@@ -622,12 +570,6 @@
       @required Expression index,
       @required Token rightBracket});
 
-  /// Returns a newly created index expression suitable for use outside a
-  /// cascade expression.
-  @Deprecated('Use indexExpressionForTarget2')
-  IndexExpression indexExpressionForTarget(Expression target, Token leftBracket,
-      Expression index, Token rightBracket);
-
   /// Returns a newly created index expression.
   IndexExpression indexExpressionForTarget2(
       {@required Expression target,
@@ -824,20 +766,6 @@
   /// [comment] and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [keyword] can be `null` if a type was
   /// specified. The [type] must be `null` if the keyword is 'var'.
-  ///
-  /// Use [simpleFormalParameter2] instead.
-  @deprecated
-  SimpleFormalParameter simpleFormalParameter(
-      Comment comment,
-      List<Annotation> metadata,
-      Token keyword,
-      TypeAnnotation type,
-      SimpleIdentifier identifier);
-
-  /// Returns a newly created formal parameter. Either or both of the
-  /// [comment] and [metadata] can be `null` if the parameter does not have the
-  /// corresponding attribute. The [keyword] can be `null` if a type was
-  /// specified. The [type] must be `null` if the keyword is 'var'.
   SimpleFormalParameter simpleFormalParameter2(
       {Comment comment,
       List<Annotation> metadata,
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 8a4d9b9..1370243 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -81,13 +81,6 @@
   /// instance field.
   bool get hasNonFinalField;
 
-  /// Return `true` if this class has at least one reference to `super` (and
-  /// hence cannot be used as a mixin), or `false` if this element represents a
-  /// mixin, even if the mixin has a reference to `super`, because it is allowed
-  /// to be used as a mixin.
-  @Deprecated('It was used internally, should not be part of API')
-  bool get hasReferenceToSuper;
-
   /// Return `true` if this class declares a static member.
   bool get hasStaticMember;
 
@@ -121,19 +114,6 @@
   /// application if it was declared using the syntax "class A = B with C;".
   bool get isMixinApplication;
 
-  /// Return `true` if this class [isProxy], or if it inherits the proxy
-  /// annotation from a supertype.
-  @Deprecated(
-    'The @proxy annotation is deprecated in the langauge, and will be removed',
-  )
-  bool get isOrInheritsProxy;
-
-  /// Return `true` if this element has an annotation of the form '@proxy'.
-  @Deprecated(
-    'The @proxy annotation is deprecated in the langauge, and will be removed',
-  )
-  bool get isProxy;
-
   /// Return `true` if this class can validly be used as a mixin when defining
   /// another class. For classes defined by a mixin declaration, the result is
   /// always `true`. For classes defined by a class declaration or a mixin
@@ -195,10 +175,6 @@
   /// nullability status of the declaring library.
   InterfaceType get thisType;
 
-  @override
-  @deprecated
-  InterfaceType get type;
-
   /// Return the unnamed constructor declared in this class, or `null` if either
   /// this class does not declare an unnamed constructor but does declare named
   /// constructors or if this class represents a mixin declaration. The returned
@@ -239,14 +215,6 @@
     @required NullabilitySuffix nullabilitySuffix,
   });
 
-  /// Create the [InterfaceType] for this class with type arguments that
-  /// correspond to the bounds of the type parameters, and the given
-  /// [nullabilitySuffix].
-  @Deprecated('Use TypeSystem.instantiateToBounds2() instead')
-  InterfaceType instantiateToBounds({
-    @required NullabilitySuffix nullabilitySuffix,
-  });
-
   /// Return the element representing the method that results from looking up
   /// the given [methodName] in this class with respect to the given [library],
   /// ignoring abstract methods, or `null` if the look up fails. The behavior of
@@ -664,12 +632,6 @@
   /// by the visitor as a result of visiting this element.
   T accept<T>(ElementVisitor<T> visitor);
 
-  /// Return the most immediate ancestor of this element for which the
-  /// [predicate] returns `true`, or `null` if there is no such ancestor. Note
-  /// that this element will never be returned.
-  @Deprecated('Use either thisOrAncestorMatching or thisOrAncestorOfType')
-  E getAncestor<E extends Element>(Predicate<Element> predicate);
-
   /// Return the presentation of this element as it should appear when
   /// presented to users.
   ///
@@ -1170,7 +1132,7 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionTypeAliasElement
-    implements FunctionTypedElement, TypeDefiningElement {
+    implements TypeParameterizedElement, TypeDefiningElement {
   @override
   CompilationUnitElement get enclosingElement;
 
@@ -1190,34 +1152,6 @@
     @required List<DartType> typeArguments,
     @required NullabilitySuffix nullabilitySuffix,
   });
-
-  /// Produces the function type resulting from instantiating this typedef with
-  /// the given [typeArguments] and [nullabilitySuffix].
-  ///
-  /// Note that this always instantiates the typedef itself, so for a
-  /// [GenericTypeAliasElement] the returned [FunctionType] might still be a
-  /// generic function, with type formals. For example, if the typedef is:
-  ///     typedef F<T> = void Function<U>(T, U);
-  /// then `F<int>` will produce `void Function<U>(int, U)`.
-  @Deprecated('Use instantiate() instead')
-  FunctionType instantiate2({
-    @required List<DartType> typeArguments,
-    @required NullabilitySuffix nullabilitySuffix,
-  });
-
-  /// Produces the function type resulting from instantiating this typedef with
-  /// type arguments that correspond to the bounds of the type parameters, and
-  /// the given [nullabilitySuffix].
-  ///
-  /// Note that this always instantiates the typedef itself, so for a
-  /// [GenericTypeAliasElement] the returned [FunctionType] might still be a
-  /// generic function, with type formals. For example, if the typedef is:
-  ///     typedef F<T> = void Function<U>(T, U);
-  /// then `F<int>` will produce `void Function<U>(int, U)`.
-  @Deprecated('Use TypeSystem.instantiateToBounds2() instead')
-  FunctionType instantiateToBounds({
-    @required NullabilitySuffix nullabilitySuffix,
-  });
 }
 
 /// An element that has a [FunctionType] as its [type].
@@ -1364,14 +1298,6 @@
   /// The language version for this library.
   LibraryLanguageVersion get languageVersion;
 
-  /// The major component of the language version for this library.
-  @Deprecated("Use 'languageVersion'")
-  int get languageVersionMajor;
-
-  /// The minor component of the language version for this library.
-  @Deprecated("Use 'languageVersion'")
-  int get languageVersionMinor;
-
   /// Return the element representing the synthetic function `loadLibrary` that
   /// is implicitly defined for this library if the library is imported using a
   /// deferred import.
@@ -1479,10 +1405,6 @@
   /// Return a list containing all of the elements that were defined within the
   /// scope to have the same name.
   List<Element> get conflictingElements;
-
-  /// Return the type of this element as the dynamic type.
-  @deprecated
-  DartType get type;
 }
 
 /// An [ExecutableElement], with the additional information of a list of
@@ -1710,11 +1632,7 @@
 /// An element that defines a type.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class TypeDefiningElement implements Element {
-  /// Return the type defined by this element.
-  @deprecated
-  DartType get type;
-}
+abstract class TypeDefiningElement implements Element {}
 
 /// A type parameter.
 ///
@@ -1729,10 +1647,6 @@
   @override
   TypeParameterElement get declaration;
 
-  @override
-  @deprecated
-  TypeParameterType get type;
-
   /// Create the [TypeParameterType] with the given [nullabilitySuffix] for
   /// this type parameter.
   TypeParameterType instantiate({
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 156470c..326b7a8 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
 import 'package:analyzer/src/dart/element/type.dart' show InterfaceTypeImpl;
+import 'package:meta/meta.dart';
 
 /// The type associated with elements in the element model.
 ///
@@ -108,10 +109,6 @@
   /// Return `true` if this type represents the type 'dynamic'.
   bool get isDynamic;
 
-  /// Return `true` if this type represents the type 'Object'.
-  @Deprecated('Use isDartCoreObject')
-  bool get isObject;
-
   /// Return `true` if this type represents the type 'void'.
   bool get isVoid;
 
@@ -161,7 +158,7 @@
   ///
   /// Clients should not depend on the content of the returned value as it will
   /// be changed if doing so would improve the UX.
-  String getDisplayString({bool withNullability = false});
+  String getDisplayString({@required bool withNullability});
 
   /// If this type is a [TypeParameterType], returns its bound if it has one, or
   /// [objectType] otherwise.
@@ -169,27 +166,6 @@
   /// For any other type, returns `this`. Applies recursively -- if the bound is
   /// itself a type parameter, that is resolved too.
   DartType resolveToBound(DartType objectType);
-
-  /// Return the type resulting from substituting the given [argumentTypes] for
-  /// the given [parameterTypes] in this type. The specification defines this
-  /// operation in section 2:
-  /// <blockquote>
-  /// The notation <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ...,
-  /// y<sub>n</sub>]E</i> denotes a copy of <i>E</i> in which all occurrences of
-  /// <i>y<sub>i</sub>, 1 <= i <= n</i> have been replaced with
-  /// <i>x<sub>i</sub></i>.
-  /// </blockquote>
-  /// Note that, contrary to the specification, this method will not create a
-  /// copy of this type if no substitutions were required, but will return this
-  /// type directly.
-  ///
-  /// Note too that the current implementation of this method is only guaranteed
-  /// to work when the parameter types are type variables.
-  @Deprecated("""
-Use ClassElement.instantiate() or FunctionTypeAliasElement.instantiate()
-""")
-  DartType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes);
 }
 
 /// The type `dynamic` is a type which is a supertype of all other types, just
@@ -212,10 +188,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionType implements ParameterizedType {
-  /// Deprecated: use [typeFormals].
-  @deprecated
-  List<TypeParameterElement> get boundTypeParameters;
-
   /// Return a map from the names of named parameters to the types of the named
   /// parameters of this type of function. The entries in the map will be
   /// iterated in the same order as the order in which the named parameters were
@@ -260,19 +232,10 @@
   /// from the perspective of this function type.
   List<TypeParameterElement> get typeFormals;
 
-  @override
+  /// Produces a new function type by substituting type parameters of this
+  /// function type with the given [typeArguments]. The resulting function
+  /// type will have no type parameters.
   FunctionType instantiate(List<DartType> argumentTypes);
-
-  @Deprecated("Use FunctionTypeAliasElement.instantiate()")
-  @override
-  FunctionType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes);
-
-  /// Return the type resulting from substituting the given [argumentTypes] for
-  /// this type's parameters. This is fully equivalent to
-  /// `substitute(argumentTypes, getTypeArguments())`.
-  @deprecated // use instantiate
-  FunctionType substitute3(List<DartType> argumentTypes);
 }
 
 /// The type introduced by either a class or an interface, or a reference to
@@ -337,10 +300,6 @@
   /// with the given name.
   PropertyAccessorElement getSetter(String name);
 
-  @Deprecated("Use ClassElement.instantiate()")
-  @override
-  InterfaceType instantiate(List<DartType> argumentTypes);
-
   /// Return the element representing the constructor that results from looking
   /// up the constructor with the given [name] in this class with respect to the
   /// given [library], or `null` if the look up fails. The behavior of this
@@ -565,17 +524,6 @@
   PropertyAccessorElement lookUpSetterInSuperclass(
       String name, LibraryElement library);
 
-  @Deprecated("Use ClassElement.instantiate()")
-  @override
-  InterfaceType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes);
-
-  /// Return the type resulting from substituting the given arguments for this
-  /// type's parameters. This is fully equivalent to `substitute2(argumentTypes,
-  /// getTypeArguments())`.
-  @deprecated // use instantiate
-  InterfaceType substitute4(List<DartType> argumentTypes);
-
   /// Returns a "smart" version of the "least upper bound" of the given types.
   ///
   /// If these types have the same element and differ only in terms of the type
@@ -611,16 +559,6 @@
   /// A [FunctionType] has type arguments only if it is a result of a typedef
   /// instantiation, otherwise the result is `null`.
   List<DartType> get typeArguments;
-
-  /// Return a list containing all of the type parameters declared for this
-  /// type.
-  @Deprecated("Use ClassElement.typeParameters or FunctionType.typeFormals")
-  List<TypeParameterElement> get typeParameters;
-
-  /// Return the type resulting from instantiating (replacing) the given
-  /// [argumentTypes] for this type's bound type parameters.
-  @Deprecated("Use ClassElement.instantiate()")
-  ParameterizedType instantiate(List<DartType> argumentTypes);
 }
 
 /// The type introduced by a type parameter.
@@ -644,9 +582,4 @@
 
 /// The special type `void` is used to indicate that the value of an
 /// expression is meaningless, and intended to be discarded.
-abstract class VoidType implements DartType {
-  @override
-  @deprecated
-  VoidType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes);
-}
+abstract class VoidType implements DartType {}
diff --git a/pkg/analyzer/lib/dart/element/type_provider.dart b/pkg/analyzer/lib/dart/element/type_provider.dart
index ecc63f5..f263c27 100644
--- a/pkg/analyzer/lib/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/dart/element/type_provider.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/constant/value.dart';
 
 /// The interface `TypeProvider` defines the behavior of objects that provide
 /// access to types defined by the language.
@@ -50,14 +49,6 @@
   /// Return the type representing 'FutureOr<Null>'.
   InterfaceType get futureOrNullType;
 
-  /// Return the type representing the built-in type 'FutureOr'.
-  @Deprecated('Use futureOrType2() instead.')
-  InterfaceType get futureOrType;
-
-  /// Return the type representing the built-in type 'Future'.
-  @Deprecated('Use futureType2() instead.')
-  InterfaceType get futureType;
-
   /// Return the element representing the built-in class 'int'.
   ClassElement get intElement;
 
@@ -73,27 +64,15 @@
   /// Return the type representing the type 'Iterable<Object>'.
   InterfaceType get iterableObjectType;
 
-  /// Return the type representing the built-in type 'Iterable'.
-  @Deprecated('Use iterableType2() instead.')
-  InterfaceType get iterableType;
-
   /// Return the element representing the built-in class 'List'.
   ClassElement get listElement;
 
-  /// Return the type representing the built-in type 'List'.
-  @Deprecated('Use listType2() instead.')
-  InterfaceType get listType;
-
   /// Return the element representing the built-in class 'Map'.
   ClassElement get mapElement;
 
   /// Return the type representing 'Map<Object, Object>'.
   InterfaceType get mapObjectObjectType;
 
-  /// Return the type representing the built-in type 'Map'.
-  @Deprecated('Use mapType2() instead.')
-  InterfaceType get mapType;
-
   /// Return the type representing the built-in type 'Never'.
   DartType get neverType;
 
@@ -101,18 +80,9 @@
   /// or implemented.
   Set<ClassElement> get nonSubtypableClasses;
 
-  /// Return a list containing all of the types that cannot be either extended
-  /// or implemented.
-  @Deprecated('Use nonSubtypableClasses instead.')
-  List<InterfaceType> get nonSubtypableTypes;
-
   /// Return the element representing the built-in class 'null'.
   ClassElement get nullElement;
 
-  /// Return a [DartObjectImpl] representing the `null` object.
-  @deprecated
-  DartObjectImpl get nullObject;
-
   /// Return the type representing the built-in type 'Null'.
   InterfaceType get nullType;
 
@@ -128,10 +98,6 @@
   /// Return the element representing the built-in class 'Set'.
   ClassElement get setElement;
 
-  /// Return the type representing the built-in type 'Set'.
-  @Deprecated('Use setType2() instead.')
-  InterfaceType get setType;
-
   /// Return the type representing the built-in type 'StackTrace'.
   InterfaceType get stackTraceType;
 
@@ -141,10 +107,6 @@
   /// Return the element representing the built-in class 'Stream'.
   ClassElement get streamElement;
 
-  /// Return the type representing the built-in type 'Stream'.
-  @Deprecated('Use streamType2() instead.')
-  InterfaceType get streamType;
-
   /// Return the element representing the built-in class 'String'.
   ClassElement get stringElement;
 
diff --git a/pkg/analyzer/lib/plugin/embedded_resolver_provider.dart b/pkg/analyzer/lib/plugin/embedded_resolver_provider.dart
deleted file mode 100644
index 7e7a570..0000000
--- a/pkg/analyzer/lib/plugin/embedded_resolver_provider.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2016, 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.
-
-@deprecated
-library analyzer.plugin.embedded_resolver_provider;
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/embedder.dart';
-
-/// A function that will return a [UriResolver] that can be used to resolve
-/// URI's for embedded libraries within a given folder, or `null` if we should
-/// fall back to the standard URI resolver.
-@deprecated
-typedef EmbeddedResolverProvider = EmbedderUriResolver Function(Folder folder);
diff --git a/pkg/analyzer/lib/source/analysis_options_provider.dart b/pkg/analyzer/lib/source/analysis_options_provider.dart
deleted file mode 100644
index a35bfbc..0000000
--- a/pkg/analyzer/lib/source/analysis_options_provider.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2015, 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.
-
-@deprecated
-library analyzer.src.analysis_options.analysis_options_provider;
-
-export 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
diff --git a/pkg/analyzer/lib/source/custom_resolver.dart b/pkg/analyzer/lib/source/custom_resolver.dart
deleted file mode 100644
index 2569313..0000000
--- a/pkg/analyzer/lib/source/custom_resolver.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, 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.
-
-@deprecated
-library analyzer.source.custom_resolver;
-
-export 'package:analyzer/src/source/custom_resolver.dart';
diff --git a/pkg/analyzer/lib/source/embedder.dart b/pkg/analyzer/lib/source/embedder.dart
deleted file mode 100644
index f2cb675..0000000
--- a/pkg/analyzer/lib/source/embedder.dart
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright (c) 2015, 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.
-
-@deprecated
-library analyzer.source.embedder;
-
-import 'dart:collection' show HashMap;
-import 'dart:core';
-import 'dart:io' as io;
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_provider.dart'
-    show PackageMapProvider;
-import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/sdk_io.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart' show FileBasedSource;
-import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
-import 'package:pub_semver/src/version.dart';
-import 'package:yaml/yaml.dart';
-
-export 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
-
-const String _DART_COLON_PREFIX = 'dart:';
-const String _EMBEDDED_LIB_MAP_KEY = 'embedded_libs';
-
-/// Check if this map defines embedded libraries.
-@deprecated
-bool definesEmbeddedLibs(Map map) => map[_EMBEDDED_LIB_MAP_KEY] != null;
-
-/// An SDK backed by URI mappings derived from an `_embedder.yaml` file.
-@deprecated
-class EmbedderSdk extends AbstractDartSdk {
-  final Map<String, String> _urlMappings = HashMap<String, String>();
-
-  EmbedderSdk([Map<Folder, YamlMap> embedderYamls]) {
-    embedderYamls?.forEach(_processEmbedderYaml);
-  }
-
-  @override
-  String get allowedExperimentsJson {
-    return null;
-  }
-
-  @override
-  Version get languageVersion => throw UnimplementedError();
-
-  @override
-  String get sdkVersion => '0';
-
-  /// The url mappings for this SDK.
-  Map<String, String> get urlMappings => _urlMappings;
-
-  @override
-  String getRelativePathFromFile(JavaFile file) => file.getAbsolutePath();
-
-  @deprecated
-  @override
-  PackageBundle getSummarySdkBundle(bool _) => null;
-
-  @override
-  FileBasedSource internalMapDartUri(String dartUri) {
-    String libraryName;
-    String relativePath;
-    int index = dartUri.indexOf('/');
-    if (index >= 0) {
-      libraryName = dartUri.substring(0, index);
-      relativePath = dartUri.substring(index + 1);
-    } else {
-      libraryName = dartUri;
-      relativePath = "";
-    }
-    SdkLibrary library = getSdkLibrary(libraryName);
-    if (library == null) {
-      return null;
-    }
-    String srcPath;
-    if (relativePath.isEmpty) {
-      srcPath = library.path;
-    } else {
-      String libraryPath = library.path;
-      int index = libraryPath.lastIndexOf(io.Platform.pathSeparator);
-      if (index == -1) {
-        index = libraryPath.lastIndexOf('/');
-        if (index == -1) {
-          return null;
-        }
-      }
-      String prefix = libraryPath.substring(0, index + 1);
-      srcPath = '$prefix$relativePath';
-    }
-    String filePath = srcPath.replaceAll('/', io.Platform.pathSeparator);
-    try {
-      JavaFile file = JavaFile(filePath);
-      return FileBasedSource(file, Uri.parse(dartUri));
-    } on FormatException {
-      return null;
-    }
-  }
-
-  /// Install the mapping from [name] to [libDir]/[file].
-  void _processEmbeddedLibs(String name, String file, Folder libDir) {
-    if (!name.startsWith(_DART_COLON_PREFIX)) {
-      // SDK libraries must begin with 'dart:'.
-      return;
-    }
-    String libPath = libDir.canonicalizePath(file);
-    _urlMappings[name] = libPath;
-    SdkLibraryImpl library = SdkLibraryImpl(name);
-    library.path = libPath;
-    libraryMap.setLibrary(name, library);
-  }
-
-  /// Given the 'embedderYamls' from [EmbedderYamlLocator] check each one for the
-  /// top level key 'embedded_libs'. Under the 'embedded_libs' key are key value
-  /// pairs. Each key is a 'dart:' library uri and each value is a path
-  /// (relative to the directory containing `_embedder.yaml`) to a dart script
-  /// for the given library. For example:
-  ///
-  /// embedded_libs:
-  ///   'dart:io': '../../sdk/io/io.dart'
-  ///
-  /// If a key doesn't begin with `dart:` it is ignored.
-  void _processEmbedderYaml(Folder libDir, YamlMap map) {
-    YamlNode embedded_libs = map[_EMBEDDED_LIB_MAP_KEY];
-    if (embedded_libs is YamlMap) {
-      embedded_libs.forEach((k, v) => _processEmbeddedLibs(k, v, libDir));
-    }
-  }
-}
-
-/// Given the 'embedderYamls' from [EmbedderYamlLocator] check each one for the
-/// top level key 'embedded_libs'. Under the 'embedded_libs' key are key value
-/// pairs. Each key is a 'dart:' library uri and each value is a path
-/// (relative to the directory containing `_embedder.yaml`) to a dart script
-/// for the given library. For example:
-///
-/// embedded_libs:
-///   'dart:io': '../../sdk/io/io.dart'
-///
-/// If a key doesn't begin with `dart:` it is ignored.
-///
-/// This class is deprecated; use DartUriResolver directly. In particular, if
-/// there used to be an instance creation of the form:
-///
-/// ```
-/// new EmbedderUriResolver(embedderMap)
-/// ```
-///
-/// This should be replaced by
-///
-/// ```
-/// new DartUriResolver(new EmbedderSdk(embedderMap))
-/// ```
-@deprecated
-class EmbedderUriResolver implements DartUriResolver {
-  EmbedderSdk _embedderSdk;
-  DartUriResolver _dartUriResolver;
-
-  /// Construct a [EmbedderUriResolver] from a package map
-  /// (see [PackageMapProvider]).
-  EmbedderUriResolver(Map<Folder, YamlMap> embedderMap)
-      : this._forSdk(EmbedderSdk(embedderMap));
-
-  /// (Provisional API.)
-  EmbedderUriResolver._forSdk(this._embedderSdk) {
-    _dartUriResolver = DartUriResolver(_embedderSdk);
-  }
-
-  @override
-  DartSdk get dartSdk => _embedderSdk;
-
-  /// Number of embedded libraries.
-  int get length => _embedderSdk?.urlMappings?.length ?? 0;
-
-  @override
-  void clearCache() {}
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) =>
-      _dartUriResolver.resolveAbsolute(uri, actualUri);
-
-  @override
-  Uri restoreAbsolute(Source source) {
-    String path = source.fullName;
-    if (path.length > 3 && path[1] == ':' && path[2] == '\\') {
-      path = '/${path[0]}:${path.substring(2).replaceAll('\\', '/')}';
-    }
-    Source sdkSource = dartSdk.fromFileUri(Uri.parse('file://$path'));
-    return sdkSource?.uri;
-  }
-}
diff --git a/pkg/analyzer/lib/source/package_map_provider.dart b/pkg/analyzer/lib/source/package_map_provider.dart
deleted file mode 100644
index 2c33ab5..0000000
--- a/pkg/analyzer/lib/source/package_map_provider.dart
+++ /dev/null
@@ -1,8 +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.
-
-@deprecated
-library analyzer.source.package_map_provider;
-
-export 'package:analyzer/src/source/package_map_provider.dart';
diff --git a/pkg/analyzer/lib/source/package_map_resolver.dart b/pkg/analyzer/lib/source/package_map_resolver.dart
deleted file mode 100644
index cf65834..0000000
--- a/pkg/analyzer/lib/source/package_map_resolver.dart
+++ /dev/null
@@ -1,8 +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.
-
-@deprecated
-library src.source.package_map_provider;
-
-export 'package:analyzer/src/source/package_map_resolver.dart';
diff --git a/pkg/analyzer/lib/source/path_filter.dart b/pkg/analyzer/lib/source/path_filter.dart
deleted file mode 100644
index 26ecec2..0000000
--- a/pkg/analyzer/lib/source/path_filter.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2015, 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.
-
-@deprecated
-library analyzer.source.path_filter;
-
-export 'package:analyzer/src/source/path_filter.dart';
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 6b0199c..8f23b6e 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -54,7 +54,7 @@
   }
 }
 
-/// Use the command-line [args] to create a context builder.
+/// Use the command-line [args] to create a context builder options.
 ContextBuilderOptions createContextBuilderOptions(
   ResourceProvider resourceProvider,
   ArgResults args,
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index c5bdfd4..78b0a00 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -40,12 +40,6 @@
     throw StateError('Cannot be changed.');
   }
 
-  @Deprecated('Use LibraryElement.typeProvider')
-  @override
-  TypeProvider get typeProvider {
-    return _synchronousSession.typeProvider;
-  }
-
   TypeProviderImpl get typeProviderLegacy {
     return _synchronousSession.typeProviderLegacy;
   }
@@ -54,12 +48,6 @@
     return _synchronousSession.typeProviderNonNullableByDefault;
   }
 
-  @Deprecated('Use LibraryElement.typeSystem')
-  @override
-  TypeSystemImpl get typeSystem {
-    return _synchronousSession.typeSystem;
-  }
-
   TypeSystemImpl get typeSystemLegacy {
     return _synchronousSession.typeSystemLegacy;
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index e4c6c31..db71f9e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -4,29 +4,14 @@
 
 import 'dart:collection';
 
-import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/context_locator.dart';
 import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart'
     show PhysicalResourceProvider;
-import 'package:analyzer/src/context/builder.dart'
-    show ContextBuilder, ContextBuilderOptions;
-import 'package:analyzer/src/context/context_root.dart' as old;
-import 'package:analyzer/src/dart/analysis/byte_store.dart'
-    show MemoryByteStore;
 import 'package:analyzer/src/dart/analysis/context_root.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart'
-    show AnalysisDriver, AnalysisDriverScheduler;
-import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
-import 'package:analyzer/src/dart/analysis/file_state.dart'
-    show FileContentOverlay;
-import 'package:analyzer/src/dart/analysis/performance_logger.dart'
-    show PerformanceLog;
-import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/util/yaml.dart';
-import 'package:cli_util/cli_util.dart';
 import 'package:glob/glob.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart';
@@ -56,53 +41,6 @@
       : resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE;
 
-  @deprecated
-  @override
-  List<AnalysisContext> locateContexts(
-      {@required List<String> includedPaths,
-      List<String> excludedPaths = const <String>[],
-      String optionsFile,
-      String packagesFile,
-      String sdkPath}) {
-    // TODO(scheglov) Remove this, and make `sdkPath` required.
-    sdkPath ??= getSdkPath();
-    ArgumentError.checkNotNull(sdkPath, 'sdkPath');
-
-    List<ContextRoot> roots = locateRoots(
-        includedPaths: includedPaths,
-        excludedPaths: excludedPaths,
-        optionsFile: optionsFile,
-        packagesFile: packagesFile);
-    if (roots.isEmpty) {
-      return const <AnalysisContext>[];
-    }
-    PerformanceLog performanceLog = PerformanceLog(StringBuffer());
-    AnalysisDriverScheduler scheduler = AnalysisDriverScheduler(performanceLog);
-    DartSdkManager sdkManager = DartSdkManager(sdkPath);
-    scheduler.start();
-    ContextBuilderOptions options = ContextBuilderOptions();
-    ContextBuilder builder =
-        ContextBuilder(resourceProvider, sdkManager, null, options: options);
-    if (packagesFile != null) {
-      options.defaultPackageFilePath = packagesFile;
-    }
-    builder.analysisDriverScheduler = scheduler;
-    builder.byteStore = MemoryByteStore();
-    builder.fileContentOverlay = FileContentOverlay();
-    builder.performanceLog = performanceLog;
-    List<AnalysisContext> contextList = <AnalysisContext>[];
-    for (ContextRoot root in roots) {
-      old.ContextRoot contextRoot = old.ContextRoot(
-          root.root.path, root.excludedPaths.toList(),
-          pathContext: resourceProvider.pathContext);
-      AnalysisDriver driver = builder.buildDriver(contextRoot);
-      DriverBasedAnalysisContext context =
-          DriverBasedAnalysisContext(resourceProvider, root, driver);
-      contextList.add(context);
-    }
-    return contextList;
-  }
-
   @override
   List<ContextRoot> locateRoots(
       {@required List<String> includedPaths,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart b/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
index 582a366..d02bc2c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
@@ -39,31 +39,11 @@
   @override
   AnalysisSession get currentSession => driver.currentSession;
 
-  @deprecated
-  @override
-  List<String> get excludedPaths => contextRoot.excludedPaths.toList();
-
-  @deprecated
-  @override
-  List<String> get includedPaths => contextRoot.includedPaths.toList();
-
   @override
   Workspace get workspace {
     return _workspace ??= _buildWorkspace();
   }
 
-  @deprecated
-  @override
-  Iterable<String> analyzedFiles() {
-    return contextRoot.analyzedFiles();
-  }
-
-  @deprecated
-  @override
-  bool isAnalyzed(String path) {
-    return contextRoot.isAnalyzed(path);
-  }
-
   Workspace _buildWorkspace() {
     String path = contextRoot.root.path;
     ContextBuilder builder = ContextBuilder(
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
index 55d1a34..00f7f52 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
@@ -33,7 +33,7 @@
   static final Version currentVersion = Version.parse(_currentVersion);
 
   /// A map containing information about all known experimental flags.
-  static const Map<String, ExperimentalFeature> knownFeatures = _knownFeatures;
+  static final Map<String, ExperimentalFeature> knownFeatures = _knownFeatures;
 
   final List<bool> _enableFlags;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index d09c2fe..17dec4d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -11,7 +11,7 @@
 const _currentVersion = '2.10.0';
 
 /// A map containing information about all known experimental flags.
-const _knownFeatures = <String, ExperimentalFeature>{
+final _knownFeatures = <String, ExperimentalFeature>{
   EnableString.constant_update_2018: ExperimentalFeatures.constant_update_2018,
   EnableString.control_flow_collections:
       ExperimentalFeatures.control_flow_collections,
@@ -74,94 +74,104 @@
 }
 
 class ExperimentalFeatures {
-  static const constant_update_2018 = ExperimentalFeature(
+  static final constant_update_2018 = ExperimentalFeature(
     index: 0,
     enableString: EnableString.constant_update_2018,
     isEnabledByDefault: IsEnabledByDefault.constant_update_2018,
     isExpired: IsExpired.constant_update_2018,
     documentation: 'Enhanced constant expressions',
-    firstSupportedVersion: '2.4.1',
+    experimentalReleaseVersion: null,
+    releaseVersion: Version.parse('2.4.1'),
   );
 
-  static const control_flow_collections = ExperimentalFeature(
+  static final control_flow_collections = ExperimentalFeature(
     index: 1,
     enableString: EnableString.control_flow_collections,
     isEnabledByDefault: IsEnabledByDefault.control_flow_collections,
     isExpired: IsExpired.control_flow_collections,
     documentation: 'Control Flow Collections',
-    firstSupportedVersion: '2.2.2',
+    experimentalReleaseVersion: null,
+    releaseVersion: Version.parse('2.2.2'),
   );
 
-  static const extension_methods = ExperimentalFeature(
+  static final extension_methods = ExperimentalFeature(
     index: 2,
     enableString: EnableString.extension_methods,
     isEnabledByDefault: IsEnabledByDefault.extension_methods,
     isExpired: IsExpired.extension_methods,
     documentation: 'Extension Methods',
-    firstSupportedVersion: '2.6.0',
+    experimentalReleaseVersion: null,
+    releaseVersion: Version.parse('2.6.0'),
   );
 
-  static const non_nullable = ExperimentalFeature(
+  static final non_nullable = ExperimentalFeature(
     index: 3,
     enableString: EnableString.non_nullable,
     isEnabledByDefault: IsEnabledByDefault.non_nullable,
     isExpired: IsExpired.non_nullable,
     documentation: 'Non Nullable by default',
-    firstSupportedVersion: null,
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
   );
 
-  static const nonfunction_type_aliases = ExperimentalFeature(
+  static final nonfunction_type_aliases = ExperimentalFeature(
     index: 4,
     enableString: EnableString.nonfunction_type_aliases,
     isEnabledByDefault: IsEnabledByDefault.nonfunction_type_aliases,
     isExpired: IsExpired.nonfunction_type_aliases,
     documentation: 'Type aliases define a <type>, not just a <functionType>',
-    firstSupportedVersion: null,
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
   );
 
-  static const set_literals = ExperimentalFeature(
+  static final set_literals = ExperimentalFeature(
     index: 5,
     enableString: EnableString.set_literals,
     isEnabledByDefault: IsEnabledByDefault.set_literals,
     isExpired: IsExpired.set_literals,
     documentation: 'Set Literals',
-    firstSupportedVersion: '2.2.0',
+    experimentalReleaseVersion: null,
+    releaseVersion: Version.parse('2.2.0'),
   );
 
-  static const spread_collections = ExperimentalFeature(
+  static final spread_collections = ExperimentalFeature(
     index: 6,
     enableString: EnableString.spread_collections,
     isEnabledByDefault: IsEnabledByDefault.spread_collections,
     isExpired: IsExpired.spread_collections,
     documentation: 'Spread Collections',
-    firstSupportedVersion: '2.2.2',
+    experimentalReleaseVersion: null,
+    releaseVersion: Version.parse('2.2.2'),
   );
 
-  static const triple_shift = ExperimentalFeature(
+  static final triple_shift = ExperimentalFeature(
     index: 7,
     enableString: EnableString.triple_shift,
     isEnabledByDefault: IsEnabledByDefault.triple_shift,
     isExpired: IsExpired.triple_shift,
     documentation: 'Triple-shift operator',
-    firstSupportedVersion: null,
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
   );
 
-  static const value_class = ExperimentalFeature(
+  static final value_class = ExperimentalFeature(
     index: 8,
     enableString: EnableString.value_class,
     isEnabledByDefault: IsEnabledByDefault.value_class,
     isExpired: IsExpired.value_class,
     documentation: 'Value class',
-    firstSupportedVersion: null,
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
   );
 
-  static const variance = ExperimentalFeature(
+  static final variance = ExperimentalFeature(
     index: 9,
     enableString: EnableString.variance,
     isEnabledByDefault: IsEnabledByDefault.variance,
     isExpired: IsExpired.variance,
     documentation: 'Sound variance',
-    firstSupportedVersion: null,
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
   );
 }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart b/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
index 7b32e40..d3b9853 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
@@ -127,8 +127,8 @@
 
   flags = List.from(flags);
   for (var feature in _knownFeatures.values) {
-    var firstSupportedVersion = feature.firstSupportedVersion;
-    if (firstSupportedVersion == null || firstSupportedVersion > version) {
+    var releaseVersion = feature.releaseVersion;
+    if (releaseVersion == null || releaseVersion > version) {
       flags[feature.index] = false;
     }
   }
@@ -299,20 +299,25 @@
   /// Documentation for the feature, if known.  `null` for expired flags.
   final String documentation;
 
-  final String _firstSupportedVersion;
+  /// The first language version in which this feature can be enabled using
+  /// the [enableString] experimental flag.
+  final Version experimentalReleaseVersion;
 
-  const ExperimentalFeature({
+  @override
+  final Version releaseVersion;
+
+  ExperimentalFeature({
     @required this.index,
     @required this.enableString,
     @required this.isEnabledByDefault,
     @required this.isExpired,
     @required this.documentation,
-    @required String firstSupportedVersion,
-  })  : _firstSupportedVersion = firstSupportedVersion,
-        assert(index != null),
+    @required this.experimentalReleaseVersion,
+    @required this.releaseVersion,
+  })  : assert(index != null),
         assert(isEnabledByDefault
-            ? firstSupportedVersion != null
-            : firstSupportedVersion == null),
+            ? releaseVersion != null
+            : releaseVersion == null),
         assert(enableString != null);
 
   /// The string to disable the feature.
@@ -322,15 +327,6 @@
   String get experimentalFlag => isExpired ? null : enableString;
 
   @override
-  Version get firstSupportedVersion {
-    if (_firstSupportedVersion == null) {
-      return null;
-    } else {
-      return Version.parse(_firstSupportedVersion);
-    }
-  }
-
-  @override
   FeatureStatus get status {
     if (isExpired) {
       if (isEnabledByDefault) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index d343115..78df548 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/dart/analysis/uri_converter.dart';
 import 'package:analyzer/src/dart/element/class_hierarchy.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
@@ -27,12 +26,6 @@
   /// The analysis driver performing analysis for this session.
   final driver.AnalysisDriver _driver;
 
-  /// The type provider being used by the analysis driver.
-  TypeProvider _typeProvider;
-
-  /// The type system being used by the analysis driver.
-  TypeSystemImpl _typeSystem;
-
   /// The URI converter used to convert between URI's and file paths.
   UriConverter _uriConverter;
 
@@ -55,41 +48,6 @@
   ResourceProvider get resourceProvider => _driver.resourceProvider;
 
   @override
-  SourceFactory get sourceFactory => _driver.sourceFactory;
-
-  @Deprecated('Use LibraryElement.typeProvider')
-  @override
-  Future<TypeProvider> get typeProvider async {
-    _checkConsistency();
-    if (_typeProvider == null) {
-      LibraryElement coreLibrary = await _driver.getLibraryByUri('dart:core');
-      LibraryElement asyncLibrary = await _driver.getLibraryByUri('dart:async');
-      _typeProvider = TypeProviderImpl(
-        coreLibrary: coreLibrary,
-        asyncLibrary: asyncLibrary,
-        isNonNullableByDefault: false,
-      );
-    }
-    return _typeProvider;
-  }
-
-  @Deprecated('Use LibraryElement.typeSystem')
-  @override
-  Future<TypeSystemImpl> get typeSystem async {
-    _checkConsistency();
-    if (_typeSystem == null) {
-      var typeProvider = await this.typeProvider;
-      _typeSystem = TypeSystemImpl(
-        implicitCasts: true,
-        isNonNullableByDefault: false,
-        strictInference: false,
-        typeProvider: typeProvider,
-      );
-    }
-    return _typeSystem;
-  }
-
-  @override
   UriConverter get uriConverter {
     return _uriConverter ??= DriverBasedUriConverter(_driver);
   }
@@ -126,14 +84,6 @@
     return libraryElement;
   }
 
-  @deprecated
-  @override
-  Future<ParseResult> getParsedAst(String path) async => getParsedUnit(path);
-
-  @deprecated
-  @override
-  ParseResult getParsedAstSync(String path) => getParsedUnit(path);
-
   @override
   ParsedLibraryResult getParsedLibrary(String path) {
     _checkConsistency();
@@ -153,10 +103,6 @@
     return _driver.parseFileSync(path);
   }
 
-  @deprecated
-  @override
-  Future<ResolveResult> getResolvedAst(String path) => getResolvedUnit(path);
-
   @override
   Future<ResolvedLibraryResult> getResolvedLibrary(String path) {
     _checkConsistency();
@@ -244,9 +190,6 @@
     );
   }
 
-  @Deprecated('Use LibraryElement.typeProvider')
-  TypeProvider get typeProvider => _typeProviderLegacy;
-
   TypeProvider get typeProviderLegacy {
     return _typeProviderLegacy;
   }
@@ -255,11 +198,6 @@
     return _typeProviderNonNullableByDefault;
   }
 
-  @Deprecated('Use LibraryElement.typeSystem')
-  TypeSystemImpl get typeSystem {
-    return typeSystemLegacy;
-  }
-
   TypeSystemImpl get typeSystemLegacy {
     return _typeSystemLegacy;
   }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 64c12b9..0fb6861 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -2304,16 +2304,6 @@
   @override
   Token get endToken => _uri.endToken;
 
-  @deprecated
-  @override
-  StringLiteral get libraryUri => _uri;
-
-  @deprecated
-  @override
-  set libraryUri(StringLiteral libraryUri) {
-    _uri = _becomeParentOf(libraryUri as StringLiteralImpl);
-  }
-
   @override
   DottedName get name => _name;
 
@@ -2485,12 +2475,6 @@
     ..add(_redirectedConstructor)
     ..add(_body);
 
-  @deprecated
-  @override
-  set element(ConstructorElement element) {
-    declaredElement = element;
-  }
-
   @override
   Token get endToken {
     if (_body != null) {
@@ -4346,7 +4330,7 @@
   @override
   bool get isRequiredPositional => kind.isRequiredPositional;
 
-  @override
+  /// Return the kind of this parameter.
   ParameterKind get kind;
 }
 
@@ -4930,12 +4914,6 @@
   Iterable<SyntacticEntity> get childEntities =>
       ChildEntities()..add(_parameters)..add(_body);
 
-  @deprecated
-  @override
-  set element(ExecutableElement element) {
-    declaredElement = element;
-  }
-
   @override
   Token get endToken {
     if (_body != null) {
@@ -6051,14 +6029,6 @@
   @override
   Precedence get precedence => Precedence.primary;
 
-  @Deprecated('Use constructorName.staticElement')
-  @override
-  ConstructorElement get staticElement => constructorName.staticElement;
-
-  @Deprecated('Use constructorName.staticElement')
-  @override
-  set staticElement(ConstructorElement staticElement) {}
-
   /// Return the type arguments associated with the constructor, rather than
   /// with the class in which the constructor is defined. It is always an error
   /// if there are type arguments because Dart doesn't currently support generic
@@ -7384,16 +7354,6 @@
   @override
   Token get firstTokenAfterCommentAndMetadata => keyword;
 
-  @deprecated
-  @override
-  Source get source => selectedSource;
-
-  @deprecated
-  @override
-  set source(Source source) {
-    selectedSource = source;
-  }
-
   @override
   LibraryElement get uriElement;
 }
@@ -7498,7 +7458,7 @@
 /// A list of AST nodes that have a common parent.
 class NodeListImpl<E extends AstNode> with ListMixin<E> implements NodeList<E> {
   /// The node that is the parent of each of the elements in the list.
-  AstNodeImpl _owner;
+  final AstNodeImpl _owner;
 
   /// The elements contained in the list.
   List<E> _elements = <E>[];
@@ -7530,7 +7490,6 @@
   @override
   int get length => _elements.length;
 
-  @deprecated // Never intended for public use.
   @override
   set length(int newLength) {
     throw UnsupportedError("Cannot resize NodeList.");
@@ -7540,11 +7499,6 @@
   AstNode get owner => _owner;
 
   @override
-  set owner(AstNode value) {
-    _owner = value as AstNodeImpl;
-  }
-
-  @override
   E operator [](int index) {
     if (index < 0 || index >= _elements.length) {
       throw RangeError("Index: $index, Size: ${_elements.length}");
@@ -10398,16 +10352,6 @@
     _uri = _becomeParentOf(uri);
   }
 
-  @deprecated
-  @override
-  Source get source => uriSource;
-
-  @deprecated
-  @override
-  set source(Source source) {
-    uriSource = source;
-  }
-
   @override
   StringLiteral get uri => _uri;
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index c51e550..8e1fd6a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -387,16 +387,6 @@
       ExtensionOverrideImpl(extensionName, typeArguments, argumentList);
 
   @override
-  FieldDeclaration fieldDeclaration(
-          Comment comment,
-          List<Annotation> metadata,
-          Token staticKeyword,
-          VariableDeclarationList fieldList,
-          Token semicolon) =>
-      FieldDeclarationImpl(comment, metadata, null, null, null, staticKeyword,
-          fieldList, semicolon);
-
-  @override
   FieldDeclaration fieldDeclaration2(
           {Comment comment,
           List<Annotation> metadata,
@@ -410,20 +400,6 @@
           externalKeyword, staticKeyword, fieldList, semicolon);
 
   @override
-  FieldFormalParameter fieldFormalParameter(
-          Comment comment,
-          List<Annotation> metadata,
-          Token keyword,
-          TypeAnnotation type,
-          Token thisKeyword,
-          Token period,
-          SimpleIdentifier identifier,
-          TypeParameterList typeParameters,
-          FormalParameterList parameters) =>
-      FieldFormalParameterImpl(comment, metadata, null, null, keyword, type,
-          thisKeyword, period, identifier, typeParameters, parameters, null);
-
-  @override
   FieldFormalParameter fieldFormalParameter2(
           {Comment comment,
           List<Annotation> metadata,
@@ -559,17 +535,6 @@
           typeParameters, parameters, semicolon);
 
   @override
-  FunctionTypedFormalParameter functionTypedFormalParameter(
-          Comment comment,
-          List<Annotation> metadata,
-          TypeAnnotation returnType,
-          SimpleIdentifier identifier,
-          TypeParameterList typeParameters,
-          FormalParameterList parameters) =>
-      FunctionTypedFormalParameterImpl(comment, metadata, null, null,
-          returnType, identifier, typeParameters, parameters, null);
-
-  @override
   FunctionTypedFormalParameter functionTypedFormalParameter2(
           {Comment comment,
           List<Annotation> metadata,
@@ -674,13 +639,6 @@
           semicolon);
 
   @override
-  @Deprecated('Use indexExpressionForCascade2')
-  IndexExpression indexExpressionForCascade(Token period, Token leftBracket,
-          Expression index, Token rightBracket) =>
-      IndexExpressionImpl.forCascade(
-          period, null, leftBracket, index, rightBracket);
-
-  @override
   IndexExpression indexExpressionForCascade2(
           {@required Token period,
           Token question,
@@ -691,13 +649,6 @@
           period, question, leftBracket, index, rightBracket);
 
   @override
-  @Deprecated('Use indexExpressionForTarget2')
-  IndexExpression indexExpressionForTarget(Expression target, Token leftBracket,
-          Expression index, Token rightBracket) =>
-      IndexExpressionImpl.forTarget(
-          target, null, leftBracket, index, rightBracket);
-
-  @override
   IndexExpression indexExpressionForTarget2(
           {@required Expression target,
           Token question,
@@ -926,16 +877,6 @@
       ShowCombinatorImpl(keyword, shownNames);
 
   @override
-  SimpleFormalParameter simpleFormalParameter(
-          Comment comment,
-          List<Annotation> metadata,
-          Token keyword,
-          TypeAnnotation type,
-          SimpleIdentifier identifier) =>
-      SimpleFormalParameterImpl(
-          comment, metadata, null, null, keyword, type, identifier);
-
-  @override
   SimpleFormalParameter simpleFormalParameter2(
           {Comment comment,
           List<Annotation> metadata,
diff --git a/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart b/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart
index 9ee0a70..c1260a8 100644
--- a/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart
+++ b/pkg/analyzer/lib/src/dart/constant/from_environment_evaluator.dart
@@ -18,40 +18,6 @@
   FromEnvironmentEvaluator(this._typeSystem, this._declaredVariables);
 
   /// Return the value of the variable with the given [name] interpreted as a
-  /// 'boolean' value. If the variable is not defined (or [name] is `null`), a
-  /// DartObject representing "unknown" is returned. If the value cannot be
-  /// parsed as a boolean, a DartObject representing 'null' is returned.
-  @Deprecated("Clients don't need this functionality")
-  DartObject getBool(String name) {
-    String value = _declaredVariables.get(name);
-    if (value == null) {
-      return DartObjectImpl(
-        _typeSystem,
-        _typeSystem.typeProvider.boolType,
-        BoolState.UNKNOWN_VALUE,
-      );
-    }
-    if (value == "true") {
-      return DartObjectImpl(
-        _typeSystem,
-        _typeSystem.typeProvider.boolType,
-        BoolState.TRUE_STATE,
-      );
-    } else if (value == "false") {
-      return DartObjectImpl(
-        _typeSystem,
-        _typeSystem.typeProvider.boolType,
-        BoolState.FALSE_STATE,
-      );
-    }
-    return DartObjectImpl(
-      _typeSystem,
-      _typeSystem.typeProvider.nullType,
-      NullState.NULL_STATE,
-    );
-  }
-
-  /// Return the value of the variable with the given [name] interpreted as a
   /// 'boolean' value. If the variable is not defined, or the value cannot be
   /// parsed as a boolean, return the default value from [namedValues]. If no
   /// default value, return the default value of the default value from
@@ -85,37 +51,6 @@
   }
 
   /// Return the value of the variable with the given [name] interpreted as an
-  /// integer value. If the variable is not defined (or [name] is `null`), a
-  /// DartObject representing "unknown" is returned. If the value cannot be
-  /// parsed as an integer, a DartObject representing 'null' is returned.
-  @Deprecated("Clients don't need this functionality")
-  DartObject getInt(String name) {
-    String value = _declaredVariables.get(name);
-    if (value == null) {
-      return DartObjectImpl(
-        _typeSystem,
-        _typeSystem.typeProvider.intType,
-        IntState.UNKNOWN_VALUE,
-      );
-    }
-    int bigInteger;
-    try {
-      bigInteger = int.parse(value);
-    } on FormatException {
-      return DartObjectImpl(
-        _typeSystem,
-        _typeSystem.typeProvider.nullType,
-        NullState.NULL_STATE,
-      );
-    }
-    return DartObjectImpl(
-      _typeSystem,
-      _typeSystem.typeProvider.intType,
-      IntState(bigInteger),
-    );
-  }
-
-  /// Return the value of the variable with the given [name] interpreted as an
   /// integer value. If the variable is not defined, or the value cannot be
   /// parsed as an integer, return the default value from [namedValues]. If no
   /// default value, return the default value of the default value from
@@ -158,28 +93,6 @@
   }
 
   /// Return the value of the variable with the given [name] interpreted as a
-  /// String value, or `null` if the variable is not defined. Return the value
-  /// of the variable with the given name interpreted as a String value. If the
-  /// variable is not defined (or [name] is `null`), a DartObject representing
-  /// "unknown" is returned.
-  @Deprecated("Clients don't need this functionality")
-  DartObject getString(String name) {
-    String value = _declaredVariables.get(name);
-    if (value == null) {
-      return DartObjectImpl(
-        _typeSystem,
-        _typeSystem.typeProvider.stringType,
-        StringState.UNKNOWN_VALUE,
-      );
-    }
-    return DartObjectImpl(
-      _typeSystem,
-      _typeSystem.typeProvider.stringType,
-      StringState(value),
-    );
-  }
-
-  /// Return the value of the variable with the given [name] interpreted as a
   /// string value. If the variable is not defined, or the value cannot be
   /// parsed as a boolean, return the default value from [namedValues]. If no
   /// default value, return the default value of the default value from
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index b98042d..de0249e 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -215,20 +215,6 @@
     );
   }
 
-  @Deprecated('Use TypeSystem.instantiateToBounds2() instead')
-  @override
-  InterfaceType instantiateToBounds({
-    @required NullabilitySuffix nullabilitySuffix,
-  }) {
-    var typeArguments = typeParameters.map((typeParameter) {
-      return (typeParameter as TypeParameterElementImpl).defaultType;
-    }).toList();
-    return instantiate(
-      typeArguments: typeArguments,
-      nullabilitySuffix: nullabilitySuffix,
-    );
-  }
-
   @override
   MethodElement lookUpConcreteMethod(
           String methodName, LibraryElement library) =>
@@ -470,9 +456,6 @@
   /// The superclass of the class, or `null` for [Object].
   InterfaceType _supertype;
 
-  /// The type defined by the class.
-  InterfaceType _type;
-
   /// A list containing all of the mixins that are applied to the class being
   /// extended in order to derive the superclass of this class.
   List<InterfaceType> _mixins;
@@ -688,16 +671,6 @@
     return definingClass != null && !definingClass.isDartCoreObject;
   }
 
-  @Deprecated('It was used internally, should not be part of API')
-  @override
-  bool get hasReferenceToSuper => hasModifier(Modifier.REFERENCES_SUPER);
-
-  /// Set whether this class references 'super'.
-  /// TODO(scheglov) Remove it.
-  set hasReferenceToSuper(bool isReferencedSuper) {
-    setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper);
-  }
-
   @override
   bool get hasStaticMember {
     for (MethodElement method in methods) {
@@ -772,12 +745,6 @@
   }
 
   @override
-  bool get isOrInheritsProxy => false;
-
-  @override
-  bool get isProxy => false;
-
-  @override
   bool get isSimplyBounded {
     if (linkedNode != null) {
       return linkedContext.isSimplyBounded(linkedNode);
@@ -910,22 +877,6 @@
     _supertype = supertype;
   }
 
-  @override
-  @deprecated
-  InterfaceType get type {
-    if (_type == null) {
-      var typeArguments = typeParameters
-          .map((e) => e.instantiate(nullabilitySuffix: _noneOrStarSuffix))
-          .toList();
-      _type = InterfaceTypeImpl(
-        element: this,
-        typeArguments: typeArguments,
-        nullabilitySuffix: NullabilitySuffix.star,
-      );
-    }
-    return _type;
-  }
-
   /// Set the type parameters defined for this class to the given
   /// [typeParameters].
   set typeParameters(List<TypeParameterElement> typeParameters) {
@@ -2177,7 +2128,6 @@
       parameters: parameters,
       returnType: returnType,
       nullabilitySuffix: _noneOrStarSuffix,
-      element: this,
     );
   }
 
@@ -2318,9 +2268,6 @@
   ElementKind get kind => ElementKind.DYNAMIC;
 
   @override
-  DartType get type => DynamicTypeImpl.instance;
-
-  @override
   T accept<T>(ElementVisitor<T> visitor) => null;
 }
 
@@ -3039,16 +2986,6 @@
     }
   }
 
-  @Deprecated('Use either thisOrAncestorMatching or thisOrAncestorOfType')
-  @override
-  E getAncestor<E extends Element>(Predicate<Element> predicate) {
-    var ancestor = _enclosingElement;
-    while (ancestor != null && !predicate(ancestor)) {
-      ancestor = ancestor.enclosingElement;
-    }
-    return ancestor as E;
-  }
-
   /// Return the child of this element that is uniquely identified by the given
   /// [identifier], or `null` if there is no such child.
   ElementImpl getChild(String identifier) => null;
@@ -3311,9 +3248,6 @@
 
 /// An [AbstractClassElementImpl] which is an enum.
 class EnumElementImpl extends AbstractClassElementImpl {
-  /// The type defined by the enum.
-  InterfaceType _type;
-
   /// Initialize a newly created class element to have the given [name] at the
   /// given [offset] in the file that contains the declaration of this element.
   EnumElementImpl(String name, int offset) : super(name, offset);
@@ -3397,10 +3331,6 @@
   @override
   bool get hasNonFinalField => false;
 
-  @Deprecated('It was used internally, should not be part of API')
-  @override
-  bool get hasReferenceToSuper => false;
-
   @override
   bool get hasStaticMember => true;
 
@@ -3417,12 +3347,6 @@
   bool get isMixinApplication => false;
 
   @override
-  bool get isOrInheritsProxy => false;
-
-  @override
-  bool get isProxy => false;
-
-  @override
   bool get isSimplyBounded => true;
 
   @override
@@ -3465,20 +3389,6 @@
   InterfaceType get supertype => library.typeProvider.objectType;
 
   @override
-  @deprecated
-  InterfaceType get type {
-    if (_type == null) {
-      var typeArguments = const <DartType>[];
-      _type = InterfaceTypeImpl(
-        element: this,
-        typeArguments: typeArguments,
-        nullabilitySuffix: NullabilitySuffix.star,
-      );
-    }
-    return _type;
-  }
-
-  @override
   List<TypeParameterElement> get typeParameters =>
       const <TypeParameterElement>[];
 
@@ -3767,7 +3677,6 @@
   FunctionType get typeInternal {
     if (_type != null) return _type;
 
-    // TODO(scheglov) Remove "element" in the breaking changes branch.
     return _type = FunctionTypeImpl(
       typeFormals: typeParameters,
       parameters: parameters,
@@ -4570,7 +4479,6 @@
   FunctionType get typeInternal {
     if (_type != null) return _type;
 
-    // TODO(scheglov) Remove "element" in the breaking changes branch.
     return _type = FunctionTypeImpl(
       typeFormals: typeParameters,
       parameters: parameters,
@@ -4625,13 +4533,10 @@
 /// Clients may not extend, implement or mix-in this class.
 class GenericTypeAliasElementImpl extends ElementImpl
     with TypeParameterizedElementMixin
-    implements GenericTypeAliasElement, ElementImplWithFunctionType {
+    implements GenericTypeAliasElement {
   /// The element representing the generic function type.
   GenericFunctionTypeElementImpl _function;
 
-  /// The type of function defined by this type alias.
-  FunctionType _type;
-
   /// Initialize a newly created type alias element to have the given [name].
   GenericTypeAliasElementImpl(String name, int offset) : super(name, offset);
 
@@ -4755,48 +4660,6 @@
     return super.nameOffset;
   }
 
-  @override
-  List<ParameterElement> get parameters =>
-      function?.parameters ?? const <ParameterElement>[];
-
-  @override
-  DartType get returnType =>
-      ElementTypeProvider.current.getExecutableReturnType(this);
-
-  @override
-  DartType get returnTypeInternal {
-    if (function == null) {
-      return DynamicTypeImpl.instance;
-    }
-    return function?.returnType;
-  }
-
-  @override
-  @deprecated
-  FunctionType get type => ElementTypeProvider.current.getExecutableType(this);
-
-  set type(FunctionType type) {
-    _type = type;
-  }
-
-  @override
-  @deprecated
-  FunctionType get typeInternal {
-    _type ??= FunctionTypeImpl.synthetic(
-      function.returnType,
-      typeParameters,
-      function.parameters,
-      element: this,
-      typeArguments: typeParameters.map((e) {
-        return e.instantiate(
-          nullabilitySuffix: NullabilitySuffix.star,
-        );
-      }).toList(),
-      nullabilitySuffix: NullabilitySuffix.star,
-    );
-    return _type;
-  }
-
   /// Set the type parameters defined for this type to the given
   /// [typeParameters].
   set typeParameters(List<TypeParameterElement> typeParameters) {
@@ -4858,32 +4721,6 @@
   }
 
   @override
-  @deprecated
-  FunctionType instantiate2({
-    @required List<DartType> typeArguments,
-    @required NullabilitySuffix nullabilitySuffix,
-  }) {
-    return instantiate(
-      typeArguments: typeArguments,
-      nullabilitySuffix: nullabilitySuffix,
-    );
-  }
-
-  @Deprecated('Use TypeSystem.instantiateToBounds2() instead')
-  @override
-  FunctionType instantiateToBounds({
-    @required NullabilitySuffix nullabilitySuffix,
-  }) {
-    var typeArguments = typeParameters.map((typeParameter) {
-      return (typeParameter as TypeParameterElementImpl).defaultType;
-    }).toList();
-    return instantiate(
-      typeArguments: typeArguments,
-      nullabilitySuffix: nullabilitySuffix,
-    );
-  }
-
-  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(typeParameters, visitor);
@@ -5536,18 +5373,6 @@
     return _languageVersion;
   }
 
-  @Deprecated("Use 'languageVersion'")
-  @override
-  int get languageVersionMajor {
-    return languageVersion.effective.major;
-  }
-
-  @Deprecated("Use 'languageVersion'")
-  @override
-  int get languageVersionMinor {
-    return languageVersion.effective.minor;
-  }
-
   @override
   LibraryElement get library => this;
 
@@ -6038,20 +5863,17 @@
   /// Indicates that a class is a mixin application.
   static const Modifier MIXIN_APPLICATION = Modifier('MIXIN_APPLICATION', 14);
 
-  /// Indicates that a class contains an explicit reference to 'super'.
-  static const Modifier REFERENCES_SUPER = Modifier('REFERENCES_SUPER', 15);
-
   /// Indicates that the pseudo-modifier 'set' was applied to the element.
-  static const Modifier SETTER = Modifier('SETTER', 16);
+  static const Modifier SETTER = Modifier('SETTER', 15);
 
   /// Indicates that the modifier 'static' was applied to the element.
-  static const Modifier STATIC = Modifier('STATIC', 17);
+  static const Modifier STATIC = Modifier('STATIC', 16);
 
   /// Indicates that the element does not appear in the source code but was
   /// implicitly created. For example, if a class does not define any
   /// constructors, an implicit zero-argument constructor will be created and it
   /// will be marked as being synthetic.
-  static const Modifier SYNTHETIC = Modifier('SYNTHETIC', 18);
+  static const Modifier SYNTHETIC = Modifier('SYNTHETIC', 17);
 
   static const List<Modifier> values = [
     ABSTRACT,
@@ -6069,7 +5891,6 @@
     IMPLICIT_TYPE,
     LATE,
     MIXIN_APPLICATION,
-    REFERENCES_SUPER,
     SETTER,
     STATIC,
     SYNTHETIC
@@ -6220,16 +6041,9 @@
   Source get source => null;
 
   @override
-  DartType get type => DynamicTypeImpl.instance;
-
-  @override
   T accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitMultiplyDefinedElement(this);
 
-  @Deprecated('Use either thisOrAncestorMatching or thisOrAncestorOfType')
-  @override
-  E getAncestor<E extends Element>(Predicate<Element> predicate) => null;
-
   @override
   String getDisplayString({@required bool withNullability}) {
     var elementsStr = conflictingElements.map((e) {
@@ -6312,11 +6126,6 @@
   ElementKind get kind => ElementKind.NEVER;
 
   @override
-  DartType get type {
-    throw StateError('Should not be accessed.');
-  }
-
-  @override
   T accept<T>(ElementVisitor<T> visitor) => null;
 
   DartType instantiate({
@@ -7177,7 +6986,6 @@
   FunctionType get typeInternal {
     if (_type != null) return _type;
 
-    // TODO(scheglov) Remove "element" in the breaking changes branch.
     var type = FunctionTypeImpl(
       typeFormals: const <TypeParameterElement>[],
       parameters: const <ParameterElement>[],
@@ -7247,7 +7055,6 @@
   FunctionType get typeInternal {
     if (_type != null) return _type;
 
-    // TODO(scheglov) Remove "element" in the breaking changes branch.
     var type = FunctionTypeImpl(
       typeFormals: const <TypeParameterElement>[],
       parameters: parameters,
@@ -7473,9 +7280,6 @@
   /// fall-back type value in type inference.
   DartType _defaultType;
 
-  /// The type defined by this type parameter.
-  TypeParameterType _type;
-
   /// The type representing the bound associated with this parameter, or `null`
   /// if this parameter does not have an explicit bound.
   DartType _bound;
@@ -7582,23 +7386,6 @@
     return super.nameOffset;
   }
 
-  @override
-  @deprecated
-  TypeParameterType get type {
-    // Note: TypeParameterElement.type has nullability suffix `star` regardless
-    // of whether it appears in a migrated library.  This is because for type
-    // parameters of synthetic function types, the ancestor chain is broken and
-    // we can't find the enclosing library to tell whether it is migrated.
-    return _type ??= TypeParameterTypeImpl(
-      element: this,
-      nullabilitySuffix: NullabilitySuffix.star,
-    );
-  }
-
-  set type(TypeParameterType type) {
-    _type = type;
-  }
-
   Variance get variance {
     if (_variance != null) return _variance;
 
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 1f388cf..8af1a69 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -540,11 +540,6 @@
   /// Append a textual representation of this element to the given [builder].
   void appendTo(ElementDisplayStringBuilder builder);
 
-  @Deprecated('Use either thisOrAncestorMatching or thisOrAncestorOfType')
-  @override
-  E getAncestor<E extends Element>(Predicate<Element> predicate) =>
-      declaration.getAncestor(predicate);
-
   @override
   String getDisplayString({@required bool withNullability}) {
     var builder = ElementDisplayStringBuilder(
@@ -819,16 +814,6 @@
     builder.writeFormalParameter(this);
   }
 
-  @Deprecated('Use either thisOrAncestorMatching or thisOrAncestorOfType')
-  @override
-  E getAncestor<E extends Element>(Predicate<Element> predicate) {
-    Element element = declaration.getAncestor(predicate);
-    if (element is ExecutableElement) {
-      return ExecutableMember.from2(element, _substitution) as E;
-    }
-    return element as E;
-  }
-
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 84de8e0..7c697e2 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -87,19 +87,6 @@
   }
 
   @override
-  @deprecated
-  DartType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    int length = parameterTypes.length;
-    for (int i = 0; i < length; i++) {
-      if (parameterTypes[i] == this) {
-        return argumentTypes[i];
-      }
-    }
-    return this;
-  }
-
-  @override
   TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
     // The dynamic type is always nullable.
     return this;
@@ -148,10 +135,6 @@
         nullabilitySuffix = nullabilitySuffix,
         super(element);
 
-  @deprecated
-  @override
-  List<TypeParameterElement> get boundTypeParameters => typeFormals;
-
   @override
   FunctionTypedElement get element {
     var element = super.element;
@@ -235,9 +218,6 @@
   }
 
   @override
-  List<TypeParameterElement> get typeParameters => const [] /*TODO(paulberry)*/;
-
-  @override
   bool operator ==(Object other) {
     if (identical(other, this)) {
       return true;
@@ -316,27 +296,6 @@
   }
 
   @override
-  @deprecated
-  FunctionType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    if (argumentTypes.length != parameterTypes.length) {
-      throw ArgumentError("argumentTypes.length (${argumentTypes.length}) != "
-          "parameterTypes.length (${parameterTypes.length})");
-    }
-
-    var substitution = Substitution.fromPairs(
-      parameterTypes.map<TypeParameterElement>((t) => t.element).toList(),
-      argumentTypes,
-    );
-    return substitution.substituteType(this);
-  }
-
-  @override
-  @deprecated
-  FunctionTypeImpl substitute3(List<DartType> argumentTypes) =>
-      substitute2(argumentTypes, typeArguments);
-
-  @override
   TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
     if (this.nullabilitySuffix == nullabilitySuffix) return this;
     return FunctionTypeImpl(
@@ -804,10 +763,6 @@
     return element.name == "Symbol" && element.library.isDartCore;
   }
 
-  @Deprecated('Use isDartCoreObject')
-  @override
-  bool get isObject => element.supertype == null && !element.isMixin;
-
   @override
   List<MethodElement> get methods {
     if (_methods == null) {
@@ -847,9 +802,6 @@
     return _instantiateSuperTypes(constraints);
   }
 
-  @override
-  List<TypeParameterElement> get typeParameters => element.typeParameters;
-
   InheritanceManager3 get _inheritanceManager =>
       (element.library.session as AnalysisSessionImpl).inheritanceManager;
 
@@ -917,11 +869,6 @@
       PropertyAccessorMember.from(element.getSetter(setterName), this);
 
   @override
-  @deprecated
-  InterfaceTypeImpl instantiate(List<DartType> argumentTypes) =>
-      substitute2(argumentTypes, typeArguments);
-
-  @override
   ConstructorElement lookUpConstructor(
       String constructorName, LibraryElement library) {
     // prepare base ConstructorElement
@@ -1358,33 +1305,6 @@
   }
 
   @override
-  @deprecated
-  InterfaceTypeImpl substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    if (argumentTypes.length != parameterTypes.length) {
-      throw ArgumentError(
-          "argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
-    }
-    if (argumentTypes.isEmpty || typeArguments.isEmpty) {
-      return this;
-    }
-
-    List<DartType> newTypeArguments =
-        TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
-
-    return InterfaceTypeImpl(
-      element: element,
-      typeArguments: newTypeArguments,
-      nullabilitySuffix: nullabilitySuffix,
-    );
-  }
-
-  @deprecated
-  @override
-  InterfaceTypeImpl substitute4(List<DartType> argumentTypes) =>
-      instantiate(argumentTypes);
-
-  @override
   TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
     if (this.nullabilitySuffix == nullabilitySuffix) return this;
 
@@ -1666,12 +1586,6 @@
   }
 
   @override
-  @deprecated
-  NeverTypeImpl substitute2(
-          List<DartType> argumentTypes, List<DartType> parameterTypes) =>
-      this;
-
-  @override
   TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
     switch (nullabilitySuffix) {
       case NullabilitySuffix.question:
@@ -1758,10 +1672,6 @@
   @override
   bool get isDynamic => false;
 
-  @Deprecated('Use isDartCoreObject')
-  @override
-  bool get isObject => false;
-
   @override
   bool get isVoid => false;
 
@@ -1777,7 +1687,7 @@
   @override
   String getDisplayString({
     bool skipAllDynamicArguments = false,
-    bool withNullability = false,
+    @required bool withNullability,
   }) {
     var builder = ElementDisplayStringBuilder(
       skipAllDynamicArguments: skipAllDynamicArguments,
@@ -1790,16 +1700,9 @@
   @override
   DartType resolveToBound(DartType objectType) => this;
 
-  /// Return the type resulting from substituting the given [argumentTypes] for
-  /// the given [parameterTypes] in this type.
-  @override
-  @deprecated
-  DartType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes);
-
   @override
   String toString() {
-    return getDisplayString(withNullability: false);
+    return getDisplayString(withNullability: true);
   }
 
   /// Return the same type, but with the given [nullabilitySuffix].
@@ -1836,23 +1739,6 @@
     }
     return true;
   }
-
-  /// Return a list containing the results of using the given [argumentTypes]
-  /// and [parameterTypes] to perform a substitution on all of the given
-  /// [types].
-  @deprecated
-  static List<DartType> substitute(List<DartType> types,
-      List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    int length = types.length;
-    if (length == 0) {
-      return types;
-    }
-    List<DartType> newTypes = List<DartType>(length);
-    for (int i = 0; i < length; i++) {
-      newTypes[i] = types[i].substitute2(argumentTypes, parameterTypes);
-    }
-    return newTypes;
-  }
 }
 
 /// A concrete implementation of a [TypeParameterType].
@@ -1977,55 +1863,6 @@
   }
 
   @override
-  @deprecated
-  DartType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    int length = parameterTypes.length;
-    for (int i = 0; i < length; i++) {
-      var parameterType = parameterTypes[i];
-      if (parameterType is TypeParameterTypeImpl && parameterType == this) {
-        TypeImpl argumentType = argumentTypes[i];
-
-        // TODO(scheglov) It should not happen, but sometimes arguments are
-        //  null.
-        if (argumentType == null) {
-          return argumentType;
-        }
-
-        // TODO(scheglov) Proposed substitution rules for nullability.
-        NullabilitySuffix resultNullability;
-        NullabilitySuffix parameterNullability =
-            parameterType.nullabilitySuffix;
-        NullabilitySuffix argumentNullability = argumentType.nullabilitySuffix;
-        if (parameterNullability == NullabilitySuffix.none) {
-          if (argumentNullability == NullabilitySuffix.question ||
-              nullabilitySuffix == NullabilitySuffix.question) {
-            resultNullability = NullabilitySuffix.question;
-          } else if (argumentNullability == NullabilitySuffix.star ||
-              nullabilitySuffix == NullabilitySuffix.star) {
-            resultNullability = NullabilitySuffix.star;
-          } else {
-            resultNullability = NullabilitySuffix.none;
-          }
-        } else if (parameterNullability == NullabilitySuffix.star) {
-          if (argumentNullability == NullabilitySuffix.question ||
-              nullabilitySuffix == NullabilitySuffix.question) {
-            resultNullability = NullabilitySuffix.question;
-          } else {
-            resultNullability = argumentNullability;
-          }
-        } else {
-          // We should never be substituting for `T?`.
-          throw StateError('Tried to substitute for T?');
-        }
-
-        return argumentType.withNullability(resultNullability);
-      }
-    }
-    return this;
-  }
-
-  @override
   TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
     if (this.nullabilitySuffix == nullabilitySuffix) return this;
     return TypeParameterTypeImpl(
@@ -2034,22 +1871,6 @@
       promotedBound: promotedBound,
     );
   }
-
-  /// Return a list containing the type parameter types defined by the given
-  /// array of type parameter elements ([typeParameters]).
-  @deprecated
-  static List<TypeParameterType> getTypes(
-      List<TypeParameterElement> typeParameters) {
-    int count = typeParameters.length;
-    if (count == 0) {
-      return const <TypeParameterType>[];
-    }
-    List<TypeParameterType> types = List<TypeParameterType>(count);
-    for (int i = 0; i < count; i++) {
-      types[i] = typeParameters[i].type;
-    }
-    return types;
-  }
 }
 
 /// A concrete implementation of a [VoidType].
@@ -2095,12 +1916,6 @@
   }
 
   @override
-  @deprecated
-  VoidTypeImpl substitute2(
-          List<DartType> argumentTypes, List<DartType> parameterTypes) =>
-      this;
-
-  @override
   TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
     // The void type is always nullable.
     return this;
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index 6d5bf1a..2854f7e 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -249,7 +249,6 @@
       var freshType = freshElement.instantiate(
         nullabilitySuffix: NullabilitySuffix.none,
       );
-      freshElement.type = freshType;
       substitution[element] = freshType;
 
       if (!element.isLegacyCovariant) {
diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart
index 04e4051..3ce7283 100644
--- a/pkg/analyzer/lib/src/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart
@@ -6,25 +6,13 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:meta/meta.dart';
 
 /// Provide common functionality shared by the various TypeProvider
 /// implementations.
 abstract class TypeProviderBase implements TypeProvider {
   @override
-  List<InterfaceType> get nonSubtypableTypes => <InterfaceType>[
-        boolType,
-        doubleType,
-        intType,
-        nullType,
-        numType,
-        stringType
-      ];
-
-  @override
   bool isObjectGetter(String id) {
     PropertyAccessorElement element = objectType.element.getGetter(id);
     return element != null && !element.isStatic;
@@ -73,23 +61,15 @@
   InterfaceType _futureDynamicType;
   InterfaceType _futureNullType;
   InterfaceType _futureOrNullType;
-  InterfaceType _futureOrType;
-  InterfaceType _futureType;
   InterfaceType _intType;
   InterfaceType _iterableDynamicType;
   InterfaceType _iterableObjectType;
-  InterfaceType _iterableType;
-  InterfaceType _listType;
-  InterfaceType _mapType;
   InterfaceType _mapObjectObjectType;
-  DartObjectImpl _nullObject;
   InterfaceType _nullType;
   InterfaceType _numType;
   InterfaceType _objectType;
-  InterfaceType _setType;
   InterfaceType _stackTraceType;
   InterfaceType _streamDynamicType;
-  InterfaceType _streamType;
   InterfaceType _stringType;
   InterfaceType _symbolType;
   InterfaceType _typeType;
@@ -218,18 +198,6 @@
   }
 
   @override
-  InterfaceType get futureOrType {
-    _futureOrType ??= _getType(_asyncLibrary, "FutureOr");
-    return _futureOrType;
-  }
-
-  @override
-  InterfaceType get futureType {
-    _futureType ??= _getType(_asyncLibrary, "Future");
-    return _futureType;
-  }
-
-  @override
   ClassElement get intElement {
     return _intElement ??= _getClassElement(_coreLibrary, "int");
   }
@@ -266,23 +234,11 @@
   }
 
   @override
-  InterfaceType get iterableType {
-    _iterableType ??= _getType(_coreLibrary, "Iterable");
-    return _iterableType;
-  }
-
-  @override
   ClassElement get listElement {
     return _listElement ??= _getClassElement(_coreLibrary, 'List');
   }
 
   @override
-  InterfaceType get listType {
-    _listType ??= _getType(_coreLibrary, "List");
-    return _listType;
-  }
-
-  @override
   ClassElement get mapElement {
     return _mapElement ??= _getClassElement(_coreLibrary, 'Map');
   }
@@ -298,12 +254,6 @@
   }
 
   @override
-  InterfaceType get mapType {
-    _mapType ??= _getType(_coreLibrary, "Map");
-    return _mapType;
-  }
-
-  @override
   DartType get neverType => isNonNullableByDefault
       ? NeverTypeImpl.instance
       : NeverTypeImpl.instanceLegacy;
@@ -324,21 +274,6 @@
     return _nullElement ??= _getClassElement(_coreLibrary, 'Null');
   }
 
-  @deprecated
-  @override
-  DartObjectImpl get nullObject {
-    return _nullObject ??= DartObjectImpl(
-      TypeSystemImpl(
-        implicitCasts: false,
-        isNonNullableByDefault: false,
-        strictInference: false,
-        typeProvider: this,
-      ),
-      nullType,
-      NullState.NULL_STATE,
-    );
-  }
-
   InterfaceTypeImpl get nullStar {
     return _nullStar ??= nullElement.instantiate(
       typeArguments: const [],
@@ -379,11 +314,6 @@
   }
 
   @override
-  InterfaceType get setType {
-    return _setType ??= _getType(_coreLibrary, "Set");
-  }
-
-  @override
   InterfaceType get stackTraceType {
     _stackTraceType ??= _getType(_coreLibrary, "StackTrace");
     return _stackTraceType;
@@ -405,12 +335,6 @@
   }
 
   @override
-  InterfaceType get streamType {
-    _streamType ??= _getType(_asyncLibrary, "Stream");
-    return _streamType;
-  }
-
-  @override
   ClassElement get stringElement {
     return _stringElement ??= _getClassElement(_coreLibrary, 'String');
   }
diff --git a/pkg/analyzer/lib/src/dart/element/type_schema.dart b/pkg/analyzer/lib/src/dart/element/type_schema.dart
index 1f4b6c4..f65f66c 100644
--- a/pkg/analyzer/lib/src/dart/element/type_schema.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_schema.dart
@@ -66,18 +66,6 @@
   }
 
   @override
-  DartType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    int length = parameterTypes.length;
-    for (int i = 0; i < length; i++) {
-      if (parameterTypes[i] == this) {
-        return argumentTypes[i];
-      }
-    }
-    return this;
-  }
-
-  @override
   TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) => this;
 
   /// Given a [type] T, return true if it does not have an unknown type `_`.
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index 37ee42d..b0b3a9cc 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -35,12 +35,12 @@
 /// way for a possible future where we may wish to make the type system
 /// pluggable.
 // TODO(brianwilkerson) Rename this class to TypeSystemImpl.
-abstract class TypeSystem implements public.TypeSystem {
+abstract class TypeSystem2 implements public.TypeSystem {
   /// If `true`, then NNBD type rules should be used.
   /// If `false`, then legacy type rules should be used.
   final bool isNonNullableByDefault;
 
-  TypeSystem({@required this.isNonNullableByDefault});
+  TypeSystem2({@required this.isNonNullableByDefault});
 
   /// The provider of types for the system
   TypeProvider get typeProvider;
@@ -394,7 +394,7 @@
 }
 
 /// The [public.TypeSystem] implementation.
-class TypeSystemImpl extends TypeSystem {
+class TypeSystemImpl extends TypeSystem2 {
   /// False if implicit casts should always be disallowed.
   ///
   /// This affects the behavior of [isAssignableTo].
diff --git a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
index 3a1a6253..667a28d 100644
--- a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
@@ -140,13 +140,12 @@
 
 class _MicroAnalysisSessionImpl extends AnalysisSessionImpl {
   @override
-  _MicroAnalysisContextImpl analysisContext;
-
-  @override
   final DeclaredVariables declaredVariables;
 
+  final SourceFactory sourceFactory;
+
   @override
-  SourceFactory sourceFactory;
+  _MicroAnalysisContextImpl analysisContext;
 
   _MicroAnalysisSessionImpl(
     this.declaredVariables,
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 5674c42..7dd4335 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -84,10 +84,6 @@
   /// enclosing element.
   ElementHolder _elementHolder;
 
-  /// The flag specifying if currently visited class references 'super'
-  /// expression.
-  bool _hasReferenceToSuper = false;
-
   factory ResolutionVisitor({
     @required CompilationUnitElementImpl unitElement,
     @required AnalysisErrorListener errorListener,
@@ -241,13 +237,9 @@
         _resolveWithClause(withClause);
         _resolveImplementsClause(node.implementsClause);
 
-        _hasReferenceToSuper = false;
-
         _defineElements(element.accessors);
         _defineElements(element.methods);
         node.members.accept(this);
-
-        element.hasReferenceToSuper = _hasReferenceToSuper;
       });
     });
 
@@ -905,12 +897,6 @@
   }
 
   @override
-  void visitSuperExpression(SuperExpression node) {
-    _hasReferenceToSuper = true;
-    super.visitSuperExpression(node);
-  }
-
-  @override
   void visitSwitchCase(SwitchCase node) {
     _buildLabelElements(node.labels, false, true);
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 0421a6d..e0ed8b3 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -3410,7 +3410,7 @@
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(feature.firstSupportedVersion),
+          _versionAsString(feature.releaseVersion),
         ),
         spreadToken,
         spreadToken,
@@ -3633,7 +3633,7 @@
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(feature.firstSupportedVersion),
+          _versionAsString(feature.releaseVersion),
         ),
         forToken,
         forToken,
@@ -3666,7 +3666,7 @@
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(feature.firstSupportedVersion),
+          _versionAsString(feature.releaseVersion),
         ),
         ifToken,
         ifToken,
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
deleted file mode 100644
index ffafbd6..0000000
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ /dev/null
@@ -1,18 +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.
-
-/// This library is deprecated. Please convert all references to this library to
-/// reference one of the following public libraries:
-/// * package:analyzer/dart/ast/ast.dart
-/// * package:analyzer/dart/ast/visitor.dart
-///
-/// If your code is using APIs not available in these public libraries, please
-/// contact the analyzer team to either find an alternate API or have the API
-/// you depend on added to the public API.
-@deprecated
-library analyzer.src.generated.ast;
-
-export 'package:analyzer/dart/ast/ast.dart';
-export 'package:analyzer/dart/ast/visitor.dart';
-export 'package:analyzer/src/dart/ast/utilities.dart';
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
deleted file mode 100644
index a874806..0000000
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ /dev/null
@@ -1,22 +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.
-
-/// This library is deprecated. Please convert all references to this library to
-/// reference one of the following public libraries:
-/// * package:analyzer/dart/element/element.dart
-/// * package:analyzer/dart/element/type.dart
-/// * package:analyzer/dart/element/visitor.dart
-///
-/// If your code is using APIs not available in these public libraries, please
-/// contact the analyzer team to either find an alternate API or have the API
-/// you depend on added to the public API.
-@deprecated
-library analyzer.src.generated.element;
-
-export 'package:analyzer/dart/element/element.dart';
-export 'package:analyzer/dart/element/type.dart';
-export 'package:analyzer/dart/element/visitor.dart';
-export 'package:analyzer/src/dart/element/element.dart';
-export 'package:analyzer/src/dart/element/member.dart';
-export 'package:analyzer/src/dart/element/type.dart';
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 4cb7d34..4bbf974 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -6,13 +6,10 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token_impl.dart';
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -87,15 +84,6 @@
   /// this context to the given source [factory]. Clients can safely assume that
   /// all analysis results have been invalidated.
   set sourceFactory(SourceFactory factory);
-
-  /// Return a type provider for this context or throw [AnalysisException] if
-  /// either `dart:core` or `dart:async` cannot be resolved.
-  @Deprecated('Use LibraryElement.typeProvider')
-  TypeProvider get typeProvider;
-
-  /// Return a type system for this context.
-  @Deprecated('Use LibraryElement.typeSystem')
-  TypeSystem get typeSystem;
 }
 
 /// The entry point for the functionality provided by the analysis engine. There
@@ -215,18 +203,6 @@
 /// A set of analysis options used to control the behavior of an analysis
 /// context.
 abstract class AnalysisOptions {
-  /// Function that returns `true` if analysis is to parse and analyze function
-  /// bodies for a given source.
-  @deprecated
-  AnalyzeFunctionBodiesPredicate get analyzeFunctionBodiesPredicate;
-
-  /// Return the maximum number of sources for which AST structures should be
-  /// kept in the cache.
-  ///
-  /// DEPRECATED: This setting no longer has any effect.
-  @deprecated
-  int get cacheSize;
-
   /// A flag indicating whether to run checks on AndroidManifest.xml file to
   /// see if it is complaint with Chrome OS.
   bool get chromeOsManifestChecks;
@@ -234,63 +210,13 @@
   /// The set of features that are globally enabled for this context.
   FeatureSet get contextFeatures;
 
-  /// Return `true` if cache flushing should be disabled.  Setting this option to
-  /// `true` can improve analysis speed at the expense of memory usage.  It may
-  /// also be useful for working around bugs.
-  ///
-  /// This option should not be used when the analyzer is part of a long running
-  /// process (such as the analysis server) because it has the potential to
-  /// prevent memory from being reclaimed.
-  @deprecated
-  bool get disableCacheFlushing;
-
-  /// Return `true` if the parser is to parse asserts in the initializer list of
-  /// a constructor.
-  @deprecated
-  bool get enableAssertInitializer;
-
-  /// Return `true` to enable custom assert messages (DEP 37).
-  @deprecated
-  bool get enableAssertMessage;
-
-  /// Return `true` to if analysis is to enable async support.
-  @deprecated
-  bool get enableAsync;
-
-  /// Return `true` to enable interface libraries (DEP 40).
-  @deprecated
-  bool get enableConditionalDirectives;
-
   /// Return a list of the names of the packages for which, if they define a
   /// plugin, the plugin should be enabled.
   List<String> get enabledPluginNames;
 
-  /// Return `true` to enable generic methods (DEP 22).
-  @deprecated
-  bool get enableGenericMethods => null;
-
-  /// Return `true` if access to field formal parameters should be allowed in a
-  /// constructor's initializer list.
-  @deprecated
-  bool get enableInitializingFormalAccess;
-
-  /// Return `true` to enable the lazy compound assignment operators '&&=' and
-  /// '||='.
-  @deprecated
-  bool get enableLazyAssignmentOperators;
-
-  /// Return `true` if mixins are allowed to inherit from types other than
-  /// Object, and are allowed to reference `super`.
-  @deprecated
-  bool get enableSuperMixins;
-
   /// Return `true` if timing data should be gathered during execution.
   bool get enableTiming;
 
-  /// Return `true` to enable the use of URIs in part-of directives.
-  @deprecated
-  bool get enableUriInPartOf;
-
   /// Return a list of error processors that are to be used when reporting
   /// errors in some analysis context.
   List<ErrorProcessor> get errorProcessors;
@@ -299,16 +225,6 @@
   /// analysis.
   List<String> get excludePatterns;
 
-  /// Return `true` if errors, warnings and hints should be generated for sources
-  /// that are implicitly being analyzed. The default value is `true`.
-  @deprecated
-  bool get generateImplicitErrors;
-
-  /// Return `true` if errors, warnings and hints should be generated for sources
-  /// in the SDK. The default value is `false`.
-  @deprecated
-  bool get generateSdkErrors;
-
   /// Return `true` if analysis is to generate hint results (e.g. type inference
   /// based information and pub best practices).
   bool get hint;
@@ -320,22 +236,6 @@
   /// if [lint] returns `true`.
   List<Linter> get lintRules;
 
-  /// A mapping from Dart SDK library name (e.g. "dart:core") to a list of paths
-  /// to patch files that should be applied to the library.
-  @deprecated
-  Map<String, List<String>> get patchPaths;
-
-  /// Return `true` if analysis is to parse comments.
-  @deprecated
-  bool get preserveComments;
-
-  /// Return `true` if analyzer should enable the use of Dart 2.0 features.
-  ///
-  /// This getter is deprecated, and is hard-coded to always return true.
-  @Deprecated(
-      'This getter is deprecated and is hard-coded to always return true.')
-  bool get previewDart2;
-
   /// The version range for the SDK specified in `pubspec.yaml`, or `null` if
   /// there is no `pubspec.yaml` or if it does not contain an SDK range.
   VersionConstraint get sdkVersionConstraint;
@@ -345,35 +245,12 @@
   /// The length of the list is guaranteed to equal [signatureLength].
   Uint32List get signature;
 
-  /// Return `true` if strong mode analysis should be used.
-  ///
-  /// This getter is deprecated, and is hard-coded to always return true.
-  @Deprecated(
-      'This getter is deprecated and is hard-coded to always return true.')
-  bool get strongMode;
-
-  /// Return `true` if dependencies between computed results should be tracked
-  /// by analysis cache.  This option should only be set to `false` if analysis
-  /// is performed in such a way that none of the inputs is ever changed
-  /// during the life time of the context.
-  @deprecated
-  bool get trackCacheDependencies;
-
   /// Return `true` if analyzer should use the Dart 2.0 Front End parser.
   bool get useFastaParser;
 
   /// Return `true` the lint with the given [name] is enabled.
   bool isLintEnabled(String name);
 
-  /// Reset the state of this set of analysis options to its original state.
-  @deprecated
-  void resetToDefaults();
-
-  /// Set the values of the cross-context options to match those in the given set
-  /// of [options].
-  @deprecated
-  void setCrossContextOptionsFrom(AnalysisOptions options);
-
   /// Determine whether two signatures returned by [signature] are equal.
   static bool signaturesEqual(Uint32List a, Uint32List b) {
     assert(a.length == AnalysisOptionsImpl.signatureLength);
@@ -396,19 +273,6 @@
   /// The length of the list returned by `signature` getters.
   static const int signatureLength = 4;
 
-  /// DEPRECATED: The maximum number of sources for which data should be kept in
-  /// the cache.
-  ///
-  /// This constant no longer has any effect.
-  @deprecated
-  static const int DEFAULT_CACHE_SIZE = 64;
-
-  /// A predicate indicating whether analysis is to parse and analyze function
-  /// bodies.
-  @deprecated
-  AnalyzeFunctionBodiesPredicate _analyzeFunctionBodiesPredicate =
-      _analyzeAllFunctionBodies;
-
   /// The cached [unlinkedSignature].
   Uint32List _unlinkedSignature;
 
@@ -421,10 +285,6 @@
   @override
   VersionConstraint sdkVersionConstraint;
 
-  @override
-  @deprecated
-  int cacheSize = 64;
-
   ExperimentStatus _contextFeatures = ExperimentStatus();
 
   /// The set of features to use for libraries that are not in a package.
@@ -437,10 +297,6 @@
   @override
   List<String> enabledPluginNames = const <String>[];
 
-  @deprecated
-  @override
-  bool enableLazyAssignmentOperators = false;
-
   @override
   bool enableTiming = false;
 
@@ -451,14 +307,6 @@
   /// A list of exclude patterns used to exclude some sources from analysis.
   List<String> _excludePatterns;
 
-  @deprecated
-  @override
-  bool generateImplicitErrors = true;
-
-  @deprecated
-  @override
-  bool generateSdkErrors = false;
-
   @override
   bool hint = true;
 
@@ -469,25 +317,9 @@
   /// `true`.
   List<Linter> _lintRules;
 
-  @deprecated
-  @override
-  Map<String, List<String>> patchPaths = {};
-
-  @deprecated
-  @override
-  bool preserveComments = true;
-
-  @deprecated
-  @override
-  bool trackCacheDependencies = true;
-
   @override
   bool useFastaParser = true;
 
-  @deprecated
-  @override
-  bool disableCacheFlushing = false;
-
   /// A flag indicating whether implicit casts are allowed in [strongMode]
   /// (they are always allowed in Dart 1.0 mode).
   ///
@@ -526,24 +358,14 @@
   /// Initialize a newly created set of analysis options to have the same values
   /// as those in the given set of analysis [options].
   AnalysisOptionsImpl.from(AnalysisOptions options) {
-    // ignore: deprecated_member_use_from_same_package
-    analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate;
     contextFeatures = options.contextFeatures;
     enabledPluginNames = options.enabledPluginNames;
-    // ignore: deprecated_member_use_from_same_package
-    enableLazyAssignmentOperators = options.enableLazyAssignmentOperators;
     enableTiming = options.enableTiming;
     errorProcessors = options.errorProcessors;
     excludePatterns = options.excludePatterns;
-    // ignore: deprecated_member_use_from_same_package
-    generateImplicitErrors = options.generateImplicitErrors;
-    // ignore: deprecated_member_use_from_same_package
-    generateSdkErrors = options.generateSdkErrors;
     hint = options.hint;
     lint = options.lint;
     lintRules = options.lintRules;
-    // ignore: deprecated_member_use_from_same_package
-    preserveComments = options.preserveComments;
     useFastaParser = options.useFastaParser;
     if (options is AnalysisOptionsImpl) {
       implicitCasts = options.implicitCasts;
@@ -551,49 +373,9 @@
       strictInference = options.strictInference;
       strictRawTypes = options.strictRawTypes;
     }
-    // ignore: deprecated_member_use_from_same_package
-    trackCacheDependencies = options.trackCacheDependencies;
-    // ignore: deprecated_member_use_from_same_package
-    disableCacheFlushing = options.disableCacheFlushing;
-    // ignore: deprecated_member_use_from_same_package
-    patchPaths = options.patchPaths;
     sdkVersionConstraint = options.sdkVersionConstraint;
   }
 
-  @deprecated
-  bool get analyzeFunctionBodies {
-    if (identical(analyzeFunctionBodiesPredicate, _analyzeAllFunctionBodies)) {
-      return true;
-    } else if (identical(
-        analyzeFunctionBodiesPredicate, _analyzeNoFunctionBodies)) {
-      return false;
-    } else {
-      throw StateError('analyzeFunctionBodiesPredicate in use');
-    }
-  }
-
-  @deprecated
-  set analyzeFunctionBodies(bool value) {
-    if (value) {
-      analyzeFunctionBodiesPredicate = _analyzeAllFunctionBodies;
-    } else {
-      analyzeFunctionBodiesPredicate = _analyzeNoFunctionBodies;
-    }
-  }
-
-  @deprecated
-  @override
-  AnalyzeFunctionBodiesPredicate get analyzeFunctionBodiesPredicate =>
-      _analyzeFunctionBodiesPredicate;
-
-  @deprecated
-  set analyzeFunctionBodiesPredicate(AnalyzeFunctionBodiesPredicate value) {
-    if (value == null) {
-      throw ArgumentError.notNull('analyzeFunctionBodiesPredicate');
-    }
-    _analyzeFunctionBodiesPredicate = value;
-  }
-
   @override
   FeatureSet get contextFeatures => _contextFeatures;
 
@@ -603,69 +385,11 @@
   }
 
   @deprecated
-  @override
-  bool get enableAssertInitializer => true;
-
-  @deprecated
-  set enableAssertInitializer(bool enable) {}
-
-  @override
-  @deprecated
-  bool get enableAssertMessage => true;
-
-  @deprecated
-  set enableAssertMessage(bool enable) {}
-
-  @deprecated
-  @override
-  bool get enableAsync => true;
-
-  @deprecated
-  set enableAsync(bool enable) {}
-
-  /// A flag indicating whether interface libraries are to be supported (DEP 40).
-  @override
-  bool get enableConditionalDirectives => true;
-
-  @deprecated
-  set enableConditionalDirectives(_) {}
-
-  @deprecated
   set enabledExperiments(List<String> enabledExperiments) {
     _contextFeatures = ExperimentStatus.fromStrings(enabledExperiments);
   }
 
   @override
-  @deprecated
-  bool get enableGenericMethods => true;
-
-  @deprecated
-  set enableGenericMethods(bool enable) {}
-
-  @deprecated
-  @override
-  bool get enableInitializingFormalAccess => true;
-
-  @deprecated
-  set enableInitializingFormalAccess(bool enable) {}
-
-  @override
-  @deprecated
-  bool get enableSuperMixins => false;
-
-  @deprecated
-  set enableSuperMixins(bool enable) {
-    // Ignored.
-  }
-
-  @deprecated
-  @override
-  bool get enableUriInPartOf => true;
-
-  @deprecated
-  set enableUriInPartOf(bool enable) {}
-
-  @override
   List<ErrorProcessor> get errorProcessors =>
       _errorProcessors ??= const <ErrorProcessor>[];
 
@@ -687,14 +411,6 @@
   /// The set of enabled experiments.
   ExperimentStatus get experimentStatus => _contextFeatures;
 
-  /// Return `true` to enable mixin declarations.
-  /// https://github.com/dart-lang/language/issues/12
-  @deprecated
-  bool get isMixinSupportEnabled => true;
-
-  @deprecated
-  set isMixinSupportEnabled(bool value) {}
-
   @override
   List<Linter> get lintRules => _lintRules ??= const <Linter>[];
 
@@ -704,13 +420,6 @@
     _lintRules = rules;
   }
 
-  @deprecated
-  @override
-  bool get previewDart2 => true;
-
-  @deprecated
-  set previewDart2(bool value) {}
-
   @override
   Uint32List get signature {
     if (_signature == null) {
@@ -723,7 +432,6 @@
 
       // Append boolean flags.
       // ignore: deprecated_member_use_from_same_package
-      buffer.addBool(enableLazyAssignmentOperators);
       buffer.addBool(implicitCasts);
       buffer.addBool(implicitDynamic);
       buffer.addBool(strictInference);
@@ -779,13 +487,6 @@
     return _signatureForElements;
   }
 
-  @override
-  bool get strongMode => true;
-
-  @Deprecated(
-      "The strongMode field is deprecated, and shouldn't be assigned to")
-  set strongMode(bool value) {}
-
   /// Return the opaque signature of the options that affect unlinked data.
   ///
   /// The length of the list is guaranteed to equal [unlinkedSignatureLength].
@@ -794,8 +495,6 @@
       ApiSignature buffer = ApiSignature();
 
       // Append boolean flags.
-      // ignore: deprecated_member_use_from_same_package
-      buffer.addBool(enableLazyAssignmentOperators);
       buffer.addBool(useFastaParser);
 
       // Append the current language version.
@@ -819,45 +518,4 @@
   bool isLintEnabled(String name) {
     return lintRules.any((rule) => rule.name == name);
   }
-
-  @deprecated
-  @override
-  void resetToDefaults() {
-    contextFeatures = ExperimentStatus();
-    disableCacheFlushing = false;
-    enabledPluginNames = const <String>[];
-    enableLazyAssignmentOperators = false;
-    enableTiming = false;
-    _errorProcessors = null;
-    _excludePatterns = null;
-    generateImplicitErrors = true;
-    generateSdkErrors = false;
-    hint = true;
-    implicitCasts = true;
-    implicitDynamic = true;
-    strictInference = false;
-    strictRawTypes = false;
-    lint = false;
-    _lintRules = null;
-    patchPaths = {};
-    preserveComments = true;
-    trackCacheDependencies = true;
-    useFastaParser = true;
-  }
-
-  @deprecated
-  @override
-  void setCrossContextOptionsFrom(AnalysisOptions options) {
-    enableLazyAssignmentOperators = options.enableLazyAssignmentOperators;
-  }
-
-  /// Predicate used for [analyzeFunctionBodiesPredicate] when
-  /// [analyzeFunctionBodies] is set to `true`.
-  @deprecated
-  static bool _analyzeAllFunctionBodies(Source _) => true;
-
-  /// Predicate used for [analyzeFunctionBodiesPredicate] when
-  /// [analyzeFunctionBodies] is set to `false`.
-  @deprecated
-  static bool _analyzeNoFunctionBodies(Source _) => false;
 }
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
deleted file mode 100644
index fe431d2..0000000
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ /dev/null
@@ -1,10 +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.
-
-@deprecated
-library analyzer.src.generated.error;
-
-export 'package:analyzer/error/error.dart';
-export 'package:analyzer/error/listener.dart';
-export 'package:analyzer/src/error/codes.dart';
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index add5879..df9f795 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -53,12 +53,6 @@
 import 'package:analyzer/src/generated/variable_type_provider.dart';
 import 'package:meta/meta.dart';
 
-export 'package:analyzer/dart/element/type_provider.dart';
-export 'package:analyzer/src/dart/constant/constant_verifier.dart';
-export 'package:analyzer/src/dart/element/type_system.dart';
-export 'package:analyzer/src/dart/resolver/exit_detector.dart';
-export 'package:analyzer/src/dart/resolver/scope.dart';
-
 /// Maintains and manages contextual type information used for
 /// inferring types.
 class InferenceContext {
@@ -2013,7 +2007,7 @@
       Source source,
       TypeProvider typeProvider,
       AnalysisErrorListener errorListener,
-      TypeSystem typeSystem,
+      TypeSystemImpl typeSystem,
       FeatureSet featureSet,
       MigrationResolutionHooks migrationResolutionHooks)
       : _migrationResolutionHooks = migrationResolutionHooks,
@@ -2427,7 +2421,7 @@
     } else if (parent is FunctionTypeAlias) {
       nameScope = FormalParameterScope(
         nameScope,
-        parent.declaredElement.parameters,
+        parent.declaredElement.function.parameters,
       );
     } else if (parent is MethodDeclaration) {
       nameScope = FormalParameterScope(
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
deleted file mode 100644
index e1d6904..0000000
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ /dev/null
@@ -1,11 +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.
-
-@deprecated
-library analyzer.src.generated.scanner;
-
-export 'package:analyzer/dart/ast/token.dart';
-export 'package:analyzer/src/dart/ast/token.dart' hide SimpleToken;
-export 'package:analyzer/src/dart/scanner/reader.dart';
-export 'package:analyzer/src/dart/scanner/scanner.dart';
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
deleted file mode 100644
index fe7ecc0..0000000
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ /dev/null
@@ -1,184 +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.
-
-@deprecated
-library analyzer.src.generated.sdk_io;
-
-import 'dart:collection';
-
-import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
-
-/// An abstract implementation of a Dart SDK in which the available libraries
-/// are stored in a library map. Subclasses are responsible for populating the
-/// library map.
-@deprecated
-abstract class AbstractDartSdk implements DartSdk {
-  /// A mapping from Dart library URI's to the library represented by that URI.
-  LibraryMap libraryMap = LibraryMap();
-
-  /// The [AnalysisOptions] to use to create the [context].
-  AnalysisOptions _analysisOptions;
-
-  /// The [AnalysisContext] which is used for all of the sources in this SDK.
-  SdkAnalysisContext _analysisContext;
-
-  /// The mapping from Dart URI's to the corresponding sources.
-  final Map<String, Source> _uriToSourceMap = HashMap<String, Source>();
-
-  /// Set the [options] for this SDK analysis context.  Throw [StateError] if
-  /// the context has been already created.
-  set analysisOptions(AnalysisOptions options) {
-    if (_analysisContext != null) {
-      throw StateError(
-          'Analysis options cannot be changed after context creation.');
-    }
-    _analysisOptions = options;
-  }
-
-  @override
-  AnalysisContext get context {
-    if (_analysisContext == null) {
-      var factory = SourceFactory([DartUriResolver(this)]);
-      _analysisContext = SdkAnalysisContext(_analysisOptions, factory);
-    }
-    return _analysisContext;
-  }
-
-  @override
-  List<SdkLibrary> get sdkLibraries => libraryMap.sdkLibraries;
-
-  @override
-  List<String> get uris => libraryMap.uris;
-
-  /// Add the extensions from one or more sdk extension files to this sdk. The
-  /// [extensions] should be a table mapping the names of extensions to the
-  /// paths where those extensions can be found.
-  void addExtensions(Map<String, String> extensions) {
-    extensions.forEach((String uri, String path) {
-      String shortName = uri.substring(uri.indexOf(':') + 1);
-      SdkLibraryImpl library = SdkLibraryImpl(shortName);
-      library.path = path;
-      libraryMap.setLibrary(uri, library);
-    });
-  }
-
-  @override
-  Source fromFileUri(Uri uri) {
-    JavaFile file = JavaFile.fromUri(uri);
-
-    String path = _getPath(file);
-    if (path == null) {
-      return null;
-    }
-    try {
-      return FileBasedSource(file, Uri.parse(path));
-    } on FormatException catch (exception, stackTrace) {
-      AnalysisEngine.instance.instrumentationService.logInfo(
-          "Failed to create URI: $path",
-          CaughtException(exception, stackTrace));
-    }
-    return null;
-  }
-
-  String getRelativePathFromFile(JavaFile file);
-
-  @override
-  SdkLibrary getSdkLibrary(String dartUri) => libraryMap.getLibrary(dartUri);
-
-  /// Return the [PackageBundle] for this SDK, if it exists, or `null`
-  /// otherwise. This method should not be used outside of `analyzer` and
-  /// `analyzer_cli` packages.
-  @deprecated
-  PackageBundle getSummarySdkBundle(bool _);
-
-  FileBasedSource internalMapDartUri(String dartUri) {
-    // TODO(brianwilkerson) Figure out how to unify the implementations in the
-    // two subclasses.
-    String libraryName;
-    String relativePath;
-    int index = dartUri.indexOf('/');
-    if (index >= 0) {
-      libraryName = dartUri.substring(0, index);
-      relativePath = dartUri.substring(index + 1);
-    } else {
-      libraryName = dartUri;
-      relativePath = "";
-    }
-    SdkLibrary library = getSdkLibrary(libraryName);
-    if (library == null) {
-      return null;
-    }
-    String srcPath;
-    if (relativePath.isEmpty) {
-      srcPath = library.path;
-    } else {
-      String libraryPath = library.path;
-      int index = libraryPath.lastIndexOf(JavaFile.separator);
-      if (index == -1) {
-        index = libraryPath.lastIndexOf('/');
-        if (index == -1) {
-          return null;
-        }
-      }
-      String prefix = libraryPath.substring(0, index + 1);
-      srcPath = '$prefix$relativePath';
-    }
-    String filePath = srcPath.replaceAll('/', JavaFile.separator);
-    try {
-      JavaFile file = JavaFile(filePath);
-      return FileBasedSource(file, Uri.parse(dartUri));
-    } on FormatException {
-      return null;
-    }
-  }
-
-  @override
-  Source mapDartUri(String dartUri) {
-    Source source = _uriToSourceMap[dartUri];
-    if (source == null) {
-      source = internalMapDartUri(dartUri);
-      _uriToSourceMap[dartUri] = source;
-    }
-    return source;
-  }
-
-  String _getPath(JavaFile file) {
-    List<SdkLibrary> libraries = libraryMap.sdkLibraries;
-    int length = libraries.length;
-    List<String> paths = List(length);
-    String filePath = getRelativePathFromFile(file);
-    if (filePath == null) {
-      return null;
-    }
-    for (int i = 0; i < length; i++) {
-      SdkLibrary library = libraries[i];
-      String libraryPath = library.path.replaceAll('/', JavaFile.separator);
-      if (filePath == libraryPath) {
-        return library.shortName;
-      }
-      paths[i] = libraryPath;
-    }
-    for (int i = 0; i < length; i++) {
-      SdkLibrary library = libraries[i];
-      String libraryPath = paths[i];
-      int index = libraryPath.lastIndexOf(JavaFile.separator);
-      if (index >= 0) {
-        String prefix = libraryPath.substring(0, index + 1);
-        if (filePath.startsWith(prefix)) {
-          String relPath = filePath
-              .substring(prefix.length)
-              .replaceAll(JavaFile.separator, '/');
-          return '${library.shortName}/$relPath';
-        }
-      }
-    }
-    return null;
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 5c2152e..96a1e96 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -2,14 +2,10 @@
 // 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:collection';
-
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
-import 'package:analyzer/src/generated/source_io.dart' show FileBasedSource;
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:path/path.dart' as pathos;
 
@@ -53,12 +49,12 @@
 class ContentCache {
   /// A table mapping the full path of sources to the contents of those sources.
   /// This is used to override the default contents of a source.
-  final Map<String, String> _contentMap = HashMap<String, String>();
+  final Map<String, String> _contentMap = {};
 
   /// A table mapping the full path of sources to the modification stamps of
   /// those sources. This is used when the default contents of a source has been
   /// overridden.
-  final Map<String, int> _stampMap = HashMap<String, int>();
+  final Map<String, int> _stampMap = {};
 
   int _nextStamp = 0;
 
@@ -70,8 +66,8 @@
     });
   }
 
-  /// Return the contents of the given [source], or `null` if this cache does
-  /// not override the contents of the source.
+  /// Return the contents of the given [source], or `null` if this cache does not
+  /// override the contents of the source.
   ///
   /// <b>Note:</b> This method is not intended to be used except by
   /// [AnalysisContext.getContents].
@@ -119,25 +115,6 @@
   }
 }
 
-@deprecated
-class CustomUriResolver extends UriResolver {
-  final Map<String, String> _urlMappings;
-
-  CustomUriResolver(this._urlMappings);
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    String mapping = _urlMappings[uri.toString()];
-    if (mapping == null) return null;
-
-    Uri fileUri = Uri.file(mapping);
-    if (!fileUri.isAbsolute) return null;
-
-    JavaFile javaFile = JavaFile.fromUri(fileUri);
-    return FileBasedSource(javaFile, actualUri ?? uri);
-  }
-}
-
 /// Instances of the class `DartUriResolver` resolve `dart` URI's.
 class DartUriResolver extends UriResolver {
   /// The name of the `dart` scheme.
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 533bc34..2188bba 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -4,53 +4,12 @@
 
 import 'dart:collection';
 
-import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:path/path.dart' as path;
 
 export 'package:analyzer/src/generated/source.dart';
 
-/// Instances of the class [ExplicitSourceResolver] map URIs to files on disk
-/// using a fixed mapping provided at construction time.
-@deprecated
-class ExplicitSourceResolver extends UriResolver {
-  final Map<Uri, JavaFile> uriToFileMap;
-  final Map<String, Uri> pathToUriMap;
-
-  /// Construct an [ExplicitSourceResolver] based on the given [uriToFileMap].
-  ExplicitSourceResolver(Map<Uri, JavaFile> uriToFileMap)
-      : uriToFileMap = uriToFileMap,
-        pathToUriMap = _computePathToUriMap(uriToFileMap);
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    JavaFile file = uriToFileMap[uri];
-    actualUri ??= uri;
-    if (file == null) {
-      return null;
-    } else {
-      return FileBasedSource(file, actualUri);
-    }
-  }
-
-  @override
-  Uri restoreAbsolute(Source source) {
-    return pathToUriMap[source.fullName];
-  }
-
-  /// Build the inverse mapping of [uriToSourceMap].
-  static Map<String, Uri> _computePathToUriMap(
-      Map<Uri, JavaFile> uriToSourceMap) {
-    Map<String, Uri> pathToUriMap = <String, Uri>{};
-    uriToSourceMap.forEach((Uri uri, JavaFile file) {
-      pathToUriMap[file.getAbsolutePath()] = uri;
-    });
-    return pathToUriMap;
-  }
-}
-
 /// Instances of the class `FileBasedSource` implement a source that represents
 /// a file.
 class FileBasedSource extends Source {
@@ -158,273 +117,3 @@
     return file.getAbsolutePath();
   }
 }
-
-/// Instances of the class `FileUriResolver` resolve `file` URI's.
-///
-/// This class is now deprecated, 'new FileUriResolver()' is equivalent to
-/// 'new ResourceUriResolver(PhysicalResourceProvider.INSTANCE)'.
-@deprecated
-class FileUriResolver extends UriResolver {
-  /// The name of the `file` scheme.
-  static String FILE_SCHEME = "file";
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    if (!isFileUri(uri)) {
-      return null;
-    }
-    return FileBasedSource(JavaFile.fromUri(uri), actualUri ?? uri);
-  }
-
-  @override
-  Uri restoreAbsolute(Source source) {
-    return Uri.file(source.fullName);
-  }
-
-  /// Return `true` if the given URI is a `file` URI.
-  ///
-  /// @param uri the URI being tested
-  /// @return `true` if the given URI is a `file` URI
-  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
-}
-
-/// Instances of interface `LocalSourcePredicate` are used to determine if the
-/// given [Source] is "local" in some sense, so can be updated.
-abstract class LocalSourcePredicate {
-  /// Instance of [LocalSourcePredicate] that always returns `false`.
-  static final LocalSourcePredicate FALSE = LocalSourcePredicate_FALSE();
-
-  /// Instance of [LocalSourcePredicate] that always returns `true`.
-  static final LocalSourcePredicate TRUE = LocalSourcePredicate_TRUE();
-
-  /// Instance of [LocalSourcePredicate] that returns `true` for all [Source]s
-  /// except of SDK.
-  static final LocalSourcePredicate NOT_SDK = LocalSourcePredicate_NOT_SDK();
-
-  /// Determines if the given [Source] is local.
-  ///
-  /// @param source the [Source] to analyze
-  /// @return `true` if the given [Source] is local
-  bool isLocal(Source source);
-}
-
-class LocalSourcePredicate_FALSE implements LocalSourcePredicate {
-  @override
-  bool isLocal(Source source) => false;
-}
-
-class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
-  @override
-  bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
-}
-
-class LocalSourcePredicate_TRUE implements LocalSourcePredicate {
-  @override
-  bool isLocal(Source source) => true;
-}
-
-/// Instances of the class `PackageUriResolver` resolve `package` URI's in the
-/// context of an application.
-///
-/// For the purposes of sharing analysis, the path to each package under the
-/// "packages" directory should be canonicalized, but to preserve relative links
-/// within a package, the remainder of the path from the package directory to
-/// the leaf should not.
-@deprecated
-class PackageUriResolver extends UriResolver {
-  /// The name of the `package` scheme.
-  static String PACKAGE_SCHEME = "package";
-
-  /// Log exceptions thrown with the message "Required key not available" only
-  /// once.
-  static bool _CanLogRequiredKeyIoException = true;
-
-  /// The package directories that `package` URI's are assumed to be relative
-  /// to.
-  final List<JavaFile> _packagesDirectories;
-
-  /// Initialize a newly created resolver to resolve `package` URI's relative to
-  /// the given package directories.
-  ///
-  /// @param packagesDirectories the package directories that `package` URI's
-  ///          are assumed to be relative to
-  PackageUriResolver(this._packagesDirectories) {
-    if (_packagesDirectories.isEmpty) {
-      throw ArgumentError("At least one package directory must be provided");
-    }
-  }
-
-  /// If the list of package directories contains one element, return it.
-  /// Otherwise raise an exception.  Intended for testing.
-  String get packagesDirectory_forTesting {
-    int length = _packagesDirectories.length;
-    if (length != 1) {
-      throw Exception('Expected 1 package directory, found $length');
-    }
-    return _packagesDirectories[0].getPath();
-  }
-
-  /// Answer the canonical file for the specified package.
-  ///
-  /// @param packagesDirectory the "packages" directory (not `null`)
-  /// @param pkgName the package name (not `null`, not empty)
-  /// @param relPath the path relative to the package directory (not `null`, no
-  ///          leading slash, but may be empty string)
-  /// @return the file (not `null`)
-  JavaFile getCanonicalFile(
-      JavaFile packagesDirectory, String pkgName, String relPath) {
-    JavaFile pkgDir = JavaFile.relative(packagesDirectory, pkgName);
-    try {
-      pkgDir = pkgDir.getCanonicalFile();
-    } catch (exception, stackTrace) {
-      if (!exception.toString().contains("Required key not available")) {
-        // TODO(39284): should this exception be silent?
-        AnalysisEngine.instance.instrumentationService.logException(
-            SilentException(
-                "Canonical failed: $pkgDir", exception, stackTrace));
-      } else if (_CanLogRequiredKeyIoException) {
-        _CanLogRequiredKeyIoException = false;
-        // TODO(39284): should this exception be silent?
-        AnalysisEngine.instance.instrumentationService.logException(
-            SilentException(
-                "Canonical failed: $pkgDir", exception, stackTrace));
-      }
-    }
-    return JavaFile.relative(pkgDir,
-        relPath.replaceAll('/', String.fromCharCode(JavaFile.separatorChar)));
-  }
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    if (!isPackageUri(uri)) {
-      return null;
-    }
-    String path = uri.path;
-    if (path == null) {
-      path = uri.path;
-      if (path == null) {
-        return null;
-      }
-    }
-    String pkgName;
-    String relPath;
-    int index = path.indexOf('/');
-    if (index == -1) {
-      // No slash
-      pkgName = path;
-      relPath = "";
-    } else if (index == 0) {
-      // Leading slash is invalid
-      return null;
-    } else {
-      // <pkgName>/<relPath>
-      pkgName = path.substring(0, index);
-      relPath = path.substring(index + 1);
-    }
-    for (JavaFile packagesDirectory in _packagesDirectories) {
-      JavaFile resolvedFile = JavaFile.relative(packagesDirectory, path);
-      if (resolvedFile.exists()) {
-        JavaFile canonicalFile =
-            getCanonicalFile(packagesDirectory, pkgName, relPath);
-        if (actualUri != null) {
-          return FileBasedSource(canonicalFile, actualUri);
-        }
-        if (_isSelfReference(packagesDirectory, canonicalFile)) {
-          uri = canonicalFile.toURI();
-        }
-        return FileBasedSource(canonicalFile, uri);
-      }
-    }
-    return FileBasedSource(
-        getCanonicalFile(_packagesDirectories[0], pkgName, relPath),
-        actualUri ?? uri);
-  }
-
-  @override
-  Uri restoreAbsolute(Source source) {
-    String sourceUri = _toFileUri(source.fullName);
-    for (JavaFile packagesDirectory in _packagesDirectories) {
-      List<JavaFile> pkgFolders = packagesDirectory.listFiles();
-      if (pkgFolders != null) {
-        for (JavaFile pkgFolder in pkgFolders) {
-          try {
-            String pkgCanonicalUri = _toFileUri(pkgFolder.getCanonicalPath());
-            if (sourceUri.startsWith(pkgCanonicalUri)) {
-              String relPath = sourceUri.substring(pkgCanonicalUri.length);
-              return Uri.parse(
-                  "$PACKAGE_SCHEME:${pkgFolder.getName()}$relPath");
-            }
-          } catch (_) {}
-        }
-      }
-    }
-    return null;
-  }
-
-  /// @return `true` if "file" was found in "packagesDir", and it is part of
-  ///         the "lib" folder of the application that contains in this
-  ///         "packagesDir".
-  bool _isSelfReference(JavaFile packagesDir, JavaFile file) {
-    JavaFile rootDir = packagesDir.getParentFile();
-    if (rootDir == null) {
-      return false;
-    }
-    String rootPath = rootDir.getAbsolutePath();
-    String filePath = file.getAbsolutePath();
-    return filePath.startsWith("$rootPath/lib");
-  }
-
-  /// Convert the given file path to a "file:" URI.  On Windows, this transforms
-  /// backslashes to forward slashes.
-  String _toFileUri(String filePath) => path.context.toUri(filePath).toString();
-
-  /// Return `true` if the given URI is a `package` URI.
-  ///
-  /// @param uri the URI being tested
-  /// @return `true` if the given URI is a `package` URI
-  static bool isPackageUri(Uri uri) => PACKAGE_SCHEME == uri.scheme;
-}
-
-/// Instances of the class `RelativeFileUriResolver` resolve `file` URI's.
-///
-/// This class is now deprecated, file URI resolution should be done with
-/// ResourceUriResolver, i.e.
-/// 'new ResourceUriResolver(PhysicalResourceProvider.INSTANCE)'.
-@deprecated
-class RelativeFileUriResolver extends UriResolver {
-  /// The name of the `file` scheme.
-  static String FILE_SCHEME = "file";
-
-  /// The directories for the relatvie URI's
-  final List<JavaFile> _relativeDirectories;
-
-  /// The root directory for all the source trees
-  final JavaFile _rootDirectory;
-
-  /// Initialize a newly created resolver to resolve `file` URI's relative to
-  /// the given root directory.
-  RelativeFileUriResolver(this._rootDirectory, this._relativeDirectories)
-      : super();
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    String rootPath = _rootDirectory.toURI().path;
-    String uriPath = uri.path;
-    if (uriPath != null && uriPath.startsWith(rootPath)) {
-      String filePath = uri.path.substring(rootPath.length);
-      for (JavaFile dir in _relativeDirectories) {
-        JavaFile file = JavaFile.relative(dir, filePath);
-        if (file.exists()) {
-          return FileBasedSource(file, actualUri ?? uri);
-        }
-      }
-    }
-    return null;
-  }
-
-  /// Return `true` if the given URI is a `file` URI.
-  ///
-  /// @param uri the URI being tested
-  /// @return `true` if the given URI is a `file` URI
-  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
-}
diff --git a/pkg/analyzer/lib/src/generated/visitors.dart b/pkg/analyzer/lib/src/generated/visitors.dart
deleted file mode 100644
index 62cb61a..0000000
--- a/pkg/analyzer/lib/src/generated/visitors.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2015, 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.
-
-@deprecated
-library analyzer.src.generated.visitors;
-
-export 'package:analyzer/dart/ast/visitor.dart' show DelegatingAstVisitor;
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index c1e1a66..b7ea31c 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
@@ -171,6 +172,12 @@
     return _analysisContext.analysisOptions.contextFeatures;
   }
 
+  AnalysisDriver get _analysisDriver {
+    var session = _analysisContext.currentSession as AnalysisSessionImpl;
+    // ignore: deprecated_member_use_from_same_package
+    return session.getDriver();
+  }
+
   /// Return libraries that are available to the file with the given [path].
   ///
   /// With `Pub`, files below the `pubspec.yaml` file can access libraries
@@ -434,11 +441,7 @@
   }
 
   void _scheduleKnownFiles() {
-    var session = _analysisContext.currentSession as AnalysisSessionImpl;
-    // ignore: deprecated_member_use_from_same_package
-    var analysisDriver = session.getDriver();
-
-    for (var path in analysisDriver.knownFiles) {
+    for (var path in _analysisDriver.knownFiles) {
       if (_knownPathSet.add(path)) {
         if (!path.contains(r'/lib/src/') && !path.contains(r'\lib\src\')) {
           _knownPathList.add(path);
@@ -449,8 +452,7 @@
   }
 
   void _scheduleSdkLibraries() {
-    // ignore: deprecated_member_use_from_same_package
-    var sdk = _analysisContext.currentSession.sourceFactory.dartSdk;
+    var sdk = _analysisDriver.sourceFactory.dartSdk;
     for (var uriStr in sdk.uris) {
       if (!uriStr.startsWith('dart:_')) {
         var uri = Uri.parse(uriStr);
diff --git a/pkg/analyzer/lib/task/model.dart b/pkg/analyzer/lib/task/model.dart
deleted file mode 100644
index 6768ca2..0000000
--- a/pkg/analyzer/lib/task/model.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2015, 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.
-
-@deprecated
-library task.model;
-
-export 'package:analyzer/src/task/api/model.dart';
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 92f288c..e2d78c9 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.39.18-dev
+version: 0.40.0
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 
@@ -7,9 +7,8 @@
   sdk: '>=2.7.0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^7.0.0
+  _fe_analyzer_shared: ^8.0.0
   args: ^1.0.0
-  charcode: ^1.1.0
   cli_util: '>=0.1.4 <0.3.0'
   collection: ^1.10.1
   convert: ^2.0.0
diff --git a/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart b/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
index 8ff2783..23deeb1 100644
--- a/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
+++ b/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/constant/from_environment_evaluator.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -21,133 +20,244 @@
 
 @reflectiveTest
 class FromEnvironmentEvaluatorTest {
+  static const String _defaultValue = 'defaultValue';
+
   TypeProvider typeProvider;
   TypeSystemImpl typeSystem;
 
+  DartObjectImpl get _boolValueFalse {
+    return DartObjectImpl(
+      typeSystem,
+      typeProvider.boolType,
+      BoolState.FALSE_STATE,
+    );
+  }
+
+  DartObjectImpl get _boolValueTrue {
+    return DartObjectImpl(
+      typeSystem,
+      typeProvider.boolType,
+      BoolState.TRUE_STATE,
+    );
+  }
+
+  DartObjectImpl get _nullValue {
+    return DartObjectImpl(
+      typeSystem,
+      typeProvider.nullType,
+      NullState.NULL_STATE,
+    );
+  }
+
   void setUp() {
     var analysisContext = TestAnalysisContext();
     typeProvider = analysisContext.typeProviderLegacy;
     typeSystem = analysisContext.typeSystemLegacy;
   }
 
-  @deprecated
+  void test_getBool_default() {
+    var name = 'foo';
+    var variables = FromEnvironmentEvaluator(
+      typeSystem,
+      DeclaredVariables.fromMap({}),
+    );
+    var object = _getBool(
+      variables,
+      name,
+      {_defaultValue: _boolValueFalse},
+    );
+    expect(object, _boolValueFalse);
+  }
+
   void test_getBool_false() {
-    String variableName = "var";
+    var name = 'foo';
     var variables = FromEnvironmentEvaluator(
       typeSystem,
-      DeclaredVariables.fromMap({variableName: 'false'}),
+      DeclaredVariables.fromMap({name: 'false'}),
     );
-    DartObject object = variables.getBool(variableName);
-    expect(object, isNotNull);
-    expect(object.toBoolValue(), false);
+    var object = _getBool(
+      variables,
+      name,
+      {_defaultValue: _boolValueFalse},
+    );
+    expect(object, _boolValueFalse);
   }
 
-  @deprecated
   void test_getBool_invalid() {
-    String variableName = "var";
+    var name = 'foo';
     var variables = FromEnvironmentEvaluator(
       typeSystem,
-      DeclaredVariables.fromMap({variableName: 'not true'}),
+      DeclaredVariables.fromMap({name: 'not bool'}),
     );
-    _assertNullDartObject(
-      variables.getBool(variableName),
+    var object = _getBool(
+      variables,
+      name,
+      {_defaultValue: _boolValueFalse},
     );
+    expect(object, _boolValueFalse);
   }
 
-  @deprecated
   void test_getBool_true() {
-    String variableName = "var";
+    var name = 'foo';
     var variables = FromEnvironmentEvaluator(
       typeSystem,
-      DeclaredVariables.fromMap({variableName: 'true'}),
+      DeclaredVariables.fromMap({name: 'true'}),
     );
-    DartObject object = variables.getBool(variableName);
-    expect(object, isNotNull);
-    expect(object.toBoolValue(), true);
+    var object = _getBool(
+      variables,
+      name,
+      {_defaultValue: _boolValueFalse},
+    );
+    expect(object, _boolValueTrue);
   }
 
-  @deprecated
-  void test_getBool_undefined() {
-    String variableName = "var";
-    var variables = FromEnvironmentEvaluator(
-      typeSystem,
-      DeclaredVariables(),
-    );
-    _assertUnknownDartObject(
-      typeProvider.boolType,
-      variables.getBool(variableName),
-    );
-  }
-
-  @deprecated
   void test_getInt_invalid() {
-    String variableName = "var";
+    var name = 'foo';
     var variables = FromEnvironmentEvaluator(
       typeSystem,
-      DeclaredVariables.fromMap({variableName: 'four score and seven years'}),
+      DeclaredVariables.fromMap({name: 'four score and seven years'}),
     );
-    _assertNullDartObject(
-      variables.getInt(variableName),
+    var object = _getInt(
+      variables,
+      name,
+      {_defaultValue: _intValue(0)},
     );
+    expect(object, _intValue(0));
   }
 
-  @deprecated
-  void test_getInt_undefined() {
-    String variableName = "var";
+  void test_getInt_undefined_defaultNull() {
+    var name = 'foo';
     var variables = FromEnvironmentEvaluator(
       typeSystem,
       DeclaredVariables(),
     );
-    _assertUnknownDartObject(
-      typeProvider.intType,
-      variables.getInt(variableName),
+    var object = _getInt(
+      variables,
+      name,
+      {_defaultValue: _nullValue},
     );
+    expect(object, _nullValue);
   }
 
-  @deprecated
+  void test_getInt_undefined_defaultZero() {
+    var name = 'foo';
+    var variables = FromEnvironmentEvaluator(
+      typeSystem,
+      DeclaredVariables(),
+    );
+    var object = _getInt(
+      variables,
+      name,
+      {_defaultValue: _intValue(0)},
+    );
+    expect(object, _intValue(0));
+  }
+
   void test_getInt_valid() {
-    String variableName = "var";
+    var name = 'foo';
     var variables = FromEnvironmentEvaluator(
       typeSystem,
-      DeclaredVariables.fromMap({variableName: '23'}),
+      DeclaredVariables.fromMap({name: '23'}),
     );
-    DartObject object = variables.getInt(variableName);
-    expect(object, isNotNull);
-    expect(object.toIntValue(), 23);
+    var object = _getInt(
+      variables,
+      name,
+      {_defaultValue: _intValue(0)},
+    );
+    expect(object, _intValue(23));
   }
 
-  @deprecated
   void test_getString_defined() {
-    String variableName = "var";
-    String value = "value";
+    var name = 'foo';
     var variables = FromEnvironmentEvaluator(
       typeSystem,
-      DeclaredVariables.fromMap({variableName: value}),
+      DeclaredVariables.fromMap({name: 'bar'}),
     );
-    DartObject object = variables.getString(variableName);
-    expect(object, isNotNull);
-    expect(object.toStringValue(), value);
+    var object = _getString(
+      variables,
+      name,
+      {_defaultValue: _nullValue},
+    );
+    expect(object, _stringValue('bar'));
   }
 
-  @deprecated
-  void test_getString_undefined() {
-    String variableName = "var";
+  void test_getString_undefined_defaultEmpty() {
+    var name = 'foo';
     var variables = FromEnvironmentEvaluator(
       typeSystem,
       DeclaredVariables(),
     );
-    _assertUnknownDartObject(
-      typeProvider.stringType,
-      variables.getString(variableName),
+    var object = _getString(
+      variables,
+      name,
+      {_defaultValue: _stringValue('')},
+    );
+    expect(object, _stringValue(''));
+  }
+
+  void test_getString_undefined_defaultNull() {
+    var name = 'foo';
+    var variables = FromEnvironmentEvaluator(
+      typeSystem,
+      DeclaredVariables(),
+    );
+    var object = _getString(
+      variables,
+      name,
+      {_defaultValue: _nullValue},
+    );
+    expect(object, _nullValue);
+  }
+
+  DartObjectImpl _getBool(
+    FromEnvironmentEvaluator variables,
+    String name,
+    Map<String, DartObjectImpl> namedValues,
+  ) {
+    return variables.getBool2(
+      name,
+      namedValues,
+      typeProvider.boolElement.getNamedConstructor('fromEnvironment'),
     );
   }
 
-  void _assertNullDartObject(DartObject result) {
-    expect(result.type, typeProvider.nullType);
+  DartObjectImpl _getInt(
+    FromEnvironmentEvaluator variables,
+    String name,
+    Map<String, DartObjectImpl> namedValues,
+  ) {
+    return variables.getInt2(
+      name,
+      namedValues,
+      typeProvider.intElement.getNamedConstructor('fromEnvironment'),
+    );
   }
 
-  void _assertUnknownDartObject(DartType expectedType, DartObject result) {
-    expect((result as DartObjectImpl).isUnknown, isTrue);
-    expect(result.type, expectedType);
+  DartObjectImpl _getString(
+    FromEnvironmentEvaluator variables,
+    String name,
+    Map<String, DartObjectImpl> namedValues,
+  ) {
+    return variables.getString2(
+      name,
+      namedValues,
+      typeProvider.stringElement.getNamedConstructor('fromEnvironment'),
+    );
+  }
+
+  DartObjectImpl _intValue(int value) {
+    return DartObjectImpl(
+      typeSystem,
+      typeProvider.intType,
+      IntState(value),
+    );
+  }
+
+  DartObjectImpl _stringValue(String value) {
+    return DartObjectImpl(
+      typeSystem,
+      typeProvider.stringType,
+      StringState(value),
+    );
   }
 }
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index b2d7b4d..3dbf51c 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -21,8 +21,6 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ContentCacheTest);
-    // ignore: deprecated_member_use_from_same_package
-    defineReflectiveTests(CustomUriResolverTest);
     defineReflectiveTests(DartUriResolverTest);
     defineReflectiveTests(ErrorSeverityTest);
     defineReflectiveTests(FileBasedSourceTest);
@@ -50,33 +48,6 @@
   }
 }
 
-@deprecated
-@reflectiveTest
-class CustomUriResolverTest {
-  void test_creation() {
-    expect(CustomUriResolver({}), isNotNull);
-  }
-
-  void test_resolve_unknown_uri() {
-    UriResolver resolver = CustomUriResolver({
-      'custom:library': '/path/to/library.dart',
-    });
-    Source result = resolver.resolveAbsolute(Uri.parse("custom:non_library"));
-    expect(result, isNull);
-  }
-
-  void test_resolve_uri() {
-    String filePath =
-        FileUtilities2.createFile("/path/to/library.dart").getAbsolutePath();
-    UriResolver resolver = CustomUriResolver({
-      'custom:library': filePath,
-    });
-    Source result = resolver.resolveAbsolute(Uri.parse("custom:library"));
-    expect(result, isNotNull);
-    expect(result.fullName, filePath);
-  }
-}
-
 @reflectiveTest
 class DartUriResolverTest extends _SimpleDartSdkTest {
   DartUriResolver resolver;
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index d6ce37b..a207e65 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -652,20 +652,6 @@
     );
   }
 
-  @Deprecated('It was used internally, should not be part of API')
-  test_hasReferenceToSuper() async {
-    await assertNoErrorsInCode(r'''
-class A {}
-class B {toString() => super.toString();}''');
-    verifyTestResolved();
-
-    var a = findElement.class_('A');
-    expect(a.hasReferenceToSuper, isFalse);
-
-    var b = findElement.class_('B');
-    expect(b.hasReferenceToSuper, isTrue);
-  }
-
   test_import_hide() async {
     newFile('$testPackageLibPath/lib1.dart', content: r'''
 set foo(value) {}
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index b501bfe..5d380c9 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -709,7 +709,10 @@
 
   void _assertType(
       InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
-    expect(actualType.getDisplayString(), expectedType.getDisplayString());
+    expect(
+      actualType.getDisplayString(withNullability: false),
+      expectedType.getDisplayString(withNullability: false),
+    );
     expect(actualType.element, expectedType.element);
     List<DartType> expectedArguments = expectedType.typeArguments;
     int length = expectedArguments.length;
diff --git a/pkg/analyzer/test/generated/test_analysis_context.dart b/pkg/analyzer/test/generated/test_analysis_context.dart
index b68806a..2f24e5c 100644
--- a/pkg/analyzer/test/generated/test_analysis_context.dart
+++ b/pkg/analyzer/test/generated/test_analysis_context.dart
@@ -68,10 +68,6 @@
 
   AnalysisSessionImpl get analysisSession => _analysisSession;
 
-  @Deprecated('Use LibraryElement.typeProvider')
-  @override
-  TypeProvider get typeProvider => typeProviderLegacy;
-
   TypeProvider get typeProviderLegacy {
     return _typeProviderLegacy;
   }
@@ -80,10 +76,6 @@
     return _typeProviderNonNullableByDefault;
   }
 
-  @Deprecated('Use LibraryElement.typeSystem')
-  @override
-  TypeSystemImpl get typeSystem => typeSystemLegacy;
-
   TypeSystemImpl get typeSystemLegacy {
     return _typeSystemLegacy;
   }
diff --git a/pkg/analyzer/test/source/embedder_test.dart b/pkg/analyzer/test/source/embedder_test.dart
deleted file mode 100644
index d44bc06..0000000
--- a/pkg/analyzer/test/source/embedder_test.dart
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) 2015, 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.
-
-@deprecated
-library analyzer.test.source.embedder_test;
-
-import 'dart:core';
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/embedder.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../embedder_tests.dart';
-import '../resource_utils.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(DartUriResolverTest);
-    defineReflectiveTests(EmbedderSdkTest);
-    defineReflectiveTests(EmbedderUriResolverTest);
-  });
-}
-
-@reflectiveTest
-class DartUriResolverTest extends EmbedderRelatedTest {
-  void test_embedderYaml() {
-    EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
-    });
-    EmbedderSdk sdk = EmbedderSdk(locator.embedderYamls);
-    DartUriResolver resolver = DartUriResolver(sdk);
-
-    void expectResolved(dartUri, posixPath) {
-      Source source = resolver.resolveAbsolute(Uri.parse(dartUri));
-      expect(source, isNotNull, reason: dartUri);
-      expect(source.fullName, posixToOSPath(posixPath));
-    }
-
-    // Check that they map to the correct paths.
-    expectResolved('dart:core', '$foxLib/core/core.dart');
-    expectResolved('dart:fox', '$foxLib/slippy.dart');
-    expectResolved('dart:bear', '$foxLib/grizzly.dart');
-    expectResolved('dart:relative', '$foxPath/relative.dart');
-    expectResolved('dart:deep', '$foxLib/deep/directory/file.dart');
-  }
-}
-
-@reflectiveTest
-class EmbedderSdkTest extends EmbedderRelatedTest {
-  void test_creation() {
-    EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
-    });
-    EmbedderSdk sdk = EmbedderSdk(locator.embedderYamls);
-
-    expect(sdk.urlMappings, hasLength(5));
-  }
-
-  void test_fromFileUri() {
-    EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
-    });
-    EmbedderSdk sdk = EmbedderSdk(locator.embedderYamls);
-
-    expectSource(String posixPath, String dartUri) {
-      Uri uri = Uri.parse(posixToOSFileUri(posixPath));
-      Source source = sdk.fromFileUri(uri);
-      expect(source, isNotNull, reason: posixPath);
-      expect(source.uri.toString(), dartUri);
-      expect(source.fullName, posixToOSPath(posixPath));
-    }
-
-    expectSource('$foxLib/slippy.dart', 'dart:fox');
-    expectSource('$foxLib/deep/directory/file.dart', 'dart:deep');
-    expectSource('$foxLib/deep/directory/part.dart', 'dart:deep/part.dart');
-  }
-
-  void test_getSdkLibrary() {
-    EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
-    });
-    EmbedderSdk sdk = EmbedderSdk(locator.embedderYamls);
-
-    SdkLibrary lib = sdk.getSdkLibrary('dart:fox');
-    expect(lib, isNotNull);
-    expect(lib.path, posixToOSPath('$foxLib/slippy.dart'));
-    expect(lib.shortName, 'dart:fox');
-  }
-
-  void test_mapDartUri() {
-    EmbedderYamlLocator locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
-    });
-    EmbedderSdk sdk = EmbedderSdk(locator.embedderYamls);
-
-    void expectSource(String dartUri, String posixPath) {
-      Source source = sdk.mapDartUri(dartUri);
-      expect(source, isNotNull, reason: posixPath);
-      expect(source.uri.toString(), dartUri);
-      expect(source.fullName, posixToOSPath(posixPath));
-    }
-
-    expectSource('dart:core', '$foxLib/core/core.dart');
-    expectSource('dart:fox', '$foxLib/slippy.dart');
-    expectSource('dart:deep', '$foxLib/deep/directory/file.dart');
-    expectSource('dart:deep/part.dart', '$foxLib/deep/directory/part.dart');
-  }
-}
-
-@reflectiveTest
-class EmbedderUriResolverTest extends EmbedderRelatedTest {
-  void test_embedderYaml() {
-    var locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
-    });
-    var resolver = EmbedderUriResolver(locator.embedderYamls);
-
-    expectResolved(dartUri, posixPath) {
-      Source source = resolver.resolveAbsolute(Uri.parse(dartUri));
-      expect(source, isNotNull, reason: dartUri);
-      expect(source.fullName, posixToOSPath(posixPath));
-    }
-
-    // We have five mappings.
-    expect(resolver, hasLength(5));
-    // Check that they map to the correct paths.
-    expectResolved('dart:core', '$foxLib/core/core.dart');
-    expectResolved('dart:fox', '$foxLib/slippy.dart');
-    expectResolved('dart:bear', '$foxLib/grizzly.dart');
-    expectResolved('dart:relative', '$foxPath/relative.dart');
-    expectResolved('dart:deep', '$foxLib/deep/directory/file.dart');
-  }
-
-  void test_nullEmbedderYamls() {
-    var resolver = EmbedderUriResolver(null);
-    expect(resolver, hasLength(0));
-  }
-
-  void test_restoreAbsolute() {
-    var locator = EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
-    });
-    var resolver = EmbedderUriResolver(locator.embedderYamls);
-
-    expectRestore(String dartUri, [String expected]) {
-      var parsedUri = Uri.parse(dartUri);
-      var source = resolver.resolveAbsolute(parsedUri);
-      expect(source, isNotNull);
-      // Restore source's uri.
-      var restoreUri = resolver.restoreAbsolute(source);
-      expect(restoreUri, isNotNull, reason: dartUri);
-      // Verify that it is 'dart:fox'.
-      expect(restoreUri.toString(), expected ?? dartUri);
-      List<String> split = (expected ?? dartUri).split(':');
-      expect(restoreUri.scheme, split[0]);
-      expect(restoreUri.path, split[1]);
-    }
-
-    expectRestore('dart:deep');
-    expectRestore('dart:deep/file.dart', 'dart:deep');
-    expectRestore('dart:deep/part.dart');
-    expectRestore('dart:deep/deep/file.dart');
-  }
-}
diff --git a/pkg/analyzer/test/source/test_all.dart b/pkg/analyzer/test/source/test_all.dart
index 83fbf29..ec2bcfe 100644
--- a/pkg/analyzer/test/source/test_all.dart
+++ b/pkg/analyzer/test/source/test_all.dart
@@ -5,8 +5,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'analysis_options_provider_test.dart' as analysis_options_provider_test;
-import 'embedder_test.dart' // ignore: deprecated_member_use_from_same_package
-    as embedder_test;
 import 'error_processor_test.dart' as error_processor_test;
 import 'package_map_resolver_test.dart' as package_map_resolver_test;
 import 'path_filter_test.dart' as path_filter_test;
@@ -14,7 +12,6 @@
 main() {
   defineReflectiveSuite(() {
     analysis_options_provider_test.main();
-    embedder_test.main();
     error_processor_test.main();
     package_map_resolver_test.main();
     path_filter_test.main();
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index 32093f7..e3d502f 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -60,7 +60,6 @@
 
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
-    expect(defaultOptions.strongMode, true);
     expect(defaultOptions.implicitCasts, false);
     expect(defaultOptions.implicitDynamic, false);
   }
@@ -79,7 +78,6 @@
     expect(options.defaultPackageFilePath, isNull);
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
-    expect(defaultOptions.strongMode, true);
     expect(defaultOptions.implicitCasts, true);
     expect(defaultOptions.implicitDynamic, true);
   }
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 73e1ad7..0884c88 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -766,7 +766,6 @@
       actual.lintRules.map((l) => l.name),
       unorderedEquals(expected.lintRules.map((l) => l.name)),
     );
-    expect(actual.strongMode, expected.strongMode);
     expect(actual.implicitCasts, expected.implicitCasts);
     expect(actual.implicitDynamic, expected.implicitDynamic);
     expect(actual.strictInference, expected.strictInference);
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 b1dc776..2652a8d 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -949,8 +949,6 @@
       itemElement1 = itemElement;
 
       expect(closureElement.returnType, typeProvider.nullType);
-      // TODO(scheglov) Make this null.
-//      expect(closureElement.type.element, same(closureElement));
       assertType(closureElement.type, closureTypeStr);
       expect(closure.staticType, same(closureElement.type));
 
@@ -991,7 +989,6 @@
       expect(itemElement, isNot(same(itemElement1)));
 
       expect(closureElement.returnType, typeProvider.nullType);
-      expect(closureElement.type.element, same(closureElement));
       assertType(closureElement.type, closureTypeStr);
       expect(closure.staticType, same(closureElement.type));
 
diff --git a/pkg/analyzer/test/src/dart/analysis/experiments_test.dart b/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
index d45fd53..f78177e 100644
--- a/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/analysis/experiments_impl.dart';
+import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -54,7 +55,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     expect(getFlags(fromStrings(['no-a', 'a'])), [true]);
   }
@@ -67,7 +69,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     expect(getFlags(fromStrings(['a', 'no-a'])), [false]);
   }
@@ -79,7 +82,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     knownFeatures['b'] = ExperimentalFeature(
       index: 1,
@@ -87,7 +91,8 @@
       isEnabledByDefault: true,
       isExpired: false,
       documentation: 'b',
-      firstSupportedVersion: '1.0.0',
+      experimentalReleaseVersion: null,
+      releaseVersion: Version.parse('1.0.0'),
     );
     expect(getFlags(fromStrings([])), [false, true]);
   }
@@ -99,7 +104,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     expect(getFlags(fromStrings(['no-a'])), [false]);
   }
@@ -111,7 +117,8 @@
       isEnabledByDefault: true,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: '1.0.0',
+      experimentalReleaseVersion: null,
+      releaseVersion: Version.parse('1.0.0'),
     );
     expect(getFlags(fromStrings(['no-a'])), [false]);
   }
@@ -123,7 +130,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     expect(getFlags(fromStrings(['a'])), [true]);
   }
@@ -135,7 +143,8 @@
       isEnabledByDefault: true,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: '1.0.0',
+      experimentalReleaseVersion: null,
+      releaseVersion: Version.parse('1.0.0'),
     );
     expect(getFlags(fromStrings(['a'])), [true]);
   }
@@ -148,7 +157,8 @@
       isEnabledByDefault: true,
       isExpired: true,
       documentation: 'a',
-      firstSupportedVersion: '1.0.0',
+      experimentalReleaseVersion: null,
+      releaseVersion: Version.parse('1.0.0'),
     );
     expect(getFlags(fromStrings(['no-a'])), [true]);
   }
@@ -161,7 +171,8 @@
       isEnabledByDefault: false,
       isExpired: true,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     expect(getFlags(fromStrings(['a'])), [false]);
   }
@@ -174,7 +185,8 @@
       isEnabledByDefault: false,
       isExpired: true,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     expect(getFlags(fromStrings(['no-a'])), [false]);
   }
@@ -187,7 +199,8 @@
       isEnabledByDefault: true,
       isExpired: true,
       documentation: 'a',
-      firstSupportedVersion: '1.0.0',
+      experimentalReleaseVersion: null,
+      releaseVersion: Version.parse('1.0.0'),
     );
     expect(getFlags(fromStrings(['a'])), [true]);
   }
@@ -204,7 +217,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     knownFeatures['b'] = ExperimentalFeature(
       index: 1,
@@ -212,7 +226,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'b',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     knownFeatures['c'] = ExperimentalFeature(
       index: 2,
@@ -220,7 +235,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'c',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     var validationResult =
         getValidateCombinationResult(['a', 'no-c'], ['no-b', 'c']);
@@ -237,7 +253,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     knownFeatures['b'] = ExperimentalFeature(
       index: 1,
@@ -245,7 +262,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'b',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     knownFeatures['c'] = ExperimentalFeature(
       index: 2,
@@ -253,7 +271,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'c',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     var validationResult =
         getValidateCombinationResult(['a', 'c'], ['no-b', 'no-c']);
@@ -270,7 +289,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     knownFeatures['b'] = ExperimentalFeature(
       index: 1,
@@ -278,7 +298,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'b',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     knownFeatures['c'] = ExperimentalFeature(
       index: 2,
@@ -286,7 +307,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'c',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     expect(getValidateCombinationResult(['a', 'c'], ['no-b', 'c']), isEmpty);
   }
@@ -298,7 +320,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     var validationResult = getValidationResult(['no-a', 'a']);
     expect(validationResult, hasLength(1));
@@ -318,7 +341,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     var validationResult = getValidationResult(['a', 'no-a']);
     expect(validationResult, hasLength(1));
@@ -338,7 +362,8 @@
       isEnabledByDefault: true,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: '1.0.0',
+      experimentalReleaseVersion: null,
+      releaseVersion: Version.parse('1.0.0'),
     );
     expect(getValidationResult(['no-a', 'no-a']), isEmpty);
   }
@@ -350,7 +375,8 @@
       isEnabledByDefault: false,
       isExpired: false,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     expect(getValidationResult(['a', 'a']), isEmpty);
   }
@@ -362,7 +388,8 @@
       isEnabledByDefault: true,
       isExpired: true,
       documentation: 'a',
-      firstSupportedVersion: '1.0.0',
+      experimentalReleaseVersion: null,
+      releaseVersion: Version.parse('1.0.0'),
     );
     var validationResult = getValidationResult(['no-a']);
     expect(validationResult, hasLength(1));
@@ -380,7 +407,8 @@
       isEnabledByDefault: false,
       isExpired: true,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     var validationResult = getValidationResult(['a']);
     expect(validationResult, hasLength(1));
@@ -398,7 +426,8 @@
       isEnabledByDefault: false,
       isExpired: true,
       documentation: 'a',
-      firstSupportedVersion: null,
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
     );
     var validationResult = getValidationResult(['no-a']);
     expect(validationResult, hasLength(1));
@@ -416,7 +445,8 @@
       isEnabledByDefault: true,
       isExpired: true,
       documentation: 'a',
-      firstSupportedVersion: '1.0.0',
+      experimentalReleaseVersion: null,
+      releaseVersion: Version.parse('1.0.0'),
     );
     var validationResult = getValidationResult(['a']);
     expect(validationResult, hasLength(1));
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 839533e..5e5655f 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -493,20 +493,4 @@
   test_resourceProvider() async {
     expect(session.resourceProvider, resourceProvider);
   }
-
-  @deprecated
-  test_typeProvider() async {
-    var typeProvider = await session.typeProvider;
-    expect(typeProvider.intType.element.name, 'int');
-  }
-
-  @deprecated
-  test_typeSystem() async {
-    var typeSystem = await session.typeSystem;
-    var typeProvider = typeSystem.typeProvider;
-    expect(
-      typeSystem.isSubtypeOf(typeProvider.intType, typeProvider.numType),
-      isTrue,
-    );
-  }
 }
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index f8fa5e5..b4fda30 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -1191,71 +1191,6 @@
     expect(type.resolveToBound(null), same(type));
   }
 
-  @deprecated
-  void test_substitute2_equal() {
-    ClassElementImpl definingClass = ElementFactory.classElement2("C", ["E"]);
-    TypeParameterType parameterType =
-        typeParameterTypeStar(definingClass.typeParameters[0]);
-    MethodElementImpl functionElement = MethodElementImpl('m', -1);
-    String namedParameterName = "c";
-    functionElement.parameters = <ParameterElement>[
-      ElementFactory.requiredParameter2("a", parameterType),
-      ElementFactory.positionalParameter2("b", parameterType),
-      ElementFactory.namedParameter2(namedParameterName, parameterType)
-    ];
-    functionElement.returnType = parameterType;
-    definingClass.methods = <MethodElement>[functionElement];
-    FunctionTypeImpl functionType = functionElement.type;
-    InterfaceTypeImpl argumentType =
-        interfaceTypeStar(ClassElementImpl('D', -1));
-    FunctionType result = functionType
-        .substitute2(<DartType>[argumentType], <DartType>[parameterType]);
-    expect(result.returnType, argumentType);
-    List<DartType> normalParameters = result.normalParameterTypes;
-    expect(normalParameters, hasLength(1));
-    expect(normalParameters[0], argumentType);
-    List<DartType> optionalParameters = result.optionalParameterTypes;
-    expect(optionalParameters, hasLength(1));
-    expect(optionalParameters[0], argumentType);
-    Map<String, DartType> namedParameters = result.namedParameterTypes;
-    expect(namedParameters, hasLength(1));
-    expect(namedParameters[namedParameterName], argumentType);
-  }
-
-  @deprecated
-  void test_substitute2_notEqual() {
-    DartType returnType = interfaceTypeStar(ClassElementImpl('R', -1));
-    DartType normalParameterType = interfaceTypeStar(ClassElementImpl('A', -1));
-    DartType optionalParameterType =
-        interfaceTypeStar(ClassElementImpl('B', -1));
-    DartType namedParameterType = interfaceTypeStar(ClassElementImpl('C', -1));
-    FunctionElementImpl functionElement = FunctionElementImpl('f', -1);
-    String namedParameterName = "c";
-    functionElement.parameters = <ParameterElement>[
-      ElementFactory.requiredParameter2("a", normalParameterType),
-      ElementFactory.positionalParameter2("b", optionalParameterType),
-      ElementFactory.namedParameter2(namedParameterName, namedParameterType)
-    ];
-    functionElement.returnType = returnType;
-    FunctionTypeImpl functionType = functionElement.type;
-    InterfaceTypeImpl argumentType =
-        interfaceTypeStar(ClassElementImpl('D', -1));
-    TypeParameterTypeImpl parameterType =
-        typeParameterTypeStar(TypeParameterElementImpl('E', -1));
-    FunctionType result = functionType
-        .substitute2(<DartType>[argumentType], <DartType>[parameterType]);
-    expect(result.returnType, returnType);
-    List<DartType> normalParameters = result.normalParameterTypes;
-    expect(normalParameters, hasLength(1));
-    expect(normalParameters[0], normalParameterType);
-    List<DartType> optionalParameters = result.optionalParameterTypes;
-    expect(optionalParameters, hasLength(1));
-    expect(optionalParameters[0], optionalParameterType);
-    Map<String, DartType> namedParameters = result.namedParameterTypes;
-    expect(namedParameters, hasLength(1));
-    expect(namedParameters[namedParameterName], namedParameterType);
-  }
-
   void test_toString_recursive() {
     var t = ElementFactory.genericTypeAliasElement("t");
     var s = ElementFactory.genericTypeAliasElement("s");
@@ -2096,44 +2031,6 @@
     // Returns this.
     expect(type.resolveToBound(null), same(type));
   }
-
-  @deprecated
-  void test_substitute_exception() {
-    try {
-      var classA = class_(name: 'A');
-      InterfaceTypeImpl type = interfaceTypeStar(classA);
-      InterfaceType argumentType = interfaceTypeStar(class_(name: 'B'));
-      type.substitute2(<DartType>[argumentType], <DartType>[]);
-      fail(
-          "Expected to encounter exception, argument and parameter type array lengths not equal.");
-    } catch (e) {
-      // Expected result
-    }
-  }
-
-  @deprecated
-  void test_substitute_notEqual() {
-    // The [test_substitute_equals] above has a slightly higher level
-    // implementation.
-    var classA = class_(name: 'A');
-    TypeParameterElementImpl parameterElement =
-        TypeParameterElementImpl('E', -1);
-    TypeParameterTypeImpl parameter = typeParameterTypeStar(parameterElement);
-    InterfaceTypeImpl type = InterfaceTypeImpl(
-      element: classA,
-      typeArguments: <DartType>[parameter],
-      nullabilitySuffix: NullabilitySuffix.star,
-    );
-    InterfaceType argumentType = interfaceTypeStar(class_(name: 'B'));
-    TypeParameterTypeImpl parameterType =
-        typeParameterTypeStar(TypeParameterElementImpl('F', -1));
-    InterfaceType result =
-        type.substitute2(<DartType>[argumentType], <DartType>[parameterType]);
-    expect(result.element, classA);
-    List<DartType> resultArguments = result.typeArguments;
-    expect(resultArguments, hasLength(1));
-    expect(resultArguments[0], parameter);
-  }
 }
 
 @reflectiveTest
@@ -2386,27 +2283,6 @@
         same(VoidTypeImpl.instance));
   }
 
-  @deprecated
-  void test_substitute_equal() {
-    TypeParameterElementImpl element = TypeParameterElementImpl('E', -1);
-    TypeParameterTypeImpl type = typeParameterTypeStar(element);
-    InterfaceTypeImpl argument = interfaceTypeStar(ClassElementImpl('A', -1));
-    TypeParameterTypeImpl parameter = typeParameterTypeStar(element);
-    expect(type.substitute2(<DartType>[argument], <DartType>[parameter]),
-        same(argument));
-  }
-
-  @deprecated
-  void test_substitute_notEqual() {
-    TypeParameterTypeImpl type =
-        typeParameterTypeStar(TypeParameterElementImpl('E', -1));
-    InterfaceTypeImpl argument = interfaceTypeStar(ClassElementImpl('A', -1));
-    TypeParameterTypeImpl parameter =
-        typeParameterTypeStar(TypeParameterElementImpl('F', -1));
-    expect(type.substitute2(<DartType>[argument], <DartType>[parameter]),
-        same(type));
-  }
-
   void _assert_asInstanceOf(
     DartType type,
     ClassElement element,
diff --git a/pkg/analyzer/test/src/dart/element/function_type_test.dart b/pkg/analyzer/test/src/dart/element/function_type_test.dart
index 9ed2264..72efa9d 100644
--- a/pkg/analyzer/test/src/dart/element/function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/function_type_test.dart
@@ -408,55 +408,6 @@
         returnType: same(objectType));
   }
 
-  @deprecated
-  test_synthetic_substitute() {
-    // Map<T, U> Function<U extends T>(T x, U y)
-    var t = typeParameter('T');
-    var u = typeParameter('U', bound: typeParameterTypeNone(t));
-    var x = requiredParameter(name: 'x', type: typeParameterTypeNone(t));
-    var y = requiredParameter(name: 'y', type: typeParameterTypeNone(u));
-    FunctionType f = FunctionTypeImpl.synthetic(
-        mapOf(typeParameterTypeNone(t), typeParameterTypeNone(u)), [u], [x, y],
-        nullabilitySuffix: NullabilitySuffix.star);
-    FunctionType substituted =
-        f.substitute2([objectType], [typeParameterTypeNone(t)]);
-    var uSubstituted = substituted.typeFormals[0];
-    basicChecks(substituted,
-        element: isNull,
-        displayName: 'Map<Object, U> Function<U extends Object>(Object, U)',
-        returnType: mapOf(objectType, typeParameterTypeNone(uSubstituted)),
-        typeFormals: [uSubstituted],
-        normalParameterNames: ['x', 'y'],
-        normalParameterTypes: [
-          same(objectType),
-          typeParameterTypeNone(uSubstituted)
-        ],
-        parameters: hasLength(2));
-  }
-
-  @deprecated
-  test_synthetic_substitute_argument_length_mismatch() {
-    // dynamic Function()
-    var t = typeParameter('T');
-    FunctionType f = FunctionTypeImpl.synthetic(dynamicType, [], [],
-        nullabilitySuffix: NullabilitySuffix.star);
-    expect(() => f.substitute2([], [typeParameterTypeStar(t)]),
-        throwsA(TypeMatcher<ArgumentError>()));
-  }
-
-  @deprecated
-  test_synthetic_substitute_unchanged() {
-    // dynamic Function<U>(U x)
-    var t = typeParameter('T');
-    var u = typeParameter('U');
-    var x = requiredParameter(name: 'x', type: typeParameterTypeStar(u));
-    FunctionType f = FunctionTypeImpl.synthetic(dynamicType, [u], [x],
-        nullabilitySuffix: NullabilitySuffix.star);
-    FunctionType substituted =
-        f.substitute2([objectType], [typeParameterTypeStar(t)]);
-    expect(substituted, same(f));
-  }
-
   test_synthetic_typeFormals() {
     var t = typeParameter('T');
     FunctionType f = FunctionTypeImpl(
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
index 0dc26d5..6c9b81a 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -560,8 +560,10 @@
 }
 ''');
     var invocation = findNode.functionExpressionInvocation('1(2)');
-    expect(invocation.staticInvokeType.element,
-        same(findElement.method('call', of: 'E')));
+    expect(
+      invocation.staticElement,
+      same(findElement.method('call', of: 'E')),
+    );
     assertInvokeType(invocation, 'int Function(int)');
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index ab2e0b4..0e2a55e 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -44,13 +44,13 @@
               literal: 0
               staticType: int
         constructorName: ConstructorName
+          staticElement: self::@class::A::@constructor::•
           type: TypeName
             name: SimpleIdentifier
               staticElement: self::@class::A
               staticType: null
               token: A
             type: A
-        staticElement: self::@class::A::@constructor::•
         staticType: A
   element: self::@class::A::@constructor::•
   name: SimpleIdentifier
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 365aac0..98788a3 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -336,6 +336,7 @@
     _writeln('ConstructorName');
     _withIndent(() {
       _writeNode('name', node.name);
+      _writeElement('staticElement', node.staticElement);
       _writeNode('type', node.type);
     });
   }
@@ -792,7 +793,6 @@
       properties.addNode('constructorName', node.constructorName);
       properties.addToken('keyword', node.keyword);
       _addExpression(properties, node);
-      _addConstructorReferenceNode(properties, node);
       _writeProperties(properties);
     });
   }
@@ -1477,14 +1477,6 @@
     _addAstNode(properties, node);
   }
 
-  void _addConstructorReferenceNode(
-    _Properties properties,
-    ConstructorReferenceNode node,
-  ) {
-    properties.addElement('staticElement', node.staticElement);
-    _addAstNode(properties, node);
-  }
-
   void _addDeclaration(_Properties properties, Declaration node) {
     properties.addElement('declaredElement', node.declaredElement);
     _addAnnotatedNode(properties, node);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 83bfa1f..a9edb27 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 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/file_system/file_system.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -10556,42 +10555,6 @@
         annotateNullability: true);
   }
 
-  @deprecated
-  test_type_param_generic_function_type_nullability_legacy() async {
-    featureSet = disableNnbd;
-    var library = await checkLibrary('''
-T f<T>(T t) {}
-var g = f;
-''');
-    checkElementText(library, '''
-T Function<T>(T) g;
-T f<T>(T t) {}
-''');
-    var g = library.definingCompilationUnit.topLevelVariables[0];
-    var t = (g.type as FunctionType).typeFormals[0];
-    // TypeParameterElement.type has a nullability suffix of `star` regardless
-    // of whether it appears in a migrated library.
-    expect(t.type.nullabilitySuffix, NullabilitySuffix.star);
-  }
-
-  @deprecated
-  test_type_param_generic_function_type_nullability_migrated() async {
-    featureSet = enableNnbd;
-    var library = await checkLibrary('''
-T f<T>(T t) {}
-var g = f;
-''');
-    checkElementText(library, '''
-T Function<T>(T) g;
-T f<T>(T t) {}
-''');
-    var g = library.definingCompilationUnit.topLevelVariables[0];
-    var t = (g.type as FunctionType).typeFormals[0];
-    // TypeParameterElement.type has a nullability suffix of `star` regardless
-    // of whether it appears in a migrated library.
-    expect(t.type.nullabilitySuffix, NullabilitySuffix.star);
-  }
-
   test_type_param_ref_nullability_none() async {
     featureSet = enableNnbd;
     var library = await checkLibrary('''
@@ -11828,15 +11791,15 @@
     InstanceCreationExpression
       argumentList: ArgumentList
       constructorName: ConstructorName
+        staticElement: ConstructorMember
+          base: self::@class::A::@constructor::•
+          substitution: {T: int}
         type: TypeName
           name: SimpleIdentifier
             staticElement: self::@class::A
             staticType: null
             token: A
           type: A<int>
-      staticElement: ConstructorMember
-        base: self::@class::A::@constructor::•
-        substitution: {T: int}
       staticType: A<int>
 ''',
         withFullyResolvedAst: true);
diff --git a/pkg/analyzer/tool/experiments/generate.dart b/pkg/analyzer/tool/experiments/generate.dart
index 02b1a0e..0183ed7 100644
--- a/pkg/analyzer/tool/experiments/generate.dart
+++ b/pkg/analyzer/tool/experiments/generate.dart
@@ -169,18 +169,19 @@
       var enabledIn = (features[key] as YamlMap)['enabledIn'];
       out.write('''
 
-      static const $id = ExperimentalFeature(
+      static final $id = ExperimentalFeature(
         index: $index,
         enableString: EnableString.$id,
         isEnabledByDefault: IsEnabledByDefault.$id,
         isExpired: IsExpired.$id,
         documentation: '$help',
     ''');
+      out.write("experimentalReleaseVersion: null,");
       if (enabledIn != null) {
         enabledIn = _versionNumberAsString(enabledIn);
-        out.write("firstSupportedVersion: '$enabledIn',");
+        out.write("releaseVersion: Version.parse('$enabledIn'),");
       } else {
-        out.write("firstSupportedVersion: null,");
+        out.write("releaseVersion: null,");
       }
       out.writeln(');');
       ++index;
@@ -236,7 +237,7 @@
     out.write('''
 
 /// A map containing information about all known experimental flags.
-const _knownFeatures = <String, ExperimentalFeature>{
+final _knownFeatures = <String, ExperimentalFeature>{
 ''');
     for (var key in keysSorted) {
       var id = keyToIdentifier(key);
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index b761a0e..7fb1c29 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -1,7 +1,9 @@
 name: analyzer_cli
 description: Command line interface for the Dart Analyzer.
+
 # This package is not intended for consumption on pub.dev. DO NOT publish.
 publish_to: none
+
 environment:
   sdk: "^2.7.0"
 dependencies:
@@ -9,13 +11,14 @@
   args: '>=0.13.0 <2.0.0'
   bazel_worker: ^0.1.0
   collection: ^1.14.1
+  convert: any
   linter: ^0.1.16
-  package_config: '>=0.1.5 <2.0.0'
-  protobuf: ^0.13.0
+  meta: any
+  path: any
   pub_semver: ^1.4.2
   yaml: ^2.1.2
 dev_dependencies:
   pedantic: ^1.9.0
+  protobuf: ^0.13.0
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
-  usage: ^3.2.0+1
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 9d682ef..7aeb145 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -102,7 +102,8 @@
             isEnabledByDefault: false,
             isExpired: false,
             documentation: 'a',
-            firstSupportedVersion: null,
+            experimentalReleaseVersion: null,
+            releaseVersion: null,
           ),
           'b': ExperimentalFeature(
             index: 1,
@@ -110,7 +111,8 @@
             isEnabledByDefault: false,
             isExpired: false,
             documentation: 'b',
-            firstSupportedVersion: null,
+            experimentalReleaseVersion: null,
+            releaseVersion: null,
           ),
           'c': ExperimentalFeature(
             index: 2,
@@ -118,7 +120,8 @@
             isEnabledByDefault: false,
             isExpired: false,
             documentation: 'c',
-            firstSupportedVersion: null,
+            experimentalReleaseVersion: null,
+            releaseVersion: null,
           ),
         };
 
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index df17df9..1c02eab 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -11,15 +11,12 @@
   analyzer: '^0.39.12'
   charcode: '^1.1.0'
   dart_style: '^1.2.0'
-  html: '>=0.13.1 <0.15.0'
-  meta: ^1.0.2
-  path: '^1.4.1'
   pub_semver: '^1.3.2'
 
 dev_dependencies:
   analysis_tool:
     path: ../analysis_tool
-  front_end:
-    path: ../front_end
+  html: '>=0.13.1 <0.15.0'
+  path: '^1.4.1'
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 4b78a07..d6a7e2f 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -203,8 +203,7 @@
       MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER: const MessageTemplate(
           MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
           "Member '#{member}' in js-interop class '#{cls}' is not external.",
-          howToFix: "Try adding 'external' to '#{member}'. If #{member} is a "
-              "`late` field, use an `external` getter/setter instead.",
+          howToFix: "Try adding 'external' to '#{member}'.",
           examples: const [
             """
               import 'package:js/js.dart';
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index c950e0c..811409f 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -3512,7 +3512,7 @@
   //
   final Selector receiverTypeCheckSelector;
 
-  AbstractValue checkedType; // Not final because we refine it.
+  final AbstractValue checkedType;
 
   HPrimitiveCheck(this.typeExpression, this.kind, AbstractValue type,
       HInstruction input, SourceInformation sourceInformation,
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index 8e249f8..8c08b62 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -215,51 +215,14 @@
     return candidateType;
   }
 
-  AbstractValue _numericFixup(AbstractValue outputType, AbstractValue inputType,
-      AbstractValue checkedType) {
-    if (abstractValueDomain.isEmpty(outputType).isDefinitelyTrue) {
-      // Intersection of double and integer conflicts (is empty), but JS numbers
-      // can be both int and double at the same time.  For example, the input
-      // can be a literal double '8.0' that is marked as an integer (because 'is
-      // int' will return 'true').  What we really need to do is make the
-      // overlap between int and double values explicit in the TypeMask system.
-      if (abstractValueDomain.isIntegerOrNull(inputType).isDefinitelyTrue &&
-          abstractValueDomain.isDoubleOrNull(checkedType).isDefinitelyTrue) {
-        if (abstractValueDomain.isNull(inputType).isPotentiallyTrue &&
-            abstractValueDomain.isNull(checkedType).isPotentiallyTrue) {
-          outputType =
-              abstractValueDomain.includeNull(abstractValueDomain.doubleType);
-        } else {
-          outputType = abstractValueDomain.doubleType;
-        }
-      }
-    }
-    return outputType;
-  }
-
   @override
   AbstractValue visitPrimitiveCheck(HPrimitiveCheck instruction) {
     HInstruction input = instruction.checkedInput;
     AbstractValue inputType = input.instructionType;
     AbstractValue checkedType = instruction.checkedType;
 
-    // We must make sure a receiver or argument check does not try to do an int
-    // check, because an int check is not enough.  We only do an int check if
-    // the input is integer or null.
-    if (abstractValueDomain.isNumberOrNull(checkedType).isDefinitelyTrue &&
-        abstractValueDomain.isDoubleOrNull(checkedType).isDefinitelyFalse &&
-        input.isIntegerOrNull(abstractValueDomain).isDefinitelyTrue) {
-      instruction.checkedType = abstractValueDomain.intType;
-    } else if (abstractValueDomain
-            .isIntegerOrNull(checkedType)
-            .isDefinitelyTrue &&
-        input.isIntegerOrNull(abstractValueDomain).isPotentiallyFalse) {
-      instruction.checkedType = abstractValueDomain.numType;
-    }
-
     AbstractValue outputType =
         abstractValueDomain.intersection(checkedType, inputType);
-    outputType = _numericFixup(outputType, inputType, checkedType);
     if (inputType != outputType) {
       // Replace dominated uses of input with uses of this HPrimitiveCheck so
       // the uses benefit from the stronger type.
@@ -501,7 +464,6 @@
     AbstractValue inputType = input.instructionType;
     AbstractValue outputType =
         abstractValueDomain.intersection(checkedType, inputType);
-    outputType = _numericFixup(outputType, inputType, checkedType);
     if (inputType != outputType) {
       // Replace dominated uses of input with uses of this check so the uses
       // benefit from the stronger type.
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index f5b9ef8..ba32abd 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -48,11 +48,12 @@
       createAnalyticsInstance(args.contains('--disable-dartdev-analytics'));
 
   // If we have not printed the analyticsNoticeOnFirstRunMessage to stdout,
-  // and the user is on a terminal, then print the disclosure and set
-  // analytics.disclosureShownOnTerminal.
+  // the user is on a terminal, and the machine is not a bot, then print the
+  // disclosure and set analytics.disclosureShownOnTerminal to true.
   if (analytics is DartdevAnalytics &&
       !analytics.disclosureShownOnTerminal &&
-      io.stdout.hasTerminal) {
+      io.stdout.hasTerminal &&
+      !isBot()) {
     print(analyticsNoticeOnFirstRunMessage);
     analytics.disclosureShownOnTerminal = true;
   }
diff --git a/pkg/dartdev/lib/src/analytics.dart b/pkg/dartdev/lib/src/analytics.dart
index fd12e56..f909916 100644
--- a/pkg/dartdev/lib/src/analytics.dart
+++ b/pkg/dartdev/lib/src/analytics.dart
@@ -138,6 +138,10 @@
   return Directory(path.join(homeDir.path, _dartDirectoryName));
 }
 
+/// The method used by dartdev to determine if this machine is a bot such as a
+/// CI machine.
+bool isBot() => telemetry.isRunningOnBot();
+
 class DartdevAnalytics extends AnalyticsImpl {
   DartdevAnalytics(String trackingId, File settingsFile, String appName)
       : super(
@@ -152,7 +156,7 @@
   bool get enabled {
     // Don't enable if the user hasn't been shown the disclosure or if this
     // machine is bot.
-    if (!disclosureShownOnTerminal || telemetry.isRunningOnBot()) {
+    if (!disclosureShownOnTerminal || isBot()) {
       return false;
     }
 
@@ -163,7 +167,7 @@
   bool get disclosureShownOnTerminal =>
       (properties['disclosureShown'] as bool) ?? false;
 
-  void set disclosureShownOnTerminal(bool value) {
+  set disclosureShownOnTerminal(bool value) {
     properties['disclosureShown'] = value;
   }
 }
diff --git a/pkg/dartdev/lib/src/commands/test.dart b/pkg/dartdev/lib/src/commands/test.dart
index ef2a9a2..ebed5ef 100644
--- a/pkg/dartdev/lib/src/commands/test.dart
+++ b/pkg/dartdev/lib/src/commands/test.dart
@@ -2,6 +2,10 @@
 // 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.
 
+// ignore_for_file: avoid_redundant_argument_values
+// ignore_for_file: lines_longer_than_80_chars
+// ignore_for_file: prefer_initializing_formals
+
 import 'dart:async';
 import 'dart:io';
 import 'dart:math' as math;
diff --git a/pkg/dartdev/pubspec.yaml b/pkg/dartdev/pubspec.yaml
index a1e7fe2..a42480f 100644
--- a/pkg/dartdev/pubspec.yaml
+++ b/pkg/dartdev/pubspec.yaml
@@ -6,22 +6,21 @@
 environment:
   sdk: '>=2.6.0 <3.0.0'
 dependencies:
+  analysis_server_client:
+    path: ../analysis_server_client
+  analyzer: any
   args: ^1.6.0
   cli_util: '>=0.1.4 <0.3.0'
   dart2native:
     path: ../dart2native
-  dds:
-    path: ../dds
-  intl: ^0.16.1
-  nnbd_migration: any # this uses the SDK version
+  dart_style: any
+  nnbd_migration:
+    path: ../nnbd_migration
   path: ^1.0.0
-  stack_trace: ^1.9.3
   stagehand: 3.3.7
   telemetry:
     path: ../telemetry
   usage: ^3.4.0
-  watcher: ^0.9.6
-  yaml: ^2.2.0
 
 dev_dependencies:
   test: ^1.0.0
diff --git a/pkg/dartdev/test/smoke/smoke_test.dart b/pkg/dartdev/test/smoke/smoke_test.dart
index 5f9c604..cb07f32 100644
--- a/pkg/dartdev/test/smoke/smoke_test.dart
+++ b/pkg/dartdev/test/smoke/smoke_test.dart
@@ -52,8 +52,8 @@
       });
 
       test(
-          'dart --sound-null-safety --enable-experiment=non-nullable run smoke.dart',
-          () async {
+          'dart --sound-null-safety --enable-experiment=non-nullable '
+          'run smoke.dart', () async {
         final result = await Process.run(
           Platform.executable,
           [
diff --git a/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart b/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
index f8dfd83..5a651dc 100644
--- a/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
@@ -27,7 +27,7 @@
 /// then adds or removes a '?' trailing the named type as appropriate.
 class NonNullableFix {
   // TODO(srawlins): Refactor to use
-  //  `Feature.non_nullable.firstSupportedVersion` when this becomes non-null.
+  //  `Feature.non_nullable.releaseVersion` when this becomes non-null.
   static const String _intendedMinimumSdkVersion = '2.9.0';
 
   // In the package_config.json file, the patch number is omitted.
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 6b71795..f7d889e 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -44,10 +44,10 @@
       bool removeViaComments = false,
       bool warnOnWeakCode = false}) async {
     for (var path in migratedInput.keys) {
-      driver.getFileSync(newFile(path, content: migratedInput[path]).path);
+      newFile(path, content: migratedInput[path]);
     }
     for (var path in input.keys) {
-      driver.getFileSync(newFile(path, content: input[path]).path);
+      newFile(path, content: input[path]);
     }
     var listener = new TestMigrationListener();
     var migration = NullabilityMigration(listener, getLineInfo,
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index 4ddeafc..935a637 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -705,19 +705,13 @@
       if (_configuration.useElf) ...[
         "--snapshot-kind=app-aot-elf",
         "--elf=$tempDir/out.aotsnapshot",
+        // Only splitting with a ELF to avoid having to setup compilation of
+        // multiple assembly files in the test harness.
+        "--loading-unit-manifest=$tempDir/ignored.json",
       ] else ...[
         "--snapshot-kind=app-aot-assembly",
         "--assembly=$tempDir/out.S",
       ],
-      // Only splitting with a ELF to avoid having to setup compilation of
-      // multiple assembly files in the test harness. Only splitting tests of
-      // deferred imports because splitting currently requires disable bare
-      // instructions mode, and we want to continue testing bare instructions
-      // mode.
-      if (_configuration.useElf && arguments.last.contains("deferred")) ...[
-        "--loading-unit-manifest=$tempDir/ignored.json",
-        "--use-table-dispatch=false",
-      ],
       if (_isAndroid && _isArm) '--no-sim-use-hardfp',
       if (_configuration.isMinified) '--obfuscate',
       // The SIMARM precompiler assumes support for integer division, but the
diff --git a/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart b/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart
new file mode 100644
index 0000000..8fa1e45
--- /dev/null
+++ b/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+// VMOptions=--use_bare_instructions=false
+// VMOptions=--use_bare_instructions=true --use_table_dispatch=false
+// VMOptions=--use_bare_instructions=true --use_table_dispatch=true
+
+import "splay_test.dart" deferred as splay; // Some non-trivial code.
+
+main() async {
+  await splay.loadLibrary();
+  splay.main();
+}
diff --git a/runtime/tests/vm/dart/incompatible_loading_unit_test.dart b/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
index 5facc47..9adf6e8 100644
--- a/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
+++ b/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
@@ -79,7 +79,6 @@
     // Compile kernel to ELF.
     await run(genSnapshot, <String>[
       "--snapshot-kind=app-aot-elf",
-      "--use-table-dispatch=false",
       "--elf=$snapshot1",
       "--loading-unit-manifest=$manifest1",
       dill1,
@@ -95,7 +94,6 @@
 
     await run(genSnapshot, <String>[
       "--snapshot-kind=app-aot-elf",
-      "--use-table-dispatch=false",
       "--elf=$snapshot2",
       "--loading-unit-manifest=$manifest2",
       dill2,
diff --git a/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart b/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart
new file mode 100644
index 0000000..8fa1e45
--- /dev/null
+++ b/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+// VMOptions=--use_bare_instructions=false
+// VMOptions=--use_bare_instructions=true --use_table_dispatch=false
+// VMOptions=--use_bare_instructions=true --use_table_dispatch=true
+
+import "splay_test.dart" deferred as splay; // Some non-trivial code.
+
+main() async {
+  await splay.loadLibrary();
+  splay.main();
+}
diff --git a/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart b/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
index 5facc47..9adf6e8 100644
--- a/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
+++ b/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
@@ -79,7 +79,6 @@
     // Compile kernel to ELF.
     await run(genSnapshot, <String>[
       "--snapshot-kind=app-aot-elf",
-      "--use-table-dispatch=false",
       "--elf=$snapshot1",
       "--loading-unit-manifest=$manifest1",
       dill1,
@@ -95,7 +94,6 @@
 
     await run(genSnapshot, <String>[
       "--snapshot-kind=app-aot-elf",
-      "--use-table-dispatch=false",
       "--elf=$snapshot2",
       "--loading-unit-manifest=$manifest2",
       dill2,
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index f02d468..ba76ca6 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -6206,15 +6206,16 @@
   return NULL;
 }
 
-void Deserializer::ReadDispatchTable() {
+void Deserializer::ReadDispatchTable(ReadStream* stream) {
 #if defined(DART_PRECOMPILED_RUNTIME)
-  const intptr_t length = ReadUnsigned();
+  const uint8_t* table_snapshot_start = stream->AddressOfCurrentPosition();
+  const intptr_t length = stream->ReadUnsigned();
   if (length == 0) return;
 
   // Not all Code objects may be in the code_order_table when instructions can
   // be deduplicated. Thus, we serialize the reference ID of the first code
   // object, from which we can get the reference ID for any code object.
-  const intptr_t first_code_id = ReadUnsigned();
+  const intptr_t first_code_id = stream->ReadUnsigned();
 
   auto const I = isolate();
   auto code = I->object_store()->dispatch_table_null_error_stub();
@@ -6233,7 +6234,7 @@
       repeat_count--;
       continue;
     }
-    auto const encoded = Read<intptr_t>();
+    auto const encoded = stream->Read<intptr_t>();
     if (encoded == 0) {
       value = null_entry;
     } else if (encoded < 0) {
@@ -6254,6 +6255,10 @@
   ASSERT(repeat_count == 0);
 
   I->group()->set_dispatch_table(table);
+  intptr_t table_snapshot_size =
+      stream->AddressOfCurrentPosition() - table_snapshot_start;
+  I->group()->set_dispatch_table_snapshot(table_snapshot_start);
+  I->group()->set_dispatch_table_snapshot_size(table_snapshot_size);
 #endif
 }
 
@@ -6674,7 +6679,7 @@
     }
 
     // Deserialize dispatch table (when applicable)
-    ReadDispatchTable();
+    ReadDispatchTable(&stream_);
 
 #if defined(DEBUG)
     int32_t section_marker = Read<int32_t>();
@@ -6758,6 +6763,15 @@
       code->ptr()->code_source_map_ = static_cast<CodeSourceMapPtr>(ReadRef());
     }
 
+    // Reinitialize the dispatch table by rereading the table's serialization
+    // in the root snapshot.
+    IsolateGroup* group = thread()->isolate()->group();
+    if (group->dispatch_table_snapshot() != nullptr) {
+      ReadStream stream(group->dispatch_table_snapshot(),
+                        group->dispatch_table_snapshot_size());
+      ReadDispatchTable(&stream);
+    }
+
 #if defined(DEBUG)
     int32_t section_marker = Read<int32_t>();
     ASSERT(section_marker == kSectionMarker);
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 4710372..26e3f38 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -704,7 +704,7 @@
 
   DeserializationCluster* ReadCluster();
 
-  void ReadDispatchTable();
+  void ReadDispatchTable(ReadStream* stream);
 
   intptr_t next_index() const { return next_ref_index_; }
   Heap* heap() const { return heap_; }
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index a7882d7..6e327e2 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6805,11 +6805,6 @@
   return Api::NewError(
       "This VM was built without support for AOT compilation.");
 #else
-  if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
-    return Api::NewError(
-        "Splitting is not compatible with --use_table_dispatch.");
-  }
-
   DARTSCOPE(Thread::Current());
   API_TIMELINE_DURATION(T);
   CHECK_NULL(next_callback);
@@ -6887,11 +6882,6 @@
   return Api::NewError(
       "This VM was built without support for AOT compilation.");
 #else
-  if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
-    return Api::NewError(
-        "Splitting is not compatible with --use_table_dispatch.");
-  }
-
   DARTSCOPE(Thread::Current());
   API_TIMELINE_DURATION(T);
   CHECK_NULL(next_callback);
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 170f52c..7e81415 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -65,6 +65,8 @@
       barrier_(),
       barrier_done_(),
       read_only_(false),
+      gc_new_space_in_progress_(false),
+      gc_old_space_in_progress_(false),
       last_gc_was_old_space_(false),
       assume_scavenge_will_fail_(false),
       gc_on_nth_allocation_(kNoForcedGarbageCollection) {
@@ -235,8 +237,6 @@
       heap_(isolate()->heap()),
       old_space_(heap_->old_space()),
       writable_(writable) {
-  isolate()->safepoint_handler()->SafepointThreads(thread);
-
   {
     // It's not safe to iterate over old space when concurrent marking or
     // sweeping is in progress, or another thread is iterating the heap, so wait
@@ -255,7 +255,7 @@
         ml.Enter();
       }
       while (old_space_->tasks() > 0) {
-        ml.Wait();
+        ml.WaitWithSafepointCheck(thread);
       }
     }
 #if defined(DEBUG)
@@ -265,6 +265,8 @@
     old_space_->set_tasks(1);
   }
 
+  isolate()->safepoint_handler()->SafepointThreads(thread);
+
   if (writable_) {
     heap_->WriteProtectCode(false);
   }
@@ -275,18 +277,16 @@
     heap_->WriteProtectCode(true);
   }
 
-  {
-    MonitorLocker ml(old_space_->tasks_lock());
-#if defined(DEBUG)
-    ASSERT(old_space_->iterating_thread_ == thread());
-    old_space_->iterating_thread_ = NULL;
-#endif
-    ASSERT(old_space_->tasks() == 1);
-    old_space_->set_tasks(0);
-    ml.NotifyAll();
-  }
-
   isolate()->safepoint_handler()->ResumeThreads(thread());
+
+  MonitorLocker ml(old_space_->tasks_lock());
+#if defined(DEBUG)
+  ASSERT(old_space_->iterating_thread_ == thread());
+  old_space_->iterating_thread_ = NULL;
+#endif
+  ASSERT(old_space_->tasks() == 1);
+  old_space_->set_tasks(0);
+  ml.NotifyAll();
 }
 
 void HeapIterationScope::IterateObjects(ObjectVisitor* visitor) const {
@@ -360,14 +360,57 @@
   return raw_obj;
 }
 
+bool Heap::BeginNewSpaceGC(Thread* thread) {
+  MonitorLocker ml(&gc_in_progress_monitor_);
+  bool start_gc_on_thread = true;
+  while (gc_new_space_in_progress_ || gc_old_space_in_progress_) {
+    start_gc_on_thread = !gc_new_space_in_progress_;
+    ml.WaitWithSafepointCheck(thread);
+  }
+  if (start_gc_on_thread) {
+    gc_new_space_in_progress_ = true;
+    return true;
+  }
+  return false;
+}
+
+void Heap::EndNewSpaceGC() {
+  MonitorLocker ml(&gc_in_progress_monitor_);
+  ASSERT(gc_new_space_in_progress_);
+  gc_new_space_in_progress_ = false;
+  last_gc_was_old_space_ = false;
+  ml.NotifyAll();
+}
+
+bool Heap::BeginOldSpaceGC(Thread* thread) {
+  MonitorLocker ml(&gc_in_progress_monitor_);
+  bool start_gc_on_thread = true;
+  while (gc_new_space_in_progress_ || gc_old_space_in_progress_) {
+    start_gc_on_thread = !gc_old_space_in_progress_;
+    ml.WaitWithSafepointCheck(thread);
+  }
+  if (start_gc_on_thread) {
+    gc_old_space_in_progress_ = true;
+    return true;
+  }
+  return false;
+}
+
+void Heap::EndOldSpaceGC() {
+  MonitorLocker ml(&gc_in_progress_monitor_);
+  ASSERT(gc_old_space_in_progress_);
+  gc_old_space_in_progress_ = false;
+  last_gc_was_old_space_ = true;
+  assume_scavenge_will_fail_ = false;
+  ml.NotifyAll();
+}
+
 void Heap::HintFreed(intptr_t size) {
   old_space_.HintFreed(size);
 }
 
 void Heap::NotifyIdle(int64_t deadline) {
   Thread* thread = Thread::Current();
-  SafepointOperationScope safepoint_operation(thread);
-
   // Check if we want to collect new-space first, because if we want to collect
   // both new-space and old-space, the new-space collection should run first
   // to shrink the root set (make old-space GC faster) and avoid
@@ -432,8 +475,7 @@
     // visiting pointers.
     return;
   }
-  {
-    SafepointOperationScope safepoint_operation(thread);
+  if (BeginNewSpaceGC(thread)) {
     RecordBeforeGC(kScavenge, reason);
     VMTagScope tagScope(thread, reason == kIdle ? VMTag::kGCIdleTagId
                                                 : VMTag::kGCNewSpaceTagId);
@@ -442,7 +484,7 @@
     RecordAfterGC(kScavenge);
     PrintStats();
     NOT_IN_PRODUCT(PrintStatsToTimeline(&tbes, reason));
-    last_gc_was_old_space_ = false;
+    EndNewSpaceGC();
   }
 }
 
@@ -456,8 +498,7 @@
     // visiting pointers.
     return;
   }
-  {
-    SafepointOperationScope safepoint_operation(thread);
+  if (BeginNewSpaceGC(thread)) {
     RecordBeforeGC(kScavenge, reason);
     {
       VMTagScope tagScope(thread, reason == kIdle ? VMTag::kGCIdleTagId
@@ -467,7 +508,7 @@
       RecordAfterGC(kScavenge);
       PrintStats();
       NOT_IN_PRODUCT(PrintStatsToTimeline(&tbes, reason));
-      last_gc_was_old_space_ = false;
+      EndNewSpaceGC();
     }
     if (reason == kNewSpace) {
       if (old_space_.ReachedHardThreshold()) {
@@ -496,14 +537,11 @@
     // visiting pointers.
     return;
   }
-  {
-    SafepointOperationScope safepoint_operation(thread);
-    thread->isolate_group()->ForEachIsolate(
-        [&](Isolate* isolate) {
-          // Discard regexp backtracking stacks to further reduce memory usage.
-          isolate->CacheRegexpBacktrackStack(nullptr);
-        },
-        /*at_safepoint=*/true);
+  if (BeginOldSpaceGC(thread)) {
+    thread->isolate_group()->ForEachIsolate([&](Isolate* isolate) {
+      // Discard regexp backtracking stacks to further reduce memory usage.
+      isolate->CacheRegexpBacktrackStack(nullptr);
+    });
 
     RecordBeforeGC(type, reason);
     VMTagScope tagScope(thread, reason == kIdle ? VMTag::kGCIdleTagId
@@ -515,14 +553,11 @@
     NOT_IN_PRODUCT(PrintStatsToTimeline(&tbes, reason));
 
     // Some Code objects may have been collected so invalidate handler cache.
-    thread->isolate_group()->ForEachIsolate(
-        [&](Isolate* isolate) {
-          isolate->handler_info_cache()->Clear();
-          isolate->catch_entry_moves_cache()->Clear();
-        },
-        /*at_safepoint=*/true);
-    last_gc_was_old_space_ = true;
-    assume_scavenge_will_fail_ = false;
+    thread->isolate_group()->ForEachIsolate([&](Isolate* isolate) {
+      isolate->handler_info_cache()->Clear();
+      isolate->catch_entry_moves_cache()->Clear();
+    });
+    EndOldSpaceGC();
   }
 }
 
@@ -602,8 +637,11 @@
 }
 
 void Heap::StartConcurrentMarking(Thread* thread) {
-  TIMELINE_FUNCTION_GC_DURATION_BASIC(thread, "StartConcurrentMarking");
-  old_space_.CollectGarbage(/*compact=*/false, /*finalize=*/false);
+  if (BeginOldSpaceGC(thread)) {
+    TIMELINE_FUNCTION_GC_DURATION_BASIC(thread, "StartConcurrentMarking");
+    old_space_.CollectGarbage(/*compact=*/false, /*finalize=*/false);
+    EndOldSpaceGC();
+  }
 }
 
 void Heap::CheckFinishConcurrentMarking(Thread* thread) {
@@ -713,6 +751,8 @@
 }
 
 void Heap::MergeFrom(Heap* donor) {
+  ASSERT(!donor->gc_new_space_in_progress_);
+  ASSERT(!donor->gc_old_space_in_progress_);
   ASSERT(!donor->read_only_);
   ASSERT(donor->old_space()->tasks() == 0);
 
@@ -981,6 +1021,9 @@
 #endif  // PRODUCT
 
 void Heap::RecordBeforeGC(GCType type, GCReason reason) {
+  ASSERT((type == kScavenge && gc_new_space_in_progress_) ||
+         (type == kMarkSweep && gc_old_space_in_progress_) ||
+         (type == kMarkCompact && gc_old_space_in_progress_));
   stats_.num_++;
   stats_.type_ = type;
   stats_.reason_ = reason;
@@ -1005,6 +1048,9 @@
   }
   stats_.after_.new_ = new_space_.GetCurrentUsage();
   stats_.after_.old_ = old_space_.GetCurrentUsage();
+  ASSERT((type == kScavenge && gc_new_space_in_progress_) ||
+         (type == kMarkSweep && gc_old_space_in_progress_) ||
+         (type == kMarkCompact && gc_old_space_in_progress_));
 #ifndef PRODUCT
   // For now we'll emit the same GC events on all isolates.
   if (Service::gc_stream.enabled()) {
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 8982ba3..fa9d733 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -383,6 +383,12 @@
   void PrintStats();
   void PrintStatsToTimeline(TimelineEventScope* event, GCReason reason);
 
+  // Updates gc in progress flags.
+  bool BeginNewSpaceGC(Thread* thread);
+  void EndNewSpaceGC();
+  bool BeginOldSpaceGC(Thread* thread);
+  void EndOldSpaceGC();
+
   void AddRegionsToObjectSet(ObjectSet* set) const;
 
   // Trigger major GC if 'gc_on_nth_allocation_' is set.
@@ -406,6 +412,10 @@
   // This heap is in read-only mode: No allocation is allowed.
   bool read_only_;
 
+  // GC on the heap is in progress.
+  Monitor gc_in_progress_monitor_;
+  bool gc_new_space_in_progress_;
+  bool gc_old_space_in_progress_;
   bool last_gc_was_old_space_;
   bool assume_scavenge_will_fail_;
 
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index e0f10cb..c0a2597 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -1030,10 +1030,9 @@
   }
 
   Thread* thread = Thread::Current();
-  const int64_t pre_safe_point = OS::GetCurrentMonotonicMicros();
-  SafepointOperationScope safepoint_scope(thread);
 
   const int64_t pre_wait_for_sweepers = OS::GetCurrentMonotonicMicros();
+
   // Wait for pending tasks to complete and then account for the driver task.
   Phase waited_for;
   {
@@ -1046,15 +1045,15 @@
     }
 
     while (tasks() > 0) {
-      locker.Wait();
+      locker.WaitWithSafepointCheck(thread);
     }
     ASSERT(phase() == kAwaitingFinalization || phase() == kDone);
     set_tasks(1);
   }
 
+  const int64_t pre_safe_point = OS::GetCurrentMonotonicMicros();
   if (FLAG_verbose_gc) {
-    const int64_t wait =
-        OS::GetCurrentMonotonicMicros() - pre_wait_for_sweepers;
+    const int64_t wait = pre_safe_point - pre_wait_for_sweepers;
     if (waited_for == kMarking) {
       THR_Print("Waited %" Pd64 " us for concurrent marking to finish.\n",
                 wait);
@@ -1069,8 +1068,9 @@
   // to ensure that if two threads are racing to collect at the same time the
   // loser skips collection and goes straight to allocation.
   {
-    CollectGarbageHelper(compact, finalize, pre_wait_for_sweepers,
-                         pre_safe_point);
+    SafepointOperationScope safepoint_scope(thread);
+    CollectGarbageAtSafepoint(compact, finalize, pre_wait_for_sweepers,
+                              pre_safe_point);
   }
 
   // Done, reset the task count.
@@ -1081,10 +1081,10 @@
   }
 }
 
-void PageSpace::CollectGarbageHelper(bool compact,
-                                     bool finalize,
-                                     int64_t pre_wait_for_sweepers,
-                                     int64_t pre_safe_point) {
+void PageSpace::CollectGarbageAtSafepoint(bool compact,
+                                          bool finalize,
+                                          int64_t pre_wait_for_sweepers,
+                                          int64_t pre_safe_point) {
   Thread* thread = Thread::Current();
   ASSERT(thread->IsAtSafepoint());
   auto isolate_group = heap_->isolate_group();
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index 83c5488..ef5badf 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -538,10 +538,10 @@
   void FreeLargePage(OldPage* page, OldPage* previous_page);
   void FreePages(OldPage* pages);
 
-  void CollectGarbageHelper(bool compact,
-                            bool finalize,
-                            int64_t pre_wait_for_sweepers,
-                            int64_t pre_safe_point);
+  void CollectGarbageAtSafepoint(bool compact,
+                                 bool finalize,
+                                 int64_t pre_wait_for_sweepers,
+                                 int64_t pre_safe_point);
   void SweepLarge();
   void Sweep();
   void ConcurrentSweep(IsolateGroup* isolate_group);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index b8b23a1..0e175bd1 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -380,6 +380,18 @@
   void set_dispatch_table(DispatchTable* table) {
     dispatch_table_.reset(table);
   }
+  const uint8_t* dispatch_table_snapshot() const {
+    return dispatch_table_snapshot_;
+  }
+  void set_dispatch_table_snapshot(const uint8_t* snapshot) {
+    dispatch_table_snapshot_ = snapshot;
+  }
+  intptr_t dispatch_table_snapshot_size() const {
+    return dispatch_table_snapshot_size_;
+  }
+  void set_dispatch_table_snapshot_size(intptr_t size) {
+    dispatch_table_snapshot_size_ = size;
+  }
 
   SharedClassTable* shared_class_table() const {
     return shared_class_table_.get();
@@ -672,6 +684,8 @@
   std::unique_ptr<StoreBuffer> store_buffer_;
   std::unique_ptr<Heap> heap_;
   std::unique_ptr<DispatchTable> dispatch_table_;
+  const uint8_t* dispatch_table_snapshot_ = nullptr;
+  intptr_t dispatch_table_snapshot_size_ = 0;
   ArrayPtr saved_unlinked_calls_;
   std::shared_ptr<FieldTable> saved_initial_field_table_;
   uint32_t isolate_group_flags_ = 0;
diff --git a/tests/lib/html/js_typed_interop_type_test.dart b/tests/lib/html/js_typed_interop_type_test.dart
index a7195ab..6558870 100644
--- a/tests/lib/html/js_typed_interop_type_test.dart
+++ b/tests/lib/html/js_typed_interop_type_test.dart
@@ -26,7 +26,7 @@
 @JS()
 @anonymous
 class C {
-  external get foo;
+  external final foo;
 
   external factory C({foo});
 }
@@ -34,7 +34,7 @@
 @JS()
 @anonymous
 class D {
-  external get foo;
+  external final foo;
 
   external factory D({foo});
 }
diff --git a/tools/VERSION b/tools/VERSION
index 433cea6..339772b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 42
+PRERELEASE 43
 PRERELEASE_PATCH 0
\ No newline at end of file
