diff --git a/pkg/front_end/test/vm_service_heap_helper.dart b/pkg/front_end/test/vm_service_heap_helper.dart
index c011aea..9b44284 100644
--- a/pkg/front_end/test/vm_service_heap_helper.dart
+++ b/pkg/front_end/test/vm_service_heap_helper.dart
@@ -218,7 +218,7 @@
       vmService.HeapSnapshotGraph graph) {
     for (vmService.HeapSnapshotField field in class_.fields) {
       if (field.name == name) {
-        int index = o.references[field.index] - 1;
+        int index = o.references[field.index];
         if (index < 0) {
           // Sentinel object.
           return null;
@@ -233,10 +233,10 @@
       vmService.HeapSnapshotObject o,
       vmService.HeapSnapshotGraph graph,
       Map<Uri, Map<String, List<String>>> prettyPrints) {
-    if (o.classId == 0) {
+    if (o.classId <= 0) {
       return "Class sentinel";
     }
-    vmService.HeapSnapshotClass class_ = graph.classes[o.classId - 1];
+    vmService.HeapSnapshotClass class_ = o.klass;
 
     if (class_.name == "_OneByteString") {
       return '"${o.data}"';
@@ -293,7 +293,7 @@
         new List<bool>.filled(graph.classes.length, false);
     for (int i = 0; i < graph.objects.length; i++) {
       vmService.HeapSnapshotObject o = graph.objects[i];
-      if (o.classId == 0) {
+      if (o.classId <= 0) {
         // Sentinel.
         continue;
       }
@@ -301,7 +301,7 @@
         // Class is not interesting.
         continue;
       }
-      vmService.HeapSnapshotClass c = graph.classes[o.classId - 1];
+      vmService.HeapSnapshotClass c = o.klass;
       Map<String, List<String>> interests = _interests[c.libraryUri];
       if (interests == null || interests.isEmpty) {
         // Not an object we care about.
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml
new file mode 100644
index 0000000..a6d4c36
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml
@@ -0,0 +1,59 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+type: newworld
+target: VM
+worlds:
+  - entry: main.dart
+    sources:
+      .dart_tool/package_config.json: |
+        {
+          "configVersion": 2,
+          "packages": [
+            {
+              "name": "flutter",
+              "rootUri": "../flutter",
+              "languageVersion": "2.12"
+            }
+          ]
+        }
+      main.dart: |
+        import 'package:flutter/object.dart';
+        import 'lib1.dart';
+
+        class AdaptorElement extends RenderObject {
+          Adaptor get renderObject => super.renderObject;
+          void foo() {
+            print(renderObject.constraints.axis);
+          }
+        }
+      lib1.dart: |
+        import 'package:flutter/object.dart';
+        import 'lib2.dart';
+        abstract class Adaptor extends RenderFoo with LibMixin {}
+      lib2.dart: |
+        import 'package:flutter/object.dart';
+        mixin LibMixin on RenderObject {}
+      flutter/object.dart: |
+        class RenderFoo extends RenderObject {
+          FooConstraints get constraints => super.constraints as FooConstraints;
+        }
+        class FooConstraints extends Constraints {
+          String get axis => "hello";
+        }
+        class Constraints {}
+        class RenderObject {
+          Constraints get constraints => new Constraints();
+          RenderObject get renderObject => this;
+        }
+    expectedLibraryCount: 4
+
+  - entry: main.dart
+    errors: true
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    expectedLibraryCount: 4
+
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml.world.1.expect
new file mode 100644
index 0000000..372791d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml.world.1.expect
@@ -0,0 +1,106 @@
+main = <No Member>;
+library from "package:flutter/object.dart" as obj {
+
+  class RenderFoo extends obj::RenderObject {
+    synthetic constructor •() → obj::RenderFoo
+      : super obj::RenderObject::•()
+      ;
+    get constraints() → obj::FooConstraints
+      return super.{obj::RenderObject::constraints} as{ForNonNullableByDefault} obj::FooConstraints;
+  }
+  class FooConstraints extends obj::Constraints {
+    synthetic constructor •() → obj::FooConstraints
+      : super obj::Constraints::•()
+      ;
+    get axis() → dart.core::String
+      return "hello";
+  }
+  class Constraints extends dart.core::Object {
+    synthetic constructor •() → obj::Constraints
+      : super dart.core::Object::•()
+      ;
+  }
+  class RenderObject extends dart.core::Object {
+    synthetic constructor •() → obj::RenderObject
+      : super dart.core::Object::•()
+      ;
+    get constraints() → obj::Constraints
+      return new obj::Constraints::•();
+    get renderObject() → obj::RenderObject
+      return this;
+  }
+}
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "package:flutter/object.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  abstract class _Adaptor&RenderFoo&LibMixin extends obj::RenderFoo implements lib2::LibMixin /*isAnonymousMixin,isEliminatedMixin*/  {
+    synthetic constructor •() → lib1::_Adaptor&RenderFoo&LibMixin*
+      : super obj::RenderFoo::•()
+      ;
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ constraints() → obj::Constraints*; -> obj::RenderObject::constraints
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ renderObject() → obj::RenderObject*; -> obj::RenderObject::renderObject
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator /* from org-dartlang-test:///lib2.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  abstract class Adaptor extends lib1::_Adaptor&RenderFoo&LibMixin {
+    synthetic constructor •() → lib1::Adaptor*
+      : super lib1::_Adaptor&RenderFoo&LibMixin::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "package:flutter/object.dart";
+
+  abstract class LibMixin extends obj::RenderObject /*isMixinDeclaration*/  {
+    abstract member-signature get constraints() → obj::Constraints*; -> obj::RenderObject::constraints
+    abstract member-signature get renderObject() → obj::RenderObject*; -> obj::RenderObject::renderObject
+    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
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:flutter/object.dart";
+  import "org-dartlang-test:///lib1.dart";
+
+  class AdaptorElement extends obj::RenderObject {
+    synthetic constructor •() → main::AdaptorElement*
+      : super obj::RenderObject::•()
+      ;
+    get renderObject() → lib1::Adaptor*
+      return super.{obj::RenderObject::renderObject} as{TypeError} lib1::Adaptor*;
+    method foo() → void {
+      dart.core::print(this.{main::AdaptorElement::renderObject}.{lib1::_Adaptor&RenderFoo&LibMixin::constraints}.{obj::FooConstraints::axis});
+    }
+    abstract member-signature get constraints() → obj::Constraints*; -> obj::RenderObject::constraints
+    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
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml.world.2.expect
new file mode 100644
index 0000000..d241b60
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/error_on_recompile_with_no_change_02.yaml.world.2.expect
@@ -0,0 +1,115 @@
+main = <No Member>;
+library from "package:flutter/object.dart" as obj {
+
+  class RenderFoo extends obj::RenderObject {
+    synthetic constructor •() → obj::RenderFoo
+      : super obj::RenderObject::•()
+      ;
+    get constraints() → obj::FooConstraints
+      return super.{obj::RenderObject::constraints} as{ForNonNullableByDefault} obj::FooConstraints;
+  }
+  class FooConstraints extends obj::Constraints {
+    synthetic constructor •() → obj::FooConstraints
+      : super obj::Constraints::•()
+      ;
+    get axis() → dart.core::String
+      return "hello";
+  }
+  class Constraints extends dart.core::Object {
+    synthetic constructor •() → obj::Constraints
+      : super dart.core::Object::•()
+      ;
+  }
+  class RenderObject extends dart.core::Object {
+    synthetic constructor •() → obj::RenderObject
+      : super dart.core::Object::•()
+      ;
+    get constraints() → obj::Constraints
+      return new obj::Constraints::•();
+    get renderObject() → obj::RenderObject
+      return this;
+  }
+}
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "package:flutter/object.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  abstract class _Adaptor&RenderFoo&LibMixin extends obj::RenderFoo implements lib2::LibMixin /*isAnonymousMixin,isEliminatedMixin*/  {
+    synthetic constructor •() → lib1::_Adaptor&RenderFoo&LibMixin*
+      : super obj::RenderFoo::•()
+      ;
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ constraints() → obj::Constraints*; -> obj::RenderObject::constraints
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ renderObject() → obj::RenderObject*; -> obj::RenderObject::renderObject
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator /* from org-dartlang-test:///lib2.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method /* from org-dartlang-test:///lib2.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get /* from org-dartlang-test:///lib2.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  abstract class Adaptor extends lib1::_Adaptor&RenderFoo&LibMixin {
+    synthetic constructor •() → lib1::Adaptor*
+      : super lib1::_Adaptor&RenderFoo&LibMixin::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  import "package:flutter/object.dart";
+
+  abstract class LibMixin extends obj::RenderObject /*isMixinDeclaration*/  {
+    abstract member-signature get constraints() → obj::Constraints*; -> obj::RenderObject::constraints
+    abstract member-signature get renderObject() → obj::RenderObject*; -> obj::RenderObject::renderObject
+    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
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+//
+// Problems in library:
+//
+// org-dartlang-test:///main.dart:7:36: Error: The getter 'axis' isn't defined for the class 'Constraints'.
+//  - 'Constraints' is from 'package:flutter/object.dart' ('org-dartlang-test:///flutter/object.dart').
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'axis'.
+//     print(renderObject.constraints.axis);
+//                                    ^^^^
+//
+
+  import "package:flutter/object.dart";
+  import "org-dartlang-test:///lib1.dart";
+
+  class AdaptorElement extends obj::RenderObject {
+    synthetic constructor •() → main::AdaptorElement*
+      : super obj::RenderObject::•()
+      ;
+    get renderObject() → lib1::Adaptor*
+      return super.{obj::RenderObject::renderObject} as{TypeError} lib1::Adaptor*;
+    method foo() → void {
+      dart.core::print(invalid-expression "org-dartlang-test:///main.dart:7:36: Error: The getter 'axis' isn't defined for the class 'Constraints'.\n - 'Constraints' is from 'package:flutter/object.dart' ('org-dartlang-test:///flutter/object.dart').\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'axis'.\n    print(renderObject.constraints.axis);\n                                   ^^^^");
+    }
+    abstract member-signature get constraints() → obj::Constraints*; -> obj::RenderObject::constraints
+    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
+  }
+}
diff --git a/tools/VERSION b/tools/VERSION
index e152219..c79fbca 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 17
+PRERELEASE 18
 PRERELEASE_PATCH 0
\ No newline at end of file
