diff --git a/DEPS b/DEPS
index 973a186..7c82485 100644
--- a/DEPS
+++ b/DEPS
@@ -142,7 +142,7 @@
   "source_map_stack_trace_rev": "1c3026f69d9771acf2f8c176a1ab750463309cce",
   "source_maps-0.9.4_rev": "38524",
   "source_maps_rev": "53eb92ccfe6e64924054f83038a534b959b12b3e",
-  "source_span_rev": "94833d6cbf4552ebe5d2aa6714acecd93834e53a",
+  "source_span_rev": "cc7c4288a83f71ecef3414199947b52a8c112c65",
   "sse_tag": "e5cf68975e8e87171a3dc297577aa073454a91dc",
   "stack_trace_tag": "d3813ca0a77348e0faf0d6af0cc17913e36afa39",
   "stagehand_tag": "v3.3.9",
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/data/for.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/data/for.dart
index 35a845a..f9d2545 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/data/for.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/data/for.dart
@@ -23,7 +23,7 @@
   }
 }
 
-/*member: forEachWithDeclaration:declared={a, b, c}, assigned={a, b, c}*/
+/*member: forEachWithDeclaration:declared={a, b, c}, assigned={a, b}*/
 forEachWithDeclaration(int a, int b) {
   /*assigned={b}*/ for (var c in [a = 0]) {
     b = 0;
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/data/for_element.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/data/for_element.dart
index 86b2e15..8259c35 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/data/for_element.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables/data/for_element.dart
@@ -19,7 +19,7 @@
   ];
 }
 
-/*member: forEachWithDeclaration:declared={a, b, c}, assigned={a, b, c}*/
+/*member: forEachWithDeclaration:declared={a, b, c}, assigned={a, b}*/
 forEachWithDeclaration(int a, int b) {
   [
     /*assigned={b}*/ for (var c in [a = 0]) (b = 0)
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/bug43136.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/bug43136.dart
new file mode 100644
index 0000000..297392b
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/bug43136.dart
@@ -0,0 +1,13 @@
+// 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.
+
+List<int Function()> f(List<num> nums) {
+  List<int Function()> result = [];
+  for (var n in nums) {
+    if (n is int) {
+      result.add(() => /*int*/ n);
+    }
+  }
+  return result;
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 6583dcd..cc05f18 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -786,7 +786,8 @@
   void suggestNamedArgument(ParameterElement parameter,
       {@required bool appendColon, @required bool appendComma}) {
     var name = parameter.name;
-    var type = parameter.type?.getDisplayString(withNullability: false);
+    var type = parameter.type?.getDisplayString(
+        withNullability: request.libraryElement.isNonNullableByDefault);
 
     var completion = name;
     if (appendColon) {
@@ -1286,7 +1287,8 @@
         var paramType = parameter.type;
         // Gracefully degrade if type not resolved yet
         return paramType != null
-            ? paramType.getDisplayString(withNullability: false)
+            ? paramType.getDisplayString(
+                withNullability: request.libraryElement.isNonNullableByDefault)
             : 'var';
       }).toList();
 
diff --git a/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart b/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart
index 8316e43..3be9cd3 100644
--- a/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart
@@ -115,6 +115,8 @@
     } else if (type is InterfaceType) {
       Element element = type.element;
       if (element == null || element.isSynthetic) {
+        assert(false, "untested branch may print nullable types wrong");
+        // TODO: test this, use the the library's nullability (not tracked yet).
         buffer.write(type.getDisplayString(withNullability: false));
       } else {
 //        String uri = element.library.source.uri.toString();
@@ -132,7 +134,9 @@
         }
       }
     } else {
-      // Handle `void` and `dynamic`.
+      // Handle `void` and `dynamic`. Nullability doesn't affect this.
+      assert(type.getDisplayString(withNullability: false) ==
+          type.getDisplayString(withNullability: true));
       buffer.write(type.getDisplayString(withNullability: false));
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
index e40be74..7ff448e 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
@@ -23,19 +23,18 @@
   final String extendedType;
 
   /// The value extractor used to compute the value of the type argument.
-  final ValueExtractor value;
+  final ValueExtractor argumentValue;
 
   /// Initialize a newly created change to describe adding a type parameter to a
   /// type or a function.
-  // TODO(brianwilkerson) Support adding multiple type parameters.
   AddTypeParameter(
       {@required this.index,
       @required this.name,
-      @required this.value,
+      @required this.argumentValue,
       this.extendedType})
       : assert(index >= 0),
         assert(name != null),
-        assert(value != null);
+        assert(argumentValue != null);
 
   @override
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
@@ -54,7 +53,7 @@
     if (node is NamedType) {
       // wrong_number_of_type_arguments
       // wrong_number_of_type_arguments_constructor
-      var argument = value.from(node, fix.utils);
+      var argument = argumentValue.from(node, fix.utils);
       if (argument == null) {
         return null;
       }
@@ -67,7 +66,7 @@
     var parent = node.parent;
     if (parent is InvocationExpression) {
       // wrong_number_of_type_arguments_method
-      var argument = value.from(parent, fix.utils);
+      var argument = argumentValue.from(parent, fix.utils);
       if (argument == null) {
         return null;
       }
@@ -86,7 +85,7 @@
       return _TypeParameterData(typeParameters, parent.name.end);
     } else if (node is TypeArgumentList && parent is ExtensionOverride) {
       // wrong_number_of_type_arguments_extension
-      var argument = value.from(node, fix.utils);
+      var argument = argumentValue.from(node, fix.utils);
       if (argument == null) {
         return null;
       }
@@ -120,6 +119,8 @@
 
   void _applyToTypeParameters(
       DartFileEditBuilder builder, _TypeParameterData data) {
+    // TODO(brianwilkerson) Define a `bound` to use in the declaration of the
+    //  parameter.
     var argumentValue =
         extendedType == null ? name : '$name extends $extendedType';
     var typeParameters = data.typeParameters;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index b34c637..0175537 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -61,7 +61,6 @@
   static const String _transformsKey = 'transforms';
   static const String _typedefKey = 'typedef';
   static const String _urisKey = 'uris';
-  static const String _valueKey = 'value';
   static const String _versionKey = 'version';
 
   /// A table mapping top-level keys for member elements to the list of keys for
@@ -261,18 +260,24 @@
   /// add-type-parameter change.
   AddTypeParameter _translateAddTypeParameterChange(YamlMap node) {
     _reportUnsupportedKeys(
-        node, const {_indexKey, _kindKey, _nameKey, _valueKey});
+        node, const {_indexKey, _kindKey, _nameKey, _argumentValueKey});
     var index = _translateInteger(node.valueAt(_indexKey),
         ErrorContext(key: _indexKey, parentNode: node));
     var name = _translateString(
         node.valueAt(_nameKey), ErrorContext(key: _nameKey, parentNode: node));
-    var value = _translateValueExtractor(node.valueAt(_valueKey),
-        ErrorContext(key: _valueKey, parentNode: node));
-    if (index == null || name == null || value == null) {
+    // TODO(brianwilkerson) In order to support adding multiple type parameters
+    //  we might need to introduce a `TypeParameterModification` change, similar
+    //  to `ParameterModification`. That becomes more likely if we add support
+    //  for removing type parameters.
+    var argumentValue = _translateValueExtractor(
+        node.valueAt(_argumentValueKey),
+        ErrorContext(key: _argumentValueKey, parentNode: node));
+    if (index == null || name == null || argumentValue == null) {
       // The error has already been reported.
       return null;
     }
-    return AddTypeParameter(index: index, name: name, value: value);
+    return AddTypeParameter(
+        index: index, name: name, argumentValue: argumentValue);
   }
 
   /// Translate the [node] into a value extractor. Return the resulting
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index e8ae0d7..197842e 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -1077,6 +1078,50 @@
     assertNoSuggestions();
   }
 
+  Future<void> test_ArgumentList_nnbd_function_named_param() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    addTestSource(r'''
+f({int? nullable, int nonnullable}) {}
+main() { f(^);}');
+''');
+    await computeSuggestions();
+    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
+      'nullable': 'int?',
+      'nonnullable': 'int',
+    });
+  }
+
+  Future<void> test_ArgumentList_nnbd_function_named_param_imported() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    addSource('/home/test/lib/a.dart', '''
+f({int? nullable, int nonnullable}) {}''');
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    addTestSource(r'''
+import "a.dart";
+main() { f(^);}');
+''');
+    await computeSuggestions();
+    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
+      'nullable': 'int?',
+      'nonnullable': 'int',
+    });
+  }
+
+  Future<void> test_ArgumentList_nnbd_function_named_param_legacy() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    addSource('/home/test/lib/a.dart', '''
+// @dart = 2.8
+f({int named}) {}''');
+    addTestSource(r'''
+import "a.dart";
+main() { f(^);}');
+''');
+    await computeSuggestions();
+    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
+      'named': 'int*',
+    });
+  }
+
   Future<void> test_superConstructorInvocation() async {
     addTestSource('''
 class A {
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index 7e7ce51..1ae4849 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -2302,6 +2303,69 @@
     expect(suggestion.hasNamedParameters, true);
   }
 
+  Future<void> test_function_parameters_nnbd_required() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+void m(int? nullable, int nonNullable) {}
+''');
+    addTestSource('''
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'nullable');
+    expect(suggestion.parameterTypes[0], 'int?');
+    expect(suggestion.parameterNames[1], 'nonNullable');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  Future<void> test_function_parameters_nnbd_required_into_legacy() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+void m(int? nullable, int nonNullable) {}
+''');
+    addTestSource('''
+// @dart = 2.8
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'nullable');
+    expect(suggestion.parameterTypes[0], 'int');
+    expect(suggestion.parameterNames[1], 'nonNullable');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  Future<void> test_function_parameters_nnbd_required_legacy() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+// @dart = 2.8
+void m(int param) {}
+''');
+    addTestSource('''
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(1));
+    expect(suggestion.parameterNames[0], 'param');
+    expect(suggestion.parameterTypes[0], 'int*');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
   Future<void> test_function_parameters_none() async {
     resolveSource('/home/test/lib/a.dart', '''
 void m() {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
index 5a29c7a..3ac8426 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
@@ -468,6 +468,6 @@
                 extendedType: extendedType,
                 index: index,
                 name: 'T',
-                value: LiteralExtractor('String')),
+                argumentValue: LiteralExtractor('String')),
           ]);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_test.dart
