diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index b813027..e4dbd47 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -41,9 +41,11 @@
         LibraryDependency,
         LibraryPart,
         Name,
+        NamedNode,
         NonNullableByDefaultCompiledMode,
         Procedure,
         ProcedureKind,
+        Reference,
         ReturnStatement,
         Source,
         Supertype,
@@ -126,6 +128,8 @@
 
 import 'uri_translator.dart' show UriTranslator;
 
+final Uri dartFfiUri = Uri.parse("dart:ffi");
+
 class IncrementalCompiler implements IncrementalKernelGenerator {
   final CompilerContext context;
 
@@ -998,6 +1002,20 @@
     }
   }
 
+  bool _importsFfi() {
+    if (userBuilders == null) return false;
+    final Uri dartFfiUri = Uri.parse("dart:ffi");
+    for (LibraryBuilder builder in userBuilders.values) {
+      Library lib = builder.library;
+      for (LibraryDependency dependency in lib.dependencies) {
+        if (dependency.targetLibrary.importUri == dartFfiUri) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   /// Figure out if we can (and was asked to) do experimental invalidation.
   /// Note that this returns (future or) [null] if we're not doing experimental
   /// invalidation.
@@ -1071,6 +1089,9 @@
       }
     }
 
+    // Special case mixins: Because the VM mixin transformation inlines
+    // procedures, if the changed file is used as a mixin anywhere else
+    // we can't only recompile the changed file.
     // TODO(jensj): Check for mixins in a smarter and faster way.
     for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
       if (missingSources.contains(builder.fileUri)) {
@@ -1094,6 +1115,37 @@
       }
     }
 
+    // Special case FFI: Because the VM ffi transformation inlines
+    // size and position, if the changed file contains ffi structs
+    // we can't only recompile the changed file.
+    // TODO(jensj): Come up with something smarter for this. E.g. we might
+    // check if the FFI-classes are used in other libraries, or as actual nested
+    // structures in other FFI-classes etc.
+    // Alternatively (https://github.com/dart-lang/sdk/issues/45899) we might
+    // do something else entirely that doesn't require special handling.
+    if (_importsFfi()) {
+      for (LibraryBuilder builder in rebuildBodies) {
+        Library lib = builder.library;
+        for (LibraryDependency dependency in lib.dependencies) {
+          Library importLibrary = dependency.targetLibrary;
+          if (importLibrary.importUri == dartFfiUri) {
+            // Explicitly imports dart:ffi.
+            return null;
+          }
+          for (Reference exportReference in importLibrary.additionalExports) {
+            NamedNode export = exportReference.node;
+            if (export is Class) {
+              Class c = export;
+              if (c.enclosingLibrary.importUri == dartFfiUri) {
+                // Implicitly imports a dart:ffi class.
+                return null;
+              }
+            }
+          }
+        }
+      }
+    }
+
     originalNotReusedLibraries = new Set<LibraryBuilder>();
     Set<Uri> seenUris = new Set<Uri>();
     for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index a4ee9b7..42782a9 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -573,6 +573,7 @@
 init
 initializations
 initializer's
+inlines
 insertion
 inspect
 inspecting
@@ -962,6 +963,7 @@
 receivers
 recheck
 recognizing
+recompile
 recompiled
 recompiling
 recompute
@@ -1145,6 +1147,7 @@
 strict
 stringified
 stringify
+structs
 structures
 stub
 stubs
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
index 211fe88..e422ff5 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
@@ -3,7 +3,8 @@
 # BSD-style license that can be found in the LICENSE.md file.
 
 # Compile an application, change a file, but don't change the outline.
-# Test FFI compilation.
+# Test FFI compilation. Because FFI is special we can't expect to only
+# compile the changed files.
 
 type: newworld
 worlds:
@@ -78,4 +79,4 @@
           }
         }
     expectedLibraryCount: 2
