diff --git a/CHANGELOG.md b/CHANGELOG.md
index f8c7ddd..4a3942c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -85,6 +85,8 @@
   * Global ignores are no longer taken into account.
   * Even packages that are not in git source control will have their
     `.gitignore` files respected.
+  * `.gitignore` and `.pubignore` is always case-insensitive on MacOs and
+    Windows (as is default for `git` repositories).
 
 * New flag `dart pub deps --json` gives a machine parsable overview of the
   current dependencies.
@@ -100,6 +102,8 @@
   This should fix several issues we had with incompatibilities between different
   system `tar`s.
 * `PUB_HOSTED_URL` can now include a trailing slash.
+* Incremental compilation is now used for compilation of executables from
+  dependencies when using `dart run <package>:<command>`.
 
 ### Language
 
diff --git a/DEPS b/DEPS
index 4017423..accfc1b 100644
--- a/DEPS
+++ b/DEPS
@@ -142,7 +142,7 @@
   "pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "0d03fd588df69e9863e2a2efc0059dee8f18d5b2",
-  "pub_rev": "00c00e8adf9706bebe8f94483b7663c5f36f59d2",
+  "pub_rev": "def32ceb1d660552eaec24839d377199aea5a569",
   "pub_semver_rev": "f50d80ef10c4b2fa5f4c8878036a4d9342c0cc82",
   "resource_rev": "6b79867d0becf5395e5819a75720963b8298e9a7",
   "root_certificates_rev": "7e5ec82c99677a2e5b95ce296c4d68b0d3378ed8",
diff --git a/benchmarks/DartCLIStartup/dart/DartCLIStartup.dart b/benchmarks/DartCLIStartup/dart/DartCLIStartup.dart
new file mode 100644
index 0000000..79ae11f
--- /dev/null
+++ b/benchmarks/DartCLIStartup/dart/DartCLIStartup.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+class DartCLIStartup extends BenchmarkBase {
+  const DartCLIStartup() : super('DartCLIStartup');
+
+  // The benchmark code.
+  @override
+  void run() {
+    Process.runSync(Platform.executable, ['help']);
+  }
+}
+
+void main() {
+  const DartCLIStartup().report();
+}
diff --git a/benchmarks/DartCLIStartup/dart2/DartCLIStartup.dart b/benchmarks/DartCLIStartup/dart2/DartCLIStartup.dart
new file mode 100644
index 0000000..8f98e9b
--- /dev/null
+++ b/benchmarks/DartCLIStartup/dart2/DartCLIStartup.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2021, 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.
+
+// @dart=2.9
+
+import 'dart:io';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+class DartCLIStartup extends BenchmarkBase {
+  const DartCLIStartup() : super('DartCLIStartup');
+
+  // The benchmark code.
+  @override
+  void run() {
+    Process.runSync(Platform.executable, ['help']);
+  }
+}
+
+void main() {
+  const DartCLIStartup().report();
+}
diff --git a/benchmarks/SDKArtifactSizes/dart/SDKArtifactSizes.dart b/benchmarks/SDKArtifactSizes/dart/SDKArtifactSizes.dart
new file mode 100644
index 0000000..d1f4ee9
--- /dev/null
+++ b/benchmarks/SDKArtifactSizes/dart/SDKArtifactSizes.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2021, 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.
+
+// Reports the sizes of binary artifacts shipped with the SDK.
+
+import 'dart:io';
+
+const executables = <String>[
+  'dart',
+  'dartaotruntime',
+];
+
+const libs = <String>[
+  'vm_platform_strong.dill',
+  'vm_platform_strong_product.dill',
+];
+
+const snapshots = <String>[
+  'analysis_server',
+  'dart2js',
+  'dart2native',
+  'dartanalyzer',
+  'dartdev',
+  'dartdevc',
+  'dartdoc',
+  'dartfmt',
+  'dds',
+  'frontend_server',
+  'gen_kernel',
+  'kernel-service',
+  'kernel_worker',
+  'pub',
+];
+
+Future<void> reportArtifactSize(String path, String name) async {
+  final size = await File(path).length();
+  print('SDKArtifactSize_$name(CodeSize): $size');
+}
+
+Future<void> main() async {
+  final topDirIndex =
+      Platform.resolvedExecutable.lastIndexOf(Platform.pathSeparator);
+  final rootDir = Platform.resolvedExecutable.substring(0, topDirIndex);
+
+  for (final executable in executables) {
+    final executablePath = '$rootDir/dart-sdk/bin/$executable';
+    await reportArtifactSize(executablePath, executable);
+  }
+
+  for (final lib in libs) {
+    final libPath = '$rootDir/dart-sdk/lib/_internal/$lib';
+    await reportArtifactSize(libPath, lib);
+  }
+
+  for (final snapshot in snapshots) {
+    final snapshotPath =
+        '$rootDir/dart-sdk/bin/snapshots/$snapshot.dart.snapshot';
+    await reportArtifactSize(snapshotPath, snapshot);
+  }
+}
diff --git a/benchmarks/SDKArtifactSizes/dart2/SDKArtifactSizes.dart b/benchmarks/SDKArtifactSizes/dart2/SDKArtifactSizes.dart
new file mode 100644
index 0000000..d1f4ee9
--- /dev/null
+++ b/benchmarks/SDKArtifactSizes/dart2/SDKArtifactSizes.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2021, 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.
+
+// Reports the sizes of binary artifacts shipped with the SDK.
+
+import 'dart:io';
+
+const executables = <String>[
+  'dart',
+  'dartaotruntime',
+];
+
+const libs = <String>[
+  'vm_platform_strong.dill',
+  'vm_platform_strong_product.dill',
+];
+
+const snapshots = <String>[
+  'analysis_server',
+  'dart2js',
+  'dart2native',
+  'dartanalyzer',
+  'dartdev',
+  'dartdevc',
+  'dartdoc',
+  'dartfmt',
+  'dds',
+  'frontend_server',
+  'gen_kernel',
+  'kernel-service',
+  'kernel_worker',
+  'pub',
+];
+
+Future<void> reportArtifactSize(String path, String name) async {
+  final size = await File(path).length();
+  print('SDKArtifactSize_$name(CodeSize): $size');
+}
+
+Future<void> main() async {
+  final topDirIndex =
+      Platform.resolvedExecutable.lastIndexOf(Platform.pathSeparator);
+  final rootDir = Platform.resolvedExecutable.substring(0, topDirIndex);
+
+  for (final executable in executables) {
+    final executablePath = '$rootDir/dart-sdk/bin/$executable';
+    await reportArtifactSize(executablePath, executable);
+  }
+
+  for (final lib in libs) {
+    final libPath = '$rootDir/dart-sdk/lib/_internal/$lib';
+    await reportArtifactSize(libPath, lib);
+  }
+
+  for (final snapshot in snapshots) {
+    final snapshotPath =
+        '$rootDir/dart-sdk/bin/snapshots/$snapshot.dart.snapshot';
+    await reportArtifactSize(snapshotPath, snapshot);
+  }
+}
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index b167dc0..a0d6ba6 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,5 +1,5 @@
 name: _fe_analyzer_shared