index 40aa4d0..1bd6446 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_test.dart
@@ -152,9 +152,9 @@
     - kind: 'addTypeParameter'
       index: 1
       name: 'T'
-      value: 'int'
+      argumentValue: 'int'
 ''', [
-      error(TransformSetErrorCode.invalidValue, 198, 5),
+      error(TransformSetErrorCode.invalidValue, 206, 5),
     ]);
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
index 8080470..148f8a4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
@@ -97,6 +97,24 @@
     ]);
   }
 
+  void test_addTypeParameterChange_argumentValue() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['test.dart']
+    function: 'f'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 0
+      name: 'a'
+''', [
+      error(TransformSetErrorCode.missingKey, 124, 56),
+    ]);
+  }
+
   void test_addTypeParameterChange_index() {
     assertErrors('''
 version: 1
@@ -109,11 +127,11 @@
   changes:
     - kind: 'addTypeParameter'
       name: 'a'
-      value:
+      argumentValue:
         kind: 'argument'
         index: 0
 ''', [
-      error(TransformSetErrorCode.missingKey, 124, 96),
+      error(TransformSetErrorCode.missingKey, 124, 104),
     ]);
   }
 
@@ -129,29 +147,11 @@
   changes:
     - kind: 'addTypeParameter'
       index: 0