-    expectsRebuildBodiesOnly: true
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml
new file mode 100644
index 0000000..03f9511a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml
@@ -0,0 +1,55 @@
+# 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.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    sources:
+      main.dart: |
+        import "dart:ffi";
+        import 'lib.dart';
+        class X extends Struct {
+          external Y x1;
+          external Y x2;
+          @Uint8()
+          external int x3;
+        }
+      lib.dart: |
+        import 'dart:ffi';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint8()
+          external int y2;
+          @Uint64()
+          external int y3;
+        }
+    expectedLibraryCount: 2
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib.dart
+    sources:
+      lib.dart: |
+        import 'dart:ffi';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint64()
+          external int y3;
+          @Uint8()
+          external int y2;
+        }
+    expectedLibraryCount: 2
+    # The FFI transformation have to update the size and position of containers
+    # (i.e. other structs with this Struct inside), so rebuilding only the
+    # changed library doesn't work.
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..6563e60
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C16
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C16
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C2, #C3]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 16
+  #C9 = 12
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 1
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = dart.ffi::Uint64 {}
+  #C17 = 8
+  #C18 = 4
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 40
+  #C25 = 28
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 32
+  #C28 = 24
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..8713870
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C14
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C14
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C3, #C2]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 24
+  #C9 = 16
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = dart.ffi::Uint64 {}
+  #C15 = 8
+  #C16 = 4
+  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C18 = 12
+  #C19 = <dart.core::int*>[#C9, #C18, #C9]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 56
+  #C25 = 36
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 48
+  #C28 = 32
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml
new file mode 100644
index 0000000..7f7cdad
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml
@@ -0,0 +1,64 @@
+# 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.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+# This test initializes from dill.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    sources:
+      main.dart: |
+        import "dart:ffi";
+        import 'lib.dart';
+        class X extends Struct {
+          external Y x1;
+          external Y x2;
+          @Uint8()
+          external int x3;
+        }
+      lib.dart: |
+        import 'dart:ffi';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint8()
+          external int y2;
+          @Uint64()
+          external int y3;
+        }
+    expectedLibraryCount: 2
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    expectInitializeFromDill: true
+    invalidate:
+      - lib.dart
+    sources:
+      main.dart: |
+        import "dart:ffi";
+        import 'lib.dart';
+        class X extends Struct {
+          external Y x1;
+          external Y x2;
+          @Uint8()
+          external int x3;
+        }
+      lib.dart: |
+        import 'dart:ffi';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint64()
+          external int y3;
+          @Uint8()
+          external int y2;
+        }
+    expectedLibraryCount: 2
+    # The FFI transformation have to update the size and position of containers
+    # (i.e. other structs with this Struct inside), so rebuilding only the
+    # changed library doesn't work.
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..6563e60
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C16
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C16
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C2, #C3]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 16
+  #C9 = 12
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 1
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = dart.ffi::Uint64 {}
+  #C17 = 8
+  #C18 = 4
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 40
+  #C25 = 28
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 32
+  #C28 = 24
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..8713870
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C14
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C14
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C3, #C2]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 24
+  #C9 = 16
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = dart.ffi::Uint64 {}
+  #C15 = 8
+  #C16 = 4
+  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C18 = 12
+  #C19 = <dart.core::int*>[#C9, #C18, #C9]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 56
+  #C25 = 36
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 48
+  #C28 = 32
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml
new file mode 100644
index 0000000..025fb00
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml
@@ -0,0 +1,59 @@
+# 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.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    sources:
+      main.dart: |
+        import "dart:ffi";
+        import 'lib.dart';
+        class X extends Struct {
+          external Y x1;
+          external Y x2;
+          @Uint8()
+          external int x3;
+        }
+      lib.dart: |
+        import 'lib2.dart';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint8()
+          external int y2;
+          @Uint64()
+          external int y3;
+        }
+      lib2.dart: |
+        export 'lib3.dart';
+      lib3.dart: |
+        export 'dart:ffi';
+    expectedLibraryCount: 4
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib.dart
+    sources:
+      lib.dart: |
+        import 'lib2.dart';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint64()
+          external int y3;
+          @Uint8()
+          external int y2;
+        }
+    expectedLibraryCount: 4
+    # The FFI transformation have to update the size and position of containers
+    # (i.e. other structs with this Struct inside), so rebuilding only the
+    # changed library doesn't work.
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..790b63b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
@@ -0,0 +1,239 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C16
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C16
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (ffi::nullptr,
+  ffi::unsized,
+  ffi::sizeOf,
+  ffi::Dart_NativeMessageHandler,
+  ffi::Allocator,
+  ffi::AllocatorAlloc,
+  ffi::Array,
+  ffi::ArrayArray,
+  ffi::DartRepresentationOf,
+  ffi::Dart_CObject,
+  ffi::Double,
+  ffi::DoubleArray,
+  ffi::DoublePointer,
+  ffi::DynamicLibrary,
+  ffi::DynamicLibraryExtension,
+  ffi::Float,
+  ffi::FloatArray,
+  ffi::FloatPointer,
+  ffi::Handle,
+  ffi::Int16,
+  ffi::Int16Array,
+  ffi::Int16Pointer,
+  ffi::Int32,
+  ffi::Int32Array,
+  ffi::Int32Pointer,
+  ffi::Int64,
+  ffi::Int64Array,
+  ffi::Int64Pointer,
+  ffi::Int8,
+  ffi::Int8Array,
+  ffi::Int8Pointer,
+  ffi::IntPtr,
+  ffi::IntPtrArray,
+  ffi::IntPtrPointer,
+  ffi::NativeApi,
+  ffi::NativeFunction,
+  ffi::NativeFunctionPointer,
+  ffi::NativePort,
+  ffi::NativeType,
+  ffi::Opaque,
+  ffi::Packed,
+  ffi::Pointer,
+  ffi::PointerArray,
+  ffi::PointerPointer,
+  ffi::Struct,
+  ffi::StructArray,
+  ffi::StructPointer,
+  ffi::Uint16,
+  ffi::Uint16Array,
+  ffi::Uint16Pointer,
+  ffi::Uint32,
+  ffi::Uint32Array,
+  ffi::Uint32Pointer,
+  ffi::Uint64,
+  ffi::Uint64Array,
+  ffi::Uint64Pointer,
+  ffi::Uint8,
+  ffi::Uint8Array,
+  ffi::Uint8Pointer,
+  ffi::Union,
+  ffi::UnionArray,
+  ffi::UnionPointer,
+  ffi::Unsized,
+  ffi::Void)
+
+  export "org-dartlang-test:///lib3.dart";
+
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (ffi::nullptr,
+  ffi::unsized,
+  ffi::sizeOf,
+  ffi::Dart_NativeMessageHandler,
+  ffi::Allocator,
+  ffi::AllocatorAlloc,
+  ffi::Array,
+  ffi::ArrayArray,
+  ffi::DartRepresentationOf,
+  ffi::Dart_CObject,
+  ffi::Double,
+  ffi::DoubleArray,
+  ffi::DoublePointer,
+  ffi::DynamicLibrary,
+  ffi::DynamicLibraryExtension,
+  ffi::Float,
+  ffi::FloatArray,
+  ffi::FloatPointer,
+  ffi::Handle,
+  ffi::Int16,
+  ffi::Int16Array,
+  ffi::Int16Pointer,
+  ffi::Int32,
+  ffi::Int32Array,
+  ffi::Int32Pointer,
+  ffi::Int64,
+  ffi::Int64Array,
+  ffi::Int64Pointer,
+  ffi::Int8,
+  ffi::Int8Array,
+  ffi::Int8Pointer,
+  ffi::IntPtr,
+  ffi::IntPtrArray,
+  ffi::IntPtrPointer,
+  ffi::NativeApi,
+  ffi::NativeFunction,
+  ffi::NativeFunctionPointer,
+  ffi::NativePort,
+  ffi::NativeType,
+  ffi::Opaque,
+  ffi::Packed,
+  ffi::Pointer,
+  ffi::PointerArray,
+  ffi::PointerPointer,
+  ffi::Struct,
+  ffi::StructArray,
+  ffi::StructPointer,
+  ffi::Uint16,
+  ffi::Uint16Array,
+  ffi::Uint16Pointer,
+  ffi::Uint32,
+  ffi::Uint32Array,
+  ffi::Uint32Pointer,
+  ffi::Uint64,
+  ffi::Uint64Array,
+  ffi::Uint64Pointer,
+  ffi::Uint8,
+  ffi::Uint8Array,
+  ffi::Uint8Pointer,
+  ffi::Union,
+  ffi::UnionArray,
+  ffi::UnionPointer,
+  ffi::Unsized,
+  ffi::Void)
+
+  export "dart:ffi";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C2, #C3]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 16
+  #C9 = 12
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 1
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = dart.ffi::Uint64 {}
+  #C17 = 8
+  #C18 = 4
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 40
+  #C25 = 28
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 32
+  #C28 = 24
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..44136bf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
@@ -0,0 +1,239 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C14
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C14
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (ffi::nullptr,
+  ffi::unsized,
+  ffi::sizeOf,
+  ffi::Dart_NativeMessageHandler,
+  ffi::Allocator,
+  ffi::AllocatorAlloc,
+  ffi::Array,
+  ffi::ArrayArray,
+  ffi::DartRepresentationOf,
+  ffi::Dart_CObject,
+  ffi::Double,
+  ffi::DoubleArray,
+  ffi::DoublePointer,
+  ffi::DynamicLibrary,
+  ffi::DynamicLibraryExtension,
+  ffi::Float,
+  ffi::FloatArray,
+  ffi::FloatPointer,
+  ffi::Handle,
+  ffi::Int16,
+  ffi::Int16Array,
+  ffi::Int16Pointer,
+  ffi::Int32,
+  ffi::Int32Array,
+  ffi::Int32Pointer,
+  ffi::Int64,
+  ffi::Int64Array,
+  ffi::Int64Pointer,
+  ffi::Int8,
+  ffi::Int8Array,
+  ffi::Int8Pointer,
+  ffi::IntPtr,
+  ffi::IntPtrArray,
+  ffi::IntPtrPointer,
+  ffi::NativeApi,
+  ffi::NativeFunction,
+  ffi::NativeFunctionPointer,
+  ffi::NativePort,
+  ffi::NativeType,
+  ffi::Opaque,
+  ffi::Packed,
+  ffi::Pointer,
+  ffi::PointerArray,
+  ffi::PointerPointer,
+  ffi::Struct,
+  ffi::StructArray,
+  ffi::StructPointer,
+  ffi::Uint16,
+  ffi::Uint16Array,
+  ffi::Uint16Pointer,
+  ffi::Uint32,
+  ffi::Uint32Array,
+  ffi::Uint32Pointer,
+  ffi::Uint64,
+  ffi::Uint64Array,
+  ffi::Uint64Pointer,
+  ffi::Uint8,
+  ffi::Uint8Array,
+  ffi::Uint8Pointer,
+  ffi::Union,
+  ffi::UnionArray,
+  ffi::UnionPointer,
+  ffi::Unsized,
+  ffi::Void)
+
+  export "org-dartlang-test:///lib3.dart";
+
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (ffi::nullptr,
+  ffi::unsized,
+  ffi::sizeOf,
+  ffi::Dart_NativeMessageHandler,
+  ffi::Allocator,
+  ffi::AllocatorAlloc,
+  ffi::Array,
+  ffi::ArrayArray,
+  ffi::DartRepresentationOf,
+  ffi::Dart_CObject,
+  ffi::Double,
+  ffi::DoubleArray,
+  ffi::DoublePointer,
+  ffi::DynamicLibrary,
+  ffi::DynamicLibraryExtension,
+  ffi::Float,
+  ffi::FloatArray,
+  ffi::FloatPointer,
+  ffi::Handle,
+  ffi::Int16,
+  ffi::Int16Array,
+  ffi::Int16Pointer,
+  ffi::Int32,
+  ffi::Int32Array,
+  ffi::Int32Pointer,
+  ffi::Int64,
+  ffi::Int64Array,
+  ffi::Int64Pointer,
+  ffi::Int8,
+  ffi::Int8Array,
+  ffi::Int8Pointer,
+  ffi::IntPtr,
+  ffi::IntPtrArray,
+  ffi::IntPtrPointer,
+  ffi::NativeApi,
+  ffi::NativeFunction,
+  ffi::NativeFunctionPointer,
+  ffi::NativePort,
+  ffi::NativeType,
+  ffi::Opaque,
+  ffi::Packed,
+  ffi::Pointer,
+  ffi::PointerArray,
+  ffi::PointerPointer,
+  ffi::Struct,
+  ffi::StructArray,
+  ffi::StructPointer,
+  ffi::Uint16,
+  ffi::Uint16Array,
+  ffi::Uint16Pointer,
+  ffi::Uint32,
+  ffi::Uint32Array,
+  ffi::Uint32Pointer,
+  ffi::Uint64,
+  ffi::Uint64Array,
+  ffi::Uint64Pointer,
+  ffi::Uint8,
+  ffi::Uint8Array,
+  ffi::Uint8Pointer,
+  ffi::Union,
+  ffi::UnionArray,
+  ffi::UnionPointer,
+  ffi::Unsized,
+  ffi::Void)
+
+  export "dart:ffi";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C3, #C2]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 24
+  #C9 = 16
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = dart.ffi::Uint64 {}
+  #C15 = 8
+  #C16 = 4
+  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C18 = 12
+  #C19 = <dart.core::int*>[#C9, #C18, #C9]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 56
+  #C25 = 36
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 48
+  #C28 = 32
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/test_runner/lib/src/multitest.dart b/pkg/test_runner/lib/src/multitest.dart
index 7cd62eb..a194c73 100644
--- a/pkg/test_runner/lib/src/multitest.dart
+++ b/pkg/test_runner/lib/src/multitest.dart
@@ -83,10 +83,7 @@
   'syntax error',
   'compile-time error',
   'runtime error',