-version: 21.0.0
+version: 22.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/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index bd38471..6c0624e 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -11,21 +11,47 @@
 class JsUtilOptimizer extends Transformer {
   final Procedure _jsTarget;
   final Procedure _getPropertyTarget;
+  final Procedure _setPropertyTarget;
+  final Procedure _setPropertyUncheckedTarget;
+
+  /// Dynamic members in js_util that interop allowed.
+  static final Iterable<String> _allowedInteropJsUtilMembers = <String>[
+    'callConstructor',
+    'callMethod',
+    'getProperty',
+    'jsify',
+    'newObject',
+    'setProperty'
+  ];
+  final Iterable<Procedure> _allowedInteropJsUtilTargets;
+  final Procedure _allowInteropTarget;
 
   JsUtilOptimizer(CoreTypes coreTypes)
       : _jsTarget =
             coreTypes.index.getTopLevelMember('dart:_foreign_helper', 'JS'),
         _getPropertyTarget =
-            coreTypes.index.getTopLevelMember('dart:js_util', 'getProperty') {}
+            coreTypes.index.getTopLevelMember('dart:js_util', 'getProperty'),
+        _setPropertyTarget =
+            coreTypes.index.getTopLevelMember('dart:js_util', 'setProperty'),
+        _setPropertyUncheckedTarget = coreTypes.index
+            .getTopLevelMember('dart:js_util', '_setPropertyUnchecked'),
+        _allowInteropTarget =
+            coreTypes.index.getTopLevelMember('dart:js', 'allowInterop'),
+        _allowedInteropJsUtilTargets = _allowedInteropJsUtilMembers.map(
+            (member) =>
+                coreTypes.index.getTopLevelMember('dart:js_util', member)) {}
 
-  /// Replaces js_util method calls with lowering straight to JS fragment call.
+  /// Replaces js_util method calls with optimization when possible.
   ///
-  /// Lowers the following types of js_util calls:
-  ///  - `getProperty` for any argument types
+  /// Lowers `getProperty` for any argument type straight to JS fragment call.
+  /// Lowers `setProperty` to `_setPropertyUnchecked` for values that are
+  /// not Function type and guaranteed to be interop allowed.
   @override
   visitStaticInvocation(StaticInvocation node) {
     if (node.target == _getPropertyTarget) {
       node = _lowerGetProperty(node);
+    } else if (node.target == _setPropertyTarget) {
+      node = _lowerSetProperty(node);
     }
     node.transformChildren(this);
     return node;
@@ -49,7 +75,60 @@
           ],
           // TODO(rileyporter): Copy type from getProperty when it's generic.
           types: [DynamicType()],
-        )..fileOffset = node.arguments.fileOffset)
+        )..fileOffset = arguments.fileOffset)
       ..fileOffset = node.fileOffset;
   }