-      value:
+      argumentValue:
         kind: 'argument'
         index: 0
 ''', [
-      error(TransformSetErrorCode.missingKey, 124, 95),
-    ]);
-  }
-
-  void test_addTypeParameterChange_value() {
-    assertErrors('''
-version: 1
-transforms:
-- title: ''
-  date: 2020-09-14
-  element:
-    uris: ['test.dart']
-    function: 'f'
-  changes:
-    - kind: 'addTypeParameter'
-      index: 0
-      name: 'a'
-''', [
-      error(TransformSetErrorCode.missingKey, 124, 56),
+      error(TransformSetErrorCode.missingKey, 124, 103),
     ]);
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart
index 36e1c68..0608b29 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart
@@ -74,7 +74,7 @@
     - kind: 'addTypeParameter'
       index: 1
       name: 'T'
-      value:
+      argumentValue:
         kind: 'argument'
         index: 0
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
index 16dc6a9..e944316 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
@@ -174,7 +174,7 @@
     - kind: 'addTypeParameter'
       index: 0
       name: 'T'
-      value:
+      argumentValue:
         kind: 'argument'
         name: 'p'
 ''');
@@ -186,7 +186,7 @@
     var change = transform.changes[0] as AddTypeParameter;
     expect(change.index, 0);
     expect(change.name, 'T');
-    var value = change.value as ArgumentExtractor;
+    var value = change.argumentValue as ArgumentExtractor;
     var parameter = value.parameter as NamedParameterReference;
     expect(parameter.name, 'p');
   }
@@ -205,7 +205,7 @@
     - kind: 'addTypeParameter'
       index: 0
       name: 'T'
