Version 2.12.0-17.0.dev

Merge commit '89de1e82d9073d3f3a96145ad24940e8c311b493' into 'dev'
diff --git a/DEPS b/DEPS
index 519ade5d..d45fcd5 100644
--- a/DEPS
+++ b/DEPS
@@ -69,7 +69,7 @@
 
   # Revisions of /third_party/* dependencies.
   "args_tag": "1.6.0",
-  "async_rev": "6d2de25f208b011d79d056115256d3840229723b",
+  "async_rev": "695b3ac280f107c84adf7488743abfdfaaeea68f",
   "bazel_worker_rev": "26680d5e249b249c7216ab2fed0ac8ed4ee285c5",
   "benchmark_harness_rev": "ec6b646f5443faa871e126ac1ba248c94ca06257",
   "boolean_selector_rev": "665e6921ab246569420376f827bff4585dff0b14",
@@ -101,7 +101,7 @@
 "dart_style_tag": "1.3.9",  # Please see the note above before updating.
 
   "chromedriver_tag": "83.0.4103.39",
-  "dartdoc_rev" : "72c69f8659ce8823ce2dde9a4f758b0fa617ab5e",
+  "dartdoc_rev" : "6935dcd8f2d78cf1797e6365b4b71505e6579659",
   "ffi_rev": "a90bd424116fb6f416337db67425171f2dc4c98f",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
   "glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
@@ -147,7 +147,7 @@
   "source_maps_rev": "53eb92ccfe6e64924054f83038a534b959b12b3e",
   "source_span_rev": "cc7c4288a83f71ecef3414199947b52a8c112c65",
   "sse_tag": "e5cf68975e8e87171a3dc297577aa073454a91dc",
-  "stack_trace_tag": "45319bfd2a6da228d8c32b06e1da02ad199373c7",
+  "stack_trace_tag": "c9c867fa9d5b9c8a059e33d3efe759698aa49d60",
   "stagehand_tag": "v3.3.9",
   "stream_channel_tag": "d7251e61253ec389ee6e045ee1042311bced8f1d",
   "string_scanner_rev": "1b63e6e5db5933d7be0a45da6e1129fe00262734",
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index ba3883d..990feb4 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -535,6 +535,7 @@
   HintCode.NULL_AWARE_BEFORE_OPERATOR,
   HintCode.NULL_AWARE_IN_CONDITION,
   HintCode.NULL_AWARE_IN_LOGICAL_OPERATOR,
+  HintCode.NULL_CHECK_ALWAYS_FAILS,
   HintCode.NULLABLE_TYPE_IN_CATCH_CLAUSE,
   HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE,
   HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD,
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 3688028..a9eae73 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -1435,6 +1435,15 @@
           "as an operand of a logical operator.");
 
   /**
+   * This hint indicates that a null literal is null-checked with `!`, but null
+   * is never not null.
+   */
+  static const HintCode NULL_CHECK_ALWAYS_FAILS = HintCode(
+      'NULL_CHECK_ALWAYS_FAILS',
+      "This null-check will always throw an exception because the expression "
+          "will always evaluate to 'null'.");
+
+  /**
    * No parameters.
    */
   // #### Description
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
index 54a67e4..6d65356 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -32,10 +32,60 @@
       hasWrite: false,
     );
 
-    var identifier = node.identifier;
-    identifier.staticElement = result.readElement;
+    var element = result.readElement;
 
-    _resolve2(node);
+    var identifier = node.identifier;
+    identifier.staticElement = element;
+
+    if (element is ExtensionElement) {
+      _setExtensionIdentifierType(node);
+      return;
+    }
+
+    if (identical(node.prefix.staticType, NeverTypeImpl.instance)) {
+      _recordStaticType(identifier, NeverTypeImpl.instance);
+      _recordStaticType(node, NeverTypeImpl.instance);
+      return;
+    }
+
+    DartType type = DynamicTypeImpl.instance;
+    if (element is ClassElement) {
+      if (_isExpressionIdentifier(node)) {
+        var type = _typeProvider.typeType;
+        node.staticType = type;
+        identifier.staticType = type;
+      }
+      return;
+    } else if (element is DynamicElementImpl) {
+      var type = _typeProvider.typeType;
+      node.staticType = type;
+      identifier.staticType = type;
+      return;
+    } else if (element is FunctionTypeAliasElement) {
+      if (node.parent is TypeName) {
+        // no type
+      } else {
+        var type = _typeProvider.typeType;
+        node.staticType = type;
+        identifier.staticType = type;
+      }
+      return;
+    } else if (element is MethodElement) {
+      type = element.type;
+    } else if (element is PropertyAccessorElement) {
+      type = _getTypeOfProperty(element);
+    } else if (element is ExecutableElement) {
+      type = element.type;
+    } else if (element is VariableElement) {
+      type = element.type;
+    } else if (result.functionTypeCallType != null) {
+      type = result.functionTypeCallType;
+    }
+
+    type = _inferenceHelper.inferTearOff(node, identifier, type);
+
+    _recordStaticType(identifier, type);
+    _recordStaticType(node, type);
   }
 
   /// Return the type that should be recorded for a node that resolved to the given accessor.
@@ -103,60 +153,6 @@
     _inferenceHelper.recordStaticType(expression, type);
   }
 
-  void _resolve2(PrefixedIdentifier node) {
-    SimpleIdentifier prefixedIdentifier = node.identifier;
-    Element staticElement = prefixedIdentifier.staticElement;
-
-    if (staticElement is ExtensionElement) {
-      _setExtensionIdentifierType(node);
-      return;
-    }
-
-    if (identical(node.prefix.staticType, NeverTypeImpl.instance)) {
-      _recordStaticType(prefixedIdentifier, NeverTypeImpl.instance);
-      _recordStaticType(node, NeverTypeImpl.instance);
-      return;
-    }
-
-    DartType staticType = DynamicTypeImpl.instance;
-    if (staticElement is ClassElement) {
-      if (_isExpressionIdentifier(node)) {
-        var type = _typeProvider.typeType;
-        node.staticType = type;
-        node.identifier.staticType = type;
-      }
-      return;
-    } else if (staticElement is DynamicElementImpl) {
-      var type = _typeProvider.typeType;
-      node.staticType = type;
-      node.identifier.staticType = type;
-      return;
-    } else if (staticElement is FunctionTypeAliasElement) {
-      if (node.parent is TypeName) {
-        // no type
-      } else {
-        var type = _typeProvider.typeType;
-        node.staticType = type;
-        node.identifier.staticType = type;
-      }
-      return;
-    } else if (staticElement is MethodElement) {
-      staticType = staticElement.type;
-    } else if (staticElement is PropertyAccessorElement) {
-      staticType = _getTypeOfProperty(staticElement);
-    } else if (staticElement is ExecutableElement) {
-      staticType = staticElement.type;
-    } else if (staticElement is VariableElement) {
-      staticType = staticElement.type;
-    }
-
-    staticType =
-        _inferenceHelper.inferTearOff(node, node.identifier, staticType);
-
-    _recordStaticType(prefixedIdentifier, staticType);
-    _recordStaticType(node, staticType);
-  }
-
   /// TODO(scheglov) this is duplicate
   void _setExtensionIdentifierType(Identifier node) {
     if (node is SimpleIdentifier && node.inDeclarationContext()) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 23023c0..a271757e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -329,6 +329,12 @@
 
     var targetType = target.staticType;
 
+    if (targetType is FunctionType && propertyName.name == 'call') {
+      return PropertyElementResolverResult(
+        functionTypeCallType: targetType,
+      );
+    }
+
     if (targetType.isVoid) {
       _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.USE_OF_VOID_RESULT,
@@ -693,6 +699,7 @@
   final Element readElementRecovery;
   final Element writeElementRequested;
   final Element writeElementRecovery;
+  final FunctionType functionTypeCallType;
 
   /// If [IndexExpression] is resolved, the context type of the index.
   /// Might be `null` if `[]` or `[]=` are not resolved or invalid.
@@ -704,6 +711,7 @@
     this.writeElementRequested,
     this.writeElementRecovery,
     this.indexContextType,
+    this.functionTypeCallType,
   });
 
   Element get readElement {
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 0093170..392a4b1 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -613,6 +613,9 @@
   @override
   void visitPostfixExpression(PostfixExpression node) {
     _deprecatedVerifier.postfixExpression(node);
+    if (node.operand.staticType?.isDartCoreNull ?? false) {
+      _errorReporter.reportErrorForNode(HintCode.NULL_CHECK_ALWAYS_FAILS, node);
+    }
     super.visitPostfixExpression(node);
   }
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index aa631a8..4cbf579 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1743,6 +1743,8 @@
       type = element.type;
     } else if (element is PropertyAccessorElement && element.isGetter) {
       type = element.returnType;
+    } else if (result.functionTypeCallType != null) {
+      type = result.functionTypeCallType;
     } else {
       type = DynamicTypeImpl.instance;
     }
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 e955fb1..3ba26a1 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -6218,7 +6218,7 @@
 
     SimpleIdentifier methodName = prefixed.identifier;
     expect(methodName.staticElement, isNull);
-    expect(methodName.staticType, typeProvider.dynamicType);
+    assertType(methodName.staticType, 'double Function(int)');
   }
 
   test_prefixedIdentifier_importPrefix_className() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
index add8f6f..400c242 100644
--- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
@@ -614,11 +614,13 @@
   }
 
   test_nullCheck_null() async {
-    await assertNoErrorsInCode('''
+    await assertErrorsInCode('''
 void f(Null x) {
   x!;
 }
-''');
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 19, 2),
+    ]);
 
     assertType(findNode.postfix('x!'), 'Never');
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
index 679ec1a..ff8104f 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -33,6 +33,20 @@
     );
   }
 
+  test_functionType_call_read() async {
+    await assertNoErrorsInCode('''
+void f(int Function(String) a) {
+  a.call;
+}
+''');
+
+    assertPrefixedIdentifier(
+      findNode.prefixed('.call;'),
+      element: null,
+      type: 'int Function(String)',
+    );
+  }
+
   test_implicitCall_tearOff() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 308f02f..313cd97 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -124,6 +124,20 @@
     }
   }
 
+  test_functionType_call_read() async {
+    await assertNoErrorsInCode('''
+void f(int Function(String) a) {
+  (a).call;
+}
+''');
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('call;'),
+      element: null,
+      type: 'int Function(String)',
+    );
+  }
+
   test_instanceCreation_read() async {
     await assertNoErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/null_check_always_fails_test.dart b/pkg/analyzer/test/src/diagnostics/null_check_always_fails_test.dart
new file mode 100644
index 0000000..e21d37c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/null_check_always_fails_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullNeverNotNullTest);
+  });
+}
+
+@reflectiveTest
+class NullNeverNotNullTest extends PubPackageResolutionTest
+    with WithNullSafetyMixin {
+  test_nullable() async {
+    await assertNoErrorsInCode(r'''
+void f(int? i) {
+  i!;
+}
+''');
+  }
+
+  test_nullLiteral() async {
+    await assertErrorsInCode(r'''
+void f() {
+  null!;
+}
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 13, 5),
+    ]);
+  }
+
+  test_nullLiteral_parenthesized() async {
+    await assertErrorsInCode(r'''
+void f() {
+  null!;
+}
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 13, 5),
+    ]);
+  }
+
+  test_nullType() async {
+    await assertErrorsInCode(r'''
+void f() {
+  g()!;
+}
+Null g() => null;
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 13, 4),
+    ]);
+  }
+
+  test_nullType_awaited() async {
+    await assertErrorsInCode(r'''
+void f() async {
+  (await g())!;
+}
+Future<Null> g() async => null;
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 19, 12),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 3c07bbe..2498c30 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -464,6 +464,7 @@
 import 'null_aware_in_condition_test.dart' as null_aware_in_condition;
 import 'null_aware_in_logical_operator_test.dart'
     as null_aware_in_logical_operator;
+import 'null_check_always_fails_test.dart' as null_check_always_fails;
 import 'null_safety_read_write_test.dart' as null_safety_read_write;
 import 'nullable_type_in_catch_clause_test.dart'
     as nullable_type_in_catch_clause;
@@ -963,6 +964,7 @@
     null_aware_before_operator.main();
     null_aware_in_condition.main();
     null_aware_in_logical_operator.main();
+    null_check_always_fails.main();
     null_safety_read_write.main();
     nullable_type_in_catch_clause.main();
     nullable_type_in_extends_clause.main();
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index baf399c..814771c 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -277,7 +277,7 @@
 }
 
 void f(A a) {
-  return a.staticMethod.call;
+  a.staticMethod.call;
 }
 ''');
   }
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index f959b95..32be6a6 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.5.0
+- Added event caching for `Stdout`, `Stderr`, and `Extension` streams. When a
+client subscribes to one of these streams, they will be sent up to 10,000
+historical events from the stream.
+
 # 1.4.1
 - Fixed issue where `evaluate` and `evaluateInFrame` requests were not being
   forwarded to the VM service properly when no external compilation service
diff --git a/pkg/dds/dds_protocol.md b/pkg/dds/dds_protocol.md
index be9da7e..253ef99 100644
--- a/pkg/dds/dds_protocol.md
+++ b/pkg/dds/dds_protocol.md
@@ -47,6 +47,22 @@
 
 See the corresponding section in the VM Service protocol [here][service-protocol-ids-and-names].
 
+## Streams
+
+For a list of core VM service streams, see [streamListen][service-protocol-streams].
+
+DDS will keep a history of events on certain streams and send historical events
+when a client first subscribes to a stream with history. These streams currently
+consist of the following:
+
+- `Logging`
+- `Stdout`
+- `Stderr`
+- `Extension`
+
+In addition, subscribing to the `Service` stream will result in a `ServiceRegistered`
+event being sent to the subscribing client for each existing service extension.
+
 ## Public RPCs
 
 The DDS Protocol supports all [public RPCs defined in the VM Service protocol][service-protocol-public-rpcs].
@@ -187,6 +203,7 @@
 [service-protocol]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md
 [service-protocol-rpcs-requests-and-responses]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#rpcs-requests-and-responses
 [service-protocol-events]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#events
+[service-protocol-streams]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#streamlisten
 [service-protocol-binary-events]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#binary-events
 [service-protocol-types]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#types
 [service-protocol-ids-and-names]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#ids-and-names
diff --git a/pkg/dds/lib/src/client.dart b/pkg/dds/lib/src/client.dart
index 79e4233..2c85aae 100644
--- a/pkg/dds/lib/src/client.dart
+++ b/pkg/dds/lib/src/client.dart
@@ -140,7 +140,9 @@
         'getLogHistorySize',
         (parameters) => {
               'type': 'Size',
-              'size': dds.loggingRepository.bufferSize,
+              'size': _StreamManager
+                  .loggingRepositories[_StreamManager.kLoggingStream]
+                  .bufferSize,
             });
 
     _clientPeer.registerMethod('setLogHistorySize', (parameters) {
@@ -150,7 +152,8 @@
           "'size' must be greater or equal to zero",
         );
       }
-      dds.loggingRepository.resize(size);
+      _StreamManager.loggingRepositories[_StreamManager.kLoggingStream]
+          .resize(size);
       return _RPCResponses.success;
     });
 
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
index 06327a8..d2a6dcb 100644
--- a/pkg/dds/lib/src/dds_impl.dart
+++ b/pkg/dds/lib/src/dds_impl.dart
@@ -10,7 +10,6 @@
     _clientManager = _ClientManager(this);
     _expressionEvaluator = _ExpressionEvaluator(this);
     _isolateManager = _IsolateManager(this);
-    _loggingRepository = _LoggingRepository();
     _streamManager = _StreamManager(this);
     _authCode = _authCodesEnabled ? _makeAuthToken() : '';
   }
@@ -270,9 +269,6 @@
   _IsolateManager get isolateManager => _isolateManager;
   _IsolateManager _isolateManager;
 
-  _LoggingRepository get loggingRepository => _loggingRepository;
-  _LoggingRepository _loggingRepository;
-
   _StreamManager get streamManager => _streamManager;
   _StreamManager _streamManager;
 
