diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index e36d001..306517a 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -187,6 +187,9 @@
   }
 
   void addMember(Member member) {
+    if (member.isExtensionMember) {
+      return null;
+    }
     String name = member.name.text;
     if (name == "_exports#") {
       Field field = member;
@@ -210,6 +213,7 @@
   @override
   Builder addBuilder(String name, Builder declaration, int charOffset) {
     if (name == null || name.isEmpty) return null;
+
     bool isSetter = declaration.isSetter;
     if (isSetter) {
       scopeBuilder.addSetter(name, declaration);
@@ -219,7 +223,7 @@
     if (declaration.isExtension) {
       scopeBuilder.addExtension(declaration);
     }
-    if (!name.startsWith("_")) {
+    if (!name.startsWith("_") && !name.contains('#')) {
       if (isSetter) {
         exportScopeBuilder.addSetter(name, declaration);
       } else {
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 2cfabbe..6ec08ea 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -60,6 +60,8 @@
 
 import 'builder/class_builder.dart' show ClassBuilder;
 
+import 'builder/field_builder.dart' show FieldBuilder;
+
 import 'builder/library_builder.dart' show LibraryBuilder;
 
 import 'builder/name_iterator.dart' show NameIterator;
@@ -388,6 +390,8 @@
       // We suppress finalization errors because they have already been
       // reported.
       await dillLoadedData.buildOutlines(suppressFinalizationErrors: true);
+      assert(_checkEquivalentScopes(
+          userCode.loader.builders, dillLoadedData.loader.builders));
 
       if (experimentalInvalidation != null) {
         /// If doing experimental invalidation that means that some of the old
@@ -432,6 +436,80 @@
     return newDillLibraryBuilders;
   }
 
+  bool _checkEquivalentScopes(Map<Uri, LibraryBuilder> sourceLibraries,
+      Map<Uri, LibraryBuilder> dillLibraries) {
+    sourceLibraries.forEach((Uri uri, LibraryBuilder sourceLibraryBuilder) {
+      if (sourceLibraryBuilder is SourceLibraryBuilder) {
+        DillLibraryBuilder dillLibraryBuilder = dillLibraries[uri];
+        assert(
+            _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder) ==
+                null,
+            _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder));
+      }
+    });
+    return true;
+  }
+
+  String _hasEquivalentScopes(SourceLibraryBuilder sourceLibraryBuilder,
+      DillLibraryBuilder dillLibraryBuilder) {
+    bool isEquivalent = true;
+    StringBuffer sb = new StringBuffer();
+    sb.writeln('Mismatch on ${sourceLibraryBuilder.importUri}:');
+    sourceLibraryBuilder.exportScope
+        .forEachLocalMember((String name, Builder sourceBuilder) {
+      Builder dillBuilder =
+          dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: false);
+      if (dillBuilder == null) {
+        if ((name == 'dynamic' || name == 'Never') &&
+            sourceLibraryBuilder.importUri == Uri.parse('dart:core')) {
+          // The source library builder for dart:core has synthetically
+          // injected builders for `dynamic` and `Never` which do not have
+          // corresponding classes in the AST.
+          return;
+        }
+        sb.writeln('No dill builder for ${name}: $sourceBuilder');
+        isEquivalent = false;
+      }
+    });
+    dillLibraryBuilder.exportScope
+        .forEachLocalMember((String name, Builder dillBuilder) {
+      Builder sourceBuilder = sourceLibraryBuilder.exportScope
+          .lookupLocalMember(name, setter: false);
+      if (sourceBuilder == null) {
+        sb.writeln('No source builder for ${name}: $dillBuilder');
+        isEquivalent = false;
+      }
+    });
+    sourceLibraryBuilder.exportScope
+        .forEachLocalSetter((String name, Builder sourceBuilder) {
+      Builder dillBuilder =
+          dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: true);
+      if (dillBuilder == null) {
+        sb.writeln('No dill builder for ${name}=: $sourceBuilder');
+        isEquivalent = false;
+      }
+    });
+    dillLibraryBuilder.exportScope
+        .forEachLocalSetter((String name, Builder dillBuilder) {
+      Builder sourceBuilder = sourceLibraryBuilder.exportScope
+          .lookupLocalMember(name, setter: true);
+      if (sourceBuilder == null) {
+        sourceBuilder = sourceLibraryBuilder.exportScope
+            .lookupLocalMember(name, setter: false);
+        if (sourceBuilder is FieldBuilder && sourceBuilder.isAssignable) {
+          // Assignable fields can be lowered into a getter and setter.
+          return;
+        }
+        sb.writeln('No source builder for ${name}=: $dillBuilder');
+        isEquivalent = false;
+      }
+    });
+    if (isEquivalent) {
+      return null;
+    }
+    return sb.toString();
+  }
+
   /// Compute which libraries to output and which (previous) errors/warnings we
   /// have to reissue. In the process do some cleanup too.
   List<Library> calculateOutputLibrariesAndIssueLibraryProblems(
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
index 22ff40c..3e4120d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
@@ -1,8 +1,6 @@
 main = <No Member>;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
-additionalExports = (main::Extension|get#method,
-  main::Extension|method,
-  main::main,
+additionalExports = (main::main,
   main::Class,
   main::Extension)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
new file mode 100644
index 0000000..df6b22b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2019, 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.
+
+# Compile an application, change a file, but don't change the outline.
+# Mixin something from the same file.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      lib1.dart: |
+        import 'main.dart';
+        extension Extension1 on A {
+          baz() => 42;
+        }
+      lib2.dart: |
+        import 'main.dart';
+        import 'lib1.dart';
+        export 'main.dart';
+        export 'lib1.dart';
+        method(A a) {
+          a.baz();
+          a.boz();
+        }
+      main.dart: |
+        import 'lib1.dart';
+        import 'lib2.dart';
+        class A {
+          foo() {}
+        }
+        main() {
+          method(new A());
+        }
+        extension Extension2 on A {
+          boz() => 87;
+        }
+    expectedLibraryCount: 3
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib2.dart
+    sources:
+      lib2.dart: |
+        import 'main.dart';
+        import 'lib1.dart';
+        export 'main.dart';
+        export 'lib1.dart';
+        method(A a) {
+          a.baz();
+          a.boz();
+          a.baz();
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'lib1.dart';
+        import 'lib2.dart';
+        class A {
+          foo() {}
+        }
+        main() {
+          method(new A());
+        }
+        extension Extension2 on A {
+          boz() => 123;
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
new file mode 100644
index 0000000..febfb9f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
@@ -0,0 +1,63 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 87;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
new file mode 100644
index 0000000..761a2dc
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
@@ -0,0 +1,64 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+    lib1::Extension1|baz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 87;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
new file mode 100644
index 0000000..dd33640
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
@@ -0,0 +1,64 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+    lib1::Extension1|baz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 123;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/tools/VERSION b/tools/VERSION
index b99084c..a42d119 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 213
+PRERELEASE 214
 PRERELEASE_PATCH 0
\ No newline at end of file