+
+  /// Lowers the given js_util `setProperty` call to `_setPropertyUnchecked`
+  /// when the additional validation checks in `setProperty` can be elided.
+  /// Removing the checks allows further inlining by the compilers.
+  StaticInvocation _lowerSetProperty(StaticInvocation node) {
+    Arguments arguments = node.arguments;
+    assert(arguments.types.isEmpty);
+    assert(arguments.positional.length == 3);
+    assert(arguments.named.isEmpty);
+
+    if (!_allowedInterop(arguments.positional.last)) {
+      return node;
+    }
+
+    return StaticInvocation(_setPropertyUncheckedTarget, arguments)
+      ..fileOffset = node.fileOffset;
+  }
+
+  /// Returns whether the given TreeNode is guaranteed to be allowed to interop
+  /// with JS.
+  ///
+  /// Returns true when the node is guaranteed to be not a function:
+  ///    - has a DartType that is NullType or an InterfaceType that is not
+  ///      Function or Object
+  /// Also returns true for allowed method calls within the JavaScript domain:
+  ///        - dart:_foreign_helper JS
+  ///        - dart:js `allowInterop`
+  ///        - dart:js_util and any of the `_allowedInteropJsUtilMembers`
+  bool _allowedInterop(TreeNode node) {
+    // TODO(rileyporter): Detect functions that have been wrapped at some point
+    // with `allowInterop`
+    // TODO(rileyporter): Use staticTypeContext to generalize type checking and
+    // allow more non-function types. Currently, we skip all literal types.
+    var checkType;
+    if (node is VariableGet) {
+      checkType = node.variable.type;
+    }
+
+    if (node is StaticInvocation) {
+      if (node.target == _allowInteropTarget) return true;
+      if (node.target == _jsTarget) return true;
+      if (_allowedInteropJsUtilTargets.contains(node.target)) return true;
+      checkType = node.target.function.returnType;
+    }
+
+    if (checkType is InterfaceType) {
+      return checkType.classNode.name != 'Function' &&
+          checkType.classNode.name != 'Object';
+    } else {
+      // Only other DartType guaranteed to not be a function.
+      return checkType is NullType;
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index b9f376a..8f452a1 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -54,6 +54,7 @@
                       extendedType.element, type.element);
               _addTypeMembers(type, inheritanceDistance);
             }
+            _addExtensionMembers(containingLibrary, extendedType);
           }
         }
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_interpolation.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_interpolation.dart
index 639f53f..48ddf53 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_interpolation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_interpolation.dart
@@ -105,12 +105,12 @@
     buffer.write(quotes);
     for (var i = 0; i < components.length; i++) {
       var component = components[i];
-      if (component is SimpleStringLiteral) {
+      if (component is SingleStringLiteral) {
         var contents = utils.getRangeText(range.startOffsetEndOffset(
             component.contentsOffset, component.contentsEnd));
         buffer.write(contents);
       } else if (component is SimpleIdentifier) {
-        if (_nextStartsWithLetter(components, i)) {
+        if (_nextStartsWithIdentifierContinuation(components, i)) {
           buffer.write(r'${');
           buffer.write(component.name);
           buffer.write('}');
@@ -129,20 +129,22 @@
   }
 
   /// Return `true` if the component after [index] in the list of [components]
-  /// is one that would begin with a letter when written into the resulting
-  /// string.
-  bool _nextStartsWithLetter(List<AstNode> components, int index) {
-    bool startsWithLetter(String string) =>
-        string.startsWith(RegExp('[a-zA-Z]'));
+  /// is one that would begin with a valid identifier continuation character
+  /// when written into the resulting string.
+  bool _nextStartsWithIdentifierContinuation(
+      List<AstNode> components, int index) {
+    bool startsWithIdentifierContinuation(String string) =>
+        string.startsWith(RegExp(r'[a-zA-Z0-9_$]'));
 
     if (index + 1 >= components.length) {
       return false;
     }
     var next = components[index + 1];
     if (next is SimpleStringLiteral) {
-      return startsWithLetter(next.value);
+      return startsWithIdentifierContinuation(next.value);
     } else if (next is StringInterpolation) {
-      return startsWithLetter((next.elements[0] as InterpolationString).value);
+      return startsWithIdentifierContinuation(
+          (next.elements[0] as InterpolationString).value);
     }
     return false;
   }
diff --git a/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart b/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
index 004e07b..f1a747c 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
@@ -10,6 +10,7 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstructorCompletionTest);
+    defineReflectiveTests(ExtensionCompletionTest);
     defineReflectiveTests(PropertyAccessorCompletionTest);
   });
 }
@@ -32,6 +33,142 @@
 }
 
 @reflectiveTest