diff --git a/pkg/dds/lib/src/stream_manager.dart b/pkg/dds/lib/src/stream_manager.dart
index abb233c..542fe91 100644
--- a/pkg/dds/lib/src/stream_manager.dart
+++ b/pkg/dds/lib/src/stream_manager.dart
@@ -91,7 +91,14 @@
     // The _IsolateManager requires information from both the Debug and
     // Isolate streams, so they must always be subscribed to by DDS.
     for (final stream in ddsCoreStreams) {
-      await streamListen(null, stream);
+      try {
+        await streamListen(null, stream);
+        if (loggingRepositoryStreams.contains(stream)) {
+          loggingRepositories[stream] = _LoggingRepository();
+        }
+      } on json_rpc.RpcException {
+        // Stdout and Stderr streams may not exist.
+      }
     }
     dds._vmServiceClient.registerMethod(
       'streamNotify',
@@ -101,10 +108,10 @@
         if (isolateManagerStreams.contains(streamId)) {
           dds.isolateManager.handleIsolateEvent(parameters);
         }
-        // Keep a history of log messages to send to clients when they first
-        // subscribe to the Logging stream.
-        if (streamId == kLoggingStream) {
-          dds.loggingRepository.add(parameters.asMap);
+        // Keep a history of messages to send to clients when they first
+        // subscribe to a stream with an event history.
+        if (loggingRepositories.containsKey(streamId)) {
+          loggingRepositories[streamId].add(parameters.asMap);
         }
         streamNotify(streamId, parameters.value);
       },
@@ -137,8 +144,8 @@
     }
     if (client != null) {
       streamListeners[stream].add(client);
-      if (stream == kLoggingStream) {
-        dds.loggingRepository.sendHistoricalLogs(client);
+      if (loggingRepositories.containsKey(stream)) {
+        loggingRepositories[stream].sendHistoricalLogs(client);
       } else if (stream == kServiceStream) {
         // Send all previously registered service extensions when a client
         // subscribes to the Service stream.
@@ -223,8 +230,13 @@
   );
 
   static const kDebugStream = 'Debug';
+  static const kExtensionStream = 'Extension';
   static const kIsolateStream = 'Isolate';
   static const kLoggingStream = 'Logging';
+  static const kStderrStream = 'Stderr';
+  static const kStdoutStream = 'Stdout';
+
+  static Map<String, _LoggingRepository> loggingRepositories = {};
 
   // Never cancel the Debug or Isolate stream as `_IsolateManager` requires
   // them for isolate state notifications.
@@ -233,10 +245,13 @@
     kIsolateStream,
   };
 
-  // Never cancel the Logging stream as `_LoggingRepository` requires it to
-  // keep a log history.
+  // Never cancel the logging and extension event streams as `_LoggingRepository`
+  // requires them keep history.
   static const loggingRepositoryStreams = <String>{
+    kExtensionStream,
     kLoggingStream,
+    kStderrStream,
+    kStdoutStream,
   };
 
   // The set of streams that DDS requires to function.
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index a7ae669..d2fdbdb 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,7 +3,7 @@
   A library used to spawn the Dart Developer Service, used to communicate with
   a Dart VM Service instance.
 
-version: 1.4.1
+version: 1.5.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
 
diff --git a/pkg/front_end/lib/src/api_prototype/file_system.dart b/pkg/front_end/lib/src/api_prototype/file_system.dart
index 1306c0c..82b511a 100644
--- a/pkg/front_end/lib/src/api_prototype/file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/file_system.dart
@@ -4,8 +4,6 @@
 
 library front_end.file_system;
 
-import 'dart:async';
-
 /// Abstract interface to file system operations.
 ///
 /// All front end interaction with the file system goes through this interface;
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index c49c884..e5b1bc2 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/scanner/string_scanner.dart'
     show StringScanner;
 
diff --git a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
index 8519ca0..27857a9 100644
--- a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
@@ -5,8 +5,6 @@
 /// Defines the front-end API for converting source code to Dart Kernel objects.
 library front_end.kernel_generator;
 
-import 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
     show messageMissingMain, noLength;
 
diff --git a/pkg/front_end/lib/src/api_prototype/memory_file_system.dart b/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
index 3618c93..e077d8d 100644
--- a/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
@@ -4,7 +4,6 @@
 
 library front_end.memory_file_system;
 
-import 'dart:async';
 import 'dart:convert';
 import 'dart:typed_data';
 
diff --git a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
index bdd78ad..a8bbc0b 100644
--- a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
@@ -4,7 +4,6 @@
 
 library front_end.standard_file_system;
 
-import 'dart:async';
 import 'dart:io' as io;
 
 import 'file_system.dart';
diff --git a/pkg/front_end/lib/src/api_prototype/summary_generator.dart b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
index 5385311..d579536 100644
--- a/pkg/front_end/lib/src/api_prototype/summary_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
@@ -5,7 +5,6 @@
 /// Defines the front-end API for converting source code to summaries.
 library front_end.summary_generator;
 
-import 'dart:async';
 import 'compiler_options.dart';
 
 import '../base/processed_options.dart';
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 24c779d..d4445e4 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -5,8 +5,6 @@
 /// API needed by `utils/front_end/summary_worker.dart`, a tool used to compute
 /// summaries in build systems like bazel, pub-build, and package-build.
 
-import 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessageHandler;
 
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 85cb35a..d7fba2e 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
     show messageMissingMain;
 
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index d9506f7..b28384f 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessageHandler;
 
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
index 0044b4c..691483d 100644
--- a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:kernel/kernel.dart' show Component, CanonicalName, Library;
 
 import 'package:kernel/target/targets.dart' show Target;
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index e6ee21b..93c5853 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -4,8 +4,6 @@
 
 import 'dart:io' show exitCode;
 
-import 'dart:async' show Future;
-
 import 'dart:typed_data' show Uint8List;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 5fb86e7..63f82eb 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -577,7 +577,10 @@
 
   RegularFieldEncoding(Uri fileUri, int charOffset, int charEndOffset,
       Field reference, bool isNonNullableByDefault) {
-    _field = new Field(null, fileUri: fileUri, reference: reference?.reference)
+    _field = new Field(null,
+        fileUri: fileUri,
+        getterReference: reference?.getterReference,
+        setterReference: reference?.setterReference)
       ..fileOffset = charOffset
       ..fileEndOffset = charEndOffset
       ..isNonNullableByDefault = isNonNullableByDefault;
@@ -787,12 +790,14 @@
         _isSetStrategy = isSetStrategy,
         _forceIncludeIsSetField =
             isSetStrategy == late_lowering.IsSetStrategy.forceUseIsSetField {
-    _field =
-        new Field(null, fileUri: fileUri, reference: referenceFrom?.reference)
-          ..fileOffset = charOffset
-          ..fileEndOffset = charEndOffset
-          ..isNonNullableByDefault = true
-          ..isInternalImplementation = true;
+    _field = new Field(null,
+        fileUri: fileUri,
+        getterReference: referenceFrom?.getterReference,
+        setterReference: referenceFrom?.setterReference)
+      ..fileOffset = charOffset
+      ..fileEndOffset = charEndOffset
+      ..isNonNullableByDefault = true
+      ..isInternalImplementation = true;
     switch (_isSetStrategy) {
       case late_lowering.IsSetStrategy.useSentinelOrNull:
         // [_lateIsSetField] is never needed.
@@ -800,7 +805,9 @@
       case late_lowering.IsSetStrategy.forceUseIsSetField:
       case late_lowering.IsSetStrategy.useIsSetFieldOrNull:
         _lateIsSetField = new Field(null,
-            fileUri: fileUri, reference: lateIsSetReferenceFrom?.reference)
+            fileUri: fileUri,
+            getterReference: lateIsSetReferenceFrom?.getterReference,
+            setterReference: lateIsSetReferenceFrom?.setterReference)
           ..fileOffset = charOffset
           ..fileEndOffset = charEndOffset
           ..isNonNullableByDefault = true
diff --git a/pkg/front_end/lib/src/fasta/compiler_context.dart b/pkg/front_end/lib/src/fasta/compiler_context.dart
index 38df523..e65531a 100644
--- a/pkg/front_end/lib/src/fasta/compiler_context.dart
+++ b/pkg/front_end/lib/src/fasta/compiler_context.dart
@@ -4,7 +4,7 @@
 
 library fasta.compiler_context;
 
-import 'dart:async' show Future, Zone, runZoned;
+import 'dart:async' show Zone, runZoned;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
diff --git a/pkg/front_end/lib/src/fasta/crash.dart b/pkg/front_end/lib/src/fasta/crash.dart
index 8498da9..1ad20fc 100644
--- a/pkg/front_end/lib/src/fasta/crash.dart
+++ b/pkg/front_end/lib/src/fasta/crash.dart
@@ -4,8 +4,6 @@
 
 library fasta.crash;
 
-import 'dart:async' show Future;
-
 import 'dart:convert' show jsonEncode;
 
 import 'dart:io'
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index cf98a1f..2ce2498 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -4,8 +4,6 @@
 
 library fasta.dill_loader;
 
-import 'dart:async' show Future;
-
 import 'package:kernel/ast.dart' show Class, Component, DartType, Library;
 
 import '../builder/class_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_target.dart b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
index 717c348..52fa515 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_target.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
@@ -4,8 +4,6 @@
 
 library fasta.dill_target;
 
-import 'dart:async' show Future;
-
 import 'package:front_end/src/fasta/builder/library_builder.dart'
     show LibraryBuilder;
 
diff --git a/pkg/front_end/lib/src/fasta/get_dependencies.dart b/pkg/front_end/lib/src/fasta/get_dependencies.dart
index 22b621a..3a23778 100644
--- a/pkg/front_end/lib/src/fasta/get_dependencies.dart
+++ b/pkg/front_end/lib/src/fasta/get_dependencies.dart
@@ -4,8 +4,6 @@
 
 library fasta.get_dependencies;
 
-import 'dart:async' show Future;
-
 import 'package:kernel/kernel.dart' show Component, loadComponentFromBytes;
 
 import 'package:kernel/target/targets.dart' show Target;
diff --git a/pkg/front_end/lib/src/fasta/hybrid_file_system.dart b/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
index 84d1cbd..3a78a1c 100644
--- a/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
+++ b/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
@@ -6,8 +6,6 @@
 /// sdk sources from disk.
 library front_end.src.hybrid_file_system;
 
-import 'dart:async';
-
 import '../api_prototype/file_system.dart';
 import '../api_prototype/memory_file_system.dart';
 import '../api_prototype/standard_file_system.dart';
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 69d3f19..73c5550 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -4,8 +4,6 @@
 
 library fasta.incremental_compiler;
 
-import 'dart:async' show Future;
-
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/base/nnbd_mode.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
index 2db181b..4521aec 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
@@ -191,7 +191,7 @@
                 evaluator.unmodifiableSetMap.enclosingClass.reference, [
               elementType
             ], <Reference, Constant>{
-              evaluator.unmodifiableSetMap.reference: map
+              evaluator.unmodifiableSetMap.getterReference: map
             }));
       } else {
         return evaluator.lowerSetConstant(result);
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 3d6f7a5..1d098cd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -2855,7 +2855,7 @@
     final Map<Reference, Constant> fieldValues = <Reference, Constant>{};
     fields.forEach((Field field, Constant value) {
       assert(value is! UnevaluatedConstant);
-      fieldValues[field.reference] = value;
+      fieldValues[field.getterReference] = value;
     });
     assert(unusedArguments.isEmpty);
     return new InstanceConstant(klass.reference, typeArguments, fieldValues);
@@ -2864,7 +2864,7 @@
   InstanceCreation buildUnevaluatedInstance() {
     final Map<Reference, Expression> fieldValues = <Reference, Expression>{};
     fields.forEach((Field field, Constant value) {
-      fieldValues[field.reference] = evaluator.extract(value);
+      fieldValues[field.getterReference] = evaluator.extract(value);
     });
     return new InstanceCreation(
         klass.reference, typeArguments, fieldValues, asserts, unusedArguments);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index ba8a8b3..afa72c8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -4,8 +4,6 @@
 
 library fasta.kernel_target;
 
-import 'dart:async' show Future;
-
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/fasta/dill/dill_library_builder.dart'
     show DillLibraryBuilder;
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index 06556d5..c4a6bc5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -309,7 +309,7 @@
       if (field.isStatic) continue;
       if (!first) result.add(", ");
       result.add("${field.name}: ");
-      node.fieldValues[field.reference].accept(this);
+      node.fieldValues[field.getterReference].accept(this);
       first = false;
     }
     result.add("}");
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index aae5538..1eaf2b3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:io' show BytesBuilder, File, IOSink;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 35c5007..cb9e306 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -4,8 +4,6 @@
 
 library fasta.loader;
 
-import 'dart:async' show Future;
-
 import 'dart:collection' show Queue;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 35a1e40..710d78e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -860,7 +860,8 @@
           isStatic: true,
           initializer: literal,
           fileUri: cls.fileUri,
-          reference: referenceFrom?.reference)
+          getterReference: referenceFrom?.getterReference,
+          setterReference: referenceFrom?.setterReference)
         ..fileOffset = cls.fileOffset;
       cls.addField(field);
       constructorsField = new DillFieldBuilder(field, this);
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 0479011..f3c9943 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -146,17 +146,20 @@
                   break;
               }
               assert(kind != null);
+              Reference memberReference;
               if (member is Field) {
                 libraryBuilder.library.addField(member);
+                memberReference = member.getterReference;
               } else if (member is Procedure) {
                 libraryBuilder.library.addProcedure(member);
+                memberReference = member.reference;
               } else {
                 unhandled("${member.runtimeType}", "buildBuilders",
                     member.fileOffset, member.fileUri);
               }
               extension.members.add(new ExtensionMemberDescriptor(
                   name: new Name(memberBuilder.name, libraryBuilder.library),
-                  member: member.reference,
+                  member: memberReference,
                   isStatic: declaration.isStatic,
                   kind: kind));
             }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index b70ba48..f34bede 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -806,15 +806,18 @@
 
   @override
   Builder addBuilder(String name, Builder declaration, int charOffset,
-      {Reference reference}) {
+      {Reference getterReference, Reference setterReference}) {
     // TODO(ahe): Set the parent correctly here. Could then change the
     // implementation of MemberBuilder.isTopLevel to test explicitly for a
     // LibraryBuilder.
     if (name == null) {
       unhandled("null", "name", charOffset, fileUri);
     }
-    if (reference != null) {
-      loader.buildersCreatedWithReferences[reference] = declaration;
+    if (getterReference != null) {
+      loader.buildersCreatedWithReferences[getterReference] = declaration;
+    }
+    if (setterReference != null) {
+      loader.buildersCreatedWithReferences[setterReference] = declaration;
     }
     if (currentTypeParameterScopeBuilder == libraryDeclaration) {
       if (declaration is MemberBuilder) {
@@ -977,7 +980,8 @@
           initializer: new StringLiteral(jsonEncode(unserializableExports)),
           isStatic: true,
           isConst: true,
-          reference: referenceFrom?.reference));
+          getterReference: referenceFrom?.getterReference,
+          setterReference: referenceFrom?.setterReference));
     }
 
     return library;
@@ -1258,7 +1262,15 @@
                 library.additionalExports.add(memberLast.extension.reference);
               } else if (memberLast is MemberBuilder) {
                 for (Member member in memberLast.exportedMembers) {
-                  library.additionalExports.add(member.reference);
+                  if (member is Field) {
+                    // For fields add both getter and setter references
+                    // so replacing a field with a getter/setter pair still
+                    // exports correctly.
+                    library.additionalExports.add(member.getterReference);
+                    library.additionalExports.add(member.setterReference);
+                  } else {
+                    library.additionalExports.add(member.reference);
+                  }
                 }
               } else {
                 unhandled('member', 'exportScope', memberLast.charOffset,
@@ -1594,7 +1606,7 @@
     constructors.forEach(setParentAndCheckConflicts);
     setters.forEach(setParentAndCheckConflicts);
     addBuilder(className, classBuilder, nameOffset,
-        reference: referencesFromClass?.reference);
+        getterReference: referencesFromClass?.reference);
   }
 
   Map<String, TypeVariableBuilder> checkTypeVariables(
@@ -1804,7 +1816,7 @@
     constructors.forEach(setParentAndCheckConflicts);
     setters.forEach(setParentAndCheckConflicts);
     addBuilder(extensionName, extensionBuilder, nameOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
   }
 
   TypeBuilder applyMixins(TypeBuilder type, int startCharOffset, int charOffset,
@@ -2045,7 +2057,7 @@
         // handle that :(
         application.cls.isAnonymousMixin = !isNamedMixinApplication;
         addBuilder(fullname, application, charOffset,
-            reference: referencesFromClass?.reference);
+            getterReference: referencesFromClass?.reference);
         supertype = addNamedType(fullname, const NullabilityBuilder.omitted(),
             applicationTypeArguments, charOffset);
       }
@@ -2194,7 +2206,8 @@
         setterReferenceFrom);
     fieldBuilder.constInitializerToken = constInitializerToken;
     addBuilder(name, fieldBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.getterReference,
+        setterReference: referenceFrom?.setterReference);
     if (type == null && fieldBuilder.next == null) {
       // Only the first one (the last one in the linked list of next pointers)
       // are added to the tree, had parent pointers and can infer correctly.
@@ -2255,7 +2268,7 @@
         constructorBuilder.constructor, name);
     checkTypeVariables(typeVariables, constructorBuilder);
     addBuilder(constructorName, constructorBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
     if (nativeMethodName != null) {
       addNativeMethod(constructorBuilder);
     }
@@ -2368,7 +2381,7 @@
         procedureBuilder.procedure, documentationComment);
     checkTypeVariables(typeVariables, procedureBuilder);
     addBuilder(name, procedureBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
     if (nativeMethodName != null) {
       addNativeMethod(procedureBuilder);
     }
@@ -2471,7 +2484,7 @@
 
     factoryDeclaration.resolveTypes(procedureBuilder.typeVariables, this);
     addBuilder(procedureName, procedureBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
     if (nativeMethodName != null) {
       addNativeMethod(procedureBuilder);
     }
@@ -2505,7 +2518,7 @@
         referencesFromClass,
         referencesFromIndexedClass);
     addBuilder(name, builder, charOffset,
-        reference: referencesFromClass?.reference);
+        getterReference: referencesFromClass?.reference);
     metadataCollector?.setDocumentationComment(
         builder.cls, documentationComment);
   }