-      value:
+      argumentValue:
         kind: 'argument'
         index: 2
 ''');
@@ -217,7 +217,7 @@
     var change = transform.changes[0] as AddTypeParameter;
     expect(change.index, 0);
     expect(change.name, 'T');
-    var value = change.value as ArgumentExtractor;
+    var value = change.argumentValue as ArgumentExtractor;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 2);
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
index 915f509..be06c78 100644
--- a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
@@ -576,7 +576,6 @@
       } else if (forLoopParts is ForEachPartsWithDeclaration) {
         var variable = forLoopParts.loopVariable.declaredElement;
         assignedVariables.declare(variable);
-        assignedVariables.write(variable);
       } else {
         throw StateError('Unrecognized for loop parts');
       }
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index 41f0901..2ed2c66 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -85,11 +85,10 @@
     orElse: () => null,
   );
   if (launchDdsArg != null) {
-    // TODO(bkonyi): uncomment after 2.10 branch.
-    // RunCommand.launchDds = true;
-    // final ddsUrl = (launchDdsArg.split('=')[1]).split(':');
-    // RunCommand.ddsHost = ddsUrl[0];
-    // RunCommand.ddsPort = ddsUrl[1];
+    RunCommand.launchDds = true;
+    final ddsUrl = (launchDdsArg.split('=')[1]).split(':');
+    RunCommand.ddsHost = ddsUrl[0];
+    RunCommand.ddsPort = ddsUrl[1];
   }
 
   String commandName;
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 8a9fa88..96029ef 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -820,19 +820,34 @@
       return base;
     }
 
+    /// Returns the "actual" superclass of [c].
+    ///
+    /// Walks up the superclass chain looking for the first actual class
+    /// skipping any synthetic classes inserted by the CFE.
+    Class superClassAsWritten(Class c) {
+      var superclass = c.superclass;
+      while (superclass.isAnonymousMixin) {
+        superclass = superclass.superclass;
+      }
+      return superclass;
+    }
+
     // Find the real (user declared) superclass and the list of mixins.
     // We'll use this to unroll the intermediate classes.
     //
     // TODO(jmesserly): consider using Kernel's mixin unrolling.
-    var mixinClasses = <Class>[];
-    var superclass = getSuperclassAndMixins(c, mixinClasses);
+    var superclass = superClassAsWritten(c);
     var supertype = identical(c.superclass, superclass)
         ? c.supertype.asInterfaceType
         : _hierarchy.getClassAsInstanceOf(c, superclass).asInterfaceType;
-    mixinClasses = mixinClasses.reversed.toList();
-    var mixins = mixinClasses
-        .map((m) => _hierarchy.getClassAsInstanceOf(c, m).asInterfaceType)
-        .toList();
+    // All mixins (real and anonymous) classes applied to c.
+    var mixinApplications = [
+      if (c.mixedInClass != null) c.mixedInClass,
+      for (var sc = c.superclass;
+          sc.isAnonymousMixin && sc.mixedInClass != null;
+          sc = sc.superclass)
+        sc,
+    ].reversed.toList();
 
     var hasUnnamedSuper = _hasUnnamedInheritedConstructor(superclass);
 
@@ -873,7 +888,7 @@
 
     if (shouldDefer(supertype)) {
       deferredSupertypes.add(runtimeStatement('setBaseClass(#, #)', [
-        getBaseClass(isMixinAliasClass(c) ? 0 : mixins.length),
+        getBaseClass(isMixinAliasClass(c) ? 0 : mixinApplications.length),
         emitDeferredType(supertype),
       ]));
       // Refers to 'supertype' without any type arguments.
@@ -924,29 +939,43 @@
     // classes lack required synthetic members, such as constructors.
     //
     // Also, we need to generate one extra level of nesting for alias classes.
-    for (var i = 0; i < mixins.length; i++) {
-      var m = mixins[i];
+    for (var i = 0; i < mixinApplications.length; i++) {
+      var m = mixinApplications[i];
+      var mixinClass = m.isAnonymousMixin ? m.mixedInClass : m;
+      var mixinType =
+          _hierarchy.getClassAsInstanceOf(c, mixinClass).asInterfaceType;
       var mixinName =
-          getLocalClassName(superclass) + '_' + getLocalClassName(m.classNode);
+          getLocalClassName(superclass) + '_' + getLocalClassName(mixinClass);
       var mixinId = _emitTemporaryId(mixinName + '\$');
+      // Collect all forwarding stubs from anonymous mixins classes. These will
+      // contain covariant parameter checks that need to be applied.
+      var forwardingMethodStubs = [
+        for (var procedure in m.procedures)
+          if (procedure.isForwardingStub && !procedure.isAbstract)
+            _emitMethodDeclaration(procedure)
+      ];
+
       // Bind the mixin class to a name to workaround a V8 bug with es6 classes
       // and anonymous function names.
       // TODO(leafp:) Eliminate this once the bug is fixed:
       // https://bugs.chromium.org/p/v8/issues/detail?id=7069
       body.add(js.statement('const # = #', [
         mixinId,
-        js_ast.ClassExpression(_emitTemporaryId(mixinName), baseClass, [])
+        js_ast.ClassExpression(
+            _emitTemporaryId(mixinName), baseClass, forwardingMethodStubs)
       ]));
 
-      emitMixinConstructors(mixinId, m);
-      hasUnnamedSuper = hasUnnamedSuper || _hasUnnamedConstructor(m.classNode);
+      emitMixinConstructors(mixinId, mixinType);
+      hasUnnamedSuper = hasUnnamedSuper || _hasUnnamedConstructor(mixinClass);
 
-      if (shouldDefer(m)) {
-        deferredSupertypes.add(runtimeStatement('applyMixin(#, #)',
-            [getBaseClass(mixins.length - i), emitDeferredType(m)]));
+      if (shouldDefer(mixinType)) {
+        deferredSupertypes.add(runtimeStatement('applyMixin(#, #)', [
+          getBaseClass(mixinApplications.length - i),
+          emitDeferredType(mixinType)
+        ]));
       } else {
-        body.add(
-            runtimeStatement('applyMixin(#, #)', [mixinId, emitClassRef(m)]));
+        body.add(runtimeStatement(
+            'applyMixin(#, #)', [mixinId, emitClassRef(mixinType)]));
       }
 
       baseClass = mixinId;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index f643d50..b009d4a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -5053,7 +5053,6 @@
       // reported by the parser.
       lvalue.isLate = false;
       elements.explicitVariableDeclaration = lvalue;
-      typeInferrer?.assignedVariables?.write(lvalue);
       if (lvalue.isConst) {
         elements.expressionProblem = buildProblem(
             fasta.messageForInLoopWithConstVariable,
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index 3ebeaee..7e6f18d 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -448,13 +448,24 @@
         // option. Use it as a test selector pattern.
         var patterns = options.putIfAbsent("selectors", () => <String>[]);
 
+        var allSuiteDirectories = [
+          ...testSuiteDirectories,
+          "tests/co19",
+          "tests/co19_2",
+        ];
         // Allow passing in the full relative path to a test or directory and
         // infer the selector from it. This lets users use tab completion on
         // the command line.
-        for (var suiteDirectory in testSuiteDirectories) {
+        for (var suiteDirectory in allSuiteDirectories) {
           var path = suiteDirectory.toString();
           if (arg.startsWith("$path/") || arg.startsWith("$path\\")) {
             arg = arg.substring(path.lastIndexOf("/") + 1);
+
+            // Remove the `src/` subdirectories from the co19 and co19_2
+            // directories that do not appear in the test names.
+            if (arg.startsWith("co19")) {
+              arg = arg.replaceFirst(RegExp("src[/\]"), "");
+            }
             break;
           }
         }
diff --git a/pkg/wasm/lib/src/function.dart b/pkg/wasm/lib/src/function.dart
index c138e48..4ac694e 100644
--- a/pkg/wasm/lib/src/function.dart
+++ b/pkg/wasm/lib/src/function.dart
@@ -16,9 +16,9 @@
   Pointer<WasmerValue> _args;
   Pointer<WasmerValue> _result;
 
-  WasmFunction(this._name, this._func, this._argTypes, this._returnType) {
-    _args = allocate<WasmerValue>(count: _argTypes.length);
-    _result = allocate<WasmerValue>();
+  WasmFunction(this._name, this._func, this._argTypes, this._returnType)
+      : _args = allocate<WasmerValue>(count: _argTypes.length),
+        _result = allocate<WasmerValue>() {
     for (var i = 0; i < _argTypes.length; ++i) {
       _args[i].tag = _argTypes[i];
     }
@@ -43,6 +43,7 @@
         _args[i].f64 = arg;
         return true;
     }
+    return false;
   }
 
   dynamic apply(List<dynamic> args) {
diff --git a/pkg/wasm/lib/src/module.dart b/pkg/wasm/lib/src/module.dart
index d8ed0d9..4013966 100644
--- a/pkg/wasm/lib/src/module.dart
+++ b/pkg/wasm/lib/src/module.dart
@@ -14,9 +14,7 @@
   Pointer<WasmerModule> _module;
 
   /// Compile a module.
-  WasmModule(Uint8List data) {
-    _module = WasmRuntime().compile(data);
-  }
+  WasmModule(Uint8List data) : _module = WasmRuntime().compile(data) {}
 
   /// Instantiate the module with the given imports.
   WasmInstance instantiate(WasmImports imports) {
@@ -49,9 +47,9 @@
   int _length;
 
   /// Create an imports object.
-  WasmImports([this._capacity = 4]) : _length = 0 {
-    _imports = allocate<WasmerImport>(count: this._capacity);
-  }
+  WasmImports([this._capacity = 4])
+      : _imports = allocate<WasmerImport>(count: _capacity),
+        _length = 0 {}
 
   /// Returns the number of imports.
   int get length => _length;
@@ -61,12 +59,13 @@
 class WasmInstance {
   Pointer<WasmerModule> _module;
   Pointer<WasmerInstance> _instance;
-  Map<String, WasmFunction> _functions;
+  Pointer<WasmerMemory>? _exportedMemory;
+  Map<String, WasmFunction> _functions = {};
 
-  WasmInstance(this._module, WasmImports imports) {
+  WasmInstance(this._module, WasmImports imports)
+      : _instance = WasmRuntime()
+            .instantiate(_module, imports._imports, imports.length) {
     var runtime = WasmRuntime();
-    _instance = runtime.instantiate(_module, imports._imports, imports.length);
-    _functions = {};
     var exps = runtime.exports(_instance);
     for (var e in exps) {
       var kind = runtime.exportKind(e);
@@ -75,6 +74,9 @@
         var f = runtime.exportToFunction(e);
         _functions[name] = WasmFunction(
             name, f, runtime.getArgTypes(f), runtime.getReturnType(f));
+      } else if (kind == WasmerImpExpKindMemory) {
+        // WASM currently allows only one memory per module.
+        _exportedMemory = runtime.exportToMemory(e);
       }
     }
   }
@@ -84,4 +86,55 @@
   dynamic lookupFunction(String name) {
     return _functions[name];
   }
+
+  /// Returns the memory exported from this instance.
+  WasmMemory get memory {
+    if (_exportedMemory == null) {
+      throw Exception("Wasm module did not export its memory.");
+    }
+    return WasmMemory._fromExport(_exportedMemory as Pointer<WasmerMemory>);
+  }
+}
+
+/// WasmMemory contains the memory of a WasmInstance.
+class WasmMemory {
+  Pointer<WasmerMemory> _mem;
+  late Uint8List _view;
+
+  WasmMemory._fromExport(this._mem) {
+    _view = WasmRuntime().memoryView(_mem);
+  }
+
+  /// Create a new memory with the given number of initial pages, and optional
+  /// maximum number of pages.
+  WasmMemory(int pages, [int? maxPages])
+      : _mem = WasmRuntime().newMemory(pages, maxPages) {
+    _view = WasmRuntime().memoryView(_mem);
+  }
+
+  /// The WASM spec defines the page size as 64KiB.
+  static const int kPageSizeInBytes = 64 * 1024;
+
+  /// Returns the length of the memory in pages.
+  int get lengthInPages {
+    return WasmRuntime().memoryLength(_mem);
+  }
+
+  /// Returns the length of the memory in bytes.
+  int get lengthInBytes => _view.lengthInBytes;
+
+  /// Returns the byte at the given index.
+  int operator [](int index) => _view[index];
+
+  /// Sets the byte at the given index to value.
+  void operator []=(int index, int value) {
+    _view[index] = value;
+  }
+
+  /// Grow the memory by deltaPages.
+  void grow(int deltaPages) {
+    var runtime = WasmRuntime();
+    runtime.growMemory(_mem, deltaPages);
+    _view = runtime.memoryView(_mem);
+  }
 }
diff --git a/pkg/wasm/lib/src/runtime.dart b/pkg/wasm/lib/src/runtime.dart
index 6c8759a..4ddec1d 100644
--- a/pkg/wasm/lib/src/runtime.dart
+++ b/pkg/wasm/lib/src/runtime.dart
@@ -24,41 +24,47 @@
 }
 
 class WasmRuntime {
-  static WasmRuntime _inst;
+  static WasmRuntime? _inst;
 
   DynamicLibrary _lib;
-  WasmerCompileFn _compile;
-  WasmerInstantiateFn _instantiate;
-  WasmerInstanceExportsFn _instance_exports;
-  WasmerExportsLenFn _exports_len;
-  WasmerExportsGetFn _exports_get;
-  WasmerExportKindFn _export_kind;
-  WasmerExportToFuncFn _export_to_func;
-  WasmerExportFuncReturnsArityFn _export_func_returns_arity;
-  WasmerExportFuncReturnsFn _export_func_returns;
-  WasmerExportFuncParamsArityFn _export_func_params_arity;
-  WasmerExportFuncParamsFn _export_func_params;
-  WasmerExportFuncCallFn _export_func_call;
-  WasmerExportNamePtrFn _export_name_ptr;
-  WasmerExportDescriptorsFn _export_descriptors;
-  WasmerExportDescriptorsDestroyFn _export_descriptors_destroy;
-  WasmerExportDescriptorsLenFn _export_descriptors_len;
-  WasmerExportDescriptorsGetFn _export_descriptors_get;
-  WasmerExportDescriptorKindFn _export_descriptor_kind;
-  WasmerExportDescriptorNamePtrFn _export_descriptor_name_ptr;
-  WasmerImportDescriptorModuleNamePtrFn _import_descriptor_module_name_ptr;
-  WasmerImportDescriptorNamePtrFn _import_descriptor_name_ptr;
-  WasmerImportDescriptorsFn _import_descriptors;
-  WasmerImportDescriptorsDestroyFn _import_descriptors_destroy;
-  WasmerImportDescriptorsLenFn _import_descriptors_len;
-  WasmerImportDescriptorsGetFn _import_descriptors_get;
-  WasmerImportDescriptorKindFn _import_descriptor_kind;
+  late WasmerCompileFn _compile;
+  late WasmerInstantiateFn _instantiate;
+  late WasmerInstanceExportsFn _instance_exports;
+  late WasmerExportsLenFn _exports_len;
+  late WasmerExportsGetFn _exports_get;
+  late WasmerExportKindFn _export_kind;
+  late WasmerExportToFuncFn _export_to_func;
+  late WasmerExportFuncReturnsArityFn _export_func_returns_arity;
+  late WasmerExportFuncReturnsFn _export_func_returns;
+  late WasmerExportFuncParamsArityFn _export_func_params_arity;
+  late WasmerExportFuncParamsFn _export_func_params;
+  late WasmerExportFuncCallFn _export_func_call;
+  late WasmerExportNamePtrFn _export_name_ptr;
+  late WasmerExportDescriptorsFn _export_descriptors;
+  late WasmerExportDescriptorsDestroyFn _export_descriptors_destroy;
+  late WasmerExportDescriptorsLenFn _export_descriptors_len;
+  late WasmerExportDescriptorsGetFn _export_descriptors_get;
+  late WasmerExportDescriptorKindFn _export_descriptor_kind;
+  late WasmerExportDescriptorNamePtrFn _export_descriptor_name_ptr;
+  late WasmerImportDescriptorModuleNamePtrFn _import_descriptor_module_name_ptr;
+  late WasmerImportDescriptorNamePtrFn _import_descriptor_name_ptr;
+  late WasmerImportDescriptorsFn _import_descriptors;
+  late WasmerImportDescriptorsDestroyFn _import_descriptors_destroy;
+  late WasmerImportDescriptorsLenFn _import_descriptors_len;
+  late WasmerImportDescriptorsGetFn _import_descriptors_get;
+  late WasmerImportDescriptorKindFn _import_descriptor_kind;
+  late WasmerExportToMemoryFn _export_to_memory;
+  late WasmerMemoryNewPtrFn _memory_new_ptr;
+  late WasmerMemoryGrowFn _memory_grow;
+  late WasmerMemoryLengthFn _memory_length;
+  late WasmerMemoryDataFn _memory_data;
+  late WasmerMemoryDataLengthFn _memory_data_length;
 
   factory WasmRuntime() {
     if (_inst == null) {
       _inst = WasmRuntime._init();
     }
-    return _inst;
+    return _inst as WasmRuntime;
   }
 
   static String _getLibName() {
@@ -96,9 +102,8 @@
     return commonLibDir;
   }
 
-  WasmRuntime._init() {
-    var libPath = path.join(_getLibDir(), _getLibName());
-    _lib = DynamicLibrary.open(libPath);
+  WasmRuntime._init()
+      : _lib = DynamicLibrary.open(path.join(_getLibDir(), _getLibName())) {
     _compile = _lib.lookupFunction<NativeWasmerCompileFn, WasmerCompileFn>(
         'wasmer_compile');
     _instantiate =
@@ -171,6 +176,22 @@
     _import_descriptor_name_ptr = _lib.lookupFunction<
         NativeWasmerImportDescriptorNamePtrFn,
         WasmerImportDescriptorNamePtrFn>('wasmer_import_descriptor_name_ptr');
+    _export_to_memory = _lib.lookupFunction<NativeWasmerExportToMemoryFn,
+        WasmerExportToMemoryFn>('wasmer_export_to_memory');
+    _memory_new_ptr =
+        _lib.lookupFunction<NativeWasmerMemoryNewPtrFn, WasmerMemoryNewPtrFn>(
+            'wasmer_memory_new_ptr');
+    _memory_grow =
+        _lib.lookupFunction<NativeWasmerMemoryGrowFn, WasmerMemoryGrowFn>(
+            'wasmer_memory_grow');
+    _memory_length =
+        _lib.lookupFunction<NativeWasmerMemoryLengthFn, WasmerMemoryLengthFn>(
+            'wasmer_memory_length');
+    _memory_data =
+        _lib.lookupFunction<NativeWasmerMemoryDataFn, WasmerMemoryDataFn>(
+            'wasmer_memory_data');
+    _memory_data_length = _lib.lookupFunction<NativeWasmerMemoryDataLengthFn,
+        WasmerMemoryDataLengthFn>('wasmer_memory_data_length');
   }
 
   Pointer<WasmerModule> compile(Uint8List data) {
@@ -331,4 +352,48 @@
       throw Exception("Failed to call WASM function");
     }
   }
+
+  Pointer<WasmerMemory> exportToMemory(Pointer<WasmerExport> export) {
+    var memPtrPtr = allocate<Pointer<WasmerMemory>>();
+    var result = _export_to_memory(export, memPtrPtr);
+    if (result != WasmerResultOk) {
+      free(memPtrPtr);
+      throw Exception("Failed to get exported memory");
+    }
+    Pointer<WasmerMemory> memPtr = memPtrPtr.value;
+    free(memPtrPtr);
+    return memPtr;
+  }
+
+  Pointer<WasmerMemory> newMemory(int pages, int? maxPages) {
+    var memPtrPtr = allocate<Pointer<WasmerMemory>>();
+    var limPtr = allocate<WasmerLimits>();
+    limPtr.ref.min = pages;
+    limPtr.ref.has_max = maxPages != null ? 1 : 0;
+    limPtr.ref.max = maxPages ?? 0;
+    var result = _memory_new_ptr(memPtrPtr, limPtr);
+    free(limPtr);
+    if (result != WasmerResultOk) {
+      free(memPtrPtr);
+      throw Exception("Failed to create memory");
+    }
+    Pointer<WasmerMemory> memPtr = memPtrPtr.value;
+    free(memPtrPtr);
+    return memPtr;
+  }
+
+  void growMemory(Pointer<WasmerMemory> memory, int deltaPages) {
+    var result = _memory_grow(memory, deltaPages);
+    if (result != WasmerResultOk) {
+      throw Exception("Failed to grow memory");
+    }
+  }
+
+  int memoryLength(Pointer<WasmerMemory> memory) {
+    return _memory_length(memory);
+  }
+
+  Uint8List memoryView(Pointer<WasmerMemory> memory) {
+    return _memory_data(memory).asTypedList(_memory_data_length(memory));
+  }
 }
diff --git a/pkg/wasm/lib/src/wasmer_api.dart b/pkg/wasm/lib/src/wasmer_api.dart
index 2f54b53..94dd651 100644
--- a/pkg/wasm/lib/src/wasmer_api.dart
+++ b/pkg/wasm/lib/src/wasmer_api.dart
@@ -67,34 +67,37 @@
 // wasmer_import_descriptor_t
 class WasmerImportDescriptor extends Struct {}
 
+// wasmer_memory_t
+class WasmerMemory extends Struct {}
+
 // wasmer_import_t
 class WasmerImport extends Struct {
-  Pointer<Uint8> module_name;
+  external Pointer<Uint8> module_name;
 
   @Uint32()
-  int module_name_length;
+  external int module_name_length;
 
-  Pointer<Uint8> import_name;
+  external Pointer<Uint8> import_name;
 
   @Uint32()
-  int import_name_length;
+  external int import_name_length;
 
   // wasmer_import_export_kind
   @Uint32()
-  int tag;
+  external int tag;
 
   // wasmer_import_export_value, which is a union of wasmer_import_func_t*,
   // wasmer_table_t*, wasmer_memory_t*, and wasmer_global_t*. The tag determines
   // which type it is.
-  Pointer<Void> value;
+  external Pointer<Void> value;
 }
 
 // wasmer_byte_array
 class WasmerByteArray extends Struct {
-  Pointer<Uint8> bytes;
+  external Pointer<Uint8> bytes;
 
   @Uint32()
-  int length;
+  external int length;
 
   Uint8List get list => bytes.asTypedList(length);
   String get string => utf8.decode(list);
@@ -104,13 +107,13 @@
 class WasmerValue extends Struct {
   // wasmer_value_tag
   @Uint32()
-  int tag;
+  external int tag;
 
   // wasmer_value, which is a union of int32_t, int64_t, float, and double. The
   // tag determines which type it is. It's declared as an int64_t because that's
   // large enough to hold all the types. We use ByteData to get the other types.
   @Int64()
-  int value;
+  external int value;
 
   int get _off32 => Endian.host == Endian.little ? 0 : 4;
   int get i64 => value;
@@ -122,8 +125,10 @@
   set i64(int val) => value = val;
   set _val(ByteData bytes) => value = bytes.getInt64(0, Endian.host);
   set i32(int val) => _val = ByteData(8)..setInt32(_off32, val, Endian.host);
-  set f32(num val) => _val = ByteData(8)..setFloat32(_off32, val, Endian.host);
-  set f64(num val) => _val = ByteData(8)..setFloat64(0, val, Endian.host);
+  set f32(num val) =>
+      _val = ByteData(8)..setFloat32(_off32, val as double, Endian.host);
+  set f64(num val) =>
+      _val = ByteData(8)..setFloat64(0, val as double, Endian.host);
 
   bool get isI32 => tag == WasmerValueTagI32;
   bool get isI64 => tag == WasmerValueTagI64;
@@ -131,6 +136,19 @@
   bool get isF64 => tag == WasmerValueTagF64;
 }
 
+// wasmer_limits_t
+class WasmerLimits extends Struct {
+  @Uint32()
+  external int min;
+
+  // bool
+  @Uint8()
+  external int has_max;
+
+  @Uint32()
+  external int max;
+}
+
 // wasmer_compile
 typedef NativeWasmerCompileFn = Uint32 Function(
     Pointer<Pointer<WasmerModule>>, Pointer<Uint8>, Uint32);
@@ -286,3 +304,33 @@
     Uint32);
 typedef WasmerExportFuncCallFn = int Function(Pointer<WasmerExportFunc>,
     Pointer<WasmerValue>, int, Pointer<WasmerValue>, int);
+
+// wasmer_export_to_memory
+typedef NativeWasmerExportToMemoryFn = Uint32 Function(
+    Pointer<WasmerExport>, Pointer<Pointer<WasmerMemory>>);
+typedef WasmerExportToMemoryFn = int Function(
+    Pointer<WasmerExport>, Pointer<Pointer<WasmerMemory>>);
+
+// wasmer_memory_new_ptr
+typedef NativeWasmerMemoryNewPtrFn = Uint32 Function(
+    Pointer<Pointer<WasmerMemory>>, Pointer<WasmerLimits>);
+typedef WasmerMemoryNewPtrFn = int Function(
+    Pointer<Pointer<WasmerMemory>>, Pointer<WasmerLimits>);
+
+// wasmer_memory_grow
+typedef NativeWasmerMemoryGrowFn = Uint32 Function(
+    Pointer<WasmerMemory>, Uint32);
+typedef WasmerMemoryGrowFn = int Function(Pointer<WasmerMemory>, int);
+
+// wasmer_memory_length
+typedef NativeWasmerMemoryLengthFn = Uint32 Function(Pointer<WasmerMemory>);
+typedef WasmerMemoryLengthFn = int Function(Pointer<WasmerMemory>);
+
+// wasmer_memory_data
+typedef NativeWasmerMemoryDataFn = Pointer<Uint8> Function(
+    Pointer<WasmerMemory>);
+typedef WasmerMemoryDataFn = Pointer<Uint8> Function(Pointer<WasmerMemory>);
+
+// wasmer_memory_data_length
+typedef NativeWasmerMemoryDataLengthFn = Uint32 Function(Pointer<WasmerMemory>);
+typedef WasmerMemoryDataLengthFn = int Function(Pointer<WasmerMemory>);
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 2cc3c84..4b51532 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -544,11 +544,8 @@
   result = Dart_SetDeferredLoadHandler(Loader::DeferredLoadHandler);
   CHECK_RESULT(result);
 
-  // TODO(bkonyi): remove after 2.10 branch.
-  const bool disable_dds = true;
-
   int vm_service_server_port = INVALID_VM_SERVICE_SERVER_PORT;
-  if (Options::disable_dart_dev() || disable_dds) {
+  if (Options::disable_dart_dev()) {
     vm_service_server_port = Options::vm_service_server_port();
   } else if (Options::vm_service_server_port() !=
              INVALID_VM_SERVICE_SERVER_PORT) {
@@ -556,15 +553,14 @@
   }
 
   // Load embedder specific bits and return.
-  if (!VmService::Setup((Options::disable_dart_dev() || disable_dds)
-                            ? Options::vm_service_server_ip()
-                            : DEFAULT_VM_SERVICE_SERVER_IP,
-                        vm_service_server_port, Options::vm_service_dev_mode(),
-                        Options::vm_service_auth_disabled(),
-                        Options::vm_write_service_info_filename(),
-                        Options::trace_loading(), Options::deterministic(),
-                        Options::enable_service_port_fallback(),
-                        !Options::disable_dart_dev() && !disable_dds)) {
+  if (!VmService::Setup(
+          Options::disable_dart_dev() ? Options::vm_service_server_ip()
+                                      : DEFAULT_VM_SERVICE_SERVER_IP,
+          vm_service_server_port, Options::vm_service_dev_mode(),
+          Options::vm_service_auth_disabled(),
+          Options::vm_write_service_info_filename(), Options::trace_loading(),
+          Options::deterministic(), Options::enable_service_port_fallback(),
+          !Options::disable_dart_dev())) {
     *error = Utils::StrDup(VmService::GetErrorMessage());
     return NULL;
   }
diff --git a/tests/language/mixin/implicit_covariance_test.dart b/tests/language/mixin/implicit_covariance_test.dart
index 5606bd7..87d3ddd 100644
--- a/tests/language/mixin/implicit_covariance_test.dart
+++ b/tests/language/mixin/implicit_covariance_test.dart
@@ -13,7 +13,7 @@
 class C {
   foo(num x) {
     if (x is! num) {
-      throw "Soudness issue: expected x to be num, got ${x.runtimeType}.";
+      throw "Soundness issue: expected x to be num, got ${x.runtimeType}.";
     }
   }
 }
diff --git a/tests/language_2/mixin/implicit_covariance_test.dart b/tests/language_2/mixin/implicit_covariance_test.dart
index 5606bd7..87d3ddd 100644
--- a/tests/language_2/mixin/implicit_covariance_test.dart
+++ b/tests/language_2/mixin/implicit_covariance_test.dart
@@ -13,7 +13,7 @@
 class C {
   foo(num x) {
     if (x is! num) {
-      throw "Soudness issue: expected x to be num, got ${x.runtimeType}.";
+      throw "Soundness issue: expected x to be num, got ${x.runtimeType}.";
     }
   }
 }
diff --git a/tests/lib/wasm/memory_error_test.dart b/tests/lib/wasm/memory_error_test.dart
index e866bf0..3a172d8 100644
--- a/tests/lib/wasm/memory_error_test.dart
+++ b/tests/lib/wasm/memory_error_test.dart
@@ -5,11 +5,13 @@
 // Test errors thrown by WasmMemory.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
-  Expect.throwsArgumentError(() => WasmMemory(1000000000));
-  var mem = WasmMemory(1000);
-  Expect.throwsArgumentError(() => mem.grow(1000000000));
+  Expect.throws(() => WasmMemory(1000000000));
+  var mem = WasmMemory(100);
+  Expect.throws(() => mem.grow(1000000000));
+  mem = WasmMemory(100, 200);
+  Expect.throws(() => mem.grow(300));
 }
diff --git a/tests/lib/wasm/memory_test.dart b/tests/lib/wasm/memory_test.dart
index 52d12c3..ecaf433 100644
--- a/tests/lib/wasm/memory_test.dart
+++ b/tests/lib/wasm/memory_test.dart
@@ -5,22 +5,19 @@
 // Test that we can create a WasmMemory, edit it, and grow it.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
-  var mem = WasmMemory(1000);
-  Expect.equals(1000, mem.lengthInPages);
-  Expect.equals(1000 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
+  var mem = WasmMemory(100);
+  Expect.equals(100, mem.lengthInPages);
+  Expect.equals(100 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
 
   mem[123] = 45;
   Expect.equals(45, mem[123]);
 
-  mem.grow(100);
-  Expect.equals(1100, mem.lengthInPages);
-  Expect.equals(1100 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
+  mem.grow(10);
+  Expect.equals(110, mem.lengthInPages);
+  Expect.equals(110 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
   Expect.equals(45, mem[123]);
-
-  Expect.throwsArgumentError(() => WasmMemory(1000000000));
-  Expect.throwsArgumentError(() => mem.grow(1000000000));
 }
diff --git a/tests/lib_2/wasm/memory_error_test.dart b/tests/lib_2/wasm/memory_error_test.dart
index e866bf0..3a172d8 100644
--- a/tests/lib_2/wasm/memory_error_test.dart
+++ b/tests/lib_2/wasm/memory_error_test.dart
@@ -5,11 +5,13 @@
 // Test errors thrown by WasmMemory.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
-  Expect.throwsArgumentError(() => WasmMemory(1000000000));
-  var mem = WasmMemory(1000);
-  Expect.throwsArgumentError(() => mem.grow(1000000000));
+  Expect.throws(() => WasmMemory(1000000000));
+  var mem = WasmMemory(100);
+  Expect.throws(() => mem.grow(1000000000));
+  mem = WasmMemory(100, 200);
+  Expect.throws(() => mem.grow(300));
 }
diff --git a/tests/lib_2/wasm/memory_test.dart b/tests/lib_2/wasm/memory_test.dart
index 52d12c3..ecaf433 100644
--- a/tests/lib_2/wasm/memory_test.dart
+++ b/tests/lib_2/wasm/memory_test.dart
@@ -5,22 +5,19 @@
 // Test that we can create a WasmMemory, edit it, and grow it.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
-  var mem = WasmMemory(1000);
-  Expect.equals(1000, mem.lengthInPages);
-  Expect.equals(1000 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
+  var mem = WasmMemory(100);
+  Expect.equals(100, mem.lengthInPages);
+  Expect.equals(100 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
 
   mem[123] = 45;
   Expect.equals(45, mem[123]);
 
-  mem.grow(100);
-  Expect.equals(1100, mem.lengthInPages);
-  Expect.equals(1100 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
+  mem.grow(10);
+  Expect.equals(110, mem.lengthInPages);
+  Expect.equals(110 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
   Expect.equals(45, mem[123]);
-
-  Expect.throwsArgumentError(() => WasmMemory(1000000000));
-  Expect.throwsArgumentError(() => mem.grow(1000000000));
 }
diff --git a/third_party/wasmer/wasmer_wrapper.cc b/third_party/wasmer/wasmer_wrapper.cc
index b014268..cdfaa69 100644
--- a/third_party/wasmer/wasmer_wrapper.cc
+++ b/third_party/wasmer/wasmer_wrapper.cc
@@ -36,4 +36,10 @@
     wasmer_byte_array* out_name) {
   *out_name = wasmer_import_descriptor_name(import_descriptor);
 }
+
+// Wraps wasmer_memory_new.
+wasmer_result_t wasmer_memory_new_ptr(wasmer_memory_t** memory,
+                                      wasmer_limits_t* limits) {
+  return wasmer_memory_new(memory, *limits);
+}
 }
diff --git a/tools/VERSION b/tools/VERSION
index d2bf2b9..52e320d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 136
+PRERELEASE 137
 PRERELEASE_PATCH 0
\ No newline at end of file