+class ExtensionCompletionTest extends CompletionTestCase {
+  Future<void> test_explicitTarget_getter_sameUnit() async {
+    addTestFile('''
+void f(String s) {
+  s.^;
+}
+extension E on String {
+  int get g => length;
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('g');
+  }
+
+  Future<void> test_explicitTarget_method_imported() async {
+    newFile(convertPath('/project/bin/lib.dart'), content: '''
+extension E on String {
+  void m() {}
+}
+''');
+    addTestFile('''
+import 'lib.dart';
+void f(String s) {
+  s.^;
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('m');
+  }
+
+  Future<void> test_explicitTarget_method_inLibrary() async {
+    newFile(convertPath('/project/bin/lib.dart'), content: '''
+part 'test.dart';
+extension E on String {
+  void m() {}
+}
+''');
+    addTestFile('''
+part of 'lib.dart';
+void f(String s) {
+  s.^;
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('m');
+  }
+
+  Future<void> test_explicitTarget_method_inPart() async {
+    newFile(convertPath('/project/bin/part.dart'), content: '''
+extension E on String {
+  void m() {}
+}
+''');
+    addTestFile('''
+part 'part.dart';
+void f(String s) {
+  s.^;
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('m');
+  }
+
+  @failingTest
+  Future<void> test_explicitTarget_method_notImported() async {
+    // Available suggestions data doesn't yet have information about extension
+    // methods.
+    newFile(convertPath('/project/bin/lib.dart'), content: '''
+extension E on String {
+  void m() {}
+}
+''');
+    addTestFile('''
+void f(String s) {
+  s.^;
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('m');
+  }
+
+  Future<void> test_explicitTarget_method_sameUnit() async {
+    addTestFile('''
+void f(String s) {
+  s.^;
+}
+extension E on String {
+  void m() {}
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('m');
+  }
+
+  Future<void> test_explicitTarget_setter_sameUnit() async {
+    addTestFile('''
+void f(String s) {
+  s.^;
+}
+extension E on String {
+  set e(int v) {}
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('e');
+  }
+
+  Future<void> test_implicitTarget_inClass_method_sameUnit() async {
+    addTestFile('''
+class C {
+  void c() {
+    ^
+  }
+}
+extension E on C {
+  void m() {}
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('m');
+  }
+
+  Future<void> test_implicitTarget_inExtension_method_sameUnit() async {
+    addTestFile('''
+extension E on String {
+  void m() {
+    ^
+  }
+}
+''');
+    await getSuggestions();
+    assertHasCompletion('m');
+  }
+}
+
+@reflectiveTest
 class PropertyAccessorCompletionTest extends CompletionTestCase {
   Future<void> test_setter_deprecated() async {
     addTestFile('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_interpolation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_interpolation_test.dart
index 0a2539b..5dc54a1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_interpolation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_interpolation_test.dart
@@ -146,6 +146,19 @@
 ''');
   }
 
+  Future<void> test_variable_stringInterpolation_runTogether_letter() async {
+    await resolveTestCode(r'''
+String f(String s) {
+  return s + 'and $s';
+}
+''');
+    await assertHasFix(r'''
+String f(String s) {
+  return '${s}and $s';
+}
+''');
+  }
+
   Future<void> test_variable_stringLiteral_noRuntogther() async {
     await resolveTestCode('''
 var a = 'a';
@@ -157,7 +170,20 @@
 ''');
   }
 
-  Future<void> test_variable_stringLiteral_runtogther() async {
+  Future<void> test_variable_stringLiteral_runTogether_digit() async {
+    await resolveTestCode('''
+String f(String s) {
+  return s + '1';
+}
+''');
+    await assertHasFix(r'''
+String f(String s) {
+  return '${s}1';
+}
+''');
+  }
+
+  Future<void> test_variable_stringLiteral_runTogether_variable() async {
     await resolveTestCode('''
 var a = 'a';
 var c = a + 'b';
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index bd7f1e8..2bf63ff 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 1.6.0-dev
+## 1.6.0
 * Deprecated `AnalysisDriver` default constructor.  Added `tmp1`. The goal
   is to allow deprecating and removing unused  parameters.
 * Added AST structures and visit methods to support the upcoming "constructor
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index c995737..774b215 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -265,6 +265,7 @@
     PerformanceLog logger,
     ResourceProvider resourceProvider,
     ByteStore byteStore,
+    // ignore: avoid_unused_constructor_parameters
     FileContentOverlay? contentOverlay,
     // ignore: avoid_unused_constructor_parameters
     ContextRoot? contextRoot,
@@ -280,7 +281,6 @@
       logger: logger,
       resourceProvider: resourceProvider,
       byteStore: byteStore,
-      contentOverlay: contentOverlay,
       sourceFactory: sourceFactory,
       analysisOptions: analysisOptions,
       packages: packages ?? Packages.empty,
@@ -299,8 +299,6 @@
     required PerformanceLog logger,
     required ResourceProvider resourceProvider,
     required ByteStore byteStore,
-    @Deprecated('Use OverlayResourceProvider instead')
-        FileContentOverlay? contentOverlay,
     required SourceFactory sourceFactory,
     required AnalysisOptionsImpl analysisOptions,
     required Packages packages,
@@ -310,7 +308,7 @@
   })  : _scheduler = scheduler,
         _resourceProvider = resourceProvider,
         _byteStore = byteStore,
-        _contentOverlay = contentOverlay ?? FileContentOverlay(),
+        _contentOverlay = FileContentOverlay(),
         _analysisOptions = analysisOptions,
         enableIndex = enableIndex,
         _logger = logger,
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 5d25278..117c8db 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 1.6.0-dev
+version: 1.6.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,7 +7,7 @@
   sdk: '>=2.12.0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^21.0.0
+  _fe_analyzer_shared: ^22.0.0
   cli_util: ^0.3.0
   collection: ^1.15.0
   convert: ^3.0.0
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index eb08931..01c06dd 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -112,6 +112,7 @@
         'dart:_interceptors',
         'dart:_js_helper',
         'dart:_late_helper',
+        'dart:js',
         'dart:js_util'
       ];
 
diff --git a/pkg/compiler/lib/src/util/enumset.dart b/pkg/compiler/lib/src/util/enumset.dart
index 8db885e..e301cf4 100644
--- a/pkg/compiler/lib/src/util/enumset.dart
+++ b/pkg/compiler/lib/src/util/enumset.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.12
+
 library dart2js.util.enumset;
 
 import 'dart:collection';
@@ -19,11 +21,11 @@
 
   /// Create a set containing the [values]. If [fixed] is `true` the set is
   /// immutable.
-  factory EnumSet.fromValues(Iterable<E> values, {bool fixed: false}) {
+  factory EnumSet.fromValues(Iterable<E> values, {bool fixed = false}) {
     if (fixed) {
-      return new _ConstEnumSet<E>.fromValues(values);
+      return _ConstEnumSet<E>.fromValues(values);
     } else {
-      return new _EnumSet<E>.fromValues(values);
+      return _EnumSet<E>.fromValues(values);
     }
   }
 
@@ -53,19 +55,19 @@
 
   /// Returns a new set containing all values in both this and the [other] set.
   EnumSet<E> intersection(EnumSet<E> other) {
-    return new EnumSet.fromValue(value & other.value);
+    return EnumSet.fromValue(value & other.value);
   }
 
   /// Returns a new set containing all values either in this set or in the
   /// [other] set.
   EnumSet<E> union(EnumSet<E> other) {
-    return new EnumSet.fromValue(value | other.value);
+    return EnumSet.fromValue(value | other.value);
   }
 
   /// Returns a new set containing all values in this set that are not in the
   /// [other] set.
   EnumSet<E> minus(EnumSet<E> other) {
-    return new EnumSet.fromValue(value & ~other.value);
+    return EnumSet.fromValue(value & ~other.value);
   }
 
   /// Clears this set.
@@ -86,7 +88,7 @@
   ///     Iterable<EnumClass> iterable = set.iterable(EnumClass.values);
   ///
   Iterable<E> iterable(List<E> values) {
-    return new _EnumSetIterable(this, values);
+    return _EnumSetIterable(this, values);
   }
 
   /// Returns `true` if this and [other] have any elements in common.
@@ -101,7 +103,7 @@
   bool get isNotEmpty => value != 0;
 
   /// Returns a new mutable enum set that contains the values of this set.
-  EnumSet<E> clone() => new EnumSet<E>.fromValue(value);
+  EnumSet<E> clone() => EnumSet<E>.fromValue(value);
 
   @override
   int get hashCode => value.hashCode * 19;
@@ -115,16 +117,7 @@
 
   @override
   String toString() {
-    if (value == 0) return '0';
-    int index = value.bitLength - 1;
-    StringBuffer sb = new StringBuffer();
-    int mask = 1 << index;
-    while (index >= 0) {
-      sb.write((value & mask) != 0 ? '1' : '0');
-      index--;
-      mask >>= 1;
-    }
-    return sb.toString();
+    return value.toRadixString(2);
   }
 }
 
@@ -173,7 +166,7 @@
   EnumSet<E> removeAll(EnumSet<E> set) {
     int removed = _value & set.value;
     _value &= ~set.value;
-    return new EnumSet<E>.fromValue(removed);
+    return EnumSet<E>.fromValue(removed);
   }
 
   @override
@@ -198,22 +191,22 @@
     }
 
     values.forEach(add);
-    return new _ConstEnumSet(value);
+    return _ConstEnumSet(value);
   }
 
   @override
   void set value(int mask) {
-    throw new UnsupportedError('EnumSet.value=');
+    throw UnsupportedError('EnumSet.value=');
   }
 
   @override
   bool add(E enumValue) {
-    throw new UnsupportedError('EnumSet.add');
+    throw UnsupportedError('EnumSet.add');
   }
 
   @override
   void addAll(EnumSet<E> set) {
-    throw new UnsupportedError('EnumSet.addAll');
+    throw UnsupportedError('EnumSet.addAll');
   }
 
   @override
@@ -222,7 +215,7 @@
       // We allow this no-op operation on an immutable set to support using a
       // constant empty set together with mutable sets where applicable.
     } else {
-      throw new UnsupportedError('EnumSet.clear');
+      throw UnsupportedError('EnumSet.clear');
     }
   }
 
@@ -233,7 +226,7 @@
       // constant empty set together with mutable sets where applicable.
       return false;
     }
-    throw new UnsupportedError('EnumSet.remove');
+    throw UnsupportedError('EnumSet.remove');
   }
 
   @override
@@ -248,7 +241,7 @@
       // constant empty set together with mutable sets where applicable.
       return set.clone();
     }
-    throw new UnsupportedError('EnumSet.removeAll');
+    throw UnsupportedError('EnumSet.removeAll');
   }
 }
 