@@ -2533,7 +2546,7 @@
     endNestedDeclaration(TypeParameterScopeKind.typedef, "#typedef")
         .resolveTypes(typeVariables, this);
     addBuilder(name, typedefBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
   }
 
   FunctionTypeBuilder addFunctionType(
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 215bba5..c9a3615 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -4,8 +4,6 @@
 
 library fasta.source_loader;
 
-import 'dart:async' show Future;
-
 import 'dart:convert' show utf8;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/lib/src/fasta/target.dart b/pkg/front_end/lib/src/fasta/target.dart
index 641d55a..8d2efd9 100644
--- a/pkg/front_end/lib/src/fasta/target.dart
+++ b/pkg/front_end/lib/src/fasta/target.dart
@@ -4,8 +4,6 @@
 
 library fasta.target;
 
-import 'dart:async' show Future;
-
 import 'package:kernel/ast.dart' show Component;
 
 import 'ticker.dart' show Ticker;
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index 78a0c68..24b5b55 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -5,8 +5,6 @@
 /// Defines the front-end API for converting source code to Dart Kernel objects.
 library front_end.kernel_generator_impl;
 
-import 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
 import 'package:kernel/kernel.dart'
diff --git a/pkg/front_end/lib/src/testing/compiler_common.dart b/pkg/front_end/lib/src/testing/compiler_common.dart
index 0f698a84..3164c83 100644
--- a/pkg/front_end/lib/src/testing/compiler_common.dart
+++ b/pkg/front_end/lib/src/testing/compiler_common.dart
@@ -5,8 +5,6 @@
 /// Common compiler options and helper functions used for testing.
 library front_end.testing.compiler_options_common;
 
-import 'dart:async' show Future;
-
 import 'package:kernel/ast.dart' show Library, Component;
 
 import '../api_prototype/front_end.dart'
diff --git a/pkg/front_end/test/fasta/bootstrap_test.dart b/pkg/front_end/test/fasta/bootstrap_test.dart
index 37dff17..f7ea1bd 100644
--- a/pkg/front_end/test/fasta/bootstrap_test.dart
+++ b/pkg/front_end/test/fasta/bootstrap_test.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:io' show Directory, File, Platform;
 
 import 'package:async_helper/async_helper.dart' show asyncEnd, asyncStart;
diff --git a/pkg/front_end/test/fasta/expression_suite.dart b/pkg/front_end/test/fasta/expression_suite.dart
index 46811fb..2b29aa0 100644
--- a/pkg/front_end/test/fasta/expression_suite.dart
+++ b/pkg/front_end/test/fasta/expression_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.expression_test;
 
-import "dart:async" show Future;
-
 import "dart:convert" show JsonEncoder;
 
 import "dart:io" show File, IOSink;
diff --git a/pkg/front_end/test/fasta/fast_strong_suite.dart b/pkg/front_end/test/fasta/fast_strong_suite.dart
index 8269eb9..8a0d844 100644
--- a/pkg/front_end/test/fasta/fast_strong_suite.dart
+++ b/pkg/front_end/test/fasta/fast_strong_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.fast_strong_test;
 
-import 'dart:async' show Future;
-
 import 'dart:io' show Platform;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/incremental_suite.dart b/pkg/front_end/test/fasta/incremental_suite.dart
index 656da97..46c13e9 100644
--- a/pkg/front_end/test/fasta/incremental_suite.dart
+++ b/pkg/front_end/test/fasta/incremental_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.incremental_test;
 
-import "dart:async" show Future;
-
 import "dart:convert" show JsonEncoder;
 
 import "dart:io" show File;
diff --git a/pkg/front_end/test/fasta/messages_suite.dart b/pkg/front_end/test/fasta/messages_suite.dart
index 2992f1e..aa7aa4870 100644
--- a/pkg/front_end/test/fasta/messages_suite.dart
+++ b/pkg/front_end/test/fasta/messages_suite.dart
@@ -2,8 +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 "dart:async" show Future, Stream;
-
 import "dart:convert" show utf8;
 
 import 'dart:io' show File, Platform;
diff --git a/pkg/front_end/test/fasta/outline_suite.dart b/pkg/front_end/test/fasta/outline_suite.dart
index cc5ec1d..4bb4b58 100644
--- a/pkg/front_end/test/fasta/outline_suite.dart
+++ b/pkg/front_end/test/fasta/outline_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.outline_test;
 
-import 'dart:async' show Future;
-
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
diff --git a/pkg/front_end/test/fasta/parser/parser_suite.dart b/pkg/front_end/test/fasta/parser/parser_suite.dart
index 1bcb148..8ea1ada 100644
--- a/pkg/front_end/test/fasta/parser/parser_suite.dart
+++ b/pkg/front_end/test/fasta/parser/parser_suite.dart
@@ -6,7 +6,7 @@
     show ParserError, parse;
 
 import 'package:testing/testing.dart'
-    show Chain, ChainContext, Future, Result, Step, runMe;
+    show Chain, ChainContext, Result, Step, runMe;
 
 import '../../utils/scanner_chain.dart' show Read, Scan, ScannedFile;
 
diff --git a/pkg/front_end/test/fasta/scanner/scanner_suite.dart b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
index 1fb6f442..e71149e 100644
--- a/pkg/front_end/test/fasta/scanner/scanner_suite.dart
+++ b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-import 'package:testing/testing.dart'
-    show Chain, ChainContext, Future, Step, runMe;
+import 'package:testing/testing.dart' show Chain, ChainContext, Step, runMe;
 
 import '../../utils/scanner_chain.dart' show Read, Scan;
 
diff --git a/pkg/front_end/test/fasta/sdk_test.dart b/pkg/front_end/test/fasta/sdk_test.dart
index 6341091..27073c4 100644
--- a/pkg/front_end/test/fasta/sdk_test.dart
+++ b/pkg/front_end/test/fasta/sdk_test.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.sdk_test;
 
-import 'dart:async' show Future;
-
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
diff --git a/pkg/front_end/test/fasta/strong_tester.dart b/pkg/front_end/test/fasta/strong_tester.dart
index 402ff57..83d9ab3 100644
--- a/pkg/front_end/test/fasta/strong_tester.dart
+++ b/pkg/front_end/test/fasta/strong_tester.dart
@@ -4,7 +4,6 @@
 
 library fasta.test.strong_test;
 
-import 'dart:async' show Future;
 import 'dart:io' show Platform;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 4ccb3b1..c9d68e8 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.testing.suite;
 
-import 'dart:async' show Future;
-
 import 'dart:convert' show jsonDecode;
 
 import 'dart:io' show Directory, File, Platform;
diff --git a/pkg/front_end/test/fasta/text_serialization_tester.dart b/pkg/front_end/test/fasta/text_serialization_tester.dart
index 3a0deda..13ee181 100644
--- a/pkg/front_end/test/fasta/text_serialization_tester.dart
+++ b/pkg/front_end/test/fasta/text_serialization_tester.dart
@@ -4,7 +4,6 @@
 
 library fasta.test.text_serialization_test;
 
-import 'dart:async' show Future;
 import 'dart:io' show Platform;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/textual_outline_suite.dart b/pkg/front_end/test/fasta/textual_outline_suite.dart
index 6127a28..702b2fc 100644
--- a/pkg/front_end/test/fasta/textual_outline_suite.dart
+++ b/pkg/front_end/test/fasta/textual_outline_suite.dart
@@ -4,7 +4,6 @@
 
 library fasta.test.textual_outline_test;
 
-import 'dart:async' show Future;
 import 'dart:io';
 
 import 'package:dart_style/dart_style.dart' show DartFormatter;
diff --git a/pkg/front_end/test/fasta/weak_suite.dart b/pkg/front_end/test/fasta/weak_suite.dart
index 6316e60..604a480 100644
--- a/pkg/front_end/test/fasta/weak_suite.dart
+++ b/pkg/front_end/test/fasta/weak_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.weak_test;
 
-import 'dart:async' show Future;
-
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
diff --git a/pkg/front_end/test/hot_reload_e2e_test.dart b/pkg/front_end/test/hot_reload_e2e_test.dart
index 939d3a0..d64dcd3 100644
--- a/pkg/front_end/test/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/hot_reload_e2e_test.dart
@@ -7,7 +7,7 @@
 /// reload on the running program.
 library front_end.incremental.hot_reload_e2e_test;
 
-import 'dart:async' show Completer, Future;
+import 'dart:async' show Completer;
 
 import 'dart:convert' show LineSplitter, utf8;
 
diff --git a/pkg/front_end/test/incremental_bulk_compiler_full.dart b/pkg/front_end/test/incremental_bulk_compiler_full.dart
index ad1a7f3..03ac980 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_full.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_full.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:expect/expect.dart' show Expect;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
diff --git a/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart b/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
index 866104c..28f3352 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'incremental_bulk_compiler_full.dart' show Context;
diff --git a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
index 2d7e57c..844ecd5 100644
--- a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:io' show Directory, File;
 
 import 'package:expect/expect.dart' show Expect;
diff --git a/pkg/front_end/test/incremental_load_from_dill_suite.dart b/pkg/front_end/test/incremental_load_from_dill_suite.dart
index 69abdd8..31ffc06 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:developer' show debugger;
 
 import 'dart:io' show Directory, File;
@@ -1908,8 +1906,11 @@
     Name fieldName = new Name("unique_SimulateTransformer");
     Field field = new Field(fieldName,
         isFinal: true,
-        reference: lib.reference.canonicalName
+        getterReference: lib.reference.canonicalName
             ?.getChildFromFieldWithName(fieldName)
+            ?.reference,
+        setterReference: lib.reference.canonicalName
+            ?.getChildFromFieldSetterWithName(fieldName)
             ?.reference);
     lib.addField(field);
     for (Class c in lib.classes) {
@@ -1920,8 +1921,11 @@
       fieldName = new Name("unique_SimulateTransformer");
       field = new Field(fieldName,
           isFinal: true,
-          reference: c.reference.canonicalName
+          getterReference: c.reference.canonicalName
               ?.getChildFromFieldWithName(fieldName)
+              ?.reference,
+          setterReference: c.reference.canonicalName
+              ?.getChildFromFieldSetterWithName(fieldName)
               ?.reference);
       c.addField(field);
     }
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
index 7f9e8d2..1f8b19a 100644
--- a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:io' show File;
 
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
diff --git a/pkg/front_end/test/lint_suite.dart b/pkg/front_end/test/lint_suite.dart
index 2831434..938c1bf 100644
--- a/pkg/front_end/test/lint_suite.dart
+++ b/pkg/front_end/test/lint_suite.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:io' show Directory, File, FileSystemEntity;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/test/parser_all_suite.dart b/pkg/front_end/test/parser_all_suite.dart
index 543dbf9..9b60aae 100644
--- a/pkg/front_end/test/parser_all_suite.dart
+++ b/pkg/front_end/test/parser_all_suite.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:testing/testing.dart' show Chain, ChainContext, runMe;
 
 import 'parser_suite.dart';
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 9e03711..da464ac 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:convert' show jsonDecode;
 
 import 'dart:io' show File;
diff --git a/pkg/front_end/test/read_dill_from_binary_md_test.dart b/pkg/front_end/test/read_dill_from_binary_md_test.dart
index 4907f4e..2331db5 100644
--- a/pkg/front_end/test/read_dill_from_binary_md_test.dart
+++ b/pkg/front_end/test/read_dill_from_binary_md_test.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:io' show File, Platform;
 
 import 'package:kernel/target/targets.dart' show NoneTarget, TargetFlags;
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index a339577..fcf1279 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1108,6 +1108,7 @@
 tags
 tailor
 taking
+talk
 talks
 tb
 team
diff --git a/pkg/front_end/test/spelling_test_base.dart b/pkg/front_end/test/spelling_test_base.dart
index 9bafa38..23d64a5 100644
--- a/pkg/front_end/test/spelling_test_base.dart
+++ b/pkg/front_end/test/spelling_test_base.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:io' show File, Platform;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/test/spelling_test_external_targets.dart b/pkg/front_end/test/spelling_test_external_targets.dart
index 0330b22..79ff96c 100644
--- a/pkg/front_end/test/spelling_test_external_targets.dart
+++ b/pkg/front_end/test/spelling_test_external_targets.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'dart:io' show Directory, File, FileSystemEntity;
 
 import 'package:testing/testing.dart'
diff --git a/pkg/front_end/test/spelling_test_not_src_suite.dart b/pkg/front_end/test/spelling_test_not_src_suite.dart
index 3259c88..a6205de 100644
--- a/pkg/front_end/test/spelling_test_not_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_not_src_suite.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'spelling_test_base.dart';
diff --git a/pkg/front_end/test/spelling_test_src_suite.dart b/pkg/front_end/test/spelling_test_src_suite.dart
index afea1e0..dfd1117 100644
--- a/pkg/front_end/test/spelling_test_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_src_suite.dart
@@ -2,8 +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 'dart:async' show Future;
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'spelling_test_base.dart';
diff --git a/pkg/front_end/test/src/base/processed_options_test.dart b/pkg/front_end/test/src/base/processed_options_test.dart
index 50a7939..b004fb1 100644
--- a/pkg/front_end/test/src/base/processed_options_test.dart
+++ b/pkg/front_end/test/src/base/processed_options_test.dart
@@ -2,8 +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 'dart:async';
-
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
diff --git a/pkg/front_end/test/standard_file_system_test.dart b/pkg/front_end/test/standard_file_system_test.dart
index 5644c98..5f5fd02 100644
--- a/pkg/front_end/test/standard_file_system_test.dart
+++ b/pkg/front_end/test/standard_file_system_test.dart
@@ -5,7 +5,6 @@
 
 library front_end.test.standard_file_system_test;
 
-import 'dart:async';
 import 'dart:convert';
 import 'dart:io' as io;
 import 'dart:math' show Random;
diff --git a/pkg/front_end/test/type_labeler_test.dart b/pkg/front_end/test/type_labeler_test.dart
index bab4138..40e862f 100644
--- a/pkg/front_end/test/type_labeler_test.dart
+++ b/pkg/front_end/test/type_labeler_test.dart
@@ -223,22 +223,28 @@
   check({symConst: "#foo", symLibConst: "#dart:core::bar"}, 0);
 
   Constant fooConst = new InstanceConstant(
-      fooClass.reference, [], {booField.reference: trueConst});
+      fooClass.reference, [], {booField.getterReference: trueConst});
   check({fooConst: "Foo {boo: true}"}, 1);
 
-  Constant foo2Const = new InstanceConstant(foo2Class.reference, [],
-      {nextField.reference: nullConst, valueField.reference: intConst});
+  Constant foo2Const = new InstanceConstant(foo2Class.reference, [], {
+    nextField.getterReference: nullConst,
+    valueField.getterReference: intConst
+  });
   check({foo2Const: "Foo {value: 2, next: null}"}, 1);
 
   Constant foo2nConst = new InstanceConstant(foo2Class.reference, [], {
-    valueField.reference: intConst,
-    nextField.reference: new InstanceConstant(foo2Class.reference, [],
-        {valueField.reference: intConst, nextField.reference: nullConst}),
+    valueField.getterReference: intConst,
+    nextField.getterReference: new InstanceConstant(foo2Class.reference, [], {
+      valueField.getterReference: intConst,
+      nextField.getterReference: nullConst
+    }),
   });
   check({foo2nConst: "Foo {value: 2, next: Foo {value: 2, next: null}}"}, 1);
 