-  // TODO(rnystrom): Remove these after Dart 1.0 tests are removed.
-  'static type warning', // This is still a valid analyzer test
-  'dynamic type error', // This is now a no-op
-  'checked mode compile-time error' // This is now a no-op
+  'static type warning', // Used by some analyzer tests.
 };
 
 void _generateTestsFromMultitest(Path filePath, Map<String, String> tests,
diff --git a/tests/language/deferred/constraints_type_annotation_test.dart b/tests/language/deferred/constraints_type_annotation_test.dart
index 9d86ccb..8431093 100644
--- a/tests/language/deferred/constraints_type_annotation_test.dart
+++ b/tests/language/deferred/constraints_type_annotation_test.dart
@@ -22,11 +22,11 @@
   lib2.C a1 = new lib2.C(); //# type_annotation_non_deferred: continued
   asyncStart();
   lib.loadLibrary().then((_) {
-    lib.C a2 = new lib.C(); //# type_annotation1: dynamic type error, compile-time error
-    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: dynamic type error, compile-time error
+    lib.C a2 = new lib.C(); //# type_annotation1: compile-time error
+    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: compile-time error
     G2<lib.C> a4 = new G2(); //# type_annotation_generic2: compile-time error
     G2<lib.C> a5 = new G2<lib.C>(); //# type_annotation_generic3: compile-time error
-    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: dynamic type error, compile-time error
+    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: compile-time error
     var a6 = new lib.C(); //# new: ok
     var g1 = new lib.G<F>(); //# new_generic1: ok
     // new G2<lib.C>() does not give a dynamic type error because a malformed
diff --git a/tests/language/factory/factory1_test.dart b/tests/language/factory/factory1_test.dart
index d29187b..18302b0 100644
--- a/tests/language/factory/factory1_test.dart
+++ b/tests/language/factory/factory1_test.dart
@@ -6,7 +6,11 @@
 class A<T> {
   A() {}
   factory A.factory() {
-    return new A<String>(); // //# 00: compile-time error
+    return new A<String>();
+    //     ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+    //         ^
+    // [cfe] A value of type 'A<String>' can't be returned from a function with return type 'A<T>'.
     return A<T>();
   }
 }
@@ -14,14 +18,18 @@
 class B<T> extends A<T> {
   B() {}
   factory B.factory() {
-    return new B<String>(); // //# 01: compile-time error
+    return new B<String>();
+    //     ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+    //         ^
+    // [cfe] A value of type 'B<String>' can't be returned from a function with return type 'B<T>'.
     return B<T>();
   }
 }
 
 main() {
   new A<String>.factory();
-  new A<int>.factory(); // //# 00: dynamic type error
+  new A<int>.factory();
   new B<String>.factory();
-  new B<int>.factory(); // //# 01: dynamic type error
+  new B<int>.factory();
 }
diff --git a/tests/language_2/deferred/constraints_type_annotation_test.dart b/tests/language_2/deferred/constraints_type_annotation_test.dart
index d155d14..bb620b8 100644
--- a/tests/language_2/deferred/constraints_type_annotation_test.dart
+++ b/tests/language_2/deferred/constraints_type_annotation_test.dart
@@ -24,11 +24,11 @@
   lib2.C a1 = new lib2.C(); //# type_annotation_non_deferred: continued
   asyncStart();
   lib.loadLibrary().then((_) {
-    lib.C a2 = new lib.C(); //# type_annotation1: dynamic type error, compile-time error
-    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: dynamic type error, compile-time error
+    lib.C a2 = new lib.C(); //# type_annotation1: compile-time error
+    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: compile-time error
     G2<lib.C> a4 = new G2(); //# type_annotation_generic2: compile-time error
     G2<lib.C> a5 = new G2<lib.C>(); //# type_annotation_generic3: compile-time error
-    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: dynamic type error, compile-time error
+    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: compile-time error
     var a6 = new lib.C(); //# new: ok
     var g1 = new lib.G<F>(); //# new_generic1: ok
     // new G2<lib.C>() does not give a dynamic type error because a malformed
diff --git a/tests/language_2/factory/factory1_test.dart b/tests/language_2/factory/factory1_test.dart
index d8b1dd7..bac0e94 100644
--- a/tests/language_2/factory/factory1_test.dart
+++ b/tests/language_2/factory/factory1_test.dart
@@ -8,20 +8,28 @@
 class A<T> {
   A() {}
   factory A.factory() {
-    return new A<String>(); // //# 00: compile-time error
+    return new A<String>();
+    //     ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+    //         ^
+    // [cfe] A value of type 'A<String>' can't be assigned to a variable of type 'A<T>'.
   }
 }
 
 class B<T> extends A<T> {
   B() {}
   factory B.factory() {
-    return new B<String>(); // //# 01: compile-time error
+    return new B<String>();
+    //     ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+    //         ^
+    // [cfe] A value of type 'B<String>' can't be assigned to a variable of type 'B<T>'.
   }
 }
 
 main() {
   new A<String>.factory();
-  new A<int>.factory(); // //# 00: dynamic type error
+  new A<int>.factory();
   new B<String>.factory();
-  new B<int>.factory(); // //# 01: dynamic type error
+  new B<int>.factory();
 }
diff --git a/tools/VERSION b/tools/VERSION
index a12e0b3..6e2781c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 82
+PRERELEASE 83
 PRERELEASE_PATCH 0
\ No newline at end of file