@@ -259,42 +252,28 @@
   _EnumSetIterable(this._enumSet, this._values);
 
   @override
-  Iterator<E> get iterator => new _EnumSetIterator(_enumSet.value, _values);
+  Iterator<E> get iterator => _EnumSetIterator(_enumSet.value, _values);
 }
 
 class _EnumSetIterator<E> implements Iterator<E> {
   int _value;
-  int _index;
-  int _mask;
   final List<E> _values;
-  E _current;
+  E? _current;
 
   _EnumSetIterator(this._value, this._values);
 
   @override
-  E get current => _current;
+  E get current => _current as E;
 
   @override
   bool moveNext() {
     if (_value == 0) {
-      return false;
-    } else {
-      if (_mask == null) {
-        _index = _value.bitLength - 1;
-        _mask = 1 << _index;
-      }
       _current = null;
-      while (_index >= 0) {
-        if (_mask & _value != 0) {
-          _current = _values[_index];
-        }
-        _mask >>= 1;
-        _index--;
-        if (_current != null) {
-          break;
-        }
-      }
-      return _current != null;
+      return false;
     }
+    int index = _value.bitLength - 1;
+    _current = _values[index];
+    _value &= ~(1 << index);
+    return true;
   }
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index aab6be3..c7c4e10 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -93,6 +93,7 @@
         'dart:collection',
         'dart:html',
         'dart:indexed_db',
+        'dart:js',
         'dart:js_util',
         'dart:math',
         'dart:svg',
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 6f0bc6c..47d868c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -20090,6 +20090,23 @@
   if (IsDynamicType() || IsVoidType()) {
     return false;
   }
+  // Left TypeRef.
+  if (IsTypeRef()) {
+    if (TestAndAddBuddyToTrail(&trail, other)) {
+      return true;
+    }
+    const AbstractType& ref_type =
+        AbstractType::Handle(TypeRef::Cast(*this).type());
+    return ref_type.IsSubtypeOf(other, space, trail);
+  }
+  // Right TypeRef.
+  if (other.IsTypeRef()) {
+    // Unfold right hand type. Divergence is controlled by left hand type.
+    const AbstractType& other_ref_type =
+        AbstractType::Handle(TypeRef::Cast(other).type());
+    ASSERT(!other_ref_type.IsTypeRef());
+    return IsSubtypeOf(other_ref_type, space, trail);
+  }
   // Left Null type.
   if (IsNullType()) {
     return Instance::NullIsAssignableTo(other);
@@ -20113,8 +20130,11 @@
     const TypeParameter& type_param = TypeParameter::Cast(*this);
     if (other.IsTypeParameter()) {
       const TypeParameter& other_type_param = TypeParameter::Cast(other);
+      // It is ok to pass the IsSubtypeOf trail to TypeParameter::IsEquivalent,
+      // because it will only be used in a IsSubtypeOf test of the type
+      // parameter bounds.
       if (type_param.IsEquivalent(other_type_param,
-                                  TypeEquality::kInSubtypeTest)) {
+                                  TypeEquality::kInSubtypeTest, trail)) {
         return true;
       }
     }
@@ -21521,8 +21541,12 @@
       AbstractType& other_type_param_upper_bound =
           AbstractType::Handle(other_type_param.bound());
       // Bounds that are mutual subtypes are considered equal.
-      if (!upper_bound.IsSubtypeOf(other_type_param_upper_bound, Heap::kOld) ||
-          !other_type_param_upper_bound.IsSubtypeOf(upper_bound, Heap::kOld)) {
+      // It is ok to pass the IsEquivalent trail as the IsSubtypeOf trail,
+      // because it is more restrictive (equivalence implies subtype).
+      if (!upper_bound.IsSubtypeOf(other_type_param_upper_bound, Heap::kOld,
+                                   trail) ||
+          !other_type_param_upper_bound.IsSubtypeOf(upper_bound, Heap::kOld,
+                                                    trail)) {
         return false;
       }
     } else {
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index d119a05..a2af1aa 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -3956,6 +3956,13 @@
   return result.ptr();
 }
 
+static FunctionPtr GetFunction(const Library& lib, const char* name) {
+  const Function& result = Function::Handle(
+      lib.LookupLocalFunction(String::Handle(String::New(name))));
+  EXPECT(!result.IsNull());
+  return result.ptr();
+}
+
 static FunctionPtr GetStaticFunction(const Class& cls, const char* name) {
   const auto& error = cls.EnsureIsFinalized(Thread::Current());
   EXPECT(error == Error::null());
@@ -4891,4 +4898,25 @@
   EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes)));
 }
 