-  Constant bazFooFoo2Const = new InstanceConstant(bazClass.reference,
-      [foo, foo2], {xField.reference: fooConst, yField.reference: foo2Const});
+  Constant bazFooFoo2Const = new InstanceConstant(
+      bazClass.reference,
+      [foo, foo2],
+      {xField.getterReference: fooConst, yField.getterReference: foo2Const});
   check({
     bazFooFoo2Const: "Baz<Foo/*1*/, Foo/*2*/> "
         "{x: Foo/*1*/ {boo: true}, y: Foo/*2*/ {value: 2, next: null}}"
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index abdc1d4..81b5e42 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -4,8 +4,6 @@
 
 library fasta.testing.kernel_chain;
 
-import 'dart:async' show Future;
-
 import 'dart:io' show Directory, File, IOSink, Platform;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/test/utils/scanner_chain.dart b/pkg/front_end/test/utils/scanner_chain.dart
index 7f014e4..1bf5b45 100644
--- a/pkg/front_end/test/utils/scanner_chain.dart
+++ b/pkg/front_end/test/utils/scanner_chain.dart
@@ -10,7 +10,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/io.dart' show readBytesFromFile;
 
 import 'package:testing/testing.dart'
-    show ChainContext, Future, Result, Step, TestDescription;
+    show ChainContext, Result, Step, TestDescription;
 
 class ReadFile {
   final Uri uri;
diff --git a/pkg/front_end/test/utils/validating_instrumentation.dart b/pkg/front_end/test/utils/validating_instrumentation.dart
index 8214637..9680b32 100644
--- a/pkg/front_end/test/utils/validating_instrumentation.dart
+++ b/pkg/front_end/test/utils/validating_instrumentation.dart
@@ -2,8 +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.md file.
 
-import 'dart:async' show Future;
-
 import 'dart:convert' show utf8;
 
 import 'dart:io' show File;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect
index df74ba9c..74024f4 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect
@@ -6,6 +6,7 @@
 }
 library from "package:foo/foo.dart" as foo {
 additionalExports = (a::example,
+  a::example,
   a::a)
 
   export "package:example/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect
index df74ba9c..74024f4 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect
@@ -6,6 +6,7 @@
 }
 library from "package:foo/foo.dart" as foo {
 additionalExports = (a::example,
+  a::example,
   a::a)
 
   export "package:example/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect
index b716fc7..4f177a0 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect
@@ -7,7 +7,8 @@
   static field dart.core::int* x = b::mya2.{b::A2::bar};
 }
 library from "package:moduleB/b.dart" as b {
-additionalExports = (c::baz)
+additionalExports = (c::baz,
+  c::baz)
 
   import "package:moduleC/c.dart";
   export "package:moduleC/c.dart" show baz;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml
new file mode 100644
index 0000000..8fb3d4f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml
@@ -0,0 +1,58 @@
+# 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.md file.
+
+# A field has 2 references. Both should be passed when creating a new field
+# for references to both set and get to work. And both should be put in the
+# `buildersCreatedWithReferences` map so - when lazy-loading a dill library
+# with additional exports to a library that we're currently recompiling
+# those will get setup correctly too.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      main.dart: |
+        import 'libExporter.dart';
+        void foo() {
+          int value = libField;
+          libField = value+1;
+        }
+      libExporter.dart: |
+        export "lib.dart";
+        String fromLibExporter = "hello";
+      lib.dart: |
+        import "libExporter.dart";
+        int libField = 42;
+        void requireStuffFromLibExporter() {
+          print(fromLibExporter);
+        }
+    expectedLibraryCount: 3
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib.dart
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - libExporter.dart
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.1.expect
new file mode 100644
index 0000000..cc2970c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.1.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static field dart.core::int* libField = 42;
+  static method requireStuffFromLibExporter() → void {
+    dart.core::print(lib2::fromLibExporter);
+  }
+}
+library from "org-dartlang-test:///libExporter.dart" as lib2 {
+additionalExports = (lib::libField,
+  lib::libField,
+  lib::requireStuffFromLibExporter)
+
+  export "org-dartlang-test:///lib.dart";
+
+  static field dart.core::String* fromLibExporter = "hello";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static method foo() → void {
+    dart.core::int* value = lib::libField;
+    lib::libField = value.{dart.core::num::+}(1);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.2.expect
new file mode 100644
index 0000000..cc2970c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.2.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static field dart.core::int* libField = 42;
+  static method requireStuffFromLibExporter() → void {
+    dart.core::print(lib2::fromLibExporter);
+  }
+}
+library from "org-dartlang-test:///libExporter.dart" as lib2 {
+additionalExports = (lib::libField,
+  lib::libField,
+  lib::requireStuffFromLibExporter)
+
+  export "org-dartlang-test:///lib.dart";
+
+  static field dart.core::String* fromLibExporter = "hello";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static method foo() → void {
+    dart.core::int* value = lib::libField;
+    lib::libField = value.{dart.core::num::+}(1);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.3.expect
new file mode 100644
index 0000000..cc2970c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.3.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static field dart.core::int* libField = 42;
+  static method requireStuffFromLibExporter() → void {
+    dart.core::print(lib2::fromLibExporter);
+  }
+}
+library from "org-dartlang-test:///libExporter.dart" as lib2 {
+additionalExports = (lib::libField,
+  lib::libField,
+  lib::requireStuffFromLibExporter)
+
+  export "org-dartlang-test:///lib.dart";
+
+  static field dart.core::String* fromLibExporter = "hello";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static method foo() → void {
+    dart.core::int* value = lib::libField;
+    lib::libField = value.{dart.core::num::+}(1);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.4.expect
new file mode 100644
index 0000000..cc2970c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.4.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static field dart.core::int* libField = 42;
+  static method requireStuffFromLibExporter() → void {
+    dart.core::print(lib2::fromLibExporter);
+  }
+}
+library from "org-dartlang-test:///libExporter.dart" as lib2 {
+additionalExports = (lib::libField,
+  lib::libField,
+  lib::requireStuffFromLibExporter)
+
+  export "org-dartlang-test:///lib.dart";
+
+  static field dart.core::String* fromLibExporter = "hello";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static method foo() → void {
+    dart.core::int* value = lib::libField;
+    lib::libField = value.{dart.core::num::+}(1);
+  }
+}
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.outline.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.outline.expect
index 4212a8e..0f3daec 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.outline.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.expect
index eb68861..92cd79e 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.transformed.expect
index eb68861..92cd79e 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.transformed.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.expect
index c3fa573..c4ad76f 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.transformed.expect
index c3fa573..c4ad76f 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.transformed.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
index 67b102e..9ece05e 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
@@ -9,6 +9,8 @@
 import "issue_36647_lib2.dart" as iss;
 additionalExports = (iss::xxx,
   iss::XXX,
+  iss::XXX,
+  iss::extends,
   iss::extends)
 
 export "org-dartlang-testcase:///issue_36647_lib2.dart";
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
index 3ad0fc9..85c932b 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
@@ -9,6 +9,8 @@
 import "issue_36647_lib2.dart" as iss;
 additionalExports = (iss::xxx,
   iss::XXX,
+  iss::XXX,
+  iss::extends,
   iss::extends)
 
 export "org-dartlang-testcase:///issue_36647_lib2.dart";
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
index 3ad0fc9..85c932b 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
@@ -9,6 +9,8 @@
 import "issue_36647_lib2.dart" as iss;
 additionalExports = (iss::xxx,
   iss::XXX,
+  iss::XXX,
+  iss::extends,
   iss::extends)
 
 export "org-dartlang-testcase:///issue_36647_lib2.dart";
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
index eddabae..e7ebe11 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "issue_36647_2_lib1.dart" as iss;
 additionalExports = (iss::foo,
+  iss::foo,
   iss::bar,
   iss::baz)
 
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
index 5180e18..79c30c6 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "issue_36647_2_lib1.dart" as iss;
 additionalExports = (iss::foo,
+  iss::foo,
   iss::bar,
   iss::baz)
 
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
index 5180e18..79c30c6 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "issue_36647_2_lib1.dart" as iss;
 additionalExports = (iss::foo,
+  iss::foo,
   iss::bar,
   iss::baz)
 
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index 12a1073..0404554 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -4,8 +4,6 @@
 
 library fasta.tool.command_line;
 
-import 'dart:async' show Future;
-
 import 'dart:io' show exit;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
diff --git a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
index 90a9f5f..985026c 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.compile_platform_test;
 
-import 'dart:async';
-
 import 'dart:io';
 
 import 'package:async_helper/async_helper.dart';
diff --git a/pkg/front_end/tool/_fasta/compile_platform_test.dart b/pkg/front_end/tool/_fasta/compile_platform_test.dart
index 90a9f5f..985026c 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_test.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.compile_platform_test;
 
-import 'dart:async';
-
 import 'dart:io';
 
 import 'package:async_helper/async_helper.dart';
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index f6f412b..03a5e96 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -4,8 +4,6 @@
 
 library fasta.tool.entry_points;
 
-import 'dart:async' show Stream;
-
 import 'dart:convert' show LineSplitter, jsonDecode, jsonEncode, utf8;
 
 import 'dart:io' show File, Platform, exitCode, stderr, stdin, stdout;
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index b50bee9..cd6b870 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.dart
@@ -2,8 +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 'dart:async';
-
 import 'dart:io';
 
 import 'dart:isolate';
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 8bffb28..385ec39 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -5,7 +5,6 @@
 /// An entrypoint used to run portions of fasta and measure its performance.
 library front_end.tool.fasta_perf;
 
-import 'dart:async';
 import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/parser/parser.dart';
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index 7d87595..617e448 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -42,7 +42,6 @@
 ///  updates input1.dart a second time.
 library front_end.tool.incremental_perf;
 
-import 'dart:async';
 import 'dart:convert';
 import 'dart:io' hide FileSystemEntity;
 
diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart
index 4f10f61..95b3ba5 100644
--- a/pkg/front_end/tool/perf.dart
+++ b/pkg/front_end/tool/perf.dart
@@ -15,7 +15,6 @@
 /// outlines).
 library front_end.tool.perf;
 
-import 'dart:async';
 import 'dart:io' show Directory, File, Platform, exit;
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
diff --git a/pkg/js/CHANGELOG.md b/pkg/js/CHANGELOG.md
index 3b4897d..17e9aa3 100644
--- a/pkg/js/CHANGELOG.md
+++ b/pkg/js/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.6.3-nullsafety.3
+
+* Update SDK constraints to `>=2.12.0-0 <3.0.0` based on beta release
+  guidelines.
+
 ## 0.6.3-nullsafety.2
 
 * Allow prerelease versions of the `2.12` sdk.
diff --git a/pkg/js/pubspec.yaml b/pkg/js/pubspec.yaml
index 6ae05bb..90d0352 100644
--- a/pkg/js/pubspec.yaml
+++ b/pkg/js/pubspec.yaml
@@ -1,10 +1,10 @@
 name: js
-version: 0.6.3-nullsafety.2
+version: 0.6.3-nullsafety.3
 description: Annotations to create static Dart interfaces for JavaScript APIs.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/js
 
 environment:
-  sdk: '>=2.10.0-0 <2.12.0'
+  sdk: ">=2.12.0-0 <3.0.0"
 
 dev_dependencies:
   pedantic: ^1.9.0
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 6470e3a..6a26a6d 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -143,7 +143,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 49;
+  UInt32 formatVersion = 50;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -353,7 +353,8 @@
 
 type Field extends Member {
   Byte tag = 4;
-  CanonicalNameReference canonicalName;
+  CanonicalNameReference canonicalNameGetter;
+  CanonicalNameReference canonicalNameSetter;
   // An absolute path URI to the .dart file from which the field was created.
   UriReference fileUri;
   FileOffset fileOffset;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 9928ad2..7ce8cba 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -210,7 +210,12 @@
 
   NamedNode(Reference reference)
       : this.reference = reference ?? new Reference() {
-    this.reference.node = this;
+    if (this is Field) {
+      Field me = this;
+      me.getterReference.node = this;
+    } else {
+      this.reference.node = this;
+    }
   }
 
   CanonicalName get canonicalName => reference?.canonicalName;
@@ -537,7 +542,10 @@
     }
     for (int i = 0; i < fields.length; ++i) {
       Field field = fields[i];
-      canonicalName.getChildFromField(field).bindTo(field.reference);
+      canonicalName.getChildFromField(field).bindTo(field.getterReference);
+      canonicalName
+          .getChildFromFieldSetter(field)
+          .bindTo(field.setterReference);
     }
     for (int i = 0; i < procedures.length; ++i) {
       Procedure member = procedures[i];
@@ -1181,7 +1189,10 @@
     if (!dirty) return;
     for (int i = 0; i < fields.length; ++i) {
       Field member = fields[i];
-      canonicalName.getChildFromField(member).bindTo(member.reference);
+      canonicalName.getChildFromField(member).bindTo(member.getterReference);
+      canonicalName
+          .getChildFromFieldSetter(member)
+          .bindTo(member.setterReference);
     }
     for (int i = 0; i < procedures.length; ++i) {
       Procedure member = procedures[i];
@@ -1659,6 +1670,16 @@
   DartType type; // Not null. Defaults to DynamicType.
   int flags = 0;
   Expression initializer; // May be null.
+  final Reference setterReference;
+  @Deprecated("Use the specific getterReference/setterReference instead")
+  Reference get reference => super.reference;
+
+  Reference get getterReference => super.reference;
+  @Deprecated(
+      "Use the specific getterCanonicalName/setterCanonicalName instead")
+  CanonicalName get canonicalName => reference?.canonicalName;
+  CanonicalName get getterCanonicalName => getterReference?.canonicalName;
+  CanonicalName get setterCanonicalName => setterReference?.canonicalName;
 
   Field(Name name,
       {this.type: const DynamicType(),
@@ -1672,8 +1693,14 @@
       bool isLate: false,
       int transformerFlags: 0,
       Uri fileUri,
-      Reference reference})
-      : super(name, fileUri, reference) {
+      Reference getterReference,
+      Reference setterReference})
+      :
+        // TODO(jensj): Maybe don't create one for final fields?
+        // ('final' is a mutable setting though).
+        this.setterReference = setterReference ?? new Reference(),
+        super(name, fileUri, getterReference) {
+    this.setterReference.node = this;
     assert(type != null);
     initializer?.parent = this;
     this.isCovariant = isCovariant;
@@ -1689,6 +1716,12 @@
     this.transformerFlags = transformerFlags;
   }
 
+  @override
+  void _relinkNode() {
+    super._relinkNode();
+    this.setterReference.node = this;
+  }
+
   static const int FlagFinal = 1 << 0; // Must match serialized bit positions.
   static const int FlagConst = 1 << 1;
   static const int FlagStatic = 1 << 2;
@@ -1844,6 +1877,11 @@
   Location _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
   }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    printer.writeMemberName(getterReference);
+  }
 }
 
 /// A generative constructor, possibly redirecting.
@@ -2073,7 +2111,7 @@
   void set target(Member member) {
     assert(member is Constructor ||
         (member is Procedure && member.kind == ProcedureKind.Factory));
-    targetReference = getMemberReference(member);
+    targetReference = getMemberReferenceGetter(member);
   }
 
   R accept<R>(MemberVisitor<R> v) => v.visitRedirectingFactoryConstructor(this);
@@ -2173,24 +2211,31 @@
       Member forwardingStubSuperTarget,
       Member forwardingStubInterfaceTarget,
       Member memberSignatureOrigin})
-      : this._byReferenceRenamed(name, kind, function,
-            isAbstract: isAbstract,
-            isStatic: isStatic,
-            isExternal: isExternal,
-            isConst: isConst,
-            isForwardingStub: isForwardingStub,
-            isMemberSignature: isMemberSignature,
-            isForwardingSemiStub: isForwardingSemiStub,
-            isExtensionMember: isExtensionMember,
-            transformerFlags: transformerFlags,
-            fileUri: fileUri,
-            reference: reference,
-            forwardingStubSuperTargetReference:
-                getMemberReference(forwardingStubSuperTarget),
-            forwardingStubInterfaceTargetReference:
-                getMemberReference(forwardingStubInterfaceTarget),
-            memberSignatureOriginReference:
-                getMemberReference(memberSignatureOrigin));
+      : this._byReferenceRenamed(
+          name,
+          kind,
+          function,
+          isAbstract: isAbstract,
+          isStatic: isStatic,
+          isExternal: isExternal,
+          isConst: isConst,
+          isForwardingStub: isForwardingStub,
+          isMemberSignature: isMemberSignature,
+          isForwardingSemiStub: isForwardingSemiStub,
+          isExtensionMember: isExtensionMember,
+          transformerFlags: transformerFlags,
+          fileUri: fileUri,
+          reference: reference,
+          forwardingStubSuperTargetReference:
+              getMemberReferenceBasedOnProcedureKind(
+                  forwardingStubSuperTarget, kind),
+          forwardingStubInterfaceTargetReference:
+              getMemberReferenceBasedOnProcedureKind(
+                  forwardingStubInterfaceTarget, kind),
+          memberSignatureOriginReference:
+              getMemberReferenceBasedOnProcedureKind(
+                  memberSignatureOrigin, kind),
+        );
 
   Procedure._byReferenceRenamed(Name name, this.kind, this.function,
       {bool isAbstract: false,
@@ -2359,21 +2404,24 @@
       forwardingStubSuperTargetReference?.asMember;
 
   void set forwardingStubSuperTarget(Member target) {
-    forwardingStubSuperTargetReference = getMemberReference(target);
+    forwardingStubSuperTargetReference =
+        getMemberReferenceBasedOnProcedureKind(target, kind);
   }
 
   Member get forwardingStubInterfaceTarget =>
       forwardingStubInterfaceTargetReference?.asMember;
 
   void set forwardingStubInterfaceTarget(Member target) {
-    forwardingStubInterfaceTargetReference = getMemberReference(target);
+    forwardingStubInterfaceTargetReference =
+        getMemberReferenceBasedOnProcedureKind(target, kind);
   }
 
   @override
   Member get memberSignatureOrigin => memberSignatureOriginReference?.asMember;
 
   void set memberSignatureOrigin(Member target) {
-    memberSignatureOriginReference = getMemberReference(target);
+    memberSignatureOriginReference =
+        getMemberReferenceBasedOnProcedureKind(target, kind);
   }
 
   R accept<R>(MemberVisitor<R> v) => v.visitProcedure(this);
@@ -2469,7 +2517,10 @@
   Expression value;
 
   FieldInitializer(Field field, Expression value)
-      : this.byReference(field?.reference, value);
+      : this.byReference(
+            // getterReference is used since this refers to the field itself
+            field?.getterReference,
+            value);
 
   FieldInitializer.byReference(this.fieldReference, this.value) {
     value?.parent = this;
@@ -2478,7 +2529,7 @@
   Field get field => fieldReference?.node;
 
   void set field(Field field) {
-    fieldReference = field?.reference;
+    fieldReference = field?.getterReference;
   }
 
   R accept<R>(InitializerVisitor<R> v) => v.visitFieldInitializer(this);
@@ -2521,7 +2572,10 @@
   Arguments arguments;
 
   SuperInitializer(Constructor target, Arguments arguments)
-      : this.byReference(getMemberReference(target), arguments);
+      : this.byReference(
+            // Getter vs setter doesn't matter for constructors.
+            getMemberReferenceGetter(target),
+            arguments);
 
   SuperInitializer.byReference(this.targetReference, this.arguments) {
     arguments?.parent = this;
@@ -2530,7 +2584,8 @@
   Constructor get target => targetReference?.asConstructor;
 
   void set target(Constructor target) {
-    targetReference = getMemberReference(target);
+    // Getter vs setter doesn't matter for constructors.
+    targetReference = getMemberReferenceGetter(target);
   }
 
   R accept<R>(InitializerVisitor<R> v) => v.visitSuperInitializer(this);
@@ -2569,7 +2624,10 @@
   Arguments arguments;
 
   RedirectingInitializer(Constructor target, Arguments arguments)
-      : this.byReference(getMemberReference(target), arguments);
+      : this.byReference(
+            // Getter vs setter doesn't matter for constructors.
+            getMemberReferenceGetter(target),
+            arguments);
 
   RedirectingInitializer.byReference(this.targetReference, this.arguments) {
     arguments?.parent = this;
@@ -2578,7 +2636,8 @@
   Constructor get target => targetReference?.asConstructor;
 
   void set target(Constructor target) {
-    targetReference = getMemberReference(target);
+    // Getter vs setter doesn't matter for constructors.
+    targetReference = getMemberReferenceGetter(target);
   }
 
   R accept<R>(InitializerVisitor<R> v) => v.visitRedirectingInitializer(this);
@@ -3217,7 +3276,8 @@
   Reference interfaceTargetReference;
 
   PropertyGet(Expression receiver, Name name, [Member interfaceTarget])
-      : this.byReference(receiver, name, getMemberReference(interfaceTarget));
+      : this.byReference(
+            receiver, name, getMemberReferenceGetter(interfaceTarget));
 
   PropertyGet.byReference(
       this.receiver, this.name, this.interfaceTargetReference) {
@@ -3227,7 +3287,7 @@
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReference(member);
+    interfaceTargetReference = getMemberReferenceGetter(member);
   }
 
   @override
@@ -3296,7 +3356,7 @@
   PropertySet(Expression receiver, Name name, Expression value,
       [Member interfaceTarget])
       : this.byReference(
-            receiver, name, value, getMemberReference(interfaceTarget));
+            receiver, name, value, getMemberReferenceSetter(interfaceTarget));
 
   PropertySet.byReference(
       this.receiver, this.name, this.value, this.interfaceTargetReference) {
@@ -3307,7 +3367,7 @@
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReference(member);
+    interfaceTargetReference = getMemberReferenceSetter(member);
   }
 
   DartType getStaticType(StaticTypeContext context) =>
@@ -3364,14 +3424,14 @@
   Reference interfaceTargetReference;
 
   SuperPropertyGet(Name name, [Member interfaceTarget])
-      : this.byReference(name, getMemberReference(interfaceTarget));
+      : this.byReference(name, getMemberReferenceGetter(interfaceTarget));
 
   SuperPropertyGet.byReference(this.name, this.interfaceTargetReference);
 
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReference(member);
+    interfaceTargetReference = getMemberReferenceGetter(member);
   }
 
   DartType getStaticTypeInternal(StaticTypeContext context) {
@@ -3426,7 +3486,8 @@
   Reference interfaceTargetReference;
 
   SuperPropertySet(Name name, Expression value, Member interfaceTarget)
-      : this.byReference(name, value, getMemberReference(interfaceTarget));
+      : this.byReference(
+            name, value, getMemberReferenceSetter(interfaceTarget));
 
   SuperPropertySet.byReference(
       this.name, this.value, this.interfaceTargetReference) {
@@ -3436,7 +3497,7 @@
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReference(member);
+    interfaceTargetReference = getMemberReferenceSetter(member);
   }
 
   DartType getStaticType(StaticTypeContext context) =>
@@ -3482,14 +3543,14 @@
   /// A static field, getter, or method (for tear-off).
   Reference targetReference;
 
-  StaticGet(Member target) : this.byReference(getMemberReference(target));
+  StaticGet(Member target) : this.byReference(getMemberReferenceGetter(target));
 
   StaticGet.byReference(this.targetReference);
 
   Member get target => targetReference?.asMember;
 
   void set target(Member target) {
-    targetReference = getMemberReference(target);
+    targetReference = getMemberReferenceGetter(target);
   }
 
   DartType getStaticType(StaticTypeContext context) =>
@@ -3529,7 +3590,7 @@
   Expression value;
 
   StaticSet(Member target, Expression value)
-      : this.byReference(getMemberReference(target), value);
+      : this.byReference(getMemberReferenceSetter(target), value);
 
   StaticSet.byReference(this.targetReference, this.value) {
     value?.parent = this;
@@ -3538,7 +3599,7 @@
   Member get target => targetReference?.asMember;
 
   void set target(Member target) {
-    targetReference = getMemberReference(target);
+    targetReference = getMemberReferenceSetter(target);
   }
 
   DartType getStaticType(StaticTypeContext context) =>
@@ -3726,7 +3787,11 @@
   MethodInvocation(Expression receiver, Name name, Arguments arguments,
       [Member interfaceTarget])
       : this.byReference(
-            receiver, name, arguments, getMemberReference(interfaceTarget));
+            receiver,
+            name,
+            arguments,
+            // An invocation doesn't refer to the setter.
+            getMemberReferenceGetter(interfaceTarget));
 
   MethodInvocation.byReference(
       this.receiver, this.name, this.arguments, this.interfaceTargetReference) {
@@ -3737,7 +3802,8 @@
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member target) {
-    interfaceTargetReference = getMemberReference(target);
+    // An invocation doesn't refer to the setter.
+    interfaceTargetReference = getMemberReferenceGetter(target);
   }
 
   DartType getStaticTypeInternal(StaticTypeContext context) {
@@ -3857,7 +3923,11 @@
 
   SuperMethodInvocation(Name name, Arguments arguments,
       [Procedure interfaceTarget])
-      : this.byReference(name, arguments, getMemberReference(interfaceTarget));
+      : this.byReference(
+            name,
+            arguments,
+            // An invocation doesn't refer to the setter.
+            getMemberReferenceGetter(interfaceTarget));
 
   SuperMethodInvocation.byReference(
       this.name, this.arguments, this.interfaceTargetReference) {
@@ -3867,7 +3937,8 @@
   Procedure get interfaceTarget => interfaceTargetReference?.asProcedure;
 
   void set interfaceTarget(Procedure target) {
-    interfaceTargetReference = getMemberReference(target);
+    // An invocation doesn't refer to the setter.
+    interfaceTargetReference = getMemberReferenceGetter(target);
   }
 
   DartType getStaticTypeInternal(StaticTypeContext context) {
@@ -3927,7 +3998,10 @@
   Name get name => target?.name;
 
   StaticInvocation(Procedure target, Arguments arguments, {bool isConst: false})
-      : this.byReference(getMemberReference(target), arguments,
+      : this.byReference(
+            // An invocation doesn't refer to the setter.
+            getMemberReferenceGetter(target),
+            arguments,
             isConst: isConst);
 
   StaticInvocation.byReference(this.targetReference, this.arguments,
@@ -3938,7 +4012,8 @@
   Procedure get target => targetReference?.asProcedure;
 
   void set target(Procedure target) {
-    targetReference = getMemberReference(target);
+    // An invocation doesn't refer to the setter.
+    targetReference = getMemberReferenceGetter(target);
   }
 
   DartType getStaticTypeInternal(StaticTypeContext context) {
@@ -3991,7 +4066,10 @@
 
   ConstructorInvocation(Constructor target, Arguments arguments,
       {bool isConst: false})
-      : this.byReference(getMemberReference(target), arguments,
+      : this.byReference(
+            // A constructor doesn't refer to the setter.
+            getMemberReferenceGetter(target),
+            arguments,
             isConst: isConst);
 
   ConstructorInvocation.byReference(this.targetReference, this.arguments,
@@ -4002,7 +4080,8 @@
   Constructor get target => targetReference?.asConstructor;
 
   void set target(Constructor target) {
-    targetReference = getMemberReference(target);
+    // A constructor doesn't refer to the setter.
+    targetReference = getMemberReferenceGetter(target);
   }
 
   DartType getStaticTypeInternal(StaticTypeContext context) {
@@ -9567,6 +9646,8 @@
   void toTextInternal(AstPrinter printer) {
     // TODO(johnniwinther): Implement this.
   }
+
+  String leakingDebugToString() => astToText.debugComponentToString(this);
 }
 
 /// A tuple with file, line, and column number, for displaying human-readable
@@ -9838,11 +9919,37 @@
   }
 }
 
-/// Returns the [Reference] object for the given member.
+/// Returns the [Reference] object for the given member based on the
+/// ProcedureKind.
 ///
 /// Returns `null` if the member is `null`.
-Reference getMemberReference(Member member) {
-  return member?.reference;
+Reference getMemberReferenceBasedOnProcedureKind(
+    Member member, ProcedureKind kind) {
+  if (member == null) return null;
+  if (member is Field) {
+    if (kind == ProcedureKind.Setter) return member.setterReference;
+    return member.getterReference;
+  }
+  return member.reference;
+}
+
+/// Returns the (getter) [Reference] object for the given member.
+///
+/// Returns `null` if the member is `null`.
+/// TODO(jensj): Should it be called NotSetter instead of Getter?
+Reference getMemberReferenceGetter(Member member) {
+  if (member == null) return null;
+  if (member is Field) return member.getterReference;
+  return member.reference;
+}
+
+/// Returns the setter [Reference] object for the given member.
+///
+/// Returns `null` if the member is `null`.
+Reference getMemberReferenceSetter(Member member) {
+  if (member == null) return null;
+  if (member is Field) return member.setterReference;
+  return member.reference;
 }
 
 /// Returns the [Reference] object for the given class.
@@ -9856,12 +9963,36 @@
 /// member has not been assigned a canonical name yet.
 ///
 /// Returns `null` if the member is `null`.
-CanonicalName getCanonicalNameOfMember(Member member) {
+CanonicalName getCanonicalNameOfMemberGetter(Member member) {
   if (member == null) return null;
-  if (member.canonicalName == null) {
+  CanonicalName canonicalName;
+  if (member is Field) {
+    canonicalName = member.getterCanonicalName;
+  } else {
+    canonicalName = member.canonicalName;
+  }
+  if (canonicalName == null) {
     throw '$member has no canonical name';
   }
-  return member.canonicalName;
+  return canonicalName;
+}
+
+/// Returns the canonical name of [member], or throws an exception if the
+/// member has not been assigned a canonical name yet.
+///
+/// Returns `null` if the member is `null`.
+CanonicalName getCanonicalNameOfMemberSetter(Member member) {
+  if (member == null) return null;
+  CanonicalName canonicalName;
+  if (member is Field) {
+    canonicalName = member.setterCanonicalName;
+  } else {
+    canonicalName = member.canonicalName;
+  }
+  if (canonicalName == null) {
+    throw '$member has no canonical name';
+  }
+  return canonicalName;
 }
 
 /// Returns the canonical name of [class_], or throws an exception if the
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 6f73e68..2c79146 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -614,6 +614,7 @@
         if (child.name != '@methods' &&
             child.name != '@typedefs' &&
             child.name != '@fields' &&
+            child.name != '@=fields' &&
             child.name != '@getters' &&
             child.name != '@setters' &&
             child.name != '@factories' &&
@@ -1284,14 +1285,17 @@
   Field readField() {
     int tag = readByte();
     assert(tag == Tag.Field);
-    var canonicalName = readCanonicalNameReference();
-    var reference = canonicalName.getReference();
-    Field node = reference.node;
+    CanonicalName getterCanonicalName = readCanonicalNameReference();
+    Reference getterReference = getterCanonicalName.getReference();
+    CanonicalName setterCanonicalName = readCanonicalNameReference();
+    Reference setterReference = setterCanonicalName.getReference();
+    Field node = getterReference.node;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
     if (node == null) {
-      node = new Field(null, reference: reference);
+      node = new Field(null,
+          getterReference: getterReference, setterReference: setterReference);
     }
     var fileUri = readUriReference();
     int fileOffset = readOffset();
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index a5a426f..3ac762a 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -549,7 +549,7 @@
         _writeNodeMetadataImpl(component, componentOffset);
       }
       libraryOffsets = <int>[];
-      CanonicalName main = getCanonicalNameOfMember(component.mainMethod);
+      CanonicalName main = getCanonicalNameOfMemberGetter(component.mainMethod);
       if (main != null) {
         checkCanonicalName(main);
       }
@@ -749,7 +749,7 @@
     assert(_binaryOffsetForConstantTable >= 0);
     writeUInt32(_binaryOffsetForConstantTable);
 
-    CanonicalName main = getCanonicalNameOfMember(component.mainMethod);
+    CanonicalName main = getCanonicalNameOfMemberGetter(component.mainMethod);
     if (main == null) {
       writeUInt32(0);
     } else {
@@ -840,8 +840,8 @@
 
   void writeNullAllowedInstanceMemberReference(Reference reference) {
     writeNullAllowedReference(reference);
-    Member member = reference?.asMember;
-    writeNullAllowedReference(member?.memberSignatureOrigin?.reference);
+    writeNullAllowedReference(
+        getMemberReferenceGetter(reference?.asMember?.memberSignatureOrigin));
   }
 
   void writeNullAllowedReference(Reference reference) {
@@ -859,8 +859,8 @@
 
   void writeNonNullInstanceMemberReference(Reference reference) {
     writeNonNullReference(reference);
-    Member member = reference.asMember;
-    writeNullAllowedReference(member?.memberSignatureOrigin?.reference);
+    writeNullAllowedReference(
+        getMemberReferenceGetter(reference.asMember?.memberSignatureOrigin));
   }
 
   void writeNonNullReference(Reference reference) {
@@ -1167,7 +1167,7 @@
     }
     enterScope(memberScope: true);
     writeByte(Tag.Constructor);
-    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberGetter(node));
     writeUriReference(node.fileUri);
     writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
@@ -1222,7 +1222,7 @@
 
     enterScope(memberScope: true);
     writeByte(Tag.Procedure);
-    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberGetter(node));
     writeUriReference(node.fileUri);
     writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
@@ -1246,12 +1246,13 @@
 
   @override
   void visitField(Field node) {
-    if (node.canonicalName == null) {
+    if (node.getterCanonicalName == null || node.setterCanonicalName == null) {
       throw new ArgumentError('Missing canonical name for $node');
     }
     enterScope(memberScope: true);
     writeByte(Tag.Field);
-    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberGetter(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberSetter(node));
     writeUriReference(node.fileUri);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
@@ -1273,7 +1274,7 @@
         typeParameters: node.typeParameters,
         memberScope: true,
         variableScope: true);
-    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberGetter(node));
     writeUriReference(node.fileUri);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index ebdf993..5b46f8e 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -146,7 +146,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 49;
+  static const int BinaryFormatVersion = 50;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 27e66ef..526c32e 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -131,6 +131,10 @@
     return getChild('@fields').getChildFromQualifiedName(field.name);
   }
 
+  CanonicalName getChildFromFieldSetter(Field field) {
+    return getChild('@=fields').getChildFromQualifiedName(field.name);
+  }
+
   CanonicalName getChildFromConstructor(Constructor constructor) {
     return getChild('@constructors')
         .getChildFromQualifiedName(constructor.name);
@@ -146,6 +150,10 @@
     return getChild('@fields').getChildFromQualifiedName(name);
   }
 
+  CanonicalName getChildFromFieldSetterWithName(Name name) {
+    return getChild('@=fields').getChildFromQualifiedName(name);
+  }
+
   CanonicalName getChildFromTypedef(Typedef typedef_) {
     return getChild('@typedefs').getChild(typedef_.name);
   }
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index f83e594..d70b550 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -680,7 +680,8 @@
         hasImplicitSetter: node.hasImplicitSetter,
         transformerFlags: node.transformerFlags,
         fileUri: _activeFileUri,
-        reference: referenceFrom?.reference)
+        getterReference: referenceFrom?.getterReference,
+        setterReference: referenceFrom?.setterReference)
       ..annotations = cloneAnnotations && !node.annotations.isEmpty
           ? node.annotations.map(super.clone).toList()
           : const <Expression>[]
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 3e253af..d13d0c9 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -169,6 +169,13 @@
   return '$buffer';
 }
 
+String debugComponentToString(Component component) {
+  StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: new NameSystem())
+      .writeComponentFile(component);
+  return '$buffer';
+}
+
 String componentToString(Component node) {
   StringBuffer buffer = new StringBuffer();
   new Printer(buffer, syntheticNames: new NameSystem())
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index 3713e32..7585b5c 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -379,7 +379,7 @@
         type:
             new InterfaceType(_locationClass, clazz.enclosingLibrary.nullable),
         isFinal: true,
-        reference: clazz.reference.canonicalName
+        getterReference: clazz.reference.canonicalName
             ?.getChildFromFieldWithName(fieldName)
             ?.reference);
     clazz.addField(locationField);
diff --git a/pkg/kernel/lib/vm/constants_native_effects.dart b/pkg/kernel/lib/vm/constants_native_effects.dart
index 2dc607d..fb52988 100644
--- a/pkg/kernel/lib/vm/constants_native_effects.dart
+++ b/pkg/kernel/lib/vm/constants_native_effects.dart
@@ -45,7 +45,8 @@
       constant.keyType,
       constant.valueType,
     ], <Reference, Constant>{
-      kvPairListField.reference: kvListConstant,
+      // We use getterReference as we refer to the field itself.
+      kvPairListField.getterReference: kvListConstant,
     });
   }
 }
diff --git a/pkg/kernel/test/convert_field_to_setter_getter.dart b/pkg/kernel/test/convert_field_to_setter_getter.dart
new file mode 100644
index 0000000..fc45c7b
--- /dev/null
+++ b/pkg/kernel/test/convert_field_to_setter_getter.dart
@@ -0,0 +1,193 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/binary/ast_from_binary.dart';
+import 'package:kernel/binary/ast_to_binary.dart';
+
+main() {
+  final Library lib1 = new Library(Uri.parse('org-dartlang:///lib.dart'));
+  final Field field = new Field(new Name("f"));
+  lib1.addField(field);
+  final Block libProcedureBody = new Block([
+    new ExpressionStatement(new StaticSet(field, new IntLiteral(42))),
+    new ReturnStatement(new StaticGet(field)),
+  ]);
+  final Procedure libProcedure = new Procedure(
+      new Name("method"),
+      ProcedureKind.Method,
+      new FunctionNode(libProcedureBody, returnType: new DynamicType()));
+  lib1.addProcedure(libProcedure);
+
+  final Library lib2 = new Library(Uri.parse('org-dartlang:///lib2.dart'));
+  final Block lib2ProcedureBody = new Block([
+    new ExpressionStatement(new StaticSet(field, new IntLiteral(43))),
+    new ReturnStatement(new StaticGet(field)),
+  ]);
+  final Procedure lib2Procedure = new Procedure(
+      new Name("method"),
+      ProcedureKind.Method,
+      new FunctionNode(lib2ProcedureBody, returnType: new DynamicType()));
+  lib2.addProcedure(lib2Procedure);
+
+  verifyTargets(libProcedure, lib2Procedure, field, field);
+  List<int> writtenBytesFieldOriginal = serialize(lib1, lib2);
+  // Canonical names are now set: Verify that the field is marked as such,
+  // canonical-name-wise.
+  if (field.getterCanonicalName.parent.name != "@fields") {
+    throw "Expected @fields parent, but had "
+        "${field.getterCanonicalName.parent.name}";
+  }
+  if (field.setterCanonicalName.parent.name != "@=fields") {
+    throw "Expected @=fields parent, but had "
+        "${field.setterCanonicalName.parent.name}";
+  }
+
+  // Replace the field with a setter/getter pair.
+  lib1.fields.remove(field);
+  FunctionNode getterFunction = new FunctionNode(new Block([]));
+  Procedure getter = new Procedure(
+      new Name("f"), ProcedureKind.Getter, getterFunction,
+      reference: field.getterReference);
+  // Important: Unbind any old canonical name
+  // (nulling out the canonical name is not enough because it leaves the old
+  // canonical name (which always stays alive) with a pointer to the reference,
+  // meaning that if one tried to rebind it (e.g. if going back to a field from
+  // a setter/getter), the reference wouldn't (because of the way `bindTo` is
+  // implemented) actually have it's canonical name set, and serialization
+  // wouldn't work.)
+  field.getterReference?.canonicalName?.unbind();
+  lib1.addProcedure(getter);
+
+  FunctionNode setterFunction = new FunctionNode(new Block([]),
+      positionalParameters: [new VariableDeclaration("foo")]);
+  Procedure setter = new Procedure(
+      new Name("f"), ProcedureKind.Setter, setterFunction,
+      reference: field.setterReference);
+  // Important: Unbind any old canonical name
+  // (nulling out the canonical name is not enough, see above).
+  field.setterReference?.canonicalName?.unbind();
+  lib1.addProcedure(setter);
+
+  verifyTargets(libProcedure, lib2Procedure, getter, setter);
+  List<int> writtenBytesGetterSetter = serialize(lib1, lib2);
+  // Canonical names are now set: Verify that the getter/setter is marked as
+  // such, canonical-name-wise.
+  if (getter.canonicalName.parent.name != "@getters") {
+    throw "Expected @getters parent, but had "
+        "${getter.canonicalName.parent.name}";
+  }
+  if (setter.canonicalName.parent.name != "@setters") {
+    throw "Expected @setters parent, but had "
+        "${setter.canonicalName.parent.name}";
+  }
+
+  // Replace getter/setter with field.
+  lib1.procedures.remove(getter);
+  lib1.procedures.remove(setter);
+  final Field fieldReplacement = new Field(new Name("f"),
+      getterReference: getter.reference, setterReference: setter.reference);
+  // Important: Unbind any old canonical name
+  // (nulling out the canonical name is not enough, see above).
+  fieldReplacement.getterReference?.canonicalName?.unbind();
+  fieldReplacement.setterReference?.canonicalName?.unbind();
+  lib1.addField(fieldReplacement);
+
+  verifyTargets(
+      libProcedure, lib2Procedure, fieldReplacement, fieldReplacement);
+  List<int> writtenBytesFieldNew = serialize(lib1, lib2);
+  // Canonical names are now set: Verify that the field is marked as such,
+  // canonical-name-wise.
+  if (fieldReplacement.getterCanonicalName.parent.name != "@fields") {
+    throw "Expected @fields parent, but had "
+        "${fieldReplacement.getterCanonicalName.parent.name}";
+  }
+  if (fieldReplacement.setterCanonicalName.parent.name != "@=fields") {
+    throw "Expected @=fields parent, but had "
+        "${fieldReplacement.setterCanonicalName.parent.name}";
+  }
+
+  // Load the written stuff and ensure it is as expected.
+  // First one has a field.
+  Component componentLoaded = new Component();
+  new BinaryBuilder(writtenBytesFieldOriginal)
+      .readSingleFileComponent(componentLoaded);
+  verifyTargets(
+      componentLoaded.libraries[0].procedures.single,
+      componentLoaded.libraries[1].procedures.single,
+      componentLoaded.libraries[0].fields.single,
+      componentLoaded.libraries[0].fields.single);
+
+  // Second one has a getter/setter pair.
+  componentLoaded = new Component();
+  new BinaryBuilder(writtenBytesGetterSetter)
+      .readSingleFileComponent(componentLoaded);
+  assert(componentLoaded.libraries[0].procedures[2].isSetter);
+  verifyTargets(
+      componentLoaded.libraries[0].procedures[0],
+      componentLoaded.libraries[1].procedures[0],
+      componentLoaded.libraries[0].procedures[1],
+      componentLoaded.libraries[0].procedures[2]);
+
+  // Third one has a field again.
+  componentLoaded = new Component();
+  new BinaryBuilder(writtenBytesFieldNew)
+      .readSingleFileComponent(componentLoaded);
+  verifyTargets(
+      componentLoaded.libraries[0].procedures.single,
+      componentLoaded.libraries[1].procedures.single,
+      componentLoaded.libraries[0].fields.single,
+      componentLoaded.libraries[0].fields.single);
+}
+
+void verifyTargets(Procedure libProcedure, Procedure lib2Procedure,
+    Member getterTarget, Member setterTarget) {
+  if (getGetTarget(libProcedure) != getterTarget) {
+    throw "Unexpected get target for lib #1";
+  }
+  if (getSetTarget(libProcedure) != setterTarget) {
+    throw "Unexpected set target for lib #1";
+  }
+  if (getGetTarget(lib2Procedure) != getterTarget) {
+    throw "Unexpected get target for lib #2";
+  }
+  if (getSetTarget(lib2Procedure) != setterTarget) {
+    throw "Unexpected set target for lib #2";
+  }
+}
+
+List<int> serialize(Library lib1, Library lib2) {
+  Component component = new Component(libraries: [lib1, lib2])
+    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
+  ByteSink sink = new ByteSink();
+  new BinaryPrinter(sink).writeComponentFile(component);
+  return sink.builder.takeBytes();
+}
+
+Member getSetTarget(Procedure p) {
+  Block block = p.function.body;
+  ExpressionStatement getterStatement = block.statements[0];
+  StaticSet staticSet = getterStatement.expression;
+  return staticSet.target;
+}
+
+Member getGetTarget(Procedure p) {
+  Block block = p.function.body;
+  ReturnStatement setterStatement = block.statements[1];
+  StaticGet staticGet = setterStatement.expression;
+  return staticGet.target;
+}
+
+/// A [Sink] that directly writes data into a byte builder.
+class ByteSink implements Sink<List<int>> {
+  final BytesBuilder builder = new BytesBuilder();
+
+  void add(List<int> data) {
+    builder.add(data);
+  }
+
+  void close() {}
+}
diff --git a/pkg/kernel/test/metadata_test.dart b/pkg/kernel/test/metadata_test.dart
index dd557fb..5b362f1 100644
--- a/pkg/kernel/test/metadata_test.dart
+++ b/pkg/kernel/test/metadata_test.dart
@@ -25,8 +25,11 @@
   Member get member => _memberRef?.asMember;
 
   Metadata.forNode(TreeNode n)
-      : this(n.leakingDebugToString(),
-            getMemberReference(getMemberForMetadata(n)), getTypeForMetadata(n));
+      : this(
+            n.leakingDebugToString(),
+            // Refers to the member, not about the function => use getter.
+            getMemberReferenceGetter(getMemberForMetadata(n)),
+            getTypeForMetadata(n));
 
   Metadata(this.string, this._memberRef, this.type);
 }
diff --git a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
index 7a55d99..cd4ae4a 100644
--- a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
+++ b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
@@ -148,7 +148,7 @@
               new ExpressionStatement(new StaticSet(field, new IntLiteral(1))),
           expectation: ''
               '(expr'
-              ' (set-static "package:foo/bar.dart::@fields::field" (int 1)))',
+              ' (set-static "package:foo/bar.dart::@=fields::field" (int 1)))',
           makeSerializationState: () => new SerializationState(null),
           makeDeserializationState: () =>
               new DeserializationState(null, component.root),
@@ -221,7 +221,7 @@
       return new TestCase<Statement>(
           name: '/* suppose A {dynamic field;} A x; */ x.{A::field};',
           node: new ExpressionStatement(new PropertyGet.byReference(
-              new VariableGet(x), field.name, field.reference)),
+              new VariableGet(x), field.name, field.getterReference)),
           expectation: ''
               '(expr (get-prop (get-var "x^0" _) (public "field")))',
           makeSerializationState: () =>
@@ -252,7 +252,7 @@
               new VariableGet(x),
               field.name,
               new IntLiteral(42),
-              field.reference)),
+              field.setterReference)),
           expectation: ''
               '(expr (set-prop (get-var "x^0" _) (public "field") (int 42)))',
           makeSerializationState: () =>
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index 743ed08..e56752f 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 1.3.0-nullsafety.6
+
+* Update SDK constraints to `>=2.12.0-0 <3.0.0` based on beta release
+    guidelines.
+
 ## 1.3.0-nullsafety.5
 
 * Allow prerelease versions of the `2.12` sdk.
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index a68bacd..835f447 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: meta
-version: 1.3.0-nullsafety.5
+version: 1.3.0-nullsafety.6
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/meta
 description: >
  This library contains the declarations of annotations that developers can use
@@ -7,5 +7,4 @@
  analyzing the source code. These annotations are intended to be used by tools
  to provide a better user experience.
 environment:
-  # This must remain a tight constraint until nnbd is stable
-  sdk: '>=2.10.0-0 <2.12.0'
+  sdk: ">=2.12.0-0 <3.0.0"
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 3c09f9b..792eeba 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
@@ -36,7 +36,7 @@
       '${_intendedMinimumSdkVersion.major}.${_intendedMinimumSdkVersion.minor}';
 
   static final String _intendedSdkVersionConstraint =
-      '>=$_intendedMinimumSdkVersion <2.12.0';
+      '>=$_intendedMinimumSdkVersion <3.0.0';
 
   static final List<HttpPreviewServer> _allServers = [];
 
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index c62fc75..31d3cec 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -432,7 +432,7 @@
           '''
 name: test
 environment:
-  sdk: '${migrated ? '>=2.12.0-0 <2.12.0' : '>=2.6.0 <3.0.0'}'
+  sdk: '${migrated ? '>=2.12.0-0 <3.0.0' : '>=2.6.0 <3.0.0'}'
 ''',
       '.dart_tool/package_config.json':
           packageConfigText ?? _getPackageConfigText(migrated: migrated),
@@ -1794,7 +1794,7 @@
 name: test
 environment:
   foo: 1