+TEST_CASE(TypeParameterTypeRef) {
+  // Regression test for issue 82890.
+  const char* kScriptChars =
+      "void foo<T extends C<T>>(T x) {}\n"
+      "void bar<M extends U<M>>(M x) {}\n"
+      "abstract class C<T> {}\n"
+      "abstract class U<T> extends C<T> {}\n";
+  TestCase::LoadTestScript(kScriptChars, NULL);
+  TransitionNativeToVM transition(thread);
+  EXPECT(ClassFinalizer::ProcessPendingClasses());
+  const String& name = String::Handle(String::New(TestCase::url()));
+  const Library& lib = Library::Handle(Library::LookupLibrary(thread, name));
+  EXPECT(!lib.IsNull());
+
+  const Function& foo = Function::Handle(GetFunction(lib, "foo"));
+  const Function& bar = Function::Handle(GetFunction(lib, "bar"));
+  const TypeParameter& t = TypeParameter::Handle(foo.TypeParameterAt(0));
+  const TypeParameter& m = TypeParameter::Handle(bar.TypeParameterAt(0));
+  EXPECT(!m.IsSubtypeOf(t, Heap::kNew));
+}
+
 }  // namespace dart
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_runtime/lib/rti.dart
index 5264f8a..96fc0a8 100644
--- a/sdk/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/rti.dart
@@ -998,6 +998,13 @@
   // method. The Rti object is 'this'.
   Rti testRti = _Utils.asRti(JS('', 'this'));
   if (object == null) return _nullIs(testRti);