-  sdk: '>=2.12.0-0 <2.12.0'
+  sdk: '>=2.12.0-0 <3.0.0'
 '''));
   }
 
@@ -1834,6 +1834,27 @@
             packageConfigText: _getPackageConfigText(migrated: false)));
   }
 
+  test_pubspec_has_unusual_max_sdk_constraint() async {
+    // No one should be using a weird max SDK constraint like this.  If they are
+    // doing so, we'll fix it to 3.0.0.
+    var projectContents = simpleProject(pubspecText: '''
+name: test
+environment:
+  sdk: '>=2.6.0 <2.17.4'
+''');
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli()
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, pubspecText: '''
+name: test
+environment:
+  sdk: '>=2.12.0-0 <3.0.0'
+'''));
+  }
+
   test_pubspec_is_missing_environment() async {
     var projectContents = simpleProject(pubspecText: '''
 name: test
@@ -1847,7 +1868,7 @@
         // This is strange-looking, but valid.
         '''
 environment:
-  sdk: '>=2.12.0-0 <2.12.0'
+  sdk: '>=2.12.0-0 <3.0.0'
 
 name: test
 '''));
diff --git a/pkg/vm/lib/metadata/direct_call.dart b/pkg/vm/lib/metadata/direct_call.dart
index 17eb4e8..b7e8277 100644
--- a/pkg/vm/lib/metadata/direct_call.dart
+++ b/pkg/vm/lib/metadata/direct_call.dart
@@ -13,7 +13,8 @@
   final bool checkReceiverForNull;
 
   DirectCallMetadata(Member target, bool checkReceiverForNull)
-      : this.byReference(getMemberReference(target), checkReceiverForNull);
+      : this.byReference(
+            getMemberReferenceGetter(target), checkReceiverForNull);
 
   DirectCallMetadata.byReference(
       this._targetReference, this.checkReceiverForNull);
@@ -40,7 +41,7 @@
   @override
   void writeToBinary(DirectCallMetadata metadata, Node node, BinarySink sink) {
     sink.writeNullAllowedCanonicalNameReference(
-        getCanonicalNameOfMember(metadata.target));
+        getCanonicalNameOfMemberGetter(metadata.target));
     sink.writeByte(metadata.checkReceiverForNull ? 1 : 0);
   }
 
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 8986ebe..4f96426 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -398,10 +398,10 @@
 
     node.addAnnotation(ConstantExpression(
         InstanceConstant(pragmaClass.reference, [], {
-          pragmaName.reference: StringConstant("vm:ffi:struct-fields"),
+          pragmaName.getterReference: StringConstant("vm:ffi:struct-fields"),
           // TODO(dartbug.com/38158): Wrap list in class to be able to encode
           // more information when needed.
-          pragmaOptions.reference: ListConstant(
+          pragmaOptions.getterReference: ListConstant(
               InterfaceType(typeClass, Nullability.nonNullable), types)
         }),
         InterfaceType(pragmaClass, Nullability.nonNullable, [])));
@@ -528,13 +528,15 @@
   void _replaceSizeOfMethod(
       Class struct, Map<Abi, int> sizes, IndexedClass indexedClass) {
     var name = Name("#sizeOf");
+    var lookupField = indexedClass?.lookupField(name.text);
     final Field sizeOf = Field(name,
         isStatic: true,
         isFinal: true,
         initializer: _runtimeBranchOnLayout(sizes),
         type: InterfaceType(intClass, Nullability.legacy),
         fileUri: struct.fileUri,
-        reference: indexedClass?.lookupField(name.text)?.reference)
+        getterReference: lookupField?.getterReference,
+        setterReference: lookupField?.setterReference)
       ..fileOffset = struct.fileOffset;
     _makeEntryPoint(sizeOf);
     struct.addField(sizeOf);
@@ -585,8 +587,8 @@
   void _makeEntryPoint(Annotatable node) {
     node.addAnnotation(ConstantExpression(
         InstanceConstant(pragmaClass.reference, [], {
-          pragmaName.reference: StringConstant("vm:entry-point"),
-          pragmaOptions.reference: NullConstant()
+          pragmaName.getterReference: StringConstant("vm:entry-point"),
+          pragmaOptions.getterReference: NullConstant()
         }),
         InterfaceType(pragmaClass, Nullability.legacy, [])));
   }
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index fb6635c..16e31c7 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -332,6 +332,7 @@
     final nativeFunctionType = InterfaceType(
         nativeFunctionClass, Nullability.legacy, node.arguments.types);
     var name = Name("_#ffiCallback${callbackCount++}", currentLibrary);
+    var lookupField = currentLibraryIndex?.lookupField(name.text);
     final Field field = Field(name,
         type: InterfaceType(
             pointerClass, Nullability.legacy, [nativeFunctionType]),
@@ -345,7 +346,8 @@
         isStatic: true,
         isFinal: true,
         fileUri: currentLibrary.fileUri,
-        reference: currentLibraryIndex?.lookupField(name.text)?.reference)
+        getterReference: lookupField?.getterReference,
+        setterReference: lookupField?.setterReference)
       ..fileOffset = node.fileOffset;
     currentLibrary.addField(field);
     return StaticGet(field);
diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart
index b12e44e..ce3055b 100644
--- a/pkg/vm/lib/transformations/pragma.dart
+++ b/pkg/vm/lib/transformations/pragma.dart
@@ -66,7 +66,8 @@
     if (pragmaConstant == null) return null;
 
     String pragmaName;
-    Constant name = pragmaConstant.fieldValues[coreTypes.pragmaName.reference];
+    Constant name =
+        pragmaConstant.fieldValues[coreTypes.pragmaName.getterReference];
     if (name is StringConstant) {
       pragmaName = name.value;
     } else {
@@ -74,7 +75,7 @@
     }
 
     Constant options =
-        pragmaConstant.fieldValues[coreTypes.pragmaOptions.reference];
+        pragmaConstant.fieldValues[coreTypes.pragmaOptions.getterReference];
     assert(options != null);
 
     switch (pragmaName) {
diff --git a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
index 7aad1d8..904f915 100644
--- a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
+++ b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
@@ -126,7 +126,7 @@
       this.addMethod, Set<Selector> dynamicSelectors, this.coreTypes, this.info)
       : tagNumberField = tagNumberClass.fields
             .firstWhere((f) => f.name.text == 'tagNumber')
-            .reference {
+            .getterReference {
     dynamicNames.addAll(dynamicSelectors.map((sel) => sel.target.text));
   }
 
diff --git a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
index 003bb2f..334eb84 100644
--- a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
+++ b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
@@ -103,9 +103,9 @@
         final constant = (annotation as ConstantExpression).constant;
         if (constant is InstanceConstant &&
             constant.classReference == _tagNumberClass.reference) {
-          if (messageClass._usedTags.add(
-              (constant.fieldValues[_tagNumberField.reference] as IntConstant)
-                  .value)) {
+          if (messageClass._usedTags.add((constant
+                  .fieldValues[_tagNumberField.getterReference] as IntConstant)
+              .value)) {
             _invalidatedClasses.add(messageClass);
           }
         }
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index bbb753e..4b6ac4a 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 5.5.0
+- Update to version `3.42.0` of the spec.
+- Added optional `limit` parameter to `getStack` RPC.
+
 ## 5.4.0
 - Update to version `3.41.0` of the spec.
 - Added `PortList` class.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index 617bd7c..0243d12 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -1105,6 +1105,7 @@
   assertString(obj.type);
   assertListOfFrame(obj.frames);
   assertListOfMessage(obj.messages);
+  assertBool(obj.truncated);
   return obj;
 }
 
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index ae41aeb..742d603 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.41
+version=3.42
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index e7ed3a4..6bb049a 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -28,7 +28,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.41.0';
+const String vmServiceVersion = '3.42.0';
 
 /// @optional
 const String optional = 'optional';
@@ -733,6 +733,12 @@
   /// The `getStack` RPC is used to retrieve the current execution stack and
   /// message queue for an isolate. The isolate does not need to be paused.
   ///
+  /// If `limit` is provided, up to `limit` frames from the top of the stack
+  /// will be returned. If the stack depth is smaller than `limit` the entire
+  /// stack is returned. Note: this limit also applies to the
+  /// `asyncCausalFrames` and `awaiterFrames` stack representations in the
+  /// `Stack` response.
+  ///
   /// If `isolateId` refers to an isolate which has exited, then the `Collected`
   /// [Sentinel] is returned.
   ///
@@ -740,7 +746,7 @@
   ///
   /// This method will throw a [SentinelException] in the case a [Sentinel] is
   /// returned.
-  Future<Stack> getStack(String isolateId);
+  Future<Stack> getStack(String isolateId, {int limit});
 
   /// The `getSupportedProtocols` RPC is used to determine which protocols are
   /// supported by the current server.
@@ -1344,6 +1350,7 @@
         case 'getStack':
           response = await _serviceImplementation.getStack(
             params['isolateId'],
+            limit: params['limit'],
           );
           break;
         case 'getSupportedProtocols':
@@ -1798,8 +1805,10 @@
       _call('getProcessMemoryUsage');
 
   @override
-  Future<Stack> getStack(String isolateId) =>
-      _call('getStack', {'isolateId': isolateId});
+  Future<Stack> getStack(String isolateId, {int limit}) => _call('getStack', {
+        'isolateId': isolateId,
+        if (limit != null) 'limit': limit,
+      });
 
   @override
   Future<ProtocolList> getSupportedProtocols() =>
@@ -6664,23 +6673,40 @@
       'compiled: ${compiled}]';
 }
 
+/// The `Stack` class represents the various components of a Dart stack trace
+/// for a given isolate.
+///
+/// See [getStack].
 class Stack extends Response {
   static Stack parse(Map<String, dynamic> json) =>
       json == null ? null : Stack._fromJson(json);
 
+  /// A list of frames that make up the synchronous stack, rooted at the message
+  /// loop (i.e., the frames since the last asynchronous gap or the isolate's
+  /// entrypoint).
   List<Frame> frames;
 
+  /// A list of frames representing the asynchronous path. Comparable to
+  /// `awaiterFrames`, if provided, although some frames may be different.
   @optional
   List<Frame> asyncCausalFrames;
 
+  /// A list of frames representing the asynchronous path. Comparable to
+  /// `asyncCausalFrames`, if provided, although some frames may be different.
   @optional
   List<Frame> awaiterFrames;
 
+  /// A list of messages in the isolate's message queue.
   List<Message> messages;
 
+  /// Specifies whether or not this stack is complete or has been artificially
+  /// truncated.
+  bool truncated;
+
   Stack({
     @required this.frames,
     @required this.messages,
+    @required this.truncated,
     this.asyncCausalFrames,
     this.awaiterFrames,
   });
@@ -6698,6 +6724,7 @@
             createServiceObject(json['awaiterFrames'], const ['Frame']));
     messages = List<Message>.from(
         createServiceObject(json['messages'], const ['Message']) ?? []);
+    truncated = json['truncated'];
   }
 
   @override
@@ -6707,6 +6734,7 @@
     json.addAll({
       'frames': frames.map((f) => f.toJson()).toList(),
       'messages': messages.map((f) => f.toJson()).toList(),
+      'truncated': truncated,
     });
     _setIfNotNull(json, 'asyncCausalFrames',
         asyncCausalFrames?.map((f) => f?.toJson())?.toList());
@@ -6715,8 +6743,9 @@
     return json;
   }
 
-  String toString() =>
-      '[Stack type: ${type}, frames: ${frames}, messages: ${messages}]';
+  String toString() => '[Stack ' //
+      'type: ${type}, frames: ${frames}, messages: ${messages}, ' //
+      'truncated: ${truncated}]';
 }
 
 /// The `Success` type is used to indicate that an operation completed
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 0c77a68..3b14073 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
 description: >-
   A library to communicate with a service implementing the Dart VM
   service protocol.
-version: 5.4.0
+version: 5.5.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 55c9d13..2d9a331 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -1917,8 +1917,10 @@
     return invokeRpc('setExceptionPauseMode', {'mode': mode});
   }
 