+
+  // Only JavaScript values with `typeof x == "object"` are Dart Lists. Other
+  // typeof results (undefined/string/number/boolean/function/symbol/bigint) are
+  // all non-Lists. Dart `null`, being JavaScript `null` or JavaScript
+  // `undefined`, is handled above.
+  if (JS('bool', 'typeof # != "object"', object)) return false;
+
   if (_Utils.isArray(object)) return true;
   var tag = Rti._getSpecializedTestResource(testRti);
 
diff --git a/sdk/lib/js_util/js_util.dart b/sdk/lib/js_util/js_util.dart
index df75900..867fd7f 100644
--- a/sdk/lib/js_util/js_util.dart
+++ b/sdk/lib/js_util/js_util.dart
@@ -68,14 +68,24 @@
 
 bool hasProperty(Object o, Object name) => JS('bool', '# in #', name, o);
 
+// All usage optimized away in a CFE transformation. Changes here will not
+// affect the generated JS.
 dynamic getProperty(Object o, Object name) =>
     JS('Object|Null', '#[#]', o, name);
 
+// Some usage optimized away in a CFE transformation. If given value is a
+// function, changes here will not affect the generated JS.
 dynamic setProperty(Object o, Object name, Object? value) {
   assertInterop(value);
   return JS('', '#[#]=#', o, name, value);
 }
 