-  Future<ServiceMap> getStack() {
-    return invokeRpc('getStack', {}).then((response) => response as ServiceMap);
+  Future<ServiceMap> getStack({int? limit}) {
+    return invokeRpc('getStack', {
+      if (limit != null) 'limit': limit,
+    }).then((response) => response as ServiceMap);
   }
 
   Future<ObjectStore> getObjectStore() {
diff --git a/runtime/observatory/tests/service/dds_extension_event_history_test.dart b/runtime/observatory/tests/service/dds_extension_event_history_test.dart
new file mode 100644
index 0000000..0c3d165
--- /dev/null
+++ b/runtime/observatory/tests/service/dds_extension_event_history_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:developer';
+
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+import 'client_resume_approvals_common.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+Future testMain() async {
+  // Post a total of 9 events
+  for (int i = 1; i <= 9; ++i) {
+    postEvent('Test', {
+      'id': i,
+    });
+  }
+}
+
+var tests = <IsolateTest>[
+  isPausedAtStart,
+  resumeIsolate,
+  (Isolate isolate) async {
+    final completer = Completer<void>();
+    int i = 1;
+    await subscribeToStream(isolate.vm, 'Extension', (event) async {
+      expect(event.extensionKind, 'Test');
+      expect(event.extensionData!['id'], i);
+      i++;
+
+      if (i == 10) {
+        await cancelStreamSubscription('Extension');
+        completer.complete();
+      } else if (i > 10) {
+        fail('Too many log messages');
+      }
+    });
+    await completer.future;
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      enableService: false, // DDS specific feature
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory/tests/service/dds_stdout_stderr_history_test.dart b/runtime/observatory/tests/service/dds_stdout_stderr_history_test.dart
new file mode 100644
index 0000000..c0d6ba5
--- /dev/null
+++ b/runtime/observatory/tests/service/dds_stdout_stderr_history_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+import 'client_resume_approvals_common.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+Future testMain() async {
+  // Log a total of 9 messages
+  for (int i = 1; i <= 9; ++i) {
+    print('Stdout log$i');
+    stderr.writeln('Stderr log$i');
+  }
+}
+
+Future streamHistoryTest(Isolate isolate, String stream) async {
+  final completer = Completer<void>();
+  int i = 1;
+  await subscribeToStream(isolate.vm, stream, (event) async {
+    // Newlines are sent as separate events for some reason. Ignore them.
+    if (!event.bytesAsString!.startsWith(stream)) {
+      return;
+    }
+    expect(event.bytesAsString, '$stream log$i');
+    i++;
+
+    if (i == 10) {
+      await cancelStreamSubscription(stream);
+      completer.complete();
+    } else if (i > 10) {
+      fail('Too many log messages');
+    }
+  });
+  await completer.future;
+}
+
+var tests = <IsolateTest>[
+  isPausedAtStart,
+  resumeIsolate,
+  (Isolate isolate) async {
+    await streamHistoryTest(isolate, 'Stdout');
+  },
+  (Isolate isolate) async {
+    await streamHistoryTest(isolate, 'Stderr');
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      enableService: false, // DDS specific feature
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart b/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart
new file mode 100644
index 0000000..d80e4e1
--- /dev/null
+++ b/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:developer';
+
+import 'package:observatory/models.dart' as M;
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+bar(int depth) {
+  if (depth == 21) {
+    debugger();
+    return;
+  }
+  foo(depth + 1);
+}
+
+foo(int depth) {
+  bar(depth + 1);
+}
+
+testMain() {
+  foo(0);
+}
+
+verifyStack(List frames, int numFrames) {
+  for (int i = 0; i < frames.length && i < numFrames; ++i) {
+    final frame = frames[i];
+    if (i < 22) {
+      expect(frame.function!.qualifiedName, (i % 2) == 0 ? 'bar' : 'foo');
+    } else if (i == 22) {
+      expect(frame.function!.qualifiedName, 'testMain');
+      break;
+    }
+  }
+}
+
+var tests = <IsolateTest>[
+  (Isolate isolate) async {
+    await hasStoppedAtBreakpoint(isolate);
+    // Sanity check.
+    expect(isolate.pauseEvent is M.PauseBreakpointEvent, isTrue);
+  },
+
+// Get stack
+  (Isolate isolate) async {
+    var stack = await isolate.getStack();
+    // Sanity check.
+    var frames = stack['frames'];
+    var asyncFrames = stack['asyncCausalFrames'];
+    var awaiterFrames = stack['awaiterFrames'];
+    expect(frames.length, greaterThanOrEqualTo(20));
+    expect(asyncFrames.length, greaterThan(frames.length));
+    expect(awaiterFrames.length, greaterThan(frames.length));
+    expect(stack['truncated'], false);
+
+    verifyStack(frames, frames.length);
+
+    final fullStackLength = frames.length;
+
+    // Try a limit > actual stack depth and expect to get the full stack with
+    // truncated async stacks.
+    stack = await isolate.getStack(limit: fullStackLength + 1);
+    frames = stack['frames'];
+    asyncFrames = stack['asyncCausalFrames'];
+    awaiterFrames = stack['awaiterFrames'];
+
+    expect(frames.length, fullStackLength);
+    expect(asyncFrames.length, fullStackLength + 1);
+    expect(asyncFrames.length, fullStackLength + 1);
+    expect(stack['truncated'], true);
+    verifyStack(frames, fullStackLength);
+
+    // Try a limit < actual stack depth and expect to get a stack of depth
+    // 'limit'.
+    stack = await isolate.getStack(limit: 10);
+    frames = stack['frames'];
+    asyncFrames = stack['asyncCausalFrames'];
+    awaiterFrames = stack['awaiterFrames'];
+
+    expect(frames.length, 10);
+    expect(asyncFrames.length, 10);
+    expect(awaiterFrames.length, 10);
+    expect(stack['truncated'], true);
+    verifyStack(frames, 10);
+  },
+// Invalid limit
+  (Isolate isolate) async {
+    try {
+      await isolate.getStack(limit: -1);
+      fail('Invalid parameter of -1 successful');
+    } on ServerRpcException {
+      // Expected.
+    }
+  }
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index c8b0244..5e1a8c9 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], 'Version');
     expect(result['major'], 3);
-    expect(result['minor'], 41);
+    expect(result['minor'], 42);
     expect(result['_privateMajor'], 0);
     expect(result['_privateMinor'], 0);
   },
diff --git a/runtime/observatory/tests/service/network_profiling_test.dart b/runtime/observatory/tests/service/network_profiling_test.dart
index d68fbeb..3a318ca 100644
--- a/runtime/observatory/tests/service/network_profiling_test.dart
+++ b/runtime/observatory/tests/service/network_profiling_test.dart
@@ -56,11 +56,14 @@
   postEvent('socketTest', {'socket': 'test'});
 }
 
-void checkFinishEvent(ServiceEvent event) {
+bool checkFinishEvent(ServiceEvent event) {
   expect(event.kind, equals(ServiceEvent.kExtension));
-  expect(event.extensionKind, equals('socketTest'));
+  if (event.extensionKind != 'socketTest') {
+    return false;
+  }
   expect(event.extensionData, isA<Map>());
   expect(event.extensionData!['socket'], equals('test'));
+  return true;
 }
 
 var tests = <IsolateTest>[
@@ -102,9 +105,10 @@
     var sub;
     sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
         (ServiceEvent event) {
-      checkFinishEvent(event);
-      sub.cancel();
-      completer.complete();
+      if (checkFinishEvent(event)) {
+        sub.cancel();
+        completer.complete();
+      }
     });
 
     dynamic result = await isolate.invokeRpc("invoke",
@@ -150,9 +154,10 @@
       completer = Completer();
       sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
           (ServiceEvent event) {
-        checkFinishEvent(event);
-        sub.cancel();
-        completer.complete();
+        if (checkFinishEvent(event)) {
+          sub.cancel();
+          completer.complete();
+        }
       });
       dynamic result = await isolate.invokeRpc("invoke",
           {"targetId": lib.id, "selector": "socketTest", "argumentIds": []});
@@ -197,9 +202,10 @@
     var sub;
     sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
         (ServiceEvent event) {
-      checkFinishEvent(event);
-      sub.cancel();
-      completer.complete();
+      if (checkFinishEvent(event)) {
+        sub.cancel();
+        completer.complete();
+      }
     });
 
     dynamic result = await isolate.invokeRpc("invoke",
diff --git a/runtime/observatory_2/lib/src/service/object.dart b/runtime/observatory_2/lib/src/service/object.dart
index fe4027b..3f61be6 100644
--- a/runtime/observatory_2/lib/src/service/object.dart
+++ b/runtime/observatory_2/lib/src/service/object.dart
@@ -1927,8 +1927,10 @@
     return invokeRpc('setExceptionPauseMode', {'mode': mode});
   }
 
-  Future<ServiceMap> getStack() {
-    return invokeRpc('getStack', {}).then((response) => response as ServiceMap);
+  Future<ServiceMap> getStack({int limit}) {
+    return invokeRpc('getStack', {
+      if (limit != null) 'limit': limit,
+    }).then((response) => response as ServiceMap);
   }
 
   Future<ObjectStore> getObjectStore() {
diff --git a/runtime/observatory_2/tests/service_2/dds_extension_event_history_test.dart b/runtime/observatory_2/tests/service_2/dds_extension_event_history_test.dart
new file mode 100644
index 0000000..ea8ab07
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/dds_extension_event_history_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:developer';
+
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+import 'client_resume_approvals_common.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+Future testMain() async {
+  // Post a total of 9 events
+  for (int i = 1; i <= 9; ++i) {
+    postEvent('Test', {
+      'id': i,
+    });
+  }
+}
+
+var tests = <IsolateTest>[
+  isPausedAtStart,
+  resumeIsolate,
+  (Isolate isolate) async {
+    final completer = Completer<void>();
+    int i = 1;
+    await subscribeToStream(isolate.vm, 'Extension', (event) async {
+      expect(event.extensionKind, 'Test');
+      expect(event.extensionData['id'], i);
+      i++;
+
+      if (i == 10) {
+        await cancelStreamSubscription('Extension');
+        completer.complete();
+      } else if (i > 10) {
+        fail('Too many log messages');
+      }
+    });
+    await completer.future;
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      enableService: false, // DDS specific feature
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory_2/tests/service_2/dds_stdout_stderr_history_test.dart b/runtime/observatory_2/tests/service_2/dds_stdout_stderr_history_test.dart
new file mode 100644
index 0000000..9fc0b7a
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/dds_stdout_stderr_history_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+import 'client_resume_approvals_common.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+Future testMain() async {
+  // Log a total of 9 messages
+  for (int i = 1; i <= 9; ++i) {
+    print('Stdout log$i');
+    stderr.writeln('Stderr log$i');
+  }
+}
+
+Future streamHistoryTest(Isolate isolate, String stream) async {
+  final completer = Completer<void>();
+  int i = 1;
+  await subscribeToStream(isolate.vm, stream, (event) async {
+    // Newlines are sent as separate events for some reason. Ignore them.
+    if (!event.bytesAsString.startsWith(stream)) {
+      return;
+    }
+    expect(event.bytesAsString, '$stream log$i');
+    i++;
+
+    if (i == 10) {
+      await cancelStreamSubscription(stream);
+      completer.complete();
+    } else if (i > 10) {
+      fail('Too many log messages');
+    }
+  });
+  await completer.future;
+}
+
+var tests = <IsolateTest>[
+  isPausedAtStart,
+  resumeIsolate,
+  (Isolate isolate) async {
+    await streamHistoryTest(isolate, 'Stdout');
+  },
+  (Isolate isolate) async {
+    await streamHistoryTest(isolate, 'Stderr');
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      enableService: false, // DDS specific feature
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart
new file mode 100644
index 0000000..4c2f286
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:developer';
+
+import 'package:observatory_2/models.dart' as M;
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+bar(int depth) {
+  if (depth == 21) {
+    debugger();
+    return;
+  }
+  foo(depth + 1);
+}
+
+foo(int depth) {
+  bar(depth + 1);
+}
+
+testMain() {
+  foo(0);
+}
+
+verifyStack(List frames, int numFrames) {
+  for (int i = 0; i < frames.length && i < numFrames; ++i) {
+    final frame = frames[i];
+    if (i < 22) {
+      expect(frame.function.qualifiedName, (i % 2) == 0 ? 'bar' : 'foo');
+    } else if (i == 22) {
+      expect(frame.function.qualifiedName, 'testMain');
+      break;
+    }
+  }
+}
+
+var tests = <IsolateTest>[
+  (Isolate isolate) async {
+    await hasStoppedAtBreakpoint(isolate);
+    // Sanity check.
+    expect(isolate.pauseEvent is M.PauseBreakpointEvent, isTrue);
+  },
+
+// Get stack
+  (Isolate isolate) async {
+    var stack = await isolate.getStack();
+    // Sanity check.
+    var frames = stack['frames'];
+    var asyncFrames = stack['asyncCausalFrames'];
+    var awaiterFrames = stack['awaiterFrames'];
+    expect(frames.length, greaterThanOrEqualTo(20));
+    expect(asyncFrames.length, greaterThan(frames.length));
+    expect(awaiterFrames.length, greaterThan(frames.length));
+    expect(stack['truncated'], false);
+
+    verifyStack(frames, frames.length);
+
+    final fullStackLength = frames.length;
+
+    // Try a limit > actual stack depth and expect to get the full stack with
+    // truncated async stacks.
+    stack = await isolate.getStack(limit: fullStackLength + 1);
+    frames = stack['frames'];
+    asyncFrames = stack['asyncCausalFrames'];
+    awaiterFrames = stack['awaiterFrames'];
+
+    expect(frames.length, fullStackLength);
+    expect(asyncFrames.length, fullStackLength + 1);
+    expect(asyncFrames.length, fullStackLength + 1);
+    expect(stack['truncated'], true);
+    verifyStack(frames, fullStackLength);
+
+    // Try a limit < actual stack depth and expect to get a stack of depth
+    // 'limit'.
+    stack = await isolate.getStack(limit: 10);
+    frames = stack['frames'];
+    asyncFrames = stack['asyncCausalFrames'];
+    awaiterFrames = stack['awaiterFrames'];
+
+    expect(frames.length, 10);
+    expect(asyncFrames.length, 10);
+    expect(awaiterFrames.length, 10);
+    expect(stack['truncated'], true);
+    verifyStack(frames, 10);
+  },
+// Invalid limit
+  (Isolate isolate) async {
+    try {
+      await isolate.getStack(limit: -1);
+      fail('Invalid parameter of -1 successful');
+    } on ServerRpcException {
+      // Expected.
+    }
+  }
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index df37cb9..5160f96 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(41));
+    expect(result['minor'], equals(42));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory_2/tests/service_2/network_profiling_test.dart b/runtime/observatory_2/tests/service_2/network_profiling_test.dart
index 5c27795..8ba995f 100644
--- a/runtime/observatory_2/tests/service_2/network_profiling_test.dart
+++ b/runtime/observatory_2/tests/service_2/network_profiling_test.dart
@@ -56,11 +56,14 @@
   postEvent('socketTest', {'socket': 'test'});
 }
 
-Future<void> checkFinishEvent(ServiceEvent event) {
+bool checkFinishEvent(ServiceEvent event) {
   expect(event.kind, equals(ServiceEvent.kExtension));
-  expect(event.extensionKind, equals('socketTest'));
+  if (event.extensionKind != 'socketTest') {
+    return false;
+  }
   expect(event.extensionData, isA<Map>());
   expect(event.extensionData['socket'], equals('test'));
+  return true;
 }
 
 var tests = <IsolateTest>[
@@ -102,9 +105,10 @@
     var sub;
     sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
         (ServiceEvent event) {
-      checkFinishEvent(event);
-      sub.cancel();
-      completer.complete();
+      if (checkFinishEvent(event)) {
+        sub.cancel();
+        completer.complete();
+      }
     });
 
     dynamic result = await isolate.invokeRpc("invoke",
@@ -150,9 +154,10 @@
       completer = Completer();
       sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
           (ServiceEvent event) {
-        checkFinishEvent(event);
-        sub.cancel();
-        completer.complete();
+        if (checkFinishEvent(event)) {
+          sub.cancel();
+          completer.complete();
+        }
       });
       dynamic result = await isolate.invokeRpc("invoke",
           {"targetId": lib.id, "selector": "socketTest", "argumentIds": []});
@@ -197,9 +202,10 @@
     var sub;
     sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
         (ServiceEvent event) {
-      checkFinishEvent(event);
-      sub.cancel();
-      completer.complete();
+      if (checkFinishEvent(event)) {
+        sub.cancel();
+        completer.complete();
+      }
     });
 
     dynamic result = await isolate.invokeRpc("invoke",
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 05e62eb..3a626ba 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -248,7 +248,8 @@
   if (IsPrivate(name)) {
     kind = CanonicalNameParent(kind);
   }
-  return StringEquals(CanonicalNameString(kind), "@fields");
+  return StringEquals(CanonicalNameString(kind), "@fields") ||
+         StringEquals(CanonicalNameString(kind), "@=fields");
 }
 
 bool TranslationHelper::IsConstructor(NameIndex name) {
@@ -992,9 +993,14 @@
       if (++next_read_ == field) return;
     }
       FALL_THROUGH;
-    case kCanonicalName:
-      canonical_name_ =
-          helper_->ReadCanonicalNameReference();  // read canonical_name.
+    case kCanonicalNameGetter:
+      canonical_name_getter_ =
+          helper_->ReadCanonicalNameReference();  // read canonical_name_getter.
+      if (++next_read_ == field) return;
+      FALL_THROUGH;
+    case kCanonicalNameSetter:
+      canonical_name_setter_ =
+          helper_->ReadCanonicalNameReference();  // read canonical_name_setter.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kSourceUriIndex:
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index ed347e5..d725cf7 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -438,7 +438,8 @@
  public:
   enum Field {
     kStart,  // tag.
-    kCanonicalName,
+    kCanonicalNameGetter,
+    kCanonicalNameSetter,
     kSourceUriIndex,
     kPosition,
     kEndPosition,
@@ -484,7 +485,8 @@
   bool IsLate() const { return (flags_ & kIsLate) != 0; }
   bool IsExtensionMember() const { return (flags_ & kExtensionMember) != 0; }
 
-  NameIndex canonical_name_;
+  NameIndex canonical_name_getter_;
+  NameIndex canonical_name_setter_;
   TokenPosition position_;
   TokenPosition end_position_;
   uint32_t flags_ = 0;
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 1625ce1..7d5e9c5 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 49;
-static const uint32_t kMaxSupportedKernelFormatVersion = 49;
+static const uint32_t kMinSupportedKernelFormatVersion = 50;
+static const uint32_t kMaxSupportedKernelFormatVersion = 50;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 4f977cc..bd42689 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -2196,7 +2196,8 @@
   }
   ASSERT(field.NeedsGetter());
 
-  const String& getter_name = H.DartGetterName(field_helper->canonical_name_);
+  const String& getter_name =
+      H.DartGetterName(field_helper->canonical_name_getter_);
   const Object& script_class =
       ClassForScriptAt(klass, field_helper->source_uri_index_);
   Function& getter = Function::ZoneHandle(
@@ -2229,7 +2230,8 @@
   if (field.NeedsSetter()) {
     // Only static fields can be const.
     ASSERT(!field_helper->IsConst());
-    const String& setter_name = H.DartSetterName(field_helper->canonical_name_);
+    const String& setter_name =
+        H.DartSetterName(field_helper->canonical_name_setter_);
     Function& setter = Function::ZoneHandle(
         Z, Function::New(setter_name, FunctionLayout::kImplicitSetter,
                          field_helper->IsStatic(),
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index ab78015..b207114 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -12,6 +12,7 @@
 #include "platform/globals.h"
 
 #include "platform/unicode.h"
+#include "platform/utils.h"
 #include "vm/base64.h"
 #include "vm/canonical_tables.h"
 #include "vm/compiler/jit/compiler.h"
@@ -1526,6 +1527,7 @@
 
 static const MethodParameter* get_stack_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
+    new UIntParameter("limit", false),
     NULL,
 };
 
@@ -1533,7 +1535,15 @@
   if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
-
+  intptr_t limit = 0;
+  bool has_limit = js->HasParam("limit");
+  if (has_limit) {
+    limit = UIntParameter::Parse(js->LookupParam("limit"));
+    if (limit < 0) {
+      PrintInvalidParamError(js, "limit");
+      return true;
+    }
+  }
   Isolate* isolate = thread->isolate();
   DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
   DebuggerStackTrace* async_causal_stack =
@@ -1546,7 +1556,9 @@
   {
     JSONArray jsarr(&jsobj, "frames");
 
-    intptr_t num_frames = stack->Length();
+    intptr_t num_frames =
+        has_limit ? Utils::Minimum(stack->Length(), limit) : stack->Length();
+
     for (intptr_t i = 0; i < num_frames; i++) {
       ActivationFrame* frame = stack->FrameAt(i);
       JSONObject jsobj(&jsarr);
@@ -1557,7 +1569,9 @@
 
   if (async_causal_stack != NULL) {
     JSONArray jsarr(&jsobj, "asyncCausalFrames");
-    intptr_t num_frames = async_causal_stack->Length();
+    intptr_t num_frames =
+        has_limit ? Utils::Minimum(async_causal_stack->Length(), limit)
+                  : async_causal_stack->Length();
     for (intptr_t i = 0; i < num_frames; i++) {
       ActivationFrame* frame = async_causal_stack->FrameAt(i);
       JSONObject jsobj(&jsarr);
@@ -1568,7 +1582,9 @@
 
   if (awaiter_stack != NULL) {
     JSONArray jsarr(&jsobj, "awaiterFrames");
-    intptr_t num_frames = awaiter_stack->Length();
+    intptr_t num_frames = has_limit
+                              ? Utils::Minimum(awaiter_stack->Length(), limit)
+                              : awaiter_stack->Length();
     for (intptr_t i = 0; i < num_frames; i++) {
       ActivationFrame* frame = awaiter_stack->FrameAt(i);
       JSONObject jsobj(&jsarr);
@@ -1577,6 +1593,14 @@
     }
   }
 
+  const bool truncated =
+      (has_limit &&
+       (limit < stack->Length() ||
+        (async_causal_stack != nullptr &&
+         limit < async_causal_stack->Length()) ||
+        (awaiter_stack != nullptr && limit < awaiter_stack->Length())));
+  jsobj.AddProperty("truncated", truncated);
+
   {
     MessageHandler::AcquiredQueues aq(isolate->message_handler());
     jsobj.AddProperty("messages", aq.queue());
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 9d09af1..f66a951 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 41
+#define SERVICE_PROTOCOL_MINOR_VERSION 42
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 6fe2fb8..281b4ba4 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.41
+# Dart VM Service Protocol 3.42
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.41_ of the Dart VM Service Protocol. This
+This document describes of _version 3.42_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -995,12 +995,17 @@
 ### getStack
 
 ```
-Stack|Sentinel getStack(string isolateId)
+Stack|Sentinel getStack(string isolateId, int limit [optional])
 ```
 
 The _getStack_ RPC is used to retrieve the current execution stack and
 message queue for an isolate. The isolate does not need to be paused.
 
+If _limit_ is provided, up to _limit_ frames from the top of the stack will be
+returned. If the stack depth is smaller than _limit_ the entire stack is
+returned. Note: this limit also applies to the `asyncCausalFrames` and
+`awaiterFrames` stack representations in the _Stack_ response.
+
 If _isolateId_ refers to an isolate which has exited, then the
 _Collected_ [Sentinel](#sentinel) is returned.
 
@@ -3646,13 +3651,33 @@
 
 ```
 class Stack extends Response {
+  // A list of frames that make up the synchronous stack, rooted at the message
+  // loop (i.e., the frames since the last asynchronous gap or the isolate's
+  // entrypoint).
   Frame[] frames;
+
+  // A list of frames representing the asynchronous path. Comparable to
+  // `awaiterFrames`, if provided, although some frames may be different.
   Frame[] asyncCausalFrames [optional];
+
+  // A list of frames representing the asynchronous path. Comparable to
+  // `asyncCausalFrames`, if provided, although some frames may be different.
   Frame[] awaiterFrames [optional];
+
+  // A list of messages in the isolate's message queue.
   Message[] messages;
+
+  // Specifies whether or not this stack is complete or has been artificially
+  // truncated.
+  bool truncated;
 }
 ```
 
+The _Stack_ class represents the various components of a Dart stack trace for a
+given isolate.
+
+See [getStack](#getStack).
+
 ### ExceptionPauseMode
 
 ```
@@ -3921,5 +3946,6 @@
 3.39 | Removed the following deprecated RPCs and objects: `getClientName`, `getWebSocketTarget`, `setClientName`, `requireResumeApproval`, `ClientName`, and `WebSocketTarget`.
 3.40 | Added `IsolateFlag` object and `isolateFlags` property to `Isolate`.
 3.41 | Added `PortList` object, `ReceivePort` `InstanceKind`, and `getPorts` RPC.
+3.42 | Added `limit` optional parameter to `getStack` RPC.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/tools/VERSION b/tools/VERSION
index 86ee304..ead15d6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 16
+PRERELEASE 17
 PRERELEASE_PATCH 0
\ No newline at end of file