+/// Unchecked version of setProperty, only used in a CFE transformation.
+@pragma('dart2js:tryInline')
+dynamic _setPropertyUnchecked(Object o, Object name, Object? value) {
+  return JS('', '#[#]=#', o, name, value);
+}
+
 dynamic callMethod(Object o, String method, List<Object?> args) {
   assertInteropArgs(args);
   return JS('Object|Null', '#[#].apply(#, #)', o, method, o, args);
diff --git a/tests/language/regress/regress34091.dart b/tests/language/regress/regress34091_test.dart
similarity index 100%
rename from tests/language/regress/regress34091.dart
rename to tests/language/regress/regress34091_test.dart
diff --git a/tests/language_2/regress/regress34091.dart b/tests/language_2/regress/regress34091_test.dart
similarity index 100%
rename from tests/language_2/regress/regress34091.dart
rename to tests/language_2/regress/regress34091_test.dart
diff --git a/tests/lib/js/js_util/properties_test.dart b/tests/lib/js/js_util/properties_test.dart
index d21a2c3..64f74bd 100644
--- a/tests/lib/js/js_util/properties_test.dart
+++ b/tests/lib/js/js_util/properties_test.dart
@@ -257,6 +257,8 @@
       js_util.setProperty(f, 'a', 100);
       expect(f.a, equals(100));
       expect(js_util.getProperty(f, 'a'), equals(100));
+      js_util.setProperty(f, 'a', null);
+      expect(f.a, equals(null));
 
       expect(js_util.getProperty(f, 'list') is List, isTrue);
       js_util.setProperty(f, 'list', [8]);
@@ -265,6 +267,23 @@
 
       js_util.setProperty(f, 'newProperty', 'new');
       expect(js_util.getProperty(f, 'newProperty'), equals('new'));
+
+      // Using a variable for the property value.
+      var num = 4;
+      js_util.setProperty(f, 'a', num);
+      expect(f.a, equals(num));
+      var str = 'bar';
+      js_util.setProperty(f, 'a', str);
+      expect(f.a, equals(str));
+      var b = false;
+      js_util.setProperty(f, 'a', b);
+      expect(f.a, equals(b));
+      var list = [2, 4, 6];
+      js_util.setProperty(f, 'a', list);
+      expect(f.a, equals(list));
+      var fn = allowInterop(dartFunction);
+      js_util.setProperty(f, 'a', fn);
+      expect(f.a, equals(fn));
     });
 
     test('typed literal', () {
@@ -319,6 +338,13 @@
       String bar = _getBarWithSideEffect();
       js_util.setProperty(f, bar, 'baz');
       expect(js_util.getProperty(f, bar), equals('baz'));
+      js_util.setProperty(f, _getBarWithSideEffect(), 'mumble');
+      expect(js_util.getProperty(f, bar), equals('mumble'));
+
+      // Set property to a function call.
+      js_util.setProperty(f, 'a', dartFunction());
+      String expected = dartFunction();
+      expect(f.a, equals(expected));
 
       // Using a tearoff as the property value
       js_util.setProperty(f, 'tearoff', allowInterop(ExampleTearoff().foo));
diff --git a/tests/lib_2/js/js_util/properties_test.dart b/tests/lib_2/js/js_util/properties_test.dart
index 3d2110b..7bd608f 100644
--- a/tests/lib_2/js/js_util/properties_test.dart
+++ b/tests/lib_2/js/js_util/properties_test.dart
@@ -259,6 +259,8 @@
       js_util.setProperty(f, 'a', 100);
       expect(f.a, equals(100));
       expect(js_util.getProperty(f, 'a'), equals(100));
+      js_util.setProperty(f, 'a', null);
+      expect(f.a, equals(null));
 
       expect(js_util.getProperty(f, 'list') is List, isTrue);
       js_util.setProperty(f, 'list', [8]);
@@ -267,6 +269,23 @@
 
       js_util.setProperty(f, 'newProperty', 'new');
       expect(js_util.getProperty(f, 'newProperty'), equals('new'));
+
+      // Using a variable for the property value.
+      var num = 4;
+      js_util.setProperty(f, 'a', num);
+      expect(f.a, equals(num));
+      var str = 'bar';
+      js_util.setProperty(f, 'a', str);
+      expect(f.a, equals(str));
+      var b = false;
+      js_util.setProperty(f, 'a', b);
+      expect(f.a, equals(b));
+      var list = [2, 4, 6];
+      js_util.setProperty(f, 'a', list);
+      expect(f.a, equals(list));
+      var fn = allowInterop(dartFunction);
+      js_util.setProperty(f, 'a', fn);
+      expect(f.a, equals(fn));
     });
 
     test('typed literal', () {
@@ -321,6 +340,13 @@
       String bar = _getBarWithSideEffect();
       js_util.setProperty(f, bar, 'baz');
       expect(js_util.getProperty(f, bar), equals('baz'));
+      js_util.setProperty(f, _getBarWithSideEffect(), 'mumble');
+      expect(js_util.getProperty(f, bar), equals('mumble'));
+
+      // Set property to a function call.
+      js_util.setProperty(f, 'a', dartFunction());
+      String expected = dartFunction();
+      expect(f.a, equals(expected));
 
       // Using a tearoff as the property value
       js_util.setProperty(f, 'tearoff', allowInterop(ExampleTearoff().foo));
diff --git a/tools/VERSION b/tools/VERSION
index 59fa74d..f1b398f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 152
+PRERELEASE 153
 PRERELEASE_PATCH 0
\ No newline at end of file
