diff --git a/DEPS b/DEPS
index 7753d5f..138d463 100644
--- a/DEPS
+++ b/DEPS
@@ -49,7 +49,7 @@
   "dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
   "dart_style_tag": "@0.2.4",
   "dartdoc_tag" : "@v0.9.0",
-  "dev_compiler_rev": "@1f00327fdf8fe11ab8e9b3d5b0fc958025ede592",
+  "dev_compiler_rev": "@adda29b31dc8fe2f8d1a5c1304384988503384c8",
   "fixnum_tag": "@0.10.5",
   "func_rev": "@8d4aea75c21be2179cb00dc2b94a71414653094e",
   "glob_rev": "@704cf75e4f26b417505c5c611bdaacd8808467dd",
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index a00ab31..c52f5a9 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -1639,8 +1639,8 @@
     }
 
     // If no embedded URI resolver was provided, defer to a locator-backed one.
-    embedderUriResolver ??=
-        new EmbedderUriResolver(context.embedderYamlLocator.embedderYamls);
+    embedderUriResolver ??= new EmbedderUriResolver(
+        new EmbedderSdk(context.embedderYamlLocator.embedderYamls));
     if (embedderUriResolver.length == 0) {
       // The embedder uri resolver has no mappings. Use the default Dart SDK
       // uri resolver.
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 44c3595..975cd09 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -917,7 +917,8 @@
                   .where((r) => r is! DartUriResolver)
                   .toList();
               // Add an embedded URI resolver in its place.
-              resolvers.add(new EmbedderUriResolver(embedderYamls));
+              resolvers
+                  .add(new EmbedderUriResolver(new EmbedderSdk(embedderYamls)));
 
               // Set a new source factory.
               SourceFactoryImpl newFactory = sourceFactory.clone();
@@ -1174,8 +1175,8 @@
     }
 
     // If no embedded URI resolver was provided, defer to a locator-backed one.
-    embedderUriResolver ??=
-        new EmbedderUriResolver(context.embedderYamlLocator.embedderYamls);
+    embedderUriResolver ??= new EmbedderUriResolver(
+        new EmbedderSdk(context.embedderYamlLocator.embedderYamls));
     if (embedderUriResolver.length == 0) {
       // The embedder uri resolver has no mappings. Use the default Dart SDK
       // uri resolver.
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index db85fcd..b6a5903 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -2658,8 +2658,8 @@
     if (currentContext is InternalAnalysisContext) {
       EmbedderYamlLocator embedderYamlLocator =
           (currentContext as InternalAnalysisContext).embedderYamlLocator;
-      EmbedderUriResolver embedderUriResolver =
-          new EmbedderUriResolver(embedderYamlLocator.embedderYamls);
+      EmbedderUriResolver embedderUriResolver = new EmbedderUriResolver(
+          new EmbedderSdk(embedderYamlLocator.embedderYamls));
       if (embedderUriResolver.length > 0) {
         // We have some embedder dart: uri mappings, add the resolver
         // to the list.
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 0454992..c4642e8 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -112,7 +112,7 @@
   return unit;
 }
 
-/// A simple error listener that collects errors into an [AnalysisErrorGroup].
+/// A simple error listener that collects errors into an [AnalyzerErrorGroup].
 class _ErrorCollector extends AnalysisErrorListener {
   final _errors = <AnalysisError>[];
 
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 7b645cc..6754062 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -373,7 +373,7 @@
 
   /**
    * Set the condition that is being asserted to be `true` to the given
-   * [expression].
+   * [condition].
    */
   void set condition(Expression condition);
 
@@ -1188,7 +1188,7 @@
   Expression get target;
 
   /**
-   * Set the target of the cascade sections to the given [expression].
+   * Set the target of the cascade sections to the given [target].
    */
   void set target(Expression target);
 }
@@ -1394,7 +1394,7 @@
   void set abstractKeyword(Token token);
 
   /**
-   * Return the token representing the 'class' keyword to the given [token].
+   * Return the token representing the 'class' keyword.
    */
   Token get classKeyword;
 
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index e7091ab..13fbe48 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -763,7 +763,7 @@
   /**
    * Return a display name for the given element that includes the path to the
    * compilation unit in which the type is defined. If [shortName] is `null`
-   * then [getDisplayName] will be used as the name of this element. Otherwise
+   * then [displayName] will be used as the name of this element. Otherwise
    * the provided name will be used.
    */
   // TODO(brianwilkerson) Make the parameter optional.
diff --git a/pkg/analyzer/lib/instrumentation/instrumentation.dart b/pkg/analyzer/lib/instrumentation/instrumentation.dart
index 92638f7..eaf95ba 100644
--- a/pkg/analyzer/lib/instrumentation/instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/instrumentation.dart
@@ -85,7 +85,7 @@
 
   /**
    * Initialize a newly created instrumentation service to communicate with the
-   * given [instrumentationServer].
+   * given [_instrumentationServer].
    */
   InstrumentationService(this._instrumentationServer);
 
@@ -320,9 +320,10 @@
   String _join(List<String> fields) {
     StringBuffer buffer = new StringBuffer();
     buffer.write(_timestamp);
-    for (String field in fields) {
+    int length = fields.length;
+    for (int i = 0; i < length; i++) {
       buffer.write(':');
-      _escape(buffer, field);
+      _escape(buffer, fields[i]);
     }
     return buffer.toString();
   }
diff --git a/pkg/analyzer/lib/source/analysis_options_provider.dart b/pkg/analyzer/lib/source/analysis_options_provider.dart
index 2acab1d..fbacdfb 100644
--- a/pkg/analyzer/lib/source/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/source/analysis_options_provider.dart
@@ -14,8 +14,9 @@
 
 /// Provide the options found in the analysis options file.
 class AnalysisOptionsProvider {
-  /// Provide the options found in either [root]/[ANALYSIS_OPTIONS_FILE] or
-  /// [root]/[ANALYSIS_OPTIONS_YAML_FILE].
+  /// Provide the options found in either
+  /// [root]/[AnalysisEngine.ANALYSIS_OPTIONS_FILE] or
+  /// [root]/[AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE].
   /// Return an empty options map if the file does not exist.
   Map<String, YamlNode> getOptions(Folder root, {bool crawlUp: false}) {
     Resource resource;
diff --git a/pkg/analyzer/lib/source/embedder.dart b/pkg/analyzer/lib/source/embedder.dart
index 78ba661..a1b4ea6 100644
--- a/pkg/analyzer/lib/source/embedder.dart
+++ b/pkg/analyzer/lib/source/embedder.dart
@@ -8,6 +8,8 @@
 import 'dart:core' hide Resource;
 
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/package_map_provider.dart'
+    show PackageMapProvider;
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_core.dart';
@@ -24,26 +26,33 @@
 /// Check if this map defines embedded libraries.
 bool definesEmbeddedLibs(Map map) => map[_EMBEDDED_LIB_MAP_KEY] != null;
 
+/// An SDK backed by URI mappings derived from an `_embedder.yaml` file.
 class EmbedderSdk implements DartSdk {
-  // TODO(danrubel) Refactor this with DirectoryBasedDartSdk
-
-  /// The resolver associated with this embedder sdk.
+  /// The resolver associated with this SDK.
   EmbedderUriResolver _resolver;
 
-  /// The [AnalysisContext] which is used for all of the sources in this sdk.
+  /// The [AnalysisContext] used for this SDK's sources.
   InternalAnalysisContext _analysisContext;
 
-  /// The library map that is populated by visiting the AST structure parsed from
-  /// the contents of the libraries file.
   final LibraryMap _librariesMap = new LibraryMap();
 
+  final Map<String, String> _urlMappings = new HashMap<String, String>();
+
+  /// Analysis options for this SDK.
+  AnalysisOptions analysisOptions;
+
+  EmbedderSdk([Map<Folder, YamlMap> embedderYamls]) {
+    embedderYamls?.forEach(_processEmbedderYaml);
+    _resolver = new EmbedderUriResolver(this);
+  }
+
   @override
   AnalysisContext get context {
     if (_analysisContext == null) {
-      _analysisContext = new SdkAnalysisContext(null);
+      _analysisContext = new SdkAnalysisContext(analysisOptions);
       SourceFactory factory = new SourceFactory([_resolver]);
       _analysisContext.sourceFactory = factory;
-      List<String> uris = this.uris;
+
       ChangeSet changeSet = new ChangeSet();
       for (String uri in uris) {
         changeSet.addedSource(factory.forUri(uri));
@@ -63,6 +72,9 @@
   @override
   List<String> get uris => _librariesMap.uris;
 
+  /// The url mappings for this SDK.
+  Map<String, String> get urlMappings => _urlMappings;
+
   @override
   Source fromFileUri(Uri uri) {
     JavaFile file = new JavaFile.fromUri(uri);
@@ -72,7 +84,7 @@
     for (SdkLibrary library in _librariesMap.sdkLibraries) {
       String libraryPath = library.path.replaceAll('/', JavaFile.separator);
       if (filePath == libraryPath) {
-        path = '$_DART_COLON_PREFIX${library.shortName}';
+        path = library.shortName;
         break;
       }
     }
@@ -90,7 +102,7 @@
         var relPath = filePath
             .substring(prefix.length)
             .replaceAll(JavaFile.separator, '/');
-        path = '$_DART_COLON_PREFIX${library.shortName}/$relPath';
+        path = '${library.shortName}/$relPath';
         break;
       }
     }
@@ -150,9 +162,39 @@
       return null;
     }
   }
+
+  /// Install the mapping from [name] to [libDir]/[file].
+  void _processEmbeddedLibs(String name, String file, Folder libDir) {
+    if (!name.startsWith(_DART_COLON_PREFIX)) {
+      // SDK libraries must begin with 'dart:'.
+      return;
+    }
+    String libPath = libDir.canonicalizePath(file);
+    _urlMappings[name] = libPath;
+    SdkLibraryImpl library = new SdkLibraryImpl(name);
+    library.path = libPath;
+    _librariesMap.setLibrary(name, library);
+  }
+
+  /// Given the 'embedderYamls' from [EmbedderYamlLocator] check each one for the
+  /// top level key 'embedded_libs'. Under the 'embedded_libs' key are key value
+  /// pairs. Each key is a 'dart:' library uri and each value is a path
+  /// (relative to the directory containing `_embedder.yaml`) to a dart script
+  /// for the given library. For example:
+  ///
+  /// embedded_libs:
+  ///   'dart:io': '../../sdk/io/io.dart'
+  ///
+  /// If a key doesn't begin with `dart:` it is ignored.
+  void _processEmbedderYaml(Folder libDir, YamlMap map) {
+    YamlNode embedded_libs = map[_EMBEDDED_LIB_MAP_KEY];
+    if (embedded_libs is YamlMap) {
+      embedded_libs.forEach((k, v) => _processEmbeddedLibs(k, v, libDir));
+    }
+  }
 }
 
-/// Given the [embedderYamls] from [EmbedderYamlLocator] check each one for the
+/// Given the 'embedderYamls' from [EmbedderYamlLocator] check each one for the
 /// top level key 'embedded_libs'. Under the 'embedded_libs' key are key value
 /// pairs. Each key is a 'dart:' library uri and each value is a path
 /// (relative to the directory containing `_embedder.yaml`) to a dart script
@@ -163,22 +205,25 @@
 ///
 /// If a key doesn't begin with `dart:` it is ignored.
 ///
-class EmbedderUriResolver extends DartUriResolver {
-  final Map<String, String> _urlMappings = <String, String>{};
+class EmbedderUriResolver implements DartUriResolver {
+  EmbedderSdk _embedderSdk;
+  DartUriResolver _dartUriResolver;
 
   /// Construct a [EmbedderUriResolver] from a package map
   /// (see [PackageMapProvider]).
-  EmbedderUriResolver(Map<Folder, YamlMap> embedderYamls)
-      : super(new EmbedderSdk()) {
-    (dartSdk as EmbedderSdk)._resolver = this;
-    if (embedderYamls == null) {
-      return;
-    }
-    embedderYamls.forEach(_processEmbedderYaml);
+  EmbedderUriResolver(this._embedderSdk) {
+    _dartUriResolver = new DartUriResolver(_embedderSdk);
   }
 
+  @override
+  DartSdk get dartSdk => _embedderSdk;
+
   /// Number of embedded libraries.
-  int get length => _urlMappings.length;
+  int get length => _embedderSdk?.urlMappings?.length ?? 0;
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) =>
+      _dartUriResolver.resolveAbsolute(uri, actualUri);
 
   @override
   Uri restoreAbsolute(Source source) {
@@ -189,32 +234,6 @@
     Source sdkSource = dartSdk.fromFileUri(Uri.parse('file://$path'));
     return sdkSource?.uri;
   }
-
-  /// Install the mapping from [name] to [libDir]/[file].
-  void _processEmbeddedLibs(String name, String file, Folder libDir) {
-    if (!name.startsWith(_DART_COLON_PREFIX)) {
-      // SDK libraries must begin with 'dart:'.
-      // TODO(pquitslund): Notify developer that something is wrong with the
-      // _embedder.yaml file in libDir.
-      return;
-    }
-    String libPath = libDir.canonicalizePath(file);
-    _urlMappings[name] = libPath;
-    String shortName = name.substring(_DART_COLON_PREFIX.length);
-    SdkLibraryImpl library = new SdkLibraryImpl(shortName);
-    library.path = libPath;
-    (dartSdk as EmbedderSdk)._librariesMap.setLibrary(name, library);
-  }
-
-  void _processEmbedderYaml(Folder libDir, YamlMap map) {
-    YamlNode embedded_libs = map[_EMBEDDED_LIB_MAP_KEY];
-    if (embedded_libs == null) {
-      return;
-    }
-    if (embedded_libs is YamlMap) {
-      embedded_libs.forEach((k, v) => _processEmbeddedLibs(k, v, libDir));
-    }
-  }
 }
 
 /// Given a packageMap, check in each package's lib directory for the
@@ -223,8 +242,7 @@
 class EmbedderYamlLocator {
   static const String EMBEDDER_FILE_NAME = '_embedder.yaml';
 
-  // Map from package's library directory to the parsed
-  // YamlMap.
+  /// Map from package's library directory to the parsed YamlMap.
   final Map<Folder, YamlMap> embedderYamls = new HashMap<Folder, YamlMap>();
 
   EmbedderYamlLocator(Map<String, List<Folder>> packageMap) {
@@ -254,18 +272,9 @@
     try {
       yaml = loadYaml(embedderYaml);
     } catch (_) {
-      // TODO(pquitslund): Notify developer that something is wrong with the
-      // _embedder.yaml file in libDir.
-      return;
-    }
-    if (yaml == null) {
-      // TODO(pquitslund): Notify developer that something is wrong with the
-      // _embedder.yaml file in libDir.
       return;
     }
     if (yaml is! YamlMap) {
-      // TODO(pquitslund): Notify developer that something is wrong with the
-      // _embedder.yaml file in libDir.
       return;
     }
     embedderYamls[libDir] = yaml;
diff --git a/pkg/analyzer/lib/source/sdk_ext.dart b/pkg/analyzer/lib/source/sdk_ext.dart
index 126d3b6..f4bcdb9 100644
--- a/pkg/analyzer/lib/source/sdk_ext.dart
+++ b/pkg/analyzer/lib/source/sdk_ext.dart
@@ -8,6 +8,8 @@
 import 'dart:core' hide Resource;
 
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/package_map_provider.dart'
+    show PackageMapProvider;
 import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart' show FileBasedSource;
diff --git a/pkg/analyzer/lib/src/context/cache.dart b/pkg/analyzer/lib/src/context/cache.dart
index 7dbe398..36df855 100644
--- a/pkg/analyzer/lib/src/context/cache.dart
+++ b/pkg/analyzer/lib/src/context/cache.dart
@@ -54,6 +54,7 @@
    */
   AnalysisCache(this._partitions) {
     for (CachePartition partition in _partitions) {
+      partition.containingCaches.add(this);
       ReentrantSynchronousStreamSubscription<InvalidatedResult> subscription =
           partition.onResultInvalidated.listen((InvalidatedResult event) {
         onResultInvalidated.add(event);
@@ -96,6 +97,9 @@
         in onResultInvalidatedPartitionSubscriptions) {
       subscription.cancel();
     }
+    for (CachePartition partition in _partitions) {
+      partition.containingCaches.remove(this);
+    }
   }
 
   /**
@@ -349,12 +353,18 @@
    * Notifies the entry that the client is going to stop using it.
    */
   void dispose() {
-    _resultMap.forEach((descriptor, data) {
+    _resultMap.forEach((ResultDescriptor descriptor, ResultData data) {
       TargetedResult result = new TargetedResult(target, descriptor);
       for (TargetedResult dependedOnResult in data.dependedOnResults) {
-        ResultData dependedOnData = _partition._getDataFor(dependedOnResult);
-        if (dependedOnData != null) {
-          dependedOnData.dependentResults.remove(result);
+        for (AnalysisCache cache in _partition.containingCaches) {
+          CacheEntry entry = cache.get(dependedOnResult.target);
+          if (entry != null) {
+            ResultData data =
+                entry.getResultDataOrNull(dependedOnResult.result);
+            if (data != null) {
+              data.dependentResults.remove(result);
+            }
+          }
         }
       }
     });
@@ -375,14 +385,21 @@
   }
 
   /**
-   * Look up the [ResultData] of [descriptor], or add a new one if it isn't
-   * there.
+   * Return the result data associated with the [descriptor], creating one if it
+   * isn't there.
    */
   ResultData getResultData(ResultDescriptor descriptor) {
     return _resultMap.putIfAbsent(descriptor, () => new ResultData(descriptor));
   }
 
   /**
+   * Return the result data associated with the [descriptor], or `null` if there
+   * is no data currently associated with the descriptor.
+   */
+  ResultData getResultDataOrNull(ResultDescriptor descriptor) =>
+      _resultMap[descriptor];
+
+  /**
    * Return the state of the result represented by the given [descriptor].
    */
   CacheState getState(ResultDescriptor descriptor) {
@@ -584,11 +601,25 @@
 //      }
     }
     // Stop depending on other results.
-    TargetedResult thisResult = new TargetedResult(target, descriptor);
-    for (TargetedResult dependedOnResult in thisData.dependedOnResults) {
-      ResultData data = _partition._getDataFor(dependedOnResult);
-      if (data != null && deltaResult != DeltaResult.KEEP_CONTINUE) {
-        data.dependentResults.remove(thisResult);
+    if (deltaResult != DeltaResult.KEEP_CONTINUE) {
+      TargetedResult thisResult = new TargetedResult(target, descriptor);
+      List<AnalysisCache> caches = _partition.containingCaches;
+      int cacheLength = caches.length;
+      List<TargetedResult> results = thisData.dependedOnResults;
+      int resultLength = results.length;
+      for (int i = 0; i < resultLength; i++) {
+        TargetedResult dependedOnResult = results[i];
+        for (int j = 0; j < cacheLength; j++) {
+          AnalysisCache cache = caches[j];
+          CacheEntry entry = cache.get(dependedOnResult.target);
+          if (entry != null) {
+            ResultData data =
+                entry.getResultDataOrNull(dependedOnResult.result);
+            if (data != null) {
+              data.dependentResults.remove(thisResult);
+            }
+          }
+        }
       }
     }
     // Invalidate results that depend on this result.
@@ -611,7 +642,9 @@
    */
   void _invalidateAll() {
     List<ResultDescriptor> results = _resultMap.keys.toList();
-    for (ResultDescriptor result in results) {
+    int length = results.length;
+    for (int i = 0; i < length; i++) {
+      ResultDescriptor result = results[i];
       _invalidate(nextInvalidateId++, result, null, 0);
     }
   }
@@ -621,11 +654,20 @@
    */
   void _invalidateDependentResults(
       int id, ResultData thisData, Delta delta, int level) {
+    // It is necessary to copy the results to a list to avoid a concurrent
+    // modification of the set of dependent results.
+    List<AnalysisCache> caches = _partition.containingCaches;
+    int cacheLength = caches.length;
     List<TargetedResult> dependentResults = thisData.dependentResults.toList();
-    for (TargetedResult dependentResult in dependentResults) {
-      CacheEntry entry = _partition.get(dependentResult.target);
-      if (entry != null) {
-        entry._invalidate(id, dependentResult.result, delta, level);
+    int resultLength = dependentResults.length;
+    for (int i = 0; i < resultLength; i++) {
+      TargetedResult dependentResult = dependentResults[i];
+      for (int j = 0; j < cacheLength; j++) {
+        AnalysisCache cache = caches[j];
+        CacheEntry entry = cache.get(dependentResult.target);
+        if (entry != null) {
+          entry._invalidate(id, dependentResult.result, delta, level);
+        }
       }
     }
   }
@@ -644,19 +686,39 @@
    */
   void _setDependedOnResults(ResultData thisData, TargetedResult thisResult,
       List<TargetedResult> dependedOn) {
-    thisData.dependedOnResults.forEach((TargetedResult dependedOnResult) {
-      ResultData data = _partition._getDataFor(dependedOnResult);
-      if (data != null) {
-        data.dependentResults.remove(thisResult);
+    List<AnalysisCache> caches = _partition.containingCaches;
+    int cacheLength = caches.length;
+
+    List<TargetedResult> oldResults = thisData.dependedOnResults;
+    int oldLength = oldResults.length;
+    for (int i = 0; i < oldLength; i++) {
+      TargetedResult dependedOnResult = oldResults[i];
+      for (int j = 0; j < cacheLength; j++) {
+        AnalysisCache cache = caches[j];
+        CacheEntry entry = cache.get(dependedOnResult.target);
+        if (entry != null) {
+          ResultData data = entry.getResultDataOrNull(dependedOnResult.result);
+          if (data != null) {
+            data.dependentResults.remove(thisResult);
+          }
+        }
       }
-    });
+    }
     thisData.dependedOnResults = dependedOn;
-    thisData.dependedOnResults.forEach((TargetedResult dependedOnResult) {
-      ResultData data = _partition._getDataFor(dependedOnResult);
-      if (data != null) {
-        data.dependentResults.add(thisResult);
+    int newLength = dependedOn.length;
+    for (int i = 0; i < newLength; i++) {
+      TargetedResult dependedOnResult = dependedOn[i];
+      for (int j = 0; j < cacheLength; j++) {
+        AnalysisCache cache = caches[j];
+        CacheEntry entry = cache.get(dependedOnResult.target);
+        if (entry != null) {
+          ResultData data = entry.getResultDataOrNull(dependedOnResult.result);
+          if (data != null) {
+            data.dependentResults.add(thisResult);
+          }
+        }
       }
-    });
+    }
   }
 
   /**
@@ -670,9 +732,16 @@
     thisData.state = CacheState.ERROR;
     thisData.value = descriptor.defaultValue;
     // Propagate the error state.
+    List<AnalysisCache> caches = _partition.containingCaches;
+    int cacheLength = caches.length;
     thisData.dependentResults.forEach((TargetedResult dependentResult) {
-      CacheEntry entry = _partition.get(dependentResult.target);
-      entry._setErrorState(dependentResult.result, exception);
+      for (int i = 0; i < cacheLength; i++) {
+        AnalysisCache cache = caches[i];
+        CacheEntry entry = cache.get(dependentResult.target);
+        if (entry != null) {
+          entry._setErrorState(dependentResult.result, exception);
+        }
+      }
     });
   }
 
@@ -865,6 +934,12 @@
   final InternalAnalysisContext context;
 
   /**
+   * A list of the caches that contain this partition. This includes the cache
+   * associated with the context that owns this partition.
+   */
+  final List<AnalysisCache> containingCaches = <AnalysisCache>[];
+
+  /**
    * A table mapping caching policies to the cache flush managers.
    */
   final HashMap<ResultCachingPolicy, CacheFlushManager> _flushManagerMap =
@@ -1013,11 +1088,6 @@
     }
   }
 
-  ResultData _getDataFor(TargetedResult result) {
-    CacheEntry entry = context.analysisCache.get(result.target);
-    return entry != null ? entry._resultMap[result.result] : null;
-  }
-
   /**
    * Return the [CacheFlushManager] for the given [descriptor], not `null`.
    */
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index f5464b1..23cae4a 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -116,6 +116,12 @@
    */
   AnalysisCache _cache;
 
+  @override
+  final ReentrantSynchronousStream<InvalidatedResult> onResultInvalidated =
+      new ReentrantSynchronousStream<InvalidatedResult>();
+
+  ReentrantSynchronousStreamSubscription onResultInvalidatedSubscription = null;
+
   /**
    * Configuration data associated with this context.
    */
@@ -215,7 +221,7 @@
 
   /**
    * The result of incremental resolution result of
-   * [incrementalResolutionValidation_lastSource].
+   * [incrementalResolutionValidation_lastUnitSource].
    */
   CompilationUnit incrementalResolutionValidation_lastUnit;
 
@@ -421,6 +427,7 @@
     }
     factory.context = this;
     _sourceFactory = factory;
+    _cache?.dispose();
     _cache = createCacheFromSourceFactory(factory);
     for (WorkManager workManager in workManagers) {
       workManager.onSourceFactoryChanged();
@@ -678,18 +685,25 @@
    * Create an analysis cache based on the given source [factory].
    */
   AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
-    if (factory == null) {
-      return new AnalysisCache(<CachePartition>[_privatePartition]);
+    AnalysisCache createCache() {
+      if (factory == null) {
+        return new AnalysisCache(<CachePartition>[_privatePartition]);
+      }
+      DartSdk sdk = factory.dartSdk;
+      if (sdk == null) {
+        return new AnalysisCache(<CachePartition>[_privatePartition]);
+      }
+      return new AnalysisCache(<CachePartition>[
+        AnalysisEngine.instance.partitionManager.forSdk(sdk),
+        _privatePartition
+      ]);
     }
-    DartSdk sdk = factory.dartSdk;
-    if (sdk == null) {
-      return new AnalysisCache(<CachePartition>[_privatePartition]);
-    }
-    AnalysisCache cache = new AnalysisCache(<CachePartition>[
-      AnalysisEngine.instance.partitionManager.forSdk(sdk),
-      _privatePartition
-    ]);
-    cache.onResultInvalidated.listen((InvalidatedResult event) {
+
+    AnalysisCache cache = createCache();
+    onResultInvalidatedSubscription?.cancel();
+    onResultInvalidatedSubscription =
+        cache.onResultInvalidated.listen((InvalidatedResult event) {
+      onResultInvalidated.add(event);
       StreamController<ResultChangedEvent> controller =
           _resultChangedControllers[event.descriptor];
       if (controller != null) {
@@ -1079,6 +1093,7 @@
    * to do.
    */
   void invalidateCachedResults() {
+    _cache?.dispose();
     _cache = createCacheFromSourceFactory(_sourceFactory);
     for (WorkManager workManager in workManagers) {
       workManager.onAnalysisOptionsChanged();
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index dcd413a..0c9a84f 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
+import 'package:analyzer/src/util/fast_uri.dart';
 import 'package:package_config/packages.dart';
 
 /**
@@ -22,9 +23,6 @@
  * against an existing [Source].
  */
 class SourceFactoryImpl implements SourceFactory {
-  /**
-   * The analysis context that this source factory is associated with.
-   */
   @override
   AnalysisContext context;
 
@@ -57,23 +55,19 @@
 
   /**
    * Initialize a newly created source factory with the given absolute URI
-   * [resolvers] and optional [packages] resolution helper.
+   * [resolvers] and optional [_packages] resolution helper.
    */
   SourceFactoryImpl(this.resolvers,
       [this._packages, ResourceProvider resourceProvider])
       : _resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE;
 
-  /**
-   * Return the [DartSdk] associated with this [SourceFactory], or `null` if
-   * there is no such SDK.
-   *
-   * @return the [DartSdk] associated with this [SourceFactory], or `null` if
-   *         there is no such SDK
-   */
   @override
   DartSdk get dartSdk {
-    for (UriResolver resolver in resolvers) {
+    List<UriResolver> resolvers = this.resolvers;
+    int length = resolvers.length;
+    for (int i = 0; i < length; i++) {
+      UriResolver resolver = resolvers[i];
       if (resolver is DartUriResolver) {
         DartUriResolver dartUriResolver = resolver;
         return dartUriResolver.dartSdk;
@@ -82,18 +76,11 @@
     return null;
   }
 
-  /**
-   * Sets the [LocalSourcePredicate].
-   *
-   * @param localSourcePredicate the predicate to determine is [Source] is local
-   */
   @override
   void set localSourcePredicate(LocalSourcePredicate localSourcePredicate) {
     this._localSourcePredicate = localSourcePredicate;
   }
 
-  /// A table mapping package names to paths of directories containing
-  /// the package (or [null] if there is no registered package URI resolver).
   @override
   Map<String, List<Folder>> get packageMap {
     // Start by looking in .packages.
@@ -115,10 +102,6 @@
     return resolver?.packageMap;
   }
 
-  /**
-   * Return a source factory that will resolve URI's in the same way that this
-   * source factory does.
-   */
   @override
   SourceFactory clone() {
     SourceFactory factory =
@@ -127,17 +110,10 @@
     return factory;
   }
 
-  /**
-   * Return a source object representing the given absolute URI, or `null` if
-   * the URI is not a valid URI or if it is not an absolute URI.
-   *
-   * @param absoluteUri the absolute URI to be resolved
-   * @return a source object representing the absolute URI
-   */
   @override
   Source forUri(String absoluteUri) {
     try {
-      Uri uri = parseUriWithException(absoluteUri);
+      Uri uri = FastUri.parse(absoluteUri);
       if (uri.isAbsolute) {
         return _internalResolveUri(null, uri);
       }
@@ -149,13 +125,6 @@
     return null;
   }
 
-  /**
-   * Return a source object representing the given absolute URI, or `null` if
-   * the URI is not an absolute URI.
-   *
-   * @param absoluteUri the absolute URI to be resolved
-   * @return a source object representing the absolute URI
-   */
   @override
   Source forUri2(Uri absoluteUri) {
     if (absoluteUri.isAbsolute) {
@@ -170,15 +139,6 @@
     return null;
   }
 
-  /**
-   * Return a source object that is equal to the source object used to obtain
-   * the given encoding.
-   *
-   * @param encoding the encoding of a source object
-   * @return a source object that is described by the given encoding
-   * @throws IllegalArgumentException if the argument is not a valid encoding
-   * See [Source.encoding].
-   */
   @override
   Source fromEncoding(String encoding) {
     Source source = forUri(encoding);
@@ -189,22 +149,9 @@
     return source;
   }
 
-  /**
-   * Determines if the given [Source] is local.
-   *
-   * @param source the [Source] to analyze
-   * @return `true` if the given [Source] is local
-   */
   @override
   bool isLocalSource(Source source) => _localSourcePredicate.isLocal(source);
 
-  /**
-   * Return a source representing the URI that results from resolving the given
-   * (possibly relative) [containedUri] against the URI associated with the
-   * [containingSource], whether or not the resulting source exists, or `null`
-   * if either the [containedUri] is invalid or if it cannot be resolved against
-   * the [containingSource]'s URI.
-   */
   @override
   Source resolveUri(Source containingSource, String containedUri) {
     if (containedUri == null || containedUri.isEmpty) {
@@ -212,8 +159,7 @@
     }
     try {
       // Force the creation of an escaped URI to deal with spaces, etc.
-      return _internalResolveUri(
-          containingSource, parseUriWithException(containedUri));
+      return _internalResolveUri(containingSource, FastUri.parse(containedUri));
     } on URISyntaxException {
       return null;
     } catch (exception, stackTrace) {
@@ -227,13 +173,6 @@
     }
   }
 
-  /**
-   * Return an absolute URI that represents the given source, or `null` if a
-   * valid URI cannot be computed.
-   *
-   * @param source the source to get URI for
-   * @return the absolute URI representing the given source
-   */
   @override
   Uri restoreUri(Source source) {
     // First see if a resolver can restore the URI.
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 2ed3515..5e2b646 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -2131,7 +2131,7 @@
 
   /**
    * Initialize a newly created comment. The list of [tokens] must contain at
-   * least one token. The [type] is the type of the comment. The list of
+   * least one token. The [_type] is the type of the comment. The list of
    * [references] can be empty if the comment does not contain any embedded
    * references.
    */
diff --git a/pkg/analyzer/lib/src/dart/ast/token.dart b/pkg/analyzer/lib/src/dart/ast/token.dart
index 39a3ab5..9828113 100644
--- a/pkg/analyzer/lib/src/dart/ast/token.dart
+++ b/pkg/analyzer/lib/src/dart/ast/token.dart
@@ -45,7 +45,7 @@
   /**
    * Initialize a newly created token to have the given [type] at the given
    * [offset] and to be preceded by the comments reachable from the given
-   * [comment].
+   * [_precedingComment].
    */
   BeginTokenWithComment(TokenType type, int offset, this._precedingComment)
       : super(type, offset) {
@@ -174,7 +174,7 @@
   /**
    * Initialize a newly created token to to represent the given [keyword] at the
    * given [offset] and to be preceded by the comments reachable from the given
-   * [comment].
+   * [_precedingComment].
    */
   KeywordTokenWithComment(Keyword keyword, int offset, this._precedingComment)
       : super(keyword, offset) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index ddcad2b..78d0f5f 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -19,6 +19,7 @@
 import 'package:analyzer/src/generated/constant.dart' show EvaluationResultImpl;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine;
+import 'package:analyzer/src/generated/error.dart' show CompileTimeErrorCode;
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -429,9 +430,8 @@
   @override
   List<ElementAnnotation> get metadata {
     if (_unlinkedClass != null) {
-      return _metadata ??= _unlinkedClass.annotations
-          .map(enclosingUnit.resynthesizerContext.buildAnnotation)
-          .toList();
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, _unlinkedClass.annotations);
     }
     return super.metadata;
   }
@@ -474,6 +474,9 @@
   }
 
   @override
+  TypeParameterizedElementMixin get typeParameterContext => this;
+
+  @override
   List<TypeParameterElement> get typeParameters {
     if (_unlinkedClass != null) {
       return super.typeParameters;
@@ -614,7 +617,9 @@
 
   @override
   PropertyAccessorElement getGetter(String getterName) {
-    for (PropertyAccessorElement accessor in _accessors) {
+    int length = _accessors.length;
+    for (int i = 0; i < length; i++) {
+      PropertyAccessorElement accessor = _accessors[i];
       if (accessor.isGetter && accessor.name == getterName) {
         return accessor;
       }
@@ -624,7 +629,9 @@
 
   @override
   MethodElement getMethod(String methodName) {
-    for (MethodElement method in _methods) {
+    int length = _methods.length;
+    for (int i = 0; i < length; i++) {
+      MethodElement method = _methods[i];
       if (method.name == methodName) {
         return method;
       }
@@ -1085,7 +1092,7 @@
    * A list containing all of the top-level accessors (getters and setters)
    * contained in this compilation unit.
    */
-  List<PropertyAccessorElement> _accessors = PropertyAccessorElement.EMPTY_LIST;
+  List<PropertyAccessorElement> _accessors;
 
   /**
    * A list containing all of the enums contained in this compilation unit.
@@ -1096,7 +1103,7 @@
    * A list containing all of the top-level functions contained in this
    * compilation unit.
    */
-  List<FunctionElement> _functions = FunctionElement.EMPTY_LIST;
+  List<FunctionElement> _functions;
 
   /**
    * A list containing all of the function type aliases contained in this
@@ -1113,7 +1120,7 @@
   /**
    * A list containing all of the variables contained in this compilation unit.
    */
-  List<TopLevelVariableElement> _variables = TopLevelVariableElement.EMPTY_LIST;
+  List<TopLevelVariableElement> _variables;
 
   /**
    * A map from offsets to elements of this unit at these offsets.
@@ -1121,6 +1128,24 @@
   final Map<int, Element> _offsetToElementMap = new HashMap<int, Element>();
 
   /**
+   * Resynthesized explicit top-level property accessors.
+   */
+  UnitExplicitTopLevelAccessors _explicitTopLevelAccessors;
+
+  /**
+   * Resynthesized explicit top-level variables.
+   */
+  UnitExplicitTopLevelVariables _explicitTopLevelVariables;
+
+  /**
+   * Description of top-level variable replacements that should be applied
+   * to implicit top-level variables because of re-linking top-level property
+   * accessors between different unit of the same library.
+   */
+  Map<TopLevelVariableElement, TopLevelVariableElement>
+      _topLevelVariableReplaceMap;
+
+  /**
    * Initialize a newly created compilation unit element to have the given
    * [name].
    */
@@ -1146,7 +1171,22 @@
   }
 
   @override
-  List<PropertyAccessorElement> get accessors => _accessors;
+  List<PropertyAccessorElement> get accessors {
+    if (_unlinkedUnit != null) {
+      if (_accessors == null) {
+        _explicitTopLevelAccessors ??=
+            resynthesizerContext.buildTopLevelAccessors();
+        _explicitTopLevelVariables ??=
+            resynthesizerContext.buildTopLevelVariables();
+        List<PropertyAccessorElementImpl> accessors =
+            <PropertyAccessorElementImpl>[];
+        accessors.addAll(_explicitTopLevelAccessors.accessors);
+        accessors.addAll(_explicitTopLevelVariables.implicitAccessors);
+        _accessors = accessors;
+      }
+    }
+    return _accessors ?? PropertyAccessorElement.EMPTY_LIST;
+  }
 
   /**
    * Set the top-level accessors (getters and setters) contained in this
@@ -1198,7 +1238,12 @@
   }
 
   @override
-  List<FunctionElement> get functions => _functions;
+  List<FunctionElement> get functions {
+    if (_unlinkedUnit != null) {
+      _functions ??= resynthesizerContext.buildTopLevelFunctions();
+    }
+    return _functions ?? FunctionElement.EMPTY_LIST;
+  }
 
   /**
    * Set the top-level functions contained in this compilation unit to the given
@@ -1219,8 +1264,9 @@
 
   @override
   bool get hasLoadLibraryFunction {
-    for (int i = 0; i < _functions.length; i++) {
-      if (_functions[i].name == FunctionElement.LOAD_LIBRARY_NAME) {
+    List<FunctionElement> functions = this.functions;
+    for (int i = 0; i < functions.length; i++) {
+      if (functions[i].name == FunctionElement.LOAD_LIBRARY_NAME) {
         return true;
       }
     }
@@ -1236,23 +1282,47 @@
   @override
   List<ElementAnnotation> get metadata {
     if (_unlinkedPart != null) {
-      CompilationUnitElementImpl definingUnit =
-          library.definingCompilationUnit as CompilationUnitElementImpl;
-      return _metadata ??= _unlinkedPart.annotations
-          .map(definingUnit.resynthesizerContext.buildAnnotation)
-          .toList();
+      return _metadata ??= _buildAnnotations(
+          library.definingCompilationUnit as CompilationUnitElementImpl,
+          _unlinkedPart.annotations);
     }
     return super.metadata;
   }
 
   @override
-  List<TopLevelVariableElement> get topLevelVariables => _variables;
+  List<TopLevelVariableElement> get topLevelVariables {
+    if (_unlinkedUnit != null) {
+      if (_variables == null) {
+        _explicitTopLevelAccessors ??=
+            resynthesizerContext.buildTopLevelAccessors();
+        _explicitTopLevelVariables ??=
+            resynthesizerContext.buildTopLevelVariables();
+        List<TopLevelVariableElementImpl> variables =
+            <TopLevelVariableElementImpl>[];
+        variables.addAll(_explicitTopLevelVariables.variables);
+        variables.addAll(_explicitTopLevelAccessors.implicitVariables);
+        // Ensure that getters and setters in different units use
+        // the same top-level variables.
+        (enclosingElement as LibraryElementImpl)
+            .resynthesizerContext
+            .patchTopLevelAccessors();
+        _variables = variables;
+        _topLevelVariableReplaceMap?.forEach((from, to) {
+          int index = _variables.indexOf(from);
+          _variables[index] = to;
+        });
+        _topLevelVariableReplaceMap = null;
+      }
+    }
+    return _variables ?? TopLevelVariableElement.EMPTY_LIST;
+  }
 
   /**
    * Set the top-level variables contained in this compilation unit to the given
    * [variables].
    */
   void set topLevelVariables(List<TopLevelVariableElement> variables) {
+    assert(!isResynthesized);
     for (TopLevelVariableElement field in variables) {
       (field as TopLevelVariableElementImpl).enclosingElement = this;
     }
@@ -1271,6 +1341,9 @@
   }
 
   @override
+  TypeParameterizedElementMixin get typeParameterContext => null;
+
+  @override
   List<ClassElement> get types => _types;
 
   /**
@@ -1334,19 +1407,19 @@
     // thrown a CCE if any of the elements in the arrays were not of the
     // expected types.
     //
-    for (PropertyAccessorElement accessor in _accessors) {
+    for (PropertyAccessorElement accessor in accessors) {
       PropertyAccessorElementImpl accessorImpl = accessor;
       if (accessorImpl.identifier == identifier) {
         return accessorImpl;
       }
     }
-    for (TopLevelVariableElement variable in _variables) {
+    for (TopLevelVariableElement variable in topLevelVariables) {
       TopLevelVariableElementImpl variableImpl = variable;
       if (variableImpl.identifier == identifier) {
         return variableImpl;
       }
     }
-    for (FunctionElement function in _functions) {
+    for (FunctionElement function in functions) {
       FunctionElementImpl functionImpl = function;
       if (functionImpl.identifier == identifier) {
         return functionImpl;
@@ -1360,7 +1433,7 @@
     }
     for (ClassElement type in _types) {
       ClassElementImpl typeImpl = type;
-      if (typeImpl.identifier == identifier) {
+      if (typeImpl.name == identifier) {
         return typeImpl;
       }
     }
@@ -1406,8 +1479,17 @@
    */
   void replaceTopLevelVariable(
       TopLevelVariableElement from, TopLevelVariableElement to) {
-    int index = _variables.indexOf(from);
-    _variables[index] = to;
+    if (_unlinkedUnit != null) {
+      // Getters and setter in different units should be patched to use the
+      // same variables before these variables were asked and returned.
+      assert(_variables == null);
+      _topLevelVariableReplaceMap ??=
+          <TopLevelVariableElement, TopLevelVariableElement>{};
+      _topLevelVariableReplaceMap[from] = to;
+    } else {
+      int index = _variables.indexOf(from);
+      _variables[index] = to;
+    }
   }
 
   /**
@@ -1422,12 +1504,12 @@
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
-    safelyVisitChildren(_accessors, visitor);
+    safelyVisitChildren(accessors, visitor);
     safelyVisitChildren(_enums, visitor);
-    safelyVisitChildren(_functions, visitor);
+    safelyVisitChildren(functions, visitor);
     safelyVisitChildren(_typeAliases, visitor);
     safelyVisitChildren(_types, visitor);
-    safelyVisitChildren(_variables, visitor);
+    safelyVisitChildren(topLevelVariables, visitor);
   }
 }
 
@@ -1452,6 +1534,13 @@
    * Initialize a newly created field element to have the given [name].
    */
   ConstFieldElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  ConstFieldElementImpl.forSerialized(
+      UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement)
+      : super.forSerialized(unlinkedVariable, enclosingElement);
 }
 
 /**
@@ -1541,6 +1630,10 @@
   @override
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
 
+  @override
+  TypeParameterizedElementMixin get enclosingTypeParameterContext =>
+      super.enclosingElement as ClassElementImpl;
+
   /**
    * Set whether this constructor represents a factory method.
    */
@@ -1639,6 +1732,13 @@
    */
   ConstTopLevelVariableElementImpl.forNode(Identifier name)
       : super.forNode(name);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  ConstTopLevelVariableElementImpl.forSerialized(
+      UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement)
+      : super.forSerialized(unlinkedVariable, enclosingElement);
 }
 
 /**
@@ -1721,8 +1821,8 @@
    * Initialize using the given serialized information.
    */
   DefaultParameterElementImpl.forSerialized(
-      UnlinkedParam unlinkedParam, ExecutableElementImpl enclosingExecutable)
-      : super.forSerialized(unlinkedParam, enclosingExecutable);
+      UnlinkedParam unlinkedParam, ElementImpl enclosingElement)
+      : super.forSerialized(unlinkedParam, enclosingElement);
 
   @override
   Expression get constantInitializer {
@@ -1731,8 +1831,8 @@
       if (defaultValue == null) {
         return null;
       }
-      return super.constantInitializer ??=
-          enclosingUnit.resynthesizerContext.buildExpression(defaultValue);
+      return super.constantInitializer ??= enclosingUnit.resynthesizerContext
+          .buildExpression(this, defaultValue);
     }
     return super.constantInitializer;
   }
@@ -1765,7 +1865,7 @@
    * Initialize a newly created instance of this class. Instances of this class
    * should <b>not</b> be created except as part of creating the type associated
    * with this element. The single instance of this class should be accessed
-   * through the method [getInstance].
+   * through the method [instance].
    */
   DynamicElementImpl() : super(Keyword.DYNAMIC.syntax, -1) {
     setModifier(Modifier.SYNTHETIC, true);
@@ -2263,6 +2363,15 @@
     setModifier(Modifier.SYNTHETIC, isSynthetic);
   }
 
+  /**
+   * Return the context to resolve type parameters in, or `null` if neither this
+   * element nor any of its ancestors is of a kind that can declare type
+   * parameters.
+   */
+  TypeParameterizedElementMixin get typeParameterContext {
+    return _enclosingElement?.typeParameterContext;
+  }
+
   @override
   CompilationUnit get unit => context.resolveCompilationUnit(source, library);
 
@@ -2431,6 +2540,24 @@
   }
 
   /**
+   * Return annotations for the given [unlinkedConsts] in the [unit].
+   */
+  List<ElementAnnotation> _buildAnnotations(
+      CompilationUnitElementImpl unit, List<UnlinkedConst> unlinkedConsts) {
+    int length = unlinkedConsts.length;
+    if (length != 0) {
+      List<ElementAnnotation> annotations = new List<ElementAnnotation>(length);
+      ResynthesizerContext context = unit.resynthesizerContext;
+      for (int i = 0; i < length; i++) {
+        annotations[i] = context.buildAnnotation(this, unlinkedConsts[i]);
+      }
+      return annotations;
+    } else {
+      return const <ElementAnnotation>[];
+    }
+  }
+
+  /**
    *  Updates cached values after an input changed.
    *
    *  Throws [FrozenHashCodeException] if not allowed.
@@ -2615,6 +2742,7 @@
  * A base class for concrete implementations of an [ExecutableElement].
  */
 abstract class ExecutableElementImpl extends ElementImpl
+    with TypeParameterizedElementMixin
     implements ExecutableElement {
   /**
    * The unlinked representation of the executable in the summary.
@@ -2849,9 +2977,8 @@
   @override
   List<ElementAnnotation> get metadata {
     if (serializedExecutable != null) {
-      return _metadata ??= serializedExecutable.annotations
-          .map(enclosingUnit.resynthesizerContext.buildAnnotation)
-          .toList();
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, serializedExecutable.annotations);
     }
     return super.metadata;
   }
@@ -2887,6 +3014,9 @@
   }
 
   @override
+  TypeParameterizedElementMixin get typeParameterContext => this;
+
+  @override
   List<TypeParameterElement> get typeParameters => _typeParameters;
 
   /**
@@ -2901,6 +3031,10 @@
   }
 
   @override
+  List<UnlinkedTypeParam> get unlinkedTypeParams =>
+      serializedExecutable.typeParameters;
+
+  @override
   void appendTo(StringBuffer buffer) {
     if (this.kind != ElementKind.GETTER) {
       int typeParameterCount = _typeParameters.length;
@@ -2997,20 +3131,69 @@
 class ExportElementImpl extends UriReferencedElementImpl
     implements ExportElement {
   /**
+   * The unlinked representation of the export in the summary.
+   */
+  final UnlinkedExportPublic _unlinkedExportPublic;
+
+  /**
+   * The unlinked representation of the export in the summary.
+   */
+  final UnlinkedExportNonPublic _unlinkedExportNonPublic;
+
+  /**
    * The library that is exported from this library by this export directive.
    */
-  LibraryElement exportedLibrary;
+  LibraryElement _exportedLibrary;
 
   /**
    * The combinators that were specified as part of the export directive in the
    * order in which they were specified.
    */
-  List<NamespaceCombinator> combinators = NamespaceCombinator.EMPTY_LIST;
+  List<NamespaceCombinator> _combinators;
 
   /**
    * Initialize a newly created export element at the given [offset].
    */
-  ExportElementImpl(int offset) : super(null, offset);
+  ExportElementImpl(int offset)
+      : _unlinkedExportPublic = null,
+        _unlinkedExportNonPublic = null,
+        super(null, offset);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  ExportElementImpl.forSerialized(this._unlinkedExportPublic,
+      this._unlinkedExportNonPublic, LibraryElementImpl enclosingLibrary)
+      : super.forSerialized(enclosingLibrary);
+
+  @override
+  List<NamespaceCombinator> get combinators {
+    if (_unlinkedExportPublic != null && _combinators == null) {
+      _combinators = ImportElementImpl
+          ._buildCombinators(_unlinkedExportPublic.combinators);
+    }
+    return _combinators ?? const <NamespaceCombinator>[];
+  }
+
+  void set combinators(List<NamespaceCombinator> combinators) {
+    assert(_unlinkedExportPublic == null);
+    _combinators = combinators;
+  }
+
+  @override
+  LibraryElement get exportedLibrary {
+    if (_unlinkedExportNonPublic != null && _exportedLibrary == null) {
+      LibraryElementImpl library = enclosingElement as LibraryElementImpl;
+      _exportedLibrary = library.resynthesizerContext
+          .buildExportedLibrary(_unlinkedExportPublic.uri);
+    }
+    return _exportedLibrary;
+  }
+
+  void set exportedLibrary(LibraryElement exportedLibrary) {
+    assert(_unlinkedExportNonPublic == null);
+    _exportedLibrary = exportedLibrary;
+  }
 
   @override
   String get identifier => exportedLibrary.name;
@@ -3019,6 +3202,71 @@
   ElementKind get kind => ElementKind.EXPORT;
 
   @override
+  List<ElementAnnotation> get metadata {
+    if (_unlinkedExportNonPublic != null) {
+      return _metadata ??= _buildAnnotations(
+          library.definingCompilationUnit as CompilationUnitElementImpl,
+          _unlinkedExportNonPublic.annotations);
+    }
+    return super.metadata;
+  }
+
+  void set metadata(List<ElementAnnotation> metadata) {
+    assert(_unlinkedExportNonPublic == null);
+    super.metadata = metadata;
+  }
+
+  @override
+  int get nameOffset {
+    if (_unlinkedExportNonPublic != null) {
+      return _unlinkedExportNonPublic.offset;
+    }
+    return super.nameOffset;
+  }
+
+  @override
+  String get uri {
+    if (_unlinkedExportPublic != null) {
+      return _unlinkedExportPublic.uri;
+    }
+    return super.uri;
+  }
+
+  @override
+  void set uri(String uri) {
+    assert(_unlinkedExportPublic == null);
+    super.uri = uri;
+  }
+
+  @override
+  int get uriEnd {
+    if (_unlinkedExportNonPublic != null) {
+      return _unlinkedExportNonPublic.uriEnd;
+    }
+    return super.uriEnd;
+  }
+
+  @override
+  void set uriEnd(int uriEnd) {
+    assert(_unlinkedExportNonPublic == null);
+    super.uriEnd = uriEnd;
+  }
+
+  @override
+  int get uriOffset {
+    if (_unlinkedExportNonPublic != null) {
+      return _unlinkedExportNonPublic.uriOffset;
+    }
+    return super.uriOffset;
+  }
+
+  @override
+  void set uriOffset(int uriOffset) {
+    assert(_unlinkedExportNonPublic == null);
+    super.uriOffset = uriOffset;
+  }
+
+  @override
   accept(ElementVisitor visitor) => visitor.visitExportElement(this);
 
   @override
@@ -3044,6 +3292,13 @@
    */
   FieldElementImpl.forNode(Identifier name) : super.forNode(name);
 
+  /**
+   * Initialize using the given serialized information.
+   */
+  FieldElementImpl.forSerialized(
+      UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement)
+      : super.forSerialized(unlinkedVariable, enclosingElement);
+
   @override
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
 
@@ -3147,7 +3402,7 @@
 
   /**
    * Initialize a newly created function element to have no name and the given
-   * [offset]. This is used for function expressions, that have no name.
+   * [nameOffset]. This is used for function expressions, that have no name.
    */
   FunctionElementImpl.forOffset(int nameOffset) : super("", nameOffset);
 
@@ -3173,6 +3428,11 @@
   }
 
   @override
+  TypeParameterizedElementMixin get enclosingTypeParameterContext {
+    return (enclosingElement as ElementImpl).typeParameterContext;
+  }
+
+  @override
   String get identifier {
     String identifier = super.identifier;
     if (!isStatic) {
@@ -3357,9 +3617,8 @@
   @override
   List<ElementAnnotation> get metadata {
     if (_unlinkedTypedef != null) {
-      return _metadata ??= _unlinkedTypedef.annotations
-          .map(enclosingUnit.resynthesizerContext.buildAnnotation)
-          .toList();
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, _unlinkedTypedef.annotations);
     }
     return super.metadata;
   }
@@ -3396,6 +3655,9 @@
   }
 
   @override
+  TypeParameterizedElementMixin get typeParameterContext => this;
+
+  @override
   List<TypeParameterElement> get typeParameters {
     if (_unlinkedTypedef != null) {
       return super.typeParameters;
@@ -3489,10 +3751,35 @@
  */
 class HideElementCombinatorImpl implements HideElementCombinator {
   /**
+   * The unlinked representation of the combinator in the summary.
+   */
+  final UnlinkedCombinator _unlinkedCombinator;
+
+  /**
    * The names that are not to be made visible in the importing library even if
    * they are defined in the imported library.
    */
-  List<String> hiddenNames = StringUtilities.EMPTY_ARRAY;
+  List<String> _hiddenNames;
+
+  HideElementCombinatorImpl() : _unlinkedCombinator = null;
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  HideElementCombinatorImpl.forSerialized(this._unlinkedCombinator);
+
+  @override
+  List<String> get hiddenNames {
+    if (_unlinkedCombinator != null) {
+      _hiddenNames ??= _unlinkedCombinator.hides.toList(growable: false);
+    }
+    return _hiddenNames ?? const <String>[];
+  }
+
+  void set hiddenNames(List<String> hiddenNames) {
+    assert(_unlinkedCombinator == null);
+    _hiddenNames = hiddenNames;
+  }
 
   @override
   String toString() {
@@ -3515,38 +3802,72 @@
 class ImportElementImpl extends UriReferencedElementImpl
     implements ImportElement {
   /**
+   * The unlinked representation of the import in the summary.
+   */
+  final UnlinkedImport _unlinkedImport;
+
+  /**
+   * The index of the dependency in the `imports` list.
+   */
+  final int _linkedDependency;
+
+  /**
    * The offset of the prefix of this import in the file that contains the this
    * import directive, or `-1` if this import is synthetic.
    */
-  int prefixOffset = 0;
+  int _prefixOffset = 0;
 
   /**
    * The library that is imported into this library by this import directive.
    */
-  LibraryElement importedLibrary;
+  LibraryElement _importedLibrary;
 
   /**
    * The combinators that were specified as part of the import directive in the
    * order in which they were specified.
    */
-  List<NamespaceCombinator> combinators = NamespaceCombinator.EMPTY_LIST;
+  List<NamespaceCombinator> _combinators;
 
   /**
    * The prefix that was specified as part of the import directive, or `null` if
    * there was no prefix specified.
    */
-  PrefixElement prefix;
+  PrefixElement _prefix;
 
   /**
    * Initialize a newly created import element at the given [offset].
    * The offset may be `-1` if the import is synthetic.
    */
-  ImportElementImpl(int offset) : super(null, offset);
+  ImportElementImpl(int offset)
+      : _unlinkedImport = null,
+        _linkedDependency = null,
+        super(null, offset);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  ImportElementImpl.forSerialized(this._unlinkedImport, this._linkedDependency,
+      LibraryElementImpl enclosingLibrary)
+      : super.forSerialized(enclosingLibrary);
+
+  @override
+  List<NamespaceCombinator> get combinators {
+    if (_unlinkedImport != null && _combinators == null) {
+      _combinators = _buildCombinators(_unlinkedImport.combinators);
+    }
+    return _combinators ?? const <NamespaceCombinator>[];
+  }
+
+  void set combinators(List<NamespaceCombinator> combinators) {
+    assert(_unlinkedImport == null);
+    _combinators = combinators;
+  }
 
   /**
    * Set whether this import is for a deferred library.
    */
   void set deferred(bool isDeferred) {
+    assert(_unlinkedImport == null);
     setModifier(Modifier.DEFERRED, isDeferred);
   }
 
@@ -3554,12 +3875,151 @@
   String get identifier => "${importedLibrary.identifier}@$nameOffset";
 
   @override
-  bool get isDeferred => hasModifier(Modifier.DEFERRED);
+  LibraryElement get importedLibrary {
+    if (_linkedDependency != null) {
+      if (_importedLibrary == null) {
+        LibraryElementImpl library = enclosingElement as LibraryElementImpl;
+        if (_linkedDependency == 0) {
+          _importedLibrary = library;
+        } else {
+          _importedLibrary = library.resynthesizerContext
+              .buildImportedLibrary(_linkedDependency);
+        }
+      }
+    }
+    return _importedLibrary;
+  }
+
+  void set importedLibrary(LibraryElement importedLibrary) {
+    assert(_unlinkedImport == null);
+    _importedLibrary = importedLibrary;
+  }
+
+  @override
+  bool get isDeferred {
+    if (_unlinkedImport != null) {
+      return _unlinkedImport.isDeferred;
+    }
+    return hasModifier(Modifier.DEFERRED);
+  }
+
+  @override
+  bool get isSynthetic {
+    if (_unlinkedImport != null) {
+      return _unlinkedImport.isImplicit;
+    }
+    return super.isSynthetic;
+  }
 
   @override
   ElementKind get kind => ElementKind.IMPORT;
 
   @override
+  List<ElementAnnotation> get metadata {
+    if (_unlinkedImport != null) {
+      return _metadata ??= _buildAnnotations(
+          library.definingCompilationUnit as CompilationUnitElementImpl,
+          _unlinkedImport.annotations);
+    }
+    return super.metadata;
+  }
+
+  void set metadata(List<ElementAnnotation> metadata) {
+    assert(_unlinkedImport == null);
+    super.metadata = metadata;
+  }
+
+  @override
+  int get nameOffset {
+    if (_unlinkedImport != null) {
+      if (_unlinkedImport.isImplicit) {
+        return -1;
+      }
+      return _unlinkedImport.offset;
+    }
+    return super.nameOffset;
+  }
+
+  PrefixElement get prefix {
+    if (_unlinkedImport != null) {
+      if (_unlinkedImport.prefixReference != 0 && _prefix == null) {
+        LibraryElementImpl library = enclosingElement as LibraryElementImpl;
+        _prefix = new PrefixElementImpl.forSerialized(_unlinkedImport, library);
+      }
+    }
+    return _prefix;
+  }
+
+  void set prefix(PrefixElement prefix) {
+    assert(_unlinkedImport == null);
+    _prefix = prefix;
+  }
+
+  @override
+  int get prefixOffset {
+    if (_unlinkedImport != null) {
+      return _unlinkedImport.prefixOffset;
+    }
+    return _prefixOffset;
+  }
+
+  void set prefixOffset(int prefixOffset) {
+    assert(_unlinkedImport == null);
+    _prefixOffset = prefixOffset;
+  }
+
+  @override
+  String get uri {
+    if (_unlinkedImport != null) {
+      if (_unlinkedImport.isImplicit) {
+        return null;
+      }
+      return _unlinkedImport.uri;
+    }
+    return super.uri;
+  }
+
+  @override
+  void set uri(String uri) {
+    assert(_unlinkedImport == null);
+    super.uri = uri;
+  }
+
+  @override
+  int get uriEnd {
+    if (_unlinkedImport != null) {
+      if (_unlinkedImport.isImplicit) {
+        return -1;
+      }
+      return _unlinkedImport.uriEnd;
+    }
+    return super.uriEnd;
+  }
+
+  @override
+  void set uriEnd(int uriEnd) {
+    assert(_unlinkedImport == null);
+    super.uriEnd = uriEnd;
+  }
+
+  @override
+  int get uriOffset {
+    if (_unlinkedImport != null) {
+      if (_unlinkedImport.isImplicit) {
+        return -1;
+      }
+      return _unlinkedImport.uriOffset;
+    }
+    return super.uriOffset;
+  }
+
+  @override
+  void set uriOffset(int uriOffset) {
+    assert(_unlinkedImport == null);
+    super.uriOffset = uriOffset;
+  }
+
+  @override
   accept(ElementVisitor visitor) => visitor.visitImportElement(this);
 
   @override
@@ -3573,6 +4033,24 @@
     super.visitChildren(visitor);
     prefix?.accept(visitor);
   }
+
+  static List<NamespaceCombinator> _buildCombinators(
+      List<UnlinkedCombinator> unlinkedCombinators) {
+    int length = unlinkedCombinators.length;
+    if (length != 0) {
+      List<NamespaceCombinator> combinators =
+          new List<NamespaceCombinator>(length);
+      for (int i = 0; i < length; i++) {
+        UnlinkedCombinator unlinkedCombinator = unlinkedCombinators[i];
+        combinators[i] = unlinkedCombinator.shows.isNotEmpty
+            ? new ShowElementCombinatorImpl.forSerialized(unlinkedCombinator)
+            : new HideElementCombinatorImpl.forSerialized(unlinkedCombinator);
+      }
+      return combinators;
+    } else {
+      return const <NamespaceCombinator>[];
+    }
+  }
 }
 
 /**
@@ -3605,8 +4083,8 @@
 
   /**
    * Initialize a newly created label element to have the given [name].
-   * [onSwitchStatement] should be `true` if this label is associated with a
-   * `switch` statement and [onSwitchMember] should be `true` if this label is
+   * [_onSwitchStatement] should be `true` if this label is associated with a
+   * `switch` statement and [_onSwitchMember] should be `true` if this label is
    * associated with a `switch` member.
    */
   LabelElementImpl.forNode(
@@ -3644,6 +4122,10 @@
    */
   final AnalysisContext context;
 
+  final LibraryResynthesizerContext resynthesizerContext;
+
+  final UnlinkedUnit _unlinkedDefiningUnit;
+
   /**
    * The compilation unit that defines this library.
    */
@@ -3653,19 +4135,19 @@
    * The entry point for this library, or `null` if this library does not have
    * an entry point.
    */
-  FunctionElement entryPoint;
+  FunctionElement _entryPoint;
 
   /**
    * A list containing specifications of all of the imports defined in this
    * library.
    */
-  List<ImportElement> _imports = ImportElement.EMPTY_LIST;
+  List<ImportElement> _imports;
 
   /**
    * A list containing specifications of all of the exports defined in this
    * library.
    */
-  List<ExportElement> _exports = ExportElement.EMPTY_LIST;
+  List<ExportElement> _exports;
 
   /**
    * A list containing the strongly connected component in the import/export
@@ -3695,22 +4177,32 @@
    * The export [Namespace] of this library, `null` if it has not been
    * computed yet.
    */
-  @override
-  Namespace exportNamespace;
+  Namespace _exportNamespace;
 
   /**
    * The public [Namespace] of this library, `null` if it has not been
    * computed yet.
    */
-  @override
-  Namespace publicNamespace;
+  Namespace _publicNamespace;
+
+  /**
+   * A bit-encoded form of the capabilities associated with this library.
+   */
+  int _resolutionCapabilities = 0;
+
+  /**
+   * The cached list of prefixes.
+   */
+  List<PrefixElement> _prefixes;
 
   /**
    * Initialize a newly created library element in the given [context] to have
    * the given [name] and [offset].
    */
   LibraryElementImpl(this.context, String name, int offset, this.nameLength)
-      : super(name, offset);
+      : resynthesizerContext = null,
+        _unlinkedDefiningUnit = null,
+        super(name, offset);
 
   /**
    * Initialize a newly created library element in the given [context] to have
@@ -3718,8 +4210,24 @@
    */
   LibraryElementImpl.forNode(this.context, LibraryIdentifier name)
       : nameLength = name != null ? name.length : 0,
+        resynthesizerContext = null,
+        _unlinkedDefiningUnit = null,
         super.forNode(name);
 
+  /**
+   * Initialize using the given serialized information.
+   */
+  LibraryElementImpl.forSerialized(this.context, String name, int offset,
+      this.nameLength, this.resynthesizerContext, this._unlinkedDefiningUnit)
+      : super.forSerialized(null) {
+    _name = name;
+    _nameOffset = offset;
+    setResolutionCapability(
+        LibraryResolutionCapability.resolvedTypeNames, true);
+    setResolutionCapability(
+        LibraryResolutionCapability.constantExpressions, true);
+  }
+
   @override
   int get codeLength {
     CompilationUnitElement unit = _definingCompilationUnit;
@@ -3753,9 +4261,40 @@
   }
 
   @override
+  SourceRange get docRange {
+    if (_unlinkedDefiningUnit != null) {
+      UnlinkedDocumentationComment comment =
+          _unlinkedDefiningUnit.libraryDocumentationComment;
+      return comment != null
+          ? new SourceRange(comment.offset, comment.length)
+          : null;
+    }
+    return super.docRange;
+  }
+
+  @override
+  String get documentationComment {
+    if (_unlinkedDefiningUnit != null) {
+      return _unlinkedDefiningUnit?.libraryDocumentationComment?.text;
+    }
+    return super.documentationComment;
+  }
+
+  FunctionElement get entryPoint {
+    if (resynthesizerContext != null) {
+      _entryPoint ??= resynthesizerContext.findEntryPoint();
+    }
+    return _entryPoint;
+  }
+
+  void set entryPoint(FunctionElement entryPoint) {
+    _entryPoint = entryPoint;
+  }
+
+  @override
   List<LibraryElement> get exportedLibraries {
     HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
-    for (ExportElement element in _exports) {
+    for (ExportElement element in exports) {
       LibraryElement library = element.exportedLibrary;
       if (library != null) {
         libraries.add(library);
@@ -3765,13 +4304,51 @@
   }
 
   @override
-  List<ExportElement> get exports => _exports;
+  Namespace get exportNamespace {
+    if (resynthesizerContext != null) {
+      _exportNamespace ??= resynthesizerContext.buildExportNamespace();
+    }
+    return _exportNamespace;
+  }
+
+  void set exportNamespace(Namespace exportNamespace) {
+    _exportNamespace = exportNamespace;
+  }
+
+  @override
+  List<ExportElement> get exports {
+    if (_unlinkedDefiningUnit != null && _exports == null) {
+      List<UnlinkedExportNonPublic> unlinkedNonPublicExports =
+          _unlinkedDefiningUnit.exports;
+      List<UnlinkedExportPublic> unlinkedPublicExports =
+          _unlinkedDefiningUnit.publicNamespace.exports;
+      assert(
+          _unlinkedDefiningUnit.exports.length == unlinkedPublicExports.length);
+      int length = unlinkedNonPublicExports.length;
+      if (length != 0) {
+        List<ExportElement> exports = new List<ExportElement>(length);
+        for (int i = 0; i < length; i++) {
+          UnlinkedExportPublic serializedExportPublic =
+              unlinkedPublicExports[i];
+          UnlinkedExportNonPublic serializedExportNonPublic =
+              unlinkedNonPublicExports[i];
+          exports[i] = new ExportElementImpl.forSerialized(
+              serializedExportPublic, serializedExportNonPublic, library);
+        }
+        _exports = exports;
+      } else {
+        _exports = const <ExportElement>[];
+      }
+    }
+    return _exports ?? const <ExportElement>[];
+  }
 
   /**
    * Set the specifications of all of the exports defined in this library to the
    * given list of [exports].
    */
   void set exports(List<ExportElement> exports) {
+    assert(_unlinkedDefiningUnit == null);
     for (ExportElement exportElement in exports) {
       (exportElement as ExportElementImpl).enclosingElement = this;
     }
@@ -3807,7 +4384,7 @@
   @override
   List<LibraryElement> get importedLibraries {
     HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
-    for (ImportElement element in _imports) {
+    for (ImportElement element in imports) {
       LibraryElement library = element.importedLibrary;
       if (library != null) {
         libraries.add(library);
@@ -3817,13 +4394,31 @@
   }
 
   @override
-  List<ImportElement> get imports => _imports;
+  List<ImportElement> get imports {
+    if (_unlinkedDefiningUnit != null && _imports == null) {
+      List<UnlinkedImport> unlinkedImports = _unlinkedDefiningUnit.imports;
+      int length = unlinkedImports.length;
+      if (length != 0) {
+        List<ImportElement> imports = new List<ImportElement>(length);
+        LinkedLibrary linkedLibrary = resynthesizerContext.linkedLibrary;
+        for (int i = 0; i < length; i++) {
+          imports[i] = new ImportElementImpl.forSerialized(
+              unlinkedImports[i], linkedLibrary.importDependencies[i], library);
+        }
+        _imports = imports;
+      } else {
+        _imports = const <ImportElement>[];
+      }
+    }
+    return _imports ?? ImportElement.EMPTY_LIST;
+  }
 
   /**
    * Set the specifications of all of the imports defined in this library to the
    * given list of [imports].
    */
   void set imports(List<ImportElement> imports) {
+    assert(_unlinkedDefiningUnit == null);
     for (ImportElement importElement in imports) {
       (importElement as ImportElementImpl).enclosingElement = this;
       PrefixElementImpl prefix = importElement.prefix as PrefixElementImpl;
@@ -3832,6 +4427,7 @@
       }
     }
     this._imports = imports;
+    this._prefixes = null;
   }
 
   @override
@@ -3878,9 +4474,7 @@
 
   @override
   bool get isResynthesized {
-    CompilationUnitElement definingUnit = _definingCompilationUnit;
-    return definingUnit is CompilationUnitElementImpl &&
-        definingUnit.resynthesizerContext != null;
+    return resynthesizerContext != null;
   }
 
   @override
@@ -3973,6 +4567,17 @@
   }
 
   @override
+  List<ElementAnnotation> get metadata {
+    if (_unlinkedDefiningUnit != null) {
+      _metadata ??= _buildAnnotations(
+          _definingCompilationUnit as CompilationUnitElementImpl,
+          _unlinkedDefiningUnit.libraryAnnotations);
+      return _metadata;
+    }
+    return super.metadata;
+  }
+
+  @override
   List<CompilationUnitElement> get parts => _parts;
 
   /**
@@ -3990,14 +4595,29 @@
 
   @override
   List<PrefixElement> get prefixes {
-    HashSet<PrefixElement> prefixes = new HashSet<PrefixElement>();
-    for (ImportElement element in _imports) {
-      PrefixElement prefix = element.prefix;
-      if (prefix != null) {
-        prefixes.add(prefix);
+    if (_prefixes == null) {
+      HashSet<PrefixElement> prefixes = new HashSet<PrefixElement>();
+      for (ImportElement element in imports) {
+        PrefixElement prefix = element.prefix;
+        if (prefix != null) {
+          prefixes.add(prefix);
+        }
       }
+      _prefixes = prefixes.toList();
     }
-    return new List.from(prefixes);
+    return _prefixes;
+  }
+
+  @override
+  Namespace get publicNamespace {
+    if (resynthesizerContext != null) {
+      _publicNamespace ??= resynthesizerContext.buildPublicNamespace();
+    }
+    return _publicNamespace;
+  }
+
+  void set publicNamespace(Namespace publicNamespace) {
+    _publicNamespace = publicNamespace;
   }
 
   @override
@@ -4052,13 +4672,13 @@
         return partImpl;
       }
     }
-    for (ImportElement importElement in _imports) {
+    for (ImportElement importElement in imports) {
       ImportElementImpl importElementImpl = importElement;
       if (importElementImpl.identifier == identifier) {
         return importElementImpl;
       }
     }
-    for (ExportElement exportElement in _exports) {
+    for (ExportElement exportElement in exports) {
       ExportElementImpl exportElementImpl = exportElement;
       if (exportElementImpl.identifier == identifier) {
         return exportElementImpl;
@@ -4069,11 +4689,12 @@
 
   @override
   List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement) {
-    int count = _imports.length;
+    var imports = this.imports;
+    int count = imports.length;
     List<ImportElement> importList = new List<ImportElement>();
     for (int i = 0; i < count; i++) {
-      if (identical(_imports[i].prefix, prefixElement)) {
-        importList.add(_imports[i]);
+      if (identical(imports[i].prefix, prefixElement)) {
+        importList.add(imports[i]);
       }
     }
     return importList;
@@ -4154,12 +4775,22 @@
     return _safeIsUpToDate(this, timeStamp, visitedLibraries);
   }
 
+  /**
+   * Set whether the library has the given [capability] to
+   * correspond to the given [value].
+   */
+  void setResolutionCapability(
+      LibraryResolutionCapability capability, bool value) {
+    _resolutionCapabilities =
+        BooleanArray.set(_resolutionCapabilities, capability.index, value);
+  }
+
   @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     _definingCompilationUnit?.accept(visitor);
-    safelyVisitChildren(_exports, visitor);
-    safelyVisitChildren(_imports, visitor);
+    safelyVisitChildren(exports, visitor);
+    safelyVisitChildren(imports, visitor);
     safelyVisitChildren(_parts, visitor);
   }
 
@@ -4174,7 +4805,7 @@
       return;
     }
     // add imported libraries
-    for (ImportElement importElement in _imports) {
+    for (ImportElement importElement in imports) {
       LibraryElement importedLibrary = importElement.importedLibrary;
       if (importedLibrary != null) {
         (importedLibrary as LibraryElementImpl)
@@ -4183,7 +4814,7 @@
     }
     // add exported libraries
     if (includeExports) {
-      for (ExportElement exportElement in _exports) {
+      for (ExportElement exportElement in exports) {
         LibraryElement exportedLibrary = exportElement.exportedLibrary;
         if (exportedLibrary != null) {
           (exportedLibrary as LibraryElementImpl)
@@ -4194,6 +4825,15 @@
   }
 
   /**
+   * Return `true` if the [library] has the given [capability].
+   */
+  static bool hasResolutionCapability(
+      LibraryElement library, LibraryResolutionCapability capability) {
+    return library is LibraryElementImpl &&
+        BooleanArray.get(library._resolutionCapabilities, capability.index);
+  }
+
+  /**
    * Return `true` if the given [library] is up to date with respect to the
    * given [timeStamp]. The set of [visitedLibraries] is used to prevent
    * infinite recursion in the case of mutually dependent libraries.
@@ -4233,6 +4873,65 @@
 }
 
 /**
+ * Enum of possible resolution capabilities that a [LibraryElementImpl] has.
+ */
+enum LibraryResolutionCapability {
+  /**
+   * All elements have their types resolved.
+   */
+  resolvedTypeNames,
+
+  /**
+   * All (potentially) constants expressions are set into corresponding
+   * elements.
+   */
+  constantExpressions,
+}
+
+/**
+ * The context in which the library is resynthesized.
+ */
+abstract class LibraryResynthesizerContext {
+  /**
+   * Return the [LinkedLibrary] that corresponds to the library being
+   * resynthesized.
+   */
+  LinkedLibrary get linkedLibrary;
+
+  /**
+   * Return the exported [LibraryElement] for with the given [relativeUri].
+   */
+  LibraryElement buildExportedLibrary(String relativeUri);
+
+  /**
+   * Return the export namespace of the library.
+   */
+  Namespace buildExportNamespace();
+
+  /**
+   * Return the imported [LibraryElement] for the given dependency in the
+   * linked library.
+   */
+  LibraryElement buildImportedLibrary(int dependency);
+
+  /**
+   * Return the public namespace of the library.
+   */
+  Namespace buildPublicNamespace();
+
+  /**
+   * Find the entry point of the library.
+   */
+  FunctionElement findEntryPoint();
+
+  /**
+   * Ensure that getters and setters in different units use the same
+   * top-level variables.
+   */
+  void patchTopLevelAccessors();
+}
+
+/**
  * A concrete implementation of a [LocalVariableElement].
  */
 class LocalVariableElementImpl extends NonParameterVariableElementImpl
@@ -4358,6 +5057,10 @@
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
 
   @override
+  TypeParameterizedElementMixin get enclosingTypeParameterContext =>
+      super.enclosingElement as ClassElementImpl;
+
+  @override
   bool get isOperator {
     String name = displayName;
     if (name.isEmpty) {
@@ -4795,6 +5498,9 @@
   }
 
   @override
+  TypeParameterizedElementMixin get enclosingTypeParameterContext => null;
+
+  @override
   List<ExecutableElement> get inheritedElements => _elements;
 
   void set inheritedElements(List<ExecutableElement> elements) {
@@ -4856,6 +5562,26 @@
   }
 
   @override
+  SourceRange get docRange {
+    if (_unlinkedVariable != null) {
+      UnlinkedDocumentationComment comment =
+          _unlinkedVariable.documentationComment;
+      return comment != null
+          ? new SourceRange(comment.offset, comment.length)
+          : null;
+    }
+    return super.docRange;
+  }
+
+  @override
+  String get documentationComment {
+    if (_unlinkedVariable != null) {
+      return _unlinkedVariable?.documentationComment?.text;
+    }
+    return super.documentationComment;
+  }
+
+  @override
   void set final2(bool isFinal) {
     assert(_unlinkedVariable == null);
     super.final2 = isFinal;
@@ -4894,9 +5620,8 @@
   @override
   List<ElementAnnotation> get metadata {
     if (_unlinkedVariable != null) {
-      return _metadata ??= _unlinkedVariable.annotations
-          .map(enclosingUnit.resynthesizerContext.buildAnnotation)
-          .toList();
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, _unlinkedVariable.annotations);
     }
     return super.metadata;
   }
@@ -4983,8 +5708,8 @@
    * Initialize using the given serialized information.
    */
   ParameterElementImpl.forSerialized(
-      this._unlinkedParam, ElementImpl enclosingExecutable)
-      : super.forSerialized(enclosingExecutable);
+      this._unlinkedParam, ElementImpl enclosingElement)
+      : super.forSerialized(enclosingElement);
 
   /**
    * Creates a synthetic parameter with [name], [type] and [kind].
@@ -5090,12 +5815,8 @@
   @override
   List<ElementAnnotation> get metadata {
     if (_unlinkedParam != null) {
-      if (_unlinkedParam.annotations.isEmpty) {
-        return const <ElementAnnotation>[];
-      }
-      return _metadata ??= _unlinkedParam.annotations
-          .map(enclosingUnit.resynthesizerContext.buildAnnotation)
-          .toList();
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, _unlinkedParam.annotations);
     }
     return super.metadata;
   }
@@ -5243,15 +5964,34 @@
  */
 class PrefixElementImpl extends ElementImpl implements PrefixElement {
   /**
-   * Initialize a newly created method element to have the given [name] and
-   * [offset].
+   * The unlinked representation of the import in the summary.
    */
-  PrefixElementImpl(String name, int nameOffset) : super(name, nameOffset);
+  final UnlinkedImport _unlinkedImport;
+
+  /**
+   * Initialize a newly created method element to have the given [name] and
+   * [nameOffset].
+   */
+  PrefixElementImpl(String name, int nameOffset)
+      : _unlinkedImport = null,
+        super(name, nameOffset);
 
   /**
    * Initialize a newly created prefix element to have the given [name].
    */
-  PrefixElementImpl.forNode(Identifier name) : super.forNode(name);
+  PrefixElementImpl.forNode(Identifier name)
+      : _unlinkedImport = null,
+        super.forNode(name);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  PrefixElementImpl.forSerialized(
+      this._unlinkedImport, LibraryElementImpl enclosingLibrary)
+      : super.forSerialized(enclosingLibrary);
+
+  @override
+  String get displayName => name;
 
   @override
   LibraryElement get enclosingElement =>
@@ -5267,6 +6007,26 @@
   ElementKind get kind => ElementKind.PREFIX;
 
   @override
+  String get name {
+    if (_unlinkedImport != null) {
+      if (_name == null) {
+        LibraryElementImpl library = enclosingElement as LibraryElementImpl;
+        int prefixId = _unlinkedImport.prefixReference;
+        return _name = library._unlinkedDefiningUnit.references[prefixId].name;
+      }
+    }
+    return super.name;
+  }
+
+  @override
+  int get nameOffset {
+    if (_unlinkedImport != null) {
+      return _unlinkedImport.prefixOffset;
+    }
+    return super.nameOffset;
+  }
+
+  @override
   accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
 
   @override
@@ -5350,6 +6110,11 @@
     return super.displayName;
   }
 
+  @override
+  TypeParameterizedElementMixin get enclosingTypeParameterContext {
+    return (enclosingElement as ElementImpl).typeParameterContext;
+  }
+
   /**
    * Set whether this accessor is a getter.
    */
@@ -5490,6 +6255,13 @@
    * Initialize a newly created element to have the given [name].
    */
   PropertyInducingElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  PropertyInducingElementImpl.forSerialized(
+      UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement)
+      : super.forSerialized(unlinkedVariable, enclosingElement);
 }
 
 /**
@@ -5499,12 +6271,27 @@
   /**
    * Build [ElementAnnotationImpl] for the given [UnlinkedConst].
    */
-  ElementAnnotationImpl buildAnnotation(UnlinkedConst uc);
+  ElementAnnotationImpl buildAnnotation(ElementImpl context, UnlinkedConst uc);
 
   /**
    * Build [Expression] for the given [UnlinkedConst].
    */
-  Expression buildExpression(UnlinkedConst uc);
+  Expression buildExpression(ElementImpl context, UnlinkedConst uc);
+
+  /**
+   * Build explicit top-level property accessors.
+   */
+  UnitExplicitTopLevelAccessors buildTopLevelAccessors();
+
+  /**
+   * Build top-level functions.
+   */
+  List<FunctionElementImpl> buildTopLevelFunctions();
+
+  /**
+   * Build explicit top-level variables.
+   */
+  UnitExplicitTopLevelVariables buildTopLevelVariables();
 
   /**
    * Resolve an [EntityRef] into a type.  If the reference is
@@ -5523,21 +6310,72 @@
  */
 class ShowElementCombinatorImpl implements ShowElementCombinator {
   /**
+   * The unlinked representation of the combinator in the summary.
+   */
+  final UnlinkedCombinator _unlinkedCombinator;
+
+  /**
    * The names that are to be made visible in the importing library if they are
    * defined in the imported library.
    */
-  List<String> shownNames = StringUtilities.EMPTY_ARRAY;
+  List<String> _shownNames;
 
   /**
    * The offset of the character immediately following the last character of
    * this node.
    */
-  int end = -1;
+  int _end = -1;
 
   /**
    * The offset of the 'show' keyword of this element.
    */
-  int offset = 0;
+  int _offset = 0;
+
+  ShowElementCombinatorImpl() : _unlinkedCombinator = null;
+
+  /**
+   * Initialize using the given serialized information.
+   */
+  ShowElementCombinatorImpl.forSerialized(this._unlinkedCombinator);
+
+  @override
+  int get end {
+    if (_unlinkedCombinator != null) {
+      return _unlinkedCombinator.end;
+    }
+    return _end;
+  }
+
+  void set end(int end) {
+    assert(_unlinkedCombinator == null);
+    _end = end;
+  }
+
+  @override
+  int get offset {
+    if (_unlinkedCombinator != null) {
+      return _unlinkedCombinator.offset;
+    }
+    return _offset;
+  }
+
+  void set offset(int offset) {
+    assert(_unlinkedCombinator == null);
+    _offset = offset;
+  }
+
+  @override
+  List<String> get shownNames {
+    if (_unlinkedCombinator != null) {
+      _shownNames ??= _unlinkedCombinator.shows.toList(growable: false);
+    }
+    return _shownNames ?? const <String>[];
+  }
+
+  void set shownNames(List<String> shownNames) {
+    assert(_unlinkedCombinator == null);
+    _shownNames = shownNames;
+  }
 
   @override
   String toString() {
@@ -5571,6 +6409,13 @@
    */
   TopLevelVariableElementImpl.forNode(Identifier name) : super.forNode(name);
 
+  /**
+   * Initialize using the given serialized information.
+   */
+  TopLevelVariableElementImpl.forSerialized(
+      UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement)
+      : super.forSerialized(unlinkedVariable, enclosingElement);
+
   @override
   bool get isStatic => true;
 
@@ -5710,9 +6555,8 @@
   @override
   List<ElementAnnotation> get metadata {
     if (_unlinkedTypeParam != null) {
-      return _metadata ??= _unlinkedTypeParam.annotations
-          .map(enclosingUnit.resynthesizerContext.buildAnnotation)
-          .toList();
+      return _metadata ??=
+          _buildAnnotations(enclosingUnit, _unlinkedTypeParam.annotations);
     }
     return super.metadata;
   }
@@ -5819,6 +6663,21 @@
   List<UnlinkedTypeParam> get unlinkedTypeParams;
 
   /**
+   * Determine the default value of type argument [i]. in most cases this will
+   * be `dynamic`, but sometimes it will be the bound of the ith type parameter.
+   */
+  DartType computeDefaultTypeArgument(int i) {
+    // If strong mode is off, or we can tell quickly from the summary that there
+    // is no bound, then the default type argument is `dynamic`; we don't have
+    // to call `typeParameters` to find that out.
+    if (!context.analysisOptions.strongMode ||
+        (unlinkedTypeParams != null && unlinkedTypeParams[i].bound == null)) {
+      return DynamicTypeImpl.instance;
+    }
+    return typeParameters[i].bound ?? DynamicTypeImpl.instance;
+  }
+
+  /**
    * Convert the given [index] into a type parameter type.
    */
   TypeParameterType getTypeParameterType(int index) {
@@ -5851,6 +6710,32 @@
 }
 
 /**
+ * Container with information about explicit top-level property accessors and
+ * corresponding implicit top-level variables.
+ */
+class UnitExplicitTopLevelAccessors {
+  final List<PropertyAccessorElementImpl> accessors =
+      <PropertyAccessorElementImpl>[];
+  final List<TopLevelVariableElementImpl> implicitVariables =
+      <TopLevelVariableElementImpl>[];
+}
+
+/**
+ * Container with information about explicit top-level variables and
+ * corresponding implicit top-level property accessors.
+ */
+class UnitExplicitTopLevelVariables {
+  final List<TopLevelVariableElementImpl> variables;
+  final List<PropertyAccessorElementImpl> implicitAccessors =
+      <PropertyAccessorElementImpl>[];
+
+  UnitExplicitTopLevelVariables(int numberOfVariables)
+      : variables = numberOfVariables != 0
+            ? new List<TopLevelVariableElementImpl>(numberOfVariables)
+            : const <TopLevelVariableElementImpl>[];
+}
+
+/**
  * A concrete implementation of a [UriReferencedElement].
  */
 abstract class UriReferencedElementImpl extends ElementImpl
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 42c8498..0ee0b97 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -860,17 +860,20 @@
 
   /**
    * Invokes [callback] for each parameter of [kind] with the parameter's [name]
-   * and [type] after any type parameters have been applied.
+   * and type after any type parameters have been applied.
    */
   void _forEachParameterType(
       ParameterKind kind, callback(String name, DartType type)) {
-    if (baseParameters.isEmpty) {
+    List<ParameterElement> parameters = baseParameters;
+    if (parameters.isEmpty) {
       return;
     }
 
     List<DartType> typeParameters =
         TypeParameterTypeImpl.getTypes(this.typeParameters);
-    for (ParameterElement parameter in baseParameters) {
+    int length = parameters.length;
+    for (int i = 0; i < length; i++) {
+      ParameterElement parameter = parameters[i];
       if (parameter.parameterKind == kind) {
         TypeImpl type = parameter.type ?? DynamicTypeImpl.instance;
         if (typeArguments.length != 0 &&
@@ -1184,13 +1187,12 @@
   InterfaceTypeImpl._(Element element, String name, this.prunedTypedefs)
       : super(element, name);
 
-
   @override
   List<PropertyAccessorElement> get accessors {
     if (_accessors == null) {
       List<PropertyAccessorElement> accessors = element.accessors;
       List<PropertyAccessorElement> members =
-      new List<PropertyAccessorElement>(accessors.length);
+          new List<PropertyAccessorElement>(accessors.length);
       for (int i = 0; i < accessors.length; i++) {
         members[i] = PropertyAccessorMember.from(accessors[i], this);
       }
@@ -1199,7 +1201,6 @@
     return _accessors;
   }
 
-
   @override
   List<ConstructorElement> get constructors {
     if (_constructors == null) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
index 6bdabc9..0e0229c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
@@ -525,7 +525,9 @@
     //
     // Interface elements
     //
-    for (InterfaceType interfaceType in interfaces) {
+    int interfaceLength = interfaces.length;
+    for (int i = 0; i < interfaceLength; i++) {
+      InterfaceType interfaceType = interfaces[i];
       ClassElement interfaceElement = interfaceType.element;
       if (interfaceElement != null) {
         if (!visitedInterfaces.contains(interfaceElement)) {
@@ -561,26 +563,27 @@
   }
 
   /**
-   * Given some [ClassElement], this method finds and returns the [ExecutableElement] of
-   * the passed name in the class element. Static members, members in super types and members not
-   * accessible from the current library are not considered.
-   *
-   * @param classElt the class element to query
-   * @param memberName the name of the member to lookup in the class
-   * @return the found [ExecutableElement], or `null` if no such member was found
+   * Given some [classElement], this method finds and returns the executable
+   * element with the given [memberName] in the class element. Static members,
+   * members in super types and members not accessible from the current library
+   * are not considered.
    */
   ExecutableElement _lookupMemberInClass(
-      ClassElement classElt, String memberName) {
-    List<MethodElement> methods = classElt.methods;
-    for (MethodElement method in methods) {
+      ClassElement classElement, String memberName) {
+    List<MethodElement> methods = classElement.methods;
+    int methodLength = methods.length;
+    for (int i = 0; i < methodLength; i++) {
+      MethodElement method = methods[i];
       if (memberName == method.name &&
           method.isAccessibleIn(_library) &&
           !method.isStatic) {
         return method;
       }
     }
-    List<PropertyAccessorElement> accessors = classElt.accessors;
-    for (PropertyAccessorElement accessor in accessors) {
+    List<PropertyAccessorElement> accessors = classElement.accessors;
+    int accessorLength = accessors.length;
+    for (int i = 0; i < accessorLength; i++) {
+      PropertyAccessorElement accessor = accessors[i];
       if (memberName == accessor.name &&
           accessor.isAccessibleIn(_library) &&
           !accessor.isStatic) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index 0b17d71..e90ba86 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -57,11 +57,15 @@
    * Define the instance members defined by the given [classElement].
    */
   void _defineMembers(ClassElement classElement) {
-    for (PropertyAccessorElement accessor in classElement.accessors) {
-      define(accessor);
+    List<PropertyAccessorElement> accessors = classElement.accessors;
+    int accessorLength = accessors.length;
+    for (int i = 0; i < accessorLength; i++) {
+      define(accessors[i]);
     }
-    for (MethodElement method in classElement.methods) {
-      define(method);
+    List<MethodElement> methods = classElement.methods;
+    int methodLength = methods.length;
+    for (int i = 0; i < methodLength; i++) {
+      define(methods[i]);
     }
   }
 }
@@ -174,7 +178,10 @@
     }
     _parametersDefined = true;
     Scope parameterScope = enclosingScope;
-    for (ParameterElement parameter in _functionElement.parameters) {
+    List<ParameterElement> parameters = _functionElement.parameters;
+    int length = parameters.length;
+    for (int i = 0; i < length; i++) {
+      ParameterElement parameter = parameters[i];
       if (!parameter.isInitializingFormal) {
         parameterScope.define(parameter);
       }
@@ -186,8 +193,10 @@
    */
   void _defineTypeParameters() {
     Scope typeParameterScope = enclosingScope.enclosingScope;
-    for (TypeParameterElement typeParameter
-        in _functionElement.typeParameters) {
+    List<TypeParameterElement> typeParameters = _functionElement.typeParameters;
+    int length = typeParameters.length;
+    for (int i = 0; i < length; i++) {
+      TypeParameterElement typeParameter = typeParameters[i];
       typeParameterScope.define(typeParameter);
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 972043a..6d41c4fb 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1953,6 +1953,12 @@
   List<AnalysisTarget> get explicitTargets;
 
   /**
+   * Return the [StreamController] reporting [InvalidatedResult]s for everything
+   * in this context's cache.
+   */
+  ReentrantSynchronousStream<InvalidatedResult> get onResultInvalidated;
+
+  /**
    * Return a list containing all of the sources that have been marked as
    * priority sources. Clients must not modify the returned list.
    */
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index c21e7e6..9fb06c5 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -21,6 +21,7 @@
 import 'package:analyzer/src/task/model.dart';
 import 'package:analyzer/task/model.dart';
 import 'package:source_span/source_span.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 
 /**
  * The descriptor used to associate error processors with analysis contexts in
@@ -893,7 +894,7 @@
    * 1: the number of type parameters that were declared
    * 2: the number of type arguments provided
    *
-   * See [CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS], and
+   * See [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS], and
    * [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS].
    */
   static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS =
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index d201e96..78b7cf3 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -3813,7 +3813,9 @@
         }
         // Check methods.
         List<MethodElement> methodElements = superclassElement.methods;
-        for (MethodElement methodElement in methodElements) {
+        int length = methodElements.length;
+        for (int i = 0; i < length; i++) {
+          MethodElement methodElement = methodElements[i];
           // We need the same name.
           if (methodElement.name != executableElementName) {
             continue;
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 752475d..bedb35f 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -21,7 +21,7 @@
 }
 
 /**
- * Inserts the given [args] into [pattern].
+ * Inserts the given [arguments] into [pattern].
  *
  *     format('Hello, {0}!', ['John']) = 'Hello, John!'
  *     format('{0} are you {1}ing?', ['How', 'do']) = 'How are you doing?'
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 7f9657f..cf2ced8 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -3470,6 +3470,11 @@
    */
   bool _enclosingBlockContainsBreak = false;
 
+  /**
+   * Add node when a labelled `break` is encountered.
+   */
+  Set<AstNode> _enclosingBlockBreaksLabel = new Set<AstNode>();
+
   @override
   bool visitArgumentList(ArgumentList node) =>
       _visitExpressions(node.arguments);
@@ -3545,6 +3550,9 @@
   @override
   bool visitBreakStatement(BreakStatement node) {
     _enclosingBlockContainsBreak = true;
+    if (node.label != null) {
+      _enclosingBlockBreaksLabel.add(node.target);
+    }
     return false;
   }
 
@@ -3634,13 +3642,13 @@
       if (_visitExpressions(node.updaters)) {
         return true;
       }
+      bool blockReturns = _nodeExits(node.body);
       // TODO(jwren) Do we want to take all constant expressions into account?
       // If for(; true; ) (or for(;;)), and the body doesn't return or the body
       // doesn't have a break, then return true.
       bool implicitOrExplictTrue = conditionExpression == null ||
           (conditionExpression is BooleanLiteral && conditionExpression.value);
       if (implicitOrExplictTrue) {
-        bool blockReturns = _nodeExits(node.body);
         if (blockReturns || !_enclosingBlockContainsBreak) {
           return true;
         }
@@ -3680,17 +3688,19 @@
     // TODO(jwren) Do we want to take all constant expressions into account?
     if (conditionExpression is BooleanLiteral) {
       if (conditionExpression.value) {
-        // if(true) ...
+        // if (true) ...
         return _nodeExits(thenStatement);
       } else if (elseStatement != null) {
         // if (false) ...
         return _nodeExits(elseStatement);
       }
     }
+    bool thenExits = _nodeExits(thenStatement);
+    bool elseExits = _nodeExits(elseStatement);
     if (thenStatement == null || elseStatement == null) {
       return false;
     }
-    return _nodeExits(thenStatement) && _nodeExits(elseStatement);
+    return thenExits && elseExits;
   }
 
   @override
@@ -3716,8 +3726,16 @@
   bool visitLabel(Label node) => false;
 
   @override
-  bool visitLabeledStatement(LabeledStatement node) =>
-      node.statement.accept(this);
+  bool visitLabeledStatement(LabeledStatement node) {
+    try {
+      bool statementExits = _nodeExits(node.statement);
+      bool neverBrokeFromLabel =
+          !_enclosingBlockBreaksLabel.contains(node.statement);
+      return statementExits && neverBrokeFromLabel;
+    } finally {
+      _enclosingBlockBreaksLabel.remove(node.statement);
+    }
+  }
 
   @override
   bool visitLiteral(Literal node) => false;
@@ -3871,11 +3889,11 @@
       if (conditionExpression.accept(this)) {
         return true;
       }
+      bool blockReturns = node.body.accept(this);
       // TODO(jwren) Do we want to take all constant expressions into account?
       if (conditionExpression is BooleanLiteral) {
         // If while(true), and the body doesn't return or the body doesn't have
         // a break, then return true.
-        bool blockReturns = node.body.accept(this);
         if (conditionExpression.value &&
             (blockReturns || !_enclosingBlockContainsBreak)) {
           return true;
@@ -3910,7 +3928,7 @@
   }
 
   bool _visitStatements(NodeList<Statement> statements) {
-    for (int i = statements.length - 1; i >= 0; i--) {
+    for (int i = 0; i < statements.length; i++) {
       if (statements[i].accept(this)) {
         return true;
       }
@@ -6301,8 +6319,11 @@
     }
     // Clone the ASTs for default formal parameters, so that we can use them
     // during constant evaluation.
-    (element as ConstVariableElement).constantInitializer =
-        new ConstantAstCloner().cloneNode(node.defaultValue);
+    if (!LibraryElementImpl.hasResolutionCapability(
+        definingLibrary, LibraryResolutionCapability.constantExpressions)) {
+      (element as ConstVariableElement).constantInitializer =
+          new ConstantAstCloner().cloneNode(node.defaultValue);
+    }
     return null;
   }
 
@@ -7189,7 +7210,10 @@
    * Try to infer types of parameters of the [FunctionExpression] arguments.
    */
   void _inferFunctionExpressionsParametersTypes(ArgumentList argumentList) {
-    for (Expression argument in argumentList.arguments) {
+    NodeList<Expression> arguments = argumentList.arguments;
+    int length = arguments.length;
+    for (int i = 0; i < length; i++) {
+      Expression argument = arguments[i];
       ParameterElement parameter = argument.propagatedParameterElement;
       if (parameter == null) {
         parameter = argument.staticParameterElement;
@@ -9190,15 +9214,20 @@
       for (TypeParameter typeParameter in typeParameters.typeParameters) {
         TypeName bound = typeParameter.bound;
         if (bound != null) {
-          libraryScope ??= new LibraryScope(library, errorListener);
-          typeParametersScope ??= createTypeParametersScope();
-          typeNameResolver ??= new TypeNameResolver(new TypeSystemImpl(),
-              typeProvider, library, source, errorListener);
-          typeNameResolver.nameScope = typeParametersScope;
-          _resolveTypeName(bound);
           Element typeParameterElement = typeParameter.name.staticElement;
           if (typeParameterElement is TypeParameterElementImpl) {
-            typeParameterElement.bound = bound.type;
+            if (LibraryElementImpl.hasResolutionCapability(
+                library, LibraryResolutionCapability.resolvedTypeNames)) {
+              bound.type = typeParameterElement.bound;
+            } else {
+              libraryScope ??= new LibraryScope(library, errorListener);
+              typeParametersScope ??= createTypeParametersScope();
+              typeNameResolver ??= new TypeNameResolver(new TypeSystemImpl(),
+                  typeProvider, library, source, errorListener);
+              typeNameResolver.nameScope = typeParametersScope;
+              _resolveTypeName(bound);
+              typeParameterElement.bound = bound.type;
+            }
           }
         }
       }
@@ -9930,7 +9959,10 @@
     // types of field formal parameters can be correctly resolved.
     //
     List<ClassMember> nonFields = new List<ClassMember>();
-    for (ClassMember member in node.members) {
+    NodeList<ClassMember> members = node.members;
+    int length = members.length;
+    for (int i = 0; i < length; i++) {
+      ClassMember member = members[i];
       if (member is ConstructorDeclaration) {
         nonFields.add(member);
       } else {
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 8e1abb2..6f50b44 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -372,10 +372,6 @@
    */
   static int VM_PLATFORM = 2;
 
-  /**
-   * The short name of the library. This is the name used after 'dart:' in a
-   * URI.
-   */
   @override
   final String shortName;
 
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index 2e4abf1..1409cd5 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/util/fast_uri.dart';
 
 /**
  * Resolve the [containedUri] against [baseUri] using Dart rules.
@@ -33,12 +34,12 @@
       if (scheme == DartUriResolver.DART_SCHEME && part.indexOf('/') < 0) {
         part = "$part/$part.dart";
       }
-      baseUri = parseUriWithException("$scheme:/$part");
+      baseUri = FastUri.parse("$scheme:/$part");
     }
     Uri result = baseUri.resolveUri(containedUri);
     if (isOpaque) {
       result =
-          parseUriWithException("${result.scheme}:${result.path.substring(1)}");
+          FastUri.parse("${result.scheme}:${result.path.substring(1)}");
     }
     return result;
   } catch (exception, stackTrace) {
diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart
index d573693..81bd2db 100644
--- a/pkg/analyzer/lib/src/summary/flat_buffers.dart
+++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart
@@ -21,7 +21,8 @@
   int get size => 4;
 
   @override
-  List<bool> read(BufferPointer bp) => new _FbBoolList(bp.derefObject());
+  List<bool> read(BufferContext bc, int offset) =>
+      new _FbBoolList(bc, bc.derefObject(offset));
 }
 
 /**
@@ -34,51 +35,45 @@
   int get size => 1;
 
   @override
-  bool read(BufferPointer bp) => bp._getInt8() != 0;
+  bool read(BufferContext bc, int offset) => bc._getInt8(offset) != 0;
 }
 
 /**
- * A pointer to some data.
+ * Buffer with data and some context about it.
  */
-class BufferPointer {
+class BufferContext {
   final ByteData _buffer;
-  final int _offset;
 
-  factory BufferPointer.fromBytes(List<int> byteList, [int offset = 0]) {
+  factory BufferContext.fromBytes(List<int> byteList) {
     Uint8List uint8List = _asUint8List(byteList);
-    ByteData buf = new ByteData.view(uint8List.buffer);
-    return new BufferPointer._(buf, uint8List.offsetInBytes + offset);
+    ByteData buf = new ByteData.view(uint8List.buffer, uint8List.offsetInBytes);
+    return new BufferContext._(buf);
   }
 
-  BufferPointer._(this._buffer, this._offset);
+  BufferContext._(this._buffer);
 
-  BufferPointer derefObject() {
-    int uOffset = _getUint32();
-    return _advance(uOffset);
+  int derefObject(int offset) {
+    return offset + _getUint32(offset);
   }
 
-  @override
-  String toString() => _offset.toString();
+  Uint8List _asUint8LIst(int offset, int length) =>
+      _buffer.buffer.asUint8List(_buffer.offsetInBytes + offset, length);
 
-  BufferPointer _advance(int delta) {
-    return new BufferPointer._(_buffer, _offset + delta);
-  }
+  double _getFloat64(int offset) =>
+      _buffer.getFloat64(offset, Endianness.LITTLE_ENDIAN);
 
-  double _getFloat64([int delta = 0]) =>
-      _buffer.getFloat64(_offset + delta, Endianness.LITTLE_ENDIAN);
+  int _getInt32(int offset) =>
+      _buffer.getInt32(offset, Endianness.LITTLE_ENDIAN);
 
-  int _getInt32([int delta = 0]) =>
-      _buffer.getInt32(_offset + delta, Endianness.LITTLE_ENDIAN);
+  int _getInt8(int offset) => _buffer.getInt8(offset);
 
-  int _getInt8([int delta = 0]) => _buffer.getInt8(_offset + delta);
+  int _getUint16(int offset) =>
+      _buffer.getUint16(offset, Endianness.LITTLE_ENDIAN);
 
-  int _getUint16([int delta = 0]) =>
-      _buffer.getUint16(_offset + delta, Endianness.LITTLE_ENDIAN);
+  int _getUint32(int offset) =>
+      _buffer.getUint32(offset, Endianness.LITTLE_ENDIAN);
 
-  int _getUint32([int delta = 0]) =>
-      _buffer.getUint32(_offset + delta, Endianness.LITTLE_ENDIAN);
-
-  int _getUint8([int delta = 0]) => _buffer.getUint8(_offset + delta);
+  int _getUint8(int offset) => _buffer.getUint8(offset);
 
   /**
    * If the [byteList] is already a [Uint8List] return it.
@@ -563,7 +558,8 @@
   int get size => 4;
 
   @override
-  List<double> read(BufferPointer bp) => new _FbFloat64List(bp.derefObject());
+  List<double> read(BufferContext bc, int offset) =>
+      new _FbFloat64List(bc, bc.derefObject(offset));
 }
 
 /**
@@ -576,7 +572,7 @@
   int get size => 4;
 
   @override
-  int read(BufferPointer bp) => bp._getInt32();
+  int read(BufferContext bc, int offset) => bc._getInt32(offset);
 }
 
 /**
@@ -589,7 +585,7 @@
   int get size => 1;
 
   @override
-  int read(BufferPointer bp) => bp._getInt8();
+  int read(BufferContext bc, int offset) => bc._getInt8(offset);
 }
 
 /**
@@ -606,8 +602,8 @@
   int get size => 4;
 
   @override
-  List<E> read(BufferPointer bp) =>
-      new _FbGenericList<E>(_elementReader, bp.derefObject());
+  List<E> read(BufferContext bc, int offset) =>
+      new _FbGenericList<E>(_elementReader, bc, bc.derefObject(offset));
 }
 
 /**
@@ -620,7 +616,7 @@
 }
 
 /**
- * Object that can read a value at a [BufferPointer].
+ * Object that can read a value at a [BufferContext].
  */
 abstract class Reader<T> {
   const Reader();
@@ -631,23 +627,23 @@
   int get size;
 
   /**
-   * Read the value at the given pointer.
+   * Read the value at the given [offset] in [bc].
    */
-  T read(BufferPointer bp);
+  T read(BufferContext bc, int offset);
 
   /**
    * Read the value of the given [field] in the given [object].
    */
-  T vTableGet(BufferPointer object, int field, [T defaultValue]) {
-    int vTableSOffset = object._getInt32();
-    BufferPointer vTable = object._advance(-vTableSOffset);
-    int vTableSize = vTable._getUint16();
+  T vTableGet(BufferContext object, int offset, int field, [T defaultValue]) {
+    int vTableSOffset = object._getInt32(offset);
+    int vTableOffset = offset - vTableSOffset;
+    int vTableSize = object._getUint16(vTableOffset);
     int vTableFieldOffset = (1 + 1 + field) * 2;
     if (vTableFieldOffset < vTableSize) {
-      int fieldOffsetInObject = vTable._getUint16(vTableFieldOffset);
+      int fieldOffsetInObject =
+          object._getUint16(vTableOffset + vTableFieldOffset);
       if (fieldOffsetInObject != 0) {
-        BufferPointer fieldPointer = object._advance(fieldOffsetInObject);
-        return read(fieldPointer);
+        return read(object, offset + fieldOffsetInObject);
       }
     }
     return defaultValue;
@@ -664,11 +660,24 @@
   int get size => 4;
 
   @override
-  String read(BufferPointer ref) {
-    BufferPointer object = ref.derefObject();
-    int length = object._getUint32();
-    return UTF8
-        .decode(ref._buffer.buffer.asUint8List(object._offset + 4, length));
+  String read(BufferContext bc, int offset) {
+    int strOffset = bc.derefObject(offset);
+    int length = bc._getUint32(strOffset);
+    Uint8List bytes = bc._asUint8LIst(strOffset + 4, length);
+    if (_isLatin(bytes)) {
+      return new String.fromCharCodes(bytes);
+    }
+    return UTF8.decode(bytes);
+  }
+
+  static bool _isLatin(Uint8List bytes) {
+    int length = bytes.length;
+    for (int i = 0; i < length; i++) {
+      if (bytes[i] > 127) {
+        return false;
+      }
+    }
+    return true;
   }
 }
 
@@ -682,14 +691,14 @@
   int get size => 4;
 
   /**
-   * Return the object at [bp].
+   * Return the object at [offset].
    */
-  T createObject(BufferPointer bp);
+  T createObject(BufferContext bc, int offset);
 
   @override
-  T read(BufferPointer bp) {
-    bp = bp.derefObject();
-    return createObject(bp);
+  T read(BufferContext bp, int offset) {
+    int objectOffset = bp.derefObject(offset);
+    return createObject(bp, objectOffset);
   }
 }
 
@@ -705,7 +714,8 @@
   int get size => 4;
 
   @override
-  List<int> read(BufferPointer bp) => new _FbUint32List(bp.derefObject());
+  List<int> read(BufferContext bc, int offset) =>
+      new _FbUint32List(bc, bc.derefObject(offset));
 }
 
 /**
@@ -718,7 +728,7 @@
   int get size => 4;
 
   @override
-  int read(BufferPointer bp) => bp._getUint32();
+  int read(BufferContext bc, int offset) => bc._getUint32(offset);
 }
 
 /**
@@ -733,7 +743,8 @@
   int get size => 4;
 
   @override
-  List<int> read(BufferPointer bp) => new _FbUint8List(bp.derefObject());
+  List<int> read(BufferContext bc, int offset) =>
+      new _FbUint8List(bc, bc.derefObject(offset));
 }
 
 /**
@@ -746,22 +757,23 @@
   int get size => 1;
 
   @override
-  int read(BufferPointer bp) => bp._getUint8();
+  int read(BufferContext bc, int offset) => bc._getUint8(offset);
 }
 
 /**
  * List of booleans backed by 8-bit unsigned integers.
  */
 class _FbBoolList extends Object with ListMixin<bool> implements List<bool> {
-  final BufferPointer bp;
+  final BufferContext bc;
+  final int offset;
   int _length;
 
-  _FbBoolList(this.bp);
+  _FbBoolList(this.bc, this.offset);
 
   @override
   int get length {
     if (_length == null) {
-      int byteLength = bp._getUint32();
+      int byteLength = bc._getUint32(offset);
       _length = (byteLength - 1) * 8 - _getByte(byteLength - 1);
     }
     return _length;
@@ -782,18 +794,18 @@
   void operator []=(int i, bool e) =>
       throw new StateError('Attempt to modify immutable list');
 
-  int _getByte(int index) => bp._getUint8(4 + index);
+  int _getByte(int index) => bc._getUint8(offset + 4 + index);
 }
 
 /**
  * The list backed by 64-bit values - Uint64 length and Float64.
  */
 class _FbFloat64List extends _FbList<double> {
-  _FbFloat64List(BufferPointer bp) : super(bp);
+  _FbFloat64List(BufferContext bc, int offset) : super(bc, offset);
 
   @override
   double operator [](int i) {
-    return bp._getFloat64(8 + 8 * i);
+    return bc._getFloat64(offset + 8 + 8 * i);
   }
 }
 
@@ -805,15 +817,15 @@
 
   List<E> _items;
 
-  _FbGenericList(this.elementReader, BufferPointer bp) : super(bp);
+  _FbGenericList(this.elementReader, BufferContext bp, int offset)
+      : super(bp, offset);
 
   @override
   E operator [](int i) {
     _items ??= new List<E>(length);
     E item = _items[i];
     if (item == null) {
-      BufferPointer ref = bp._advance(4 + elementReader.size * i);
-      item = elementReader.read(ref);
+      item = elementReader.read(bc, offset + 4 + elementReader.size * i);
       _items[i] = item;
     }
     return item;
@@ -824,14 +836,15 @@
  * The base class for immutable lists read from flat buffers.
  */
 abstract class _FbList<E> extends Object with ListMixin<E> implements List<E> {
-  final BufferPointer bp;
+  final BufferContext bc;
+  final int offset;
   int _length;
 
-  _FbList(this.bp);
+  _FbList(this.bc, this.offset);
 
   @override
   int get length {
-    _length ??= bp._getUint32();
+    _length ??= bc._getUint32(offset);
     return _length;
   }
 
@@ -848,11 +861,11 @@
  * List backed by 32-bit unsigned integers.
  */
 class _FbUint32List extends _FbList<int> {
-  _FbUint32List(BufferPointer bp) : super(bp);
+  _FbUint32List(BufferContext bc, int offset) : super(bc, offset);
 
   @override
   int operator [](int i) {
-    return bp._getUint32(4 + 4 * i);
+    return bc._getUint32(offset + 4 + 4 * i);
   }
 }
 
@@ -860,11 +873,11 @@
  * List backed by 8-bit unsigned integers.
  */
 class _FbUint8List extends _FbList<int> {
-  _FbUint8List(BufferPointer bp) : super(bp);
+  _FbUint8List(BufferContext bc, int offset) : super(bc, offset);
 
   @override
   int operator [](int i) {
-    return bp._getUint8(4 + i);
+    return bc._getUint8(offset + 4 + i);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 9b80057..7a60450 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -18,8 +18,8 @@
   int get size => 1;
 
   @override
-  idl.CacheSourceKind read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.CacheSourceKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.CacheSourceKind.values.length ? idl.CacheSourceKind.values[index] : idl.CacheSourceKind.library;
   }
 }
@@ -31,8 +31,8 @@
   int get size => 1;
 
   @override
-  idl.IndexNameKind read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.IndexNameKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.IndexNameKind.values.length ? idl.IndexNameKind.values[index] : idl.IndexNameKind.topLevel;
   }
 }
@@ -44,8 +44,8 @@
   int get size => 1;
 
   @override
-  idl.IndexRelationKind read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.IndexRelationKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.IndexRelationKind.values.length ? idl.IndexRelationKind.values[index] : idl.IndexRelationKind.IS_ANCESTOR_OF;
   }
 }
@@ -57,8 +57,8 @@
   int get size => 1;
 
   @override
-  idl.IndexSyntheticElementKind read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.IndexSyntheticElementKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.IndexSyntheticElementKind.values.length ? idl.IndexSyntheticElementKind.values[index] : idl.IndexSyntheticElementKind.notSynthetic;
   }
 }
@@ -70,8 +70,8 @@
   int get size => 1;
 
   @override
-  idl.ReferenceKind read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.ReferenceKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.ReferenceKind.values.length ? idl.ReferenceKind.values[index] : idl.ReferenceKind.classOrEnum;
   }
 }
@@ -83,8 +83,8 @@
   int get size => 1;
 
   @override
-  idl.UnlinkedConstOperation read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.UnlinkedConstOperation read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.UnlinkedConstOperation.values.length ? idl.UnlinkedConstOperation.values[index] : idl.UnlinkedConstOperation.pushInt;
   }
 }
@@ -96,8 +96,8 @@
   int get size => 1;
 
   @override
-  idl.UnlinkedConstructorInitializerKind read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.UnlinkedConstructorInitializerKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.UnlinkedConstructorInitializerKind.values.length ? idl.UnlinkedConstructorInitializerKind.values[index] : idl.UnlinkedConstructorInitializerKind.field;
   }
 }
@@ -109,8 +109,8 @@
   int get size => 1;
 
   @override
-  idl.UnlinkedExecutableKind read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.UnlinkedExecutableKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.UnlinkedExecutableKind.values.length ? idl.UnlinkedExecutableKind.values[index] : idl.UnlinkedExecutableKind.functionOrMethod;
   }
 }
@@ -122,8 +122,8 @@
   int get size => 1;
 
   @override
-  idl.UnlinkedExprAssignOperator read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.UnlinkedExprAssignOperator read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.UnlinkedExprAssignOperator.values.length ? idl.UnlinkedExprAssignOperator.values[index] : idl.UnlinkedExprAssignOperator.assign;
   }
 }
@@ -135,8 +135,8 @@
   int get size => 1;
 
   @override
-  idl.UnlinkedParamKind read(fb.BufferPointer bp) {
-    int index = const fb.Uint8Reader().read(bp);
+  idl.UnlinkedParamKind read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.UnlinkedParamKind.values.length ? idl.UnlinkedParamKind.values[index] : idl.UnlinkedParamKind.required;
   }
 }
@@ -246,21 +246,22 @@
 }
 
 idl.CacheSourceContent readCacheSourceContent(List<int> buffer) {
-  fb.BufferPointer rootRef = new fb.BufferPointer.fromBytes(buffer);
-  return const _CacheSourceContentReader().read(rootRef);
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _CacheSourceContentReader().read(rootRef, 0);
 }
 
 class _CacheSourceContentReader extends fb.TableReader<_CacheSourceContentImpl> {
   const _CacheSourceContentReader();
 
   @override
-  _CacheSourceContentImpl createObject(fb.BufferPointer bp) => new _CacheSourceContentImpl(bp);
+  _CacheSourceContentImpl createObject(fb.BufferContext bc, int offset) => new _CacheSourceContentImpl(bc, offset);
 }
 
 class _CacheSourceContentImpl extends Object with _CacheSourceContentMixin implements idl.CacheSourceContent {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _CacheSourceContentImpl(this._bp);
+  _CacheSourceContentImpl(this._bc, this._bcOffset);
 
   List<String> _exportedUris;
   List<String> _importedUris;
@@ -269,25 +270,25 @@
 
   @override
   List<String> get exportedUris {
-    _exportedUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 2, const <String>[]);
+    _exportedUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 2, const <String>[]);
     return _exportedUris;
   }
 
   @override
   List<String> get importedUris {
-    _importedUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 1, const <String>[]);
+    _importedUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 1, const <String>[]);
     return _importedUris;
   }
 
   @override
   idl.CacheSourceKind get kind {
-    _kind ??= const _CacheSourceKindReader().vTableGet(_bp, 0, idl.CacheSourceKind.library);
+    _kind ??= const _CacheSourceKindReader().vTableGet(_bc, _bcOffset, 0, idl.CacheSourceKind.library);
     return _kind;
   }
 
   @override
   List<String> get partUris {
-    _partUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 3, const <String>[]);
+    _partUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 3, const <String>[]);
     return _partUris;
   }
 }
@@ -373,26 +374,27 @@
   const _CodeRangeReader();
 
   @override
-  _CodeRangeImpl createObject(fb.BufferPointer bp) => new _CodeRangeImpl(bp);
+  _CodeRangeImpl createObject(fb.BufferContext bc, int offset) => new _CodeRangeImpl(bc, offset);
 }
 
 class _CodeRangeImpl extends Object with _CodeRangeMixin implements idl.CodeRange {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _CodeRangeImpl(this._bp);
+  _CodeRangeImpl(this._bc, this._bcOffset);
 
   int _length;
   int _offset;
 
   @override
   int get length {
-    _length ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _length ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _length;
   }
 
   @override
   int get offset {
-    _offset ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _offset;
   }
 }
@@ -622,13 +624,14 @@
   const _EntityRefReader();
 
   @override
-  _EntityRefImpl createObject(fb.BufferPointer bp) => new _EntityRefImpl(bp);
+  _EntityRefImpl createObject(fb.BufferContext bc, int offset) => new _EntityRefImpl(bc, offset);
 }
 
 class _EntityRefImpl extends Object with _EntityRefMixin implements idl.EntityRef {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _EntityRefImpl(this._bp);
+  _EntityRefImpl(this._bc, this._bcOffset);
 
   List<int> _implicitFunctionTypeIndices;
   int _paramReference;
@@ -640,43 +643,43 @@
 
   @override
   List<int> get implicitFunctionTypeIndices {
-    _implicitFunctionTypeIndices ??= const fb.Uint32ListReader().vTableGet(_bp, 4, const <int>[]);
+    _implicitFunctionTypeIndices ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 4, const <int>[]);
     return _implicitFunctionTypeIndices;
   }
 
   @override
   int get paramReference {
-    _paramReference ??= const fb.Uint32Reader().vTableGet(_bp, 3, 0);
+    _paramReference ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
     return _paramReference;
   }
 
   @override
   int get reference {
-    _reference ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _reference ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _reference;
   }
 
   @override
   int get slot {
-    _slot ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _slot ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _slot;
   }
 
   @override
   List<idl.UnlinkedParam> get syntheticParams {
-    _syntheticParams ??= const fb.ListReader<idl.UnlinkedParam>(const _UnlinkedParamReader()).vTableGet(_bp, 6, const <idl.UnlinkedParam>[]);
+    _syntheticParams ??= const fb.ListReader<idl.UnlinkedParam>(const _UnlinkedParamReader()).vTableGet(_bc, _bcOffset, 6, const <idl.UnlinkedParam>[]);
     return _syntheticParams;
   }
 
   @override
   idl.EntityRef get syntheticReturnType {
-    _syntheticReturnType ??= const _EntityRefReader().vTableGet(_bp, 5, null);
+    _syntheticReturnType ??= const _EntityRefReader().vTableGet(_bc, _bcOffset, 5, null);
     return _syntheticReturnType;
   }
 
   @override
   List<idl.EntityRef> get typeArguments {
-    _typeArguments ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bp, 1, const <idl.EntityRef>[]);
+    _typeArguments ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bc, _bcOffset, 1, const <idl.EntityRef>[]);
     return _typeArguments;
   }
 }
@@ -779,26 +782,27 @@
   const _LinkedDependencyReader();
 
   @override
-  _LinkedDependencyImpl createObject(fb.BufferPointer bp) => new _LinkedDependencyImpl(bp);
+  _LinkedDependencyImpl createObject(fb.BufferContext bc, int offset) => new _LinkedDependencyImpl(bc, offset);
 }
 
 class _LinkedDependencyImpl extends Object with _LinkedDependencyMixin implements idl.LinkedDependency {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _LinkedDependencyImpl(this._bp);
+  _LinkedDependencyImpl(this._bc, this._bcOffset);
 
   List<String> _parts;
   String _uri;
 
   @override
   List<String> get parts {
-    _parts ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 1, const <String>[]);
+    _parts ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 1, const <String>[]);
     return _parts;
   }
 
   @override
   String get uri {
-    _uri ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _uri;
   }
 }
@@ -921,13 +925,14 @@
   const _LinkedExportNameReader();
 
   @override
-  _LinkedExportNameImpl createObject(fb.BufferPointer bp) => new _LinkedExportNameImpl(bp);
+  _LinkedExportNameImpl createObject(fb.BufferContext bc, int offset) => new _LinkedExportNameImpl(bc, offset);
 }
 
 class _LinkedExportNameImpl extends Object with _LinkedExportNameMixin implements idl.LinkedExportName {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _LinkedExportNameImpl(this._bp);
+  _LinkedExportNameImpl(this._bc, this._bcOffset);
 
   int _dependency;
   idl.ReferenceKind _kind;
@@ -936,25 +941,25 @@
 
   @override
   int get dependency {
-    _dependency ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _dependency ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _dependency;
   }
 
   @override
   idl.ReferenceKind get kind {
-    _kind ??= const _ReferenceKindReader().vTableGet(_bp, 3, idl.ReferenceKind.classOrEnum);
+    _kind ??= const _ReferenceKindReader().vTableGet(_bc, _bcOffset, 3, idl.ReferenceKind.classOrEnum);
     return _kind;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 1, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
     return _name;
   }
 
   @override
   int get unit {
-    _unit ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _unit ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _unit;
   }
 }
@@ -1171,21 +1176,22 @@
 }
 
 idl.LinkedLibrary readLinkedLibrary(List<int> buffer) {
-  fb.BufferPointer rootRef = new fb.BufferPointer.fromBytes(buffer);
-  return const _LinkedLibraryReader().read(rootRef);
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _LinkedLibraryReader().read(rootRef, 0);
 }
 
 class _LinkedLibraryReader extends fb.TableReader<_LinkedLibraryImpl> {
   const _LinkedLibraryReader();
 
   @override
-  _LinkedLibraryImpl createObject(fb.BufferPointer bp) => new _LinkedLibraryImpl(bp);
+  _LinkedLibraryImpl createObject(fb.BufferContext bc, int offset) => new _LinkedLibraryImpl(bc, offset);
 }
 
 class _LinkedLibraryImpl extends Object with _LinkedLibraryMixin implements idl.LinkedLibrary {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _LinkedLibraryImpl(this._bp);
+  _LinkedLibraryImpl(this._bc, this._bcOffset);
 
   List<idl.LinkedDependency> _dependencies;
   List<int> _exportDependencies;
@@ -1197,43 +1203,43 @@
 
   @override
   List<idl.LinkedDependency> get dependencies {
-    _dependencies ??= const fb.ListReader<idl.LinkedDependency>(const _LinkedDependencyReader()).vTableGet(_bp, 0, const <idl.LinkedDependency>[]);
+    _dependencies ??= const fb.ListReader<idl.LinkedDependency>(const _LinkedDependencyReader()).vTableGet(_bc, _bcOffset, 0, const <idl.LinkedDependency>[]);
     return _dependencies;
   }
 
   @override
   List<int> get exportDependencies {
-    _exportDependencies ??= const fb.Uint32ListReader().vTableGet(_bp, 6, const <int>[]);
+    _exportDependencies ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 6, const <int>[]);
     return _exportDependencies;
   }
 
   @override
   List<idl.LinkedExportName> get exportNames {
-    _exportNames ??= const fb.ListReader<idl.LinkedExportName>(const _LinkedExportNameReader()).vTableGet(_bp, 4, const <idl.LinkedExportName>[]);
+    _exportNames ??= const fb.ListReader<idl.LinkedExportName>(const _LinkedExportNameReader()).vTableGet(_bc, _bcOffset, 4, const <idl.LinkedExportName>[]);
     return _exportNames;
   }
 
   @override
   bool get fallbackMode {
-    _fallbackMode ??= const fb.BoolReader().vTableGet(_bp, 5, false);
+    _fallbackMode ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 5, false);
     return _fallbackMode;
   }
 
   @override
   List<int> get importDependencies {
-    _importDependencies ??= const fb.Uint32ListReader().vTableGet(_bp, 1, const <int>[]);
+    _importDependencies ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 1, const <int>[]);
     return _importDependencies;
   }
 
   @override
   int get numPrelinkedDependencies {
-    _numPrelinkedDependencies ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _numPrelinkedDependencies ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _numPrelinkedDependencies;
   }
 
   @override
   List<idl.LinkedUnit> get units {
-    _units ??= const fb.ListReader<idl.LinkedUnit>(const _LinkedUnitReader()).vTableGet(_bp, 3, const <idl.LinkedUnit>[]);
+    _units ??= const fb.ListReader<idl.LinkedUnit>(const _LinkedUnitReader()).vTableGet(_bc, _bcOffset, 3, const <idl.LinkedUnit>[]);
     return _units;
   }
 }
@@ -1439,13 +1445,14 @@
   const _LinkedReferenceReader();
 
   @override
-  _LinkedReferenceImpl createObject(fb.BufferPointer bp) => new _LinkedReferenceImpl(bp);
+  _LinkedReferenceImpl createObject(fb.BufferContext bc, int offset) => new _LinkedReferenceImpl(bc, offset);
 }
 
 class _LinkedReferenceImpl extends Object with _LinkedReferenceMixin implements idl.LinkedReference {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _LinkedReferenceImpl(this._bp);
+  _LinkedReferenceImpl(this._bc, this._bcOffset);
 
   int _containingReference;
   int _dependency;
@@ -1457,43 +1464,43 @@
 
   @override
   int get containingReference {
-    _containingReference ??= const fb.Uint32Reader().vTableGet(_bp, 5, 0);
+    _containingReference ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 5, 0);
     return _containingReference;
   }
 
   @override
   int get dependency {
-    _dependency ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _dependency ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _dependency;
   }
 
   @override
   idl.ReferenceKind get kind {
-    _kind ??= const _ReferenceKindReader().vTableGet(_bp, 2, idl.ReferenceKind.classOrEnum);
+    _kind ??= const _ReferenceKindReader().vTableGet(_bc, _bcOffset, 2, idl.ReferenceKind.classOrEnum);
     return _kind;
   }
 
   @override
   int get localIndex {
-    _localIndex ??= const fb.Uint32Reader().vTableGet(_bp, 6, 0);
+    _localIndex ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
     return _localIndex;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 3, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
     return _name;
   }
 
   @override
   int get numTypeParameters {
-    _numTypeParameters ??= const fb.Uint32Reader().vTableGet(_bp, 4, 0);
+    _numTypeParameters ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 4, 0);
     return _numTypeParameters;
   }
 
   @override
   int get unit {
-    _unit ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _unit ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _unit;
   }
 }
@@ -1621,13 +1628,14 @@
   const _LinkedUnitReader();
 
   @override
-  _LinkedUnitImpl createObject(fb.BufferPointer bp) => new _LinkedUnitImpl(bp);
+  _LinkedUnitImpl createObject(fb.BufferContext bc, int offset) => new _LinkedUnitImpl(bc, offset);
 }
 
 class _LinkedUnitImpl extends Object with _LinkedUnitMixin implements idl.LinkedUnit {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _LinkedUnitImpl(this._bp);
+  _LinkedUnitImpl(this._bc, this._bcOffset);
 
   List<int> _constCycles;
   List<idl.LinkedReference> _references;
@@ -1635,19 +1643,19 @@
 
   @override
   List<int> get constCycles {
-    _constCycles ??= const fb.Uint32ListReader().vTableGet(_bp, 2, const <int>[]);
+    _constCycles ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
     return _constCycles;
   }
 
   @override
   List<idl.LinkedReference> get references {
-    _references ??= const fb.ListReader<idl.LinkedReference>(const _LinkedReferenceReader()).vTableGet(_bp, 0, const <idl.LinkedReference>[]);
+    _references ??= const fb.ListReader<idl.LinkedReference>(const _LinkedReferenceReader()).vTableGet(_bc, _bcOffset, 0, const <idl.LinkedReference>[]);
     return _references;
   }
 
   @override
   List<idl.EntityRef> get types {
-    _types ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bp, 1, const <idl.EntityRef>[]);
+    _types ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bc, _bcOffset, 1, const <idl.EntityRef>[]);
     return _types;
   }
 }
@@ -1840,21 +1848,22 @@
 }
 
 idl.PackageBundle readPackageBundle(List<int> buffer) {
-  fb.BufferPointer rootRef = new fb.BufferPointer.fromBytes(buffer);
-  return const _PackageBundleReader().read(rootRef);
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _PackageBundleReader().read(rootRef, 0);
 }
 
 class _PackageBundleReader extends fb.TableReader<_PackageBundleImpl> {
   const _PackageBundleReader();
 
   @override
-  _PackageBundleImpl createObject(fb.BufferPointer bp) => new _PackageBundleImpl(bp);
+  _PackageBundleImpl createObject(fb.BufferContext bc, int offset) => new _PackageBundleImpl(bc, offset);
 }
 
 class _PackageBundleImpl extends Object with _PackageBundleMixin implements idl.PackageBundle {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _PackageBundleImpl(this._bp);
+  _PackageBundleImpl(this._bc, this._bcOffset);
 
   List<idl.LinkedLibrary> _linkedLibraries;
   List<String> _linkedLibraryUris;
@@ -1866,43 +1875,43 @@
 
   @override
   List<idl.LinkedLibrary> get linkedLibraries {
-    _linkedLibraries ??= const fb.ListReader<idl.LinkedLibrary>(const _LinkedLibraryReader()).vTableGet(_bp, 0, const <idl.LinkedLibrary>[]);
+    _linkedLibraries ??= const fb.ListReader<idl.LinkedLibrary>(const _LinkedLibraryReader()).vTableGet(_bc, _bcOffset, 0, const <idl.LinkedLibrary>[]);
     return _linkedLibraries;
   }
 
   @override
   List<String> get linkedLibraryUris {
-    _linkedLibraryUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 1, const <String>[]);
+    _linkedLibraryUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 1, const <String>[]);
     return _linkedLibraryUris;
   }
 
   @override
   int get majorVersion {
-    _majorVersion ??= const fb.Uint32Reader().vTableGet(_bp, 5, 0);
+    _majorVersion ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 5, 0);
     return _majorVersion;
   }
 
   @override
   int get minorVersion {
-    _minorVersion ??= const fb.Uint32Reader().vTableGet(_bp, 6, 0);
+    _minorVersion ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
     return _minorVersion;
   }
 
   @override
   List<String> get unlinkedUnitHashes {
-    _unlinkedUnitHashes ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 4, const <String>[]);
+    _unlinkedUnitHashes ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 4, const <String>[]);
     return _unlinkedUnitHashes;
   }
 
   @override
   List<idl.UnlinkedUnit> get unlinkedUnits {
-    _unlinkedUnits ??= const fb.ListReader<idl.UnlinkedUnit>(const _UnlinkedUnitReader()).vTableGet(_bp, 2, const <idl.UnlinkedUnit>[]);
+    _unlinkedUnits ??= const fb.ListReader<idl.UnlinkedUnit>(const _UnlinkedUnitReader()).vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedUnit>[]);
     return _unlinkedUnits;
   }
 
   @override
   List<String> get unlinkedUnitUris {
-    _unlinkedUnitUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 3, const <String>[]);
+    _unlinkedUnitUris ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 3, const <String>[]);
     return _unlinkedUnitUris;
   }
 }
@@ -2119,21 +2128,22 @@
 }
 
 idl.PackageIndex readPackageIndex(List<int> buffer) {
-  fb.BufferPointer rootRef = new fb.BufferPointer.fromBytes(buffer);
-  return const _PackageIndexReader().read(rootRef);
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _PackageIndexReader().read(rootRef, 0);
 }
 
 class _PackageIndexReader extends fb.TableReader<_PackageIndexImpl> {
   const _PackageIndexReader();
 
   @override
-  _PackageIndexImpl createObject(fb.BufferPointer bp) => new _PackageIndexImpl(bp);
+  _PackageIndexImpl createObject(fb.BufferContext bc, int offset) => new _PackageIndexImpl(bc, offset);
 }
 
 class _PackageIndexImpl extends Object with _PackageIndexMixin implements idl.PackageIndex {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _PackageIndexImpl(this._bp);
+  _PackageIndexImpl(this._bc, this._bcOffset);
 
   List<idl.IndexSyntheticElementKind> _elementKinds;
   List<int> _elementOffsets;
@@ -2145,43 +2155,43 @@
 
   @override
   List<idl.IndexSyntheticElementKind> get elementKinds {
-    _elementKinds ??= const fb.ListReader<idl.IndexSyntheticElementKind>(const _IndexSyntheticElementKindReader()).vTableGet(_bp, 5, const <idl.IndexSyntheticElementKind>[]);
+    _elementKinds ??= const fb.ListReader<idl.IndexSyntheticElementKind>(const _IndexSyntheticElementKindReader()).vTableGet(_bc, _bcOffset, 5, const <idl.IndexSyntheticElementKind>[]);
     return _elementKinds;
   }
 
   @override
   List<int> get elementOffsets {
-    _elementOffsets ??= const fb.Uint32ListReader().vTableGet(_bp, 1, const <int>[]);
+    _elementOffsets ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 1, const <int>[]);
     return _elementOffsets;
   }
 
   @override
   List<int> get elementUnits {
-    _elementUnits ??= const fb.Uint32ListReader().vTableGet(_bp, 0, const <int>[]);
+    _elementUnits ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
     return _elementUnits;
   }
 
   @override
   List<String> get strings {
-    _strings ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 6, const <String>[]);
+    _strings ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 6, const <String>[]);
     return _strings;
   }
 
   @override
   List<int> get unitLibraryUris {
-    _unitLibraryUris ??= const fb.Uint32ListReader().vTableGet(_bp, 2, const <int>[]);
+    _unitLibraryUris ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
     return _unitLibraryUris;
   }
 
   @override
   List<idl.UnitIndex> get units {
-    _units ??= const fb.ListReader<idl.UnitIndex>(const _UnitIndexReader()).vTableGet(_bp, 4, const <idl.UnitIndex>[]);
+    _units ??= const fb.ListReader<idl.UnitIndex>(const _UnitIndexReader()).vTableGet(_bc, _bcOffset, 4, const <idl.UnitIndex>[]);
     return _units;
   }
 
   @override
   List<int> get unitUnitUris {
-    _unitUnitUris ??= const fb.Uint32ListReader().vTableGet(_bp, 3, const <int>[]);
+    _unitUnitUris ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 3, const <int>[]);
     return _unitUnitUris;
   }
 }
@@ -2516,13 +2526,14 @@
   const _UnitIndexReader();
 
   @override
-  _UnitIndexImpl createObject(fb.BufferPointer bp) => new _UnitIndexImpl(bp);
+  _UnitIndexImpl createObject(fb.BufferContext bc, int offset) => new _UnitIndexImpl(bc, offset);
 }
 
 class _UnitIndexImpl extends Object with _UnitIndexMixin implements idl.UnitIndex {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnitIndexImpl(this._bp);
+  _UnitIndexImpl(this._bc, this._bcOffset);
 
   List<idl.IndexNameKind> _definedNameKinds;
   List<int> _definedNameOffsets;
@@ -2540,79 +2551,79 @@
 
   @override
   List<idl.IndexNameKind> get definedNameKinds {
-    _definedNameKinds ??= const fb.ListReader<idl.IndexNameKind>(const _IndexNameKindReader()).vTableGet(_bp, 6, const <idl.IndexNameKind>[]);
+    _definedNameKinds ??= const fb.ListReader<idl.IndexNameKind>(const _IndexNameKindReader()).vTableGet(_bc, _bcOffset, 6, const <idl.IndexNameKind>[]);
     return _definedNameKinds;
   }
 
   @override
   List<int> get definedNameOffsets {
-    _definedNameOffsets ??= const fb.Uint32ListReader().vTableGet(_bp, 7, const <int>[]);
+    _definedNameOffsets ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 7, const <int>[]);
     return _definedNameOffsets;
   }
 
   @override
   List<int> get definedNames {
-    _definedNames ??= const fb.Uint32ListReader().vTableGet(_bp, 5, const <int>[]);
+    _definedNames ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 5, const <int>[]);
     return _definedNames;
   }
 
   @override
   int get unit {
-    _unit ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _unit ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _unit;
   }
 
   @override
   List<bool> get usedElementIsQualifiedFlags {
-    _usedElementIsQualifiedFlags ??= const fb.BoolListReader().vTableGet(_bp, 11, const <bool>[]);
+    _usedElementIsQualifiedFlags ??= const fb.BoolListReader().vTableGet(_bc, _bcOffset, 11, const <bool>[]);
     return _usedElementIsQualifiedFlags;
   }
 
   @override
   List<idl.IndexRelationKind> get usedElementKinds {
-    _usedElementKinds ??= const fb.ListReader<idl.IndexRelationKind>(const _IndexRelationKindReader()).vTableGet(_bp, 4, const <idl.IndexRelationKind>[]);
+    _usedElementKinds ??= const fb.ListReader<idl.IndexRelationKind>(const _IndexRelationKindReader()).vTableGet(_bc, _bcOffset, 4, const <idl.IndexRelationKind>[]);
     return _usedElementKinds;
   }
 
   @override
   List<int> get usedElementLengths {
-    _usedElementLengths ??= const fb.Uint32ListReader().vTableGet(_bp, 1, const <int>[]);
+    _usedElementLengths ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 1, const <int>[]);
     return _usedElementLengths;
   }
 
   @override
   List<int> get usedElementOffsets {
-    _usedElementOffsets ??= const fb.Uint32ListReader().vTableGet(_bp, 2, const <int>[]);
+    _usedElementOffsets ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
     return _usedElementOffsets;
   }
 
   @override
   List<int> get usedElements {
-    _usedElements ??= const fb.Uint32ListReader().vTableGet(_bp, 3, const <int>[]);
+    _usedElements ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 3, const <int>[]);
     return _usedElements;
   }
 
   @override
   List<bool> get usedNameIsQualifiedFlags {
-    _usedNameIsQualifiedFlags ??= const fb.BoolListReader().vTableGet(_bp, 12, const <bool>[]);
+    _usedNameIsQualifiedFlags ??= const fb.BoolListReader().vTableGet(_bc, _bcOffset, 12, const <bool>[]);
     return _usedNameIsQualifiedFlags;
   }
 
   @override
   List<idl.IndexRelationKind> get usedNameKinds {
-    _usedNameKinds ??= const fb.ListReader<idl.IndexRelationKind>(const _IndexRelationKindReader()).vTableGet(_bp, 10, const <idl.IndexRelationKind>[]);
+    _usedNameKinds ??= const fb.ListReader<idl.IndexRelationKind>(const _IndexRelationKindReader()).vTableGet(_bc, _bcOffset, 10, const <idl.IndexRelationKind>[]);
     return _usedNameKinds;
   }
 
   @override
   List<int> get usedNameOffsets {
-    _usedNameOffsets ??= const fb.Uint32ListReader().vTableGet(_bp, 9, const <int>[]);
+    _usedNameOffsets ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 9, const <int>[]);
     return _usedNameOffsets;
   }
 
   @override
   List<int> get usedNames {
-    _usedNames ??= const fb.Uint32ListReader().vTableGet(_bp, 8, const <int>[]);
+    _usedNames ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 8, const <int>[]);
     return _usedNames;
   }
 }
@@ -2961,13 +2972,14 @@
   const _UnlinkedClassReader();
 
   @override
-  _UnlinkedClassImpl createObject(fb.BufferPointer bp) => new _UnlinkedClassImpl(bp);
+  _UnlinkedClassImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedClassImpl(bc, offset);
 }
 
 class _UnlinkedClassImpl extends Object with _UnlinkedClassMixin implements idl.UnlinkedClass {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedClassImpl(this._bp);
+  _UnlinkedClassImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   idl.CodeRange _codeRange;
@@ -2986,85 +2998,85 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 5, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 5, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   idl.CodeRange get codeRange {
-    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 13, null);
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 13, null);
     return _codeRange;
   }
 
   @override
   idl.UnlinkedDocumentationComment get documentationComment {
-    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 6, null);
+    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bc, _bcOffset, 6, null);
     return _documentationComment;
   }
 
   @override
   List<idl.UnlinkedExecutable> get executables {
-    _executables ??= const fb.ListReader<idl.UnlinkedExecutable>(const _UnlinkedExecutableReader()).vTableGet(_bp, 2, const <idl.UnlinkedExecutable>[]);
+    _executables ??= const fb.ListReader<idl.UnlinkedExecutable>(const _UnlinkedExecutableReader()).vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedExecutable>[]);
     return _executables;
   }
 
   @override
   List<idl.UnlinkedVariable> get fields {
-    _fields ??= const fb.ListReader<idl.UnlinkedVariable>(const _UnlinkedVariableReader()).vTableGet(_bp, 4, const <idl.UnlinkedVariable>[]);
+    _fields ??= const fb.ListReader<idl.UnlinkedVariable>(const _UnlinkedVariableReader()).vTableGet(_bc, _bcOffset, 4, const <idl.UnlinkedVariable>[]);
     return _fields;
   }
 
   @override
   bool get hasNoSupertype {
-    _hasNoSupertype ??= const fb.BoolReader().vTableGet(_bp, 12, false);
+    _hasNoSupertype ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 12, false);
     return _hasNoSupertype;
   }
 
   @override
   List<idl.EntityRef> get interfaces {
-    _interfaces ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bp, 7, const <idl.EntityRef>[]);
+    _interfaces ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bc, _bcOffset, 7, const <idl.EntityRef>[]);
     return _interfaces;
   }
 
   @override
   bool get isAbstract {
-    _isAbstract ??= const fb.BoolReader().vTableGet(_bp, 8, false);
+    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
     return _isAbstract;
   }
 
   @override
   bool get isMixinApplication {
-    _isMixinApplication ??= const fb.BoolReader().vTableGet(_bp, 11, false);
+    _isMixinApplication ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 11, false);
     return _isMixinApplication;
   }
 
   @override
   List<idl.EntityRef> get mixins {
-    _mixins ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bp, 10, const <idl.EntityRef>[]);
+    _mixins ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bc, _bcOffset, 10, const <idl.EntityRef>[]);
     return _mixins;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _nameOffset;
   }
 
   @override
   idl.EntityRef get supertype {
-    _supertype ??= const _EntityRefReader().vTableGet(_bp, 3, null);
+    _supertype ??= const _EntityRefReader().vTableGet(_bc, _bcOffset, 3, null);
     return _supertype;
   }
 
   @override
   List<idl.UnlinkedTypeParam> get typeParameters {
-    _typeParameters ??= const fb.ListReader<idl.UnlinkedTypeParam>(const _UnlinkedTypeParamReader()).vTableGet(_bp, 9, const <idl.UnlinkedTypeParam>[]);
+    _typeParameters ??= const fb.ListReader<idl.UnlinkedTypeParam>(const _UnlinkedTypeParamReader()).vTableGet(_bc, _bcOffset, 9, const <idl.UnlinkedTypeParam>[]);
     return _typeParameters;
   }
 }
@@ -3214,13 +3226,14 @@
   const _UnlinkedCombinatorReader();
 
   @override
-  _UnlinkedCombinatorImpl createObject(fb.BufferPointer bp) => new _UnlinkedCombinatorImpl(bp);
+  _UnlinkedCombinatorImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedCombinatorImpl(bc, offset);
 }
 
 class _UnlinkedCombinatorImpl extends Object with _UnlinkedCombinatorMixin implements idl.UnlinkedCombinator {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedCombinatorImpl(this._bp);
+  _UnlinkedCombinatorImpl(this._bc, this._bcOffset);
 
   int _end;
   List<String> _hides;
@@ -3229,25 +3242,25 @@
 
   @override
   int get end {
-    _end ??= const fb.Uint32Reader().vTableGet(_bp, 3, 0);
+    _end ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
     return _end;
   }
 
   @override
   List<String> get hides {
-    _hides ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 1, const <String>[]);
+    _hides ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 1, const <String>[]);
     return _hides;
   }
 
   @override
   int get offset {
-    _offset ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _offset;
   }
 
   @override
   List<String> get shows {
-    _shows ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 0, const <String>[]);
+    _shows ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 0, const <String>[]);
     return _shows;
   }
 }
@@ -3445,13 +3458,14 @@
   const _UnlinkedConstReader();
 
   @override
-  _UnlinkedConstImpl createObject(fb.BufferPointer bp) => new _UnlinkedConstImpl(bp);
+  _UnlinkedConstImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedConstImpl(bc, offset);
 }
 
 class _UnlinkedConstImpl extends Object with _UnlinkedConstMixin implements idl.UnlinkedConst {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedConstImpl(this._bp);
+  _UnlinkedConstImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedExprAssignOperator> _assignmentOperators;
   List<double> _doubles;
@@ -3463,43 +3477,43 @@
 
   @override
   List<idl.UnlinkedExprAssignOperator> get assignmentOperators {
-    _assignmentOperators ??= const fb.ListReader<idl.UnlinkedExprAssignOperator>(const _UnlinkedExprAssignOperatorReader()).vTableGet(_bp, 6, const <idl.UnlinkedExprAssignOperator>[]);
+    _assignmentOperators ??= const fb.ListReader<idl.UnlinkedExprAssignOperator>(const _UnlinkedExprAssignOperatorReader()).vTableGet(_bc, _bcOffset, 6, const <idl.UnlinkedExprAssignOperator>[]);
     return _assignmentOperators;
   }
 
   @override
   List<double> get doubles {
-    _doubles ??= const fb.Float64ListReader().vTableGet(_bp, 4, const <double>[]);
+    _doubles ??= const fb.Float64ListReader().vTableGet(_bc, _bcOffset, 4, const <double>[]);
     return _doubles;
   }
 
   @override
   List<int> get ints {
-    _ints ??= const fb.Uint32ListReader().vTableGet(_bp, 1, const <int>[]);
+    _ints ??= const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 1, const <int>[]);
     return _ints;
   }
 
   @override
   bool get isValidConst {
-    _isValidConst ??= const fb.BoolReader().vTableGet(_bp, 5, false);
+    _isValidConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 5, false);
     return _isValidConst;
   }
 
   @override
   List<idl.UnlinkedConstOperation> get operations {
-    _operations ??= const fb.ListReader<idl.UnlinkedConstOperation>(const _UnlinkedConstOperationReader()).vTableGet(_bp, 0, const <idl.UnlinkedConstOperation>[]);
+    _operations ??= const fb.ListReader<idl.UnlinkedConstOperation>(const _UnlinkedConstOperationReader()).vTableGet(_bc, _bcOffset, 0, const <idl.UnlinkedConstOperation>[]);
     return _operations;
   }
 
   @override
   List<idl.EntityRef> get references {
-    _references ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bp, 2, const <idl.EntityRef>[]);
+    _references ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bc, _bcOffset, 2, const <idl.EntityRef>[]);
     return _references;
   }
 
   @override
   List<String> get strings {
-    _strings ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 3, const <String>[]);
+    _strings ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 3, const <String>[]);
     return _strings;
   }
 }
@@ -3536,25 +3550,13 @@
 class UnlinkedConstructorInitializerBuilder extends Object with _UnlinkedConstructorInitializerMixin implements idl.UnlinkedConstructorInitializer {
   bool _finished = false;
 
-  List<UnlinkedConstBuilder> _arguments;
   List<String> _argumentNames;
+  List<UnlinkedConstBuilder> _arguments;
   UnlinkedConstBuilder _expression;
   idl.UnlinkedConstructorInitializerKind _kind;
   String _name;
 
   @override
-  List<UnlinkedConstBuilder> get arguments => _arguments ??= <UnlinkedConstBuilder>[];
-
-  /**
-   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
-   * invocation.  Otherwise empty.
-   */
-  void set arguments(List<UnlinkedConstBuilder> _value) {
-    assert(!_finished);
-    _arguments = _value;
-  }
-
-  @override
   List<String> get argumentNames => _argumentNames ??= <String>[];
 
   /**
@@ -3568,6 +3570,18 @@
   }
 
   @override
+  List<UnlinkedConstBuilder> get arguments => _arguments ??= <UnlinkedConstBuilder>[];
+
+  /**
+   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
+   * invocation.  Otherwise empty.
+   */
+  void set arguments(List<UnlinkedConstBuilder> _value) {
+    assert(!_finished);
+    _arguments = _value;
+  }
+
+  @override
   UnlinkedConstBuilder get expression => _expression;
 
   /**
@@ -3604,9 +3618,9 @@
     _name = _value;
   }
 
-  UnlinkedConstructorInitializerBuilder({List<UnlinkedConstBuilder> arguments, List<String> argumentNames, UnlinkedConstBuilder expression, idl.UnlinkedConstructorInitializerKind kind, String name})
-    : _arguments = arguments,
-      _argumentNames = argumentNames,
+  UnlinkedConstructorInitializerBuilder({List<String> argumentNames, List<UnlinkedConstBuilder> arguments, UnlinkedConstBuilder expression, idl.UnlinkedConstructorInitializerKind kind, String name})
+    : _argumentNames = argumentNames,
+      _arguments = arguments,
       _expression = expression,
       _kind = kind,
       _name = name;
@@ -3622,16 +3636,16 @@
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
-    fb.Offset offset_arguments;
     fb.Offset offset_argumentNames;
+    fb.Offset offset_arguments;
     fb.Offset offset_expression;
     fb.Offset offset_name;
-    if (!(_arguments == null || _arguments.isEmpty)) {
-      offset_arguments = fbBuilder.writeList(_arguments.map((b) => b.finish(fbBuilder)).toList());
-    }
     if (!(_argumentNames == null || _argumentNames.isEmpty)) {
       offset_argumentNames = fbBuilder.writeList(_argumentNames.map((b) => fbBuilder.writeString(b)).toList());
     }
+    if (!(_arguments == null || _arguments.isEmpty)) {
+      offset_arguments = fbBuilder.writeList(_arguments.map((b) => b.finish(fbBuilder)).toList());
+    }
     if (_expression != null) {
       offset_expression = _expression.finish(fbBuilder);
     }
@@ -3639,12 +3653,12 @@
       offset_name = fbBuilder.writeString(_name);
     }
     fbBuilder.startTable();
-    if (offset_arguments != null) {
-      fbBuilder.addOffset(3, offset_arguments);
-    }
     if (offset_argumentNames != null) {
       fbBuilder.addOffset(4, offset_argumentNames);
     }
+    if (offset_arguments != null) {
+      fbBuilder.addOffset(3, offset_arguments);
+    }
     if (offset_expression != null) {
       fbBuilder.addOffset(1, offset_expression);
     }
@@ -3662,47 +3676,48 @@
   const _UnlinkedConstructorInitializerReader();
 
   @override
-  _UnlinkedConstructorInitializerImpl createObject(fb.BufferPointer bp) => new _UnlinkedConstructorInitializerImpl(bp);
+  _UnlinkedConstructorInitializerImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedConstructorInitializerImpl(bc, offset);
 }
 
 class _UnlinkedConstructorInitializerImpl extends Object with _UnlinkedConstructorInitializerMixin implements idl.UnlinkedConstructorInitializer {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedConstructorInitializerImpl(this._bp);
+  _UnlinkedConstructorInitializerImpl(this._bc, this._bcOffset);
 
-  List<idl.UnlinkedConst> _arguments;
   List<String> _argumentNames;
+  List<idl.UnlinkedConst> _arguments;
   idl.UnlinkedConst _expression;
   idl.UnlinkedConstructorInitializerKind _kind;
   String _name;
 
   @override
-  List<idl.UnlinkedConst> get arguments {
-    _arguments ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 3, const <idl.UnlinkedConst>[]);
-    return _arguments;
-  }
-
-  @override
   List<String> get argumentNames {
-    _argumentNames ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 4, const <String>[]);
+    _argumentNames ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 4, const <String>[]);
     return _argumentNames;
   }
 
   @override
+  List<idl.UnlinkedConst> get arguments {
+    _arguments ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 3, const <idl.UnlinkedConst>[]);
+    return _arguments;
+  }
+
+  @override
   idl.UnlinkedConst get expression {
-    _expression ??= const _UnlinkedConstReader().vTableGet(_bp, 1, null);
+    _expression ??= const _UnlinkedConstReader().vTableGet(_bc, _bcOffset, 1, null);
     return _expression;
   }
 
   @override
   idl.UnlinkedConstructorInitializerKind get kind {
-    _kind ??= const _UnlinkedConstructorInitializerKindReader().vTableGet(_bp, 2, idl.UnlinkedConstructorInitializerKind.field);
+    _kind ??= const _UnlinkedConstructorInitializerKindReader().vTableGet(_bc, _bcOffset, 2, idl.UnlinkedConstructorInitializerKind.field);
     return _kind;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 }
@@ -3711,8 +3726,8 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
-    if (arguments.isNotEmpty) _result["arguments"] = arguments.map((_value) => _value.toJson()).toList();
     if (argumentNames.isNotEmpty) _result["argumentNames"] = argumentNames;
+    if (arguments.isNotEmpty) _result["arguments"] = arguments.map((_value) => _value.toJson()).toList();
     if (expression != null) _result["expression"] = expression.toJson();
     if (kind != idl.UnlinkedConstructorInitializerKind.field) _result["kind"] = kind.toString().split('.')[1];
     if (name != '') _result["name"] = name;
@@ -3721,8 +3736,8 @@
 
   @override
   Map<String, Object> toMap() => {
-    "arguments": arguments,
     "argumentNames": argumentNames,
+    "arguments": arguments,
     "expression": expression,
     "kind": kind,
     "name": name,
@@ -3814,13 +3829,14 @@
   const _UnlinkedDocumentationCommentReader();
 
   @override
-  _UnlinkedDocumentationCommentImpl createObject(fb.BufferPointer bp) => new _UnlinkedDocumentationCommentImpl(bp);
+  _UnlinkedDocumentationCommentImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedDocumentationCommentImpl(bc, offset);
 }
 
 class _UnlinkedDocumentationCommentImpl extends Object with _UnlinkedDocumentationCommentMixin implements idl.UnlinkedDocumentationComment {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedDocumentationCommentImpl(this._bp);
+  _UnlinkedDocumentationCommentImpl(this._bc, this._bcOffset);
 
   int _length;
   int _offset;
@@ -3828,19 +3844,19 @@
 
   @override
   int get length {
-    _length ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _length ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _length;
   }
 
   @override
   int get offset {
-    _offset ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _offset;
   }
 
   @override
   String get text {
-    _text ??= const fb.StringReader().vTableGet(_bp, 1, '');
+    _text ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
     return _text;
   }
 }
@@ -4013,13 +4029,14 @@
   const _UnlinkedEnumReader();
 
   @override
-  _UnlinkedEnumImpl createObject(fb.BufferPointer bp) => new _UnlinkedEnumImpl(bp);
+  _UnlinkedEnumImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedEnumImpl(bc, offset);
 }
 
 class _UnlinkedEnumImpl extends Object with _UnlinkedEnumMixin implements idl.UnlinkedEnum {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedEnumImpl(this._bp);
+  _UnlinkedEnumImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   idl.CodeRange _codeRange;
@@ -4030,37 +4047,37 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 4, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 4, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   idl.CodeRange get codeRange {
-    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 5, null);
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 5, null);
     return _codeRange;
   }
 
   @override
   idl.UnlinkedDocumentationComment get documentationComment {
-    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 3, null);
+    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bc, _bcOffset, 3, null);
     return _documentationComment;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _nameOffset;
   }
 
   @override
   List<idl.UnlinkedEnumValue> get values {
-    _values ??= const fb.ListReader<idl.UnlinkedEnumValue>(const _UnlinkedEnumValueReader()).vTableGet(_bp, 2, const <idl.UnlinkedEnumValue>[]);
+    _values ??= const fb.ListReader<idl.UnlinkedEnumValue>(const _UnlinkedEnumValueReader()).vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedEnumValue>[]);
     return _values;
   }
 }
@@ -4176,13 +4193,14 @@
   const _UnlinkedEnumValueReader();
 
   @override
-  _UnlinkedEnumValueImpl createObject(fb.BufferPointer bp) => new _UnlinkedEnumValueImpl(bp);
+  _UnlinkedEnumValueImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedEnumValueImpl(bc, offset);
 }
 
 class _UnlinkedEnumValueImpl extends Object with _UnlinkedEnumValueMixin implements idl.UnlinkedEnumValue {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedEnumValueImpl(this._bp);
+  _UnlinkedEnumValueImpl(this._bc, this._bcOffset);
 
   idl.UnlinkedDocumentationComment _documentationComment;
   String _name;
@@ -4190,19 +4208,19 @@
 
   @override
   idl.UnlinkedDocumentationComment get documentationComment {
-    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 2, null);
+    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bc, _bcOffset, 2, null);
     return _documentationComment;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _nameOffset;
   }
 }
@@ -4232,6 +4250,7 @@
   bool _finished = false;
 
   List<UnlinkedConstBuilder> _annotations;
+  UnlinkedConstBuilder _bodyExpr;
   CodeRangeBuilder _codeRange;
   List<UnlinkedConstructorInitializerBuilder> _constantInitializers;
   int _constCycleSlot;
@@ -4273,6 +4292,19 @@
   }
 
   @override
+  UnlinkedConstBuilder get bodyExpr => _bodyExpr;
+
+  /**
+   * If this executable's function body is declared using `=>`, the expression
+   * to the right of the `=>`.  May be omitted if neither type inference nor
+   * constant evaluation depends on the function body.
+   */
+  void set bodyExpr(UnlinkedConstBuilder _value) {
+    assert(!_finished);
+    _bodyExpr = _value;
+  }
+
+  @override
   CodeRangeBuilder get codeRange => _codeRange;
 
   /**
@@ -4620,8 +4652,9 @@
     _visibleOffset = _value;
   }
 
-  UnlinkedExecutableBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, List<UnlinkedConstructorInitializerBuilder> constantInitializers, int constCycleSlot, UnlinkedDocumentationCommentBuilder documentationComment, int inferredReturnTypeSlot, bool isAbstract, bool isAsynchronous, bool isConst, bool isExternal, bool isFactory, bool isGenerator, bool isRedirectedConstructor, bool isStatic, idl.UnlinkedExecutableKind kind, List<UnlinkedExecutableBuilder> localFunctions, List<UnlinkedLabelBuilder> localLabels, List<UnlinkedVariableBuilder> localVariables, String name, int nameEnd, int nameOffset, List<UnlinkedParamBuilder> parameters, int periodOffset, EntityRefBuilder redirectedConstructor, String redirectedConstructorName, EntityRefBuilder returnType, List<UnlinkedTypeParamBuilder> typeParameters, int visibleLength, int visibleOffset})
+  UnlinkedExecutableBuilder({List<UnlinkedConstBuilder> annotations, UnlinkedConstBuilder bodyExpr, CodeRangeBuilder codeRange, List<UnlinkedConstructorInitializerBuilder> constantInitializers, int constCycleSlot, UnlinkedDocumentationCommentBuilder documentationComment, int inferredReturnTypeSlot, bool isAbstract, bool isAsynchronous, bool isConst, bool isExternal, bool isFactory, bool isGenerator, bool isRedirectedConstructor, bool isStatic, idl.UnlinkedExecutableKind kind, List<UnlinkedExecutableBuilder> localFunctions, List<UnlinkedLabelBuilder> localLabels, List<UnlinkedVariableBuilder> localVariables, String name, int nameEnd, int nameOffset, List<UnlinkedParamBuilder> parameters, int periodOffset, EntityRefBuilder redirectedConstructor, String redirectedConstructorName, EntityRefBuilder returnType, List<UnlinkedTypeParamBuilder> typeParameters, int visibleLength, int visibleOffset})
     : _annotations = annotations,
+      _bodyExpr = bodyExpr,
       _codeRange = codeRange,
       _constantInitializers = constantInitializers,
       _constCycleSlot = constCycleSlot,
@@ -4656,6 +4689,7 @@
    */
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
+    _bodyExpr?.flushInformative();
     _codeRange = null;
     _constantInitializers?.forEach((b) => b.flushInformative());
     _documentationComment = null;
@@ -4677,6 +4711,7 @@
     assert(!_finished);
     _finished = true;
     fb.Offset offset_annotations;
+    fb.Offset offset_bodyExpr;
     fb.Offset offset_codeRange;
     fb.Offset offset_constantInitializers;
     fb.Offset offset_documentationComment;
@@ -4692,6 +4727,9 @@
     if (!(_annotations == null || _annotations.isEmpty)) {
       offset_annotations = fbBuilder.writeList(_annotations.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_bodyExpr != null) {
+      offset_bodyExpr = _bodyExpr.finish(fbBuilder);
+    }
     if (_codeRange != null) {
       offset_codeRange = _codeRange.finish(fbBuilder);
     }
@@ -4732,6 +4770,9 @@
     if (offset_annotations != null) {
       fbBuilder.addOffset(6, offset_annotations);
     }
+    if (offset_bodyExpr != null) {
+      fbBuilder.addOffset(29, offset_bodyExpr);
+    }
     if (offset_codeRange != null) {
       fbBuilder.addOffset(26, offset_codeRange);
     }
@@ -4824,15 +4865,17 @@
   const _UnlinkedExecutableReader();
 
   @override
-  _UnlinkedExecutableImpl createObject(fb.BufferPointer bp) => new _UnlinkedExecutableImpl(bp);
+  _UnlinkedExecutableImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedExecutableImpl(bc, offset);
 }
 
 class _UnlinkedExecutableImpl extends Object with _UnlinkedExecutableMixin implements idl.UnlinkedExecutable {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedExecutableImpl(this._bp);
+  _UnlinkedExecutableImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
+  idl.UnlinkedConst _bodyExpr;
   idl.CodeRange _codeRange;
   List<idl.UnlinkedConstructorInitializer> _constantInitializers;
   int _constCycleSlot;
@@ -4864,175 +4907,181 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 6, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 6, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
+  idl.UnlinkedConst get bodyExpr {
+    _bodyExpr ??= const _UnlinkedConstReader().vTableGet(_bc, _bcOffset, 29, null);
+    return _bodyExpr;
+  }
+
+  @override
   idl.CodeRange get codeRange {
-    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 26, null);
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 26, null);
     return _codeRange;
   }
 
   @override
   List<idl.UnlinkedConstructorInitializer> get constantInitializers {
-    _constantInitializers ??= const fb.ListReader<idl.UnlinkedConstructorInitializer>(const _UnlinkedConstructorInitializerReader()).vTableGet(_bp, 14, const <idl.UnlinkedConstructorInitializer>[]);
+    _constantInitializers ??= const fb.ListReader<idl.UnlinkedConstructorInitializer>(const _UnlinkedConstructorInitializerReader()).vTableGet(_bc, _bcOffset, 14, const <idl.UnlinkedConstructorInitializer>[]);
     return _constantInitializers;
   }
 
   @override
   int get constCycleSlot {
-    _constCycleSlot ??= const fb.Uint32Reader().vTableGet(_bp, 25, 0);
+    _constCycleSlot ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 25, 0);
     return _constCycleSlot;
   }
 
   @override
   idl.UnlinkedDocumentationComment get documentationComment {
-    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 7, null);
+    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bc, _bcOffset, 7, null);
     return _documentationComment;
   }
 
   @override
   int get inferredReturnTypeSlot {
-    _inferredReturnTypeSlot ??= const fb.Uint32Reader().vTableGet(_bp, 5, 0);
+    _inferredReturnTypeSlot ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 5, 0);
     return _inferredReturnTypeSlot;
   }
 
   @override
   bool get isAbstract {
-    _isAbstract ??= const fb.BoolReader().vTableGet(_bp, 10, false);
+    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 10, false);
     return _isAbstract;
   }
 
   @override
   bool get isAsynchronous {
-    _isAsynchronous ??= const fb.BoolReader().vTableGet(_bp, 27, false);
+    _isAsynchronous ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 27, false);
     return _isAsynchronous;
   }
 
   @override
   bool get isConst {
-    _isConst ??= const fb.BoolReader().vTableGet(_bp, 12, false);
+    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 12, false);
     return _isConst;
   }
 
   @override
   bool get isExternal {
-    _isExternal ??= const fb.BoolReader().vTableGet(_bp, 11, false);
+    _isExternal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 11, false);
     return _isExternal;
   }
 
   @override
   bool get isFactory {
-    _isFactory ??= const fb.BoolReader().vTableGet(_bp, 8, false);
+    _isFactory ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
     return _isFactory;
   }
 
   @override
   bool get isGenerator {
-    _isGenerator ??= const fb.BoolReader().vTableGet(_bp, 28, false);
+    _isGenerator ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 28, false);
     return _isGenerator;
   }
 
   @override
   bool get isRedirectedConstructor {
-    _isRedirectedConstructor ??= const fb.BoolReader().vTableGet(_bp, 13, false);
+    _isRedirectedConstructor ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 13, false);
     return _isRedirectedConstructor;
   }
 
   @override
   bool get isStatic {
-    _isStatic ??= const fb.BoolReader().vTableGet(_bp, 9, false);
+    _isStatic ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 9, false);
     return _isStatic;
   }
 
   @override
   idl.UnlinkedExecutableKind get kind {
-    _kind ??= const _UnlinkedExecutableKindReader().vTableGet(_bp, 4, idl.UnlinkedExecutableKind.functionOrMethod);
+    _kind ??= const _UnlinkedExecutableKindReader().vTableGet(_bc, _bcOffset, 4, idl.UnlinkedExecutableKind.functionOrMethod);
     return _kind;
   }
 
   @override
   List<idl.UnlinkedExecutable> get localFunctions {
-    _localFunctions ??= const fb.ListReader<idl.UnlinkedExecutable>(const _UnlinkedExecutableReader()).vTableGet(_bp, 18, const <idl.UnlinkedExecutable>[]);
+    _localFunctions ??= const fb.ListReader<idl.UnlinkedExecutable>(const _UnlinkedExecutableReader()).vTableGet(_bc, _bcOffset, 18, const <idl.UnlinkedExecutable>[]);
     return _localFunctions;
   }
 
   @override
   List<idl.UnlinkedLabel> get localLabels {
-    _localLabels ??= const fb.ListReader<idl.UnlinkedLabel>(const _UnlinkedLabelReader()).vTableGet(_bp, 22, const <idl.UnlinkedLabel>[]);
+    _localLabels ??= const fb.ListReader<idl.UnlinkedLabel>(const _UnlinkedLabelReader()).vTableGet(_bc, _bcOffset, 22, const <idl.UnlinkedLabel>[]);
     return _localLabels;
   }
 
   @override
   List<idl.UnlinkedVariable> get localVariables {
-    _localVariables ??= const fb.ListReader<idl.UnlinkedVariable>(const _UnlinkedVariableReader()).vTableGet(_bp, 19, const <idl.UnlinkedVariable>[]);
+    _localVariables ??= const fb.ListReader<idl.UnlinkedVariable>(const _UnlinkedVariableReader()).vTableGet(_bc, _bcOffset, 19, const <idl.UnlinkedVariable>[]);
     return _localVariables;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 1, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
     return _name;
   }
 
   @override
   int get nameEnd {
-    _nameEnd ??= const fb.Uint32Reader().vTableGet(_bp, 23, 0);
+    _nameEnd ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 23, 0);
     return _nameEnd;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _nameOffset;
   }
 
   @override
   List<idl.UnlinkedParam> get parameters {
-    _parameters ??= const fb.ListReader<idl.UnlinkedParam>(const _UnlinkedParamReader()).vTableGet(_bp, 2, const <idl.UnlinkedParam>[]);
+    _parameters ??= const fb.ListReader<idl.UnlinkedParam>(const _UnlinkedParamReader()).vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedParam>[]);
     return _parameters;
   }
 
   @override
   int get periodOffset {
-    _periodOffset ??= const fb.Uint32Reader().vTableGet(_bp, 24, 0);
+    _periodOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 24, 0);
     return _periodOffset;
   }
 
   @override
   idl.EntityRef get redirectedConstructor {
-    _redirectedConstructor ??= const _EntityRefReader().vTableGet(_bp, 15, null);
+    _redirectedConstructor ??= const _EntityRefReader().vTableGet(_bc, _bcOffset, 15, null);
     return _redirectedConstructor;
   }
 
   @override
   String get redirectedConstructorName {
-    _redirectedConstructorName ??= const fb.StringReader().vTableGet(_bp, 17, '');
+    _redirectedConstructorName ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 17, '');
     return _redirectedConstructorName;
   }
 
   @override
   idl.EntityRef get returnType {
-    _returnType ??= const _EntityRefReader().vTableGet(_bp, 3, null);
+    _returnType ??= const _EntityRefReader().vTableGet(_bc, _bcOffset, 3, null);
     return _returnType;
   }
 
   @override
   List<idl.UnlinkedTypeParam> get typeParameters {
-    _typeParameters ??= const fb.ListReader<idl.UnlinkedTypeParam>(const _UnlinkedTypeParamReader()).vTableGet(_bp, 16, const <idl.UnlinkedTypeParam>[]);
+    _typeParameters ??= const fb.ListReader<idl.UnlinkedTypeParam>(const _UnlinkedTypeParamReader()).vTableGet(_bc, _bcOffset, 16, const <idl.UnlinkedTypeParam>[]);
     return _typeParameters;
   }
 
   @override
   int get visibleLength {
-    _visibleLength ??= const fb.Uint32Reader().vTableGet(_bp, 20, 0);
+    _visibleLength ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 20, 0);
     return _visibleLength;
   }
 
   @override
   int get visibleOffset {
-    _visibleOffset ??= const fb.Uint32Reader().vTableGet(_bp, 21, 0);
+    _visibleOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 21, 0);
     return _visibleOffset;
   }
 }
@@ -5042,6 +5091,7 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
+    if (bodyExpr != null) _result["bodyExpr"] = bodyExpr.toJson();
     if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (constantInitializers.isNotEmpty) _result["constantInitializers"] = constantInitializers.map((_value) => _value.toJson()).toList();
     if (constCycleSlot != 0) _result["constCycleSlot"] = constCycleSlot;
@@ -5076,6 +5126,7 @@
   @override
   Map<String, Object> toMap() => {
     "annotations": annotations,
+    "bodyExpr": bodyExpr,
     "codeRange": codeRange,
     "constantInitializers": constantInitializers,
     "constCycleSlot": constCycleSlot,
@@ -5211,13 +5262,14 @@
   const _UnlinkedExportNonPublicReader();
 
   @override
-  _UnlinkedExportNonPublicImpl createObject(fb.BufferPointer bp) => new _UnlinkedExportNonPublicImpl(bp);
+  _UnlinkedExportNonPublicImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedExportNonPublicImpl(bc, offset);
 }
 
 class _UnlinkedExportNonPublicImpl extends Object with _UnlinkedExportNonPublicMixin implements idl.UnlinkedExportNonPublic {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedExportNonPublicImpl(this._bp);
+  _UnlinkedExportNonPublicImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   int _offset;
@@ -5226,25 +5278,25 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 3, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 3, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   int get offset {
-    _offset ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _offset;
   }
 
   @override
   int get uriEnd {
-    _uriEnd ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _uriEnd ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _uriEnd;
   }
 
   @override
   int get uriOffset {
-    _uriOffset ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _uriOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _uriOffset;
   }
 }
@@ -5337,26 +5389,27 @@
   const _UnlinkedExportPublicReader();
 
   @override
-  _UnlinkedExportPublicImpl createObject(fb.BufferPointer bp) => new _UnlinkedExportPublicImpl(bp);
+  _UnlinkedExportPublicImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedExportPublicImpl(bc, offset);
 }
 
 class _UnlinkedExportPublicImpl extends Object with _UnlinkedExportPublicMixin implements idl.UnlinkedExportPublic {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedExportPublicImpl(this._bp);
+  _UnlinkedExportPublicImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedCombinator> _combinators;
   String _uri;
 
   @override
   List<idl.UnlinkedCombinator> get combinators {
-    _combinators ??= const fb.ListReader<idl.UnlinkedCombinator>(const _UnlinkedCombinatorReader()).vTableGet(_bp, 1, const <idl.UnlinkedCombinator>[]);
+    _combinators ??= const fb.ListReader<idl.UnlinkedCombinator>(const _UnlinkedCombinatorReader()).vTableGet(_bc, _bcOffset, 1, const <idl.UnlinkedCombinator>[]);
     return _combinators;
   }
 
   @override
   String get uri {
-    _uri ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _uri;
   }
 }
@@ -5594,13 +5647,14 @@
   const _UnlinkedImportReader();
 
   @override
-  _UnlinkedImportImpl createObject(fb.BufferPointer bp) => new _UnlinkedImportImpl(bp);
+  _UnlinkedImportImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedImportImpl(bc, offset);
 }
 
 class _UnlinkedImportImpl extends Object with _UnlinkedImportMixin implements idl.UnlinkedImport {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedImportImpl(this._bp);
+  _UnlinkedImportImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   List<idl.UnlinkedCombinator> _combinators;
@@ -5615,61 +5669,61 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 8, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 8, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   List<idl.UnlinkedCombinator> get combinators {
-    _combinators ??= const fb.ListReader<idl.UnlinkedCombinator>(const _UnlinkedCombinatorReader()).vTableGet(_bp, 4, const <idl.UnlinkedCombinator>[]);
+    _combinators ??= const fb.ListReader<idl.UnlinkedCombinator>(const _UnlinkedCombinatorReader()).vTableGet(_bc, _bcOffset, 4, const <idl.UnlinkedCombinator>[]);
     return _combinators;
   }
 
   @override
   bool get isDeferred {
-    _isDeferred ??= const fb.BoolReader().vTableGet(_bp, 9, false);
+    _isDeferred ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 9, false);
     return _isDeferred;
   }
 
   @override
   bool get isImplicit {
-    _isImplicit ??= const fb.BoolReader().vTableGet(_bp, 5, false);
+    _isImplicit ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 5, false);
     return _isImplicit;
   }
 
   @override
   int get offset {
-    _offset ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _offset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _offset;
   }
 
   @override
   int get prefixOffset {
-    _prefixOffset ??= const fb.Uint32Reader().vTableGet(_bp, 6, 0);
+    _prefixOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
     return _prefixOffset;
   }
 
   @override
   int get prefixReference {
-    _prefixReference ??= const fb.Uint32Reader().vTableGet(_bp, 7, 0);
+    _prefixReference ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 7, 0);
     return _prefixReference;
   }
 
   @override
   String get uri {
-    _uri ??= const fb.StringReader().vTableGet(_bp, 1, '');
+    _uri ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
     return _uri;
   }
 
   @override
   int get uriEnd {
-    _uriEnd ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _uriEnd ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _uriEnd;
   }
 
   @override
   int get uriOffset {
-    _uriOffset ??= const fb.Uint32Reader().vTableGet(_bp, 3, 0);
+    _uriOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
     return _uriOffset;
   }
 }
@@ -5804,13 +5858,14 @@
   const _UnlinkedLabelReader();
 
   @override
-  _UnlinkedLabelImpl createObject(fb.BufferPointer bp) => new _UnlinkedLabelImpl(bp);
+  _UnlinkedLabelImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedLabelImpl(bc, offset);
 }
 
 class _UnlinkedLabelImpl extends Object with _UnlinkedLabelMixin implements idl.UnlinkedLabel {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedLabelImpl(this._bp);
+  _UnlinkedLabelImpl(this._bc, this._bcOffset);
 
   bool _isOnSwitchMember;
   bool _isOnSwitchStatement;
@@ -5819,25 +5874,25 @@
 
   @override
   bool get isOnSwitchMember {
-    _isOnSwitchMember ??= const fb.BoolReader().vTableGet(_bp, 2, false);
+    _isOnSwitchMember ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 2, false);
     return _isOnSwitchMember;
   }
 
   @override
   bool get isOnSwitchStatement {
-    _isOnSwitchStatement ??= const fb.BoolReader().vTableGet(_bp, 3, false);
+    _isOnSwitchStatement ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
     return _isOnSwitchStatement;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _nameOffset;
   }
 }
@@ -6188,13 +6243,14 @@
   const _UnlinkedParamReader();
 
   @override
-  _UnlinkedParamImpl createObject(fb.BufferPointer bp) => new _UnlinkedParamImpl(bp);
+  _UnlinkedParamImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedParamImpl(bc, offset);
 }
 
 class _UnlinkedParamImpl extends Object with _UnlinkedParamMixin implements idl.UnlinkedParam {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedParamImpl(this._bp);
+  _UnlinkedParamImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   idl.CodeRange _codeRange;
@@ -6214,91 +6270,91 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 9, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 9, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   idl.CodeRange get codeRange {
-    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 14, null);
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 14, null);
     return _codeRange;
   }
 
   @override
   idl.UnlinkedConst get defaultValue {
-    _defaultValue ??= const _UnlinkedConstReader().vTableGet(_bp, 7, null);
+    _defaultValue ??= const _UnlinkedConstReader().vTableGet(_bc, _bcOffset, 7, null);
     return _defaultValue;
   }
 
   @override
   String get defaultValueCode {
-    _defaultValueCode ??= const fb.StringReader().vTableGet(_bp, 13, '');
+    _defaultValueCode ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 13, '');
     return _defaultValueCode;
   }
 
   @override
   int get inferredTypeSlot {
-    _inferredTypeSlot ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _inferredTypeSlot ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _inferredTypeSlot;
   }
 
   @override
   idl.UnlinkedExecutable get initializer {
-    _initializer ??= const _UnlinkedExecutableReader().vTableGet(_bp, 12, null);
+    _initializer ??= const _UnlinkedExecutableReader().vTableGet(_bc, _bcOffset, 12, null);
     return _initializer;
   }
 
   @override
   bool get isFunctionTyped {
-    _isFunctionTyped ??= const fb.BoolReader().vTableGet(_bp, 5, false);
+    _isFunctionTyped ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 5, false);
     return _isFunctionTyped;
   }
 
   @override
   bool get isInitializingFormal {
-    _isInitializingFormal ??= const fb.BoolReader().vTableGet(_bp, 6, false);
+    _isInitializingFormal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 6, false);
     return _isInitializingFormal;
   }
 
   @override
   idl.UnlinkedParamKind get kind {
-    _kind ??= const _UnlinkedParamKindReader().vTableGet(_bp, 4, idl.UnlinkedParamKind.required);
+    _kind ??= const _UnlinkedParamKindReader().vTableGet(_bc, _bcOffset, 4, idl.UnlinkedParamKind.required);
     return _kind;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _nameOffset;
   }
 
   @override
   List<idl.UnlinkedParam> get parameters {
-    _parameters ??= const fb.ListReader<idl.UnlinkedParam>(const _UnlinkedParamReader()).vTableGet(_bp, 8, const <idl.UnlinkedParam>[]);
+    _parameters ??= const fb.ListReader<idl.UnlinkedParam>(const _UnlinkedParamReader()).vTableGet(_bc, _bcOffset, 8, const <idl.UnlinkedParam>[]);
     return _parameters;
   }
 
   @override
   idl.EntityRef get type {
-    _type ??= const _EntityRefReader().vTableGet(_bp, 3, null);
+    _type ??= const _EntityRefReader().vTableGet(_bc, _bcOffset, 3, null);
     return _type;
   }
 
   @override
   int get visibleLength {
-    _visibleLength ??= const fb.Uint32Reader().vTableGet(_bp, 10, 0);
+    _visibleLength ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 10, 0);
     return _visibleLength;
   }
 
   @override
   int get visibleOffset {
-    _visibleOffset ??= const fb.Uint32Reader().vTableGet(_bp, 11, 0);
+    _visibleOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 11, 0);
     return _visibleOffset;
   }
 }
@@ -6431,13 +6487,14 @@
   const _UnlinkedPartReader();
 
   @override
-  _UnlinkedPartImpl createObject(fb.BufferPointer bp) => new _UnlinkedPartImpl(bp);
+  _UnlinkedPartImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedPartImpl(bc, offset);
 }
 
 class _UnlinkedPartImpl extends Object with _UnlinkedPartMixin implements idl.UnlinkedPart {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedPartImpl(this._bp);
+  _UnlinkedPartImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   int _uriEnd;
@@ -6445,19 +6502,19 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 2, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   int get uriEnd {
-    _uriEnd ??= const fb.Uint32Reader().vTableGet(_bp, 0, 0);
+    _uriEnd ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 0, 0);
     return _uriEnd;
   }
 
   @override
   int get uriOffset {
-    _uriOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _uriOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _uriOffset;
   }
 }
@@ -6587,13 +6644,14 @@
   const _UnlinkedPublicNameReader();
 
   @override
-  _UnlinkedPublicNameImpl createObject(fb.BufferPointer bp) => new _UnlinkedPublicNameImpl(bp);
+  _UnlinkedPublicNameImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedPublicNameImpl(bc, offset);
 }
 
 class _UnlinkedPublicNameImpl extends Object with _UnlinkedPublicNameMixin implements idl.UnlinkedPublicName {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedPublicNameImpl(this._bp);
+  _UnlinkedPublicNameImpl(this._bc, this._bcOffset);
 
   idl.ReferenceKind _kind;
   List<idl.UnlinkedPublicName> _members;
@@ -6602,25 +6660,25 @@
 
   @override
   idl.ReferenceKind get kind {
-    _kind ??= const _ReferenceKindReader().vTableGet(_bp, 1, idl.ReferenceKind.classOrEnum);
+    _kind ??= const _ReferenceKindReader().vTableGet(_bc, _bcOffset, 1, idl.ReferenceKind.classOrEnum);
     return _kind;
   }
 
   @override
   List<idl.UnlinkedPublicName> get members {
-    _members ??= const fb.ListReader<idl.UnlinkedPublicName>(const _UnlinkedPublicNameReader()).vTableGet(_bp, 2, const <idl.UnlinkedPublicName>[]);
+    _members ??= const fb.ListReader<idl.UnlinkedPublicName>(const _UnlinkedPublicNameReader()).vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedPublicName>[]);
     return _members;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get numTypeParameters {
-    _numTypeParameters ??= const fb.Uint32Reader().vTableGet(_bp, 3, 0);
+    _numTypeParameters ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
     return _numTypeParameters;
   }
 }
@@ -6739,21 +6797,22 @@
 }
 
 idl.UnlinkedPublicNamespace readUnlinkedPublicNamespace(List<int> buffer) {
-  fb.BufferPointer rootRef = new fb.BufferPointer.fromBytes(buffer);
-  return const _UnlinkedPublicNamespaceReader().read(rootRef);
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _UnlinkedPublicNamespaceReader().read(rootRef, 0);
 }
 
 class _UnlinkedPublicNamespaceReader extends fb.TableReader<_UnlinkedPublicNamespaceImpl> {
   const _UnlinkedPublicNamespaceReader();
 
   @override
-  _UnlinkedPublicNamespaceImpl createObject(fb.BufferPointer bp) => new _UnlinkedPublicNamespaceImpl(bp);
+  _UnlinkedPublicNamespaceImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedPublicNamespaceImpl(bc, offset);
 }
 
 class _UnlinkedPublicNamespaceImpl extends Object with _UnlinkedPublicNamespaceMixin implements idl.UnlinkedPublicNamespace {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedPublicNamespaceImpl(this._bp);
+  _UnlinkedPublicNamespaceImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedExportPublic> _exports;
   List<idl.UnlinkedPublicName> _names;
@@ -6761,19 +6820,19 @@
 
   @override
   List<idl.UnlinkedExportPublic> get exports {
-    _exports ??= const fb.ListReader<idl.UnlinkedExportPublic>(const _UnlinkedExportPublicReader()).vTableGet(_bp, 2, const <idl.UnlinkedExportPublic>[]);
+    _exports ??= const fb.ListReader<idl.UnlinkedExportPublic>(const _UnlinkedExportPublicReader()).vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedExportPublic>[]);
     return _exports;
   }
 
   @override
   List<idl.UnlinkedPublicName> get names {
-    _names ??= const fb.ListReader<idl.UnlinkedPublicName>(const _UnlinkedPublicNameReader()).vTableGet(_bp, 0, const <idl.UnlinkedPublicName>[]);
+    _names ??= const fb.ListReader<idl.UnlinkedPublicName>(const _UnlinkedPublicNameReader()).vTableGet(_bc, _bcOffset, 0, const <idl.UnlinkedPublicName>[]);
     return _names;
   }
 
   @override
   List<String> get parts {
-    _parts ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bp, 1, const <String>[]);
+    _parts ??= const fb.ListReader<String>(const fb.StringReader()).vTableGet(_bc, _bcOffset, 1, const <String>[]);
     return _parts;
   }
 }
@@ -6867,26 +6926,27 @@
   const _UnlinkedReferenceReader();
 
   @override
-  _UnlinkedReferenceImpl createObject(fb.BufferPointer bp) => new _UnlinkedReferenceImpl(bp);
+  _UnlinkedReferenceImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedReferenceImpl(bc, offset);
 }
 
 class _UnlinkedReferenceImpl extends Object with _UnlinkedReferenceMixin implements idl.UnlinkedReference {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedReferenceImpl(this._bp);
+  _UnlinkedReferenceImpl(this._bc, this._bcOffset);
 
   String _name;
   int _prefixReference;
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get prefixReference {
-    _prefixReference ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _prefixReference ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _prefixReference;
   }
 }
@@ -7099,13 +7159,14 @@
   const _UnlinkedTypedefReader();
 
   @override
-  _UnlinkedTypedefImpl createObject(fb.BufferPointer bp) => new _UnlinkedTypedefImpl(bp);
+  _UnlinkedTypedefImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedTypedefImpl(bc, offset);
 }
 
 class _UnlinkedTypedefImpl extends Object with _UnlinkedTypedefMixin implements idl.UnlinkedTypedef {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedTypedefImpl(this._bp);
+  _UnlinkedTypedefImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   idl.CodeRange _codeRange;
@@ -7118,49 +7179,49 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 4, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 4, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   idl.CodeRange get codeRange {
-    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 7, null);
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 7, null);
     return _codeRange;
   }
 
   @override
   idl.UnlinkedDocumentationComment get documentationComment {
-    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 6, null);
+    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bc, _bcOffset, 6, null);
     return _documentationComment;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _nameOffset;
   }
 
   @override
   List<idl.UnlinkedParam> get parameters {
-    _parameters ??= const fb.ListReader<idl.UnlinkedParam>(const _UnlinkedParamReader()).vTableGet(_bp, 3, const <idl.UnlinkedParam>[]);
+    _parameters ??= const fb.ListReader<idl.UnlinkedParam>(const _UnlinkedParamReader()).vTableGet(_bc, _bcOffset, 3, const <idl.UnlinkedParam>[]);
     return _parameters;
   }
 
   @override
   idl.EntityRef get returnType {
-    _returnType ??= const _EntityRefReader().vTableGet(_bp, 2, null);
+    _returnType ??= const _EntityRefReader().vTableGet(_bc, _bcOffset, 2, null);
     return _returnType;
   }
 
   @override
   List<idl.UnlinkedTypeParam> get typeParameters {
-    _typeParameters ??= const fb.ListReader<idl.UnlinkedTypeParam>(const _UnlinkedTypeParamReader()).vTableGet(_bp, 5, const <idl.UnlinkedTypeParam>[]);
+    _typeParameters ??= const fb.ListReader<idl.UnlinkedTypeParam>(const _UnlinkedTypeParamReader()).vTableGet(_bc, _bcOffset, 5, const <idl.UnlinkedTypeParam>[]);
     return _typeParameters;
   }
 }
@@ -7322,13 +7383,14 @@
   const _UnlinkedTypeParamReader();
 
   @override
-  _UnlinkedTypeParamImpl createObject(fb.BufferPointer bp) => new _UnlinkedTypeParamImpl(bp);
+  _UnlinkedTypeParamImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedTypeParamImpl(bc, offset);
 }
 
 class _UnlinkedTypeParamImpl extends Object with _UnlinkedTypeParamMixin implements idl.UnlinkedTypeParam {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedTypeParamImpl(this._bp);
+  _UnlinkedTypeParamImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   idl.EntityRef _bound;
@@ -7338,31 +7400,31 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 3, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 3, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   idl.EntityRef get bound {
-    _bound ??= const _EntityRefReader().vTableGet(_bp, 2, null);
+    _bound ??= const _EntityRefReader().vTableGet(_bc, _bcOffset, 2, null);
     return _bound;
   }
 
   @override
   idl.CodeRange get codeRange {
-    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 4, null);
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 4, null);
     return _codeRange;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _nameOffset;
   }
 }
@@ -7780,21 +7842,22 @@
 }
 
 idl.UnlinkedUnit readUnlinkedUnit(List<int> buffer) {
-  fb.BufferPointer rootRef = new fb.BufferPointer.fromBytes(buffer);
-  return const _UnlinkedUnitReader().read(rootRef);
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _UnlinkedUnitReader().read(rootRef, 0);
 }
 
 class _UnlinkedUnitReader extends fb.TableReader<_UnlinkedUnitImpl> {
   const _UnlinkedUnitReader();
 
   @override
-  _UnlinkedUnitImpl createObject(fb.BufferPointer bp) => new _UnlinkedUnitImpl(bp);
+  _UnlinkedUnitImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedUnitImpl(bc, offset);
 }
 
 class _UnlinkedUnitImpl extends Object with _UnlinkedUnitMixin implements idl.UnlinkedUnit {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedUnitImpl(this._bp);
+  _UnlinkedUnitImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedClass> _classes;
   idl.CodeRange _codeRange;
@@ -7816,103 +7879,103 @@
 
   @override
   List<idl.UnlinkedClass> get classes {
-    _classes ??= const fb.ListReader<idl.UnlinkedClass>(const _UnlinkedClassReader()).vTableGet(_bp, 2, const <idl.UnlinkedClass>[]);
+    _classes ??= const fb.ListReader<idl.UnlinkedClass>(const _UnlinkedClassReader()).vTableGet(_bc, _bcOffset, 2, const <idl.UnlinkedClass>[]);
     return _classes;
   }
 
   @override
   idl.CodeRange get codeRange {
-    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 15, null);
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 15, null);
     return _codeRange;
   }
 
   @override
   List<idl.UnlinkedEnum> get enums {
-    _enums ??= const fb.ListReader<idl.UnlinkedEnum>(const _UnlinkedEnumReader()).vTableGet(_bp, 12, const <idl.UnlinkedEnum>[]);
+    _enums ??= const fb.ListReader<idl.UnlinkedEnum>(const _UnlinkedEnumReader()).vTableGet(_bc, _bcOffset, 12, const <idl.UnlinkedEnum>[]);
     return _enums;
   }
 
   @override
   List<idl.UnlinkedExecutable> get executables {
-    _executables ??= const fb.ListReader<idl.UnlinkedExecutable>(const _UnlinkedExecutableReader()).vTableGet(_bp, 4, const <idl.UnlinkedExecutable>[]);
+    _executables ??= const fb.ListReader<idl.UnlinkedExecutable>(const _UnlinkedExecutableReader()).vTableGet(_bc, _bcOffset, 4, const <idl.UnlinkedExecutable>[]);
     return _executables;
   }
 
   @override
   List<idl.UnlinkedExportNonPublic> get exports {
-    _exports ??= const fb.ListReader<idl.UnlinkedExportNonPublic>(const _UnlinkedExportNonPublicReader()).vTableGet(_bp, 13, const <idl.UnlinkedExportNonPublic>[]);
+    _exports ??= const fb.ListReader<idl.UnlinkedExportNonPublic>(const _UnlinkedExportNonPublicReader()).vTableGet(_bc, _bcOffset, 13, const <idl.UnlinkedExportNonPublic>[]);
     return _exports;
   }
 
   @override
   String get fallbackModePath {
-    _fallbackModePath ??= const fb.StringReader().vTableGet(_bp, 16, '');
+    _fallbackModePath ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 16, '');
     return _fallbackModePath;
   }
 
   @override
   List<idl.UnlinkedImport> get imports {
-    _imports ??= const fb.ListReader<idl.UnlinkedImport>(const _UnlinkedImportReader()).vTableGet(_bp, 5, const <idl.UnlinkedImport>[]);
+    _imports ??= const fb.ListReader<idl.UnlinkedImport>(const _UnlinkedImportReader()).vTableGet(_bc, _bcOffset, 5, const <idl.UnlinkedImport>[]);
     return _imports;
   }
 
   @override
   List<idl.UnlinkedConst> get libraryAnnotations {
-    _libraryAnnotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 14, const <idl.UnlinkedConst>[]);
+    _libraryAnnotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 14, const <idl.UnlinkedConst>[]);
     return _libraryAnnotations;
   }
 
   @override
   idl.UnlinkedDocumentationComment get libraryDocumentationComment {
-    _libraryDocumentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 9, null);
+    _libraryDocumentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bc, _bcOffset, 9, null);
     return _libraryDocumentationComment;
   }
 
   @override
   String get libraryName {
-    _libraryName ??= const fb.StringReader().vTableGet(_bp, 6, '');
+    _libraryName ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 6, '');
     return _libraryName;
   }
 
   @override
   int get libraryNameLength {
-    _libraryNameLength ??= const fb.Uint32Reader().vTableGet(_bp, 7, 0);
+    _libraryNameLength ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 7, 0);
     return _libraryNameLength;
   }
 
   @override
   int get libraryNameOffset {
-    _libraryNameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 8, 0);
+    _libraryNameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 8, 0);
     return _libraryNameOffset;
   }
 
   @override
   List<idl.UnlinkedPart> get parts {
-    _parts ??= const fb.ListReader<idl.UnlinkedPart>(const _UnlinkedPartReader()).vTableGet(_bp, 11, const <idl.UnlinkedPart>[]);
+    _parts ??= const fb.ListReader<idl.UnlinkedPart>(const _UnlinkedPartReader()).vTableGet(_bc, _bcOffset, 11, const <idl.UnlinkedPart>[]);
     return _parts;
   }
 
   @override
   idl.UnlinkedPublicNamespace get publicNamespace {
-    _publicNamespace ??= const _UnlinkedPublicNamespaceReader().vTableGet(_bp, 0, null);
+    _publicNamespace ??= const _UnlinkedPublicNamespaceReader().vTableGet(_bc, _bcOffset, 0, null);
     return _publicNamespace;
   }
 
   @override
   List<idl.UnlinkedReference> get references {
-    _references ??= const fb.ListReader<idl.UnlinkedReference>(const _UnlinkedReferenceReader()).vTableGet(_bp, 1, const <idl.UnlinkedReference>[]);
+    _references ??= const fb.ListReader<idl.UnlinkedReference>(const _UnlinkedReferenceReader()).vTableGet(_bc, _bcOffset, 1, const <idl.UnlinkedReference>[]);
     return _references;
   }
 
   @override
   List<idl.UnlinkedTypedef> get typedefs {
-    _typedefs ??= const fb.ListReader<idl.UnlinkedTypedef>(const _UnlinkedTypedefReader()).vTableGet(_bp, 10, const <idl.UnlinkedTypedef>[]);
+    _typedefs ??= const fb.ListReader<idl.UnlinkedTypedef>(const _UnlinkedTypedefReader()).vTableGet(_bc, _bcOffset, 10, const <idl.UnlinkedTypedef>[]);
     return _typedefs;
   }
 
   @override
   List<idl.UnlinkedVariable> get variables {
-    _variables ??= const fb.ListReader<idl.UnlinkedVariable>(const _UnlinkedVariableReader()).vTableGet(_bp, 3, const <idl.UnlinkedVariable>[]);
+    _variables ??= const fb.ListReader<idl.UnlinkedVariable>(const _UnlinkedVariableReader()).vTableGet(_bc, _bcOffset, 3, const <idl.UnlinkedVariable>[]);
     return _variables;
   }
 }
@@ -7971,7 +8034,6 @@
 
   List<UnlinkedConstBuilder> _annotations;
   CodeRangeBuilder _codeRange;
-  UnlinkedConstBuilder _constExpr;
   UnlinkedDocumentationCommentBuilder _documentationComment;
   int _inferredTypeSlot;
   UnlinkedExecutableBuilder _initializer;
@@ -8008,19 +8070,6 @@
   }
 
   @override
-  UnlinkedConstBuilder get constExpr => _constExpr;
-
-  /**
-   * If [isConst] is true, and the variable has an initializer, the constant
-   * expression in the initializer.  Note that the presence of this expression
-   * does not mean that it is a valid, check [UnlinkedConst.isInvalid].
-   */
-  void set constExpr(UnlinkedConstBuilder _value) {
-    assert(!_finished);
-    _constExpr = _value;
-  }
-
-  @override
   UnlinkedDocumentationCommentBuilder get documentationComment => _documentationComment;
 
   /**
@@ -8171,10 +8220,9 @@
     _visibleOffset = _value;
   }
 
-  UnlinkedVariableBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, UnlinkedConstBuilder constExpr, UnlinkedDocumentationCommentBuilder documentationComment, int inferredTypeSlot, UnlinkedExecutableBuilder initializer, bool isConst, bool isFinal, bool isStatic, String name, int nameOffset, int propagatedTypeSlot, EntityRefBuilder type, int visibleLength, int visibleOffset})
+  UnlinkedVariableBuilder({List<UnlinkedConstBuilder> annotations, CodeRangeBuilder codeRange, UnlinkedDocumentationCommentBuilder documentationComment, int inferredTypeSlot, UnlinkedExecutableBuilder initializer, bool isConst, bool isFinal, bool isStatic, String name, int nameOffset, int propagatedTypeSlot, EntityRefBuilder type, int visibleLength, int visibleOffset})
     : _annotations = annotations,
       _codeRange = codeRange,
-      _constExpr = constExpr,
       _documentationComment = documentationComment,
       _inferredTypeSlot = inferredTypeSlot,
       _initializer = initializer,
@@ -8194,7 +8242,6 @@
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _codeRange = null;
-    _constExpr?.flushInformative();
     _documentationComment = null;
     _initializer?.flushInformative();
     _nameOffset = null;
@@ -8206,7 +8253,6 @@
     _finished = true;
     fb.Offset offset_annotations;
     fb.Offset offset_codeRange;
-    fb.Offset offset_constExpr;
     fb.Offset offset_documentationComment;
     fb.Offset offset_initializer;
     fb.Offset offset_name;
@@ -8217,9 +8263,6 @@
     if (_codeRange != null) {
       offset_codeRange = _codeRange.finish(fbBuilder);
     }
-    if (_constExpr != null) {
-      offset_constExpr = _constExpr.finish(fbBuilder);
-    }
     if (_documentationComment != null) {
       offset_documentationComment = _documentationComment.finish(fbBuilder);
     }
@@ -8237,10 +8280,7 @@
       fbBuilder.addOffset(8, offset_annotations);
     }
     if (offset_codeRange != null) {
-      fbBuilder.addOffset(14, offset_codeRange);
-    }
-    if (offset_constExpr != null) {
-      fbBuilder.addOffset(5, offset_constExpr);
+      fbBuilder.addOffset(5, offset_codeRange);
     }
     if (offset_documentationComment != null) {
       fbBuilder.addOffset(10, offset_documentationComment);
@@ -8286,17 +8326,17 @@
   const _UnlinkedVariableReader();
 
   @override
-  _UnlinkedVariableImpl createObject(fb.BufferPointer bp) => new _UnlinkedVariableImpl(bp);
+  _UnlinkedVariableImpl createObject(fb.BufferContext bc, int offset) => new _UnlinkedVariableImpl(bc, offset);
 }
 
 class _UnlinkedVariableImpl extends Object with _UnlinkedVariableMixin implements idl.UnlinkedVariable {
-  final fb.BufferPointer _bp;
+  final fb.BufferContext _bc;
+  final int _bcOffset;
 
-  _UnlinkedVariableImpl(this._bp);
+  _UnlinkedVariableImpl(this._bc, this._bcOffset);
 
   List<idl.UnlinkedConst> _annotations;
   idl.CodeRange _codeRange;
-  idl.UnlinkedConst _constExpr;
   idl.UnlinkedDocumentationComment _documentationComment;
   int _inferredTypeSlot;
   idl.UnlinkedExecutable _initializer;
@@ -8312,91 +8352,85 @@
 
   @override
   List<idl.UnlinkedConst> get annotations {
-    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bp, 8, const <idl.UnlinkedConst>[]);
+    _annotations ??= const fb.ListReader<idl.UnlinkedConst>(const _UnlinkedConstReader()).vTableGet(_bc, _bcOffset, 8, const <idl.UnlinkedConst>[]);
     return _annotations;
   }
 
   @override
   idl.CodeRange get codeRange {
-    _codeRange ??= const _CodeRangeReader().vTableGet(_bp, 14, null);
+    _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 5, null);
     return _codeRange;
   }
 
   @override
-  idl.UnlinkedConst get constExpr {
-    _constExpr ??= const _UnlinkedConstReader().vTableGet(_bp, 5, null);
-    return _constExpr;
-  }
-
-  @override
   idl.UnlinkedDocumentationComment get documentationComment {
-    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bp, 10, null);
+    _documentationComment ??= const _UnlinkedDocumentationCommentReader().vTableGet(_bc, _bcOffset, 10, null);
     return _documentationComment;
   }
 
   @override
   int get inferredTypeSlot {
-    _inferredTypeSlot ??= const fb.Uint32Reader().vTableGet(_bp, 9, 0);
+    _inferredTypeSlot ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 9, 0);
     return _inferredTypeSlot;
   }
 
   @override
   idl.UnlinkedExecutable get initializer {
-    _initializer ??= const _UnlinkedExecutableReader().vTableGet(_bp, 13, null);
+    _initializer ??= const _UnlinkedExecutableReader().vTableGet(_bc, _bcOffset, 13, null);
     return _initializer;
   }
 
   @override
   bool get isConst {
-    _isConst ??= const fb.BoolReader().vTableGet(_bp, 6, false);
+    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 6, false);
     return _isConst;
   }
 
   @override
   bool get isFinal {
-    _isFinal ??= const fb.BoolReader().vTableGet(_bp, 7, false);
+    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 7, false);
     return _isFinal;
   }
 
   @override
   bool get isStatic {
-    _isStatic ??= const fb.BoolReader().vTableGet(_bp, 4, false);
+    _isStatic ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 4, false);
     return _isStatic;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bp, 0, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
   }
 
   @override
   int get nameOffset {
-    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bp, 1, 0);
+    _nameOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
     return _nameOffset;
   }
 
   @override
   int get propagatedTypeSlot {
-    _propagatedTypeSlot ??= const fb.Uint32Reader().vTableGet(_bp, 2, 0);
+    _propagatedTypeSlot ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
     return _propagatedTypeSlot;
   }
 
   @override
   idl.EntityRef get type {
-    _type ??= const _EntityRefReader().vTableGet(_bp, 3, null);
+    _type ??= const _EntityRefReader().vTableGet(_bc, _bcOffset, 3, null);
     return _type;
   }
 
   @override
   int get visibleLength {
-    _visibleLength ??= const fb.Uint32Reader().vTableGet(_bp, 11, 0);
+    _visibleLength ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 11, 0);
     return _visibleLength;
   }
 
   @override
   int get visibleOffset {
-    _visibleOffset ??= const fb.Uint32Reader().vTableGet(_bp, 12, 0);
+    _visibleOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 12, 0);
     return _visibleOffset;
   }
 }
@@ -8407,7 +8441,6 @@
     Map<String, Object> _result = <String, Object>{};
     if (annotations.isNotEmpty) _result["annotations"] = annotations.map((_value) => _value.toJson()).toList();
     if (codeRange != null) _result["codeRange"] = codeRange.toJson();
-    if (constExpr != null) _result["constExpr"] = constExpr.toJson();
     if (documentationComment != null) _result["documentationComment"] = documentationComment.toJson();
     if (inferredTypeSlot != 0) _result["inferredTypeSlot"] = inferredTypeSlot;
     if (initializer != null) _result["initializer"] = initializer.toJson();
@@ -8427,7 +8460,6 @@
   Map<String, Object> toMap() => {
     "annotations": annotations,
     "codeRange": codeRange,
-    "constExpr": constExpr,
     "documentationComment": documentationComment,
     "inferredTypeSlot": inferredTypeSlot,
     "initializer": initializer,
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 8df99fe..92accd5 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -1472,12 +1472,6 @@
  */
 table UnlinkedConstructorInitializer {
   /**
-   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
-   * invocation.  Otherwise empty.
-   */
-  arguments:[UnlinkedConst] (id: 3);
-
-  /**
    * If there are `m` [arguments] and `n` [argumentNames], then each argument
    * from [arguments] with index `i` such that `n + i - m >= 0`, should be used
    * with the name at `n + i - m`.
@@ -1485,6 +1479,12 @@
   argumentNames:[string] (id: 4);
 
   /**
+   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
+   * invocation.  Otherwise empty.
+   */
+  arguments:[UnlinkedConst] (id: 3);
+
+  /**
    * If [kind] is `field`, the expression of the field initializer.
    * Otherwise `null`.
    */
@@ -1597,6 +1597,13 @@
   annotations:[UnlinkedConst] (id: 6);
 
   /**
+   * If this executable's function body is declared using `=>`, the expression
+   * to the right of the `=>`.  May be omitted if neither type inference nor
+   * constant evaluation depends on the function body.
+   */
+  bodyExpr:UnlinkedConst (id: 29);
+
+  /**
    * Code range of the executable.
    */
   codeRange:CodeRange (id: 26);
@@ -2296,14 +2303,7 @@
   /**
    * Code range of the variable.
    */
-  codeRange:CodeRange (id: 14);
-
-  /**
-   * If [isConst] is true, and the variable has an initializer, the constant
-   * expression in the initializer.  Note that the presence of this expression
-   * does not mean that it is a valid, check [UnlinkedConst.isInvalid].
-   */
-  constExpr:UnlinkedConst (id: 5);
+  codeRange:CodeRange (id: 5);
 
   /**
    * Documentation comment for the variable, or `null` if there is no
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 65b092d..de2ef57 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -41,6 +41,8 @@
  */
 library analyzer.tool.summary.idl;
 
+import 'package:analyzer/dart/element/element.dart';
+
 import 'base.dart' as base;
 import 'base.dart' show Id, TopLevel;
 import 'format.dart' as generated;
@@ -1468,13 +1470,6 @@
  */
 abstract class UnlinkedConstructorInitializer extends base.SummaryClass {
   /**
-   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
-   * invocation.  Otherwise empty.
-   */
-  @Id(3)
-  List<UnlinkedConst> get arguments;
-
-  /**
    * If there are `m` [arguments] and `n` [argumentNames], then each argument
    * from [arguments] with index `i` such that `n + i - m >= 0`, should be used
    * with the name at `n + i - m`.
@@ -1483,6 +1478,13 @@
   List<String> get argumentNames;
 
   /**
+   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
+   * invocation.  Otherwise empty.
+   */
+  @Id(3)
+  List<UnlinkedConst> get arguments;
+
+  /**
    * If [kind] is `field`, the expression of the field initializer.
    * Otherwise `null`.
    */
@@ -1636,6 +1638,14 @@
   List<UnlinkedConst> get annotations;
 
   /**
+   * If this executable's function body is declared using `=>`, the expression
+   * to the right of the `=>`.  May be omitted if neither type inference nor
+   * constant evaluation depends on the function body.
+   */
+  @Id(29)
+  UnlinkedConst get bodyExpr;
+
+  /**
    * Code range of the executable.
    */
   @informative
@@ -2620,16 +2630,8 @@
    * Code range of the variable.
    */
   @informative
-  @Id(14)
-  CodeRange get codeRange;
-
-  /**
-   * If [isConst] is true, and the variable has an initializer, the constant
-   * expression in the initializer.  Note that the presence of this expression
-   * does not mean that it is a valid, check [UnlinkedConst.isInvalid].
-   */
   @Id(5)
-  UnlinkedConst get constExpr;
+  CodeRange get codeRange;
 
   /**
    * Documentation comment for the variable, or `null` if there is no
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 6dc797a..ef54267 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -314,6 +314,21 @@
 typedef UnlinkedUnit GetUnitCallback(String absoluteUri);
 
 /**
+ * Stub implementation of [AnalysisOptions] used during linking.
+ */
+class AnalysisOptionsForLink implements AnalysisOptions {
+  final Linker _linker;
+
+  AnalysisOptionsForLink(this._linker);
+
+  @override
+  bool get strongMode => _linker.strongMode;
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
  * Element representing a class or enum resynthesized from a summary
  * during linking.
  */
@@ -346,6 +361,9 @@
   List<ConstructorElementForLink> get constructors;
 
   @override
+  CompilationUnitElementForLink get enclosingUnit => enclosingElement;
+
+  @override
   List<FieldElementForLink> get fields;
 
   /**
@@ -482,6 +500,9 @@
   }
 
   @override
+  ContextForLink get context => enclosingUnit.context;
+
+  @override
   String get displayName => _unlinkedClass.name;
 
   @override
@@ -574,7 +595,8 @@
       return new InterfaceTypeImpl.elementWithNameAndArgs(this, name, () {
         List<DartType> typeArguments = new List<DartType>(numTypeParameters);
         for (int i = 0; i < numTypeParameters; i++) {
-          typeArguments[i] = getTypeArgument(i);
+          typeArguments[i] =
+              getTypeArgument(i) ?? computeDefaultTypeArgument(i);
         }
         return typeArguments;
       });
@@ -814,6 +836,9 @@
   }
 
   @override
+  ContextForLink get context => library.context;
+
+  @override
   LibraryElementForLink get enclosingElement;
 
   @override
@@ -945,6 +970,55 @@
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 
+  /**
+   * Return the element referred to by the given [index] in
+   * [UnlinkedUnit.references].  If the reference is unresolved,
+   * return [UndefinedElementForLink.instance].
+   */
+  ReferenceableElementForLink resolveRef(int index) {
+    if (_references[index] == null) {
+      UnlinkedReference unlinkedReference =
+          index < _unlinkedUnit.references.length
+              ? _unlinkedUnit.references[index]
+              : null;
+      LinkedReference linkedReference = _linkedUnit.references[index];
+      String name = unlinkedReference == null
+          ? linkedReference.name
+          : unlinkedReference.name;
+      int containingReference = unlinkedReference == null
+          ? linkedReference.containingReference
+          : unlinkedReference.prefixReference;
+      if (containingReference != 0 &&
+          _linkedUnit.references[containingReference].kind !=
+              ReferenceKind.prefix) {
+        if (linkedReference.kind == ReferenceKind.function) {
+          // Local function
+          _references[index] = resolveRef(containingReference)
+                  .getLocalFunction(linkedReference.localIndex) ??
+              UndefinedElementForLink.instance;
+        } else {
+          _references[index] =
+              resolveRef(containingReference).getContainedName(name);
+        }
+      } else if (linkedReference.dependency == 0) {
+        if (name == 'void') {
+          _references[index] = enclosingElement._linker.voidElement;
+        } else if (name == '*bottom*') {
+          _references[index] = enclosingElement._linker.bottomElement;
+        } else if (name == 'dynamic') {
+          _references[index] = enclosingElement._linker.dynamicElement;
+        } else {
+          _references[index] = enclosingElement.getContainedName(name);
+        }
+      } else {
+        LibraryElementForLink dependency =
+            enclosingElement._getDependency(linkedReference.dependency);
+        _references[index] = dependency.getContainedName(name);
+      }
+    }
+    return _references[index];
+  }
+
   @override
   DartType resolveTypeRef(
       EntityRef type, TypeParameterizedElementMixin typeParameterContext,
@@ -968,11 +1042,14 @@
       DartType getTypeArgument(int i) {
         if (i < type.typeArguments.length) {
           return resolveTypeRef(type.typeArguments[i], typeParameterContext);
-        } else {
+        } else if (!instantiateToBoundsAllowed) {
+          // Do not allow buildType to instantiate the bounds; force dynamic.
           return DynamicTypeImpl.instance;
+        } else {
+          return null;
         }
       }
-      ReferenceableElementForLink element = _resolveRef(type.reference);
+      ReferenceableElementForLink element = resolveRef(type.reference);
       return element.buildType(
           getTypeArgument, type.implicitFunctionTypeIndices);
     }
@@ -980,55 +1057,6 @@
 
   @override
   String toString() => enclosingElement.toString();
-
-  /**
-   * Return the element referred to by the given [index] in
-   * [UnlinkedUnit.references].  If the reference is unresolved,
-   * return [UndefinedElementForLink.instance].
-   */
-  ReferenceableElementForLink _resolveRef(int index) {
-    if (_references[index] == null) {
-      UnlinkedReference unlinkedReference =
-          index < _unlinkedUnit.references.length
-              ? _unlinkedUnit.references[index]
-              : null;
-      LinkedReference linkedReference = _linkedUnit.references[index];
-      String name = unlinkedReference == null
-          ? linkedReference.name
-          : unlinkedReference.name;
-      int containingReference = unlinkedReference == null
-          ? linkedReference.containingReference
-          : unlinkedReference.prefixReference;
-      if (containingReference != 0 &&
-          _linkedUnit.references[containingReference].kind !=
-              ReferenceKind.prefix) {
-        if (linkedReference.kind == ReferenceKind.function) {
-          // Local function
-          _references[index] = _resolveRef(containingReference)
-                  .getLocalFunction(linkedReference.localIndex) ??
-              UndefinedElementForLink.instance;
-        } else {
-          _references[index] =
-              _resolveRef(containingReference).getContainedName(name);
-        }
-      } else if (linkedReference.dependency == 0) {
-        if (name == 'void') {
-          _references[index] = enclosingElement._linker.voidElement;
-        } else if (name == '*bottom*') {
-          _references[index] = enclosingElement._linker.bottomElement;
-        } else if (name == 'dynamic') {
-          _references[index] = enclosingElement._linker.dynamicElement;
-        } else {
-          _references[index] = enclosingElement.getContainedName(name);
-        }
-      } else {
-        LibraryElementForLink dependency =
-            enclosingElement._getDependency(linkedReference.dependency);
-        _references[index] = dependency.getContainedName(name);
-      }
-    }
-    return _references[index];
-  }
 }
 
 /**
@@ -1173,8 +1201,10 @@
           kind: ReferenceKind.topLevelPropertyAccessor);
     } else if (element is FieldElementForLink_ClassField) {
       ClassElementForLink_Class enclosingClass = element.enclosingElement;
-      // TODO(paulberry): do we need to set numTypeParameters to nonzero if the
-      // class has type parameters?
+      // Note: even if the class has type parameters, we don't need to set
+      // numTypeParameters because numTypeParameters does not count type
+      // parameters of parent elements (see
+      // [LinkedReference.numTypeParameters]).
       return addRawReference(element.name,
           containingReference: addReference(enclosingClass),
           kind: ReferenceKind.propertyAccessor);
@@ -1408,7 +1438,7 @@
         constructorElement._unlinkedExecutable.redirectedConstructor;
     if (redirectedConstructor != null) {
       return constructorElement.compilationUnit
-          ._resolveRef(redirectedConstructor.reference)
+          .resolveRef(redirectedConstructor.reference)
           .asConstructor;
     } else {
       return null;
@@ -1467,7 +1497,7 @@
         case UnlinkedConstOperation.invokeMethodRef:
           EntityRef ref = unlinkedConst.references[refPtr++];
           ConstVariableNode variable =
-              compilationUnit._resolveRef(ref.reference).asConstVariable;
+              compilationUnit.resolveRef(ref.reference).asConstVariable;
           if (variable != null) {
             dependencies.add(variable);
           }
@@ -1481,7 +1511,7 @@
         case UnlinkedConstOperation.invokeConstructor:
           EntityRef ref = unlinkedConst.references[refPtr++];
           ConstructorElementForLink element =
-              compilationUnit._resolveRef(ref.reference).asConstructor;
+              compilationUnit.resolveRef(ref.reference).asConstructor;
           if (element?._constNode != null) {
             dependencies.add(element._constNode);
           }
@@ -1600,7 +1630,7 @@
     List<ConstNode> dependencies = <ConstNode>[];
     collectDependencies(
         dependencies,
-        variableElement.unlinkedVariable.constExpr,
+        variableElement.unlinkedVariable.initializer?.bodyExpr,
         variableElement.compilationUnit);
     return dependencies;
   }
@@ -1616,6 +1646,9 @@
   ContextForLink(this._linker);
 
   @override
+  AnalysisOptionsForLink get analysisOptions => _linker.analysisOptions;
+
+  @override
   TypeSystem get typeSystem => _linker.typeSystem;
 
   @override
@@ -1771,6 +1804,9 @@
 
   ExecutableElementForLink(this.compilationUnit, this._unlinkedExecutable);
 
+  @override
+  ContextForLink get context => compilationUnit.context;
+
   /**
    * If the executable element had an explicitly declared return type, return
    * it.  Otherwise return `null`.
@@ -1957,7 +1993,7 @@
     library = unit.enclosingElement;
     linker = library._linker;
     typeProvider = linker.typeProvider;
-    unlinkedConst = variableElement.unlinkedVariable.constExpr;
+    unlinkedConst = variableElement.unlinkedVariable.initializer?.bodyExpr;
   }
 
   DartType compute() {
@@ -2146,7 +2182,8 @@
   void _computePrefixExpressionType(String operatorName) {
     DartType operand = stack.removeLast();
     if (operand is InterfaceType) {
-      MethodElement method = operand.lookUpMethod(operatorName, library);
+      MethodElement method =
+          operand.lookUpInheritedMethod(operatorName, library: library);
       if (method != null) {
         DartType type = method.returnType;
         stack.add(type);
@@ -2232,7 +2269,8 @@
     DartType target = stack.removeLast();
     stack.add(() {
       if (target is InterfaceType) {
-        MethodElement method = target.lookUpMethod('[]', library);
+        MethodElement method =
+            target.lookUpInheritedMethod('[]', library: library);
         if (method != null) {
           return method.returnType;
         }
@@ -2246,14 +2284,15 @@
     String propertyName = _getNextString();
     stack.add(() {
       if (target is InterfaceType) {
-        PropertyAccessorElement getter =
-            target.lookUpGetter(propertyName, library);
-        if (getter != null) {
-          return getter.returnType;
-        }
-        MethodElement method = target.lookUpMethod(propertyName, library);
-        if (method != null) {
-          return method.type;
+        ExecutableElement element = target
+            .lookUpInheritedGetterOrMethod(propertyName, library: library);
+        if (element != null) {
+          if (element is PropertyAccessorElement) {
+            return element.returnType;
+          } else {
+            // Method tear-off
+            return element.type;
+          }
         }
       }
       return DynamicTypeImpl.instance;
@@ -2269,7 +2308,7 @@
     strPtr += numNamed;
     EntityRef ref = _getNextRef();
     ConstructorElementForLink element =
-        unit._resolveRef(ref.reference).asConstructor;
+        unit.resolveRef(ref.reference).asConstructor;
     if (element != null) {
       ClassElementForLink_Class enclosingClass = element.enclosingClass;
       stack.add(enclosingClass.buildType((int i) {
@@ -2277,16 +2316,9 @@
         if (i < ref.typeArguments.length) {
           return unit.resolveTypeRef(
               ref.typeArguments[i], variable._typeParameterContext);
+        } else {
+          return null;
         }
-        // In strong mode, type argument defaults to bound (if any).
-        if (linker.strongMode) {
-          TypeParameterElement typeParameter = enclosingClass.typeParameters[i];
-          if (typeParameter.bound != null) {
-            return typeParameter.bound;
-          }
-        }
-        // Otherwise type argument defaults to `dynamic`.
-        return DynamicTypeImpl.instance;
       }, const []));
     } else {
       stack.add(DynamicTypeImpl.instance);
@@ -2305,7 +2337,8 @@
     DartType target = stack.removeLast();
     stack.add(() {
       if (target is InterfaceType) {
-        MethodElement method = target.lookUpMethod(methodName, library);
+        MethodElement method =
+            target.lookUpInheritedMethod(methodName, library: library);
         FunctionType rawType = method?.type;
         FunctionType inferredType = _inferExecutableType(rawType, numNamed,
             numPositional, namedArgNames, namedArgTypeList, positionalArgTypes);
@@ -2324,7 +2357,7 @@
     List<DartType> namedArgTypeList = _popList(numNamed);
     List<DartType> positionalArgTypes = _popList(numPositional);
     EntityRef ref = _getNextRef();
-    ReferenceableElementForLink element = unit._resolveRef(ref.reference);
+    ReferenceableElementForLink element = unit.resolveRef(ref.reference);
     stack.add(() {
       DartType rawType = element.asStaticType;
       if (rawType is FunctionType) {
@@ -2390,7 +2423,7 @@
       // Nor can implicit function types derived from
       // function-typed parameters.
       assert(ref.implicitFunctionTypeIndices.isEmpty);
-      ReferenceableElementForLink element = unit._resolveRef(ref.reference);
+      ReferenceableElementForLink element = unit.resolveRef(ref.reference);
       stack.add(element.asStaticType);
     }
   }
@@ -2425,7 +2458,9 @@
    */
   DartType _getPropertyType(DartType targetType, String propertyName) {
     return targetType is InterfaceType
-        ? targetType.lookUpGetter(propertyName, library)?.returnType
+        ? targetType
+            .lookUpInheritedGetter(propertyName, library: library)
+            ?.returnType
         : DynamicTypeImpl.instance;
   }
 
@@ -2489,7 +2524,8 @@
   void _pushBinaryOperatorType(
       DartType left, TokenType operator, DartType right) {
     if (left is InterfaceType) {
-      MethodElement method = left.lookUpMethod(operator.lexeme, library);
+      MethodElement method =
+          left.lookUpInheritedMethod(operator.lexeme, library: library);
       if (method != null) {
         DartType type = method.returnType;
         type = linker.typeSystem.refineBinaryExpressionType(
@@ -2860,6 +2896,9 @@
   }
 
   @override
+  ContextForLink get context => enclosingElement.context;
+
+  @override
   TypeParameterizedElementMixin get enclosingTypeParameterContext => null;
 
   @override
@@ -2901,7 +2940,7 @@
     if (numTypeParameters != 0) {
       List<DartType> typeArguments = new List<DartType>(numTypeParameters);
       for (int i = 0; i < numTypeParameters; i++) {
-        typeArguments[i] = getTypeArgument(i);
+        typeArguments[i] = getTypeArgument(i) ?? computeDefaultTypeArgument(i);
       }
       return new FunctionTypeImpl.elementWithNameAndArgs(
           this, name, typeArguments, true);
@@ -2912,6 +2951,9 @@
 
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  String toString() => '$enclosingElement.$name';
 }
 
 /**
@@ -3364,6 +3406,7 @@
   SpecialTypeElementForLink _dynamicElement;
   SpecialTypeElementForLink _bottomElement;
   ContextForLink _context;
+  AnalysisOptionsForLink _analysisOptions;
 
   Linker(Map<String, LinkedLibraryBuilder> linkedLibraries, this.getDependency,
       this.getUnit, this.strongMode) {
@@ -3378,6 +3421,12 @@
   }
 
   /**
+   * Get an instance of [AnalysisOptions] for use during linking.
+   */
+  AnalysisOptionsForLink get analysisOptions =>
+      _analysisOptions ??= new AnalysisOptionsForLink(this);
+
+  /**
    * Get the library element for `dart:async`.
    */
   LibraryElementForLink get asyncLibrary =>
@@ -3566,14 +3615,15 @@
     if (_library._linker.strongMode) {
       DartType targetType = _target.asStaticType;
       if (targetType is InterfaceType) {
-        PropertyAccessorElement getter =
-            targetType.lookUpGetter(_name, _library);
-        if (getter != null) {
-          return getter.returnType;
-        }
-        MethodElement method = targetType.lookUpMethod(_name, _library);
-        if (method != null) {
-          return method.type;
+        ExecutableElement element =
+            targetType.lookUpInheritedGetterOrMethod(_name, library: _library);
+        if (element != null) {
+          if (element is PropertyAccessorElement) {
+            return element.returnType;
+          } else {
+            // Method tear-off
+            return element.type;
+          }
         }
       }
       // TODO(paulberry): handle .call on function types and .toString or
@@ -3590,6 +3640,12 @@
   ReferenceableElementForLink getContainedName(String name) {
     return new NonstaticMemberElementForLink(_library, this, name);
   }
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  String toString() => '$_target.(dynamic)$_name';
 }
 
 /**
@@ -4053,7 +4109,7 @@
  * When used as a mixin, implements the default behavior shared by most
  * elements.
  */
-class ReferenceableElementForLink {
+abstract class ReferenceableElementForLink implements Element {
   /**
    * If this element can be used in a constructor invocation context,
    * return the associated constructor (which may be `this` or some
@@ -4085,6 +4141,10 @@
    * Return the type indicated by this element when it is used in a
    * type instantiation context.  If this element can't legally be
    * instantiated as a type, return the dynamic type.
+   *
+   * If the type is parameterized, [getTypeArgument] will be called to retrieve
+   * the type parameters.  It should return `null` for unspecified type
+   * parameters.
    */
   DartType buildType(DartType getTypeArgument(int i),
           List<int> implicitFunctionTypeIndices) =>
@@ -4128,6 +4188,12 @@
       DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
     return type;
   }
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  String toString() => type.toString();
 }
 
 /**
@@ -4186,6 +4252,9 @@
 
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  String toString() => '$enclosingElement.$name';
 }
 
 /**
@@ -4281,7 +4350,7 @@
           // TODO(paulberry): cache these resolved references for
           // later use by evaluate().
           TypeInferenceNode dependency =
-              compilationUnit._resolveRef(ref.reference).asTypeInferenceNode;
+              compilationUnit.resolveRef(ref.reference).asTypeInferenceNode;
           if (dependency != null) {
             dependencies.add(dependency);
           }
@@ -4319,7 +4388,7 @@
     List<TypeInferenceNode> dependencies = <TypeInferenceNode>[];
     collectDependencies(
         dependencies,
-        variableElement.unlinkedVariable.constExpr,
+        variableElement.unlinkedVariable.initializer?.bodyExpr,
         variableElement.compilationUnit);
     return dependencies;
   }
@@ -4491,6 +4560,9 @@
       new UndefinedElementForLink._();
 
   UndefinedElementForLink._();
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
 /**
@@ -4530,7 +4602,8 @@
   final CompilationUnitElementForLink compilationUnit;
 
   VariableElementForLink(this.unlinkedVariable, this.compilationUnit) {
-    if (compilationUnit.isInBuildUnit && unlinkedVariable.constExpr != null) {
+    if (compilationUnit.isInBuildUnit &&
+        unlinkedVariable.initializer?.bodyExpr != null) {
       _constNode = new ConstVariableNode(this);
       if (unlinkedVariable.type == null) {
         _typeInferenceNode = new TypeInferenceNode(this);
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index dfcaa98..d0d4819 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -62,8 +62,8 @@
    * are the first two elements of the element's location (the library URI and
    * the compilation unit URI).
    */
-  final Map<String, Map<String, CompilationUnitElement>> _resynthesizedUnits =
-      <String, Map<String, CompilationUnitElement>>{};
+  final Map<String, Map<String, CompilationUnitElementImpl>>
+      _resynthesizedUnits = <String, Map<String, CompilationUnitElementImpl>>{};
 
   /**
    * Map of top level elements resynthesized from summaries.  The three map
@@ -125,18 +125,45 @@
       }
       return element;
     } else if (components.length == 3 || components.length == 4) {
-      Map<String, Map<String, Element>> libraryMap =
+      String unitUri = components[1];
+      // Prepare elements-in-units in the library.
+      Map<String, Map<String, Element>> unitsInLibrary =
           _resynthesizedElements[libraryUri];
-      if (libraryMap == null) {
-        getLibraryElement(libraryUri);
-        libraryMap = _resynthesizedElements[libraryUri];
-        assert(libraryMap != null);
+      if (unitsInLibrary == null) {
+        unitsInLibrary = new HashMap<String, Map<String, Element>>();
+        _resynthesizedElements[libraryUri] = unitsInLibrary;
       }
-      Map<String, Element> compilationUnitElements = libraryMap[components[1]];
-      Element element;
-      if (compilationUnitElements != null) {
-        element = compilationUnitElements[components[2]];
+      // Prepare elements in the unit.
+      Map<String, Element> elementsInUnit = unitsInLibrary[unitUri];
+      if (elementsInUnit == null) {
+        // Prepare the CompilationUnitElementImpl.
+        Map<String, CompilationUnitElementImpl> libraryMap =
+            _resynthesizedUnits[libraryUri];
+        if (libraryMap == null) {
+          getLibraryElement(libraryUri);
+          libraryMap = _resynthesizedUnits[libraryUri];
+          assert(libraryMap != null);
+        }
+        CompilationUnitElementImpl unitElement = libraryMap[unitUri];
+        // Fill elements in the unit map.
+        if (unitElement != null) {
+          elementsInUnit = new HashMap<String, Element>();
+          void putElement(Element e) {
+            String id =
+                e is PropertyAccessorElementImpl ? e.identifier : e.name;
+            elementsInUnit[id] = e;
+          }
+          unitElement.accessors.forEach(putElement);
+          unitElement.enums.forEach(putElement);
+          unitElement.functions.forEach(putElement);
+          unitElement.functionTypeAliases.forEach(putElement);
+          unitElement.topLevelVariables.forEach(putElement);
+          unitElement.types.forEach(putElement);
+          unitsInLibrary[unitUri] = elementsInUnit;
+        }
       }
+      // Get the element.
+      Element element = elementsInUnit[components[2]];
       if (element != null && components.length == 4) {
         String name = components[3];
         Element parentElement = element;
@@ -193,7 +220,6 @@
           this, serializedLibrary, serializedUnits, librarySource);
       LibraryElement library = libraryResynthesizer.buildLibrary();
       _resynthesizedUnits[uri] = libraryResynthesizer.resynthesizedUnits;
-      _resynthesizedElements[uri] = libraryResynthesizer.resynthesizedElements;
       return library;
     });
   }
@@ -273,6 +299,7 @@
  */
 class _ConstExprBuilder {
   final _UnitResynthesizer resynthesizer;
+  final ElementImpl context;
   final UnlinkedConst uc;
 
   int intPtr = 0;
@@ -281,7 +308,7 @@
   int refPtr = 0;
   final List<Expression> stack = <Expression>[];
 
-  _ConstExprBuilder(this.resynthesizer, this.uc);
+  _ConstExprBuilder(this.resynthesizer, this.context, this.uc);
 
   Expression build() {
     if (!uc.isValidConst) {
@@ -592,8 +619,8 @@
         throw new StateError('Unsupported element for invokeConstructor '
             '${info.element?.runtimeType}');
       }
-      InterfaceType definingType =
-          resynthesizer._createConstructorDefiningType(info, ref.typeArguments);
+      InterfaceType definingType = resynthesizer._createConstructorDefiningType(
+          context?.typeParameterContext, info, ref.typeArguments);
       constructorElement =
           resynthesizer._createConstructorElement(definingType, info);
       typeNode = _buildTypeAst(definingType);
@@ -1025,16 +1052,8 @@
    * Map of compilation unit elements that have been resynthesized so far.  The
    * key is the URI of the compilation unit.
    */
-  final Map<String, CompilationUnitElement> resynthesizedUnits =
-      <String, CompilationUnitElement>{};
-
-  /**
-   * Map of top level elements that have been resynthesized so far.  The first
-   * key is the URI of the compilation unit; the second is the name of the top
-   * level element.
-   */
-  final Map<String, Map<String, Element>> resynthesizedElements =
-      <String, Map<String, Element>>{};
+  final Map<String, CompilationUnitElementImpl> resynthesizedUnits =
+      <String, CompilationUnitElementImpl>{};
 
   /**
    * Types with implicit type arguments, which are the same as type parameter
@@ -1054,49 +1073,13 @@
    */
   NamespaceCombinator buildCombinator(UnlinkedCombinator serializedCombinator) {
     if (serializedCombinator.shows.isNotEmpty) {
-      ShowElementCombinatorImpl combinator = new ShowElementCombinatorImpl();
-      // Note: we call toList() so that we don't retain a reference to the
-      // deserialized data structure.
-      combinator.shownNames = serializedCombinator.shows.toList();
-      combinator.offset = serializedCombinator.offset;
-      combinator.end = serializedCombinator.end;
-      return combinator;
+      return new ShowElementCombinatorImpl.forSerialized(serializedCombinator);
     } else {
-      HideElementCombinatorImpl combinator = new HideElementCombinatorImpl();
-      // Note: we call toList() so that we don't retain a reference to the
-      // deserialized data structure.
-      combinator.hiddenNames = serializedCombinator.hides.toList();
-      return combinator;
+      return new HideElementCombinatorImpl.forSerialized(serializedCombinator);
     }
   }
 
   /**
-   * Resynthesize an [ExportElement],
-   */
-  ExportElement buildExport(
-      _UnitResynthesizer definingUnitResynthesizer,
-      UnlinkedExportPublic serializedExportPublic,
-      UnlinkedExportNonPublic serializedExportNonPublic) {
-    ExportElementImpl exportElement =
-        new ExportElementImpl(serializedExportNonPublic.offset);
-    String exportedLibraryUri = summaryResynthesizer.sourceFactory
-        .resolveUri(librarySource, serializedExportPublic.uri)
-        .uri
-        .toString();
-    exportElement.exportedLibrary = new LibraryElementHandle(
-        summaryResynthesizer,
-        new ElementLocationImpl.con3(<String>[exportedLibraryUri]));
-    exportElement.uri = serializedExportPublic.uri;
-    exportElement.combinators =
-        serializedExportPublic.combinators.map(buildCombinator).toList();
-    exportElement.uriOffset = serializedExportNonPublic.uriOffset;
-    exportElement.uriEnd = serializedExportNonPublic.uriEnd;
-    definingUnitResynthesizer.buildAnnotations(
-        exportElement, serializedExportNonPublic.annotations);
-    return exportElement;
-  }
-
-  /**
    * Build an [ElementHandle] referring to the entity referred to by the given
    * [exportName].
    */
@@ -1153,68 +1136,22 @@
   }
 
   /**
-   * Resynthesize an [ImportElement].
-   */
-  ImportElement buildImport(
-      _UnitResynthesizer definingUnitResynthesizer,
-      UnlinkedImport serializedImport,
-      int dependency,
-      LibraryElement libraryBeingResynthesized) {
-    bool isSynthetic = serializedImport.isImplicit;
-    ImportElementImpl importElement =
-        new ImportElementImpl(isSynthetic ? -1 : serializedImport.offset);
-    if (dependency == 0) {
-      importElement.importedLibrary = libraryBeingResynthesized;
-    } else {
-      String absoluteUri = summaryResynthesizer.sourceFactory
-          .resolveUri(librarySource, linkedLibrary.dependencies[dependency].uri)
-          .uri
-          .toString();
-      importElement.importedLibrary = new LibraryElementHandle(
-          summaryResynthesizer,
-          new ElementLocationImpl.con3(<String>[absoluteUri]));
-    }
-    if (isSynthetic) {
-      importElement.synthetic = true;
-    } else {
-      importElement.uri = serializedImport.uri;
-      importElement.uriOffset = serializedImport.uriOffset;
-      importElement.uriEnd = serializedImport.uriEnd;
-      importElement.deferred = serializedImport.isDeferred;
-      definingUnitResynthesizer.buildAnnotations(
-          importElement, serializedImport.annotations);
-    }
-    importElement.prefixOffset = serializedImport.prefixOffset;
-    if (serializedImport.prefixReference != 0) {
-      UnlinkedReference serializedPrefix =
-          unlinkedUnits[0].references[serializedImport.prefixReference];
-      importElement.prefix = new PrefixElementImpl(
-          serializedPrefix.name, serializedImport.prefixOffset);
-    }
-    importElement.combinators =
-        serializedImport.combinators.map(buildCombinator).toList();
-    return importElement;
-  }
-
-  /**
    * Main entry point.  Resynthesize the [LibraryElement] and return it.
    */
   LibraryElement buildLibrary() {
     // Create LibraryElementImpl.
     bool hasName = unlinkedUnits[0].libraryName.isNotEmpty;
-    library = new LibraryElementImpl(
+    library = new LibraryElementImpl.forSerialized(
         summaryResynthesizer.context,
         unlinkedUnits[0].libraryName,
         hasName ? unlinkedUnits[0].libraryNameOffset : -1,
-        unlinkedUnits[0].libraryNameLength);
+        unlinkedUnits[0].libraryNameLength,
+        new _LibraryResynthesizerContext(this),
+        unlinkedUnits[0]);
     // Create the defining unit.
     _UnitResynthesizer definingUnitResynthesizer =
         createUnitResynthesizer(0, librarySource, null);
     CompilationUnitElementImpl definingUnit = definingUnitResynthesizer.unit;
-    definingUnitResynthesizer.buildDocumentation(
-        library, unlinkedUnits[0].libraryDocumentationComment);
-    definingUnitResynthesizer.buildAnnotations(
-        library, unlinkedUnits[0].libraryAnnotations);
     library.definingCompilationUnit = definingUnit;
     definingUnit.source = librarySource;
     definingUnit.librarySource = librarySource;
@@ -1232,33 +1169,11 @@
       partResynthesizers.add(partResynthesizer);
     }
     library.parts = partResynthesizers.map((r) => r.unit).toList();
-    // Create imports.
-    List<ImportElement> imports = <ImportElement>[];
-    for (int i = 0; i < unlinkedDefiningUnit.imports.length; i++) {
-      imports.add(buildImport(
-          definingUnitResynthesizer,
-          unlinkedDefiningUnit.imports[i],
-          linkedLibrary.importDependencies[i],
-          library));
-    }
-    library.imports = imports;
-    // Create exports.
-    List<ExportElement> exports = <ExportElement>[];
-    assert(unlinkedDefiningUnit.exports.length ==
-        unlinkedDefiningUnit.publicNamespace.exports.length);
-    for (int i = 0; i < unlinkedDefiningUnit.exports.length; i++) {
-      exports.add(buildExport(
-          definingUnitResynthesizer,
-          unlinkedDefiningUnit.publicNamespace.exports[i],
-          unlinkedDefiningUnit.exports[i]));
-    }
-    library.exports = exports;
     // Populate units.
     populateUnit(definingUnitResynthesizer);
     for (_UnitResynthesizer partResynthesizer in partResynthesizers) {
       populateUnit(partResynthesizer);
     }
-    BuildLibraryElementUtils.patchTopLevelAccessors(library);
     // Update delayed Object class references.
     if (isCoreLibrary) {
       ClassElement objectElement = library.getType('Object');
@@ -1267,18 +1182,6 @@
         classElement.supertype = objectElement.type;
       }
     }
-    // Compute namespaces.
-    library.publicNamespace =
-        new NamespaceBuilder().createPublicNamespaceForLibrary(library);
-    library.exportNamespace = buildExportNamespace(
-        library.publicNamespace, linkedLibrary.exportNames);
-    // Find the entry point.  Note: we can't use element.isEntryPoint because
-    // that will trigger resynthesis of exported libraries.
-    Element entryPoint =
-        library.exportNamespace.get(FunctionElement.MAIN_FUNCTION_NAME);
-    if (entryPoint is FunctionElement) {
-      library.entryPoint = entryPoint;
-    }
     // Create the synthetic element for `loadLibrary`.
     // Until the client received dart:core and dart:async, we cannot do this,
     // because the TypeProvider is not fully initialized. So, it is up to the
@@ -1362,11 +1265,71 @@
    * contained in it.
    */
   void populateUnit(_UnitResynthesizer unitResynthesized) {
-    // TODO(scheglov)
     unitResynthesized.populateUnit();
     String absoluteUri = unitResynthesized.unit.source.uri.toString();
     resynthesizedUnits[absoluteUri] = unitResynthesized.unit;
-    resynthesizedElements[absoluteUri] = unitResynthesized.elementMap;
+  }
+}
+
+/**
+ * Implementation of [LibraryResynthesizerContext] for [_LibraryResynthesizer].
+ */
+class _LibraryResynthesizerContext implements LibraryResynthesizerContext {
+  final _LibraryResynthesizer resynthesizer;
+
+  _LibraryResynthesizerContext(this.resynthesizer);
+
+  @override
+  LinkedLibrary get linkedLibrary => resynthesizer.linkedLibrary;
+
+  @override
+  LibraryElement buildExportedLibrary(String relativeUri) {
+    return _getLibraryByRelativeUri(relativeUri);
+  }
+
+  @override
+  Namespace buildExportNamespace() {
+    LibraryElementImpl library = resynthesizer.library;
+    return resynthesizer.buildExportNamespace(
+        library.publicNamespace, resynthesizer.linkedLibrary.exportNames);
+  }
+
+  @override
+  LibraryElement buildImportedLibrary(int dependency) {
+    String depUri = resynthesizer.linkedLibrary.dependencies[dependency].uri;
+    return _getLibraryByRelativeUri(depUri);
+  }
+
+  @override
+  Namespace buildPublicNamespace() {
+    LibraryElementImpl library = resynthesizer.library;
+    return new NamespaceBuilder().createPublicNamespaceForLibrary(library);
+  }
+
+  @override
+  FunctionElement findEntryPoint() {
+    LibraryElementImpl library = resynthesizer.library;
+    Element entryPoint =
+        library.exportNamespace.get(FunctionElement.MAIN_FUNCTION_NAME);
+    if (entryPoint is FunctionElement) {
+      return entryPoint;
+    }
+    return null;
+  }
+
+  @override
+  void patchTopLevelAccessors() {
+    LibraryElementImpl library = resynthesizer.library;
+    BuildLibraryElementUtils.patchTopLevelAccessors(library);
+  }
+
+  LibraryElementHandle _getLibraryByRelativeUri(String depUri) {
+    String absoluteUri = resynthesizer.summaryResynthesizer.sourceFactory
+        .resolveUri(resynthesizer.librarySource, depUri)
+        .uri
+        .toString();
+    return new LibraryElementHandle(resynthesizer.summaryResynthesizer,
+        new ElementLocationImpl.con3(<String>[absoluteUri]));
   }
 }
 
@@ -1558,13 +1521,28 @@
   _ResynthesizerContext(this._unitResynthesizer);
 
   @override
-  ElementAnnotationImpl buildAnnotation(UnlinkedConst uc) {
-    return _unitResynthesizer.buildAnnotation(uc);
+  ElementAnnotationImpl buildAnnotation(ElementImpl context, UnlinkedConst uc) {
+    return _unitResynthesizer.buildAnnotation(context, uc);
   }
 
   @override
-  Expression buildExpression(UnlinkedConst uc) {
-    return _unitResynthesizer._buildConstExpression(uc);
+  Expression buildExpression(ElementImpl context, UnlinkedConst uc) {
+    return _unitResynthesizer._buildConstExpression(context, uc);
+  }
+
+  @override
+  UnitExplicitTopLevelAccessors buildTopLevelAccessors() {
+    return _unitResynthesizer.buildUnitExplicitTopLevelAccessors();
+  }
+
+  @override
+  List<FunctionElementImpl> buildTopLevelFunctions() {
+    return _unitResynthesizer.buildTopLevelFunctions();
+  }
+
+  @override
+  UnitExplicitTopLevelVariables buildTopLevelVariables() {
+    return _unitResynthesizer.buildUnitExplicitTopLevelVariables();
   }
 
   @override
@@ -1611,12 +1589,6 @@
   final ElementHolder unitHolder = new ElementHolder();
 
   /**
-   * Map of top-level elements that have been resynthesized so far.  The key is
-   * the name of the top level element.
-   */
-  Map<String, Element> elementMap = <String, Element>{};
-
-  /**
    * Map from slot id to the corresponding [EntityRef] object for linked types
    * (i.e. propagated and inferred types).
    */
@@ -1709,9 +1681,9 @@
   /**
    * Build [ElementAnnotationImpl] for the given [UnlinkedConst].
    */
-  ElementAnnotationImpl buildAnnotation(UnlinkedConst uc) {
+  ElementAnnotationImpl buildAnnotation(ElementImpl context, UnlinkedConst uc) {
     ElementAnnotationImpl elementAnnotation = new ElementAnnotationImpl(unit);
-    Expression constExpr = _buildConstExpression(uc);
+    Expression constExpr = _buildConstExpression(context, uc);
     if (constExpr is Identifier) {
       elementAnnotation.element = constExpr.staticElement;
       elementAnnotation.annotationAst = AstFactory.annotation(constExpr);
@@ -1740,7 +1712,9 @@
   void buildAnnotations(
       ElementImpl element, List<UnlinkedConst> serializedAnnotations) {
     if (serializedAnnotations.isNotEmpty) {
-      element.metadata = serializedAnnotations.map(buildAnnotation).toList();
+      element.metadata = serializedAnnotations
+          .map((a) => buildAnnotation(element, a))
+          .toList();
     }
   }
 
@@ -1770,7 +1744,7 @@
     ElementHolder memberHolder = new ElementHolder();
     fields = <String, FieldElementImpl>{};
     for (UnlinkedVariable serializedVariable in serializedClass.fields) {
-      buildVariable(serializedVariable, memberHolder);
+      buildVariable(classElement, serializedVariable, memberHolder);
     }
     bool constructorFound = false;
     constructors = <String, ConstructorElementImpl>{};
@@ -1881,7 +1855,7 @@
 
   /**
    * Resynthesize a [ConstructorElement] and place it in the given [holder].
-   * [classType] is the type of the class for which this element is a
+   * [classElement] is the element of the class for which this element is a
    * constructor.
    */
   void buildConstructor(UnlinkedExecutable serializedExecutable,
@@ -1903,7 +1877,7 @@
     buildExecutableCommonParts(currentConstructor, serializedExecutable);
     currentConstructor.constantInitializers = serializedExecutable
         .constantInitializers
-        .map(buildConstructorInitializer)
+        .map((i) => buildConstructorInitializer(currentConstructor, i))
         .toList();
     if (serializedExecutable.isRedirectedConstructor) {
       if (serializedExecutable.isFactory) {
@@ -1912,7 +1886,8 @@
         _ReferenceInfo info = getReferenceInfo(redirectedConstructor.reference);
         List<EntityRef> typeArguments = redirectedConstructor.typeArguments;
         currentConstructor.redirectedConstructor = _createConstructorElement(
-            _createConstructorDefiningType(info, typeArguments), info);
+            _createConstructorDefiningType(classElement, info, typeArguments),
+            info);
       } else {
         List<String> locationComponents = unit.location.components.toList();
         locationComponents.add(classElement.name);
@@ -1933,6 +1908,7 @@
    * [currentConstructor], which is used to resolve constructor parameter names.
    */
   ConstructorInitializer buildConstructorInitializer(
+      ConstructorElementImpl enclosingConstructor,
       UnlinkedConstructorInitializer serialized) {
     UnlinkedConstructorInitializerKind kind = serialized.kind;
     String name = serialized.name;
@@ -1941,7 +1917,8 @@
       int numArguments = serialized.arguments.length;
       int numNames = serialized.argumentNames.length;
       for (int i = 0; i < numArguments; i++) {
-        Expression expression = _buildConstExpression(serialized.arguments[i]);
+        Expression expression = _buildConstExpression(
+            enclosingConstructor, serialized.arguments[i]);
         int nameIndex = numNames + i - numArguments;
         if (nameIndex >= 0) {
           expression = AstFactory.namedExpression2(
@@ -1952,8 +1929,8 @@
     }
     switch (kind) {
       case UnlinkedConstructorInitializerKind.field:
-        return AstFactory.constructorFieldInitializer(
-            false, name, _buildConstExpression(serialized.expression));
+        return AstFactory.constructorFieldInitializer(false, name,
+            _buildConstExpression(enclosingConstructor, serialized.expression));
       case UnlinkedConstructorInitializerKind.superInvocation:
         return AstFactory.superConstructorInvocation2(
             name.isNotEmpty ? name : null, arguments);
@@ -2059,11 +2036,7 @@
     switch (kind) {
       case UnlinkedExecutableKind.functionOrMethod:
         if (isTopLevel) {
-          FunctionElementImpl executableElement =
-              new FunctionElementImpl.forSerialized(
-                  serializedExecutable, enclosingElement);
-          buildExecutableCommonParts(executableElement, serializedExecutable);
-          holder.addFunction(executableElement);
+          // Created lazily.
         } else {
           MethodElementImpl executableElement =
               new MethodElementImpl.forSerialized(
@@ -2074,6 +2047,11 @@
         break;
       case UnlinkedExecutableKind.getter:
       case UnlinkedExecutableKind.setter:
+        // Top-level accessors are created lazily.
+        if (isTopLevel) {
+          break;
+        }
+        // Class member accessors.
         PropertyAccessorElementImpl executableElement =
             new PropertyAccessorElementImpl.forSerialized(
                 serializedExecutable, enclosingElement);
@@ -2085,19 +2063,13 @@
           type = executableElement.parameters[0].type;
         }
         holder.addAccessor(executableElement);
-        PropertyInducingElementImpl implicitVariable;
-        if (isTopLevel) {
-          implicitVariable = buildImplicitTopLevelVariable(name, kind, holder);
-        } else {
-          FieldElementImpl field = buildImplicitField(name, type, kind, holder);
-          field.static = serializedExecutable.isStatic;
-          implicitVariable = field;
-        }
-        executableElement.variable = implicitVariable;
+        FieldElementImpl field = buildImplicitField(name, type, kind, holder);
+        field.static = serializedExecutable.isStatic;
+        executableElement.variable = field;
         if (kind == UnlinkedExecutableKind.getter) {
-          implicitVariable.getter = executableElement;
+          field.getter = executableElement;
         } else {
-          implicitVariable.setter = executableElement;
+          field.setter = executableElement;
         }
         break;
       default:
@@ -2116,9 +2088,19 @@
       UnlinkedExecutable serializedExecutable) {
     executableElement.typeParameters =
         buildTypeParameters(serializedExecutable.typeParameters);
-    executableElement.parameters = serializedExecutable.parameters
-        .map((p) => buildParameter(p, executableElement))
-        .toList();
+    {
+      List<UnlinkedParam> unlinkedParameters = serializedExecutable.parameters;
+      int length = unlinkedParameters.length;
+      if (length != 0) {
+        List<ParameterElementImpl> parameters =
+            new List<ParameterElementImpl>(length);
+        for (int i = 0; i < length; i++) {
+          parameters[i] =
+              buildParameter(unlinkedParameters[i], executableElement);
+        }
+        executableElement.parameters = parameters;
+      }
+    }
     if (serializedExecutable.kind == UnlinkedExecutableKind.constructor) {
       // Caller handles setting the return type.
       assert(serializedExecutable.returnType == null);
@@ -2134,14 +2116,45 @@
     }
     executableElement.type = new FunctionTypeImpl.elementWithNameAndArgs(
         executableElement, null, getCurrentTypeArguments(skipLevels: 1), false);
-    executableElement.functions = serializedExecutable.localFunctions
-        .map((f) => buildLocalFunction(f, executableElement))
-        .toList();
-    executableElement.labels =
-        serializedExecutable.localLabels.map(buildLocalLabel).toList();
-    executableElement.localVariables = serializedExecutable.localVariables
-        .map((v) => buildLocalVariable(v, executableElement))
-        .toList();
+    {
+      List<UnlinkedExecutable> unlinkedFunctions =
+          serializedExecutable.localFunctions;
+      int length = unlinkedFunctions.length;
+      if (length != 0) {
+        List<FunctionElementImpl> localFunctions =
+            new List<FunctionElementImpl>(length);
+        for (int i = 0; i < length; i++) {
+          localFunctions[i] =
+              buildLocalFunction(unlinkedFunctions[i], executableElement);
+        }
+        executableElement.functions = localFunctions;
+      }
+    }
+    {
+      List<UnlinkedLabel> unlinkedLabels = serializedExecutable.localLabels;
+      int length = unlinkedLabels.length;
+      if (length != 0) {
+        List<LabelElementImpl> localLabels = new List<LabelElementImpl>(length);
+        for (int i = 0; i < length; i++) {
+          localLabels[i] = buildLocalLabel(unlinkedLabels[i]);
+        }
+        executableElement.labels = localLabels;
+      }
+    }
+    {
+      List<UnlinkedVariable> unlinkedVariables =
+          serializedExecutable.localVariables;
+      int length = unlinkedVariables.length;
+      if (length != 0) {
+        List<LocalVariableElementImpl> localVariables =
+            new List<LocalVariableElementImpl>(length);
+        for (int i = 0; i < length; i++) {
+          localVariables[i] =
+              buildLocalVariable(unlinkedVariables[i], executableElement);
+        }
+        executableElement.localVariables = localVariables;
+      }
+    }
     currentTypeParameters.removeLast();
   }
 
@@ -2154,33 +2167,12 @@
     String name = element.name;
     DartType type = element.type;
     PropertyAccessorElementImpl getter =
-        new PropertyAccessorElementImpl(name, element.nameOffset);
-    getter.getter = true;
-    getter.static = element.isStatic;
-    getter.synthetic = true;
-    getter.returnType = type;
-    getter.type = new FunctionTypeImpl(getter);
-    getter.variable = element;
-    getter.hasImplicitReturnType = element.hasImplicitType;
-    holder.addAccessor(getter);
-    element.getter = getter;
+        buildImplicitGetter(element, name, type);
+    holder?.addAccessor(getter);
     if (!(element.isConst || element.isFinal)) {
       PropertyAccessorElementImpl setter =
-          new PropertyAccessorElementImpl(name, element.nameOffset);
-      setter.setter = true;
-      setter.static = element.isStatic;
-      setter.synthetic = true;
-      setter.parameters = <ParameterElement>[
-        new ParameterElementImpl('_$name', element.nameOffset)
-          ..synthetic = true
-          ..type = type
-          ..parameterKind = ParameterKind.REQUIRED
-      ];
-      setter.returnType = VoidTypeImpl.instance;
-      setter.type = new FunctionTypeImpl(setter);
-      setter.variable = element;
-      holder.addAccessor(setter);
-      element.setter = setter;
+          buildImplicitSetter(element, name, type);
+      holder?.addAccessor(setter);
     }
   }
 
@@ -2206,23 +2198,48 @@
   }
 
   /**
-   * Build the implicit top level variable associated with a getter or setter,
-   * and place it in [holder].
+   * Build an implicit getter for the given [property] and bind it to the
+   * [property] and to its enclosing element.
    */
-  PropertyInducingElementImpl buildImplicitTopLevelVariable(
-      String name, UnlinkedExecutableKind kind, ElementHolder holder) {
-    TopLevelVariableElementImpl variable = holder.getTopLevelVariable(name);
-    if (variable == null) {
-      variable = new TopLevelVariableElementImpl(name, -1);
-      variable.synthetic = true;
-      variable.final2 = kind == UnlinkedExecutableKind.getter;
-      holder.addTopLevelVariable(variable);
-      return variable;
-    } else {
-      // TODO(paulberry): what if the getter and setter have a type mismatch?
-      variable.final2 = false;
-      return variable;
-    }
+  PropertyAccessorElementImpl buildImplicitGetter(
+      PropertyInducingElementImpl property, String name, DartType type) {
+    PropertyAccessorElementImpl getter =
+        new PropertyAccessorElementImpl(name, property.nameOffset);
+    getter.enclosingElement = property.enclosingElement;
+    getter.getter = true;
+    getter.static = property.isStatic;
+    getter.synthetic = true;
+    getter.returnType = type;
+    getter.type = new FunctionTypeImpl(getter);
+    getter.variable = property;
+    getter.hasImplicitReturnType = property.hasImplicitType;
+    property.getter = getter;
+    return getter;
+  }
+
+  /**
+   * Build an implicit setter for the given [property] and bind it to the
+   * [property] and to its enclosing element.
+   */
+  PropertyAccessorElementImpl buildImplicitSetter(
+      PropertyInducingElementImpl property, String name, DartType type) {
+    PropertyAccessorElementImpl setter =
+        new PropertyAccessorElementImpl(name, property.nameOffset);
+    setter.enclosingElement = property.enclosingElement;
+    setter.setter = true;
+    setter.static = property.isStatic;
+    setter.synthetic = true;
+    setter.parameters = <ParameterElement>[
+      new ParameterElementImpl('_$name', property.nameOffset)
+        ..synthetic = true
+        ..type = type
+        ..parameterKind = ParameterKind.REQUIRED
+    ];
+    setter.returnType = VoidTypeImpl.instance;
+    setter.type = new FunctionTypeImpl(setter);
+    setter.variable = property;
+    property.setter = setter;
+    return setter;
   }
 
   /**
@@ -2276,13 +2293,14 @@
   LocalVariableElement buildLocalVariable(UnlinkedVariable serializedVariable,
       ExecutableElementImpl enclosingExecutable) {
     LocalVariableElementImpl element;
-    if (serializedVariable.constExpr != null && serializedVariable.isConst) {
+    if (serializedVariable.initializer?.bodyExpr != null &&
+        serializedVariable.isConst) {
       ConstLocalVariableElementImpl constElement =
           new ConstLocalVariableElementImpl.forSerialized(
               serializedVariable, enclosingExecutable);
       element = constElement;
-      constElement.constantInitializer =
-          _buildConstExpression(serializedVariable.constExpr);
+      constElement.constantInitializer = _buildConstExpression(
+          enclosingExecutable, serializedVariable.initializer.bodyExpr);
     } else {
       element = new LocalVariableElementImpl.forSerialized(
           serializedVariable, enclosingExecutable);
@@ -2291,8 +2309,7 @@
       element.setVisibleRange(
           serializedVariable.visibleOffset, serializedVariable.visibleLength);
     }
-    buildVariableCommonParts(element, serializedVariable,
-        isLazilyResynthesized: true);
+    buildVariableCommonParts(element, serializedVariable);
     return element;
   }
 
@@ -2316,8 +2333,8 @@
                 serializedParameter.name, nameOffset);
         initializingParameter = defaultParameter;
         if (serializedParameter.defaultValue != null) {
-          defaultParameter.constantInitializer =
-              _buildConstExpression(serializedParameter.defaultValue);
+          defaultParameter.constantInitializer = _buildConstExpression(
+              enclosingElement, serializedParameter.defaultValue);
           defaultParameter.defaultValueCode =
               serializedParameter.defaultValueCode;
         }
@@ -2412,6 +2429,20 @@
         _currentTypeParameterizedElement);
   }
 
+  List<FunctionElementImpl> buildTopLevelFunctions() {
+    List<FunctionElementImpl> functions = <FunctionElementImpl>[];
+    List<UnlinkedExecutable> executables = unlinkedUnit.executables;
+    for (UnlinkedExecutable unlinkedExecutable in executables) {
+      if (unlinkedExecutable.kind == UnlinkedExecutableKind.functionOrMethod) {
+        FunctionElementImpl function =
+            new FunctionElementImpl.forSerialized(unlinkedExecutable, unit);
+        buildExecutableCommonParts(function, unlinkedExecutable);
+        functions.add(function);
+      }
+    }
+    return functions;
+  }
+
   /**
    * Build a [DartType] object based on a [EntityRef].  This [DartType]
    * may refer to elements in other libraries than the library being
@@ -2508,49 +2539,128 @@
    */
   List<TypeParameterElement> buildTypeParameters(
       List<UnlinkedTypeParam> serializedTypeParameters) {
-    List<TypeParameterElement> typeParameters =
-        serializedTypeParameters.map(buildTypeParameter).toList();
-    currentTypeParameters.add(typeParameters);
-    for (int i = 0; i < serializedTypeParameters.length; i++) {
-      finishTypeParameter(serializedTypeParameters[i], typeParameters[i]);
+    int length = serializedTypeParameters.length;
+    if (length != 0) {
+      List<TypeParameterElement> typeParameters =
+          new List<TypeParameterElement>(length);
+      for (int i = 0; i < length; i++) {
+        typeParameters[i] = buildTypeParameter(serializedTypeParameters[i]);
+      }
+      currentTypeParameters.add(typeParameters);
+      for (int i = 0; i < length; i++) {
+        finishTypeParameter(serializedTypeParameters[i], typeParameters[i]);
+      }
+      return typeParameters;
+    } else {
+      List<TypeParameterElement> typeParameters =
+          const <TypeParameterElement>[];
+      currentTypeParameters.add(typeParameters);
+      return typeParameters;
     }
-    return typeParameters;
+  }
+
+  UnitExplicitTopLevelAccessors buildUnitExplicitTopLevelAccessors() {
+    HashMap<String, TopLevelVariableElementImpl> implicitVariables =
+        new HashMap<String, TopLevelVariableElementImpl>();
+    UnitExplicitTopLevelAccessors accessorsData =
+        new UnitExplicitTopLevelAccessors();
+    for (UnlinkedExecutable unlinkedExecutable in unlinkedUnit.executables) {
+      UnlinkedExecutableKind kind = unlinkedExecutable.kind;
+      if (kind == UnlinkedExecutableKind.getter ||
+          kind == UnlinkedExecutableKind.setter) {
+        // name
+        String name = unlinkedExecutable.name;
+        if (kind == UnlinkedExecutableKind.setter) {
+          assert(name.endsWith('='));
+          name = name.substring(0, name.length - 1);
+        }
+        // create
+        PropertyAccessorElementImpl accessor =
+            new PropertyAccessorElementImpl.forSerialized(
+                unlinkedExecutable, unit);
+        accessorsData.accessors.add(accessor);
+        buildExecutableCommonParts(accessor, unlinkedExecutable);
+        // implicit variable
+        TopLevelVariableElementImpl variable = implicitVariables[name];
+        if (variable == null) {
+          variable = new TopLevelVariableElementImpl(name, -1);
+          variable.enclosingElement = unit;
+          implicitVariables[name] = variable;
+          accessorsData.implicitVariables.add(variable);
+          variable.synthetic = true;
+          variable.final2 = kind == UnlinkedExecutableKind.getter;
+        } else {
+          variable.final2 = false;
+        }
+        accessor.variable = variable;
+        // link
+        if (kind == UnlinkedExecutableKind.getter) {
+          variable.getter = accessor;
+        } else {
+          variable.setter = accessor;
+        }
+      }
+    }
+    return accessorsData;
+  }
+
+  UnitExplicitTopLevelVariables buildUnitExplicitTopLevelVariables() {
+    List<UnlinkedVariable> unlinkedVariables = unlinkedUnit.variables;
+    int numberOfVariables = unlinkedVariables.length;
+    UnitExplicitTopLevelVariables variablesData =
+        new UnitExplicitTopLevelVariables(numberOfVariables);
+    for (int i = 0; i < numberOfVariables; i++) {
+      UnlinkedVariable unlinkedVariable = unlinkedVariables[i];
+      TopLevelVariableElementImpl element;
+      if (unlinkedVariable.initializer?.bodyExpr != null &&
+          unlinkedVariable.isConst) {
+        ConstTopLevelVariableElementImpl constElement =
+            new ConstTopLevelVariableElementImpl.forSerialized(
+                unlinkedVariable, unit);
+        element = constElement;
+        constElement.constantInitializer =
+            _buildConstExpression(null, unlinkedVariable.initializer.bodyExpr);
+      } else {
+        element = new TopLevelVariableElementImpl.forSerialized(
+            unlinkedVariable, unit);
+      }
+      buildPropertyIntroducingElementCommonParts(element, unlinkedVariable);
+      variablesData.variables[i] = element;
+      // implicit accessors
+      String name = element.name;
+      DartType type = element.type;
+      variablesData.implicitAccessors
+          .add(buildImplicitGetter(element, name, type));
+      if (!(element.isConst || element.isFinal)) {
+        variablesData.implicitAccessors
+            .add(buildImplicitSetter(element, name, type));
+      }
+    }
+    return variablesData;
   }
 
   /**
    * Resynthesize a [TopLevelVariableElement] or [FieldElement].
    */
-  void buildVariable(UnlinkedVariable serializedVariable,
+  void buildVariable(
+      ClassElementImpl enclosingClass, UnlinkedVariable serializedVariable,
       [ElementHolder holder]) {
     if (holder == null) {
-      TopLevelVariableElementImpl element;
-      if (serializedVariable.constExpr != null && serializedVariable.isConst) {
-        ConstTopLevelVariableElementImpl constElement =
-            new ConstTopLevelVariableElementImpl(
-                serializedVariable.name, serializedVariable.nameOffset);
-        element = constElement;
-        constElement.constantInitializer =
-            _buildConstExpression(serializedVariable.constExpr);
-      } else {
-        element = new TopLevelVariableElementImpl(
-            serializedVariable.name, serializedVariable.nameOffset);
-      }
-      buildPropertyIntroducingElementCommonParts(element, serializedVariable);
-      unitHolder.addTopLevelVariable(element);
-      buildImplicitAccessors(element, unitHolder);
+      throw new UnimplementedError('Must be lazy');
     } else {
       FieldElementImpl element;
-      if (serializedVariable.constExpr != null &&
+      if (serializedVariable.initializer?.bodyExpr != null &&
           (serializedVariable.isConst ||
               serializedVariable.isFinal && !serializedVariable.isStatic)) {
-        ConstFieldElementImpl constElement = new ConstFieldElementImpl(
-            serializedVariable.name, serializedVariable.nameOffset);
+        ConstFieldElementImpl constElement =
+            new ConstFieldElementImpl.forSerialized(
+                serializedVariable, enclosingClass);
         element = constElement;
-        constElement.constantInitializer =
-            _buildConstExpression(serializedVariable.constExpr);
+        constElement.constantInitializer = _buildConstExpression(
+            enclosingClass, serializedVariable.initializer.bodyExpr);
       } else {
-        element = new FieldElementImpl(
-            serializedVariable.name, serializedVariable.nameOffset);
+        element = new FieldElementImpl.forSerialized(
+            serializedVariable, enclosingClass);
       }
       buildPropertyIntroducingElementCommonParts(element, serializedVariable);
       element.static = serializedVariable.isStatic;
@@ -2564,19 +2674,10 @@
    * Handle the parts that are common to variables.
    */
   void buildVariableCommonParts(
-      VariableElementImpl element, UnlinkedVariable serializedVariable,
-      {bool isLazilyResynthesized: false}) {
+      VariableElementImpl element, UnlinkedVariable serializedVariable) {
     element.type = buildLinkedType(serializedVariable.inferredTypeSlot,
             _currentTypeParameterizedElement) ??
         buildType(serializedVariable.type, _currentTypeParameterizedElement);
-    if (!isLazilyResynthesized) {
-      element.const3 = serializedVariable.isConst;
-      element.final2 = serializedVariable.isFinal;
-      element.hasImplicitType = serializedVariable.type == null;
-      buildDocumentation(element, serializedVariable.documentationComment);
-      buildAnnotations(element, serializedVariable.annotations);
-      buildCodeRange(element, serializedVariable.codeRange);
-    }
     buildVariableInitializer(element, serializedVariable.initializer);
   }
 
@@ -2767,12 +2868,8 @@
   void populateUnit() {
     unlinkedUnit.classes.forEach(buildClass);
     unlinkedUnit.enums.forEach(buildEnum);
-    unlinkedUnit.executables.forEach((e) => buildExecutable(e, unit));
     unlinkedUnit.typedefs.forEach(buildTypedef);
-    unlinkedUnit.variables.forEach(buildVariable);
-    unit.accessors = unitHolder.accessors;
     unit.enums = unitHolder.enums;
-    unit.functions = unitHolder.functions;
     List<FunctionTypeAliasElement> typeAliases = unitHolder.typeAliases;
     for (FunctionTypeAliasElementImpl typeAlias in typeAliases) {
       if (typeAlias.isSynthetic) {
@@ -2781,22 +2878,6 @@
     }
     unit.typeAliases = typeAliases.where((e) => !e.isSynthetic).toList();
     unit.types = unitHolder.types;
-    unit.topLevelVariables = unitHolder.topLevelVariables;
-    for (ClassElement cls in unit.types) {
-      elementMap[cls.name] = cls;
-    }
-    for (ClassElement cls in unit.enums) {
-      elementMap[cls.name] = cls;
-    }
-    for (FunctionTypeAliasElement typeAlias in unit.functionTypeAliases) {
-      elementMap[typeAlias.name] = typeAlias;
-    }
-    for (FunctionElement function in unit.functions) {
-      elementMap[function.name] = function;
-    }
-    for (PropertyAccessorElementImpl accessor in unit.accessors) {
-      elementMap[accessor.identifier] = accessor;
-    }
     assert(currentTypeParameters.isEmpty);
   }
 
@@ -2828,8 +2909,8 @@
     }
   }
 
-  Expression _buildConstExpression(UnlinkedConst uc) {
-    return new _ConstExprBuilder(this, uc).build();
+  Expression _buildConstExpression(ElementImpl context, UnlinkedConst uc) {
+    return new _ConstExprBuilder(this, context, uc).build();
   }
 
   /**
@@ -2837,11 +2918,13 @@
    * [typeArgumentRefs] to the given linked [info].
    */
   InterfaceType _createConstructorDefiningType(
-      _ReferenceInfo info, List<EntityRef> typeArgumentRefs) {
+      TypeParameterizedElementMixin typeParameterContext,
+      _ReferenceInfo info,
+      List<EntityRef> typeArgumentRefs) {
     bool isClass = info.element is ClassElement;
     _ReferenceInfo classInfo = isClass ? info : info.enclosing;
     List<DartType> typeArguments = typeArgumentRefs
-        .map((t) => buildType(t, _currentTypeParameterizedElement))
+        .map((t) => buildType(t, typeParameterContext))
         .toList();
     return classInfo.buildType(true, typeArguments.length, (i) {
       if (i < typeArguments.length) {
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index f5dd314..7c359c3 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -901,7 +901,8 @@
           variables.type == null) {
         Expression initializer = variable.initializer;
         if (initializer != null) {
-          b.constExpr = serializeConstExpr(localClosureIndexMap, initializer);
+          b.initializer.bodyExpr =
+              serializeConstExpr(localClosureIndexMap, initializer);
         }
       }
       if (variable.initializer != null &&
diff --git a/pkg/analyzer/lib/src/summary/summarize_elements.dart b/pkg/analyzer/lib/src/summary/summarize_elements.dart
index cd2adec..432d414 100644
--- a/pkg/analyzer/lib/src/summary/summarize_elements.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_elements.dart
@@ -1133,11 +1133,15 @@
     b.isConst = variable.isConst;
     b.documentationComment = serializeDocumentation(variable);
     b.annotations = serializeAnnotations(variable);
+    // TODO(scheglov) VariableMember.initializer is not implemented
+    if (variable is! VariableMember && variable.initializer != null) {
+      b.initializer = serializeExecutable(variable.initializer);
+    }
     if (variable is ConstVariableElement) {
       ConstVariableElement constVariable = variable as ConstVariableElement;
       Expression initializer = constVariable.constantInitializer;
       if (initializer != null) {
-        b.constExpr =
+        b.initializer?.bodyExpr =
             serializeConstExpr(variable, variable.initializer, initializer);
       }
     }
@@ -1162,10 +1166,6 @@
         b.visibleLength = visibleRange.length;
       }
     }
-    // TODO(scheglov) VariableMember.initializer is not implemented
-    if (variable is! VariableMember && variable.initializer != null) {
-      b.initializer = serializeExecutable(variable.initializer);
-    }
     return b;
   }
 
diff --git a/pkg/analyzer/lib/src/task/dart_work_manager.dart b/pkg/analyzer/lib/src/task/dart_work_manager.dart
index 8c8176a..3d6dc33 100644
--- a/pkg/analyzer/lib/src/task/dart_work_manager.dart
+++ b/pkg/analyzer/lib/src/task/dart_work_manager.dart
@@ -82,7 +82,7 @@
    * Initialize a newly created manager.
    */
   DartWorkManager(this.context) {
-    analysisCache.onResultInvalidated.listen((InvalidatedResult event) {
+    context.onResultInvalidated.listen((InvalidatedResult event) {
       if (event.descriptor == LIBRARY_ERRORS_READY) {
         CacheEntry entry = event.entry;
         if (entry.explicitlyAdded &&
diff --git a/pkg/analyzer/lib/src/task/driver.dart b/pkg/analyzer/lib/src/task/driver.dart
index b0cabae..70ebe3b 100644
--- a/pkg/analyzer/lib/src/task/driver.dart
+++ b/pkg/analyzer/lib/src/task/driver.dart
@@ -280,7 +280,10 @@
       if (task.caughtException == null) {
         List<TargetedResult> dependedOn = item.inputTargetedResults.toList();
         Map<ResultDescriptor, dynamic> outputs = task.outputs;
-        for (ResultDescriptor result in task.descriptor.results) {
+        List<ResultDescriptor> results = task.descriptor.results;
+        int resultLength = results.length;
+        for (int i = 0; i < resultLength; i++) {
+          ResultDescriptor result = results[i];
           // TODO(brianwilkerson) We could check here that a value was produced
           // and throw an exception if not (unless we want to allow null values).
           entry.setValue(result, outputs[result], dependedOn);
diff --git a/pkg/analyzer/lib/src/task/inputs.dart b/pkg/analyzer/lib/src/task/inputs.dart
index cb497b6..7bc5fa1 100644
--- a/pkg/analyzer/lib/src/task/inputs.dart
+++ b/pkg/analyzer/lib/src/task/inputs.dart
@@ -432,7 +432,7 @@
 
   /**
    * Initialize a newly created task input that computes the input by accessing
-   * the given [result] associated with the given [target].
+   * the given [baseInput] associated with the given [mapper].
    */
   ObjectToListTaskInput(this.baseInput, this.mapper);
 
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 6b0049b..4566e6a 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -992,7 +992,7 @@
         includeParents: false);
   }
 
-  /// Check that individual methods and fields in [subType] correctly override
+  /// Check that individual methods and fields in [node] correctly override
   /// the declarations in [baseType].
   ///
   /// The [errorLocation] node indicates where errors are reported, see
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 70d31aa..2e3d3c0 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -54,7 +54,7 @@
 }
 
 /**
- * A function that returns `true` if the given [variable] passes the filter.
+ * A function that returns `true` if the given [element] passes the filter.
  */
 typedef bool VariableFilter(VariableElement element);
 
@@ -165,7 +165,7 @@
   }
 
   /**
-   * Given a [method], return the type of the parameter in the method that
+   * Given a method, return the type of the parameter in the method that
    * corresponds to the given [parameter]. If the parameter is positional, then
    * it appears at the given [index] in its enclosing element's list of
    * parameters.
diff --git a/pkg/analyzer/lib/src/util/fast_uri.dart b/pkg/analyzer/lib/src/util/fast_uri.dart
new file mode 100644
index 0000000..8af548c
--- /dev/null
+++ b/pkg/analyzer/lib/src/util/fast_uri.dart
@@ -0,0 +1,291 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+/**
+ * Implementation of [Uri] that understands only a limited set of valid
+ * URI formats, but works fast. In practice Dart code almost always uses such
+ * limited URI format, so almost always can be processed fast.
+ */
+class FastUri implements Uri {
+  /***
+   * The maximum [_cache] length before we flush it and start a new generation.
+   */
+  static const int _MAX_CACHE_LENGTH_BEFORE_FLUSH = 50000;
+
+  static HashMap<String, Uri> _cache = new HashMap<String, Uri>();
+  static int _currentCacheLength = 0;
+  static int _currentCacheGeneration = 0;
+
+  final int _cacheGeneration;
+  final String _text;
+  final String _scheme;
+  final bool _hasEmptyAuthority;
+  final String _path;
+
+  /**
+   * The offset of the last `/` in [_text], or `null` if there isn't any.
+   */
+  final int _lastSlashIndex;
+
+  /**
+   * The cached hashcode.
+   */
+  int _hashCode;
+
+  Uri _cachedFallbackUri;
+
+  FastUri._(this._cacheGeneration, this._text, this._scheme,
+      this._hasEmptyAuthority, this._path, this._lastSlashIndex);
+
+  @override
+  String get authority => '';
+
+  @override
+  UriData get data => null;
+
+  @override
+  String get fragment => '';
+
+  @override
+  bool get hasAbsolutePath => path.startsWith('/');
+
+  @override
+  bool get hasAuthority => _hasEmptyAuthority;
+
+  @override
+  bool get hasEmptyPath => _path.isEmpty;
+
+  @override
+  bool get hasFragment => false;
+
+  @override
+  int get hashCode {
+    // This code is copied from the standard Uri implementation.
+    // It is important that Uri and FastUri generate compatible hashCodes
+    // because Uri and FastUri may be used as keys in the same map.
+    int combine(part, current) {
+      // The sum is truncated to 30 bits to make sure it fits into a Smi.
+      return (current * 31 + part.hashCode) & 0x3FFFFFFF;
+    }
+    return _hashCode ??= combine(
+        scheme,
+        combine(
+            userInfo,
+            combine(
+                host,
+                combine(port,
+                    combine(path, combine(query, combine(fragment, 1)))))));
+  }
+
+  @override
+  bool get hasPort => false;
+
+  @override
+  bool get hasQuery => false;
+
+  @override
+  bool get hasScheme => _scheme.isNotEmpty;
+
+  @override
+  String get host => '';
+
+  @override
+  bool get isAbsolute => hasScheme;
+
+  @override
+  String get origin => _fallbackUri.origin;
+
+  @override
+  String get path => _path;
+
+  @override
+  List<String> get pathSegments => _fallbackUri.pathSegments;
+
+  @override
+  int get port => 0;
+
+  @override
+  String get query => '';
+
+  @override
+  Map<String, String> get queryParameters => const <String, String>{};
+
+  @override
+  Map<String, List<String>> get queryParametersAll =>
+      const <String, List<String>>{};
+
+  @override
+  String get scheme => _scheme;
+
+  @override
+  String get userInfo => '';
+
+  /**
+   * Full [Uri] object computed on demand; we fall back to this for some of the
+   * more complex methods of [Uri] that are less in need of a fast
+   * implementation.
+   */
+  Uri get _fallbackUri => _cachedFallbackUri ??= Uri.parse(_text);
+
+  @override
+  bool operator ==(other) {
+    if (other is FastUri) {
+      if (other._cacheGeneration == _cacheGeneration) {
+        return identical(other, this);
+      }
+      return _text == other._text;
+    } else if (other is Uri) {
+      return _fallbackUri == other;
+    }
+    return false;
+  }
+
+  @override
+  Uri normalizePath() {
+    return this;
+  }
+
+  @override
+  Uri removeFragment() {
+    return this;
+  }
+
+  @override
+  Uri replace(
+      {String scheme,
+      String userInfo,
+      String host,
+      int port,
+      String path,
+      Iterable<String> pathSegments,
+      String query,
+      Map<String, dynamic> queryParameters,
+      String fragment}) {
+    return _fallbackUri.replace(
+        scheme: scheme,
+        userInfo: userInfo,
+        host: host,
+        port: port,
+        path: path,
+        pathSegments: pathSegments,
+        query: query,
+        queryParameters: queryParameters,
+        fragment: fragment);
+  }
+
+  @override
+  Uri resolve(String reference) {
+    // TODO: maybe implement faster
+    return _fallbackUri.resolve(reference);
+  }
+
+  @override
+  Uri resolveUri(Uri reference) {
+    if (reference.hasScheme) {
+      return reference;
+    }
+    String refPath = reference.path;
+    if (refPath.startsWith('./')) {
+      refPath = refPath.substring(2);
+    }
+    if (refPath.startsWith('../') ||
+        refPath.contains('/../') ||
+        refPath.contains('/./')) {
+      Uri slowResult = _fallbackUri.resolveUri(reference);
+      return FastUri.parse(slowResult.toString());
+    }
+    String newText;
+    if (_lastSlashIndex != null) {
+      newText = _text.substring(0, _lastSlashIndex + 1) + refPath;
+    } else {
+      newText = _text + '/' + refPath;
+    }
+    return FastUri.parse(newText);
+  }
+
+  @override
+  String toFilePath({bool windows}) {
+    return _fallbackUri.toFilePath(windows: windows);
+  }
+
+  @override
+  String toString() => _text;
+
+  /**
+   * Parse the given URI [text] and return the corresponding [Uri] instance.  If
+   * the [text] can be represented as a [FastUri], then it is returned.  If the
+   * [text] is more complex, then `dart:core` [Uri] is created and returned.
+   * This method also performs memoization, so that usually the same instance
+   * of [FastUri] or [Uri] is returned for the same [text].
+   */
+  static Uri parse(String text) {
+    Uri uri = _cache[text];
+    if (uri == null) {
+      uri = _parse(text);
+      uri ??= Uri.parse(text);
+      _cache[text] = uri;
+      _currentCacheLength++;
+      // If the cache is too big, start a new generation.
+      if (_currentCacheLength > _MAX_CACHE_LENGTH_BEFORE_FLUSH) {
+        _cache.clear();
+        _currentCacheLength = 0;
+        _currentCacheGeneration++;
+      }
+    }
+    return uri;
+  }
+
+  static bool _isAlphabetic(int char) {
+    return char >= 'A'.codeUnitAt(0) && char <= 'Z'.codeUnitAt(0) ||
+        char >= 'a'.codeUnitAt(0) && char <= 'z'.codeUnitAt(0);
+  }
+
+  static bool _isDigit(int char) {
+    return char >= '0'.codeUnitAt(0) && char <= '9'.codeUnitAt(0);
+  }
+
+  /**
+   * Parse the given [text] into a new [FastUri].  If the [text] uses URI
+   * features that are not supported by [FastUri], return `null`.
+   */
+  static FastUri _parse(String text) {
+    int schemeEnd = null;
+    int pathStart = 0;
+    int lastSlashIndex = null;
+    for (int i = 0; i < text.length; i++) {
+      int char = text.codeUnitAt(i);
+      if (_isAlphabetic(char) ||
+          _isDigit(char) ||
+          char == '.'.codeUnitAt(0) ||
+          char == '-'.codeUnitAt(0) ||
+          char == '_'.codeUnitAt(0)) {
+        // Valid characters.
+      } else if (char == '/'.codeUnitAt(0)) {
+        lastSlashIndex = i;
+      } else if (char == ':'.codeUnitAt(0)) {
+        if (schemeEnd != null) {
+          return null;
+        }
+        schemeEnd = i;
+        pathStart = i + 1;
+      } else {
+        return null;
+      }
+    }
+    String scheme = schemeEnd != null ? text.substring(0, schemeEnd) : '';
+    bool hasEmptyAuthority = false;
+    String path = text.substring(pathStart);
+    if (path.startsWith('//')) {
+      hasEmptyAuthority = true;
+      path = path.substring(2);
+      if (!path.startsWith('/')) {
+        return null;
+      }
+    }
+    return new FastUri._(_currentCacheGeneration, text, scheme,
+        hasEmptyAuthority, path, lastSlashIndex);
+  }
+}
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 541d5fc..2d03ea2 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.27.4-alpha.6
+version: 0.27.4-alpha.7
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 04481ef..c4a47ca 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -3531,6 +3531,10 @@
     _assertFalse("for (;;) { break; }");
   }
 
+  void test_forStatement_implicitTrue_if_break() {
+    _assertFalse("{ for (;;) { if (1==2) { var a = 1; } else { break; } } }");
+  }
+
   void test_forStatement_initialization() {
     _assertTrue("for (i = throw 0;;) {}");
   }
@@ -3852,6 +3856,20 @@
  */
 @reflectiveTest
 class ExitDetectorTest2 extends ResolverTestCase {
+  void test_forStatement_implicitTrue_breakWithLabel() {
+    Source source = addSource(r'''
+void f() {
+  x: for (;;) {
+    if (1 < 2) {
+      break x;
+    }
+    return;
+  }
+}
+''');
+    _assertNthStatementDoesNotExit(source, 0);
+  }
+
   void test_switch_withEnum_false_noDefault() {
     Source source = addSource(r'''
 enum E { A, B }
@@ -3866,12 +3884,7 @@
   return x;
 }
 ''');
-    LibraryElement element = resolve2(source);
-    CompilationUnit unit = resolveCompilationUnit(source, element);
-    FunctionDeclaration function = unit.declarations.last;
-    BlockFunctionBody body = function.functionExpression.body;
-    Statement statement = body.block.statements[1];
-    expect(ExitDetector.exits(statement), false);
+    _assertNthStatementDoesNotExit(source, 1);
   }
 
   void test_switch_withEnum_false_withDefault() {
@@ -3888,12 +3901,7 @@
   return x;
 }
 ''');
-    LibraryElement element = resolve2(source);
-    CompilationUnit unit = resolveCompilationUnit(source, element);
-    FunctionDeclaration function = unit.declarations.last;
-    BlockFunctionBody body = function.functionExpression.body;
-    Statement statement = body.block.statements[1];
-    expect(ExitDetector.exits(statement), false);
+    _assertNthStatementDoesNotExit(source, 1);
   }
 
   void test_switch_withEnum_true_noDefault() {
@@ -3908,12 +3916,7 @@
   }
 }
 ''');
-    LibraryElement element = resolve2(source);
-    CompilationUnit unit = resolveCompilationUnit(source, element);
-    FunctionDeclaration function = unit.declarations.last;
-    BlockFunctionBody body = function.functionExpression.body;
-    Statement statement = body.block.statements[0];
-    expect(ExitDetector.exits(statement), true);
+    _assertNthStatementExits(source, 0);
   }
 
   void test_switch_withEnum_true_withDefault() {
@@ -3928,12 +3931,56 @@
   }
 }
 ''');
+    _assertNthStatementExits(source, 0);
+  }
+
+  void test_whileStatement_breakWithLabel() {
+    Source source = addSource(r'''
+void f() {
+  x: while (true) {
+    if (1 < 2) {
+      break x;
+    }
+    return;
+  }
+}
+''');
+    _assertNthStatementDoesNotExit(source, 0);
+  }
+
+  void test_whileStatement_breakWithLabel_afterExting() {
+    Source source = addSource(r'''
+void f() {
+  x: while (true) {
+    return;
+    if (1 < 2) {
+      break x;
+    }
+  }
+}
+''');
+    _assertNthStatementExits(source, 0);
+  }
+
+  void _assertHasReturn(bool expectedResult, Source source, int n) {
     LibraryElement element = resolve2(source);
     CompilationUnit unit = resolveCompilationUnit(source, element);
     FunctionDeclaration function = unit.declarations.last;
     BlockFunctionBody body = function.functionExpression.body;
-    Statement statement = body.block.statements[0];
-    expect(ExitDetector.exits(statement), true);
+    Statement statement = body.block.statements[n];
+    expect(ExitDetector.exits(statement), expectedResult);
+  }
+
+  // Assert that the [n]th statement in the last function declaration of
+  // [source] exits.
+  void _assertNthStatementExits(Source source, int n) {
+    _assertHasReturn(true, source, n);
+  }
+
+  // Assert that the [n]th statement in the last function declaration of
+  // [source] does not exit.
+  void _assertNthStatementDoesNotExit(Source source, int n) {
+    _assertHasReturn(false, source, n);
   }
 }
 
diff --git a/pkg/analyzer/test/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index 04560c2..cca5d3b 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -512,17 +512,19 @@
 }
 
 class TestPackageUriResolver extends UriResolver {
-  Map<Uri, Source> sourceMap = new HashMap<Uri, Source>();
+  Map<String, Source> sourceMap = new HashMap<String, Source>();
 
   TestPackageUriResolver(Map<String, String> map) {
     map.forEach((String uri, String contents) {
-      sourceMap[Uri.parse(uri)] =
-          new StringSource(contents, '/test_pkg_source.dart');
+      sourceMap[uri] = new StringSource(contents, '/test_pkg_source.dart');
     });
   }
 
   @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) => sourceMap[uri];
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    String uriString = uri.toString();
+    return sourceMap[uriString];
+  }
 
   @override
   Uri restoreAbsolute(Source source) => throw new UnimplementedError();
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index f922d25..e679466 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -190,11 +190,15 @@
 }
 
 /**
- * Instances of the class `TestAnalysisContext` implement an analysis context in which every
- * method will cause a test to fail when invoked.
+ * An analysis context in which almost every method will cause a test to fail
+ * when invoked.
  */
 class TestAnalysisContext implements InternalAnalysisContext {
   @override
+  final ReentrantSynchronousStream<InvalidatedResult> onResultInvalidated =
+      new ReentrantSynchronousStream<InvalidatedResult>();
+
+  @override
   ResultProvider resultProvider;
 
   @override
diff --git a/pkg/analyzer/test/source/embedder_test.dart b/pkg/analyzer/test/source/embedder_test.dart
index 898aa1f..9bc4671 100644
--- a/pkg/analyzer/test/source/embedder_test.dart
+++ b/pkg/analyzer/test/source/embedder_test.dart
@@ -28,19 +28,20 @@
     });
     test('test_NullEmbedderYamls', () {
       var resolver = new EmbedderUriResolver(null);
-      expect(resolver.length, equals(0));
+      expect(resolver.length, 0);
     });
     test('test_NoEmbedderYamls', () {
       var locator = new EmbedderYamlLocator({
         'fox': [pathTranslator.getResource('/empty')]
       });
-      expect(locator.embedderYamls.length, equals(0));
+      expect(locator.embedderYamls.length, 0);
     });
     test('test_EmbedderYaml', () {
       var locator = new EmbedderYamlLocator({
         'fox': [pathTranslator.getResource('/tmp')]
       });
-      var resolver = new EmbedderUriResolver(locator.embedderYamls);
+      var resolver =
+          new EmbedderUriResolver(new EmbedderSdk(locator.embedderYamls));
 
       expectResolved(dartUri, posixPath) {
         Source source = resolver.resolveAbsolute(Uri.parse(dartUri));
@@ -48,9 +49,10 @@
         expect(source.fullName, posixToOSPath(posixPath));
       }
 
-      // We have four mappings.
-      expect(resolver.length, equals(4));
+      // We have five mappings.
+      expect(resolver.length, 5);
       // Check that they map to the correct paths.
+      expectResolved('dart:core', '/tmp/core.dart');
       expectResolved('dart:fox', '/tmp/slippy.dart');
       expectResolved('dart:bear', '/tmp/grizzly.dart');
       expectResolved('dart:relative', '/relative.dart');
@@ -59,13 +61,14 @@
     test('test_BadYAML', () {
       var locator = new EmbedderYamlLocator(null);
       locator.addEmbedderYaml(null, r'''{{{,{{}}},}}''');
-      expect(locator.embedderYamls.length, equals(0));
+      expect(locator.embedderYamls.length, 0);
     });
     test('test_restoreAbsolute', () {
       var locator = new EmbedderYamlLocator({
         'fox': [pathTranslator.getResource('/tmp')]
       });
-      var resolver = new EmbedderUriResolver(locator.embedderYamls);
+      var resolver =
+          new EmbedderUriResolver(new EmbedderSdk(locator.embedderYamls));
 
       expectRestore(String dartUri, [String expected]) {
         var parsedUri = Uri.parse(dartUri);
@@ -75,10 +78,10 @@
         var restoreUri = resolver.restoreAbsolute(source);
         expect(restoreUri, isNotNull, reason: dartUri);
         // Verify that it is 'dart:fox'.
-        expect(restoreUri.toString(), equals(expected ?? dartUri));
+        expect(restoreUri.toString(), expected ?? dartUri);
         List<String> split = (expected ?? dartUri).split(':');
-        expect(restoreUri.scheme, equals(split[0]));
-        expect(restoreUri.path, equals(split[1]));
+        expect(restoreUri.scheme, split[0]);
+        expect(restoreUri.path, split[1]);
       }
 
       expectRestore('dart:deep');
@@ -91,7 +94,8 @@
       var locator = new EmbedderYamlLocator({
         'fox': [pathTranslator.getResource('/tmp')]
       });
-      var resolver = new EmbedderUriResolver(locator.embedderYamls);
+      var resolver =
+          new EmbedderUriResolver(new EmbedderSdk(locator.embedderYamls));
       var sdk = resolver.dartSdk;
 
       expectSource(String posixPath, String dartUri) {
@@ -110,18 +114,20 @@
       var locator = new EmbedderYamlLocator({
         'fox': [pathTranslator.getResource('/tmp')]
       });
-      var resolver = new EmbedderUriResolver(locator.embedderYamls);
+      var resolver =
+          new EmbedderUriResolver(new EmbedderSdk(locator.embedderYamls));
       var sdk = resolver.dartSdk;
       var lib = sdk.getSdkLibrary('dart:fox');
       expect(lib, isNotNull);
       expect(lib.path, posixToOSPath('/tmp/slippy.dart'));
-      expect(lib.shortName, 'fox');
+      expect(lib.shortName, 'dart:fox');
     });
     test('test_EmbedderSdk_mapDartUri', () {
       var locator = new EmbedderYamlLocator({
         'fox': [pathTranslator.getResource('/tmp')]
       });
-      var resolver = new EmbedderUriResolver(locator.embedderYamls);
+      var resolver =
+          new EmbedderUriResolver(new EmbedderSdk(locator.embedderYamls));
       var sdk = resolver.dartSdk;
 
       expectSource(String dartUri, String posixPath) {
@@ -131,6 +137,7 @@
         expect(source.fullName, posixToOSPath(posixPath));
       }
 
+      expectSource('dart:core', '/tmp/core.dart');
       expectSource('dart:fox', '/tmp/slippy.dart');
       expectSource('dart:deep', '/tmp/deep/directory/file.dart');
       expectSource('dart:deep/part.dart', '/tmp/deep/directory/part.dart');
@@ -151,6 +158,7 @@
         '/tmp/_embedder.yaml',
         r'''
 embedded_libs:
+  "dart:core" : "core.dart"
   "dart:fox": "slippy.dart"
   "dart:bear": "grizzly.dart"
   "dart:relative": "../relative.dart"
diff --git a/pkg/analyzer/test/src/context/cache_test.dart b/pkg/analyzer/test/src/context/cache_test.dart
index 3c44f09..57ff94e 100644
--- a/pkg/analyzer/test/src/context/cache_test.dart
+++ b/pkg/analyzer/test/src/context/cache_test.dart
@@ -266,6 +266,7 @@
     ResultDescriptor result = new ResultDescriptor('test', null);
     CaughtException exception = new CaughtException(null, null);
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     entry.setErrorState(exception, <ResultDescriptor>[result]);
     entry.fixExceptionState();
     expect(entry.getState(result), CacheState.ERROR);
@@ -352,6 +353,7 @@
     ResultDescriptor result = new ResultDescriptor('test', null);
     CaughtException exception = new CaughtException(null, null);
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     entry.setErrorState(exception, <ResultDescriptor>[result]);
     expect(entry.hasErrorState(), true);
   }
@@ -360,6 +362,7 @@
     AnalysisTarget target = new TestSource();
     ResultDescriptor result = new ResultDescriptor('test', null);
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     entry.setValue(result, 'value', TargetedResult.EMPTY_LIST);
     entry.invalidateAllInformation();
     expect(entry.getState(result), CacheState.INVALID);
@@ -373,6 +376,7 @@
     ResultDescriptor result3 = new ResultDescriptor('res3', 3);
     // prepare some good state
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     entry.setValue(result1, 10, TargetedResult.EMPTY_LIST);
     entry.setValue(result2, 20, TargetedResult.EMPTY_LIST);
     entry.setValue(result3, 30, TargetedResult.EMPTY_LIST);
@@ -460,6 +464,7 @@
     AnalysisTarget target = new TestSource();
     ResultDescriptor result = new ResultDescriptor('test', null);
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     entry.setValue(result, 42, TargetedResult.EMPTY_LIST);
     // an invalid state change
     expect(() {
@@ -474,6 +479,7 @@
     AnalysisTarget target = new TestSource();
     ResultDescriptor result = new ResultDescriptor('test', 1);
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     // set VALID
     entry.setValue(result, 10, TargetedResult.EMPTY_LIST);
     expect(entry.getState(result), CacheState.VALID);
@@ -488,6 +494,7 @@
     AnalysisTarget target = new TestSource();
     ResultDescriptor result = new ResultDescriptor('test', 1);
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     // set VALID
     entry.setValue(result, 10, TargetedResult.EMPTY_LIST);
     expect(entry.getState(result), CacheState.VALID);
@@ -674,6 +681,7 @@
     ResultDescriptor result = new ResultDescriptor('test', null);
     String value = 'value';
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     entry.setValue(result, value, TargetedResult.EMPTY_LIST);
     expect(entry.getState(result), CacheState.VALID);
     expect(entry.getValue(result), value);
@@ -769,6 +777,7 @@
     AnalysisTarget target = new TestSource();
     ResultDescriptor result = new ResultDescriptor('test', null);
     CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
     entry.setValue(result, 42, TargetedResult.EMPTY_LIST);
     expect(entry.toString(), isNotNull);
   }
diff --git a/pkg/analyzer/test/src/summary/flat_buffers_test.dart b/pkg/analyzer/test/src/summary/flat_buffers_test.dart
index b17dc14..40b0479 100644
--- a/pkg/analyzer/test/src/summary/flat_buffers_test.dart
+++ b/pkg/analyzer/test/src/summary/flat_buffers_test.dart
@@ -109,11 +109,12 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer object = new BufferPointer.fromBytes(byteList).derefObject();
+    BufferContext buffer = new BufferContext.fromBytes(byteList);
+    int objectOffset = buffer.derefObject(0);
     // was not written, so uses the new default value
-    expect(const Int32Reader().vTableGet(object, 0, 15), 15);
+    expect(const Int32Reader().vTableGet(buffer, objectOffset, 0, 15), 15);
     // has the written value
-    expect(const Int32Reader().vTableGet(object, 1, 15), 20);
+    expect(const Int32Reader().vTableGet(buffer, objectOffset, 1, 15), 20);
   }
 
   void test_table_format() {
@@ -149,6 +150,27 @@
     }
   }
 
+  void test_table_string() {
+    String latinString = 'test';
+    String unicodeString = 'Проба пера';
+    List<int> byteList;
+    {
+      Builder builder = new Builder(initialSize: 0);
+      Offset<String> latinStringOffset = builder.writeString(latinString);
+      Offset<String> unicodeStringOffset = builder.writeString(unicodeString);
+      builder.startTable();
+      builder.addOffset(0, latinStringOffset);
+      builder.addOffset(1, unicodeStringOffset);
+      Offset offset = builder.endTable();
+      byteList = builder.finish(offset);
+    }
+    // read and verify
+    BufferContext buf = new BufferContext.fromBytes(byteList);
+    int objectOffset = buf.derefObject(0);
+    expect(const StringReader().vTableGet(buf, objectOffset, 0), latinString);
+    expect(const StringReader().vTableGet(buf, objectOffset, 1), unicodeString);
+  }
+
   void test_table_types() {
     List<int> byteList;
     {
@@ -166,14 +188,15 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer object = new BufferPointer.fromBytes(byteList).derefObject();
-    expect(const BoolReader().vTableGet(object, 0), true);
-    expect(const Int8Reader().vTableGet(object, 1), 10);
-    expect(const Int32Reader().vTableGet(object, 2), 20);
-    expect(const StringReader().vTableGet(object, 3), '12345');
-    expect(const Int32Reader().vTableGet(object, 4), 40);
-    expect(const Uint32Reader().vTableGet(object, 5), 0x9ABCDEF0);
-    expect(const Uint8Reader().vTableGet(object, 6), 0x9A);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
+    int objectOffset = buf.derefObject(0);
+    expect(const BoolReader().vTableGet(buf, objectOffset, 0), true);
+    expect(const Int8Reader().vTableGet(buf, objectOffset, 1), 10);
+    expect(const Int32Reader().vTableGet(buf, objectOffset, 2), 20);
+    expect(const StringReader().vTableGet(buf, objectOffset, 3), '12345');
+    expect(const Int32Reader().vTableGet(buf, objectOffset, 4), 40);
+    expect(const Uint32Reader().vTableGet(buf, objectOffset, 5), 0x9ABCDEF0);
+    expect(const Uint8Reader().vTableGet(buf, objectOffset, 6), 0x9A);
   }
 
   void test_writeList_of_Uint32() {
@@ -186,8 +209,8 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer root = new BufferPointer.fromBytes(byteList);
-    List<int> items = const Uint32ListReader().read(root);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
+    List<int> items = const Uint32ListReader().read(buf, 0);
     expect(items, hasLength(4));
     expect(items, orderedEquals(values));
   }
@@ -206,8 +229,8 @@
         byteList = builder.finish(offset);
       }
       // read and verify
-      BufferPointer root = new BufferPointer.fromBytes(byteList);
-      List<bool> items = const BoolListReader().read(root);
+      BufferContext buf = new BufferContext.fromBytes(byteList);
+      List<bool> items = const BoolListReader().read(buf, 0);
       expect(items, hasLength(len));
       for (int i = 0; i < items.length; i++) {
         expect(items[i], trueBits.contains(i), reason: 'bit $i of $len');
@@ -243,8 +266,8 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer root = new BufferPointer.fromBytes(byteList);
-    List<double> items = const Float64ListReader().read(root);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
+    List<double> items = const Float64ListReader().read(buf, 0);
     expect(items, hasLength(5));
     expect(items, orderedEquals(values));
   }
@@ -257,8 +280,8 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer root = new BufferPointer.fromBytes(byteList);
-    List<int> items = const ListReader<int>(const Int32Reader()).read(root);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
+    List<int> items = const ListReader<int>(const Int32Reader()).read(buf, 0);
     expect(items, hasLength(5));
     expect(items, orderedEquals(<int>[1, 2, 3, 4, 5]));
   }
@@ -288,9 +311,9 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer root = new BufferPointer.fromBytes(byteList);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
     List<TestPointImpl> items =
-        const ListReader<TestPointImpl>(const TestPointReader()).read(root);
+        const ListReader<TestPointImpl>(const TestPointReader()).read(buf, 0);
     expect(items, hasLength(2));
     expect(items[0].x, 10);
     expect(items[0].y, 20);
@@ -308,9 +331,9 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer root = new BufferPointer.fromBytes(byteList);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
     List<String> items =
-        const ListReader<String>(const StringReader()).read(root);
+        const ListReader<String>(const StringReader()).read(buf, 0);
     expect(items, hasLength(2));
     expect(items, contains('12345'));
     expect(items, contains('ABC'));
@@ -328,8 +351,8 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer root = new BufferPointer.fromBytes(byteList);
-    StringListWrapperImpl reader = new StringListWrapperReader().read(root);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
+    StringListWrapperImpl reader = new StringListWrapperReader().read(buf, 0);
     List<String> items = reader.items;
     expect(items, hasLength(2));
     expect(items, contains('12345'));
@@ -344,8 +367,8 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer root = new BufferPointer.fromBytes(byteList);
-    List<int> items = const Uint32ListReader().read(root);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
+    List<int> items = const Uint32ListReader().read(buf, 0);
     expect(items, hasLength(3));
     expect(items, orderedEquals(<int>[1, 2, 0x9ABCDEF0]));
   }
@@ -358,46 +381,48 @@
       byteList = builder.finish(offset);
     }
     // read and verify
-    BufferPointer root = new BufferPointer.fromBytes(byteList);
-    List<int> items = const Uint8ListReader().read(root);
+    BufferContext buf = new BufferContext.fromBytes(byteList);
+    List<int> items = const Uint8ListReader().read(buf, 0);
     expect(items, hasLength(5));
     expect(items, orderedEquals(<int>[1, 2, 3, 4, 0x9A]));
   }
 }
 
 class StringListWrapperImpl {
-  final BufferPointer bp;
+  final BufferContext bp;
+  final int offset;
 
-  StringListWrapperImpl(this.bp);
+  StringListWrapperImpl(this.bp, this.offset);
 
   List<String> get items =>
-      const ListReader<String>(const StringReader()).vTableGet(bp, 0);
+      const ListReader<String>(const StringReader()).vTableGet(bp, offset, 0);
 }
 
 class StringListWrapperReader extends TableReader<StringListWrapperImpl> {
   const StringListWrapperReader();
 
   @override
-  StringListWrapperImpl createObject(BufferPointer object) {
-    return new StringListWrapperImpl(object);
+  StringListWrapperImpl createObject(BufferContext object, int offset) {
+    return new StringListWrapperImpl(object, offset);
   }
 }
 
 class TestPointImpl {
-  final BufferPointer bp;
+  final BufferContext bp;
+  final int offset;
 
-  TestPointImpl(this.bp);
+  TestPointImpl(this.bp, this.offset);
 
-  int get x => const Int32Reader().vTableGet(bp, 0, 0);
+  int get x => const Int32Reader().vTableGet(bp, offset, 0, 0);
 
-  int get y => const Int32Reader().vTableGet(bp, 1, 0);
+  int get y => const Int32Reader().vTableGet(bp, offset, 1, 0);
 }
 
 class TestPointReader extends TableReader<TestPointImpl> {
   const TestPointReader();
 
   @override
-  TestPointImpl createObject(BufferPointer object) {
-    return new TestPointImpl(object);
+  TestPointImpl createObject(BufferContext object, int offset) {
+    return new TestPointImpl(object, offset);
   }
 }
diff --git a/pkg/analyzer/test/src/summary/linker_test.dart b/pkg/analyzer/test/src/summary/linker_test.dart
index c067a9e..f64a448 100644
--- a/pkg/analyzer/test/src/summary/linker_test.dart
+++ b/pkg/analyzer/test/src/summary/linker_test.dart
@@ -508,6 +508,56 @@
         'int');
   }
 
+  void test_instantiate_param_of_param_to_bounds() {
+    createLinker('''
+class C<T> {}
+class D<T extends num> {}
+final x = new C<D>();
+''');
+    LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+    library.libraryCycleForLink.ensureLinked();
+    PropertyAccessorElementForLink_Variable x = library.getContainedName('x');
+    ParameterizedType type1 = x.returnType;
+    expect(type1.element.name, 'C');
+    expect(type1.typeArguments, hasLength(1));
+    ParameterizedType type2 = type1.typeArguments[0];
+    expect(type2.element.name, 'D');
+    expect(type2.typeArguments, hasLength(1));
+    DartType type3 = type2.typeArguments[0];
+    expect(type3.toString(), 'num');
+  }
+
+  void test_instantiate_param_to_bounds_class() {
+    createLinker('''
+class C<T extends num> {}
+final x = new C();
+''');
+    LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+    library.libraryCycleForLink.ensureLinked();
+    PropertyAccessorElementForLink_Variable x = library.getContainedName('x');
+    ParameterizedType type1 = x.returnType;
+    expect(type1.element.name, 'C');
+    expect(type1.typeArguments, hasLength(1));
+    DartType type2 = type1.typeArguments[0];
+    expect(type2.toString(), 'num');
+  }
+
+  void test_instantiate_param_to_bounds_typedef() {
+    createLinker('''
+typedef T F<T extends num>();
+final x = new List<F>();
+''');
+    LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+    library.libraryCycleForLink.ensureLinked();
+    PropertyAccessorElementForLink_Variable x = library.getContainedName('x');
+    ParameterizedType type1 = x.returnType;
+    expect(type1.element.name, 'List');
+    expect(type1.typeArguments, hasLength(1));
+    FunctionType type2 = type1.typeArguments[0];
+    expect(type2.element.name, 'F');
+    expect(type2.returnType.toString(), 'num');
+  }
+
   void test_leastUpperBound_functionAndClass() {
     createLinker('''
 class C {}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index cf9d727..164d8a7 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -511,6 +511,19 @@
     super.test_inferenceInCyclesIsDeterministic();
   }
 
+  @override
+  @failingTest
+  void test_inferredType_opAssignToProperty_prefixedIdentifier() {
+    super.test_inferredType_opAssignToProperty_prefixedIdentifier();
+  }
+
+  @override
+  @failingTest
+  void test_inferredType_opAssignToProperty_prefixedIdentifier_viaInterface() {
+    super
+        .test_inferredType_opAssignToProperty_prefixedIdentifier_viaInterface();
+  }
+
   void test_invokeMethod_notGeneric_genericClass() {
     var unit = checkFile(r'''
 class C<T> {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_test.dart b/pkg/analyzer/test/src/summary/resynthesize_test.dart
index e4f296e..b104092 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_test.dart
@@ -110,16 +110,18 @@
     expect(resynthesized.hasExtUri, original.hasExtUri);
     compareCompilationUnitElements(resynthesized.definingCompilationUnit,
         original.definingCompilationUnit);
-    expect(resynthesized.parts.length, original.parts.length);
+    expect(resynthesized.parts.length, original.parts.length, reason: 'parts');
     for (int i = 0; i < resynthesized.parts.length; i++) {
       compareCompilationUnitElements(resynthesized.parts[i], original.parts[i]);
     }
-    expect(resynthesized.imports.length, original.imports.length);
+    expect(resynthesized.imports.length, original.imports.length,
+        reason: 'imports');
     for (int i = 0; i < resynthesized.imports.length; i++) {
       compareImportElements(resynthesized.imports[i], original.imports[i],
           'import ${original.imports[i].uri}');
     }
-    expect(resynthesized.exports.length, original.exports.length);
+    expect(resynthesized.exports.length, original.exports.length,
+        reason: 'exports');
     for (int i = 0; i < resynthesized.exports.length; i++) {
       compareExportElements(resynthesized.exports[i], original.exports[i],
           'export ${original.exports[i].uri}');
@@ -260,13 +262,15 @@
     compareUriReferencedElements(resynthesized, original, desc);
     expect(resynthesized.source, original.source);
     expect(resynthesized.librarySource, original.librarySource);
-    expect(resynthesized.types.length, original.types.length);
+    expect(resynthesized.types.length, original.types.length,
+        reason: '$desc types');
     for (int i = 0; i < resynthesized.types.length; i++) {
       compareClassElements(
           resynthesized.types[i], original.types[i], original.types[i].name);
     }
     expect(resynthesized.topLevelVariables.length,
-        original.topLevelVariables.length);
+        original.topLevelVariables.length,
+        reason: '$desc topLevelVariables');
     for (int i = 0; i < resynthesized.topLevelVariables.length; i++) {
       String name = resynthesized.topLevelVariables[i].name;
       compareTopLevelVariableElements(
@@ -275,25 +279,29 @@
               .singleWhere((TopLevelVariableElement e) => e.name == name),
           'variable $name');
     }
-    expect(resynthesized.functions.length, original.functions.length);
+    expect(resynthesized.functions.length, original.functions.length,
+        reason: '$desc functions');
     for (int i = 0; i < resynthesized.functions.length; i++) {
       compareFunctionElements(resynthesized.functions[i], original.functions[i],
           'function ${original.functions[i].name}');
     }
     expect(resynthesized.functionTypeAliases.length,
-        original.functionTypeAliases.length);
+        original.functionTypeAliases.length,
+        reason: '$desc functionTypeAliases');
     for (int i = 0; i < resynthesized.functionTypeAliases.length; i++) {
       compareFunctionTypeAliasElements(
           resynthesized.functionTypeAliases[i],
           original.functionTypeAliases[i],
           original.functionTypeAliases[i].name);
     }
-    expect(resynthesized.enums.length, original.enums.length);
+    expect(resynthesized.enums.length, original.enums.length,
+        reason: '$desc enums');
     for (int i = 0; i < resynthesized.enums.length; i++) {
       compareClassElements(
           resynthesized.enums[i], original.enums[i], original.enums[i].name);
     }
-    expect(resynthesized.accessors.length, original.accessors.length);
+    expect(resynthesized.accessors.length, original.accessors.length,
+        reason: '$desc accessors');
     for (int i = 0; i < resynthesized.accessors.length; i++) {
       String name = resynthesized.accessors[i].name;
       if (original.accessors[i].isGetter) {
@@ -509,8 +517,13 @@
         expect(rType, isNotNull, reason: desc);
         compareConstAsts(rType.name, oType.name, desc);
         compareConstAsts(rConstructor.name, oConstructor.name, desc);
-        compareConstAstLists(rType.typeArguments?.arguments,
-            oType.typeArguments?.arguments, desc);
+        // In strong mode type inference is performed, so that
+        // `C<int> v = new C();` is serialized as `C<int> v = new C<int>();`.
+        // So, if there are not type arguments originally, not need to check.
+        if (oType.typeArguments?.arguments?.isNotEmpty ?? false) {
+          compareConstAstLists(rType.typeArguments?.arguments,
+              oType.typeArguments?.arguments, desc);
+        }
         compareConstAstLists(
             r.argumentList.arguments, o.argumentList.arguments, desc);
       } else if (o is AnnotationImpl && r is AnnotationImpl) {
@@ -772,15 +785,18 @@
       ImportElementImpl original, String desc) {
     compareUriReferencedElements(resynthesized, original, desc);
     expect(resynthesized.importedLibrary.location,
-        original.importedLibrary.location);
-    expect(resynthesized.prefixOffset, original.prefixOffset);
+        original.importedLibrary.location,
+        reason: '$desc importedLibrary location');
+    expect(resynthesized.prefixOffset, original.prefixOffset,
+        reason: '$desc prefixOffset');
     if (original.prefix == null) {
-      expect(resynthesized.prefix, isNull);
+      expect(resynthesized.prefix, isNull, reason: '$desc prefix');
     } else {
       comparePrefixElements(
           resynthesized.prefix, original.prefix, original.prefix.name);
     }
-    expect(resynthesized.combinators.length, original.combinators.length);
+    expect(resynthesized.combinators.length, original.combinators.length,
+        reason: '$desc combinators');
     for (int i = 0; i < resynthesized.combinators.length; i++) {
       compareNamespaceCombinators(
           resynthesized.combinators[i], original.combinators[i]);
@@ -847,12 +863,14 @@
       NamespaceCombinator resynthesized, NamespaceCombinator original) {
     if (original is ShowElementCombinatorImpl &&
         resynthesized is ShowElementCombinatorImpl) {
-      expect(resynthesized.shownNames, original.shownNames);
-      expect(resynthesized.offset, original.offset);
-      expect(resynthesized.end, original.end);
+      expect(resynthesized.shownNames, original.shownNames,
+          reason: 'shownNames');
+      expect(resynthesized.offset, original.offset, reason: 'offset');
+      expect(resynthesized.end, original.end, reason: 'end');
     } else if (original is HideElementCombinatorImpl &&
         resynthesized is HideElementCombinatorImpl) {
-      expect(resynthesized.hiddenNames, original.hiddenNames);
+      expect(resynthesized.hiddenNames, original.hiddenNames,
+          reason: 'hiddenNames');
     } else if (resynthesized.runtimeType != original.runtimeType) {
       fail(
           'Type mismatch: expected ${original.runtimeType}, got ${resynthesized.runtimeType}');
@@ -1071,9 +1089,10 @@
   void compareUriReferencedElements(UriReferencedElementImpl resynthesized,
       UriReferencedElementImpl original, String desc) {
     compareElements(resynthesized, original, desc);
-    expect(resynthesized.uri, original.uri);
-    expect(resynthesized.uriOffset, original.uriOffset, reason: desc);
-    expect(resynthesized.uriEnd, original.uriEnd, reason: desc);
+    expect(resynthesized.uri, original.uri, reason: '$desc uri');
+    expect(resynthesized.uriOffset, original.uriOffset,
+        reason: '$desc uri uriOffset');
+    expect(resynthesized.uriEnd, original.uriEnd, reason: '$desc uriEnd');
   }
 
   void compareVariableElements(
@@ -2876,6 +2895,71 @@
 ''');
   }
 
+  test_defaultValue_refersToGenericClass_constructor() {
+    checkLibrary('''
+class B<T> {
+  const B();
+}
+class C<T> {
+  const C([B<T> b = const B()]);
+}
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_constructor2() {
+    checkLibrary('''
+abstract class A<T> {}
+class B<T> implements A<T> {
+  const B();
+}
+class C<T> implements A<Iterable<T>> {
+  const C([A<T> a = const B()]);
+}
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_functionG() {
+    checkLibrary('''
+class B<T> {
+  const B();
+}
+void foo<T>([B<T> b = const B()]) {}
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_methodG() {
+    checkLibrary('''
+class B<T> {
+  const B();
+}
+class C {
+  void foo<T>([B<T> b = const B()]) {}
+}
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_methodG_classG() {
+    checkLibrary('''
+class B<T1, T2> {
+  const B();
+}
+class C<E1> {
+  void foo<E2>([B<E1, E2> b = const B()]) {}
+}
+''');
+  }
+
+  test_defaultValue_refersToGenericClass_methodNG() {
+    checkLibrary('''
+class B<T> {
+  const B();
+}
+class C<T> {
+  void foo([B<T> b = const B()]) {}
+}
+''');
+  }
+
   test_enum_documented() {
     checkLibrary('''
 // Extra comment so doc comment offset != 0
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 9c50c86..27bebab 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -1484,7 +1484,7 @@
 
   test_constExpr_binary_add() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 + 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.add
@@ -1497,7 +1497,7 @@
   test_constExpr_binary_and() {
     UnlinkedVariable variable =
         serializeVariableText('const v = true && false;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushTrue,
       UnlinkedConstOperation.pushFalse,
       UnlinkedConstOperation.and
@@ -1506,7 +1506,7 @@
 
   test_constExpr_binary_bitAnd() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 & 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.bitAnd
@@ -1518,7 +1518,7 @@
 
   test_constExpr_binary_bitOr() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 | 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.bitOr
@@ -1530,7 +1530,7 @@
 
   test_constExpr_binary_bitShiftLeft() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 << 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.bitShiftLeft
@@ -1542,7 +1542,7 @@
 
   test_constExpr_binary_bitShiftRight() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 >> 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.bitShiftRight
@@ -1554,7 +1554,7 @@
 
   test_constExpr_binary_bitXor() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 ^ 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.bitXor
@@ -1566,7 +1566,7 @@
 
   test_constExpr_binary_divide() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 / 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.divide
@@ -1578,7 +1578,7 @@
 
   test_constExpr_binary_equal() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 == 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.equal
@@ -1590,7 +1590,7 @@
 
   test_constExpr_binary_equal_not() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 != 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.notEqual
@@ -1602,7 +1602,7 @@
 
   test_constExpr_binary_floorDivide() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 ~/ 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.floorDivide
@@ -1614,7 +1614,7 @@
 
   test_constExpr_binary_greater() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 > 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.greater
@@ -1626,7 +1626,7 @@
 
   test_constExpr_binary_greaterEqual() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 >= 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.greaterEqual
@@ -1638,7 +1638,7 @@
 
   test_constExpr_binary_less() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 < 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.less
@@ -1650,7 +1650,7 @@
 
   test_constExpr_binary_lessEqual() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 <= 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.lessEqual
@@ -1662,7 +1662,7 @@
 
   test_constExpr_binary_modulo() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 % 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.modulo
@@ -1674,7 +1674,7 @@
 
   test_constExpr_binary_multiply() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 * 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.multiply
@@ -1687,7 +1687,7 @@
   test_constExpr_binary_or() {
     UnlinkedVariable variable =
         serializeVariableText('const v = false || true;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushFalse,
       UnlinkedConstOperation.pushTrue,
       UnlinkedConstOperation.or
@@ -1696,7 +1696,7 @@
 
   test_constExpr_binary_subtract() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 - 2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.subtract
@@ -1736,7 +1736,7 @@
   test_constExpr_conditional() {
     UnlinkedVariable variable =
         serializeVariableText('const v = true ? 1 : 2;', allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushTrue,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
@@ -1780,20 +1780,24 @@
 const v = foo(5, () => 42);
 foo(a, b) {}
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushLocalFunctionReference,
-      UnlinkedConstOperation.invokeMethodRef
-    ], ints: [
-      5,
-      0,
-      0,
-      0,
-      2
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
-          expectedKind: ReferenceKind.topLevelFunction)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushLocalFunctionReference,
+          UnlinkedConstOperation.invokeMethodRef
+        ],
+        ints: [
+          5,
+          0,
+          0,
+          0,
+          2
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+              expectedKind: ReferenceKind.topLevelFunction)
+        ]);
   }
 
   test_constExpr_functionExpression_asArgument_multiple() {
@@ -1804,23 +1808,27 @@
 const v = foo(5, () => 42, () => 43);
 foo(a, b, c) {}
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushLocalFunctionReference,
-      UnlinkedConstOperation.pushLocalFunctionReference,
-      UnlinkedConstOperation.invokeMethodRef
-    ], ints: [
-      5,
-      0,
-      0,
-      0,
-      1,
-      0,
-      3
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
-          expectedKind: ReferenceKind.topLevelFunction)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushLocalFunctionReference,
+          UnlinkedConstOperation.pushLocalFunctionReference,
+          UnlinkedConstOperation.invokeMethodRef
+        ],
+        ints: [
+          5,
+          0,
+          0,
+          0,
+          1,
+          0,
+          3
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+              expectedKind: ReferenceKind.topLevelFunction)
+        ]);
   }
 
   test_constExpr_functionExpression_inConstructorInitializers() {
@@ -1851,7 +1859,7 @@
 }
 const v = const C<int, String>.named();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -1883,7 +1891,7 @@
 import 'a.dart';
 const v = const C<int, String>.named();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -1917,7 +1925,7 @@
 import 'a.dart' as p;
 const v = const p.C<int, String>.named();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -1947,7 +1955,7 @@
 }
 const v = const C<int, String>();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -1976,7 +1984,7 @@
 import 'a.dart';
 const v = const C<int, String>();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2005,7 +2013,7 @@
 import 'a.dart' as p;
 const v = const p.C<int, String>();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2032,7 +2040,7 @@
 }
 const v = const C.named();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2058,7 +2066,7 @@
 import 'a.dart';
 const v = const C.named();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2085,7 +2093,7 @@
 import 'a.dart' as p;
 const v = const p.C.named();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2112,7 +2120,7 @@
     // Ints: ^pointer 3 4
     // Doubles: ^pointer
     // Strings: ^pointer 'e' 'g' 'f' ''
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushDouble,
@@ -2154,7 +2162,7 @@
 import 'a.dart';
 const v = const C();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2177,7 +2185,7 @@
 import 'a.dart' as p;
 const v = const p.C();
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2198,7 +2206,7 @@
 const v = const C.foo();
 ''',
         allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2219,7 +2227,7 @@
 const v = const C.foo();
 ''',
         allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2247,7 +2255,7 @@
 const v = const p.C.foo();
 ''',
         allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2272,7 +2280,7 @@
 const v = const p.C.foo();
 ''',
         allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2294,7 +2302,7 @@
 const v = const Foo();
 ''',
         allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2309,7 +2317,7 @@
   test_constExpr_invokeMethodRef_identical() {
     UnlinkedVariable variable =
         serializeVariableText('const v = identical(42, null);');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushNull,
       UnlinkedConstOperation.invokeMethodRef
@@ -2332,7 +2340,7 @@
 }
 const int v = C.length;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'length',
@@ -2355,7 +2363,7 @@
 import 'a.dart' as p;
 const int v = p.C.length;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'length',
@@ -2373,7 +2381,7 @@
 const String a = 'aaa';
 const int v = a.length;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'length',
@@ -2393,7 +2401,7 @@
 }
 const int v = C.F.length;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'length',
@@ -2416,7 +2424,7 @@
 import 'a.dart';
 const int v = a.length;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'length',
@@ -2440,7 +2448,7 @@
 import 'a.dart' as p;
 const int v = p.a.length;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'length',
@@ -2458,7 +2466,7 @@
   test_constExpr_length_parenthesizedBinaryTarget() {
     UnlinkedVariable variable =
         serializeVariableText('const v = ("abc" + "edf").length;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.add,
@@ -2473,7 +2481,7 @@
   test_constExpr_length_parenthesizedStringTarget() {
     UnlinkedVariable variable =
         serializeVariableText('const v = ("abc").length;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.extractProperty
     ], strings: [
@@ -2485,7 +2493,7 @@
   test_constExpr_length_stringLiteralTarget() {
     UnlinkedVariable variable =
         serializeVariableText('const v = "abc".length;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.extractProperty
     ], strings: [
@@ -2496,14 +2504,14 @@
 
   test_constExpr_makeSymbol() {
     UnlinkedVariable variable = serializeVariableText('const v = #a.bb.ccc;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.makeSymbol], strings: ['a.bb.ccc']);
   }
 
   test_constExpr_makeTypedList() {
     UnlinkedVariable variable =
         serializeVariableText('const v = const <int>[11, 22, 33];');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
@@ -2522,7 +2530,7 @@
   test_constExpr_makeTypedList_dynamic() {
     UnlinkedVariable variable =
         serializeVariableText('const v = const <dynamic>[11, 22, 33];');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
@@ -2540,7 +2548,7 @@
   test_constExpr_makeTypedMap() {
     UnlinkedVariable variable = serializeVariableText(
         'const v = const <int, String>{11: "aaa", 22: "bbb", 33: "ccc"};');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.pushInt,
@@ -2568,7 +2576,7 @@
   test_constExpr_makeTypedMap_dynamic() {
     UnlinkedVariable variable = serializeVariableText(
         'const v = const <dynamic, dynamic>{11: "aaa", 22: "bbb", 33: "ccc"};');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.pushInt,
@@ -2594,7 +2602,7 @@
   test_constExpr_makeUntypedList() {
     UnlinkedVariable variable =
         serializeVariableText('const v = const [11, 22, 33];');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
@@ -2610,7 +2618,7 @@
   test_constExpr_makeUntypedMap() {
     UnlinkedVariable variable = serializeVariableText(
         'const v = const {11: "aaa", 22: "bbb", 33: "ccc"};');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.pushInt,
@@ -2632,7 +2640,7 @@
 
   test_constExpr_parenthesized() {
     UnlinkedVariable variable = serializeVariableText('const v = (1 + 2) * 3;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.add,
@@ -2647,7 +2655,7 @@
 
   test_constExpr_prefix_complement() {
     UnlinkedVariable variable = serializeVariableText('const v = ~2;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.complement
     ], ints: [
@@ -2657,7 +2665,7 @@
 
   test_constExpr_prefix_negate() {
     UnlinkedVariable variable = serializeVariableText('const v = -(2);');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.negate
     ], ints: [
@@ -2667,7 +2675,7 @@
 
   test_constExpr_prefix_not() {
     UnlinkedVariable variable = serializeVariableText('const v = !true;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushTrue,
       UnlinkedConstOperation.not
     ]);
@@ -2675,31 +2683,31 @@
 
   test_constExpr_pushDouble() {
     UnlinkedVariable variable = serializeVariableText('const v = 123.4567;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushDouble], doubles: [123.4567]);
   }
 
   test_constExpr_pushFalse() {
     UnlinkedVariable variable = serializeVariableText('const v = false;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushFalse]);
   }
 
   test_constExpr_pushInt() {
     UnlinkedVariable variable = serializeVariableText('const v = 1;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushInt], ints: [1]);
   }
 
   test_constExpr_pushInt_max() {
     UnlinkedVariable variable = serializeVariableText('const v = 0xFFFFFFFF;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushInt,], ints: [0xFFFFFFFF]);
   }
 
   test_constExpr_pushInt_negative() {
     UnlinkedVariable variable = serializeVariableText('const v = -5;');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.negate
     ], ints: [
@@ -2710,27 +2718,27 @@
   test_constExpr_pushLongInt() {
     UnlinkedVariable variable =
         serializeVariableText('const v = 0xA123456789ABCDEF012345678;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushLongInt],
         ints: [4, 0xA, 0x12345678, 0x9ABCDEF0, 0x12345678]);
   }
 
   test_constExpr_pushLongInt_min2() {
     UnlinkedVariable variable = serializeVariableText('const v = 0x100000000;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushLongInt], ints: [2, 1, 0,]);
   }
 
   test_constExpr_pushLongInt_min3() {
     UnlinkedVariable variable =
         serializeVariableText('const v = 0x10000000000000000;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushLongInt], ints: [3, 1, 0, 0,]);
   }
 
   test_constExpr_pushNull() {
     UnlinkedVariable variable = serializeVariableText('const v = null;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushNull]);
   }
 
@@ -2739,7 +2747,7 @@
 class C {}
 const v = C;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'C',
@@ -2752,7 +2760,7 @@
 enum C {V1, V2, V3}
 const v = C;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'C',
@@ -2765,7 +2773,7 @@
 enum C {V1, V2, V3}
 const v = C.V1;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'V1',
@@ -2786,7 +2794,7 @@
 import 'a.dart';
 const v = C.V1;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'V1',
@@ -2803,7 +2811,7 @@
 enum C {V1, V2, V3}
 const v = C.values;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'values',
@@ -2824,7 +2832,7 @@
 import 'a.dart';
 const v = C.values;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'values',
@@ -2843,7 +2851,7 @@
 }
 const v = C.F;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'F',
@@ -2866,7 +2874,7 @@
 import 'a.dart';
 const v = C.F;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'F',
@@ -2890,7 +2898,7 @@
 import 'a.dart' as p;
 const v = p.C.F;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'F',
@@ -2910,7 +2918,7 @@
   static const b = null;
 }
 ''').fields[0];
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'b',
@@ -2928,7 +2936,7 @@
 }
 const v = C.x;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'x',
@@ -2951,7 +2959,7 @@
 import 'a.dart';
 const v = C.x;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'x',
@@ -2975,7 +2983,7 @@
 import 'a.dart' as p;
 const v = p.C.x;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'x',
@@ -2995,7 +3003,7 @@
 }
 const v = C.m;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'm',
@@ -3018,7 +3026,7 @@
 import 'a.dart';
 const v = C.m;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'm',
@@ -3042,7 +3050,7 @@
 import 'a.dart' as p;
 const v = p.C.m;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'm',
@@ -3062,7 +3070,7 @@
   static m() {}
 }
 ''').fields[0];
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'm',
@@ -3078,7 +3086,7 @@
 f() {}
 const v = f;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'f',
@@ -3096,7 +3104,7 @@
 import 'a.dart';
 const v = f;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'f',
@@ -3114,7 +3122,7 @@
 import 'a.dart' as p;
 const v = p.f;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'f',
@@ -3130,7 +3138,7 @@
 int get x => null;
 const v = x;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'x',
@@ -3144,7 +3152,7 @@
 import 'a.dart';
 const v = x;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'x',
@@ -3158,7 +3166,7 @@
 import 'a.dart' as p;
 const v = p.x;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'x',
@@ -3172,7 +3180,7 @@
 const int a = 1;
 const v = a;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'a',
@@ -3186,7 +3194,7 @@
 import 'a.dart';
 const v = a;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
@@ -3200,7 +3208,7 @@
 import 'a.dart' as p;
 const v = p.a;
 ''');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) {
@@ -3219,7 +3227,7 @@
 ''';
     UnlinkedVariable variable =
         serializeClassText(text, allowErrors: true).fields[0];
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) {
@@ -3234,7 +3242,7 @@
 const v = foo;
 ''',
         allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'foo',
@@ -3250,7 +3258,7 @@
 const v = C.foo;
 ''',
         allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'foo',
@@ -3274,7 +3282,7 @@
 const v = p.C.foo;
 ''',
         allowErrors: true);
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, null, 'foo',
@@ -3291,14 +3299,14 @@
   test_constExpr_pushString_adjacent() {
     UnlinkedVariable variable =
         serializeVariableText('const v = "aaa" "b" "ccc";');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushString], strings: ['aaabccc']);
   }
 
   test_constExpr_pushString_adjacent_interpolation() {
     UnlinkedVariable variable =
         serializeVariableText(r'const v = "aaa" "bb ${42} bbb" "cccc";');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.pushInt,
@@ -3321,7 +3329,7 @@
   test_constExpr_pushString_interpolation() {
     UnlinkedVariable variable =
         serializeVariableText(r'const v = "aaa ${42} bbb";');
-    _assertUnlinkedConst(variable.constExpr, operators: [
+    _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedConstOperation.pushString,
       UnlinkedConstOperation.pushInt,
       UnlinkedConstOperation.pushString,
@@ -3337,13 +3345,13 @@
 
   test_constExpr_pushString_simple() {
     UnlinkedVariable variable = serializeVariableText('const v = "abc";');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushString], strings: ['abc']);
   }
 
   test_constExpr_pushTrue() {
     UnlinkedVariable variable = serializeVariableText('const v = true;');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushTrue]);
   }
 
@@ -6345,26 +6353,32 @@
 A a = new A();
 final v = (a.b.c.f[1] = 5);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushReference,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToIndex,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      5,
-      1
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'f',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
-                new _PrefixExpectation(ReferenceKind.unresolved, 'b'),
-                new _PrefixExpectation(
-                    ReferenceKind.topLevelPropertyAccessor, 'a')
-              ])
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushReference,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToIndex,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          5,
+          1
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
+                    new _PrefixExpectation(ReferenceKind.unresolved, 'b'),
+                    new _PrefixExpectation(
+                        ReferenceKind.topLevelPropertyAccessor, 'a')
+                  ])
+        ]);
   }
 
   test_expr_assignToIndex_ofIndexExpression() {
@@ -6384,37 +6398,45 @@
 A a = new A();
 final v = (a.b[1].c[2].f[3] = 5);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      // 5
-      UnlinkedConstOperation.pushInt,
-      // a.b[1]
-      UnlinkedConstOperation.pushReference,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.extractIndex,
-      // c[2]
-      UnlinkedConstOperation.extractProperty,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.extractIndex,
-      // f[3] = 5
-      UnlinkedConstOperation.extractProperty,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToIndex,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      5,
-      1,
-      2,
-      3,
-    ], strings: [
-      'c',
-      'f'
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null,
-              'b', expectedKind: ReferenceKind.unresolved, prefixExpectations: [
-            new _PrefixExpectation(ReferenceKind.topLevelPropertyAccessor, 'a')
-          ])
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          // 5
+          UnlinkedConstOperation.pushInt,
+          // a.b[1]
+          UnlinkedConstOperation.pushReference,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.extractIndex,
+          // c[2]
+          UnlinkedConstOperation.extractProperty,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.extractIndex,
+          // f[3] = 5
+          UnlinkedConstOperation.extractProperty,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToIndex,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          5,
+          1,
+          2,
+          3,
+        ],
+        strings: [
+          'c',
+          'f'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'b',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(
+                        ReferenceKind.topLevelPropertyAccessor, 'a')
+                  ])
+        ]);
   }
 
   test_expr_assignToIndex_ofTopLevelVariable() {
@@ -6425,20 +6447,26 @@
 List<int> a = <int>[0, 1, 2];
 final v = (a[1] = 5);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushReference,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToIndex,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      5,
-      1,
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
-          expectedKind: ReferenceKind.topLevelPropertyAccessor)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushReference,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToIndex,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          5,
+          1,
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+              expectedKind: ReferenceKind.topLevelPropertyAccessor)
+        ]);
   }
 
   test_expr_assignToProperty_ofInstanceCreation() {
@@ -6451,22 +6479,28 @@
 }
 final v = (new C().f = 5);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.invokeConstructor,
-      UnlinkedConstOperation.assignToProperty,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      5,
-      0,
-      0,
-    ], strings: [
-      'f'
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'C',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.invokeConstructor,
+          UnlinkedConstOperation.assignToProperty,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          5,
+          0,
+          0,
+        ],
+        strings: [
+          'f'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_expr_assignToRef_classStaticField() {
@@ -6479,20 +6513,26 @@
 }
 final v = (C.f = 1);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToRef,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      1,
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'f',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
-              ])
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToRef,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          1,
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
+                  ])
+        ]);
   }
 
   test_expr_assignToRef_fieldSequence() {
@@ -6512,23 +6552,29 @@
 A a = new A();
 final v = (a.b.c.f = 1);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToRef,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      1,
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'f',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
-                new _PrefixExpectation(ReferenceKind.unresolved, 'b'),
-                new _PrefixExpectation(
-                    ReferenceKind.topLevelPropertyAccessor, 'a')
-              ])
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToRef,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          1,
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
+                    new _PrefixExpectation(ReferenceKind.unresolved, 'b'),
+                    new _PrefixExpectation(
+                        ReferenceKind.topLevelPropertyAccessor, 'a')
+                  ])
+        ]);
   }
 
   test_expr_assignToRef_postfixDecrement() {
@@ -6559,17 +6605,23 @@
 int a = 0;
 final v = (a = 1);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToRef,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      1,
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
-          expectedKind: ReferenceKind.topLevelPropertyAccessor)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToRef,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          1,
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+              expectedKind: ReferenceKind.topLevelPropertyAccessor)
+        ]);
   }
 
   test_expr_assignToRef_topLevelVariable_imported() {
@@ -6585,17 +6637,23 @@
 import 'a.dart';
 final v = (a = 1);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToRef,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      1,
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
-          expectedKind: ReferenceKind.topLevelPropertyAccessor)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToRef,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          1,
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
+              expectedKind: ReferenceKind.topLevelPropertyAccessor)
+        ]);
   }
 
   test_expr_assignToRef_topLevelVariable_imported_withPrefix() {
@@ -6611,20 +6669,26 @@
 import 'a.dart' as p;
 final v = (p.a = 1);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToRef,
-    ], assignmentOperators: [
-      (UnlinkedExprAssignOperator.assign)
-    ], ints: [
-      1,
-    ], strings: [], referenceValidators: [
-      (EntityRef r) {
-        return checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
-            expectedKind: ReferenceKind.topLevelPropertyAccessor,
-            expectedPrefix: 'p');
-      }
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToRef,
+        ],
+        assignmentOperators: [
+          (UnlinkedExprAssignOperator.assign)
+        ],
+        ints: [
+          1,
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) {
+            return checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
+                expectedKind: ReferenceKind.topLevelPropertyAccessor,
+                expectedPrefix: 'p');
+          }
+        ]);
   }
 
   test_expr_cascadeSection_assignToIndex() {
@@ -6638,28 +6702,34 @@
 final C c = new C();
 final v = c.items..[1] = 2;
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushReference,
-      //   ..[1] = 2
-      UnlinkedConstOperation.cascadeSectionBegin,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToIndex,
-      // c
-      UnlinkedConstOperation.cascadeSectionEnd,
-    ], assignmentOperators: [
-      UnlinkedExprAssignOperator.assign,
-    ], ints: [
-      2,
-      1
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'items',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(
-                    ReferenceKind.topLevelPropertyAccessor, 'c'),
-              ])
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushReference,
+          //   ..[1] = 2
+          UnlinkedConstOperation.cascadeSectionBegin,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToIndex,
+          // c
+          UnlinkedConstOperation.cascadeSectionEnd,
+        ],
+        assignmentOperators: [
+          UnlinkedExprAssignOperator.assign,
+        ],
+        ints: [
+          2,
+          1
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'items',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(
+                        ReferenceKind.topLevelPropertyAccessor, 'c'),
+                  ])
+        ]);
   }
 
   test_expr_cascadeSection_assignToProperty() {
@@ -6673,35 +6743,41 @@
 }
 final v = new C()..f1 = 1..f2 += 2;
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      // new C()
-      UnlinkedConstOperation.invokeConstructor,
-      //   ..f1 = 1
-      UnlinkedConstOperation.cascadeSectionBegin,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToProperty,
-      // C
-      UnlinkedConstOperation.cascadeSectionEnd,
-      //   ..f2 += 2
-      UnlinkedConstOperation.cascadeSectionBegin,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToProperty,
-      // C
-      UnlinkedConstOperation.cascadeSectionEnd,
-    ], assignmentOperators: [
-      UnlinkedExprAssignOperator.assign,
-      UnlinkedExprAssignOperator.plus,
-    ], ints: [
-      0, 0, // new C()
-      1, // f1 = 1
-      2, // f2 += 2
-    ], strings: [
-      'f1',
-      'f2',
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'C',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          // new C()
+          UnlinkedConstOperation.invokeConstructor,
+          //   ..f1 = 1
+          UnlinkedConstOperation.cascadeSectionBegin,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToProperty,
+          // C
+          UnlinkedConstOperation.cascadeSectionEnd,
+          //   ..f2 += 2
+          UnlinkedConstOperation.cascadeSectionBegin,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToProperty,
+          // C
+          UnlinkedConstOperation.cascadeSectionEnd,
+        ],
+        assignmentOperators: [
+          UnlinkedExprAssignOperator.assign,
+          UnlinkedExprAssignOperator.plus,
+        ],
+        ints: [
+          0, 0, // new C()
+          1, // f1 = 1
+          2, // f2 += 2
+        ],
+        strings: [
+          'f1',
+          'f2',
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_expr_cascadeSection_embedded() {
@@ -6722,55 +6798,61 @@
   ..b = (new B()..fb = 2)
   ..fa2 = 3;
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      // new A()
-      UnlinkedConstOperation.invokeConstructor,
-      // ..fa1 = 1
-      UnlinkedConstOperation.cascadeSectionBegin,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToProperty,
-      UnlinkedConstOperation.cascadeSectionEnd,
-      // ..b
-      UnlinkedConstOperation.cascadeSectionBegin,
-      //   new B()
-      UnlinkedConstOperation.invokeConstructor,
-      //   ..fb = 2
-      UnlinkedConstOperation.cascadeSectionBegin,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToProperty,
-      UnlinkedConstOperation.cascadeSectionEnd,
-      // ..b = <pop value>
-      UnlinkedConstOperation.assignToProperty,
-      UnlinkedConstOperation.cascadeSectionEnd,
-      // ..fa2 = 3
-      UnlinkedConstOperation.cascadeSectionBegin,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.assignToProperty,
-      UnlinkedConstOperation.cascadeSectionEnd,
-    ], assignmentOperators: [
-      UnlinkedExprAssignOperator.assign,
-      UnlinkedExprAssignOperator.assign,
-      UnlinkedExprAssignOperator.assign,
-      UnlinkedExprAssignOperator.assign,
-    ], ints: [
-      0,
-      0,
-      1,
-      0,
-      0,
-      2,
-      3,
-    ], strings: [
-      'fa1',
-      'fb',
-      'b',
-      'fa2',
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'A',
-          expectedKind: ReferenceKind.classOrEnum),
-      (EntityRef r) => checkTypeRef(r, null, null, 'B',
-          expectedKind: ReferenceKind.classOrEnum),
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          // new A()
+          UnlinkedConstOperation.invokeConstructor,
+          // ..fa1 = 1
+          UnlinkedConstOperation.cascadeSectionBegin,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToProperty,
+          UnlinkedConstOperation.cascadeSectionEnd,
+          // ..b
+          UnlinkedConstOperation.cascadeSectionBegin,
+          //   new B()
+          UnlinkedConstOperation.invokeConstructor,
+          //   ..fb = 2
+          UnlinkedConstOperation.cascadeSectionBegin,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToProperty,
+          UnlinkedConstOperation.cascadeSectionEnd,
+          // ..b = <pop value>
+          UnlinkedConstOperation.assignToProperty,
+          UnlinkedConstOperation.cascadeSectionEnd,
+          // ..fa2 = 3
+          UnlinkedConstOperation.cascadeSectionBegin,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.assignToProperty,
+          UnlinkedConstOperation.cascadeSectionEnd,
+        ],
+        assignmentOperators: [
+          UnlinkedExprAssignOperator.assign,
+          UnlinkedExprAssignOperator.assign,
+          UnlinkedExprAssignOperator.assign,
+          UnlinkedExprAssignOperator.assign,
+        ],
+        ints: [
+          0,
+          0,
+          1,
+          0,
+          0,
+          2,
+          3,
+        ],
+        strings: [
+          'fa1',
+          'fb',
+          'b',
+          'fa2',
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'A',
+              expectedKind: ReferenceKind.classOrEnum),
+          (EntityRef r) => checkTypeRef(r, null, null, 'B',
+              expectedKind: ReferenceKind.classOrEnum),
+        ]);
   }
 
   test_expr_cascadeSection_invokeMethod() {
@@ -6784,35 +6866,40 @@
 final A a = new A();
 final v = a..m(5).abs()..m(6);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      // a
-      UnlinkedConstOperation.pushReference,
-      //   ..m(5)
-      UnlinkedConstOperation.cascadeSectionBegin,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.invokeMethod,
-      //   ..abs()
-      UnlinkedConstOperation.invokeMethod,
-      // a
-      UnlinkedConstOperation.cascadeSectionEnd,
-      //   ..m(6)
-      UnlinkedConstOperation.cascadeSectionBegin,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.invokeMethod,
-      // a
-      UnlinkedConstOperation.cascadeSectionEnd,
-    ], ints: [
-      5, 0, 1, // m(5)
-      0, 0, // abs()
-      6, 0, 1, // m(5)
-    ], strings: [
-      'm',
-      'abs',
-      'm',
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
-          expectedKind: ReferenceKind.topLevelPropertyAccessor),
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          // a
+          UnlinkedConstOperation.pushReference,
+          //   ..m(5)
+          UnlinkedConstOperation.cascadeSectionBegin,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.invokeMethod,
+          //   ..abs()
+          UnlinkedConstOperation.invokeMethod,
+          // a
+          UnlinkedConstOperation.cascadeSectionEnd,
+          //   ..m(6)
+          UnlinkedConstOperation.cascadeSectionBegin,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.invokeMethod,
+          // a
+          UnlinkedConstOperation.cascadeSectionEnd,
+        ],
+        ints: [
+          5, 0, 1, // m(5)
+          0, 0, // abs()
+          6, 0, 1, // m(5)
+        ],
+        strings: [
+          'm',
+          'abs',
+          'm',
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+              expectedKind: ReferenceKind.topLevelPropertyAccessor),
+        ]);
   }
 
   test_expr_extractIndex_ofClassField() {
@@ -6825,21 +6912,26 @@
 }
 final v = new C().items[5];
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.invokeConstructor,
-      UnlinkedConstOperation.extractProperty,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.extractIndex,
-    ], ints: [
-      0,
-      0,
-      5
-    ], strings: [
-      'items'
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'C',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.invokeConstructor,
+          UnlinkedConstOperation.extractProperty,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.extractIndex,
+        ],
+        ints: [
+          0,
+          0,
+          5
+        ],
+        strings: [
+          'items'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_expr_extractProperty_ofInvokeConstructor() {
@@ -6852,18 +6944,23 @@
 }
 final v = new C().f;
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.invokeConstructor,
-      UnlinkedConstOperation.extractProperty,
-    ], ints: [
-      0,
-      0
-    ], strings: [
-      'f'
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'C',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.invokeConstructor,
+          UnlinkedConstOperation.extractProperty,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        strings: [
+          'f'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_expr_functionExpression_asArgument() {
@@ -6874,20 +6971,24 @@
 final v = foo(5, () => 42);
 foo(a, b) {}
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushLocalFunctionReference,
-      UnlinkedConstOperation.invokeMethodRef
-    ], ints: [
-      5,
-      0,
-      0,
-      0,
-      2
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
-          expectedKind: ReferenceKind.topLevelFunction)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushLocalFunctionReference,
+          UnlinkedConstOperation.invokeMethodRef
+        ],
+        ints: [
+          5,
+          0,
+          0,
+          0,
+          2
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+              expectedKind: ReferenceKind.topLevelFunction)
+        ]);
   }
 
   test_expr_functionExpression_asArgument_multiple() {
@@ -6898,23 +6999,27 @@
 final v = foo(5, () => 42, () => 43);
 foo(a, b, c) {}
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushLocalFunctionReference,
-      UnlinkedConstOperation.pushLocalFunctionReference,
-      UnlinkedConstOperation.invokeMethodRef
-    ], ints: [
-      5,
-      0,
-      0,
-      0,
-      1,
-      0,
-      3
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
-          expectedKind: ReferenceKind.topLevelFunction)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushLocalFunctionReference,
+          UnlinkedConstOperation.pushLocalFunctionReference,
+          UnlinkedConstOperation.invokeMethodRef
+        ],
+        ints: [
+          5,
+          0,
+          0,
+          0,
+          1,
+          0,
+          3
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+              expectedKind: ReferenceKind.topLevelFunction)
+        ]);
   }
 
   test_expr_functionExpression_withBlockBody() {
@@ -6924,7 +7029,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = () { return 42; };
 ''');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         isValidConst: false,
         operators: [UnlinkedConstOperation.pushLocalFunctionReference],
         ints: [0, 0]);
@@ -6937,7 +7042,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = () => 42;
 ''');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         isValidConst: false,
         operators: [UnlinkedConstOperation.pushLocalFunctionReference],
         ints: [0, 0]);
@@ -6950,7 +7055,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = ((a, b) {return 42;})(1, 2);
 ''');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         isValidConst: false, operators: [UnlinkedConstOperation.pushNull]);
   }
 
@@ -6961,7 +7066,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = ((a, b) => 42)(1, 2);
 ''');
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         isValidConst: false, operators: [UnlinkedConstOperation.pushNull]);
   }
 
@@ -6975,28 +7080,33 @@
 }
 final v = new C().m(1, b: 2, c: 3);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.invokeConstructor,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.invokeMethod,
-    ], ints: [
-      0,
-      0,
-      1,
-      2,
-      3,
-      2,
-      1
-    ], strings: [
-      'b',
-      'c',
-      'm'
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'C',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.invokeConstructor,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.invokeMethod,
+        ],
+        ints: [
+          0,
+          0,
+          1,
+          2,
+          3,
+          2,
+          1
+        ],
+        strings: [
+          'b',
+          'c',
+          'm'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_expr_invokeMethodRef_instance() {
@@ -7016,25 +7126,30 @@
 A a = new A();
 final v = a.b.c.m(10, 20);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.invokeMethodRef,
-    ], ints: [
-      10,
-      20,
-      0,
-      2
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'm',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
-                new _PrefixExpectation(ReferenceKind.unresolved, 'b'),
-                new _PrefixExpectation(
-                    ReferenceKind.topLevelPropertyAccessor, 'a')
-              ])
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.invokeMethodRef,
+        ],
+        ints: [
+          10,
+          20,
+          0,
+          2
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'm',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
+                    new _PrefixExpectation(ReferenceKind.unresolved, 'b'),
+                    new _PrefixExpectation(
+                        ReferenceKind.topLevelPropertyAccessor, 'a')
+                  ])
+        ]);
   }
 
   test_expr_invokeMethodRef_static_importedWithPrefix() {
@@ -7052,20 +7167,25 @@
 import 'a.dart' as p;
 final v = p.C.m();
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.invokeMethodRef,
-    ], ints: [
-      0,
-      0
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'm',
-              expectedKind: ReferenceKind.method,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
-                new _PrefixExpectation(ReferenceKind.prefix, 'p')
-              ])
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.invokeMethodRef,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'm',
+                  expectedKind: ReferenceKind.method,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                        absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                  ])
+        ]);
   }
 
   test_expr_invokeMethodRef_with_reference_arg() {
@@ -7077,18 +7197,22 @@
 final u = null;
 final v = f(u);
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushReference,
-      UnlinkedConstOperation.invokeMethodRef
-    ], ints: [
-      0,
-      1
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'u',
-          expectedKind: ReferenceKind.topLevelPropertyAccessor),
-      (EntityRef r) => checkTypeRef(r, null, null, 'f',
-          expectedKind: ReferenceKind.topLevelFunction)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushReference,
+          UnlinkedConstOperation.invokeMethodRef
+        ],
+        ints: [
+          0,
+          1
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'u',
+              expectedKind: ReferenceKind.topLevelPropertyAccessor),
+          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+              expectedKind: ReferenceKind.topLevelFunction)
+        ]);
   }
 
   test_expr_throwException() {
@@ -7098,15 +7222,18 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = throw 1 + 2;
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.add,
-      UnlinkedConstOperation.throwException,
-    ], ints: [
-      1,
-      2
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.add,
+          UnlinkedConstOperation.throwException,
+        ],
+        ints: [
+          1,
+          2
+        ]);
   }
 
   test_expr_typeCast() {
@@ -7116,15 +7243,19 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = 42 as num;
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.typeCast,
-    ], ints: [
-      42
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'num',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.typeCast,
+        ],
+        ints: [
+          42
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'num',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_expr_typeCheck() {
@@ -7134,15 +7265,19 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = 42 is num;
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.typeCheck,
-    ], ints: [
-      42
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'num',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.typeCheck,
+        ],
+        ints: [
+          42
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'num',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_field() {
@@ -7152,7 +7287,7 @@
     expect(variable.isConst, isFalse);
     expect(variable.isStatic, isFalse);
     expect(variable.isFinal, isFalse);
-    expect(variable.constExpr, isNull);
+    expect(variable.initializer, isNull);
     expect(findExecutable('i', executables: cls.executables), isNull);
     expect(findExecutable('i=', executables: cls.executables), isNull);
     expect(unlinkedUnits[0].publicNamespace.names, hasLength(1));
@@ -7164,7 +7299,7 @@
     UnlinkedVariable variable =
         serializeClassText('class C { static const int i = 0; }').fields[0];
     expect(variable.isConst, isTrue);
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushInt], ints: [0]);
   }
 
@@ -7185,7 +7320,7 @@
     UnlinkedVariable variable =
         serializeClassText('class C { final int i = 0; }').fields[0];
     expect(variable.isFinal, isTrue);
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.pushInt], ints: [0]);
   }
 
@@ -7196,21 +7331,26 @@
   static int m() => 42;
 }''').fields[0];
     expect(variable.isFinal, isTrue);
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.invokeMethodRef,
-      UnlinkedConstOperation.add,
-    ], ints: [
-      1,
-      0,
-      0
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'm',
-              expectedKind: ReferenceKind.method,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
-              ])
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.invokeMethodRef,
+          UnlinkedConstOperation.add,
+        ],
+        ints: [
+          1,
+          0,
+          0
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'm',
+                  expectedKind: ReferenceKind.method,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
+                  ])
+        ]);
   }
 
   test_field_final_typeParameter() {
@@ -7219,7 +7359,7 @@
   final f = <T>[];
 }''').fields[0];
     expect(variable.isFinal, isTrue);
-    _assertUnlinkedConst(variable.constExpr,
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
         operators: [UnlinkedConstOperation.makeTypedList],
         ints: [0],
         referenceValidators: [(EntityRef r) => checkParamTypeRef(r, 1)]);
@@ -7307,7 +7447,7 @@
     UnlinkedVariable variable =
         serializeClassText('class C { static int i; }').fields[0];
     expect(variable.isStatic, isTrue);
-    expect(variable.constExpr, isNull);
+    expect(variable.initializer, isNull);
     expect(unlinkedUnits[0].publicNamespace.names, hasLength(1));
     expect(unlinkedUnits[0].publicNamespace.names[0].name, 'C');
     expect(unlinkedUnits[0].publicNamespace.names[0].members, hasLength(1));
@@ -7326,7 +7466,7 @@
         serializeClassText('class C { static final int i = 0; }').fields[0];
     expect(variable.isStatic, isTrue);
     expect(variable.isFinal, isTrue);
-    expect(variable.constExpr, isNull);
+    expect(variable.initializer.bodyExpr, isNull);
   }
 
   test_field_static_final_untyped() {
@@ -7337,7 +7477,7 @@
     }
     UnlinkedVariable variable =
         serializeClassText('class C { static final x = 0; }').fields[0];
-    expect(variable.constExpr, isNotNull);
+    expect(variable.initializer.bodyExpr, isNotNull);
   }
 
   test_field_untyped() {
@@ -7348,7 +7488,7 @@
     }
     UnlinkedVariable variable =
         serializeClassText('class C { var x = 0; }').fields[0];
-    expect(variable.constExpr, isNotNull);
+    expect(variable.initializer.bodyExpr, isNotNull);
   }
 
   test_fully_linked_references_follow_other_references() {
@@ -9757,7 +9897,7 @@
     UnlinkedVariable variable =
         serializeVariableText('final int i = 0;', variableName: 'i');
     expect(variable.isFinal, isTrue);
-    expect(variable.constExpr, isNull);
+    expect(variable.initializer.bodyExpr, isNull);
   }
 
   test_variable_final_top_level_untyped() {
@@ -9767,7 +9907,7 @@
       return;
     }
     UnlinkedVariable variable = serializeVariableText('final v = 0;');
-    expect(variable.constExpr, isNotNull);
+    expect(variable.initializer.bodyExpr, isNotNull);
   }
 
   test_variable_implicit_dynamic() {
@@ -10002,23 +10142,29 @@
 int a = 0;
 final v = $expr;
     ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.add,
-      UnlinkedConstOperation.assignToRef,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.add,
-    ], assignmentOperators: [
-      expectedAssignOperator
-    ], ints: [
-      1,
-      2,
-      3
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
-          expectedKind: ReferenceKind.topLevelPropertyAccessor)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.add,
+          UnlinkedConstOperation.assignToRef,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.add,
+        ],
+        assignmentOperators: [
+          expectedAssignOperator
+        ],
+        ints: [
+          1,
+          2,
+          3
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+              expectedKind: ReferenceKind.topLevelPropertyAccessor)
+        ]);
   }
 
   void _assertCodeRange(CodeRange codeRange, int offset, int length) {
@@ -10063,18 +10209,24 @@
 int a = 0;
 final v = $expr;
 ''');
-    _assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
-      UnlinkedConstOperation.assignToRef,
-      UnlinkedConstOperation.pushInt,
-      UnlinkedConstOperation.add,
-    ], assignmentOperators: [
-      expectedAssignmentOperator
-    ], ints: [
-      2
-    ], strings: [], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
-          expectedKind: ReferenceKind.topLevelPropertyAccessor)
-    ]);
+    _assertUnlinkedConst(variable.initializer.bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedConstOperation.assignToRef,
+          UnlinkedConstOperation.pushInt,
+          UnlinkedConstOperation.add,
+        ],
+        assignmentOperators: [
+          expectedAssignmentOperator
+        ],
+        ints: [
+          2
+        ],
+        strings: [],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+              expectedKind: ReferenceKind.topLevelPropertyAccessor)
+        ]);
   }
 
   /**
diff --git a/pkg/analyzer/test/src/task/dart_work_manager_test.dart b/pkg/analyzer/test/src/task/dart_work_manager_test.dart
index cb8fb46..da36f87 100644
--- a/pkg/analyzer/test/src/task/dart_work_manager_test.dart
+++ b/pkg/analyzer/test/src/task/dart_work_manager_test.dart
@@ -774,9 +774,16 @@
 
   Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
 
+  @override
+  final ReentrantSynchronousStream<InvalidatedResult> onResultInvalidated =
+      new ReentrantSynchronousStream<InvalidatedResult>();
+
   _InternalAnalysisContextMock() {
     privateAnalysisCachePartition = new UniversalCachePartition(this);
     analysisCache = new AnalysisCache([privateAnalysisCachePartition]);
+    analysisCache.onResultInvalidated.listen((InvalidatedResult event) {
+      onResultInvalidated.add(event);
+    });
   }
 
   @override
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index a4bc6b7..a686740 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -2318,6 +2318,168 @@
     expect(f.type.toString(), '() → dynamic');
   }
 
+  void test_inferredType_customBinaryOp() {
+    var mainUnit = checkFile('''
+class C {
+  bool operator*(C other) => true;
+}
+C c;
+var x = c*c;
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_customBinaryOp_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  bool operator*(C other) => true;
+}
+abstract class C implements I {}
+C c;
+var x = c*c;
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_customIndexOp() {
+    var mainUnit = checkFile('''
+class C {
+  bool operator[](int index) => true;
+}
+C c;
+var x = c[0];
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_customIndexOp_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  bool operator[](int index) => true;
+}
+abstract class C implements I {}
+C c;
+var x = c[0];
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_customUnaryOp() {
+    var mainUnit = checkFile('''
+class C {
+  bool operator-() => true;
+}
+C c;
+var x = -c;
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_customUnaryOp_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  bool operator-() => true;
+}
+abstract class C implements I {}
+C c;
+var x = -c;
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_extractMethodTearOff() {
+    var mainUnit = checkFile('''
+class C {
+  bool g() => true;
+}
+C f() => null;
+var x = f().g;
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), '() → bool');
+  }
+
+  void test_inferredType_extractMethodTearOff_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  bool g() => true;
+}
+abstract class C implements I {}
+C f() => null;
+var x = f().g;
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), '() → bool');
+  }
+
+  void test_inferredType_extractProperty() {
+    var mainUnit = checkFile('''
+class C {
+  bool b;
+}
+C f() => null;
+var x = f().b;
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_extractProperty_prefixedIdentifier() {
+    var mainUnit = checkFile('''
+class C {
+  bool b;
+}
+C c;
+var x = c.b;
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_extractProperty_prefixedIdentifier_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  bool b;
+}
+abstract class C implements I {}
+C c;
+var x = c.b;
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_extractProperty_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  bool b;
+}
+abstract class C implements I {}
+C f() => null;
+var x = f().b;
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
   void test_inferredType_fromTopLevelExecutableTearoff() {
     var mainUnit = checkFile('''
 var v = print;
@@ -2326,6 +2488,33 @@
     expect(v.type.toString(), '(Object) → void');
   }
 
+  void test_inferredType_invokeMethod() {
+    var mainUnit = checkFile('''
+class C {
+  bool g() => true;
+}
+C f() => null;
+var x = f().g();
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
+  void test_inferredType_invokeMethod_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  bool g() => true;
+}
+abstract class C implements I {}
+C f() => null;
+var x = f().g();
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'bool');
+  }
+
   void test_inferredType_isEnum() {
     var mainUnit = checkFile('''
 enum E { v1 }
@@ -2362,6 +2551,60 @@
     expect(x.type.toString(), 'Map<String, () → int>');
   }
 
+  void test_inferredType_opAssignToProperty_prefixedIdentifier() {
+    var mainUnit = checkFile('''
+class C {
+  num n;
+}
+C c;
+var x = (c.n *= null);
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'num');
+  }
+
+  void test_inferredType_opAssignToProperty_prefixedIdentifier_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  num n;
+}
+abstract class C implements I {}
+C c;
+var x = (c.n *= null);
+''');
+    var x = mainUnit.topLevelVariables[1];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'num');
+  }
+
+  void test_inferredType_opAssignToProperty() {
+    var mainUnit = checkFile('''
+class C {
+  num n;
+}
+C f() => null;
+var x = (f().n *= null);
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'num');
+  }
+
+  void test_inferredType_opAssignToProperty_viaInterface() {
+    var mainUnit = checkFile('''
+class I {
+  num n;
+}
+abstract class C implements I {}
+C f() => null;
+var x = (f().n *= null);
+''');
+    var x = mainUnit.topLevelVariables[0];
+    expect(x.name, 'x');
+    expect(x.type.toString(), 'num');
+  }
+
   void test_inferStaticsTransitively() {
     addFile(
         '''
diff --git a/pkg/analyzer/test/src/util/fast_uri_test.dart b/pkg/analyzer/test/src/util/fast_uri_test.dart
new file mode 100644
index 0000000..060904e
--- /dev/null
+++ b/pkg/analyzer/test/src/util/fast_uri_test.dart
@@ -0,0 +1,169 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.test.src.util.fast_uri_test;
+
+import 'package:analyzer/src/util/fast_uri.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(_FastUriTest);
+}
+
+@reflectiveTest
+class _FastUriTest {
+  static final isInstanceOf<FastUri> isFastUri = new isInstanceOf<FastUri>();
+
+  void test_parse_absolute_dart() {
+    _compareTextWithCoreUri('dart:core');
+  }
+
+  void test_parse_absolute_file() {
+    _compareTextWithCoreUri('file:///Users/scheglov/util/fast_uri.dart');
+  }
+
+  void test_parse_absolute_folder_withSlashAtTheEnd() {
+    _compareTextWithCoreUri('file:///Users/scheglov/util/');
+  }
+
+  void test_parse_absolute_package() {
+    _compareTextWithCoreUri('package:analyzer/src/util/fast_uri.dart');
+  }
+
+  void test_parse_notFast_hasAuthority() {
+    Uri uri = FastUri.parse('http://www.google.com/pages/about.html');
+    expect(uri, isNot(isFastUri));
+  }
+
+  void test_parse_notFast_hasPort() {
+    Uri uri = FastUri.parse('http://www.google.com:8080/pages/about.html');
+    expect(uri, isNot(isFastUri));
+  }
+
+  void test_parse_relative_down() {
+    _compareTextWithCoreUri('util/fast_uri.dart');
+  }
+
+  void test_parse_relative_up() {
+    _compareTextWithCoreUri('../util/fast_uri.dart');
+  }
+
+  void test_resolve() {
+    Uri uri1 = FastUri.parse('package:analyzer/aaa/bbbb/c.dart');
+    Uri uri2 = uri1.resolve('dd.dart');
+    _compareUris(uri2, Uri.parse('package:analyzer/aaa/bbbb/dd.dart'));
+  }
+
+  void test_resolveUri_absolute() {
+    _checkResolveUri('package:analyzer/aaa/b.dart', 'package:path/style.dart',
+        'package:path/style.dart');
+  }
+
+  void test_resolveUri_endWithSlash_onlyName() {
+    _checkResolveUri('package:analyzer/aaa/bbbb/', 'cc.dart',
+        'package:analyzer/aaa/bbbb/cc.dart');
+  }
+
+  void test_resolveUri_nameStartsWithOneDot() {
+    _checkResolveUri('package:analyzer/aaa/bbbb/ccc.dart', '.name.dart',
+        'package:analyzer/aaa/bbbb/.name.dart');
+  }
+
+  void test_resolveUri_nameStartsWithTwoDots() {
+    _checkResolveUri('package:analyzer/aaa/bbbb/ccc.dart', '..name.dart',
+        'package:analyzer/aaa/bbbb/..name.dart');
+  }
+
+  void test_resolveUri_noSlash_onlyName() {
+    _checkResolveUri('dart:core', 'int.dart', 'dart:core/int.dart');
+  }
+
+  void test_resolveUri_onlyName() {
+    _checkResolveUri('package:analyzer/aaa/bbbb/ccc.dart', 'dd.dart',
+        'package:analyzer/aaa/bbbb/dd.dart');
+  }
+
+  void test_resolveUri_pathHasOneDot() {
+    _checkResolveUri('package:analyzer/aaa/bbbb/ccc.dart', 'dd/./ee.dart',
+        'package:analyzer/aaa/bbbb/dd/ee.dart');
+  }
+
+  void test_resolveUri_pathHasTwoDots() {
+    _checkResolveUri('package:analyzer/aaa/bbbb/ccc.dart', 'dd/../ee.dart',
+        'package:analyzer/aaa/bbbb/ee.dart');
+  }
+
+  void test_resolveUri_pathStartsWithOneDot() {
+    _checkResolveUri('package:analyzer/aaa/bbbb/ccc.dart', './ddd.dart',
+        'package:analyzer/aaa/bbbb/ddd.dart');
+  }
+
+  void test_resolveUri_pathStartsWithTwoDots() {
+    _checkResolveUri('package:analyzer/aaa/bbbb/ccc.dart', '../ddd.dart',
+        'package:analyzer/aaa/ddd.dart');
+  }
+
+  void test_resolveUri_pathWithSubFolder() {
+    Uri uri1 = FastUri.parse('package:analyzer/aaa/bbbb/ccc.dart');
+    Uri uri2 = FastUri.parse('dd/eeee.dart');
+    expect(uri1, isFastUri);
+    expect(uri2, isFastUri);
+    Uri uri3 = uri1.resolveUri(uri2);
+    expect(uri3, isFastUri);
+    _compareUris(uri3, Uri.parse('package:analyzer/aaa/bbbb/dd/eeee.dart'));
+  }
+
+  void _checkResolveUri(String srcText, String relText, String targetText) {
+    Uri src = FastUri.parse(srcText);
+    Uri rel = FastUri.parse(relText);
+    expect(src, isFastUri);
+    expect(rel, isFastUri);
+    Uri target = src.resolveUri(rel);
+    expect(target, isFastUri);
+    _compareUris(target, Uri.parse(targetText));
+  }
+
+  void _compareTextWithCoreUri(String text, {bool isFast: true}) {
+    Uri fastUri = FastUri.parse(text);
+    Uri coreUri = Uri.parse(text);
+    if (isFast) {
+      expect(fastUri, isFastUri);
+    }
+    _compareUris(fastUri, coreUri);
+  }
+
+  void _compareUris(Uri fastUri, Uri coreUri) {
+    expect(fastUri.authority, coreUri.authority);
+    expect(fastUri.data, coreUri.data);
+    expect(fastUri.fragment, coreUri.fragment);
+    expect(fastUri.hasAbsolutePath, coreUri.hasAbsolutePath);
+    expect(fastUri.hasAuthority, coreUri.hasAuthority);
+    expect(fastUri.hasEmptyPath, coreUri.hasEmptyPath);
+    expect(fastUri.hasFragment, coreUri.hasFragment);
+    expect(fastUri.hasPort, coreUri.hasPort);
+    expect(fastUri.hasQuery, coreUri.hasQuery);
+    expect(fastUri.hasScheme, coreUri.hasScheme);
+    expect(fastUri.host, coreUri.host);
+    expect(fastUri.isAbsolute, coreUri.isAbsolute);
+    if (coreUri.scheme == 'http' || coreUri.scheme == 'https') {
+      expect(fastUri.origin, coreUri.origin);
+    }
+    expect(fastUri.path, coreUri.path);
+    expect(fastUri.pathSegments, coreUri.pathSegments);
+    expect(fastUri.port, coreUri.port);
+    expect(fastUri.query, coreUri.query);
+    expect(fastUri.queryParameters, coreUri.queryParameters);
+    expect(fastUri.queryParametersAll, coreUri.queryParametersAll);
+    expect(fastUri.scheme, coreUri.scheme);
+    expect(fastUri.userInfo, coreUri.userInfo);
+    // Object
+    expect(fastUri.hashCode, coreUri.hashCode);
+    expect(fastUri == coreUri, isTrue);
+    expect(coreUri == fastUri, isTrue);
+  }
+}
diff --git a/pkg/analyzer/test/src/util/test_all.dart b/pkg/analyzer/test/src/util/test_all.dart
index d992264..6091c5b 100644
--- a/pkg/analyzer/test/src/util/test_all.dart
+++ b/pkg/analyzer/test/src/util/test_all.dart
@@ -9,6 +9,7 @@
 import '../../utils.dart';
 import 'absolute_path_test.dart' as absolute_path_test;
 import 'asserts_test.dart' as asserts_test;
+import 'fast_uri_test.dart' as fast_uri_test;
 import 'glob_test.dart' as glob_test;
 import 'lru_map_test.dart' as lru_map_test;
 import 'yaml_test.dart' as yaml_test;
@@ -19,6 +20,7 @@
   group('util tests', () {
     absolute_path_test.main();
     asserts_test.main();
+    fast_uri_test.main();
     glob_test.main();
     lru_map_test.main();
     yaml_test.main();
diff --git a/pkg/analyzer/tool/summary/build_sdk_summaries.dart b/pkg/analyzer/tool/summary/build_sdk_summaries.dart
index 9d1c34b..1bbd4da 100644
--- a/pkg/analyzer/tool/summary/build_sdk_summaries.dart
+++ b/pkg/analyzer/tool/summary/build_sdk_summaries.dart
@@ -139,9 +139,10 @@
  */
 void _extractSingleOutput(String inputPath, int field, String outputPath) {
   List<int> bytes = new File(inputPath).readAsBytesSync();
-  fb.BufferPointer root = new fb.BufferPointer.fromBytes(bytes);
-  fb.BufferPointer table = root.derefObject();
-  List<int> fieldBytes = const fb.Uint8ListReader().vTableGet(table, field);
+  fb.BufferContext root = new fb.BufferContext.fromBytes(bytes);
+  int tableOffset = root.derefObject(0);
+  List<int> fieldBytes =
+      const fb.Uint8ListReader().vTableGet(root, tableOffset, field);
   new File(outputPath).writeAsBytesSync(fieldBytes, mode: FileMode.WRITE_ONLY);
 }
 
diff --git a/pkg/analyzer/tool/summary/dump_inferred_types.dart b/pkg/analyzer/tool/summary/dump_inferred_types.dart
index 135783e..1ff2c6e 100644
--- a/pkg/analyzer/tool/summary/dump_inferred_types.dart
+++ b/pkg/analyzer/tool/summary/dump_inferred_types.dart
@@ -5,9 +5,13 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/base.dart';
 import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary/link.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 
 /**
@@ -16,7 +20,9 @@
  */
 main(List<String> args) {
   SummaryDataStore summaryDataStore = new SummaryDataStore(args);
-  InferredTypeCollector collector = new InferredTypeCollector();
+  InferredTypeCollector collector = new InferredTypeCollector(
+      (String uri) => summaryDataStore.linkedMap[uri],
+      (String uri) => summaryDataStore.unlinkedMap[uri]);
   collector.visitSummaryDataStore(summaryDataStore);
   collector.dumpCollectedTypes();
 }
@@ -28,8 +34,14 @@
 class InferredTypeCollector {
   UnlinkedUnit unlinkedUnit;
   LinkedUnit linkedUnit;
+  CompilationUnitElementForLink unitForLink;
   final Map<String, String> inferredTypes = <String, String>{};
   List<String> typeParamsInScope = <String>[];
+  final Linker _linker;
+
+  InferredTypeCollector(
+      GetDependencyCallback getDependency, GetUnitCallback getUnit)
+      : _linker = new Linker({}, getDependency, getUnit, true);
 
   /**
    * If an inferred type exists matching the given [slot], record that it is the
@@ -88,6 +100,67 @@
   }
 
   /**
+   * Format the given [type] as a string.  Unlike the type's [toString] method,
+   * this formats types using their complete URI to avoid ambiguity.
+   */
+  String formatDartType(DartType type) {
+    if (type is FunctionType) {
+      List<String> argStrings =
+          type.normalParameterTypes.map(formatDartType).toList();
+      List<DartType> optionalParameterTypes = type.optionalParameterTypes;
+      if (optionalParameterTypes.isNotEmpty) {
+        List<String> optionalArgStrings =
+            optionalParameterTypes.map(formatDartType).toList();
+        argStrings.add('[${optionalArgStrings.join(', ')}]');
+      }
+      Map<String, DartType> namedParameterTypes = type.namedParameterTypes;
+      if (namedParameterTypes.isNotEmpty) {
+        List<String> namedArgStrings = <String>[];
+        namedParameterTypes.forEach((String name, DartType type) {
+          namedArgStrings.add('$name: ${formatDartType(type)}');
+        });
+        argStrings.add('{${namedArgStrings.join(', ')}}');
+      }
+      return '(${argStrings.join(', ')}) → ${formatDartType(type.returnType)}';
+    } else if (type is InterfaceType) {
+      if (type.typeArguments.isNotEmpty) {
+        // TODO(paulberry): implement.
+        throw new UnimplementedError('type args');
+      }
+      return formatElement(type.element);
+    } else if (type is DynamicTypeImpl) {
+      return type.toString();
+    } else {
+      // TODO(paulberry): implement.
+      throw new UnimplementedError(
+          "Don't know how to format type of type ${type.runtimeType}");
+    }
+  }
+
+  /**
+   * Format the given [element] as a string, assuming it represents a type.
+   * Unlike the element's [toString] method, this formats elements using their
+   * complete URI to avoid ambiguity.
+   */
+  String formatElement(Element element) {
+    if (element is ClassElementForLink_Class ||
+        element is MethodElementForLink ||
+        element is ClassElementForLink_Enum ||
+        element is SpecialTypeElementForLink ||
+        element is FunctionTypeAliasElementForLink ||
+        element is TopLevelFunctionElementForLink) {
+      return element.toString();
+    } else if (element is FunctionElementForLink_Local_NonSynthetic) {
+      return formatDartType(element.type);
+    } else if (element is UndefinedElementForLink) {
+      return '???';
+    } else {
+      throw new UnimplementedError(
+          "Don't know how to format reference of type ${element.runtimeType}");
+    }
+  }
+
+  /**
    * Interpret the given [param] as a parameter in a synthetic typedef, and
    * format it as a string.
    */
@@ -117,47 +190,8 @@
    * `typeof()` for clarity.
    */
   String formatReference(int index, {bool typeOf: false}) {
-    LinkedReference linkedRef = linkedUnit.references[index];
-    switch (linkedRef.kind) {
-      case ReferenceKind.classOrEnum:
-      case ReferenceKind.function:
-      case ReferenceKind.propertyAccessor:
-      case ReferenceKind.topLevelFunction:
-      case ReferenceKind.method:
-      case ReferenceKind.typedef:
-      case ReferenceKind.prefix:
-      case ReferenceKind.topLevelPropertyAccessor:
-        break;
-      default:
-        // TODO(paulberry): fix this case.
-        return 'BAD(${JSON.encode(linkedRef.toJson())})';
-    }
-    int containingReference;
-    String name;
-    if (index < unlinkedUnit.references.length) {
-      containingReference = unlinkedUnit.references[index].prefixReference;
-      name = unlinkedUnit.references[index].name;
-    } else {
-      containingReference = linkedRef.containingReference;
-      name = linkedRef.name;
-    }
-    String result;
-    if (containingReference != 0) {
-      result = '${formatReference(containingReference)}.$name';
-    } else {
-      result = name;
-    }
-    if (linkedRef.kind == ReferenceKind.function) {
-      assert(name.isEmpty);
-      result += 'localFunction[${linkedRef.localIndex}]';
-    }
-    if (!typeOf ||
-        linkedRef.kind == ReferenceKind.classOrEnum ||
-        linkedRef.kind == ReferenceKind.typedef) {
-      return result;
-    } else {
-      return 'typeof($result)';
-    }
+    ReferenceableElementForLink element = unitForLink.resolveRef(index);
+    return formatElement(element);
   }
 
   /**
@@ -260,12 +294,16 @@
       if (partOfUris.contains(libraryUriString)) {
         return;
       }
+      if (libraryUriString.startsWith('dart:')) {
+        // Don't bother dumping inferred types from the SDK.
+        return;
+      }
       Uri libraryUri = Uri.parse(libraryUriString);
       UnlinkedUnit definingUnlinkedUnit =
           summaryDataStore.unlinkedMap[libraryUriString];
       if (definingUnlinkedUnit != null) {
         visitUnit(
-            definingUnlinkedUnit, linkedLibrary.units[0], libraryUriString);
+            definingUnlinkedUnit, linkedLibrary.units[0], libraryUriString, 0);
         for (int i = 0;
             i < definingUnlinkedUnit.publicNamespace.parts.length;
             i++) {
@@ -276,8 +314,8 @@
           UnlinkedUnit unlinkedUnit =
               summaryDataStore.unlinkedMap[unitUriString];
           if (unlinkedUnit != null) {
-            visitUnit(
-                unlinkedUnit, linkedLibrary.units[i + 1], libraryUriString);
+            visitUnit(unlinkedUnit, linkedLibrary.units[i + 1],
+                libraryUriString, i + 1);
           }
         }
       }
@@ -289,11 +327,14 @@
    * by [unlinkedUnit] and [linkedUnit], which has URI [libraryUriString].
    */
   void visitUnit(UnlinkedUnit unlinkedUnit, LinkedUnit linkedUnit,
-      String libraryUriString) {
+      String libraryUriString, int unitNum) {
     this.unlinkedUnit = unlinkedUnit;
     this.linkedUnit = linkedUnit;
+    this.unitForLink =
+        _linker.getLibrary(Uri.parse(libraryUriString)).units[unitNum];
     visit(unlinkedUnit, unlinkedUnit.toMap(), libraryUriString);
     this.unlinkedUnit = null;
     this.linkedUnit = null;
+    this.unitForLink = null;
   }
 }
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index 51dad39..4f9018e 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -749,9 +749,9 @@
       out('int get size => 1;');
       out();
       out('@override');
-      out('${idlPrefix(name)} read(fb.BufferPointer bp) {');
+      out('${idlPrefix(name)} read(fb.BufferContext bc, int offset) {');
       indent(() {
-        out('int index = const fb.Uint8Reader().read(bp);');
+        out('int index = const fb.Uint8Reader().read(bc, offset);');
         out('return index < $count ? ${idlPrefix(name)}.values[index] : $def;');
       });
       out('}');
@@ -766,9 +766,10 @@
     out('class $implName extends Object with $mixinName'
         ' implements ${idlPrefix(name)} {');
     indent(() {
-      out('final fb.BufferPointer _bp;');
+      out('final fb.BufferContext _bc;');
+      out('final int _bcOffset;');
       out();
-      out('$implName(this._bp);');
+      out('$implName(this._bc, this._bcOffset);');
       out();
       // Write cache fields.
       for (idlModel.FieldDeclaration field in cls.fields) {
@@ -824,7 +825,7 @@
         } else {
           out('$returnType get $fieldName {');
           indent(() {
-            String readExpr = '$readCode.vTableGet(_bp, $index, $def)';
+            String readExpr = '$readCode.vTableGet(_bc, _bcOffset, $index, $def)';
             out('_$fieldName ??= $readExpr;');
             out('return _$fieldName;');
           });
@@ -906,7 +907,7 @@
       out('const $readerName();');
       out();
       out('@override');
-      out('$implName createObject(fb.BufferPointer bp) => new $implName(bp);');
+      out('$implName createObject(fb.BufferContext bc, int offset) => new $implName(bc, offset);');
     });
     out('}');
   }
@@ -915,8 +916,8 @@
     String name = cls.name;
     out('${idlPrefix(name)} read$name(List<int> buffer) {');
     indent(() {
-      out('fb.BufferPointer rootRef = new fb.BufferPointer.fromBytes(buffer);');
-      out('return const _${name}Reader().read(rootRef);');
+      out('fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);');
+      out('return const _${name}Reader().read(rootRef, 0);');
     });
     out('}');
   }
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 4d80c61..2c6b74e 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -397,7 +397,7 @@
 
     // Setup embedding.
     EmbedderUriResolver embedderUriResolver =
-        new EmbedderUriResolver(embedderMap);
+        new EmbedderUriResolver(new EmbedderSdk(embedderMap));
     if (embedderUriResolver.length == 0) {
       // The embedder uri resolver has no mappings. Use the default Dart SDK
       // uri resolver.
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 631d29b..98d931a 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -31,6 +31,7 @@
 /// Implements the [Compiler] using a [api.CompilerInput] for supplying the
 /// sources.
 class CompilerImpl extends Compiler {
+  final Measurer measurer;
   api.CompilerInput provider;
   api.CompilerDiagnostics handler;
   Packages packages;
@@ -50,7 +51,10 @@
   CompilerImpl(this.provider, api.CompilerOutput outputProvider, this.handler,
       CompilerOptions options,
       {MakeBackendFuncion makeBackend, MakeReporterFunction makeReporter})
-      : resolvedUriTranslator = new ForwardingResolvedUriTranslator(),
+      // NOTE: allocating measurer is done upfront to ensure the wallclock is
+      // started before other computations.
+      : measurer = new Measurer(enableTaskMeasurements: options.verbose),
+        resolvedUriTranslator = new ForwardingResolvedUriTranslator(),
         super(
             options: options,
             outputProvider: outputProvider,
@@ -60,9 +64,10 @@
     _Environment env = environment;
     env.compiler = this;
     tasks.addAll([
-      userHandlerTask = new GenericTask('Diagnostic handler', this),
-      userProviderTask = new GenericTask('Input provider', this),
-      userPackagesDiscoveryTask = new GenericTask('Package discovery', this),
+      userHandlerTask = new GenericTask('Diagnostic handler', measurer),
+      userProviderTask = new GenericTask('Input provider', measurer),
+      userPackagesDiscoveryTask =
+          new GenericTask('Package discovery', measurer),
     ]);
   }
 
@@ -205,11 +210,13 @@
 
   Future<Null> setupSdk() {
     Future future = new Future.value(null);
-    if (options.resolutionInput != null) {
-      reporter.log('Reading serialized data from ${options.resolutionInput}');
-      future = callUserProvider(options.resolutionInput)
-          .then((SourceFile sourceFile) {
-        serialization.deserializeFromText(sourceFile.slowText());
+    if (options.resolutionInputs != null) {
+      future = Future.forEach(options.resolutionInputs, (Uri resolutionInput) {
+        reporter.log('Reading serialized data from ${resolutionInput}');
+        return callUserProvider(resolutionInput).then((SourceFile sourceFile) {
+          serialization.deserializeFromText(
+              resolutionInput, sourceFile.slowText());
+        });
       });
     }
     if (resolvedUriTranslator.isNotSet) {
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index 4e0c2ef..b0f01b8 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -24,12 +24,16 @@
 
 class ClosureTask extends CompilerTask {
   Map<Node, ClosureClassMap> closureMappingCache;
+  Compiler compiler;
   ClosureTask(Compiler compiler)
       : closureMappingCache = new Map<Node, ClosureClassMap>(),
-        super(compiler);
+        compiler = compiler,
+        super(compiler.measurer);
 
   String get name => "Closure Simplifier";
 
+  DiagnosticReporter get reporter => compiler.reporter;
+
   ClosureClassMap computeClosureToClassMapping(ResolvedAst resolvedAst) {
     return measure(() {
       Element element = resolvedAst.element;
@@ -171,6 +175,9 @@
   List<FunctionElement> get nestedClosures => const <FunctionElement>[];
 
   @override
+  bool get hasConstant => false;
+
+  @override
   ConstantExpression get constant => null;
 }
 
@@ -310,6 +317,9 @@
   }
 
   @override
+  bool get hasConstant => false;
+
+  @override
   ConstantExpression get constant => null;
 }
 
@@ -1050,7 +1060,7 @@
     MemberElement enclosing = element.memberContext;
     enclosing.nestedClosures.add(callElement);
     globalizedElement.addMember(callElement, reporter);
-    globalizedElement.computeAllClassMembers(compiler);
+    globalizedElement.computeAllClassMembers(compiler.resolution);
     // The nested function's 'this' is the same as the one for the outer
     // function. It could be [null] if we are inside a static method.
     ThisLocal thisElement = closureData.thisLocal;
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index fba8401..013e997 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -52,6 +52,17 @@
   static const String conditionalDirectives = '--conditional-directives';
 
   // Experimental flags.
+
+  // Considerations about this feature (esp. locations where generalizations
+  // or changes are required for full support of generic methods) are marked
+  // with 'GENERIC_METHODS'. The approach taken is to parse generic methods,
+  // introduce AST nodes for them, generate corresponding types (such that
+  // front end treatment is consistent with the code that programmers wrote),
+  // but considering all method type variables to have bound `dynamic` no
+  // matter which bound they have syntactically (such that their value as types
+  // is unchecked), and then replacing method type variables by a `DynamicType`
+  // (such that the backend does not need to take method type arguments into
+  // account).
   static const String genericMethodSyntax = '--generic-method-syntax';
   static const String resolveOnly = '--resolve-only';
 }
diff --git a/pkg/compiler/lib/src/common/backend_api.dart b/pkg/compiler/lib/src/common/backend_api.dart
index e7f3632..080a03b 100644
--- a/pkg/compiler/lib/src/common/backend_api.dart
+++ b/pkg/compiler/lib/src/common/backend_api.dart
@@ -8,7 +8,7 @@
 
 import '../common.dart';
 import '../common/codegen.dart' show CodegenImpact;
-import '../common/resolution.dart' show ResolutionImpact, Frontend;
+import '../common/resolution.dart' show ResolutionImpact, Frontend, Target;
 import '../compile_time_constants.dart'
     show BackendConstantEnvironment, ConstantCompilerTask;
 import '../compiler.dart' show Compiler;
@@ -44,7 +44,7 @@
 import 'tasks.dart' show CompilerTask;
 import 'work.dart' show ItemCompilationContext;
 
-abstract class Backend {
+abstract class Backend implements Target {
   final Compiler compiler;
 
   Backend(this.compiler);
@@ -256,10 +256,8 @@
   /// defines the implementation of [element].
   MethodElement resolveExternalFunction(MethodElement element) => element;
 
-  /// Returns `true` if [library] is a backend specific library whose members
-  /// have special treatment, such as being allowed to extends blacklisted
-  /// classes or member being eagerly resolved.
-  bool isBackendLibrary(LibraryElement library) {
+  @override
+  bool isTargetSpecificLibrary(LibraryElement library) {
     // TODO(johnniwinther): Remove this when patching is only done by the
     // JavaScript backend.
     Uri canonicalUri = library.canonicalUri;
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 53f6190..7380911 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -7,8 +7,8 @@
 import '../common.dart';
 import '../compiler.dart' show Compiler;
 import '../constants/expressions.dart' show ConstantExpression;
-import '../core_types.dart' show CoreTypes;
-import '../dart_types.dart' show DartType, InterfaceType;
+import '../core_types.dart' show CoreClasses, CoreTypes;
+import '../dart_types.dart' show DartType, InterfaceType, Types;
 import '../elements/elements.dart'
     show
         AstElement,
@@ -17,6 +17,7 @@
         ExecutableElement,
         FunctionElement,
         FunctionSignature,
+        LibraryElement,
         MetadataAnnotation,
         ResolvedAst,
         TypedefElement;
@@ -195,11 +196,22 @@
   ResolutionImpact getResolutionImpact(Element element);
 }
 
+/// Interface defining target-specific behavior for resolution.
+abstract class Target {
+  /// Returns `true` if [library] is a target specific library whose members
+  /// have special treatment, such as being allowed to extends blacklisted
+  /// classes or members being eagerly resolved.
+  bool isTargetSpecificLibrary(LibraryElement element);
+}
+
 // TODO(johnniwinther): Rename to `Resolver` or `ResolverContext`.
 abstract class Resolution implements Frontend {
   ParsingContext get parsingContext;
   DiagnosticReporter get reporter;
+  CoreClasses get coreClasses;
   CoreTypes get coreTypes;
+  Types get types;
+  Target get target;
 
   /// If set to `true` resolution caches will not be cleared. Use this only for
   /// testing.
diff --git a/pkg/compiler/lib/src/common/tasks.dart b/pkg/compiler/lib/src/common/tasks.dart
index 42d5e7b..f1d3426 100644
--- a/pkg/compiler/lib/src/common/tasks.dart
+++ b/pkg/compiler/lib/src/common/tasks.dart
@@ -7,43 +7,36 @@
 import 'dart:async'
     show Future, Zone, ZoneDelegate, ZoneSpecification, runZoned;
 
-import '../common.dart';
-import '../compiler.dart' show Compiler;
-import '../elements/elements.dart' show Element;
-
-typedef void DeferredAction();
-
-class DeferredTask {
-  final Element element;
-  final DeferredAction action;
-
-  DeferredTask(this.element, this.action);
-}
-
-/// A [CompilerTask] is used to measure where time is spent in the compiler.
-/// The main entry points are [measure] and [measureIo].
-class CompilerTask {
-  final Compiler compiler;
-  final Stopwatch watch;
+/// Used to measure where time is spent in the compiler.
+///
+/// This exposes [measure] and [measureIo], which wrap an action and associate
+/// the time spent during that action with this task. Nested measurementsccan be
+/// introduced by using [measureSubtask].
+// TODO(sigmund): rename to MeasurableTask
+abstract class CompilerTask {
+  final Measurer measurer;
+  final Stopwatch _watch;
   final Map<String, GenericTask> _subtasks = <String, GenericTask>{};
 
   int asyncCount = 0;
 
-  CompilerTask(Compiler compiler)
-      : this.compiler = compiler,
-        watch = (compiler.options.verbose) ? new Stopwatch() : null;
+  CompilerTask(Measurer measurer)
+      : measurer = measurer,
+        _watch = measurer.enableTaskMeasurements ? new Stopwatch() : null;
 
-  DiagnosticReporter get reporter => compiler.reporter;
+  /// Whether measurement is disabled. The functions [measure] and [measureIo]
+  /// only measure time if measurements are enabled.
+  bool get _isDisabled => _watch == null;
 
-  Measurer get measurer => compiler.measurer;
-
+  /// Name to use for reporting timing information. Subclasses should override
+  /// this with a proper name, otherwise we use the runtime type of the task.
   String get name => "Unknown task '${this.runtimeType}'";
 
-  bool get isRunning => watch?.isRunning == true;
+  bool get isRunning => _watch?.isRunning == true;
 
   int get timing {
-    if (watch == null) return 0;
-    int total = watch.elapsedMilliseconds;
+    if (_isDisabled) return 0;
+    int total = _watch.elapsedMilliseconds;
     for (GenericTask subtask in _subtasks.values) {
       total += subtask.timing;
     }
@@ -51,40 +44,40 @@
   }
 
   Duration get duration {
-    if (watch == null) return Duration.ZERO;
-    Duration total = watch.elapsed;
+    if (_isDisabled) return Duration.ZERO;
+    Duration total = _watch.elapsed;
     for (GenericTask subtask in _subtasks.values) {
       total += subtask.duration;
     }
     return total;
   }
 
-  /// Perform [action] and use [watch] to measure its runtime (including any
-  /// asynchronous callbacks, such as, [Future.then], but excluding code
-  /// measured by other tasks).
-  measure(action()) => watch == null ? action() : measureZoned(action);
+  /// Perform [action] and measure its runtime (including any asynchronous
+  /// callbacks, such as, [Future.then], but excluding code measured by other
+  /// tasks).
+  measure(action()) => _isDisabled ? action() : _measureZoned(action);
 
   /// Helper method that starts measuring with this [CompilerTask], that is,
   /// make this task the currently measured task.
-  CompilerTask start() {
-    if (watch == null) return null;
+  CompilerTask _start() {
+    if (_isDisabled) return null;
     CompilerTask previous = measurer.currentTask;
     measurer.currentTask = this;
-    if (previous != null) previous.watch.stop();
+    if (previous != null) previous._watch.stop();
     // Regardless of whether [previous] is `null` we've returned from the
     // eventloop.
     measurer.stopAsyncWallClock();
-    watch.start();
+    _watch.start();
     return previous;
   }
 
   /// Helper method that stops measuring with this [CompilerTask], that is,
   /// make [previous] the currently measured task.
-  void stop(CompilerTask previous) {
-    if (watch == null) return;
-    watch.stop();
+  void _stop(CompilerTask previous) {
+    if (_isDisabled) return;
+    _watch.stop();
     if (previous != null) {
-      previous.watch.start();
+      previous._watch.start();
     } else {
       // If there's no previous task, we're about to return control to the
       // event loop. Start counting that as waiting asynchronous I/O.
@@ -93,55 +86,53 @@
     measurer.currentTask = previous;
   }
 
-  /// Helper method for [measure]. Don't call this method directly as it
-  /// assumes that [watch] isn't null.
-  measureZoned(action()) {
+  _measureZoned(action()) {
     // Using zones, we're able to track asynchronous operations correctly, as
     // our zone will be asked to invoke `then` blocks. Then blocks (the closure
     // passed to runZoned, and other closures) are run via the `run` functions
     // below.
 
-    assert(watch != null);
+    assert(_watch != null);
 
     // The current zone is already measuring `this` task.
     if (Zone.current[measurer] == this) return action();
 
     /// Run [f] in [zone]. Running must be delegated to [parent] to ensure that
     /// various state is set up correctly (in particular that `Zone.current`
-    /// has the right value). Since [measureZoned] can be called recursively
+    /// has the right value). Since [_measureZoned] can be called recursively
     /// (synchronously), some of the measuring zones we create will be parents
     /// of other measuring zones, but we still need to call through the parent
     /// chain. Consequently, we use a zone value keyed by [measurer] to see if
     /// we should measure or not when delegating.
     run(Zone self, ZoneDelegate parent, Zone zone, f()) {
       if (zone[measurer] != this) return parent.run(zone, f);
-      CompilerTask previous = start();
+      CompilerTask previous = _start();
       try {
         return parent.run(zone, f);
       } finally {
-        stop(previous);
+        _stop(previous);
       }
     }
 
     /// Same as [run] except that [f] takes one argument, [arg].
     runUnary(Zone self, ZoneDelegate parent, Zone zone, f(arg), arg) {
       if (zone[measurer] != this) return parent.runUnary(zone, f, arg);
-      CompilerTask previous = start();
+      CompilerTask previous = _start();
       try {
         return parent.runUnary(zone, f, arg);
       } finally {
-        stop(previous);
+        _stop(previous);
       }
     }
 
     /// Same as [run] except that [f] takes two arguments ([a1] and [a2]).
     runBinary(Zone self, ZoneDelegate parent, Zone zone, f(a1, a2), a1, a2) {
       if (zone[measurer] != this) return parent.runBinary(zone, f, a1, a2);
-      CompilerTask previous = start();
+      CompilerTask previous = _start();
       try {
         return parent.runBinary(zone, f, a1, a2);
       } finally {
-        stop(previous);
+        _stop(previous);
       }
     }
 
@@ -159,13 +150,8 @@
   /// provider, but it could be used by other tasks as long as the input
   /// provider will not be called by those tasks.
   measureIo(Future action()) {
-    return watch == null ? action() : measureIoHelper(action);
-  }
+    if (_isDisabled) return action();
 
-  /// Helper method for [measureIo]. Don't call this directly as it assumes
-  /// that [watch] isn't null.
-  Future measureIoHelper(Future action()) {
-    assert(watch != null);
     if (measurer.currentAsyncTask == null) {
       measurer.currentAsyncTask = this;
     } else if (measurer.currentAsyncTask != this) {
@@ -179,36 +165,16 @@
     });
   }
 
-  /// Convenience function for combining
-  /// [DiagnosticReporter.withCurrentElement] and [measure].
-  measureElement(Element element, action()) {
-    return watch == null
-        ? reporter.withCurrentElement(element, action)
-        : measureElementHelper(element, action);
-  }
-
-  /// Helper method for [measureElement]. Don't call this directly as it
-  /// assumes that [watch] isn't null.
-  measureElementHelper(Element element, action()) {
-    assert(watch != null);
-    return reporter.withCurrentElement(element, () => measure(action));
-  }
-
   /// Measure the time spent in [action] (if in verbose mode) and accumulate it
   /// under a subtask with the given name.
   measureSubtask(String name, action()) {
-    return watch == null ? action() : measureSubtaskHelper(name, action);
-  }
+    if (_isDisabled) return action();
 
-  /// Helper method for [measureSubtask]. Don't call this directly as it
-  /// assumes that [watch] isn't null.
-  measureSubtaskHelper(String name, action()) {
-    assert(watch != null);
     // Use a nested CompilerTask for the measurement to ensure nested [measure]
     // calls work correctly. The subtasks will never themselves have nested
     // subtasks because they are not accessible outside.
     GenericTask subtask =
-        _subtasks.putIfAbsent(name, () => new GenericTask(name, compiler));
+        _subtasks.putIfAbsent(name, () => new GenericTask(name, measurer));
     return subtask.measure(action);
   }
 
@@ -217,24 +183,36 @@
   int getSubtaskTime(String subtask) => _subtasks[subtask].timing;
 
   bool getSubtaskIsRunning(String subtask) => _subtasks[subtask].isRunning;
+
+  /// Used by the dart2js_incremental to provide measurements on each
+  /// incremental compile.
+  clearMeasurements() {
+    if (_isDisabled) return;
+    _watch.reset();
+    _subtasks.values.forEach((s) => s.clearMeasurements());
+  }
 }
 
 class GenericTask extends CompilerTask {
   final String name;
-
-  GenericTask(this.name, Compiler compiler) : super(compiler);
+  GenericTask(this.name, Measurer measurer) : super(measurer);
 }
 
 class Measurer {
   /// Measures the total runtime from this object was constructed.
   ///
-  /// Note: MUST be first field to ensure [wallclock] is started before other
-  /// computations.
+  /// Note: MUST be the first field of this class to ensure [wallclock] is
+  /// started before other computations.
   final Stopwatch wallClock = new Stopwatch()..start();
 
   /// Measures gaps between zoned closures due to asynchronicity.
   final Stopwatch asyncWallClock = new Stopwatch();
 
+  /// Whether measurement of tasks is enabled.
+  final bool enableTaskMeasurements;
+
+  Measurer({this.enableTaskMeasurements: false});
+
   /// The currently running task, that is, the task whose [Stopwatch] is
   /// currently running.
   CompilerTask currentTask;
@@ -255,7 +233,7 @@
   /// Call this before returning to the eventloop.
   void startAsyncWallClock() {
     if (currentAsyncTask != null) {
-      currentAsyncTask.watch.start();
+      currentAsyncTask._watch.start();
     } else {
       asyncWallClock.start();
     }
@@ -264,7 +242,7 @@
   /// Call this when the eventloop returns control to us.
   void stopAsyncWallClock() {
     if (currentAsyncTask != null) {
-      currentAsyncTask.watch.stop();
+      currentAsyncTask._watch.stop();
     }
     asyncWallClock.stop();
   }
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 82cc6de..9bab3a5 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -6,7 +6,7 @@
 
 import 'common.dart';
 import 'common/resolution.dart' show Resolution;
-import 'common/tasks.dart' show CompilerTask;
+import 'common/tasks.dart' show CompilerTask, Measurer;
 import 'compiler.dart' show Compiler;
 import 'constant_system_dart.dart';
 import 'constants/constant_system.dart';
@@ -16,7 +16,8 @@
 import 'core_types.dart' show CoreTypes;
 import 'dart_types.dart';
 import 'elements/elements.dart';
-import 'elements/modelx.dart' show FieldElementX, FunctionElementX;
+import 'elements/modelx.dart'
+    show FieldElementX, FunctionElementX, ConstantVariableMixin;
 import 'resolution/tree_elements.dart' show TreeElements;
 import 'resolution/operators.dart';
 import 'tree/tree.dart';
@@ -109,7 +110,7 @@
 /// frontend and backend interpretation of compile-time constants.
 abstract class ConstantCompilerTask extends CompilerTask
     implements ConstantCompiler {
-  ConstantCompilerTask(Compiler compiler) : super(compiler);
+  ConstantCompilerTask(Measurer measurer) : super(measurer);
 
   /// Copy all cached constant values from [task].
   ///
@@ -187,8 +188,19 @@
       ConstantExpression result = initialVariableValues[element.declaration];
       return result;
     }
+    if (element.hasConstant) {
+      if (element.constant != null) {
+        if (compiler.serialization.supportsDeserialization) {
+          evaluate(element.constant);
+        }
+        assert(invariant(element, hasConstantValue(element.constant),
+            message: "Constant expression has not been evaluated: "
+                "${element.constant.toStructuredText()}."));
+      }
+      return element.constant;
+    }
     AstElement currentElement = element.analyzableElement;
-    return reporter.withCurrentElement(currentElement, () {
+    return reporter.withCurrentElement(element, () {
       // TODO(johnniwinther): Avoid this eager analysis.
       compiler.resolution.ensureResolved(currentElement.declaration);
 
@@ -206,7 +218,7 @@
    * error.
    */
   ConstantExpression compileVariableWithDefinitions(
-      VariableElement element, TreeElements definitions,
+      ConstantVariableMixin element, TreeElements definitions,
       {bool isConst: false, bool checkType: true}) {
     Node node = element.node;
     if (pendingVariables.contains(element)) {
@@ -238,9 +250,17 @@
         ConstantValue value = getConstantValue(expression);
         if (elementType.isMalformed && !value.isNull) {
           if (isConst) {
-            ErroneousElement element = elementType.element;
-            reporter.reportErrorMessage(
-                node, element.messageKind, element.messageArguments);
+            // TODO(johnniwinther): Check that it is possible to reach this
+            // point in a situation where `elementType is! MalformedType`.
+            if (elementType is MalformedType) {
+              ErroneousElement element = elementType.element;
+              reporter.reportErrorMessage(
+                  node, element.messageKind, element.messageArguments);
+            } else {
+              assert(elementType is MethodTypeVariableType);
+              reporter.reportErrorMessage(
+                  node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
+            }
           } else {
             // We need to throw an exception at runtime.
             expression = null;
@@ -262,6 +282,7 @@
       }
     }
     if (expression != null) {
+      element.constant = expression;
       initialVariableValues[element.declaration] = expression;
     } else {
       assert(invariant(element, !isConst,
@@ -583,7 +604,7 @@
     if (send.isPropertyAccess) {
       AstConstant result;
       if (Elements.isStaticOrTopLevelFunction(element)) {
-        FunctionElementX function = element;
+        FunctionElement function = element;
         function.computeType(resolution);
         result = new AstConstant(
             context,
@@ -1280,13 +1301,12 @@
     Map<FieldElement, AstConstant> fieldConstants =
         <FieldElement, AstConstant>{};
     classElement.implementation.forEachInstanceField(
-        (ClassElement enclosing, FieldElementX field) {
+        (ClassElement enclosing, FieldElement field) {
       AstConstant fieldValue = fieldValues[field];
       if (fieldValue == null) {
         // Use the default value.
         ConstantExpression fieldExpression =
             handler.internalCompileVariable(field, true, false);
-        field.constant = fieldExpression;
         fieldValue = new AstConstant.fromDefaultValue(
             field, fieldExpression, handler.getConstantValue(fieldExpression));
         // TODO(het): If the field value doesn't typecheck due to the type
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index de80e0b..7f7a37f 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -15,7 +15,12 @@
 import 'common/names.dart' show Identifiers, Uris;
 import 'common/registry.dart' show EagerRegistry, Registry;
 import 'common/resolution.dart'
-    show ParsingContext, Resolution, ResolutionWorkItem, ResolutionImpact;
+    show
+        ParsingContext,
+        Resolution,
+        ResolutionWorkItem,
+        ResolutionImpact,
+        Target;
 import 'common/tasks.dart' show CompilerTask, GenericTask, Measurer;
 import 'common/work.dart' show ItemCompilationContext, WorkItem;
 import 'common.dart';
@@ -85,11 +90,7 @@
     Compiler compiler, CompilerOptions options);
 
 abstract class Compiler implements LibraryLoaderListener {
-  /// Helper instance for measurements in [CompilerTask].
-  ///
-  /// Note: MUST be first field to ensure [Measurer.wallclock] is started
-  /// before other computations.
-  final Measurer measurer = new Measurer();
+  Measurer get measurer;
 
   final IdGenerator idGenerator = new IdGenerator();
   World world;
@@ -244,8 +245,6 @@
   ti.TypesTask typesTask;
   Backend backend;
 
-  GenericTask reuseLibraryTask;
-
   GenericTask selfTask;
 
   /// The constant environment for the frontend interpretation of compile-time
@@ -260,8 +259,6 @@
   /// A customizable filter that is applied to enqueued work items.
   QueueFilter enqueuerFilter = new QueueFilter();
 
-  static const String CREATE_INVOCATION_MIRROR = 'createInvocationMirror';
-
   bool enabledRuntimeType = false;
   bool enabledFunctionApply = false;
   bool enabledInvokeOn = false;
@@ -339,17 +336,18 @@
 
     tasks = [
       dietParser =
-          new DietParserTask(this, options, idGenerator, backend, reporter),
+          new DietParserTask(options, idGenerator, backend, reporter, measurer),
       scanner = createScannerTask(),
       serialization = new SerializationTask(this),
       libraryLoader = new LibraryLoaderTask(
-          this,
-          this.resolvedUriTranslator,
+          resolvedUriTranslator,
           new _ScriptLoader(this),
           new _ElementScanner(scanner),
-          this.serialization,
+          serialization,
           this,
-          environment),
+          environment,
+          reporter,
+          measurer),
       parser = new ParserTask(this, options),
       patchParser = new PatchParserTask(this, options),
       resolver = createResolverTask(),
@@ -361,8 +359,7 @@
       mirrorUsageAnalyzerTask = new MirrorUsageAnalyzerTask(this),
       enqueuer = backend.makeEnqueuer(),
       dumpInfoTask = new DumpInfoTask(this),
-      reuseLibraryTask = new GenericTask('Reuse library', this),
-      selfTask = new GenericTask('self', this),
+      selfTask = new GenericTask('self', measurer),
     ];
     if (options.resolveOnly) {
       serialization.supportSerialization = true;
@@ -377,8 +374,9 @@
   /// Creates the scanner task.
   ///
   /// Override this to mock the scanner for testing.
-  ScannerTask createScannerTask() => new ScannerTask(this, dietParser,
-      preserveComments: options.preserveComments, commentMap: commentMap);
+  ScannerTask createScannerTask() =>
+      new ScannerTask(dietParser, reporter, measurer,
+          preserveComments: options.preserveComments, commentMap: commentMap);
 
   /// Creates the resolver task.
   ///
@@ -1033,7 +1031,7 @@
       if (identical(e.kind, ElementKind.GENERATIVE_CONSTRUCTOR)) {
         resolved.remove(e);
       }
-      if (backend.isBackendLibrary(e.library)) {
+      if (backend.isTargetSpecificLibrary(e.library)) {
         resolved.remove(e);
       }
     }
@@ -1557,6 +1555,9 @@
     }
   }
 
+  @override
+  bool get hasReportedError => compiler.compilationFailed;
+
   /**
    * Perform an operation, [f], returning the return value from [f].  If an
    * error occurs then report it as having occurred during compilation of
@@ -1886,9 +1887,18 @@
   ParsingContext get parsingContext => compiler.parsingContext;
 
   @override
+  CoreClasses get coreClasses => compiler.coreClasses;
+
+  @override
   CoreTypes get coreTypes => compiler.coreTypes;
 
   @override
+  Types get types => compiler.types;
+
+  @override
+  Target get target => compiler.backend;
+
+  @override
   void registerClass(ClassElement cls) {
     compiler.world.registerClass(cls);
   }
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
index dd756c6..3e1f9bf 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
@@ -2734,10 +2734,18 @@
     type = program.unaliasType(type);
 
     if (type.isMalformed) {
-      ErroneousElement element = type.element;
-      ir.Primitive message = buildStringConstant(element.message);
+      String message;
+      if (type is MalformedType) {
+        ErroneousElement element = type.element;
+        message = element.message;
+      } else {
+        assert(type is MethodTypeVariableType);
+        message = "Method type variables are not reified, "
+            "so they cannot be tested dynamically";
+      }
+      ir.Primitive irMessage = buildStringConstant(message);
       return buildStaticFunctionInvocation(program.throwTypeErrorHelper,
-          <ir.Primitive>[message], sourceInformation);
+          <ir.Primitive>[irMessage], sourceInformation);
     }
 
     List<ir.Primitive> typeArguments = const <ir.Primitive>[];
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
index 29b516d..18eeb52 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
@@ -56,6 +56,7 @@
 /// takes.
 class IrBuilderTask extends CompilerTask {
   final SourceInformationStrategy sourceInformationStrategy;
+  final Compiler compiler;
 
   String bailoutMessage = null;
 
@@ -65,7 +66,8 @@
 
   IrBuilderTask(Compiler compiler, this.sourceInformationStrategy,
       [this.builderCallback])
-      : super(compiler);
+      : compiler = compiler,
+        super(compiler.measurer);
 
   String get name => 'CPS builder';
 
@@ -76,7 +78,7 @@
 
       ResolvedAst resolvedAst = element.resolvedAst;
       element = element.implementation;
-      return reporter.withCurrentElement(element, () {
+      return compiler.reporter.withCurrentElement(element, () {
         SourceInformationBuilder sourceInformationBuilder =
             sourceInformationStrategy.createBuilderForContext(resolvedAst);
 
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 5dffdf7de..64bb70a 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -108,7 +108,7 @@
   Uri libraryRoot = currentDirectory;
   Uri out = currentDirectory.resolve('out.js');
   Uri sourceMapOut = currentDirectory.resolve('out.js.map');
-  Uri resolutionInput;
+  List<Uri> resolutionInputs;
   Uri packageConfig = null;
   Uri packageRoot = null;
   List<String> options = new List<String>();
@@ -190,8 +190,11 @@
   }
 
   void setResolutionInput(String argument) {
-    resolutionInput =
-        currentDirectory.resolve(extractPath(argument, isDirectory: false));
+    resolutionInputs = <Uri>[];
+    String parts = extractParameter(argument);
+    for (String part in parts.split(',')) {
+      resolutionInputs.add(currentDirectory.resolve(nativeToUriPath(part)));
+    }
   }
 
   void setResolveOnly(String argument) {
@@ -525,7 +528,7 @@
       packageRoot: packageRoot,
       packageConfig: packageConfig,
       packagesDiscoveryProvider: findPackages,
-      resolutionInput: resolutionInput,
+      resolutionInputs: resolutionInputs,
       resolutionOutput: resolutionOutput,
       options: options,
       environment: environment);
@@ -834,6 +837,9 @@
 final bool USE_SERIALIZED_DART_CORE =
     Platform.environment['USE_SERIALIZED_DART_CORE'] == 'true';
 
+/// Mock URI used only in testing when [USE_SERIALIZED_DART_CORE] is enabled.
+final Uri _SERIALIZED_URI = Uri.parse('file:fake.data');
+
 void _useSerializedDataForDartCore(CompileFunc oldCompileFunc) {
   String serializedData;
 
@@ -844,7 +850,7 @@
       api.CompilerOutput compilerOutput) async {
     CompilerImpl compiler = new CompilerImpl(
         compilerInput, compilerOutput, compilerDiagnostics, compilerOptions);
-    compiler.serialization.deserializeFromText(serializedData);
+    compiler.serialization.deserializeFromText(_SERIALIZED_URI, serializedData);
     return compiler.run(compilerOptions.entryPoint).then((bool success) {
       return new api.CompilationResult(compiler, isSuccess: success);
     });
@@ -865,7 +871,7 @@
             packagesDiscoveryProvider:
                 compilerOptions.packagesDiscoveryProvider,
             environment: compilerOptions.environment,
-            resolutionOutput: Uri.parse('file:fake.data'),
+            resolutionOutput: _SERIALIZED_URI,
             options: [Flags.resolveOnly]),
         compilerInput,
         compilerDiagnostics,
diff --git a/pkg/compiler/lib/src/dart_backend/backend.dart b/pkg/compiler/lib/src/dart_backend/backend.dart
index 5f3eed9..9a1162e 100644
--- a/pkg/compiler/lib/src/dart_backend/backend.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend.dart
@@ -457,7 +457,7 @@
 
   DartConstantTask(Compiler compiler)
       : this.constantCompiler = new DartConstantCompiler(compiler),
-        super(compiler);
+        super(compiler.measurer);
 
   String get name => 'ConstantHandler';
 
diff --git a/pkg/compiler/lib/src/dart_backend/backend_ast_to_frontend_ast.dart b/pkg/compiler/lib/src/dart_backend/backend_ast_to_frontend_ast.dart
index 03f0ba1..469858d 100644
--- a/pkg/compiler/lib/src/dart_backend/backend_ast_to_frontend_ast.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend_ast_to_frontend_ast.dart
@@ -495,7 +495,8 @@
           : makeFunctionBody(exp.body);
       result = new tree.FunctionExpression(
           constructorName(exp),
-          // TODO(eernst): retrieve and pass the actual type variables.
+          // GENERIC_METHODS: In order to support generic methods fully,
+          // we must retrieve and pass the actual type variables here.
           null, // typeVariables
           parameters,
           body,
@@ -516,7 +517,8 @@
       tree.Node body = makeFunctionBody(exp.body);
       result = new tree.FunctionExpression(
           functionName(exp),
-          // TODO(eernst): retrieve and pass the actual type variables.
+          // GENERIC_METHODS: In order to support generic methods fully,
+          // we must retrieve and pass the actual type variables here.
           null, // typeVariables
           parameters,
           body,
@@ -802,7 +804,8 @@
     } else if (stmt is FunctionDeclaration) {
       tree.FunctionExpression function = new tree.FunctionExpression(
           stmt.name != null ? makeIdentifier(stmt.name) : null,
-          // TODO(eernst): retrieve and pass the actual type variables.
+          // GENERIC_METHODS: In order to support generic methods fully,
+          // we must retrieve and pass the actual type variables here.
           null, // typeVariables
           makeParameters(stmt.parameters),
           makeFunctionBody(stmt.body),
@@ -971,7 +974,8 @@
     if (param.isFunction) {
       tree.Node definition = new tree.FunctionExpression(
           makeIdentifier(param.name),
-          // TODO(eernst): retrieve and pass the actual type variables.
+          // GENERIC_METHODS: In order to support generic methods fully,
+          // we must retrieve and pass the actual type variables here.
           null, // typeVariables
           makeParameters(param.parameters),
           null, // body
diff --git a/pkg/compiler/lib/src/dart_types.dart b/pkg/compiler/lib/src/dart_types.dart
index 685077d..fb0eac4 100644
--- a/pkg/compiler/lib/src/dart_types.dart
+++ b/pkg/compiler/lib/src/dart_types.dart
@@ -10,7 +10,7 @@
 import 'common.dart';
 import 'core_types.dart';
 import 'elements/elements.dart';
-import 'elements/modelx.dart' show TypeDeclarationElementX;
+import 'elements/modelx.dart' show TypeDeclarationElementX, ErroneousElementX;
 import 'ordered_typeset.dart' show OrderedTypeSet;
 import 'util/util.dart' show equalElements;
 
@@ -124,7 +124,7 @@
   bool get isTypeVariable => kind == TypeKind.TYPE_VARIABLE;
 
   /// Is [: true :] if this type is a malformed type.
-  bool get isMalformed => kind == TypeKind.MALFORMED_TYPE;
+  bool get isMalformed => false;
 
   /// Is `true` if this type is declared by an enum.
   bool get isEnumType => false;
@@ -164,6 +164,15 @@
       type.accept(visitor, argument);
     }
   }
+
+  /// Returns a [DartType] which corresponds to [this] except that each
+  /// contained [MethodTypeVariableType] is replaced by a [DynamicType].
+  /// GENERIC_METHODS: Temporary, only used with '--generic-method-syntax'.
+  DartType get dynamifyMethodTypeVariableType => this;
+
+  /// Returns true iff [this] is or contains a [MethodTypeVariableType].
+  /// GENERIC_METHODS: Temporary, only used with '--generic-method-syntax'
+  bool get containsMethodTypeVariableType => false;
 }
 
 /**
@@ -234,6 +243,25 @@
   String toString() => name;
 }
 
+/// Provides a thin model of method type variables: They are treated as if
+/// their value were `dynamic` when used in a type annotation, and as a
+/// malformed type when used in an `as` or `is` expression.
+class MethodTypeVariableType extends TypeVariableType {
+  MethodTypeVariableType(TypeVariableElement element) : super(element);
+
+  @override
+  bool get treatAsDynamic => true;
+
+  @override
+  bool get isMalformed => true;
+
+  @override
+  DartType get dynamifyMethodTypeVariableType => const DynamicType();
+
+  @override
+  get containsMethodTypeVariableType => true;
+}
+
 /// Internal type representing the result of analyzing a statement.
 class StatementType extends DartType {
   Element get element => null;
@@ -313,6 +341,9 @@
   // Malformed types are treated as dynamic.
   bool get treatAsDynamic => true;
 
+  @override
+  bool get isMalformed => true;
+
   accept(DartTypeVisitor visitor, var argument) {
     return visitor.visitMalformedType(this, argument);
   }
@@ -341,9 +372,12 @@
   final TypeDeclarationElement element;
   final List<DartType> typeArguments;
 
-  GenericType(TypeDeclarationElement element, this.typeArguments,
+  GenericType(TypeDeclarationElement element, List<DartType> typeArguments,
       {bool checkTypeArgumentCount: true})
-      : this.element = element {
+      : this.element = element,
+        this.typeArguments = typeArguments,
+        this.containsMethodTypeVariableType =
+            typeArguments.any(_typeContainsMethodTypeVariableType) {
     assert(invariant(CURRENT_ELEMENT_SPANNABLE, element != null,
         message: "Missing element for generic type."));
     assert(invariant(element, () {
@@ -405,6 +439,18 @@
     return sb.toString();
   }
 
+  @override
+  final bool containsMethodTypeVariableType;
+
+  @override
+  DartType get dynamifyMethodTypeVariableType {
+    if (!containsMethodTypeVariableType) return this;
+    List<DartType> newTypeArguments = typeArguments
+        .map((DartType type) => type.dynamifyMethodTypeVariableType)
+        .toList();
+    return createInstantiation(newTypeArguments);
+  }
+
   int get hashCode {
     int hash = element.hashCode;
     for (DartType argument in typeArguments) {
@@ -586,11 +632,21 @@
   }
 
   FunctionType.internal(FunctionTypedElement this.element,
-      [DartType this.returnType = const DynamicType(),
-      this.parameterTypes = const <DartType>[],
-      this.optionalParameterTypes = const <DartType>[],
-      this.namedParameters = const <String>[],
-      this.namedParameterTypes = const <DartType>[]]) {
+      [DartType returnType = const DynamicType(),
+      List<DartType> parameterTypes = const <DartType>[],
+      List<DartType> optionalParameterTypes = const <DartType>[],
+      List<String> namedParameters = const <String>[],
+      List<DartType> namedParameterTypes = const <DartType>[]])
+      : this.returnType = returnType,
+        this.parameterTypes = parameterTypes,
+        this.optionalParameterTypes = optionalParameterTypes,
+        this.namedParameters = namedParameters,
+        this.namedParameterTypes = namedParameterTypes,
+        this.containsMethodTypeVariableType = returnType
+                .containsMethodTypeVariableType ||
+            parameterTypes.any(_typeContainsMethodTypeVariableType) ||
+            optionalParameterTypes.any(_typeContainsMethodTypeVariableType) ||
+            namedParameterTypes.any(_typeContainsMethodTypeVariableType) {
     assert(invariant(
         CURRENT_ELEMENT_SPANNABLE, element == null || element.isDeclaration));
     // Assert that optional and named parameters are not used at the same time.
@@ -718,6 +774,23 @@
 
   int computeArity() => parameterTypes.length;
 
+  @override
+  DartType get dynamifyMethodTypeVariableType {
+    if (!containsMethodTypeVariableType) return this;
+    DartType eraseIt(DartType type) => type.dynamifyMethodTypeVariableType;
+    DartType newReturnType = returnType.dynamifyMethodTypeVariableType;
+    List<DartType> newParameterTypes = parameterTypes.map(eraseIt).toList();
+    List<DartType> newOptionalParameterTypes =
+        optionalParameterTypes.map(eraseIt).toList();
+    List<DartType> newNamedParameterTypes =
+        namedParameterTypes.map(eraseIt).toList();
+    return new FunctionType.internal(element, newReturnType, newParameterTypes,
+        newOptionalParameterTypes, namedParameters, newNamedParameterTypes);
+  }
+
+  @override
+  final bool containsMethodTypeVariableType;
+
   int get hashCode {
     int hash = 3 * returnType.hashCode;
     for (DartType parameter in parameterTypes) {
@@ -745,6 +818,9 @@
   }
 }
 
+bool _typeContainsMethodTypeVariableType(DartType type) =>
+    type.containsMethodTypeVariableType;
+
 class TypedefType extends GenericType {
   DartType _unaliased;
 
@@ -1347,6 +1423,15 @@
   static ClassElement getClassContext(DartType type) {
     TypeVariableType typeVariable = type.typeVariableOccurrence;
     if (typeVariable == null) return null;
+    // GENERIC_METHODS: When generic method support is complete enough to
+    // include a runtime value for method type variables this must be updated.
+    // For full support the global assumption that all type variables are
+    // declared by the same enclosing class will not hold: Both an enclosing
+    // method and an enclosing class may define type variables, so the return
+    // type cannot be [ClassElement] and the caller must be prepared to look in
+    // two locations, not one. Currently we ignore method type variables by
+    // returning in the next statement.
+    if (typeVariable.element.typeDeclaration is! ClassElement) return null;
     return typeVariable.element.typeDeclaration;
   }
 
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index c34c06e..18e85ad 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -152,11 +152,15 @@
 
   Set<Element> _mainElements = new Set<Element>();
 
-  DeferredLoadTask(Compiler compiler) : super(compiler) {
+  final Compiler compiler;
+  DeferredLoadTask(Compiler compiler)
+      : compiler = compiler,
+        super(compiler.measurer) {
     mainOutputUnit.imports.add(_fakeMainImport);
   }
 
   Backend get backend => compiler.backend;
+  DiagnosticReporter get reporter => compiler.reporter;
 
   /// Returns the [OutputUnit] where [element] belongs.
   OutputUnit outputUnitForElement(Element element) {
@@ -629,88 +633,97 @@
     _constantsDeferredBy = new Map<_DeferredImport, Set<ConstantValue>>();
     _importedDeferredBy[_fakeMainImport] = _mainElements;
 
-    measureElement(mainLibrary, () {
-      // Starting from main, traverse the program and find all dependencies.
-      _mapDependencies(element: compiler.mainFunction, import: _fakeMainImport);
+    reporter.withCurrentElement(
+        mainLibrary,
+        () => measure(() {
+              // Starting from main, traverse the program and find all
+              // dependencies.
+              _mapDependencies(
+                  element: compiler.mainFunction, import: _fakeMainImport);
 
-      // Also add "global" dependencies to the main OutputUnit.  These are
-      // things that the backend needs but cannot associate with a particular
-      // element, for example, startRootIsolate.  This set also contains
-      // elements for which we lack precise information.
-      for (Element element in compiler.globalDependencies.otherDependencies) {
-        _mapDependencies(element: element, import: _fakeMainImport);
-      }
+              // Also add "global" dependencies to the main OutputUnit.  These
+              // are things that the backend needs but cannot associate with a
+              // particular element, for example, startRootIsolate.  This set
+              // also contains elements for which we lack precise information.
+              for (Element element
+                  in compiler.globalDependencies.otherDependencies) {
+                _mapDependencies(element: element, import: _fakeMainImport);
+              }
 
-      // Now check to see if we have to add more elements due to mirrors.
-      if (compiler.mirrorsLibrary != null) {
-        _addMirrorElements();
-      }
+              // Now check to see if we have to add more elements due to
+              // mirrors.
+              if (compiler.mirrorsLibrary != null) {
+                _addMirrorElements();
+              }
 
-      // Build the OutputUnits using these two maps.
-      Map<Element, OutputUnit> elementToOutputUnitBuilder =
-          new Map<Element, OutputUnit>();
-      Map<ConstantValue, OutputUnit> constantToOutputUnitBuilder =
-          new Map<ConstantValue, OutputUnit>();
+              // Build the OutputUnits using these two maps.
+              Map<Element, OutputUnit> elementToOutputUnitBuilder =
+                  new Map<Element, OutputUnit>();
+              Map<ConstantValue, OutputUnit> constantToOutputUnitBuilder =
+                  new Map<ConstantValue, OutputUnit>();
 
-      // Reverse the mappings. For each element record an OutputUnit collecting
-      // all deferred imports mapped to this element. Same for constants.
-      for (_DeferredImport import in _importedDeferredBy.keys) {
-        for (Element element in _importedDeferredBy[import]) {
-          // Only one file should be loaded when the program starts, so make
-          // sure that only one OutputUnit is created for [fakeMainImport].
-          if (import == _fakeMainImport) {
-            elementToOutputUnitBuilder[element] = mainOutputUnit;
-          } else {
-            elementToOutputUnitBuilder
-                .putIfAbsent(element, () => new OutputUnit())
-                .imports
-                .add(import);
-          }
-        }
-      }
-      for (_DeferredImport import in _constantsDeferredBy.keys) {
-        for (ConstantValue constant in _constantsDeferredBy[import]) {
-          // Only one file should be loaded when the program starts, so make
-          // sure that only one OutputUnit is created for [fakeMainImport].
-          if (import == _fakeMainImport) {
-            constantToOutputUnitBuilder[constant] = mainOutputUnit;
-          } else {
-            constantToOutputUnitBuilder
-                .putIfAbsent(constant, () => new OutputUnit())
-                .imports
-                .add(import);
-          }
-        }
-      }
+              // Reverse the mappings. For each element record an OutputUnit
+              // collecting all deferred imports mapped to this element. Same
+              // for constants.
+              for (_DeferredImport import in _importedDeferredBy.keys) {
+                for (Element element in _importedDeferredBy[import]) {
+                  // Only one file should be loaded when the program starts, so
+                  // make sure that only one OutputUnit is created for
+                  // [fakeMainImport].
+                  if (import == _fakeMainImport) {
+                    elementToOutputUnitBuilder[element] = mainOutputUnit;
+                  } else {
+                    elementToOutputUnitBuilder
+                        .putIfAbsent(element, () => new OutputUnit())
+                        .imports
+                        .add(import);
+                  }
+                }
+              }
+              for (_DeferredImport import in _constantsDeferredBy.keys) {
+                for (ConstantValue constant in _constantsDeferredBy[import]) {
+                  // Only one file should be loaded when the program starts, so
+                  // make sure that only one OutputUnit is created for
+                  // [fakeMainImport].
+                  if (import == _fakeMainImport) {
+                    constantToOutputUnitBuilder[constant] = mainOutputUnit;
+                  } else {
+                    constantToOutputUnitBuilder
+                        .putIfAbsent(constant, () => new OutputUnit())
+                        .imports
+                        .add(import);
+                  }
+                }
+              }
 
-      // Release maps;
-      _importedDeferredBy = null;
-      _constantsDeferredBy = null;
+              // Release maps;
+              _importedDeferredBy = null;
+              _constantsDeferredBy = null;
 
-      // Find all the output units elements/constants have been mapped to, and
-      // canonicalize them.
-      elementToOutputUnitBuilder
-          .forEach((Element element, OutputUnit outputUnit) {
-        OutputUnit representative = allOutputUnits.lookup(outputUnit);
-        if (representative == null) {
-          representative = outputUnit;
-          allOutputUnits.add(representative);
-        }
-        _elementToOutputUnit[element] = representative;
-      });
-      constantToOutputUnitBuilder
-          .forEach((ConstantValue constant, OutputUnit outputUnit) {
-        OutputUnit representative = allOutputUnits.lookup(outputUnit);
-        if (representative == null) {
-          representative = outputUnit;
-          allOutputUnits.add(representative);
-        }
-        _constantToOutputUnit[constant] = representative;
-      });
+              // Find all the output units elements/constants have been mapped
+              // to, and canonicalize them.
+              elementToOutputUnitBuilder
+                  .forEach((Element element, OutputUnit outputUnit) {
+                OutputUnit representative = allOutputUnits.lookup(outputUnit);
+                if (representative == null) {
+                  representative = outputUnit;
+                  allOutputUnits.add(representative);
+                }
+                _elementToOutputUnit[element] = representative;
+              });
+              constantToOutputUnitBuilder
+                  .forEach((ConstantValue constant, OutputUnit outputUnit) {
+                OutputUnit representative = allOutputUnits.lookup(outputUnit);
+                if (representative == null) {
+                  representative = outputUnit;
+                  allOutputUnits.add(representative);
+                }
+                _constantToOutputUnit[constant] = representative;
+              });
 
-      // Generate a unique name for each OutputUnit.
-      _assignNamesToOutputUnits(allOutputUnits);
-    });
+              // Generate a unique name for each OutputUnit.
+              _assignNamesToOutputUnits(allOutputUnits);
+            }));
     // Notify the impact strategy impacts are no longer needed for deferred
     // load.
     compiler.impactStrategy.onImpactUsed(IMPACT_USE);
diff --git a/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart b/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
index e31edde..0a9c5f5 100644
--- a/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
+++ b/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
@@ -61,6 +61,9 @@
   DiagnosticMessage createMessage(Spannable spannable, MessageKind messageKind,
       [Map arguments = const {}]);
 
+  /// Returns `true` if a crash, an error or a fatal warning has been reported.
+  bool get hasReportedError;
+
   /// Called when an [exception] is thrown from user-provided code, like from
   /// the input provider or diagnostics handler.
   void onCrashInUserCode(String message, exception, stackTrace) {}
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index bbe777e..ad689fd 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -177,6 +177,7 @@
   DUPLICATE_IMPORT,
   DUPLICATE_INITIALIZER,
   DUPLICATE_LABEL,
+  DUPLICATE_SERIALIZED_LIBRARY,
   DUPLICATE_SUPER_INITIALIZER,
   DUPLICATE_TYPE_VARIABLE_NAME,
   DUPLICATED_LIBRARY_NAME,
@@ -430,6 +431,7 @@
   TYPE_ARGUMENT_COUNT_MISMATCH,
   TYPE_VARIABLE_IN_CONSTANT,
   TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
+  TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED,
   TYPEDEF_FORMAL_WITH_DEFAULT,
   UNARY_OPERATOR_BAD_ARITY,
   UNBOUND_LABEL,
@@ -1152,6 +1154,33 @@
 """
           ]),
 
+      MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED: const MessageTemplate(
+          MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED,
+          "Method type variables do not have a runtime value.",
+          options: const ["--generic-method-syntax"],
+          howToFix: "Try using the upper bound of the type variable, "
+              "or refactor the code to avoid needing this runtime value.",
+          examples: const [
+            """
+// Method type variables are not reified, so they cannot be returned.
+Type f<T>() => T;
+
+main() => f<int>();
+""",
+            """
+// Method type variables are not reified, so they cannot be tested dynamically.
+bool f<T>(Object o) => o is T;
+
+main() => f<int>(42);
+""",
+            """
+// Method type variables are not reified, so they cannot be tested dynamically.
+bool f<T>(Object o) => o as T;
+
+main() => f<int>(42);
+"""
+          ]),
+
       MessageKind.INVALID_TYPE_VARIABLE_BOUND: const MessageTemplate(
           MessageKind.INVALID_TYPE_VARIABLE_BOUND,
           "'#{typeArgument}' is not a subtype of bound '#{bound}' for "
@@ -3643,6 +3672,11 @@
           MessageKind.UNRECOGNIZED_VERSION_OF_LOOKUP_MAP,
           "Unsupported version of package:lookup_map.",
           howToFix: DONT_KNOW_HOW_TO_FIX),
+
+      MessageKind.DUPLICATE_SERIALIZED_LIBRARY: const MessageTemplate(
+          MessageKind.DUPLICATE_SERIALIZED_LIBRARY,
+          "Library '#{libraryUri}' found in both '#{sourceUri1}' and "
+          "'#{sourceUri2}'."),
     }); // End of TEMPLATES.
 
   /// Padding used before and between import chains in the message for
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 0ee0093..a8c39fa 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -368,8 +368,11 @@
 
 class DumpInfoTask extends CompilerTask implements InfoReporter {
   static const ImpactUseCase IMPACT_USE = const ImpactUseCase('Dump info');
+  final Compiler compiler;
 
-  DumpInfoTask(Compiler compiler) : super(compiler);
+  DumpInfoTask(Compiler compiler)
+      : compiler = compiler,
+        super(compiler.measurer);
 
   String get name => "Dump Info";
 
@@ -588,7 +591,7 @@
     ChunkedConversionSink<Object> sink = encoder.startChunkedConversion(
         new StringConversionSink.fromStringSink(buffer));
     sink.add(new AllInfoJsonCodec().encode(result));
-    reporter.reportInfo(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, {
+    compiler.reporter.reportInfo(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, {
       'text': "View the dumped .info.json file at "
           "https://dart-lang.github.io/dump-info-visualizer"
     });
diff --git a/pkg/compiler/lib/src/elements/elements.dart b/pkg/compiler/lib/src/elements/elements.dart
index 2e6adb0..dc708d0 100644
--- a/pkg/compiler/lib/src/elements/elements.dart
+++ b/pkg/compiler/lib/src/elements/elements.dart
@@ -1005,6 +1005,8 @@
 
   Expression get initializer;
 
+  bool get hasConstant;
+
   /// The constant expression defining the (initial) value of the variable.
   ///
   /// If the variable is `const` the value is always non-null, possibly an
@@ -1236,6 +1238,10 @@
 /// A constructor.
 abstract class ConstructorElement extends FunctionElement
     implements MemberElement {
+  /// Returns `true` if [effectiveTarget] has been computed for this
+  /// constructor.
+  bool get hasEffectiveTarget;
+
   /// The effective target of this constructor, that is the non-redirecting
   /// constructor that is called on invocation of this constructor.
   ///
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index 3e14846..2381d64 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -256,6 +256,8 @@
 
   bool get hasFunctionSignature => false;
 
+  bool get hasEffectiveTarget => true;
+
   get effectiveTarget => this;
 
   computeEffectiveTargetType(InterfaceType newType) => unsupported();
@@ -1391,6 +1393,11 @@
 abstract class ConstantVariableMixin implements VariableElement {
   ConstantExpression constantCache;
 
+  // TODO(johnniwinther): Update the on `constant = ...` when evaluation of
+  // constant expression can handle references to unanalyzed constant variables.
+  @override
+  bool get hasConstant => false;
+
   ConstantExpression get constant {
     if (isPatch) {
       ConstantVariableMixin originVariable = origin;
@@ -2199,6 +2206,8 @@
   DartType _effectiveTargetType;
   bool _isEffectiveTargetMalformed;
 
+  bool get hasEffectiveTarget => effectiveTargetInternal != null;
+
   void setEffectiveTarget(ConstructorElement target, DartType type,
       {bool isMalformed: false}) {
     assert(invariant(this, target != null,
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index f619520..29ae8ea 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -10,7 +10,7 @@
 import 'common/names.dart' show Identifiers;
 import 'common/resolution.dart' show Resolution;
 import 'common/resolution.dart' show ResolutionWorkItem;
-import 'common/tasks.dart' show CompilerTask, DeferredAction, DeferredTask;
+import 'common/tasks.dart' show CompilerTask;
 import 'common/work.dart' show ItemCompilationContext, WorkItem;
 import 'common.dart';
 import 'compiler.dart' show Compiler;
@@ -46,11 +46,13 @@
 class EnqueueTask extends CompilerTask {
   final ResolutionEnqueuer resolution;
   final CodegenEnqueuer codegen;
+  final Compiler compiler;
 
   String get name => 'Enqueue';
 
   EnqueueTask(Compiler compiler)
-      : resolution = new ResolutionEnqueuer(
+      : compiler = compiler,
+        resolution = new ResolutionEnqueuer(
             compiler,
             compiler.backend.createItemCompilationContext,
             compiler.options.analyzeOnly && compiler.options.analyzeMain
@@ -60,7 +62,7 @@
             compiler,
             compiler.backend.createItemCompilationContext,
             const TreeShakingEnqueuerStrategy()),
-        super(compiler) {
+        super(compiler.measurer) {
     codegen.task = this;
     resolution.task = this;
 
@@ -714,11 +716,9 @@
 
   final Queue<ResolutionWorkItem> queue;
 
-  /**
-   * A deferred task queue for the resolution phase which is processed
-   * when the resolution queue has been emptied.
-   */
-  final Queue<DeferredTask> deferredTaskQueue;
+  /// Queue of deferred resolution actions to execute when the resolution queue
+  /// has been emptied.
+  final Queue<_DeferredAction> deferredQueue;
 
   static const ImpactUseCase IMPACT_USE =
       const ImpactUseCase('ResolutionEnqueuer');
@@ -733,7 +733,7 @@
             strategy),
         processedElements = new Set<AstElement>(),
         queue = new Queue<ResolutionWorkItem>(),
-        deferredTaskQueue = new Queue<DeferredTask>();
+        deferredQueue = new Queue<_DeferredAction>();
 
   bool get isResolutionQueue => true;
 
@@ -831,24 +831,26 @@
    *
    * The queue is processed in FIFO order.
    */
-  void addDeferredAction(Element element, DeferredAction action) {
+  void addDeferredAction(Element element, void action()) {
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(
           element,
           "Resolution work list is closed. "
           "Trying to add deferred action for $element");
     }
-    deferredTaskQueue.add(new DeferredTask(element, action));
+    deferredQueue.add(new _DeferredAction(element, action));
   }
 
   bool onQueueEmpty(Iterable<ClassElement> recentClasses) {
-    emptyDeferredTaskQueue();
+    _emptyDeferredQueue();
     return super.onQueueEmpty(recentClasses);
   }
 
-  void emptyDeferredTaskQueue() {
-    while (!deferredTaskQueue.isEmpty) {
-      DeferredTask task = deferredTaskQueue.removeFirst();
+  void emptyDeferredQueueForTesting() => _emptyDeferredQueue();
+
+  void _emptyDeferredQueue() {
+    while (!deferredQueue.isEmpty) {
+      _DeferredAction task = deferredQueue.removeFirst();
       reporter.withCurrentElement(task.element, task.action);
     }
   }
@@ -1044,3 +1046,12 @@
     enqueuer.registerTypeUse(typeUse);
   }
 }
+
+typedef void _DeferredActionFunction();
+
+class _DeferredAction {
+  final Element element;
+  final _DeferredActionFunction action;
+
+  _DeferredAction(this.element, this.action);
+}
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 5f334e3..e8f43ca 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -2703,7 +2703,12 @@
           if (type.isTypedef) {
             backend.compiler.world.allTypedefs.add(type.element);
           }
-          if (type.isTypeVariable) {
+          if (type.isTypeVariable && type is! MethodTypeVariableType) {
+            // GENERIC_METHODS: The `is!` test above filters away method type
+            // variables, because they have the value `dynamic` with the
+            // incomplete support for generic methods offered with
+            // '--generic-method-syntax'. This must be revised in order to
+            // support generic methods fully.
             ClassElement cls = type.element.enclosingClass;
             backend.rti.registerClassUsingTypeVariableExpression(cls);
             registerBackendImpact(transformed, impacts.typeVariableExpression);
diff --git a/pkg/compiler/lib/src/js_backend/backend_helpers.dart b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
index 5863104..7613305 100644
--- a/pkg/compiler/lib/src/js_backend/backend_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
@@ -553,7 +553,7 @@
   }
 
   Element get createInvocationMirror {
-    return findHelper(Compiler.CREATE_INVOCATION_MIRROR);
+    return findHelper('createInvocationMirror');
   }
 
   Element get cyclicThrowHelper {
diff --git a/pkg/compiler/lib/src/js_backend/codegen/task.dart b/pkg/compiler/lib/src/js_backend/codegen/task.dart
index c293d5a..69b13f3 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/task.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/task.dart
@@ -68,9 +68,11 @@
         constantSystem = backend.constantSystem,
         compiler = compiler,
         glue = new Glue(compiler),
-        cpsOptimizationTask = new GenericTask('CPS optimization', compiler),
-        treeBuilderTask = new GenericTask('Tree builder', compiler),
-        treeOptimizationTask = new GenericTask('Tree optimization', compiler) {
+        cpsOptimizationTask =
+            new GenericTask('CPS optimization', compiler.measurer),
+        treeBuilderTask = new GenericTask('Tree builder', compiler.measurer),
+        treeOptimizationTask =
+            new GenericTask('Tree optimization', compiler.measurer) {
     inliner = new Inliner(this);
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index 5aefd39..da3efb5 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -18,7 +18,7 @@
   JavaScriptConstantTask(Compiler compiler)
       : this.dartConstantCompiler = new DartConstantCompiler(compiler),
         this.jsConstantCompiler = new JavaScriptConstantCompiler(compiler),
-        super(compiler);
+        super(compiler.measurer);
 
   String get name => 'ConstantHandler';
 
diff --git a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
index 4bc5384..4cbc011 100644
--- a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
+++ b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
@@ -206,6 +206,13 @@
         expr = stmt.expression;
       }
     }
+    if (expr is Send && expr.isTypeCast) {
+      Send sendExpr = expr;
+      var typeName = sendExpr.typeAnnotationFromIsCheckOrCast.typeName;
+      if (typeName is Identifier && typeName.source == "dynamic") {
+        expr = sendExpr.receiver;
+      }
+    }
     if (expr is Send &&
         expr.isSuperCall &&
         expr.selector is Identifier &&
diff --git a/pkg/compiler/lib/src/js_backend/patch_resolver.dart b/pkg/compiler/lib/src/js_backend/patch_resolver.dart
index 521dd2d..17a4a4e 100644
--- a/pkg/compiler/lib/src/js_backend/patch_resolver.dart
+++ b/pkg/compiler/lib/src/js_backend/patch_resolver.dart
@@ -14,7 +14,12 @@
 import '../tree/tree.dart';
 
 class PatchResolverTask extends CompilerTask {
-  PatchResolverTask(Compiler compiler) : super(compiler);
+  final Compiler compiler;
+  PatchResolverTask(Compiler compiler)
+      : compiler = compiler,
+        super(compiler.measurer);
+
+  DiagnosticReporter get reporter => compiler.reporter;
 
   Resolution get resolution => compiler.resolution;
 
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 036e52a..369cec0 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -252,7 +252,12 @@
     compiler.resolverWorld.isChecks.forEach((DartType type) {
       if (type.isTypeVariable) {
         TypeVariableElement variable = type.element;
-        classesUsingTypeVariableTests.add(variable.typeDeclaration);
+        // GENERIC_METHODS: When generic method support is complete enough to
+        // include a runtime value for method type variables, this may need to
+        // be updated: It simply ignores method type arguments.
+        if (variable.typeDeclaration is ClassElement) {
+          classesUsingTypeVariableTests.add(variable.typeDeclaration);
+        }
       }
     });
     // Add is-checks that result from classes using type variables in checks.
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index 28583fc..da0aff8 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -19,6 +19,7 @@
   NativeEmitter nativeEmitter;
   MetadataCollector metadataCollector;
   Emitter emitter;
+  final Compiler compiler;
 
   /// Records if a type variable is read dynamically for type tests.
   final Set<TypeVariableElement> readTypeVariables =
@@ -35,9 +36,10 @@
 
   CodeEmitterTask(Compiler compiler, Namer namer, bool generateSourceMap,
       bool useStartupEmitter)
-      : super(compiler),
+      : compiler = compiler,
         this.namer = namer,
-        this.typeTestRegistry = new TypeTestRegistry(compiler) {
+        this.typeTestRegistry = new TypeTestRegistry(compiler),
+        super(compiler.measurer) {
     nativeEmitter = new NativeEmitter(this);
     if (USE_LAZY_EMITTER) {
       emitter = new lazy_js_emitter.Emitter(compiler, namer, nativeEmitter);
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index d555a73..3a2e2a3 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -7,9 +7,8 @@
 import 'dart:async';
 
 import 'common/names.dart' show Uris;
-import 'common/tasks.dart' show CompilerTask;
+import 'common/tasks.dart' show CompilerTask, Measurer;
 import 'common.dart';
-import 'compiler.dart' show Compiler;
 import 'elements/elements.dart'
     show
         CompilationUnitElement,
@@ -115,8 +114,8 @@
  * A 'resource URI' is an absolute URI with a scheme supported by the input
  * provider. For the standard implementation this means a URI with the 'file'
  * scheme. Readable URIs are converted into resource URIs as part of the
- * [Compiler.readScript] method. In the standard implementation the package URIs
- * are converted to file URIs using the package root URI provided on the
+ * [ScriptLoader.readScript] method. In the standard implementation the package
+ * URIs are converted to file URIs using the package root URI provided on the
  * command line as base. If the package root URI is
  * 'file:///current/working/dir/' then the package URI 'package:foo/bar.dart'
  * will be resolved to the resource URI
@@ -134,13 +133,14 @@
  */
 abstract class LibraryLoaderTask implements CompilerTask {
   factory LibraryLoaderTask(
-      Compiler compiler,
       ResolvedUriTranslator uriTranslator,
       ScriptLoader scriptLoader,
       ElementScanner scriptScanner,
       LibraryDeserializer deserializer,
       LibraryLoaderListener listener,
-      Environment environment) = _LibraryLoaderTask;
+      Environment environment,
+      DiagnosticReporter reporter,
+      Measurer measurer) = _LibraryLoaderTask;
 
   /// Returns all libraries that have been loaded.
   Iterable<LibraryElement> get libraries;
@@ -297,10 +297,12 @@
   /// conditional imports.
   final Environment environment;
 
-  _LibraryLoaderTask(Compiler compiler, this.uriTranslator, this.scriptLoader,
-      this.scanner, this.deserializer, this.listener, this.environment)
-      // TODO(sigmund): make measurements separate from compiler
-      : super(compiler);
+  final DiagnosticReporter reporter;
+
+  _LibraryLoaderTask(this.uriTranslator, this.scriptLoader,
+      this.scanner, this.deserializer, this.listener, this.environment,
+      this.reporter, Measurer measurer)
+      : super(measurer);
 
   String get name => 'LibraryLoader';
 
@@ -325,8 +327,7 @@
 
       Iterable<LibraryElement> reusedLibraries = null;
       if (reuseLibrary != null) {
-        // TODO(sigmund): make measurements separate from compiler
-        reusedLibraries = compiler.reuseLibraryTask.measure(() {
+        reusedLibraries = measureSubtask(_reuseLibrarySubtaskName, () {
           // Call [toList] to force eager calls to [reuseLibrary].
           return libraryCanonicalUriMap.values.where(reuseLibrary).toList();
         });
@@ -363,10 +364,9 @@
         }
       }
 
-      List<Future<LibraryElement>> reusedLibrariesFuture =
-          // TODO(sigmund): make measurements separate from compiler
-          compiler.reuseLibraryTask.measure(
-              () => libraryCanonicalUriMap.values.map(wrapper).toList());
+      List<Future<LibraryElement>> reusedLibrariesFuture = measureSubtask(
+          _reuseLibrarySubtaskName,
+          () => libraryCanonicalUriMap.values.map(wrapper).toList());
 
       return Future
           .wait(reusedLibrariesFuture)
@@ -380,12 +380,12 @@
       Future<Iterable<LibraryElement>> reuseLibraries(
           Iterable<LibraryElement> libraries)) {
     assert(currentHandler == null);
-    return compiler.reuseLibraryTask.measure(() {
+    return measureSubtask(_reuseLibrarySubtaskName, () {
       return new Future<Iterable<LibraryElement>>(() {
         // Wrap in Future to shield against errors in user code.
         return reuseLibraries(libraryCanonicalUriMap.values);
       }).catchError((exception, StackTrace trace) {
-        compiler.reportCrashInUserCode(
+        reporter.onCrashInUserCode(
             'Uncaught exception in reuseLibraries', exception, trace);
         throw exception; // Async rethrow.
       }).then((Iterable<LibraryElement> reusedLibraries) {
@@ -1508,3 +1508,5 @@
   /// Called whenever a library is scanned from a script file.
   Future onLibraryScanned(LibraryElement library, LibraryLoader loader);
 }
+
+const _reuseLibrarySubtaskName = "Reuse library";
diff --git a/pkg/compiler/lib/src/mirrors/analyze.dart b/pkg/compiler/lib/src/mirrors/analyze.dart
deleted file mode 100644
index d6ab956..0000000
--- a/pkg/compiler/lib/src/mirrors/analyze.dart
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.source_mirrors.analyze;
-
-import 'dart:async';
-
-import 'source_mirrors.dart';
-import 'dart2js_mirrors.dart' show Dart2JsMirrorSystem;
-import '../../compiler.dart' as api;
-import '../options.dart' show CompilerOptions;
-import '../apiimpl.dart' as apiimpl;
-import '../compiler.dart' show Compiler;
-import '../old_to_new_api.dart';
-
-//------------------------------------------------------------------------------
-// Analysis entry point.
-//------------------------------------------------------------------------------
-
-/**
- * Analyzes set of libraries and provides a mirror system which can be used for
- * static inspection of the source code.
- */
-// TODO(johnniwinther): Move this to [compiler/compiler.dart].
-Future<MirrorSystem> analyze(
-    List<Uri> libraries,
-    Uri libraryRoot,
-    Uri packageRoot,
-    api.CompilerInputProvider inputProvider,
-    api.DiagnosticHandler diagnosticHandler,
-    [List<String> options = const <String>[],
-    Uri packageConfig,
-    api.PackagesDiscoveryProvider findPackages]) {
-  if (!libraryRoot.path.endsWith("/")) {
-    throw new ArgumentError("libraryRoot must end with a /");
-  }
-  if (packageRoot != null && !packageRoot.path.endsWith("/")) {
-    throw new ArgumentError("packageRoot must end with a /");
-  }
-  options = new List<String>.from(options);
-  options.add('--analyze-only');
-  options.add('--analyze-signatures-only');
-  options.add('--analyze-all');
-  options.add('--categories=Client,Server');
-  options.add('--enable-async');
-  options.add('--allow-native-extensions');
-
-  bool compilationFailed = false;
-  void internalDiagnosticHandler(
-      Uri uri, int begin, int end, String message, api.Diagnostic kind) {
-    if (kind == api.Diagnostic.ERROR || kind == api.Diagnostic.CRASH) {
-      compilationFailed = true;
-    }
-    diagnosticHandler(uri, begin, end, message, kind);
-  }
-
-  Compiler compiler = new apiimpl.CompilerImpl(
-      new LegacyCompilerInput(inputProvider),
-      new LegacyCompilerOutput(),
-      new LegacyCompilerDiagnostics(internalDiagnosticHandler),
-      new CompilerOptions.parse(
-          libraryRoot: libraryRoot,
-          packageRoot: packageRoot,
-          options: options,
-          environment: const {},
-          packageConfig: packageConfig,
-          packagesDiscoveryProvider: findPackages));
-  compiler.librariesToAnalyzeWhenRun = libraries;
-  return compiler.run(null).then((bool success) {
-    if (success && !compilationFailed) {
-      return new Dart2JsMirrorSystem(compiler);
-    } else {
-      throw new StateError('Failed to create mirror system.');
-    }
-  });
-}
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_instance_mirrors.dart b/pkg/compiler/lib/src/mirrors/dart2js_instance_mirrors.dart
deleted file mode 100644
index 0c90060..0000000
--- a/pkg/compiler/lib/src/mirrors/dart2js_instance_mirrors.dart
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.mirrors;
-
-abstract class ObjectMirrorMixin implements ObjectMirror {
-  InstanceMirror getField(Symbol fieldName) {
-    throw new UnsupportedError('ObjectMirror.getField unsupported.');
-  }
-
-  InstanceMirror setField(Symbol fieldName, Object value) {
-    throw new UnsupportedError('ObjectMirror.setField unsupported.');
-  }
-
-  InstanceMirror invoke(Symbol memberName, List positionalArguments,
-      [Map<Symbol, dynamic> namedArguments]) {
-    throw new UnsupportedError('ObjectMirror.invoke unsupported.');
-  }
-
-  delegate(Invocation invocation) {
-    throw new UnsupportedError('ObjectMirror.delegate unsupported');
-  }
-}
-
-abstract class InstanceMirrorMixin implements InstanceMirror {
-  bool get hasReflectee => false;
-
-  get reflectee {
-    throw new UnsupportedError('InstanceMirror.reflectee unsupported.');
-  }
-}
-
-InstanceMirror _convertConstantToInstanceMirror(
-    Dart2JsMirrorSystem mirrorSystem,
-    ConstantExpression constant,
-    ConstantValue value) {
-  if (value.isBool) {
-    return new Dart2JsBoolConstantMirror(mirrorSystem, constant, value);
-  } else if (value.isNum) {
-    return new Dart2JsNumConstantMirror(mirrorSystem, constant, value);
-  } else if (value.isString) {
-    return new Dart2JsStringConstantMirror(mirrorSystem, constant, value);
-  } else if (value.isList) {
-    return new Dart2JsListConstantMirror(mirrorSystem, constant, value);
-  } else if (value.isMap) {
-    return new Dart2JsMapConstantMirror(mirrorSystem, constant, value);
-  } else if (value.isType) {
-    return new Dart2JsTypeConstantMirror(mirrorSystem, constant, value);
-  } else if (value.isFunction) {
-    return new Dart2JsConstantMirror(mirrorSystem, constant, value);
-  } else if (value.isNull) {
-    return new Dart2JsNullConstantMirror(mirrorSystem, constant, value);
-  } else if (value.isConstructedObject) {
-    return new Dart2JsConstructedConstantMirror(mirrorSystem, constant, value);
-  }
-  mirrorSystem.compiler.reporter
-      .internalError(NO_LOCATION_SPANNABLE, "Unexpected constant value $value");
-  return null;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Mirrors on constant values used for metadata.
-////////////////////////////////////////////////////////////////////////////////
-
-class Dart2JsConstantMirror extends Object
-    with ObjectMirrorMixin, InstanceMirrorMixin {
-  final Dart2JsMirrorSystem mirrorSystem;
-  final ConstantExpression _constant;
-  final ConstantValue _value;
-
-  Dart2JsConstantMirror(this.mirrorSystem, this._constant, this._value);
-
-  String toString() {
-    if (_constant != null) {
-      return _constant.toDartText();
-    } else {
-      return _value.toDartText();
-    }
-  }
-
-  ClassMirror get type {
-    return mirrorSystem._getTypeDeclarationMirror(
-        _value.getType(mirrorSystem.compiler.coreTypes).element);
-  }
-
-  int get hashCode => 13 * _constant.hashCode;
-
-  bool operator ==(var other) {
-    if (other is! Dart2JsConstantMirror) return false;
-    return _value == other._value;
-  }
-}
-
-class Dart2JsNullConstantMirror extends Dart2JsConstantMirror {
-  Dart2JsNullConstantMirror(Dart2JsMirrorSystem mirrorSystem,
-      ConstantExpression constant, NullConstantValue value)
-      : super(mirrorSystem, constant, value);
-
-  NullConstantValue get _value => super._value;
-
-  bool get hasReflectee => true;
-
-  get reflectee => null;
-}
-
-class Dart2JsBoolConstantMirror extends Dart2JsConstantMirror {
-  Dart2JsBoolConstantMirror(Dart2JsMirrorSystem mirrorSystem,
-      ConstantExpression constant, BoolConstantValue value)
-      : super(mirrorSystem, constant, value);
-
-  Dart2JsBoolConstantMirror.fromBool(
-      Dart2JsMirrorSystem mirrorSystem, bool value)
-      : super(mirrorSystem, null,
-            value ? new TrueConstantValue() : new FalseConstantValue());
-
-  BoolConstantValue get _value => super._value;
-
-  bool get hasReflectee => true;
-
-  get reflectee => _value is TrueConstantValue;
-}
-
-class Dart2JsStringConstantMirror extends Dart2JsConstantMirror {
-  Dart2JsStringConstantMirror(Dart2JsMirrorSystem mirrorSystem,
-      ConstantExpression constant, StringConstantValue value)
-      : super(mirrorSystem, constant, value);
-
-  Dart2JsStringConstantMirror.fromString(
-      Dart2JsMirrorSystem mirrorSystem, String text)
-      : super(mirrorSystem, null,
-            new StringConstantValue(new DartString.literal(text)));
-
-  StringConstantValue get _value => super._value;
-
-  bool get hasReflectee => true;
-
-  get reflectee => _value.primitiveValue.slowToString();
-}
-
-class Dart2JsNumConstantMirror extends Dart2JsConstantMirror {
-  Dart2JsNumConstantMirror(Dart2JsMirrorSystem mirrorSystem,
-      ConstantExpression constant, NumConstantValue value)
-      : super(mirrorSystem, constant, value);
-
-  NumConstantValue get _value => super._value;
-
-  bool get hasReflectee => true;
-
-  get reflectee => _value.primitiveValue;
-}
-
-class Dart2JsListConstantMirror extends Dart2JsConstantMirror
-    implements ListInstanceMirror {
-  Dart2JsListConstantMirror(Dart2JsMirrorSystem mirrorSystem,
-      ConstantExpression constant, ListConstantValue value)
-      : super(mirrorSystem, constant, value);
-
-  ListConstantValue get _value => super._value;
-
-  int get length => _value.length;
-
-  InstanceMirror getElement(int index) {
-    if (index < 0) throw new RangeError('Negative index');
-    if (index >= _value.length) throw new RangeError('Index out of bounds');
-    return _convertConstantToInstanceMirror(
-        mirrorSystem, null, _value.entries[index]);
-  }
-}
-
-class Dart2JsMapConstantMirror extends Dart2JsConstantMirror
-    implements MapInstanceMirror {
-  List<String> _listCache;
-
-  Dart2JsMapConstantMirror(Dart2JsMirrorSystem mirrorSystem,
-      ConstantExpression constant, MapConstantValue value)
-      : super(mirrorSystem, constant, value);
-
-  MapConstantValue get _value => super._value;
-
-  List<String> get _list {
-    if (_listCache == null) {
-      _listCache = new List<String>(_value.length);
-      int index = 0;
-      for (StringConstantValue keyConstant in _value.keys) {
-        _listCache[index] = keyConstant.primitiveValue.slowToString();
-        index++;
-      }
-      _listCache = new UnmodifiableListView<String>(_listCache);
-    }
-    return _listCache;
-  }
-
-  int get length => _value.length;
-
-  Iterable<String> get keys {
-    return _list;
-  }
-
-  InstanceMirror getValue(String key) {
-    int index = _list.indexOf(key);
-    if (index == -1) return null;
-    return _convertConstantToInstanceMirror(
-        mirrorSystem, null, _value.values[index]);
-  }
-}
-
-class Dart2JsTypeConstantMirror extends Dart2JsConstantMirror
-    implements TypeInstanceMirror {
-  Dart2JsTypeConstantMirror(Dart2JsMirrorSystem mirrorSystem,
-      ConstantExpression constant, TypeConstantValue value)
-      : super(mirrorSystem, constant, value);
-
-  TypeConstantValue get _value => super._value;
-
-  TypeMirror get representedType =>
-      mirrorSystem._convertTypeToTypeMirror(_value.representedType);
-}
-
-class Dart2JsConstructedConstantMirror extends Dart2JsConstantMirror {
-  Map<String, ConstantValue> _fieldMapCache;
-
-  Dart2JsConstructedConstantMirror(Dart2JsMirrorSystem mirrorSystem,
-      ConstantExpression constant, ConstructedConstantValue value)
-      : super(mirrorSystem, constant, value);
-
-  ConstructedConstantValue get _value => super._value;
-
-  Map<String, ConstantValue> get _fieldMap {
-    if (_fieldMapCache == null) {
-      _fieldMapCache = new Map<String, ConstantValue>();
-      if (identical(_value.type.element.kind, ElementKind.CLASS)) {
-        _value.fields.forEach((FieldElement field, ConstantValue value) {
-          _fieldMapCache[field.name] = value;
-        });
-      }
-    }
-    return _fieldMapCache;
-  }
-
-  InstanceMirror getField(Symbol fieldName) {
-    String name = MirrorSystem.getName(fieldName);
-    ConstantValue fieldConstant = _fieldMap[name];
-    if (fieldConstant != null) {
-      return _convertConstantToInstanceMirror(
-          mirrorSystem, null, fieldConstant);
-    }
-    return super.getField(fieldName);
-  }
-}
-
-class Dart2JsCommentInstanceMirror extends Object
-    with ObjectMirrorMixin, InstanceMirrorMixin
-    implements CommentInstanceMirror {
-  final Dart2JsMirrorSystem mirrorSystem;
-  final String text;
-  String _trimmedText;
-
-  Dart2JsCommentInstanceMirror(this.mirrorSystem, this.text);
-
-  ClassMirror get type {
-    return mirrorSystem
-        ._getTypeDeclarationMirror(mirrorSystem.compiler.documentClass);
-  }
-
-  bool get isDocComment => text.startsWith('/**') || text.startsWith('///');
-
-  String get trimmedText {
-    if (_trimmedText == null) {
-      _trimmedText = stripComment(text);
-    }
-    return _trimmedText;
-  }
-
-  InstanceMirror getField(Symbol fieldName) {
-    if (fieldName == #isDocComment) {
-      return new Dart2JsBoolConstantMirror.fromBool(mirrorSystem, isDocComment);
-    } else if (fieldName == #text) {
-      return new Dart2JsStringConstantMirror.fromString(mirrorSystem, text);
-    } else if (fieldName == #trimmedText) {
-      return new Dart2JsStringConstantMirror.fromString(
-          mirrorSystem, trimmedText);
-    }
-    return super.getField(fieldName);
-  }
-}
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_library_mirror.dart b/pkg/compiler/lib/src/mirrors/dart2js_library_mirror.dart
deleted file mode 100644
index 39468d3..0000000
--- a/pkg/compiler/lib/src/mirrors/dart2js_library_mirror.dart
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.mirrors;
-
-class Dart2JsLibraryMirror extends Dart2JsElementMirror
-    with ObjectMirrorMixin, ContainerMixin
-    implements LibrarySourceMirror {
-  List<LibraryDependencySourceMirror> _libraryDependencies;
-
-  Dart2JsLibraryMirror(Dart2JsMirrorSystem system, LibraryElement library)
-      : super(system, library);
-
-  Function operator [](Symbol name) {
-    throw new UnsupportedError('LibraryMirror.operator [] unsupported.');
-  }
-
-  // TODO(johnniwinther): Avoid the need for [LibraryElementX].
-  LibraryElementX get _element => super._element;
-
-  Uri get uri => _element.canonicalUri;
-
-  DeclarationMirror get owner => null;
-
-  bool get isPrivate => false;
-
-  LibraryMirror library() => this;
-
-  /**
-   * Returns the library name (for libraries with a library tag) or the script
-   * file name (for scripts without a library tag). The latter case is used to
-   * provide a 'library name' for scripts, to use for instance in dartdoc.
-   */
-  String get _simpleNameString => _element.libraryOrScriptName;
-
-  Symbol get qualifiedName => simpleName;
-
-  void _forEachElement(f(Element element)) => _element.forEachLocalMember(f);
-
-  Iterable<Dart2JsDeclarationMirror> _getDeclarationMirrors(Element element) {
-    if (element.isClass || element.isTypedef) {
-      return [mirrorSystem._getTypeDeclarationMirror(element)];
-    } else {
-      return super._getDeclarationMirrors(element);
-    }
-  }
-
-  Map<Symbol, MethodMirror> get topLevelMembers => null;
-
-  /**
-   * Computes the first token of this library using the first library tag as
-   * indicator.
-   */
-  Token getBeginToken() {
-    if (_element.libraryTag != null) {
-      return _element.libraryTag.getBeginToken();
-    } else if (!_element.tags.isEmpty) {
-      return _element.tags.first.getBeginToken();
-    }
-    return null;
-  }
-
-  /**
-   * Computes the first token of this library using the last library tag as
-   * indicator.
-   */
-  Token getEndToken() {
-    if (!_element.tags.isEmpty) {
-      return _element.tags.last.getEndToken();
-    }
-    return null;
-  }
-
-  void _ensureLibraryDependenciesAnalyzed() {
-    if (_libraryDependencies == null) {
-      // TODO(johnniwinther): Support order of declarations on [LibraryElement].
-      Map<LibraryDependency, Dart2JsLibraryDependencyMirror> mirrorMap =
-          <LibraryDependency, Dart2JsLibraryDependencyMirror>{};
-
-      void addLibraryDependency(LibraryDependency libraryDependency,
-          LibraryElement targetLibraryElement) {
-        assert(targetLibraryElement != null);
-        LibraryMirror targetLibrary =
-            mirrorSystem._getLibrary(targetLibraryElement);
-        mirrorMap[libraryDependency] = new Dart2JsLibraryDependencyMirror(
-            libraryDependency, this, targetLibrary);
-      }
-      for (ImportElement import in _element.imports) {
-        addLibraryDependency(import.node, import.importedLibrary);
-      }
-      for (ExportElement export in _element.exports) {
-        addLibraryDependency(export.node, export.exportedLibrary);
-      }
-
-      _libraryDependencies = <LibraryDependencySourceMirror>[];
-
-      for (LibraryTag node in _element.tags) {
-        LibraryDependency libraryDependency = node.asLibraryDependency();
-        if (libraryDependency != null) {
-          Dart2JsLibraryDependencyMirror mirror = mirrorMap[libraryDependency];
-          assert(mirror != null);
-          _libraryDependencies.add(mirror);
-        }
-      }
-    }
-  }
-
-  List<LibraryDependencyMirror> get libraryDependencies {
-    _ensureLibraryDependenciesAnalyzed();
-    return _libraryDependencies;
-  }
-}
-
-class Dart2JsLibraryDependencyMirror implements LibraryDependencySourceMirror {
-  final LibraryDependency _node;
-  final Dart2JsLibraryMirror _sourceLibrary;
-  final Dart2JsLibraryMirror _targetLibrary;
-  List<CombinatorMirror> _combinators;
-
-  Dart2JsLibraryDependencyMirror(
-      this._node, this._sourceLibrary, this._targetLibrary);
-
-  SourceLocation get location {
-    return new Dart2JsSourceLocation(
-        _sourceLibrary._element.entryCompilationUnit.script,
-        _sourceLibrary.mirrorSystem.compiler.reporter.spanFromSpannable(_node));
-  }
-
-  List<CombinatorMirror> get combinators {
-    if (_combinators == null) {
-      _combinators = <CombinatorMirror>[];
-      if (_node.combinators != null) {
-        for (Combinator combinator in _node.combinators.nodes) {
-          List<String> identifiers = <String>[];
-          for (Identifier identifier in combinator.identifiers.nodes) {
-            identifiers.add(identifier.source);
-          }
-          _combinators.add(new Dart2JsCombinatorMirror(identifiers,
-              isShow: combinator.isShow));
-        }
-      }
-    }
-    return _combinators;
-  }
-
-  LibraryMirror get sourceLibrary => _sourceLibrary;
-
-  LibraryMirror get targetLibrary => _targetLibrary;
-
-  /*String*/ get prefix {
-    Import import = _node.asImport();
-    if (import != null && import.prefix != null) {
-      return import.prefix.source;
-    }
-    return null;
-  }
-
-  bool get isImport => _node.asImport() != null;
-
-  bool get isExport => _node.asExport() != null;
-
-  bool get isDeferred {
-    if (_node is Import) {
-      Import import = _node;
-      return import.isDeferred;
-    }
-    return false;
-  }
-
-  List<InstanceMirror> get metadata => const <InstanceMirror>[];
-
-  /*Future<LibraryMirror>*/ loadLibrary() {
-    throw new UnsupportedError(
-        'LibraryDependencyMirror.loadLibrary unsupported.');
-  }
-}
-
-class Dart2JsCombinatorMirror implements CombinatorSourceMirror {
-  final List/*<String>*/ identifiers;
-  final bool isShow;
-
-  Dart2JsCombinatorMirror(this.identifiers, {bool isShow: true})
-      : this.isShow = isShow;
-
-  bool get isHide => !isShow;
-}
-
-class Dart2JsSourceLocation implements SourceLocation {
-  final Script _script;
-  final SourceSpan _span;
-  int _line;
-  int _column;
-
-  Dart2JsSourceLocation(this._script, this._span);
-
-  int _computeLine() {
-    var sourceFile = _script.file;
-    if (sourceFile != null) {
-      return sourceFile.getLine(offset) + 1;
-    }
-    var index = 0;
-    var lineNumber = 0;
-    while (index <= offset && index < sourceText.length) {
-      index = sourceText.indexOf('\n', index) + 1;
-      if (index <= 0) break;
-      lineNumber++;
-    }
-    return lineNumber;
-  }
-
-  int get line {
-    if (_line == null) {
-      _line = _computeLine();
-    }
-    return _line;
-  }
-
-  int _computeColumn() {
-    if (length == 0) return 0;
-
-    var sourceFile = _script.file;
-    if (sourceFile != null) {
-      return sourceFile.getColumn(sourceFile.getLine(offset), offset) + 1;
-    }
-    int index = offset - 1;
-    var columnNumber = 0;
-    while (0 <= index && index < sourceText.length) {
-      columnNumber++;
-      var codeUnit = sourceText.codeUnitAt(index);
-      if (codeUnit == $CR || codeUnit == $LF) {
-        break;
-      }
-      index--;
-    }
-    return columnNumber;
-  }
-
-  int get column {
-    if (_column == null) {
-      _column = _computeColumn();
-    }
-    return _column;
-  }
-
-  int get offset => _span.begin;
-
-  int get length => _span.end - _span.begin;
-
-  String get text => _script.text.substring(_span.begin, _span.end);
-
-  Uri get sourceUri => _script.resourceUri;
-
-  String get sourceText => _script.text;
-}
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_member_mirrors.dart b/pkg/compiler/lib/src/mirrors/dart2js_member_mirrors.dart
deleted file mode 100644
index 8278525..0000000
--- a/pkg/compiler/lib/src/mirrors/dart2js_member_mirrors.dart
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.mirrors;
-
-//------------------------------------------------------------------------------
-// Member mirrors implementation.
-//------------------------------------------------------------------------------
-
-abstract class Dart2JsMemberMirror extends Dart2JsElementMirror {
-  Dart2JsMemberMirror(Dart2JsMirrorSystem system, AstElement element)
-      : super(system, element);
-
-  bool get isStatic => false;
-}
-
-class Dart2JsMethodKind {
-  static const Dart2JsMethodKind REGULAR = const Dart2JsMethodKind("regular");
-  static const Dart2JsMethodKind GENERATIVE =
-      const Dart2JsMethodKind("generative");
-  static const Dart2JsMethodKind REDIRECTING =
-      const Dart2JsMethodKind("redirecting");
-  static const Dart2JsMethodKind CONST = const Dart2JsMethodKind("const");
-  static const Dart2JsMethodKind FACTORY = const Dart2JsMethodKind("factory");
-  static const Dart2JsMethodKind GETTER = const Dart2JsMethodKind("getter");
-  static const Dart2JsMethodKind SETTER = const Dart2JsMethodKind("setter");
-  static const Dart2JsMethodKind OPERATOR = const Dart2JsMethodKind("operator");
-
-  final String text;
-
-  const Dart2JsMethodKind(this.text);
-
-  String toString() => text;
-}
-
-class Dart2JsMethodMirror extends Dart2JsMemberMirror implements MethodMirror {
-  final Dart2JsDeclarationMirror owner;
-  final String _simpleNameString;
-  final Dart2JsMethodKind _kind;
-
-  Dart2JsMethodMirror._internal(
-      Dart2JsDeclarationMirror owner,
-      FunctionElement function,
-      String this._simpleNameString,
-      Dart2JsMethodKind this._kind)
-      : this.owner = owner,
-        super(owner.mirrorSystem, function);
-
-  factory Dart2JsMethodMirror(
-      Dart2JsDeclarationMirror owner, FunctionElement function) {
-    String simpleName = function.name;
-    // TODO(ahe): This method should not be calling
-    // Elements.operatorNameToIdentifier.
-    Dart2JsMethodKind kind;
-    if (function.kind == ElementKind.GETTER) {
-      kind = Dart2JsMethodKind.GETTER;
-    } else if (function.kind == ElementKind.SETTER) {
-      kind = Dart2JsMethodKind.SETTER;
-      simpleName = '$simpleName=';
-    } else if (function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
-      // TODO(johnniwinther): Support detection of redirecting constructors.
-      if (function.isConst) {
-        kind = Dart2JsMethodKind.CONST;
-      } else {
-        kind = Dart2JsMethodKind.GENERATIVE;
-      }
-    } else if (function.isFactoryConstructor) {
-      // TODO(johnniwinther): Support detection of redirecting constructors.
-      kind = Dart2JsMethodKind.FACTORY;
-    } else if (function.isOperator) {
-      kind = Dart2JsMethodKind.OPERATOR;
-    } else {
-      kind = Dart2JsMethodKind.REGULAR;
-    }
-    return new Dart2JsMethodMirror._internal(owner, function, simpleName, kind);
-  }
-
-  FunctionElement get _function => _element;
-
-  bool get isTopLevel => owner is LibraryMirror;
-
-  // TODO(johnniwinther): This seems stale and broken.
-  Symbol get constructorName => isConstructor ? simpleName : const Symbol('');
-
-  bool get isConstructor =>
-      isGenerativeConstructor ||
-      isConstConstructor ||
-      isFactoryConstructor ||
-      isRedirectingConstructor;
-
-  bool get isSynthetic => false;
-
-  bool get isStatic => _function.isStatic;
-
-  List<ParameterMirror> get parameters {
-    return _parametersFromFunctionSignature(this, _function.functionSignature);
-  }
-
-  TypeMirror get returnType =>
-      owner._getTypeMirror(_function.functionSignature.type.returnType);
-
-  bool get isAbstract => _function.isAbstract;
-
-  bool get isRegularMethod => !(isGetter || isSetter || isConstructor);
-
-  bool get isConstConstructor => _kind == Dart2JsMethodKind.CONST;
-
-  bool get isGenerativeConstructor => _kind == Dart2JsMethodKind.GENERATIVE;
-
-  bool get isRedirectingConstructor => _kind == Dart2JsMethodKind.REDIRECTING;
-
-  bool get isFactoryConstructor => _kind == Dart2JsMethodKind.FACTORY;
-
-  bool get isGetter => _kind == Dart2JsMethodKind.GETTER;
-
-  bool get isSetter => _kind == Dart2JsMethodKind.SETTER;
-
-  bool get isOperator => _kind == Dart2JsMethodKind.OPERATOR;
-
-  DeclarationMirror lookupInScope(String name) {
-    for (Dart2JsParameterMirror parameter in parameters) {
-      if (parameter._element.name == name) {
-        return parameter;
-      }
-    }
-    return super.lookupInScope(name);
-  }
-
-  // TODO(johnniwinther): Should this really be in the interface of
-  // [MethodMirror]?
-  String get source => location.sourceText;
-
-  String toString() => 'Mirror on method ${_element.name}';
-}
-
-class Dart2JsFieldMirror extends Dart2JsMemberMirror implements VariableMirror {
-  final Dart2JsDeclarationMirror owner;
-  VariableElement _variable;
-
-  Dart2JsFieldMirror(Dart2JsDeclarationMirror owner, VariableElement variable)
-      : this.owner = owner,
-        this._variable = variable,
-        super(owner.mirrorSystem, variable);
-
-  bool get isTopLevel => owner is LibraryMirror;
-
-  bool get isStatic => _variable.isStatic;
-
-  bool get isFinal => _variable.isFinal;
-
-  bool get isConst => _variable.isConst;
-
-  TypeMirror get type => owner._getTypeMirror(_variable.type);
-}
-
-class Dart2JsParameterMirror extends Dart2JsMemberMirror
-    implements ParameterMirror {
-  final Dart2JsDeclarationMirror owner;
-  final bool isOptional;
-  final bool isNamed;
-
-  factory Dart2JsParameterMirror(
-      Dart2JsDeclarationMirror owner, FormalElement element,
-      {bool isOptional: false, bool isNamed: false}) {
-    if (element is InitializingFormalElement) {
-      return new Dart2JsFieldParameterMirror(
-          owner, element, isOptional, isNamed);
-    } else {
-      return new Dart2JsParameterMirror._normal(
-          owner, element, isOptional, isNamed);
-    }
-  }
-
-  Dart2JsParameterMirror._normal(Dart2JsDeclarationMirror owner,
-      FormalElement element, this.isOptional, this.isNamed)
-      : this.owner = owner,
-        super(owner.mirrorSystem, element);
-
-  FormalElement get _element => super._element;
-
-  TypeMirror get type => owner._getTypeMirror(_element.type);
-
-  bool get isFinal => false;
-
-  bool get isConst => false;
-
-  InstanceMirror get defaultValue {
-    if (hasDefaultValue) {
-      // TODO(johnniwinther): Get the constant from the [TreeElements]
-      // associated with the enclosing method.
-      ParameterElement parameter = _element;
-      ConstantExpression constant = parameter.constant;
-      assert(invariant(parameter, constant != null,
-          message: "Missing constant for parameter "
-              "$parameter with default value."));
-      return _convertConstantToInstanceMirror(mirrorSystem, constant,
-          mirrorSystem.compiler.constants.getConstantValue(constant));
-    }
-    return null;
-  }
-
-  bool get hasDefaultValue {
-    if (_element is ParameterElement) {
-      ParameterElement parameter = _element;
-      return parameter.initializer != null;
-    }
-    return false;
-  }
-
-  bool get isInitializingFormal => false;
-
-  VariableMirror get initializedField => null;
-}
-
-class Dart2JsFieldParameterMirror extends Dart2JsParameterMirror {
-  Dart2JsFieldParameterMirror(Dart2JsDeclarationMirror method,
-      InitializingFormalElement element, bool isOptional, bool isNamed)
-      : super._normal(method, element, isOptional, isNamed);
-
-  InitializingFormalElement get _fieldParameterElement => _element;
-
-  bool get isInitializingFormal => true;
-
-  VariableMirror get initializedField =>
-      new Dart2JsFieldMirror(owner.owner, _fieldParameterElement.fieldElement);
-}
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_mirrors.dart b/pkg/compiler/lib/src/mirrors/dart2js_mirrors.dart
deleted file mode 100644
index 406502a..0000000
--- a/pkg/compiler/lib/src/mirrors/dart2js_mirrors.dart
+++ /dev/null
@@ -1,480 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.mirrors;
-
-import 'dart:collection' show UnmodifiableListView, UnmodifiableMapView;
-
-import '../common.dart';
-import '../compiler.dart' show Compiler;
-import '../constants/expressions.dart';
-import '../constants/values.dart';
-import '../dart_types.dart';
-import '../elements/elements.dart';
-import '../elements/modelx.dart' show LibraryElementX;
-import '../resolution/scope.dart' show Scope;
-import '../script.dart';
-import '../tokens/token.dart';
-import '../tokens/token_constants.dart' as Tokens;
-import '../tree/tree.dart';
-import '../util/characters.dart' show $CR, $LF;
-import '../util/util.dart' show Link;
-import 'mirrors_util.dart';
-import 'source_mirrors.dart';
-
-part 'dart2js_instance_mirrors.dart';
-part 'dart2js_library_mirror.dart';
-part 'dart2js_member_mirrors.dart';
-part 'dart2js_type_mirrors.dart';
-
-//------------------------------------------------------------------------------
-// Utility types and functions for the dart2js mirror system
-//------------------------------------------------------------------------------
-
-bool _includeLibrary(Dart2JsLibraryMirror mirror) {
-  return const bool.fromEnvironment("list_all_libraries") ||
-      !mirror._element.isInternalLibrary;
-}
-
-bool _isPrivate(String name) {
-  return name.startsWith('_');
-}
-
-List<ParameterMirror> _parametersFromFunctionSignature(
-    Dart2JsDeclarationMirror owner, FunctionSignature signature) {
-  var parameters = <ParameterMirror>[];
-  signature.requiredParameters.forEach((FormalElement parameter) {
-    parameters.add(new Dart2JsParameterMirror(owner, parameter,
-        isOptional: false, isNamed: false));
-  });
-  bool isNamed = signature.optionalParametersAreNamed;
-  signature.optionalParameters.forEach((FormalElement parameter) {
-    parameters.add(new Dart2JsParameterMirror(owner, parameter,
-        isOptional: true, isNamed: isNamed));
-  });
-  return parameters;
-}
-
-MethodMirror _convertElementMethodToMethodMirror(
-    Dart2JsDeclarationMirror library, Element element) {
-  if (element is FunctionElement) {
-    return new Dart2JsMethodMirror(library, element);
-  } else {
-    return null;
-  }
-}
-
-//------------------------------------------------------------------------------
-// Dart2Js specific extensions of mirror interfaces
-//------------------------------------------------------------------------------
-
-abstract class Dart2JsMirror implements Mirror {
-  Dart2JsMirrorSystem get mirrorSystem;
-}
-
-abstract class Dart2JsDeclarationMirror extends Dart2JsMirror
-    implements DeclarationSourceMirror {
-  bool get isTopLevel => owner != null && owner is LibraryMirror;
-
-  bool get isPrivate => _isPrivate(_simpleNameString);
-
-  String get _simpleNameString;
-
-  String get _qualifiedNameString {
-    var parent = owner;
-    if (parent is Dart2JsDeclarationMirror) {
-      return '${parent._qualifiedNameString}.${_simpleNameString}';
-    }
-    assert(parent == null);
-    return _simpleNameString;
-  }
-
-  Symbol get simpleName => symbolOf(_simpleNameString, getLibrary(this));
-
-  Symbol get qualifiedName => symbolOf(_qualifiedNameString, getLibrary(this));
-
-  DeclarationMirror lookupInScope(String name) => null;
-
-  bool get isNameSynthetic => false;
-
-  /// Returns the type mirror for [type] in the context of this declaration.
-  TypeMirror _getTypeMirror(DartType type) {
-    return mirrorSystem._convertTypeToTypeMirror(type);
-  }
-
-  /// Returns a list of the declaration mirrorSystem for [element].
-  Iterable<Dart2JsMemberMirror> _getDeclarationMirrors(Element element) {
-    if (element.isSynthesized) {
-      return const <Dart2JsMemberMirror>[];
-    } else if (element is VariableElement) {
-      return <Dart2JsMemberMirror>[new Dart2JsFieldMirror(this, element)];
-    } else if (element is FunctionElement) {
-      return <Dart2JsMemberMirror>[new Dart2JsMethodMirror(this, element)];
-    } else if (element is AbstractFieldElement) {
-      var members = <Dart2JsMemberMirror>[];
-      AbstractFieldElement field = element;
-      if (field.getter != null) {
-        members.add(new Dart2JsMethodMirror(this, field.getter));
-      }
-      if (field.setter != null) {
-        members.add(new Dart2JsMethodMirror(this, field.setter));
-      }
-      return members;
-    }
-    mirrorSystem.compiler.reporter.internalError(
-        element, "Unexpected member type $element ${element.kind}.");
-    return null;
-  }
-}
-
-abstract class Dart2JsElementMirror extends Dart2JsDeclarationMirror {
-  final Dart2JsMirrorSystem mirrorSystem;
-  final Element _element;
-  List<InstanceMirror> _metadata;
-
-  Dart2JsElementMirror(this.mirrorSystem, this._element) {
-    assert(mirrorSystem != null);
-    assert(_element != null);
-  }
-
-  String get _simpleNameString => _element.name;
-
-  /**
-   * Computes the first token for this declaration using the begin token of the
-   * element node or element position as indicator.
-   */
-  Token getBeginToken() {
-    Element element = _element;
-    if (element is AstElement) {
-      Node node = element.node;
-      if (node != null) {
-        return node.getBeginToken();
-      }
-    }
-    return element.position;
-  }
-
-  /**
-   * Computes the last token for this declaration using the end token of the
-   * element node or element position as indicator.
-   */
-  Token getEndToken() {
-    Element element = _element;
-    if (element is AstElement) {
-      Node node = element.node;
-      if (node != null) {
-        return node.getEndToken();
-      }
-    }
-    return element.position;
-  }
-
-  /**
-   * Returns the first token for the source of this declaration, including
-   * metadata annotations.
-   */
-  Token getFirstToken() {
-    if (!_element.metadata.isEmpty) {
-      for (MetadataAnnotation metadata in _element.metadata) {
-        if (metadata.beginToken != null) {
-          return metadata.beginToken;
-        }
-      }
-    }
-    return getBeginToken();
-  }
-
-  Script getScript() => _element.compilationUnit.script;
-
-  SourceLocation get location {
-    Token beginToken = getFirstToken();
-    Script script = getScript();
-    SourceSpan span;
-    if (beginToken == null) {
-      span = new SourceSpan(script.resourceUri, 0, 0);
-    } else {
-      Token endToken = getEndToken();
-      span =
-          new SourceSpan.fromTokens(script.resourceUri, beginToken, endToken);
-    }
-    return new Dart2JsSourceLocation(script, span);
-  }
-
-  String toString() => _element.toString();
-
-  void _appendCommentTokens(Token commentToken) {
-    while (commentToken != null && commentToken.kind == Tokens.COMMENT_TOKEN) {
-      _metadata.add(
-          new Dart2JsCommentInstanceMirror(mirrorSystem, commentToken.value));
-      commentToken = commentToken.next;
-    }
-  }
-
-  List<InstanceMirror> get metadata {
-    if (_metadata == null) {
-      _metadata = <InstanceMirror>[];
-      for (MetadataAnnotation metadata in _element.metadata) {
-        _appendCommentTokens(
-            mirrorSystem.compiler.commentMap[metadata.beginToken]);
-        metadata.ensureResolved(mirrorSystem.compiler.resolution);
-        _metadata.add(_convertConstantToInstanceMirror(
-            mirrorSystem,
-            metadata.constant,
-            mirrorSystem.compiler.constants
-                .getConstantValue(metadata.constant)));
-      }
-      _appendCommentTokens(mirrorSystem.compiler.commentMap[getBeginToken()]);
-    }
-    // TODO(johnniwinther): Return an unmodifiable list instead.
-    return new List<InstanceMirror>.from(_metadata);
-  }
-
-  DeclarationMirror lookupInScope(String name) {
-    // TODO(11653): Support lookup of constructors.
-    Scope scope = _element.buildScope();
-    Element result;
-    int index = name.indexOf('.');
-    if (index != -1) {
-      // Lookup [: prefix.id :].
-      String prefix = name.substring(0, index);
-      String id = name.substring(index + 1);
-      result = scope.lookup(prefix);
-      if (result != null && result.isPrefix) {
-        PrefixElement prefix = result;
-        result = prefix.lookupLocalMember(id);
-      } else {
-        result = null;
-      }
-    } else {
-      // Lookup [: id :].
-      result = scope.lookup(name);
-    }
-    if (result == null || result.isPrefix) return null;
-    return _convertElementToDeclarationMirror(mirrorSystem, result);
-  }
-
-  bool operator ==(var other) {
-    if (identical(this, other)) return true;
-    if (other == null) return false;
-    if (other is! Dart2JsElementMirror) return false;
-    return _element == other._element && owner == other.owner;
-  }
-
-  int get hashCode {
-    return 13 * _element.hashCode + 17 * owner.hashCode;
-  }
-}
-
-//------------------------------------------------------------------------------
-// Mirror system implementation.
-//------------------------------------------------------------------------------
-
-class Dart2JsMirrorSystem extends MirrorSystem {
-  final Compiler compiler;
-  Map<LibraryElement, Dart2JsLibraryMirror> _libraryMap;
-  UnmodifiableMapView<Uri, LibraryMirror> _filteredLibraries;
-
-  Dart2JsMirrorSystem(this.compiler);
-
-  IsolateMirror get isolate => null;
-
-  void _ensureLibraries() {
-    if (_filteredLibraries == null) {
-      var filteredLibs = new Map<Uri, LibraryMirror>();
-      _libraryMap = new Map<LibraryElement, Dart2JsLibraryMirror>();
-      compiler.libraryLoader.libraries.forEach((LibraryElement v) {
-        var mirror = new Dart2JsLibraryMirror(mirrorSystem, v);
-        if (_includeLibrary(mirror)) {
-          filteredLibs[mirror.uri] = mirror;
-        }
-        _libraryMap[v] = mirror;
-      });
-
-      _filteredLibraries =
-          new UnmodifiableMapView<Uri, LibraryMirror>(filteredLibs);
-    }
-  }
-
-  Map<Uri, LibraryMirror> get libraries {
-    _ensureLibraries();
-    return _filteredLibraries;
-  }
-
-  Dart2JsLibraryMirror _getLibrary(LibraryElement element) =>
-      _libraryMap[element];
-
-  Dart2JsMirrorSystem get mirrorSystem => this;
-
-  TypeMirror get dynamicType => _convertTypeToTypeMirror(const DynamicType());
-
-  TypeMirror get voidType => _convertTypeToTypeMirror(const VoidType());
-
-  TypeMirror _convertTypeToTypeMirror(DartType type) {
-    assert(type != null);
-    if (type.treatAsDynamic) {
-      return new Dart2JsDynamicMirror(this, type);
-    } else if (type is InterfaceType) {
-      if (type.typeArguments.isEmpty) {
-        return _getTypeDeclarationMirror(type.element);
-      } else {
-        return new Dart2JsInterfaceTypeMirror(this, type);
-      }
-    } else if (type is TypeVariableType) {
-      return new Dart2JsTypeVariableMirror(this, type);
-    } else if (type is FunctionType) {
-      return new Dart2JsFunctionTypeMirror(this, type);
-    } else if (type is VoidType) {
-      return new Dart2JsVoidMirror(this, type);
-    } else if (type is TypedefType) {
-      if (type.typeArguments.isEmpty) {
-        return _getTypeDeclarationMirror(type.element);
-      } else {
-        return new Dart2JsTypedefMirror(this, type);
-      }
-    }
-    compiler.reporter.internalError(
-        type.element, "Unexpected type $type of kind ${type.kind}.");
-    return null;
-  }
-
-  DeclarationMirror _getTypeDeclarationMirror(TypeDeclarationElement element) {
-    if (element.isClass) {
-      return new Dart2JsClassDeclarationMirror(this, element.thisType);
-    } else if (element.isTypedef) {
-      return new Dart2JsTypedefDeclarationMirror(this, element.thisType);
-    }
-    compiler.reporter.internalError(element, "Unexpected element $element.");
-    return null;
-  }
-}
-
-abstract class ContainerMixin {
-  UnmodifiableMapView<Symbol, DeclarationMirror> _declarations;
-
-  void _ensureDeclarations() {
-    if (_declarations == null) {
-      var declarations = <Symbol, DeclarationMirror>{};
-      _forEachElement((Element element) {
-        for (DeclarationMirror mirror in _getDeclarationMirrors(element)) {
-          assert(
-              invariant(_element, !declarations.containsKey(mirror.simpleName),
-                  message: "Declaration name '${nameOf(mirror)}' "
-                      "is not unique in $_element."));
-          declarations[mirror.simpleName] = mirror;
-        }
-      });
-      _declarations =
-          new UnmodifiableMapView<Symbol, DeclarationMirror>(declarations);
-    }
-  }
-
-  Element get _element;
-
-  void _forEachElement(f(Element element));
-
-  Iterable<Dart2JsMemberMirror> _getDeclarationMirrors(Element element);
-
-  Map<Symbol, DeclarationMirror> get declarations {
-    _ensureDeclarations();
-    return _declarations;
-  }
-}
-
-/**
- * Converts [element] into its corresponding [DeclarationMirror], if any.
- *
- * If [element] is an [AbstractFieldElement] the mirror for its getter is
- * returned or, if not present, the mirror for its setter.
- */
-DeclarationMirror _convertElementToDeclarationMirror(
-    Dart2JsMirrorSystem system, Element element) {
-  if (element.isTypeVariable) {
-    TypeVariableElement typeVariable = element;
-    return new Dart2JsTypeVariableMirror(system, typeVariable.type);
-  }
-
-  Dart2JsLibraryMirror library = system._libraryMap[element.library];
-  if (element.isLibrary) return library;
-  if (element.isTypedef) {
-    TypedefElement typedefElement = element;
-    return new Dart2JsTypedefMirror.fromLibrary(
-        library, typedefElement.thisType);
-  }
-
-  Dart2JsDeclarationMirror container = library;
-  if (element.enclosingClass != null) {
-    container = system._getTypeDeclarationMirror(element.enclosingClass);
-  }
-  if (element.isClass) return container;
-  if (element.isParameter) {
-    Dart2JsMethodMirror method = _convertElementMethodToMethodMirror(
-        container, element.outermostEnclosingMemberOrTopLevel);
-    // TODO(johnniwinther): Find the right info for [isOptional] and [isNamed].
-    return new Dart2JsParameterMirror(method, element,
-        isOptional: false, isNamed: false);
-  }
-  Iterable<DeclarationMirror> members =
-      container._getDeclarationMirrors(element);
-  if (members.isEmpty) return null;
-  return members.first;
-}
-
-/**
- * Experimental API for accessing compilation units defined in a
- * library.
- */
-// TODO(ahe): Superclasses? Is this really a mirror?
-class Dart2JsCompilationUnitMirror extends Dart2JsMirror with ContainerMixin {
-  final Dart2JsLibraryMirror _library;
-  final CompilationUnitElement _element;
-
-  Dart2JsCompilationUnitMirror(this._element, this._library);
-
-  Dart2JsMirrorSystem get mirrorSystem => _library.mirrorSystem;
-
-  // TODO(johnniwinther): make sure that these are returned in declaration
-  // order.
-  void _forEachElement(f(Element element)) => _element.forEachLocalMember(f);
-
-  Iterable<DeclarationMirror> _getDeclarationMirrors(Element element) =>
-      _library._getDeclarationMirrors(element);
-
-  Uri get uri => _element.script.resourceUri;
-}
-
-/**
- * Transitional class that allows access to features that have not yet
- * made it to the mirror API.
- *
- * All API in this class is experimental.
- */
-class BackDoor {
-  /// Return the compilation units comprising [library].
-  static List<Mirror> compilationUnitsOf(Dart2JsLibraryMirror library) {
-    return library._element.compilationUnits
-        .mapToList((cu) => new Dart2JsCompilationUnitMirror(cu, library));
-  }
-
-  static Iterable<ConstantExpression> metadataSyntaxOf(
-      Dart2JsElementMirror declaration) {
-    return declaration._element.metadata.map((metadata) => metadata.constant);
-  }
-
-  static ConstantExpression initializerSyntaxOf(Dart2JsFieldMirror variable) {
-    Compiler compiler = variable.mirrorSystem.compiler;
-    return variable._variable.constant;
-  }
-
-  static ConstantExpression defaultValueSyntaxOf(
-      Dart2JsParameterMirror parameter) {
-    if (!parameter.hasDefaultValue) return null;
-    ParameterElement parameterElement = parameter._element;
-    Compiler compiler = parameter.mirrorSystem.compiler;
-    return parameterElement.constant;
-  }
-
-  static Mirror getMirrorFromElement(Dart2JsMirror mirror, Element element) {
-    return _convertElementToDeclarationMirror(mirror.mirrorSystem, element);
-  }
-}
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_type_mirrors.dart b/pkg/compiler/lib/src/mirrors/dart2js_type_mirrors.dart
deleted file mode 100644
index 6bf227c..0000000
--- a/pkg/compiler/lib/src/mirrors/dart2js_type_mirrors.dart
+++ /dev/null
@@ -1,497 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.mirrors;
-
-abstract class ClassMirrorMixin implements ClassSourceMirror {
-  bool get hasReflectedType => false;
-  Type get reflectedType {
-    throw new UnsupportedError("ClassMirror.reflectedType is not supported.");
-  }
-
-  InstanceMirror newInstance(Symbol constructorName, List positionalArguments,
-      [Map<Symbol, dynamic> namedArguments]) {
-    throw new UnsupportedError("ClassMirror.newInstance is not supported.");
-  }
-}
-
-abstract class Dart2JsTypeMirror
-    implements Dart2JsDeclarationMirror, TypeSourceMirror {
-  DartType get _type;
-
-  String get _simpleNameString => _type.name;
-
-  Dart2JsDeclarationMirror get owner => library;
-
-  Dart2JsLibraryMirror get library;
-
-  bool get hasReflectedType => throw new UnimplementedError();
-
-  Type get reflectedType => throw new UnimplementedError();
-
-  bool get isOriginalDeclaration => true;
-
-  TypeMirror get originalDeclaration => this;
-
-  List<TypeMirror> get typeArguments => const <TypeMirror>[];
-
-  List<TypeVariableMirror> get typeVariables => const <TypeVariableMirror>[];
-
-  TypeMirror createInstantiation(List<TypeMirror> typeArguments) {
-    if (typeArguments.isEmpty) return this;
-    throw new ArgumentError('Cannot create generic instantiation of $_type.');
-  }
-
-  bool get isVoid => false;
-
-  bool get isDynamic => false;
-
-  bool isSubtypeOf(TypeMirror other) {
-    if (other is Dart2JsTypeMirror) {
-      return mirrorSystem.compiler.types.isSubtype(this._type, other._type);
-    } else {
-      throw new ArgumentError(other);
-    }
-  }
-
-  bool isAssignableTo(TypeMirror other) {
-    if (other is Dart2JsTypeMirror) {
-      return mirrorSystem.compiler.types.isAssignable(this._type, other._type);
-    } else {
-      throw new ArgumentError(other);
-    }
-  }
-
-  String toString() => _type.toString();
-}
-
-/// Base implementations for mirrors on element based types.
-abstract class Dart2JsTypeElementMirror extends Dart2JsElementMirror
-    with Dart2JsTypeMirror
-    implements TypeSourceMirror {
-  final DartType _type;
-
-  Dart2JsTypeElementMirror(Dart2JsMirrorSystem system, DartType type)
-      : super(system, type.element),
-        this._type = type;
-
-  Dart2JsLibraryMirror get library {
-    return mirrorSystem._getLibrary(_type.element.library);
-  }
-}
-
-abstract class DeclarationMixin implements TypeMirror {
-  bool get isOriginalDeclaration => true;
-
-  TypeMirror get originalDeclaration => this;
-
-  List<TypeMirror> get typeArguments => const <TypeMirror>[];
-}
-
-abstract class Dart2JsGenericTypeMirror extends Dart2JsTypeElementMirror {
-  List<TypeMirror> _typeArguments;
-  List<TypeVariableMirror> _typeVariables;
-
-  Dart2JsGenericTypeMirror(Dart2JsMirrorSystem system, GenericType type)
-      : super(system, type);
-
-  TypeDeclarationElement get _element => super._element;
-
-  GenericType get _type => super._type;
-
-  bool get isOriginalDeclaration => false;
-
-  TypeMirror get originalDeclaration =>
-      mirrorSystem._getTypeDeclarationMirror(_element);
-
-  List<TypeMirror> get typeArguments {
-    if (_typeArguments == null) {
-      _typeArguments = <TypeMirror>[];
-      if (!_type.isRaw) {
-        for (DartType type in _type.typeArguments) {
-          _typeArguments.add(_getTypeMirror(type));
-        }
-      }
-    }
-    return _typeArguments;
-  }
-
-  List<TypeVariableMirror> get typeVariables {
-    if (_typeVariables == null) {
-      _typeVariables = <TypeVariableMirror>[];
-      for (TypeVariableType typeVariable in _element.typeVariables) {
-        _typeVariables
-            .add(new Dart2JsTypeVariableMirror(mirrorSystem, typeVariable));
-      }
-    }
-    return _typeVariables;
-  }
-
-  Iterable<Dart2JsMemberMirror> _getDeclarationMirrors(Element element) {
-    if (element.isTypeVariable) {
-      assert(invariant(_element, _element == element.enclosingElement,
-          message: 'Foreigned type variable element $element.'));
-      for (Dart2JsTypeVariableMirror mirror in typeVariables) {
-        if (mirror._element == element) return [mirror];
-      }
-    }
-    return super._getDeclarationMirrors(element);
-  }
-
-  TypeMirror _getTypeMirror(DartType type) {
-    return super._getTypeMirror(
-        type.subst(_type.typeArguments, _type.element.typeVariables));
-  }
-
-  TypeSourceMirror createInstantiation(
-      List<TypeSourceMirror> newTypeArguments) {
-    if (newTypeArguments.isEmpty) return owner._getTypeMirror(_type.asRaw());
-    if (newTypeArguments.length != typeVariables.length) {
-      throw new ArgumentError('Cannot create generic instantiation of $_type '
-          'with ${newTypeArguments.length} arguments, '
-          'expect ${typeVariables.length} arguments.');
-    }
-    List<DartType> builder = <DartType>[];
-    for (TypeSourceMirror newTypeArgument in newTypeArguments) {
-      if (newTypeArgument.isVoid) {
-        throw new ArgumentError('Cannot use void as type argument.');
-      }
-      if (newTypeArgument is Dart2JsTypeMirror) {
-        builder.add(newTypeArgument._type);
-      } else {
-        throw new UnsupportedError('Cannot create instantiation using a type '
-            'mirror from a different mirrorSystem implementation.');
-      }
-    }
-    return owner._getTypeMirror(_type.createInstantiation(builder));
-  }
-}
-
-class Dart2JsInterfaceTypeMirror extends Dart2JsGenericTypeMirror
-    with ObjectMirrorMixin, ClassMirrorMixin, ContainerMixin
-    implements ClassMirror {
-  Dart2JsInterfaceTypeMirror(
-      Dart2JsMirrorSystem system, InterfaceType interfaceType)
-      : super(system, interfaceType);
-
-  ClassElement get _element => super._element;
-
-  InterfaceType get _type => super._type;
-
-  bool get isNameSynthetic {
-    if (_element.isMixinApplication) {
-      MixinApplicationElement mixinApplication = _element;
-      return mixinApplication.isUnnamedMixinApplication;
-    }
-    return false;
-  }
-
-  void _forEachElement(f(Element element)) {
-    _element.forEachMember((_, element) => f(element));
-  }
-
-  ClassMirror get superclass {
-    if (_element.supertype != null) {
-      return _getTypeMirror(_element.supertype);
-    }
-    return null;
-  }
-
-  bool isSubclassOf(Mirror other) {
-    if (other is Dart2JsTypeMirror) {
-      return other._type.element != null &&
-          _element.isSubclassOf(other._type.element);
-    } else {
-      throw new ArgumentError(other);
-    }
-  }
-
-  ClassMirror get mixin {
-    if (_element.isMixinApplication) {
-      MixinApplicationElement mixinApplication = _element;
-      return _getTypeMirror(mixinApplication.mixinType);
-    }
-    return this;
-  }
-
-  List<ClassMirror> get superinterfaces {
-    var list = <ClassMirror>[];
-    Link<DartType> link = _element.interfaces;
-    while (!link.isEmpty) {
-      var type = _getTypeMirror(link.head);
-      list.add(type);
-      link = link.tail;
-    }
-    return list;
-  }
-
-  Map<Symbol, MethodMirror> get instanceMembers => null;
-  Map<Symbol, MethodMirror> get staticMembers => null;
-
-  bool get isAbstract => _element.isAbstract;
-
-  bool get isEnum => throw new UnimplementedError();
-
-  bool operator ==(other) {
-    if (identical(this, other)) {
-      return true;
-    }
-    if (other is! ClassMirror) {
-      return false;
-    }
-    return _type == other._type;
-  }
-
-  String toString() => 'Mirror on interface type $_type';
-}
-
-class Dart2JsClassDeclarationMirror extends Dart2JsInterfaceTypeMirror
-    with DeclarationMixin {
-  Dart2JsClassDeclarationMirror(Dart2JsMirrorSystem system, InterfaceType type)
-      : super(system, type);
-
-  bool isSubclassOf(ClassMirror other) {
-    if (other is Dart2JsClassDeclarationMirror) {
-      Dart2JsClassDeclarationMirror otherDeclaration =
-          other.originalDeclaration;
-      return _element.isSubclassOf(otherDeclaration._element);
-    } else if (other is FunctionTypeMirror) {
-      return false;
-    }
-    throw new ArgumentError(other);
-  }
-
-  String toString() => 'Mirror on class ${_type.name}';
-}
-
-class Dart2JsTypedefMirror extends Dart2JsGenericTypeMirror
-    implements TypedefMirror {
-  final Dart2JsLibraryMirror _library;
-  List<TypeVariableMirror> _typeVariables;
-  var _definition;
-
-  Dart2JsTypedefMirror(Dart2JsMirrorSystem system, TypedefType _typedef)
-      : this._library = system._getLibrary(_typedef.element.library),
-        super(system, _typedef);
-
-  Dart2JsTypedefMirror.fromLibrary(
-      Dart2JsLibraryMirror library, TypedefType _typedef)
-      : this._library = library,
-        super(library.mirrorSystem, _typedef);
-
-  TypedefType get _typedef => _type;
-
-  LibraryMirror get library => _library;
-
-  bool get isTypedef => true;
-
-  FunctionTypeMirror get referent {
-    if (_definition == null) {
-      _definition = _getTypeMirror(_typedef.element.alias);
-    }
-    return _definition;
-  }
-
-  bool get isClass => false;
-
-  bool get isAbstract => false;
-
-  bool get isEnum => throw new UnimplementedError();
-
-  String toString() => 'Mirror on typedef $_type';
-}
-
-class Dart2JsTypedefDeclarationMirror extends Dart2JsTypedefMirror
-    with DeclarationMixin {
-  Dart2JsTypedefDeclarationMirror(Dart2JsMirrorSystem system, TypedefType type)
-      : super(system, type);
-
-  String toString() => 'Mirror on typedef ${_type.name}';
-}
-
-class Dart2JsTypeVariableMirror extends Dart2JsTypeElementMirror
-    implements TypeVariableMirror {
-  Dart2JsDeclarationMirror _owner;
-
-  Dart2JsTypeVariableMirror(
-      Dart2JsMirrorSystem system, TypeVariableType typeVariableType)
-      : super(system, typeVariableType);
-
-  TypeVariableType get _type => super._type;
-
-  Dart2JsDeclarationMirror get owner {
-    if (_owner == null) {
-      _owner =
-          mirrorSystem._getTypeDeclarationMirror(_type.element.typeDeclaration);
-    }
-    return _owner;
-  }
-
-  bool get isStatic => false;
-
-  TypeMirror get upperBound => owner._getTypeMirror(_type.element.bound);
-
-  bool operator ==(var other) {
-    if (identical(this, other)) {
-      return true;
-    }
-    if (other is! TypeVariableMirror) {
-      return false;
-    }
-    if (owner != other.owner) {
-      return false;
-    }
-    return qualifiedName == other.qualifiedName;
-  }
-
-  String toString() => 'Mirror on type variable $_type';
-}
-
-class Dart2JsFunctionTypeMirror extends Dart2JsTypeElementMirror
-    with ObjectMirrorMixin, ClassMirrorMixin, DeclarationMixin
-    implements FunctionTypeMirror {
-  List<ParameterMirror> _parameters;
-
-  Dart2JsFunctionTypeMirror(
-      Dart2JsMirrorSystem system, FunctionType functionType)
-      : super(system, functionType) {
-    assert(functionType.element != null);
-  }
-
-  FunctionType get _type => super._type;
-
-  // TODO(johnniwinther): Is this the qualified name of a function type?
-  Symbol get qualifiedName => originalDeclaration.qualifiedName;
-
-  // TODO(johnniwinther): Substitute type arguments for type variables.
-  Map<Symbol, DeclarationMirror> get declarations {
-    var method = callMethod;
-    if (method != null) {
-      var map = new Map<Symbol, DeclarationMirror>.from(
-          originalDeclaration.declarations);
-      var name = method.qualifiedName;
-      assert(!map.containsKey(name));
-      map[name] = method;
-      return new UnmodifiableMapView<Symbol, DeclarationMirror>(map);
-    }
-    return originalDeclaration.declarations;
-  }
-
-  bool get isFunction => true;
-
-  MethodMirror get callMethod => _convertElementMethodToMethodMirror(
-      mirrorSystem._getLibrary(_type.element.library), _type.element);
-
-  ClassMirror get originalDeclaration => mirrorSystem._getTypeDeclarationMirror(
-      mirrorSystem.compiler.coreClasses.functionClass);
-
-  // TODO(johnniwinther): Substitute type arguments for type variables.
-  ClassMirror get superclass => originalDeclaration.superclass;
-
-  // TODO(johnniwinther): Substitute type arguments for type variables.
-  List<ClassMirror> get superinterfaces => originalDeclaration.superinterfaces;
-
-  Map<Symbol, MethodMirror> get instanceMembers => null;
-  Map<Symbol, MethodMirror> get staticMembers => null;
-
-  ClassMirror get mixin => this;
-
-  bool get isPrivate => false;
-
-  bool get isAbstract => false;
-
-  bool get isEnum => throw new UnimplementedError();
-
-  List<TypeVariableMirror> get typeVariables =>
-      originalDeclaration.typeVariables;
-
-  TypeMirror get returnType => owner._getTypeMirror(_type.returnType);
-
-  List<ParameterMirror> get parameters {
-    if (_parameters == null) {
-      _parameters = _parametersFromFunctionSignature(
-          owner, _type.element.functionSignature);
-    }
-    return _parameters;
-  }
-
-  String toString() => 'Mirror on function type $_type';
-
-  bool isSubclassOf(ClassMirror other) => false;
-}
-
-/// Common superclass for mirrors on `dynamic` and `void`.
-abstract class Dart2JsBuiltinTypeMirror extends Dart2JsDeclarationMirror
-    with Dart2JsTypeMirror
-    implements TypeSourceMirror {
-  final Dart2JsMirrorSystem mirrorSystem;
-  final DartType _type;
-
-  Dart2JsBuiltinTypeMirror(
-      Dart2JsMirrorSystem this.mirrorSystem, DartType this._type);
-
-  Symbol get qualifiedName => simpleName;
-
-  /**
-   * The builtin types have has no location.
-   */
-  SourceLocation get location => null;
-
-  /**
-   * The builtin types have has no owner.
-   */
-  Dart2JsDeclarationMirror get owner => null;
-
-  /**
-   * The builtin types have no library.
-   */
-  Dart2JsLibraryMirror get library => null;
-
-  /**
-   * The builtin types have no metadata.
-   */
-  List<InstanceMirror> get metadata => const <InstanceMirror>[];
-}
-
-class Dart2JsVoidMirror extends Dart2JsBuiltinTypeMirror {
-  Dart2JsVoidMirror(Dart2JsMirrorSystem mirrorSystem, VoidType type)
-      : super(mirrorSystem, type);
-
-  bool get isVoid => true;
-
-  bool operator ==(other) {
-    if (identical(this, other)) {
-      return true;
-    }
-    if (other is! TypeMirror) {
-      return false;
-    }
-    return other.isVoid;
-  }
-
-  int get hashCode => 13 * _type.hashCode;
-
-  String toString() => 'Mirror on void';
-}
-
-class Dart2JsDynamicMirror extends Dart2JsBuiltinTypeMirror {
-  Dart2JsDynamicMirror(Dart2JsMirrorSystem mirrorSystem, DynamicType type)
-      : super(mirrorSystem, type);
-
-  bool get isDynamic => true;
-
-  bool operator ==(other) {
-    if (identical(this, other)) {
-      return true;
-    }
-    if (other is! TypeMirror) {
-      return false;
-    }
-    return other.isDynamic;
-  }
-
-  int get hashCode => 13 * _type.hashCode;
-
-  String toString() => 'Mirror on dynamic';
-}
diff --git a/pkg/compiler/lib/src/mirrors/mirrors_util.dart b/pkg/compiler/lib/src/mirrors/mirrors_util.dart
deleted file mode 100644
index 52eb0a9..0000000
--- a/pkg/compiler/lib/src/mirrors/mirrors_util.dart
+++ /dev/null
@@ -1,425 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library mirrors_util;
-
-import 'dart:collection' show Queue, IterableBase;
-
-import 'source_mirrors.dart';
-
-//------------------------------------------------------------------------------
-// Utility functions for using the Mirror API
-//------------------------------------------------------------------------------
-
-String nameOf(DeclarationMirror mirror) =>
-    MirrorSystem.getName(mirror.simpleName);
-
-String qualifiedNameOf(DeclarationMirror mirror) =>
-    MirrorSystem.getName(mirror.qualifiedName);
-
-// TODO(johnniwinther): Handle private names.
-Symbol symbolOf(String name, [LibraryMirror library]) => new Symbol(name);
-
-/**
- * Return the display name for [mirror].
- *
- * The display name is the normal representation of the entity name. In most
- * cases the display name is the simple name, but for a setter 'foo=' the
- * display name is simply 'foo' and for the unary minus operator the display
- * name is 'operator -'. For 'dart:' libraries the display name is the URI and
- * not the library name, for instance 'dart:core' instead of 'dart.core'.
- *
- * The display name is not unique.
- */
-String displayName(DeclarationMirror mirror) {
-  if (mirror is LibraryMirror) {
-    LibraryMirror library = mirror;
-    if (library.uri.scheme == 'dart') {
-      return library.uri.toString();
-    }
-  } else if (mirror is MethodMirror) {
-    String simpleName = nameOf(mirror);
-    if (mirror.isSetter) {
-      // Remove trailing '='.
-      return simpleName.substring(0, simpleName.length - 1);
-    } else if (mirror.isOperator) {
-      return 'operator ${operatorName(mirror)}';
-    } else if (mirror.isConstructor) {
-      String className = displayName(mirror.owner);
-      if (simpleName == '') {
-        return className;
-      } else {
-        return '$className.$simpleName';
-      }
-    }
-  }
-  return MirrorSystem.getName(mirror.simpleName);
-}
-
-/**
- * Returns the operator name if [methodMirror] is an operator method,
- * for instance [:'<':] for [:operator <:] and [:'-':] for the unary minus
- * operator. Return [:null:] if [methodMirror] is not an operator method.
- */
-String operatorName(MethodMirror methodMirror) {
-  if (methodMirror.isOperator) {
-    if (methodMirror.simpleName == const Symbol('unary-')) {
-      return '-';
-    } else {
-      return nameOf(methodMirror);
-    }
-  }
-  return null;
-}
-
-/**
- * Returns an iterable over the type declarations directly inheriting from
- * the declaration of [type] within [mirrors].
- */
-Iterable<ClassMirror> computeSubdeclarations(
-    MirrorSystem mirrors, ClassMirror type) {
-  type = type.originalDeclaration;
-  var subtypes = <ClassMirror>[];
-  mirrors.libraries.forEach((_, library) {
-    library.declarations.values
-        .where((mirror) => mirror is ClassMirror)
-        .forEach((ClassMirror otherType) {
-      var superClass = otherType.superclass;
-      if (superClass != null) {
-        superClass = superClass.originalDeclaration;
-        if (superClass == type) {
-          subtypes.add(otherType);
-        }
-      }
-      final superInterfaces = otherType.superinterfaces;
-      for (ClassMirror superInterface in superInterfaces) {
-        superInterface = superInterface.originalDeclaration;
-        if (superInterface == type) {
-          subtypes.add(otherType);
-        }
-      }
-    });
-  });
-  return subtypes;
-}
-
-class HierarchyIterable extends IterableBase<ClassMirror> {
-  final bool includeType;
-  final ClassMirror type;
-
-  HierarchyIterable(this.type, {bool includeType})
-      : this.includeType = includeType;
-
-  Iterator<ClassMirror> get iterator =>
-      new HierarchyIterator(type, includeType: includeType);
-}
-
-/**
- * [HierarchyIterator] iterates through the class hierarchy of the provided
- * type.
- *
- * First the superclass relation is traversed, skipping [Object], next the
- * superinterface relation and finally is [Object] visited. The supertypes are
- * visited in breadth first order and a superinterface is visited more than once
- * if implemented through multiple supertypes.
- */
-class HierarchyIterator implements Iterator<ClassMirror> {
-  final Queue<ClassMirror> queue = new Queue<ClassMirror>();
-  ClassMirror object;
-  ClassMirror _current;
-
-  HierarchyIterator(ClassMirror type, {bool includeType}) {
-    if (includeType) {
-      queue.add(type);
-    } else {
-      push(type);
-    }
-  }
-
-  ClassMirror push(ClassMirror type) {
-    if (type.superclass != null) {
-      if (isObject(type.superclass)) {
-        object = type.superclass;
-      } else {
-        queue.addFirst(type.superclass);
-      }
-    }
-    queue.addAll(type.superinterfaces);
-    return type;
-  }
-
-  ClassMirror get current => _current;
-
-  bool moveNext() {
-    _current = null;
-    if (queue.isEmpty) {
-      if (object == null) return false;
-      _current = object;
-      object = null;
-      return true;
-    } else {
-      _current = push(queue.removeFirst());
-      return true;
-    }
-  }
-}
-
-LibraryMirror getLibrary(DeclarationMirror declaration) {
-  while (declaration != null && declaration is! LibraryMirror) {
-    declaration = declaration.owner;
-  }
-  return declaration;
-}
-
-Iterable<DeclarationMirror> membersOf(
-    Map<Symbol, DeclarationMirror> declarations) {
-  return declarations.values
-      .where((mirror) => mirror is MethodMirror || mirror is VariableMirror);
-}
-
-Iterable<TypeMirror> classesOf(Map<Symbol, DeclarationMirror> declarations) {
-  return new _TypeOfIterable<ClassMirror>(declarations.values);
-}
-
-Iterable<TypeMirror> typesOf(Map<Symbol, DeclarationMirror> declarations) {
-  return new _TypeOfIterable<TypeMirror>(declarations.values);
-}
-
-Iterable<MethodMirror> methodsOf(Map<Symbol, DeclarationMirror> declarations) {
-  return anyMethodOf(declarations).where((mirror) => mirror.isRegularMethod);
-}
-
-Iterable<MethodMirror> constructorsOf(
-    Map<Symbol, DeclarationMirror> declarations) {
-  return anyMethodOf(declarations).where((mirror) => mirror.isConstructor);
-}
-
-Iterable<MethodMirror> settersOf(Map<Symbol, DeclarationMirror> declarations) {
-  return anyMethodOf(declarations).where((mirror) => mirror.isSetter);
-}
-
-Iterable<MethodMirror> gettersOf(Map<Symbol, DeclarationMirror> declarations) {
-  return anyMethodOf(declarations).where((mirror) => mirror.isGetter);
-}
-
-Iterable<MethodMirror> anyMethodOf(
-    Map<Symbol, DeclarationMirror> declarations) {
-  return new _TypeOfIterable<MethodMirror>(declarations.values);
-}
-
-Iterable<VariableMirror> variablesOf(
-    Map<Symbol, DeclarationMirror> declarations) {
-  return new _TypeOfIterable<VariableMirror>(declarations.values);
-}
-
-class _TypeOfIterable<T> extends IterableBase<T> {
-  final Iterable _source;
-
-  _TypeOfIterable(this._source);
-
-  Iterator<T> get iterator => new _TypeOfIterator<T>(_source.iterator);
-}
-
-class _TypeOfIterator<T> implements Iterator<T> {
-  final Iterator _source;
-
-  T get current => _source.current;
-
-  _TypeOfIterator(this._source);
-
-  bool moveNext() {
-    while (_source.moveNext()) {
-      if (_source.current is T) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-bool isObject(TypeMirror mirror) =>
-    mirror is ClassMirror && mirror.superclass == null;
-
-/// Returns `true` if [cls] is declared in a private dart library.
-bool isFromPrivateDartLibrary(ClassMirror cls) {
-  if (isMixinApplication(cls)) cls = cls.mixin;
-  var uri = getLibrary(cls).uri;
-  return uri.scheme == 'dart' && uri.path.startsWith('_');
-}
-
-/// Returns `true` if [mirror] reflects a mixin application.
-bool isMixinApplication(Mirror mirror) {
-  return mirror is ClassMirror && mirror.mixin != mirror;
-}
-
-/**
- * Returns the superclass of [cls] skipping unnamed mixin applications.
- *
- * For instance, for all of the following definitions this method returns [:B:].
- *
- *     class A extends B {}
- *     class A extends B with C1, C2 {}
- *     class A extends B implements D1, D2 {}
- *     class A extends B with C1, C2 implements D1, D2 {}
- *     class A = B with C1, C2;
- *     abstract class A = B with C1, C2 implements D1, D2;
- */
-ClassSourceMirror getSuperclass(ClassSourceMirror cls) {
-  ClassSourceMirror superclass = cls.superclass;
-  while (isMixinApplication(superclass) && superclass.isNameSynthetic) {
-    superclass = superclass.superclass;
-  }
-  return superclass;
-}
-
-/**
- * Returns the mixins directly applied to [cls].
- *
- * For instance, for all of the following definitions this method returns
- * [:C1, C2:].
- *
- *     class A extends B with C1, C2 {}
- *     class A extends B with C1, C2 implements D1, D2 {}
- *     class A = B with C1, C2;
- *     abstract class A = B with C1, C2 implements D1, D2;
- */
-Iterable<ClassSourceMirror> getAppliedMixins(ClassSourceMirror cls) {
-  List<ClassSourceMirror> mixins = <ClassSourceMirror>[];
-  ClassSourceMirror superclass = cls.superclass;
-  while (isMixinApplication(superclass) && superclass.isNameSynthetic) {
-    mixins.add(superclass.mixin);
-    superclass = superclass.superclass;
-  }
-  if (mixins.length > 1) {
-    mixins = new List<ClassSourceMirror>.from(mixins.reversed);
-  }
-  if (isMixinApplication(cls)) {
-    mixins.add(cls.mixin);
-  }
-  return mixins;
-}
-
-/**
- * Returns the superinterfaces directly and explicitly implemented by [cls].
- *
- * For instance, for all of the following definitions this method returns
- * [:D1, D2:].
- *
- *     class A extends B implements D1, D2 {}
- *     class A extends B with C1, C2 implements D1, D2 {}
- *     abstract class A = B with C1, C2 implements D1, D2;
- */
-Iterable<ClassMirror> getExplicitInterfaces(ClassMirror cls) {
-  if (isMixinApplication(cls)) {
-    bool first = true;
-    ClassMirror mixin = cls.mixin;
-    bool filter(ClassMirror superinterface) {
-      if (first && superinterface == mixin) {
-        first = false;
-        return false;
-      }
-      return true;
-    }
-    return cls.superinterfaces.where(filter);
-  }
-  return cls.superinterfaces;
-}
-
-final RegExp _singleLineCommentStart = new RegExp(r'^///? ?(.*)');
-final RegExp _multiLineCommentStartEnd =
-    new RegExp(r'^/\*\*? ?([\s\S]*)\*/$', multiLine: true);
-final RegExp _multiLineCommentLineStart = new RegExp(r'^[ \t]*\* ?(.*)');
-
-/**
- * Pulls the raw text out of a comment (i.e. removes the comment
- * characters).
- */
-String stripComment(String comment) {
-  Match match = _singleLineCommentStart.firstMatch(comment);
-  if (match != null) {
-    return match[1];
-  }
-  match = _multiLineCommentStartEnd.firstMatch(comment);
-  if (match != null) {
-    comment = match[1];
-    var sb = new StringBuffer();
-    List<String> lines = comment.split('\n');
-    for (int index = 0; index < lines.length; index++) {
-      String line = lines[index];
-      if (index == 0) {
-        sb.write(line); // Add the first line unprocessed.
-        continue;
-      }
-      sb.write('\n');
-      match = _multiLineCommentLineStart.firstMatch(line);
-      if (match != null) {
-        sb.write(match[1]);
-      } else if (index < lines.length - 1 || !line.trim().isEmpty) {
-        // Do not add the last line if it only contains white space.
-        // This interprets cases like
-        //     /*
-        //      * Foo
-        //      */
-        // as "\nFoo\n" and not as "\nFoo\n     ".
-        sb.write(line);
-      }
-    }
-    return sb.toString();
-  }
-  throw new ArgumentError('Invalid comment $comment');
-}
-
-/**
- * Looks up [name] in the scope [declaration].
- *
- * If [name] is of the form 'a.b.c', 'a' is looked up in the scope of
- * [declaration] and if unresolved 'a.b' is looked in the scope of
- * [declaration]. Each identifier of the remaining suffix, 'c' or 'b.c', is
- * then looked up in the local scope of the previous result.
- *
- * For instance, assumming that [:Iterable:] is imported into the scope of
- * [declaration] via the prefix 'col', 'col.Iterable.E' finds the type
- * variable of [:Iterable:] and 'col.Iterable.contains.element' finds the
- * [:element:] parameter of the [:contains:] method on [:Iterable:].
- */
-DeclarationMirror lookupQualifiedInScope(
-    DeclarationSourceMirror declaration, String name) {
-  // TODO(11653): Support lookup of constructors using the [:new Foo:]
-  // syntax.
-  int offset = 1;
-  List<String> parts = name.split('.');
-  DeclarationMirror result = declaration.lookupInScope(parts[0]);
-  if (result == null && parts.length > 1) {
-    // Try lookup of `prefix.id`.
-    result = declaration.lookupInScope('${parts[0]}.${parts[1]}');
-    offset = 2;
-  }
-  if (result == null) return null;
-  LibraryMirror library = getLibrary(result);
-  while (result != null && offset < parts.length) {
-    result = _lookupLocal(result, symbolOf(parts[offset++], library));
-  }
-  return result;
-}
-
-DeclarationMirror _lookupLocal(Mirror mirror, Symbol id) {
-  DeclarationMirror result;
-  if (mirror is LibraryMirror) {
-    // Try member lookup.
-    result = mirror.declarations[id];
-  } else if (mirror is ClassMirror) {
-    // Try member lookup.
-    result = mirror.declarations[id];
-    if (result != null) return result;
-    // Try type variables.
-    result = mirror.typeVariables.firstWhere(
-        (TypeVariableMirror v) => v.simpleName == id,
-        orElse: () => null);
-  } else if (mirror is MethodMirror) {
-    result = mirror.parameters.firstWhere(
-        (ParameterMirror p) => p.simpleName == id,
-        orElse: () => null);
-  }
-  return result;
-}
diff --git a/pkg/compiler/lib/src/mirrors/source_mirrors.dart b/pkg/compiler/lib/src/mirrors/source_mirrors.dart
deleted file mode 100644
index 6bf555c..0000000
--- a/pkg/compiler/lib/src/mirrors/source_mirrors.dart
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library mirrors;
-
-import 'dart:mirrors';
-import 'dart:mirrors' as api show SourceLocation;
-export 'dart:mirrors';
-
-abstract class DeclarationSourceMirror implements DeclarationMirror {
-  /// Returns `true` if the name of this declaration is generated by the
-  /// provider of the mirror system.
-  bool get isNameSynthetic;
-
-  /**
-   * Looks up [name] in the scope of this declaration.
-   *
-   * [name] may be either a single identifier, like 'foo', or of the
-   * a prefixed identifier, like 'foo.bar', where 'foo' must be a prefix.
-   * For methods and constructors, the scope includes the parameters. For
-   * classes and typedefs, the scope includes the type variables.
-   * For classes and class members, the scope includes inherited members.
-   *
-   * See also:
-   *
-   * * [Lexical Scope](https://www.dartlang.org/docs/dart-up-and-running/contents/ch02.html#ch02-lexical-scope)
-   *   in Dart Up and Running.
-   * * [Lexical Scoping](http://www.dartlang.org/docs/spec/latest/dart-language-specification.html#h.jb82efuudrc5)
-   *   in the Dart Specification.
-   */
-  DeclarationMirror lookupInScope(String name);
-}
-
-/**
- * Specialized [InstanceMirror] used for reflection on constant lists.
- */
-abstract class ListInstanceMirror implements InstanceMirror {
-  /**
-   * Returns an instance mirror of the value at [index] or throws a [RangeError]
-   * if the [index] is out of bounds.
-   */
-  InstanceMirror getElement(int index);
-
-  /**
-   * The number of elements in the list.
-   */
-  int get length;
-}
-
-/**
- * Specialized [InstanceMirror] used for reflection on constant maps.
- */
-abstract class MapInstanceMirror implements InstanceMirror {
-  /**
-   * Returns a collection containing all the keys in the map.
-   */
-  Iterable<String> get keys;
-
-  /**
-   * Returns an instance mirror of the value for the given key or
-   * null if key is not in the map.
-   */
-  InstanceMirror getValue(String key);
-
-  /**
-   * The number of {key, value} pairs in the map.
-   */
-  int get length;
-}
-
-/**
- * Specialized [InstanceMirror] used for reflection on type constants.
- */
-abstract class TypeInstanceMirror implements InstanceMirror {
-  /**
-   * Returns the type mirror for the type represented by the reflected type
-   * constant.
-   */
-  TypeMirror get representedType;
-}
-
-/**
- * Specialized [InstanceMirror] used for reflection on comments as metadata.
- */
-abstract class CommentInstanceMirror implements InstanceMirror {
-  /**
-   * The comment text as written in the source text.
-   */
-  String get text;
-
-  /**
-   * The comment text without the start, end, and padding text.
-   *
-   * For example, if [text] is [: /** Comment text. */ :] then the [trimmedText]
-   * is [: Comment text. :].
-   */
-  String get trimmedText;
-
-  /**
-   * Is [:true:] if this comment is a documentation comment.
-   *
-   * That is, that the comment is either enclosed in [: /** ... */ :] or starts
-   * with [: /// :].
-   */
-  bool get isDocComment;
-}
-
-/**
- * A library.
- */
-abstract class LibrarySourceMirror
-    implements DeclarationSourceMirror, LibraryMirror {
-  /**
-   * Returns a list of the imports and exports in this library;
-   */
-  List<LibraryDependencyMirror> get libraryDependencies;
-}
-
-/// A mirror on an import or export declaration.
-abstract class LibraryDependencySourceMirror extends Mirror
-    implements LibraryDependencyMirror {
-  /// Is `true` if this dependency is an import.
-  bool get isImport;
-
-  /// Is `true` if this dependency is an export.
-  bool get isExport;
-
-  /// Returns the library mirror of the library that imports or exports the
-  /// [targetLibrary].
-  LibraryMirror get sourceLibrary;
-
-  /// Returns the library mirror of the library that is imported or exported.
-  LibraryMirror get targetLibrary;
-
-  /// Returns the prefix if this is a prefixed import and `null` otherwise.
-  /*String*/ get prefix;
-
-  /// Returns the list of show/hide combinators on the import/export
-  /// declaration.
-  List<CombinatorMirror> get combinators;
-
-  /// Returns the source location for this import/export declaration.
-  SourceLocation get location;
-
-  /// Returns a future that completes when the library is loaded and initates a
-  /// load if one has not already happened.
-  /*Future<LibraryMirror>*/ loadLibrary();
-}
-
-/// A mirror on a show/hide combinator declared on a library dependency.
-abstract class CombinatorSourceMirror extends Mirror
-    implements CombinatorMirror {
-  /// The list of identifiers on the combinator.
-  List/*<String>*/ get identifiers;
-
-  /// Is `true` if this is a 'show' combinator.
-  bool get isShow;
-
-  /// Is `true` if this is a 'hide' combinator.
-  bool get isHide;
-}
-
-/**
- * Common interface for classes, interfaces, typedefs and type variables.
- */
-abstract class TypeSourceMirror implements DeclarationSourceMirror, TypeMirror {
-  /// Returns `true` is this is a mirror on the void type.
-  bool get isVoid;
-
-  /// Returns `true` is this is a mirror on the dynamic type.
-  bool get isDynamic;
-
-  /// Create a type mirror on the instantiation of the declaration of this type
-  /// with [typeArguments] as type arguments.
-  TypeMirror createInstantiation(List<TypeMirror> typeArguments);
-}
-
-/**
- * A class or interface type.
- */
-abstract class ClassSourceMirror implements TypeSourceMirror, ClassMirror {
-  /**
-   * Is [:true:] if this class is declared abstract.
-   */
-  bool get isAbstract;
-}
-
-/**
- * A formal parameter.
- */
-abstract class ParameterSourceMirror implements ParameterMirror {
-  /**
-   * Returns [:true:] iff this parameter is an initializing formal of a
-   * constructor. That is, if it is of the form [:this.x:] where [:x:] is a
-   * field.
-   */
-  bool get isInitializingFormal;
-
-  /**
-   * Returns the initialized field, if this parameter is an initializing formal.
-   */
-  VariableMirror get initializedField;
-}
-
-/**
- * A [SourceLocation] describes the span of an entity in Dart source code.
- * A [SourceLocation] with a non-zero [length] should be the minimum span that
- * encloses the declaration of the mirrored entity.
- */
-abstract class SourceLocation implements api.SourceLocation {
-  /**
-   * The 1-based line number for this source location.
-   *
-   * A value of 0 means that the line number is unknown.
-   */
-  int get line;
-
-  /**
-   * The 1-based column number for this source location.
-   *
-   * A value of 0 means that the column number is unknown.
-   */
-  int get column;
-
-  /**
-   * The 0-based character offset into the [sourceText] where this source
-   * location begins.
-   *
-   * A value of -1 means that the offset is unknown.
-   */
-  int get offset;
-
-  /**
-   * The number of characters in this source location.
-   *
-   * A value of 0 means that the [offset] is approximate.
-   */
-  int get length;
-
-  /**
-   * The text of the location span.
-   */
-  String get text;
-
-  /**
-   * Returns the URI where the source originated.
-   */
-  Uri get sourceUri;
-
-  /**
-   * Returns the text of this source.
-   */
-  String get sourceText;
-}
diff --git a/pkg/compiler/lib/src/mirrors_used.dart b/pkg/compiler/lib/src/mirrors_used.dart
index a13469e..c909c8a 100644
--- a/pkg/compiler/lib/src/mirrors_used.dart
+++ b/pkg/compiler/lib/src/mirrors_used.dart
@@ -80,8 +80,11 @@
 class MirrorUsageAnalyzerTask extends CompilerTask {
   Set<LibraryElement> librariesWithUsage;
   MirrorUsageAnalyzer analyzer;
+  final Compiler compiler;
 
-  MirrorUsageAnalyzerTask(Compiler compiler) : super(compiler) {
+  MirrorUsageAnalyzerTask(Compiler compiler)
+      : compiler = compiler,
+        super(compiler.measurer) {
     analyzer = new MirrorUsageAnalyzer(compiler, this);
   }
 
@@ -150,9 +153,8 @@
   final Map<ConstantValue, List<Element>> cachedElements;
   MirrorUsage mergedMirrorUsage;
 
-  MirrorUsageAnalyzer(Compiler compiler, this.task)
-      : compiler = compiler,
-        librariesWithUsage = new Set<LibraryElement>(),
+  MirrorUsageAnalyzer(this.compiler, this.task)
+      : librariesWithUsage = new Set<LibraryElement>(),
         cachedStrings = new Map<ConstantValue, List<String>>(),
         cachedElements = new Map<ConstantValue, List<Element>>();
 
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 93af700..e839a17 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -187,8 +187,8 @@
   /// Whether to emit URIs in the reflection metadata.
   final bool preserveUris;
 
-  /// The location of serialized data used for resolution.
-  final Uri resolutionInput;
+  /// The locations of serialized data used for resolution.
+  final List<Uri> resolutionInputs;
 
   /// The location of the serialized data from resolution.
   final Uri resolutionOutput;
@@ -256,7 +256,7 @@
       Uri libraryRoot,
       Uri packageRoot,
       Uri packageConfig,
-      Uri resolutionInput,
+      List<Uri> resolutionInputs,
       Uri resolutionOutput,
       PackagesDiscoveryProvider packagesDiscoveryProvider,
       Map<String, dynamic> environment: const <String, dynamic>{},
@@ -309,7 +309,7 @@
             _resolvePlatformConfigFromOptions(libraryRoot, options),
         preserveComments: _hasOption(options, Flags.preserveComments),
         preserveUris: _hasOption(options, Flags.preserveUris),
-        resolutionInput: resolutionInput,
+        resolutionInputs: resolutionInputs,
         resolutionOutput: resolutionOutput,
         resolveOnly: _hasOption(options, Flags.resolveOnly),
         sourceMapUri: _extractUriOption(options, '--source-map='),
@@ -373,7 +373,7 @@
       Uri platformConfigUri: null,
       bool preserveComments: false,
       bool preserveUris: false,
-      Uri resolutionInput: null,
+      List<Uri> resolutionInputs: null,
       Uri resolutionOutput: null,
       bool resolveOnly: false,
       Uri sourceMapUri: null,
@@ -448,7 +448,7 @@
                 libraryRoot, null, !emitJavaScript, const []),
         preserveComments: preserveComments,
         preserveUris: preserveUris,
-        resolutionInput: resolutionInput,
+        resolutionInputs: resolutionInputs,
         resolutionOutput: resolutionOutput,
         resolveOnly: resolveOnly,
         sourceMapUri: sourceMapUri,
@@ -499,7 +499,7 @@
       this.platformConfigUri: null,
       this.preserveComments: false,
       this.preserveUris: false,
-      this.resolutionInput: null,
+      this.resolutionInputs: null,
       this.resolutionOutput: null,
       this.resolveOnly: false,
       this.sourceMapUri: null,
diff --git a/pkg/compiler/lib/src/parser/diet_parser_task.dart b/pkg/compiler/lib/src/parser/diet_parser_task.dart
index 4192143..3c48a31 100644
--- a/pkg/compiler/lib/src/parser/diet_parser_task.dart
+++ b/pkg/compiler/lib/src/parser/diet_parser_task.dart
@@ -6,8 +6,7 @@
 
 import '../common.dart';
 import '../common/backend_api.dart' show Backend;
-import '../common/tasks.dart' show CompilerTask;
-import '../compiler.dart' show Compiler;
+import '../common/tasks.dart' show CompilerTask, Measurer;
 import '../elements/elements.dart' show CompilationUnitElement;
 import '../id_generator.dart';
 import '../tokens/token.dart' show Token;
@@ -23,9 +22,9 @@
   final Backend _backend;
   final DiagnosticReporter _reporter;
 
-  DietParserTask(Compiler compiler, this._parserOptions, this._idGenerator,
-      this._backend, this._reporter)
-      : super(compiler);
+  DietParserTask(this._parserOptions, this._idGenerator, this._backend,
+      this._reporter, Measurer measurer)
+      : super(measurer);
 
   final String name = 'Diet Parser';
 
diff --git a/pkg/compiler/lib/src/parser/parser_task.dart b/pkg/compiler/lib/src/parser/parser_task.dart
index 6470d1f..02c3719 100644
--- a/pkg/compiler/lib/src/parser/parser_task.dart
+++ b/pkg/compiler/lib/src/parser/parser_task.dart
@@ -19,8 +19,11 @@
 
 class ParserTask extends CompilerTask {
   final ParserOptions parserOptions;
+  final Compiler compiler;
 
-  ParserTask(Compiler compiler, this.parserOptions) : super(compiler);
+  ParserTask(Compiler compiler, this.parserOptions)
+      : compiler = compiler,
+        super(compiler.measurer);
 
   String get name => 'Parser';
 
@@ -31,7 +34,7 @@
   Node parseCompilationUnit(Token token) {
     return measure(() {
       NodeListener listener =
-          new NodeListener(const ScannerOptions(), reporter, null);
+          new NodeListener(const ScannerOptions(), compiler.reporter, null);
       Parser parser = new Parser(listener, parserOptions);
       try {
         parser.parseUnit(token);
diff --git a/pkg/compiler/lib/src/patch_parser.dart b/pkg/compiler/lib/src/patch_parser.dart
index 9baaeb3..a2246c4 100644
--- a/pkg/compiler/lib/src/patch_parser.dart
+++ b/pkg/compiler/lib/src/patch_parser.dart
@@ -146,8 +146,12 @@
 class PatchParserTask extends CompilerTask {
   final String name = "Patching Parser";
   final ParserOptions parserOptions;
+  final Compiler compiler;
+  DiagnosticReporter get reporter => compiler.reporter;
 
-  PatchParserTask(Compiler compiler, this.parserOptions) : super(compiler);
+  PatchParserTask(Compiler compiler, this.parserOptions)
+      : compiler = compiler,
+        super(compiler.measurer);
 
   /**
    * Scans a library patch file, applies the method patches and
diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
index 1150c96..e136a14 100644
--- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
@@ -557,7 +557,7 @@
   isBlackListed(DartType type) {
     LibraryElement lib = element.library;
     return !identical(lib, compiler.coreLibrary) &&
-        !compiler.backend.isBackendLibrary(lib) &&
+        !resolution.target.isTargetSpecificLibrary(lib) &&
         (type.isDynamic ||
             type == coreTypes.boolType ||
             type == coreTypes.numType ||
diff --git a/pkg/compiler/lib/src/resolution/class_members.dart b/pkg/compiler/lib/src/resolution/class_members.dart
index 6a06749..6cbbf70 100644
--- a/pkg/compiler/lib/src/resolution/class_members.dart
+++ b/pkg/compiler/lib/src/resolution/class_members.dart
@@ -25,7 +25,7 @@
 
 abstract class MembersCreator {
   final ClassElement cls;
-  final Compiler compiler;
+  final Resolution resolution;
 
   final Iterable<String> computedMemberNames;
   final Map<Name, Member> classMembers;
@@ -34,17 +34,12 @@
       new Map<dynamic, Set<MessageKind>>();
 
   MembersCreator(
-      Compiler this.compiler,
-      ClassElement this.cls,
-      Iterable<String> this.computedMemberNames,
-      Map<Name, Member> this.classMembers) {
+      this.resolution, this.cls, this.computedMemberNames, this.classMembers) {
     assert(invariant(cls, cls.isDeclaration,
         message: "Members may only be computed on declarations."));
   }
 
-  DiagnosticReporter get reporter => compiler.reporter;
-
-  Resolution get resolution => compiler.resolution;
+  DiagnosticReporter get reporter => resolution.reporter;
 
   void reportMessage(var marker, MessageKind kind, report()) {
     Set<MessageKind> messages =
@@ -118,12 +113,12 @@
     }
 
     if (names != null) {
-      _computeClassMember(compiler, superclass, name, names);
+      _computeClassMember(resolution, superclass, name, names);
       for (Name memberName in names) {
         inheritClassMember(superclass.lookupClassMember(memberName));
       }
     } else {
-      computeAllClassMembers(compiler, superclass);
+      computeAllClassMembers(resolution, superclass);
       superclass.forEachClassMember(inheritClassMember);
     }
   }
@@ -155,13 +150,13 @@
 
         if (names != null) {
           _computeClassMember(
-              compiler, mixinApplication.mixin, nameText, names);
+              resolution, mixinApplication.mixin, nameText, names);
           for (Name memberName in names) {
             inheritMixinMember(
                 mixinApplication.mixin.lookupClassMember(memberName));
           }
         } else {
-          computeAllClassMembers(compiler, mixinApplication.mixin);
+          computeAllClassMembers(resolution, mixinApplication.mixin);
           mixinApplication.mixin.forEachClassMember(inheritMixinMember);
         }
       }
@@ -314,12 +309,12 @@
   void checkImplementsFunctionWithCall() {
     assert(!cls.isAbstract);
 
-    ClassElement functionClass = compiler.coreClasses.functionClass;
+    ClassElement functionClass = resolution.coreClasses.functionClass;
     if (cls.asInstanceOf(functionClass) == null) return;
     if (cls.lookupMember(Identifiers.call) != null) return;
     // TODO(johnniwinther): Make separate methods for backend exceptions.
     // Avoid warnings on backend implementation classes for closures.
-    if (compiler.backend.isBackendLibrary(cls.library)) return;
+    if (resolution.target.isTargetSpecificLibrary(cls.library)) return;
 
     reportMessage(functionClass, MessageKind.UNIMPLEMENTED_METHOD, () {
       reporter.reportWarningMessage(cls, MessageKind.UNIMPLEMENTED_METHOD_ONE, {
@@ -368,7 +363,8 @@
         for (Member inherited in superMember.declarations) {
           if (cls == inherited.declarer.element) {
             // An error should already have been reported.
-            assert(invariant(declared.element, compiler.compilationFailed));
+            assert(invariant(
+                declared.element, resolution.reporter.hasReportedError));
             continue;
           }
 
@@ -389,9 +385,10 @@
           // superMember.declarations. Investigate why.
         } else if (cls == inherited.declarer.element) {
           // An error should already have been reported.
-          assert(invariant(declared.element, compiler.compilationFailed,
-              message: "Member $inherited inherited from its "
-                  "declaring class: ${cls}."));
+          assert(
+              invariant(declared.element, resolution.reporter.hasReportedError,
+                  message: "Member $inherited inherited from its "
+                      "declaring class: ${cls}."));
           continue;
         }
 
@@ -427,7 +424,7 @@
               MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT);
         } else {
           DartType inheritedType = inherited.functionType;
-          if (!compiler.types.isSubtype(declaredType, inheritedType)) {
+          if (!resolution.types.isSubtype(declaredType, inheritedType)) {
             void reportWarning(
                 var marker, MessageKind warningKind, MessageKind infoKind) {
               reportMessage(marker, MessageKind.INVALID_OVERRIDE_METHOD, () {
@@ -511,11 +508,11 @@
 
   /// Compute all class and interface names by the [name] in [cls].
   static void computeClassMembersByName(
-      Compiler compiler, ClassMemberMixin cls, String name) {
+      Resolution resolution, ClassMemberMixin cls, String name) {
     if (cls.isMemberComputed(name)) return;
     LibraryElement library = cls.library;
     _computeClassMember(
-        compiler,
+        resolution,
         cls,
         name,
         new Setlet<Name>()
@@ -523,23 +520,24 @@
           ..add(new Name(name, library, isSetter: true)));
   }
 
-  static void _computeClassMember(Compiler compiler, ClassMemberMixin cls,
+  static void _computeClassMember(Resolution resolution, ClassMemberMixin cls,
       String name, Setlet<Name> names) {
-    cls.computeClassMember(compiler, name, names);
+    cls.computeClassMember(resolution, name, names);
   }
 
   /// Compute all class and interface names in [cls].
-  static void computeAllClassMembers(Compiler compiler, ClassMemberMixin cls) {
-    cls.computeAllClassMembers(compiler);
+  static void computeAllClassMembers(
+      Resolution resolution, ClassMemberMixin cls) {
+    cls.computeAllClassMembers(resolution);
   }
 }
 
 /// Class member creator for classes where the interface members are known to
 /// be a subset of the class members.
 class ClassMembersCreator extends MembersCreator {
-  ClassMembersCreator(Compiler compiler, ClassElement cls,
+  ClassMembersCreator(Resolution resolution, ClassElement cls,
       Iterable<String> computedMemberNames, Map<Name, Member> classMembers)
-      : super(compiler, cls, computedMemberNames, classMembers);
+      : super(resolution, cls, computedMemberNames, classMembers);
 
   Map<Name, Member> computeMembers(String name, Setlet<Name> names) {
     computeSuperMembers(name, names);
@@ -565,12 +563,12 @@
   final Map<Name, MemberSignature> interfaceMembers;
 
   InterfaceMembersCreator(
-      Compiler compiler,
+      Resolution resolution,
       ClassElement cls,
       Iterable<String> computedMemberNames,
       Map<Name, Member> classMembers,
       Map<Name, MemberSignature> this.interfaceMembers)
-      : super(compiler, cls, computedMemberNames, classMembers);
+      : super(resolution, cls, computedMemberNames, classMembers);
 
   Map<Name, Member> computeMembers(String name, Setlet<Name> names) {
     Map<Name, Setlet<Member>> inheritedInterfaceMembers =
@@ -634,13 +632,14 @@
       InterfaceType superinterface = link.head;
       if (names != null) {
         MembersCreator._computeClassMember(
-            compiler, superinterface.element, name, names);
+            resolution, superinterface.element, name, names);
         for (Name memberName in names) {
           inheritInterfaceMember(superinterface,
               superinterface.element.lookupInterfaceMember(memberName));
         }
       } else {
-        MembersCreator.computeAllClassMembers(compiler, superinterface.element);
+        MembersCreator.computeAllClassMembers(
+            resolution, superinterface.element);
         inheritInterfaceMembers(superinterface);
       }
     }
@@ -697,7 +696,7 @@
             if (someAreGetters) break outer;
           }
           for (MemberSignature other in inheritedMembers) {
-            if (!compiler.types
+            if (!resolution.types
                 .isSubtype(inherited.functionType, other.functionType)) {
               continue outer;
             }
@@ -833,9 +832,9 @@
 
   /// Creates the necessary maps and [MembersCreator] for compute members of
   /// this class.
-  MembersCreator _prepareCreator(Compiler compiler) {
+  MembersCreator _prepareCreator(Resolution resolution) {
     if (classMembers == null) {
-      ensureResolved(compiler.resolution);
+      ensureResolved(resolution);
       classMembers = new Map<Name, Member>();
 
       if (interfaceMembersAreClassMembers) {
@@ -853,8 +852,8 @@
     }
     return interfaceMembersAreClassMembers
         ? new ClassMembersCreator(
-            compiler, this, computedMemberNames, classMembers)
-        : new InterfaceMembersCreator(compiler, this, computedMemberNames,
+            resolution, this, computedMemberNames, classMembers)
+        : new InterfaceMembersCreator(resolution, this, computedMemberNames,
             classMembers, interfaceMembers);
   }
 
@@ -863,14 +862,15 @@
   /// Compute the members by the name [name] for this class. [names] collects
   /// the set of possible variations of [name], including getter, setter and
   /// and private names.
-  void computeClassMember(Compiler compiler, String name, Setlet<Name> names) {
+  void computeClassMember(
+      Resolution resolution, String name, Setlet<Name> names) {
     if (isMemberComputed(name)) return;
     if (Name.isPrivateName(name)) {
       names
         ..add(new Name(name, library))
         ..add(new Name(name, library, isSetter: true));
     }
-    MembersCreator creator = _prepareCreator(compiler);
+    MembersCreator creator = _prepareCreator(resolution);
     creator.computeMembersByName(name, names);
     if (computedMemberNames == null) {
       computedMemberNames = _EMPTY_MEMBERS_NAMES;
@@ -886,9 +886,9 @@
     }
   }
 
-  void computeAllClassMembers(Compiler compiler) {
+  void computeAllClassMembers(Resolution resolution) {
     if (areAllMembersComputed()) return;
-    MembersCreator creator = _prepareCreator(compiler);
+    MembersCreator creator = _prepareCreator(resolution);
     creator.computeAllMembers();
     computedMemberNames = null;
     assert(invariant(this, areAllMembersComputed()));
diff --git a/pkg/compiler/lib/src/resolution/constructors.dart b/pkg/compiler/lib/src/resolution/constructors.dart
index 17bd6e0..7a4dbc6 100644
--- a/pkg/compiler/lib/src/resolution/constructors.dart
+++ b/pkg/compiler/lib/src/resolution/constructors.dart
@@ -719,7 +719,17 @@
   ConstructorResult constructorResultForType(Node node, DartType type,
       {PrefixElement prefix}) {
     String name = type.name;
-    if (type.isMalformed) {
+    if (type.isTypeVariable) {
+      return reportAndCreateErroneousConstructorElement(
+          node,
+          ConstructorResultKind.INVALID_TYPE,
+          type,
+          resolver.enclosingElement,
+          name,
+          MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE,
+          {'typeVariableName': name});
+    } else if (type.isMalformed) {
+      // `type is MalformedType`: `MethodTypeVariableType` is handled above.
       return new ConstructorResult.forError(
           ConstructorResultKind.INVALID_TYPE, type.element, type);
     } else if (type.isInterfaceType) {
@@ -733,15 +743,6 @@
           name,
           MessageKind.CANNOT_INSTANTIATE_TYPEDEF,
           {'typedefName': name});
-    } else if (type.isTypeVariable) {
-      return reportAndCreateErroneousConstructorElement(
-          node,
-          ConstructorResultKind.INVALID_TYPE,
-          type,
-          resolver.enclosingElement,
-          name,
-          MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE,
-          {'typeVariableName': name});
     }
     return reporter.internalError(node, "Unexpected constructor type $type");
   }
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index 68f6f31..b69287a 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -24,7 +24,6 @@
         JumpTargetX,
         LocalFunctionElementX,
         LocalParameterElementX,
-        MethodElementX,
         ParameterElementX,
         VariableElementX,
         VariableList;
@@ -1122,6 +1121,14 @@
       type = resolveTypeAnnotation(typeNode);
       sendStructure = new IsStructure(type);
     }
+
+    // GENERIC_METHODS: Method type variables are not reified so we must warn
+    // about the error which will occur at runtime.
+    if (type is MethodTypeVariableType) {
+      reporter.reportWarningMessage(
+          node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
+    }
+
     registry.registerTypeUse(new TypeUse.isCheck(type));
     registry.registerSendStructure(node, sendStructure);
     return const NoneResult();
@@ -1134,6 +1141,14 @@
 
     Node typeNode = node.arguments.head;
     DartType type = resolveTypeAnnotation(typeNode);
+
+    // GENERIC_METHODS: Method type variables are not reified so we must warn
+    // about the error which will occur at runtime.
+    if (type is MethodTypeVariableType) {
+      reporter.reportWarningMessage(
+          node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
+    }
+
     registry.registerTypeUse(new TypeUse.asCast(type));
     registry.registerSendStructure(node, new AsStructure(type));
     return const NoneResult();
@@ -1546,7 +1561,7 @@
       bool isIncompatibleInvoke = false;
       switch (semantics.kind) {
         case AccessKind.SUPER_METHOD:
-          MethodElementX superMethod = semantics.element;
+          MethodElement superMethod = semantics.element;
           superMethod.computeType(resolution);
           if (!callStructure.signatureApplies(superMethod.functionSignature)) {
             registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
@@ -1824,7 +1839,7 @@
       return const NoneResult();
     }
     MembersCreator.computeClassMembersByName(
-        compiler, receiverClass.declaration, name);
+        resolution, receiverClass.declaration, name);
     Element member = receiverClass.lookupLocalMember(name);
     if (member == null) {
       return handleUnresolvedStaticMemberAccess(
@@ -1849,7 +1864,7 @@
     String name = memberName.text;
     receiverClass.ensureResolved(resolution);
     MembersCreator.computeClassMembersByName(
-        compiler, receiverClass.declaration, name);
+        resolution, receiverClass.declaration, name);
     Element member = receiverClass.lookupLocalMember(name);
     if (member == null) {
       return handleUnresolvedStaticMemberUpdate(
@@ -1889,6 +1904,12 @@
       // TODO(johnniwinther): Clean up registration of elements and selectors
       // for this case.
     } else {
+      // GENERIC_METHODS: Method type variables are not reified so we must warn
+      // about the error which will occur at runtime.
+      if (element.type is MethodTypeVariableType) {
+        reporter.reportWarningMessage(
+            node, MessageKind.TYPE_VARIABLE_FROM_METHOD_NOT_REIFIED);
+      }
       semantics = new StaticAccess.typeParameterTypeLiteral(element);
     }
 
@@ -3012,7 +3033,8 @@
     if (element is! ClassElement) return null;
     ClassElement cls = element;
     cls.ensureResolved(resolution);
-    return cls.computeType(resolution);
+    cls.computeType(resolution);
+    return cls.rawType;
   }
 
   /// Handle index operations like `a[b] = c`, `a[b] += c`, and `a[b]++`.
diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
index 0676ba6..4ea5aff 100644
--- a/pkg/compiler/lib/src/resolution/resolution.dart
+++ b/pkg/compiler/lib/src/resolution/resolution.dart
@@ -59,11 +59,16 @@
 
 class ResolverTask extends CompilerTask {
   final ConstantCompiler constantCompiler;
+  final Compiler compiler;
 
-  ResolverTask(Compiler compiler, this.constantCompiler) : super(compiler);
+  ResolverTask(Compiler compiler, this.constantCompiler)
+      : compiler = compiler,
+        super(compiler.measurer);
 
   String get name => 'Resolver';
 
+  DiagnosticReporter get reporter => compiler.reporter;
+
   Resolution get resolution => compiler.resolution;
 
   ParsingContext get parsingContext => compiler.parsingContext;
@@ -417,21 +422,23 @@
     return result;
   }
 
-  void resolveRedirectionChain(
-      ConstructorElementX constructor, Spannable node) {
-    ConstructorElementX target = constructor;
+  void resolveRedirectionChain(ConstructorElement constructor, Spannable node) {
+    ConstructorElement target = constructor;
     InterfaceType targetType;
     List<Element> seen = new List<Element>();
     bool isMalformed = false;
     // Follow the chain of redirections and check for cycles.
     while (target.isRedirectingFactory || target.isPatched) {
-      if (target.effectiveTargetInternal != null) {
+      if (target.hasEffectiveTarget) {
         // We found a constructor that already has been processed.
-        targetType = target.effectiveTargetType;
+        // TODO(johnniwinther): Should `effectiveTargetType` be part of the
+        // interface?
+        targetType =
+            target.computeEffectiveTargetType(target.enclosingClass.thisType);
         assert(invariant(target, targetType != null,
             message: 'Redirection target type has not been computed for '
                 '$target'));
-        target = target.effectiveTargetInternal;
+        target = target.effectiveTarget;
         break;
       }
 
@@ -665,11 +672,11 @@
   }
 
   void computeClassMembers(ClassElement element) {
-    MembersCreator.computeAllClassMembers(compiler, element);
+    MembersCreator.computeAllClassMembers(resolution, element);
   }
 
   void computeClassMember(ClassElement element, String name) {
-    MembersCreator.computeClassMembersByName(compiler, element, name);
+    MembersCreator.computeClassMembersByName(resolution, element, name);
   }
 
   void checkClass(ClassElement element) {
diff --git a/pkg/compiler/lib/src/resolution/resolution_common.dart b/pkg/compiler/lib/src/resolution/resolution_common.dart
index 3cf5dcb..819c292 100644
--- a/pkg/compiler/lib/src/resolution/resolution_common.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_common.dart
@@ -6,7 +6,6 @@
 
 import '../common.dart';
 import '../common/resolution.dart' show Resolution;
-import '../common/tasks.dart' show DeferredAction;
 import '../compiler.dart' show Compiler;
 import '../elements/elements.dart';
 import '../tree/tree.dart';
@@ -34,7 +33,7 @@
   /** Convenience method for visiting nodes that may be null. */
   R visit(Node node) => (node == null) ? null : node.accept(this);
 
-  void addDeferredAction(Element element, DeferredAction action) {
+  void addDeferredAction(Element element, void action()) {
     compiler.enqueuer.resolution.addDeferredAction(element, action);
   }
 }
diff --git a/pkg/compiler/lib/src/resolution/signatures.dart b/pkg/compiler/lib/src/resolution/signatures.dart
index 33a8f2f..d3f3264 100644
--- a/pkg/compiler/lib/src/resolution/signatures.dart
+++ b/pkg/compiler/lib/src/resolution/signatures.dart
@@ -314,10 +314,12 @@
         nodes = nodes.tail;
         TypeVariableElementX variableElement =
             new TypeVariableElementX(variableName, element, index, node);
-        // TODO(eernst): When type variables are implemented fully we will need
-        // to resolve the actual bounds; currently we just claim [dynamic].
+        // GENERIC_METHODS: When method type variables are implemented fully we
+        // must resolve the actual bounds; currently we just claim that
+        // every method type variable has upper bound [dynamic].
         variableElement.boundCache = const DynamicType();
-        TypeVariableType variableType = new TypeVariableType(variableElement);
+        TypeVariableType variableType =
+            new MethodTypeVariableType(variableElement);
         variableElement.typeCache = variableType;
         return variableType;
       }, growable: false);
diff --git a/pkg/compiler/lib/src/resolution/type_resolver.dart b/pkg/compiler/lib/src/resolution/type_resolver.dart
index e1a076d..9837a09 100644
--- a/pkg/compiler/lib/src/resolution/type_resolver.dart
+++ b/pkg/compiler/lib/src/resolution/type_resolver.dart
@@ -206,10 +206,6 @@
           }
         }
       } else if (element.isTypeVariable) {
-        // FIXME: check enclosing, which may be not class, not typedef (so
-        // it's a generic method) then set the type to `const DynamicType()`.
-        // This should later be fixed such that we don't tell the user that they
-        // wrote `dynamic` anywhere.
         TypeVariableElement typeVariable = element;
         Element outer =
             visitor.enclosingElement.outermostEnclosingMemberOrTopLevel;
diff --git a/pkg/compiler/lib/src/scanner/scanner_task.dart b/pkg/compiler/lib/src/scanner/scanner_task.dart
index 3d694a3..6b25efd 100644
--- a/pkg/compiler/lib/src/scanner/scanner_task.dart
+++ b/pkg/compiler/lib/src/scanner/scanner_task.dart
@@ -4,8 +4,8 @@
 
 library dart2js.scanner.task;
 
-import '../common/tasks.dart' show CompilerTask;
-import '../compiler.dart' show Compiler;
+import '../common/tasks.dart' show CompilerTask, Measurer;
+import '../diagnostics/diagnostic_listener.dart' show DiagnosticReporter;
 import '../elements/elements.dart' show CompilationUnitElement, LibraryElement;
 import '../script.dart' show Script;
 import '../parser/diet_parser_task.dart' show DietParserTask;
@@ -20,12 +20,13 @@
   final DietParserTask _dietParser;
   final bool _preserveComments;
   final TokenMap _commentMap;
+  final DiagnosticReporter reporter;
 
-  ScannerTask(Compiler compiler, this._dietParser,
+  ScannerTask(this._dietParser, this.reporter, Measurer measurer,
       {bool preserveComments: false, TokenMap commentMap})
       : _preserveComments = preserveComments,
         _commentMap = commentMap,
-        super(compiler) {
+        super(measurer) {
     if (_preserveComments && _commentMap == null) {
       throw new ArgumentError(
           "commentMap must be provided if preserveComments is true");
diff --git a/pkg/compiler/lib/src/serialization/element_serialization.dart b/pkg/compiler/lib/src/serialization/element_serialization.dart
index ebb179a..ab10cc8 100644
--- a/pkg/compiler/lib/src/serialization/element_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/element_serialization.dart
@@ -51,7 +51,7 @@
   LOCAL_VARIABLE,
   EXTERNAL_LIBRARY,
   EXTERNAL_LIBRARY_MEMBER,
-  EXTERNAL_STATIC_MEMBER,
+  EXTERNAL_CLASS_MEMBER,
   EXTERNAL_CONSTRUCTOR,
 }
 
@@ -730,7 +730,7 @@
         return new LocalVariableElementZ(decoder);
       case SerializedElementKind.EXTERNAL_LIBRARY:
       case SerializedElementKind.EXTERNAL_LIBRARY_MEMBER:
-      case SerializedElementKind.EXTERNAL_STATIC_MEMBER:
+      case SerializedElementKind.EXTERNAL_CLASS_MEMBER:
       case SerializedElementKind.EXTERNAL_CONSTRUCTOR:
         break;
     }
diff --git a/pkg/compiler/lib/src/serialization/modelz.dart b/pkg/compiler/lib/src/serialization/modelz.dart
index 3c10292..0c06ea4 100644
--- a/pkg/compiler/lib/src/serialization/modelz.dart
+++ b/pkg/compiler/lib/src/serialization/modelz.dart
@@ -10,6 +10,7 @@
 library dart2js.serialization.modelz;
 
 import '../common.dart';
+import '../common/names.dart';
 import '../common/resolution.dart' show Resolution;
 import '../constants/constructors.dart';
 import '../constants/expressions.dart';
@@ -370,6 +371,9 @@
   String get name => entryCompilationUnit.name;
 
   @override
+  SourceSpan get sourcePosition => entryCompilationUnit.sourcePosition;
+
+  @override
   accept(ElementVisitor visitor, arg) {
     return visitor.visitLibraryElement(this, arg);
   }
@@ -556,6 +560,9 @@
   Element get enclosingElement => library;
 
   @override
+  SourceSpan get sourcePosition => new SourceSpan(script.resourceUri, 0, 0);
+
+  @override
   accept(ElementVisitor visitor, arg) {
     return visitor.visitCompilationUnitElement(this, arg);
   }
@@ -772,7 +779,10 @@
   List<DartType> get typeVariables => functionSignature.typeVariables;
 }
 
-abstract class ClassElementMixin implements ElementZ, ClassElement {
+abstract class ClassElementMixin
+    implements ElementZ, ClassElement, class_members.ClassMemberMixin {
+  bool _isResolved = false;
+
   InterfaceType _createType(List<DartType> typeArguments) {
     return new InterfaceType(this, typeArguments);
   }
@@ -806,7 +816,12 @@
 
   @override
   void ensureResolved(Resolution resolution) {
-    resolution.registerClass(this);
+    if (!_isResolved) {
+      _isResolved = true;
+      class_members.MembersCreator
+          .computeClassMembersByName(resolution, this, Identifiers.call);
+      resolution.registerClass(this);
+    }
   }
 }
 
@@ -903,6 +918,7 @@
   @override
   FunctionType get callType {
     _ensureSuperHierarchy();
+    // TODO(johnniwinther): Why can't this always be computed in ensureResolved?
     return _callType;
   }
 }
@@ -967,8 +983,11 @@
       for (ConstructorElement definingConstructor in superclass.constructors) {
         if (definingConstructor.isGenerativeConstructor &&
             definingConstructor.memberName.isAccessibleFrom(library)) {
-          builder.addLast(
-              new ForwardingConstructorElementZ(this, definingConstructor));
+          ForwardingConstructorElementZ constructor =
+              new ForwardingConstructorElementZ(this, definingConstructor);
+          constructor.resolvedAst = new SynthesizedResolvedAst(
+              constructor, ResolvedAstKind.FORWARDING_CONSTRUCTOR);
+          builder.addLast(constructor);
         }
       }
       _constructors = builder.toLink();
@@ -1108,6 +1127,9 @@
   ConstructorElement get definingConstructor => null;
 
   @override
+  bool get hasEffectiveTarget => true;
+
+  @override
   ConstructorElement get effectiveTarget {
     if (_effectiveTarget == null) {
       _effectiveTarget =
@@ -1256,7 +1278,7 @@
 
   @override
   InterfaceType computeEffectiveTargetType(InterfaceType newType) {
-    return enclosingClass.thisType;
+    return enclosingClass.thisType.substByContext(newType);
   }
 
   @override
@@ -1269,6 +1291,9 @@
   ConstantConstructor get constantConstructor => null;
 
   @override
+  bool get hasEffectiveTarget => true;
+
+  @override
   ConstructorElement get effectiveTarget => this;
 
   @override
@@ -1405,6 +1430,9 @@
   }
 
   @override
+  bool get hasConstant => true;
+
+  @override
   ConstantExpression get constant {
     _ensureConstant();
     return _constant;
@@ -1852,6 +1880,9 @@
   bool get isConst => false;
 
   @override
+  bool get hasConstant => true;
+
+  @override
   ConstantExpression get constant {
     if (isOptional) {
       if (_constant == null) {
@@ -1980,6 +2011,9 @@
   }
 
   @override
+  bool get hasConstant => true;
+
+  @override
   ConstantExpression get constant {
     if (isConst) {
       return _constant;
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index a16e558..74dd4a0 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -4,9 +4,10 @@
 
 library dart2js.serialization;
 
-import '../elements/elements.dart';
+import '../common.dart';
 import '../constants/expressions.dart';
 import '../dart_types.dart';
+import '../elements/elements.dart';
 import '../util/enumset.dart';
 
 import 'constant_serialization.dart';
@@ -686,6 +687,20 @@
     DataObject dataObject = _elementMap[element];
     if (dataObject == null) {
       if (!shouldInclude(element)) {
+        /// Helper used to check that external references are serialized by
+        /// the right kind.
+        bool verifyElement(var found, var expected) {
+          found = found.declaration;
+          if (found == expected) return true;
+          if (found.isAbstractField && expected.isGetter) {
+            return found.getter == expected;
+          }
+          if (found.isAbstractField && expected.isSetter) {
+            return found.setter == expected;
+          }
+          return false;
+        }
+
         if (element.isLibrary) {
           LibraryElement library = element;
           _elementMap[element] = dataObject = new DataObject(
@@ -693,15 +708,15 @@
               new EnumValue(SerializedElementKind.EXTERNAL_LIBRARY));
           ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
           encoder.setUri(Key.URI, library.canonicalUri, library.canonicalUri);
-        } else if (element.isStatic) {
-          Value classId = _getElementId(element.enclosingClass);
-          _elementMap[element] = dataObject = new DataObject(
-              new IntValue(_elementMap.length),
-              new EnumValue(SerializedElementKind.EXTERNAL_STATIC_MEMBER));
-          ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
-          encoder.setValue(Key.CLASS, classId);
-          encoder.setString(Key.NAME, element.name);
         } else if (element.isConstructor) {
+          assert(invariant(
+              element,
+              verifyElement(
+                  element.enclosingClass.implementation
+                      .lookupConstructor(element.name),
+                  element),
+              message: "Element $element is not found as a "
+                  "constructor of ${element.enclosingClass.implementation}."));
           Value classId = _getElementId(element.enclosingClass);
           _elementMap[element] = dataObject = new DataObject(
               new IntValue(_elementMap.length),
@@ -709,7 +724,31 @@
           ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
           encoder.setValue(Key.CLASS, classId);
           encoder.setString(Key.NAME, element.name);
+        } else if (element.isClassMember) {
+          assert(invariant(
+              element,
+              verifyElement(
+                  element.enclosingClass.lookupLocalMember(element.name),
+                  element),
+              message: "Element $element is not found as a "
+                  "class member of ${element.enclosingClass}."));
+          Value classId = _getElementId(element.enclosingClass);
+          _elementMap[element] = dataObject = new DataObject(
+              new IntValue(_elementMap.length),
+              new EnumValue(SerializedElementKind.EXTERNAL_CLASS_MEMBER));
+          ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
+          encoder.setValue(Key.CLASS, classId);
+          encoder.setString(Key.NAME, element.name);
+          if (element.isAccessor) {
+            encoder.setBool(Key.GETTER, element.isGetter);
+          }
         } else {
+          assert(invariant(
+              element,
+              verifyElement(
+                  element.library.implementation.find(element.name), element),
+              message: "Element $element is not found as a "
+                  "library member of ${element.library.implementation}."));
           Value libraryId = _getElementId(element.library);
           _elementMap[element] = dataObject = new DataObject(
               new IntValue(_elementMap.length),
@@ -717,6 +756,9 @@
           ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
           encoder.setValue(Key.LIBRARY, libraryId);
           encoder.setString(Key.NAME, element.name);
+          if (element.isAccessor) {
+            encoder.setBool(Key.GETTER, element.isGetter);
+          }
         }
       } else {
         // Run through [ELEMENT_SERIALIZERS] sequentially to find the one that
@@ -878,18 +920,33 @@
 
 /// Context for parallel deserialization.
 class DeserializationContext {
+  final DiagnosticReporter reporter;
   Map<Uri, LibraryElement> _uriMap = <Uri, LibraryElement>{};
   List<Deserializer> deserializers = <Deserializer>[];
+  List<DeserializerPlugin> plugins = <DeserializerPlugin>[];
+
+  DeserializationContext(this.reporter);
 
   LibraryElement lookupLibrary(Uri uri) {
     return _uriMap.putIfAbsent(uri, () {
+      Uri foundUri;
+      LibraryElement foundLibrary;
       for (Deserializer deserializer in deserializers) {
         LibraryElement library = deserializer.lookupLibrary(uri);
         if (library != null) {
-          return library;
+          if (foundLibrary != null) {
+            reporter.reportErrorMessage(NO_LOCATION_SPANNABLE,
+                MessageKind.DUPLICATE_SERIALIZED_LIBRARY, {
+              'libraryUri': uri,
+              'sourceUri1': foundUri,
+              'sourceUri2': deserializer.sourceUri
+            });
+          }
+          foundUri = deserializer.sourceUri;
+          foundLibrary = library;
         }
       }
-      return null;
+      return foundLibrary;
     });
   }
 }
@@ -900,7 +957,7 @@
 class Deserializer {
   final DeserializationContext context;
   final SerializationDecoder decoder;
-  List<DeserializerPlugin> plugins = <DeserializerPlugin>[];
+  final Uri sourceUri;
   ObjectDecoder _headerObject;
   ListDecoder _elementList;
   ListDecoder _typeList;
@@ -909,9 +966,9 @@
   Map<int, DartType> _typeMap = {};
   Map<int, ConstantExpression> _constantMap = {};
 
-  Deserializer.fromText(this.context, String text, this.decoder) {
+  Deserializer.fromText(
+      this.context, this.sourceUri, String text, this.decoder) {
     _headerObject = new ObjectDecoder(this, decoder.decode(text));
-    context.deserializers.add(this);
   }
 
   /// Returns the [ListDecoder] for the [Element]s in this deserializer.
@@ -974,16 +1031,35 @@
       } else if (elementKind == SerializedElementKind.EXTERNAL_LIBRARY_MEMBER) {
         LibraryElement library = decoder.getElement(Key.LIBRARY);
         String name = decoder.getString(Key.NAME);
+        bool isGetter = decoder.getBool(Key.GETTER, isOptional: true);
         element = library.find(name);
         if (element == null) {
           throw new StateError("Missing library member for $name in $library.");
         }
-      } else if (elementKind == SerializedElementKind.EXTERNAL_STATIC_MEMBER) {
+        if (isGetter != null) {
+          AbstractFieldElement abstractField = element;
+          element = isGetter ? abstractField.getter : abstractField.setter;
+          if (element == null) {
+            throw new StateError(
+                "Missing ${isGetter ? 'getter' : 'setter'} for "
+                "$name in $library.");
+          }
+        }
+      } else if (elementKind == SerializedElementKind.EXTERNAL_CLASS_MEMBER) {
         ClassElement cls = decoder.getElement(Key.CLASS);
         String name = decoder.getString(Key.NAME);
+        bool isGetter = decoder.getBool(Key.GETTER, isOptional: true);
         element = cls.lookupLocalMember(name);
         if (element == null) {
-          throw new StateError("Missing static member for $name in $cls.");
+          throw new StateError("Missing class member for $name in $cls.");
+        }
+        if (isGetter != null) {
+          AbstractFieldElement abstractField = element;
+          element = isGetter ? abstractField.getter : abstractField.setter;
+          if (element == null) {
+            throw new StateError(
+                "Missing ${isGetter ? 'getter' : 'setter'} for $name in $cls.");
+          }
         }
       } else if (elementKind == SerializedElementKind.EXTERNAL_CONSTRUCTOR) {
         ClassElement cls = decoder.getElement(Key.CLASS);
@@ -1000,7 +1076,7 @@
       MapDecoder pluginData = decoder.getMap(Key.DATA, isOptional: true);
       // Call plugins even when there is no data, so they can take action in
       // this case.
-      for (DeserializerPlugin plugin in plugins) {
+      for (DeserializerPlugin plugin in context.plugins) {
         plugin.onElement(element,
             (String tag) => pluginData?.getObject(tag, isOptional: true));
       }
diff --git a/pkg/compiler/lib/src/serialization/system.dart b/pkg/compiler/lib/src/serialization/system.dart
index 8db5c4b..02a716b 100644
--- a/pkg/compiler/lib/src/serialization/system.dart
+++ b/pkg/compiler/lib/src/serialization/system.dart
@@ -28,43 +28,40 @@
 
 class DeserializerSystemImpl extends DeserializerSystem {
   final Compiler _compiler;
-  final Deserializer _deserializer;
+  final DeserializationContext deserializationContext;
   final List<LibraryElement> deserializedLibraries = <LibraryElement>[];
   final ResolutionImpactDeserializer _resolutionImpactDeserializer;
   final ResolvedAstDeserializerPlugin _resolvedAstDeserializer;
   final ImpactTransformer _impactTransformer;
 
-  factory DeserializerSystemImpl(Compiler compiler, Deserializer deserializer,
-      ImpactTransformer impactTransformer) {
-    List<DeserializerPlugin> plugins = <DeserializerPlugin>[];
+  factory DeserializerSystemImpl(
+      Compiler compiler, ImpactTransformer impactTransformer) {
+    DeserializationContext context =
+        new DeserializationContext(compiler.reporter);
     DeserializerPlugin backendDeserializer =
         compiler.backend.serialization.deserializer;
-    deserializer.plugins.add(backendDeserializer);
+    context.plugins.add(backendDeserializer);
     ResolutionImpactDeserializer resolutionImpactDeserializer =
         new ResolutionImpactDeserializer(backendDeserializer);
-    deserializer.plugins.add(resolutionImpactDeserializer);
+    context.plugins.add(resolutionImpactDeserializer);
     ResolvedAstDeserializerPlugin resolvedAstDeserializer =
         new ResolvedAstDeserializerPlugin(
             compiler.parsingContext, backendDeserializer);
-    deserializer.plugins.add(resolvedAstDeserializer);
-    return new DeserializerSystemImpl._(
-        compiler,
-        deserializer,
-        impactTransformer,
-        resolutionImpactDeserializer,
-        resolvedAstDeserializer);
+    context.plugins.add(resolvedAstDeserializer);
+    return new DeserializerSystemImpl._(compiler, context, impactTransformer,
+        resolutionImpactDeserializer, resolvedAstDeserializer);
   }
 
   DeserializerSystemImpl._(
       this._compiler,
-      this._deserializer,
+      this.deserializationContext,
       this._impactTransformer,
       this._resolutionImpactDeserializer,
       this._resolvedAstDeserializer);
 
   @override
   Future<LibraryElement> readLibrary(Uri resolvedUri) {
-    LibraryElement library = _deserializer.lookupLibrary(resolvedUri);
+    LibraryElement library = deserializationContext.lookupLibrary(resolvedUri);
     if (library != null) {
       deserializedLibraries.add(library);
       return Future.forEach(library.compilationUnits,
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index f0cd00e..80d98d6 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -5,6 +5,7 @@
 library dart2js.serialization.task;
 
 import 'dart:async' show EventSink, Future;
+import '../common.dart';
 import '../common/resolution.dart' show ResolutionImpact, ResolutionWorkItem;
 import '../common/tasks.dart' show CompilerTask;
 import '../common/work.dart' show ItemCompilationContext;
@@ -26,7 +27,10 @@
 
 /// Task that supports deserialization of elements.
 class SerializationTask extends CompilerTask implements LibraryDeserializer {
-  SerializationTask(Compiler compiler) : super(compiler);
+  final Compiler compiler;
+  SerializationTask(Compiler compiler)
+      : compiler = compiler,
+        super(compiler.measurer);
 
   DeserializerSystem deserializer;
 
@@ -83,7 +87,8 @@
     return measure(() {
       assert(supportSerialization);
 
-      Serializer serializer = new Serializer();
+      Serializer serializer =
+          new Serializer(shouldInclude: (e) => libraries.contains(e.library));
       SerializerPlugin backendSerializer =
           compiler.backend.serialization.serializer;
       serializer.plugins.add(backendSerializer);
@@ -109,15 +114,17 @@
     });
   }
 
-  void deserializeFromText(String serializedData) {
+  void deserializeFromText(Uri sourceUri, String serializedData) {
     measure(() {
+      if (deserializer == null) {
+        deserializer = new DeserializerSystemImpl(
+            compiler, compiler.backend.impactTransformer);
+      }
+      DeserializerSystemImpl deserializerImpl = deserializer;
+      DeserializationContext context = deserializerImpl.deserializationContext;
       Deserializer dataDeserializer = new Deserializer.fromText(
-          new DeserializationContext(),
-          serializedData,
-          const JsonSerializationDecoder());
-      dataDeserializer.plugins.add(compiler.backend.serialization.deserializer);
-      deserializer = new DeserializerSystemImpl(
-          compiler, dataDeserializer, compiler.backend.impactTransformer);
+          context, sourceUri, serializedData, const JsonSerializationDecoder());
+      context.deserializers.add(dataDeserializer);
     });
   }
 }
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index f8c3ad0..7607077 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -91,13 +91,15 @@
   final CodeEmitterTask emitter;
   final JavaScriptBackend backend;
   final SourceInformationStrategy sourceInformationFactory;
+  final Compiler compiler;
 
   String get name => 'SSA builder';
 
   SsaBuilderTask(JavaScriptBackend backend, this.sourceInformationFactory)
       : emitter = backend.emitter,
         backend = backend,
-        super(backend.compiler);
+        compiler = backend.compiler,
+        super(backend.compiler.measurer);
 
   DiagnosticReporter get reporter => compiler.reporter;
 
@@ -2578,13 +2580,17 @@
             "${localsHandler.contextClass}.");
   }
 
-  /// Build a [HTypeConversion] for convertion [original] to type [type].
+  /// Build a [HTypeConversion] for converting [original] to type [type].
   ///
   /// Invariant: [type] must be valid in the context.
   /// See [LocalsHandler.substInContext].
   HInstruction buildTypeConversion(
       HInstruction original, DartType type, int kind) {
     if (type == null) return original;
+    // GENERIC_METHODS: The following statement was added for parsing and
+    // ignoring method type variables; must be generalized for full support of
+    // generic methods.
+    type = type.dynamifyMethodTypeVariableType;
     type = type.unaliased;
     assert(assertTypeInContext(type, original));
     if (type.isInterfaceType && !type.treatAsRaw) {
@@ -3805,8 +3811,15 @@
   void visitAs(ast.Send node, ast.Node expression, DartType type, _) {
     HInstruction expressionInstruction = visitAndPop(expression);
     if (type.isMalformed) {
-      ErroneousElement element = type.element;
-      generateTypeError(node, element.message);
+      String message;
+      if (type is MalformedType) {
+        ErroneousElement element = type.element;
+        message = element.message;
+      } else {
+        assert(type is MethodTypeVariableType);
+        message = "Method type variables are not reified.";
+      }
+      generateTypeError(node, message);
     } else {
       HInstruction converted = buildTypeConversion(expressionInstruction,
           localsHandler.substInContext(type), HTypeConversion.CAST_TYPE_CHECK);
@@ -3832,7 +3845,20 @@
   HInstruction buildIsNode(
       ast.Node node, DartType type, HInstruction expression) {
     type = localsHandler.substInContext(type).unaliased;
-    if (type.isFunctionType) {
+    if (type.isMalformed) {
+      String message;
+      if (type is MethodTypeVariableType) {
+        message = "Method type variables are not reified, "
+            "so they cannot be tested with an `is` expression.";
+      } else {
+        assert(type is MalformedType);
+        ErroneousElement element = type.element;
+        message = element.message;
+      }
+      generateTypeError(node, message);
+      HInstruction call = pop();
+      return new HIs.compound(type, expression, call, backend.boolType);
+    } else if (type.isFunctionType) {
       List arguments = [buildFunctionType(type), expression];
       pushInvokeDynamic(
           node,
@@ -3867,11 +3893,6 @@
       pushInvokeStatic(node, helper, inputs, typeMask: backend.boolType);
       HInstruction call = pop();
       return new HIs.compound(type, expression, call, backend.boolType);
-    } else if (type.isMalformed) {
-      ErroneousElement element = type.element;
-      generateTypeError(node, element.message);
-      HInstruction call = pop();
-      return new HIs.compound(type, expression, call, backend.boolType);
     } else {
       if (backend.hasDirectCheckFor(type)) {
         return new HIs.direct(type, expression, backend.boolType);
@@ -5337,12 +5358,19 @@
   /// Generate the literal for [typeVariable] in the current context.
   void generateTypeVariableLiteral(
       ast.Send node, TypeVariableType typeVariable) {
-    DartType type = localsHandler.substInContext(typeVariable);
-    HInstruction value = analyzeTypeArgument(type,
-        sourceInformation: sourceInformationBuilder.buildGet(node));
-    pushInvokeStatic(node, helpers.runtimeTypeToString, [value],
-        typeMask: backend.stringType);
-    pushInvokeStatic(node, helpers.createRuntimeType, [pop()]);
+    // GENERIC_METHODS: This provides thin support for method type variables
+    // by treating them as malformed when evaluated as a literal. For full
+    // support of generic methods this must be revised.
+    if (typeVariable is MethodTypeVariableType) {
+      generateTypeError(node, "Method type variables are not reified");
+    } else {
+      DartType type = localsHandler.substInContext(typeVariable);
+      HInstruction value = analyzeTypeArgument(type,
+          sourceInformation: sourceInformationBuilder.buildGet(node));
+      pushInvokeStatic(node, helpers.runtimeTypeToString, [value],
+          typeMask: backend.stringType);
+      pushInvokeStatic(node, helpers.createRuntimeType, [pop()]);
+    }
   }
 
   /// Generate a call to a type literal.
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 74cd875..0ff32f2 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -29,11 +29,13 @@
 
 class SsaCodeGeneratorTask extends CompilerTask {
   final JavaScriptBackend backend;
+  final Compiler compiler;
   final SourceInformationStrategy sourceInformationFactory;
 
   SsaCodeGeneratorTask(JavaScriptBackend backend, this.sourceInformationFactory)
       : this.backend = backend,
-        super(backend.compiler);
+        this.compiler = backend.compiler,
+        super(backend.compiler.measurer);
 
   String get name => 'SSA code generator';
   NativeEmitter get nativeEmitter => backend.emitter.nativeEmitter;
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index a4ee039..20aaf32 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -36,7 +36,7 @@
   final JavaScriptBackend backend;
   SsaOptimizerTask(JavaScriptBackend backend)
       : this.backend = backend,
-        super(backend.compiler);
+        super(backend.compiler.measurer);
   String get name => 'SSA optimizer';
   Compiler get compiler => backend.compiler;
   Map<HInstruction, Range> ranges = <HInstruction, Range>{};
@@ -780,6 +780,8 @@
     return inputType.isInMask(checkedType, classWorld) ? input : node;
   }
 
+  HInstruction removeCheck(HCheck node) => node.checkedInput;
+
   VariableElement findConcreteFieldForDynamicAccess(
       HInstruction receiver, Selector selector) {
     TypeMask receiverType = receiver.instructionType;
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index 5de81a6..750357e 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -46,8 +46,13 @@
 import 'util/util.dart' show Link, LinkBuilder;
 
 class TypeCheckerTask extends CompilerTask {
-  TypeCheckerTask(Compiler compiler) : super(compiler);
+  final Compiler compiler;
+  TypeCheckerTask(Compiler compiler)
+      : compiler = compiler,
+        super(compiler.measurer);
+
   String get name => "Type checker";
+  DiagnosticReporter get reporter => compiler.reporter;
 
   void check(AstElement element) {
     if (element.isClass) return;
@@ -716,7 +721,7 @@
     // Lookup the class or interface member [name] in [interface].
     MemberSignature lookupMemberSignature(Name name, InterfaceType interface) {
       MembersCreator.computeClassMembersByName(
-          compiler, interface.element, name.text);
+          resolution, interface.element, name.text);
       return lookupClassMember || analyzingInitializer
           ? interface.lookupClassMember(name)
           : interface.lookupInterfaceMember(name);
@@ -799,7 +804,7 @@
           }
         }
         // TODO(johnniwinther): Avoid computation of all class members.
-        MembersCreator.computeAllClassMembers(compiler, interface.element);
+        MembersCreator.computeAllClassMembers(resolution, interface.element);
         if (lookupClassMember) {
           interface.element.forEachClassMember(findPrivateMember);
         } else {
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart
index fcaf762..61dbabf 100644
--- a/pkg/compiler/lib/src/types/types.dart
+++ b/pkg/compiler/lib/src/types/types.dart
@@ -52,11 +52,13 @@
 class TypesTask extends CompilerTask {
   final String name = 'Type inference';
   final ClassWorld classWorld;
+  final Compiler compiler;
   TypesInferrer typesInferrer;
 
   TypesTask(Compiler compiler)
       : this.classWorld = compiler.world,
-        super(compiler) {
+        compiler = compiler,
+        super(compiler.measurer) {
     typesInferrer = new TypeGraphInferrer(compiler);
   }
 
@@ -102,7 +104,7 @@
   TypeMask get intType {
     if (intTypeCache == null) {
       intTypeCache = new TypeMask.nonNullSubclass(
-          compiler.backend.intImplementation, compiler.world);
+          compiler.backend.intImplementation, classWorld);
     }
     return intTypeCache;
   }
@@ -110,7 +112,7 @@
   TypeMask get uint32Type {
     if (uint32TypeCache == null) {
       uint32TypeCache = new TypeMask.nonNullSubclass(
-          compiler.backend.uint32Implementation, compiler.world);
+          compiler.backend.uint32Implementation, classWorld);
     }
     return uint32TypeCache;
   }
@@ -118,7 +120,7 @@
   TypeMask get uint31Type {
     if (uint31TypeCache == null) {
       uint31TypeCache = new TypeMask.nonNullExact(
-          compiler.backend.uint31Implementation, compiler.world);
+          compiler.backend.uint31Implementation, classWorld);
     }
     return uint31TypeCache;
   }
@@ -126,7 +128,7 @@
   TypeMask get positiveIntType {
     if (positiveIntTypeCache == null) {
       positiveIntTypeCache = new TypeMask.nonNullSubclass(
-          compiler.backend.positiveIntImplementation, compiler.world);
+          compiler.backend.positiveIntImplementation, classWorld);
     }
     return positiveIntTypeCache;
   }
@@ -134,7 +136,7 @@
   TypeMask get doubleType {
     if (doubleTypeCache == null) {
       doubleTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.doubleImplementation, compiler.world);
+          compiler.backend.doubleImplementation, classWorld);
     }
     return doubleTypeCache;
   }
@@ -142,7 +144,7 @@
   TypeMask get numType {
     if (numTypeCache == null) {
       numTypeCache = new TypeMask.nonNullSubclass(
-          compiler.backend.numImplementation, compiler.world);
+          compiler.backend.numImplementation, classWorld);
     }
     return numTypeCache;
   }
@@ -150,7 +152,7 @@
   TypeMask get boolType {
     if (boolTypeCache == null) {
       boolTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.boolImplementation, compiler.world);
+          compiler.backend.boolImplementation, classWorld);
     }
     return boolTypeCache;
   }
@@ -166,7 +168,7 @@
   TypeMask get listType {
     if (listTypeCache == null) {
       listTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.listImplementation, compiler.world);
+          compiler.backend.listImplementation, classWorld);
     }
     return listTypeCache;
   }
@@ -174,7 +176,7 @@
   TypeMask get constListType {
     if (constListTypeCache == null) {
       constListTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.constListImplementation, compiler.world);
+          compiler.backend.constListImplementation, classWorld);
     }
     return constListTypeCache;
   }
@@ -182,7 +184,7 @@
   TypeMask get fixedListType {
     if (fixedListTypeCache == null) {
       fixedListTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.fixedListImplementation, compiler.world);
+          compiler.backend.fixedListImplementation, classWorld);
     }
     return fixedListTypeCache;
   }
@@ -190,7 +192,7 @@
   TypeMask get growableListType {
     if (growableListTypeCache == null) {
       growableListTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.growableListImplementation, compiler.world);
+          compiler.backend.growableListImplementation, classWorld);
     }
     return growableListTypeCache;
   }
@@ -214,7 +216,7 @@
   TypeMask get stringType {
     if (stringTypeCache == null) {
       stringTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.stringImplementation, compiler.world);
+          compiler.backend.stringImplementation, classWorld);
     }
     return stringTypeCache;
   }
@@ -222,7 +224,7 @@
   TypeMask get typeType {
     if (typeTypeCache == null) {
       typeTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.typeImplementation, compiler.world);
+          compiler.backend.typeImplementation, classWorld);
     }
     return typeTypeCache;
   }
@@ -230,7 +232,7 @@
   TypeMask get syncStarIterableType {
     if (syncStarIterableTypeCache == null) {
       syncStarIterableTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.syncStarIterableImplementation, compiler.world);
+          compiler.backend.syncStarIterableImplementation, classWorld);
     }
     return syncStarIterableTypeCache;
   }
@@ -238,7 +240,7 @@
   TypeMask get asyncFutureType {
     if (asyncFutureTypeCache == null) {
       asyncFutureTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.asyncFutureImplementation, compiler.world);
+          compiler.backend.asyncFutureImplementation, classWorld);
     }
     return asyncFutureTypeCache;
   }
@@ -246,7 +248,7 @@
   TypeMask get asyncStarStreamType {
     if (asyncStarStreamTypeCache == null) {
       asyncStarStreamTypeCache = new TypeMask.nonNullExact(
-          compiler.backend.asyncStarStreamImplementation, compiler.world);
+          compiler.backend.asyncStarStreamImplementation, classWorld);
     }
     return asyncStarStreamTypeCache;
   }
diff --git a/pkg/compiler/samples/jsonify/jsonify.dart b/pkg/compiler/samples/jsonify/jsonify.dart
deleted file mode 100644
index a84cb04..0000000
--- a/pkg/compiler/samples/jsonify/jsonify.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-import 'dart:mirrors';
-
-import 'package:sdk_library_metadata/libraries.dart' show libraries;
-
-import '../../lib/src/filenames.dart';
-import '../../lib/src/mirrors/analyze.dart' show analyze;
-import '../../lib/src/mirrors/dart2js_mirrors.dart' show BackDoor;
-import '../../lib/src/source_file_provider.dart';
-import '../../lib/src/util/uri_extras.dart';
-
-const DART2JS = '../../lib/src/dart2js.dart';
-const DART2JS_MIRROR = '../../lib/src/mirrors/dart2js_mirror.dart';
-const SDK_ROOT = '../../../../sdk/';
-
-bool isPublicDart2jsLibrary(String name) {
-  return !name.startsWith('_') && libraries[name].isDart2jsLibrary;
-}
-
-var handler;
-RandomAccessFile output;
-Uri outputUri;
-Uri sdkRoot;
-const bool outputJson =
-    const bool.fromEnvironment('outputJson', defaultValue: false);
-
-main(List<String> arguments) {
-  handler = new FormattingDiagnosticHandler()..throwOnError = true;
-
-  outputUri = handler.provider.cwd.resolve(nativeToUriPath(arguments.first));
-  output = new File(arguments.first).openSync(mode: FileMode.WRITE);
-
-  Uri myLocation = handler.provider.cwd.resolveUri(Platform.script);
-
-  Uri packageRoot = handler.provider.cwd.resolve(Platform.packageRoot);
-
-  Uri libraryRoot = myLocation.resolve(SDK_ROOT);
-
-  sdkRoot = libraryRoot.resolve('../');
-
-  // Get the names of public dart2js libraries.
-  Iterable<String> names = libraries.keys.where(isPublicDart2jsLibrary);
-
-  // Turn the names into uris by prepending dart: to them.
-  List<Uri> uris = names.map((String name) => Uri.parse('dart:$name')).toList();
-
-  analyze(uris, libraryRoot, packageRoot, handler.provider, handler)
-      .then(jsonify);
-}
-
-jsonify(MirrorSystem mirrors) {
-  var map = <String, String>{};
-  List<Future> futures = <Future>[];
-
-  Future mapUri(Uri uri) {
-    String filename = relativize(sdkRoot, uri, false);
-    return handler.provider.readStringFromUri(uri).then((contents) {
-      map['sdk:/$filename'] = contents;
-    });
-  }
-
-  mirrors.libraries.forEach((_, LibraryMirror library) {
-    BackDoor.compilationUnitsOf(library).forEach((compilationUnit) {
-      futures.add(mapUri(compilationUnit.uri));
-    });
-  });
-
-  libraries.forEach((name, info) {
-    var patch = info.dart2jsPatchPath;
-    if (patch != null) {
-      futures.add(mapUri(sdkRoot.resolve('sdk/lib/$patch')));
-    }
-  });
-
-  for (String filename in [
-    "dart_client.platform",
-    "dart_server.platform",
-    "dart_shared.platform"
-  ]) {
-    futures.add(mapUri(sdkRoot.resolve('sdk/lib/$filename')));
-  }
-
-  Future.wait(futures).then((_) {
-    if (outputJson) {
-      output.writeStringSync(JSON.encode(map));
-    } else {
-      output.writeStringSync('''
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// DO NOT EDIT.
-// This file is generated by jsonify.dart.
-
-library dart.sdk_sources;
-
-const Map<String, String> SDK_SOURCES = const <String, String>''');
-      output.writeStringSync(JSON.encode(map).replaceAll(r'$', r'\$'));
-      output.writeStringSync(';\n');
-    }
-    output.closeSync();
-  });
-}
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
index f7f8f10..7401ba4 100644
--- a/pkg/dart2js_incremental/lib/caching_compiler.dart
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -87,11 +87,7 @@
       });
     });
   } else {
-    for (final task in compiler.tasks) {
-      if (task.watch != null) {
-        task.watch.reset();
-      }
-    }
+    compiler.tasks.forEach((t) => t.clearMeasurements());
     compiler
         ..userOutputProvider = outputProvider
         ..provider = inputProvider
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index f0c0cdc..6b16d99 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -702,13 +702,7 @@
     _log('Resolving: $userString from $base');
   }
   var baseUri = Uri.parse(base);
-  var result;
-  if (userString.startsWith(_DART_EXT)) {
-    var uri = userString.substring(_DART_EXT.length);
-    result = '$_DART_EXT${baseUri.resolve(uri)}';
-  } else {
-    result = baseUri.resolve(userString).toString();
-  }
+  var result = baseUri.resolve(userString).toString();
   if (_traceLoading) {
     _log('Resolved $userString in $base to $result');
   }
@@ -831,10 +825,6 @@
 }
 
 
-// Handling of dart-ext loading.
-// Dart native extension scheme.
-const _DART_EXT = 'dart-ext:';
-
 // Returns either a file path or a URI starting with http[s]:, as a String.
 String _filePathFromUri(String userUri) {
   var uri = Uri.parse(userUri);
@@ -864,42 +854,19 @@
 }
 
 
-// Embedder Entrypoint:
-// When loading an extension the embedder calls this method to get the
-// different components.
-// Returns the directory part, the filename part, and the name
-// of a native extension URL as a list [directory, filename, name].
-// The directory part is either a file system path or an HTTP(S) URL.
-// The filename part is the extension name, with the platform-dependent
-// prefixes and extensions added.
-_extensionPathFromUri(String userUri) {
+// Embedder Entrypoint.
+_libraryFilePath(String libraryUri) {
   if (!_setupCompleted) {
     _setupHooks();
   }
-  if (!userUri.startsWith(_DART_EXT)) {
-    throw 'Unexpected internal error: Extension URI $userUri missing dart-ext:';
-  }
-  userUri = userUri.substring(_DART_EXT.length);
-
-  if (userUri.contains('\\')) {
-    throw 'Unexpected internal error: Extension URI $userUri contains \\';
-  }
-
-  String name;
-  String path;  // Will end in '/'.
-  int index = userUri.lastIndexOf('/');
+  int index = libraryUri.lastIndexOf('/');
+  var path;
   if (index == -1) {
-    name = userUri;
     path = './';
-  } else if (index == userUri.length - 1) {
-    throw 'Extension name missing in $extensionUri';
   } else {
-    name = userUri.substring(index + 1);
-    path = userUri.substring(0, index + 1);
+    path = libraryUri.substring(0, index + 1);
   }
-  path = _filePathFromUri(path);
-
-  return [path, name];
+  return _filePathFromUri(path);
 }
 
 
diff --git a/runtime/bin/dart_io_entries.txt b/runtime/bin/dart_io_entries.txt
new file mode 100644
index 0000000..4cfcd70
--- /dev/null
+++ b/runtime/bin/dart_io_entries.txt
@@ -0,0 +1,19 @@
+dart:io,::,_makeUint8ListView
+dart:io,::,_makeDatagram
+dart:io,::,_setupHooks
+dart:io,::,_getWatchSignalInternal
+dart:io,CertificateException,CertificateException.
+dart:io,Directory,Directory.
+dart:io,File,File.
+dart:io,FileSystemException,FileSystemException.
+dart:io,HandshakeException,HandshakeException.
+dart:io,Link,Link.
+dart:io,OSError,OSError.
+dart:io,TlsException,TlsException.
+dart:io,X509Certificate,X509Certificate._
+dart:io,_ExternalBuffer,set:data
+dart:io,_Platform,set:_nativeScript
+dart:io,_ProcessStartStatus,set:_errorCode
+dart:io,_ProcessStartStatus,set:_errorMessage
+dart:io,_SecureFilterImpl,get:ENCRYPTED_SIZE
+dart:io,_SecureFilterImpl,get:SIZE
diff --git a/runtime/bin/dart_product_entries.txt b/runtime/bin/dart_product_entries.txt
index d8825d2..fcfda57 100644
--- a/runtime/bin/dart_product_entries.txt
+++ b/runtime/bin/dart_product_entries.txt
@@ -6,22 +6,3 @@
 dart:_builtin,::,_setPackageRoot
 dart:_builtin,::,_loadPackagesMap
 dart:_builtin,::,_loadDataAsync
-dart:io,::,_makeUint8ListView
-dart:io,::,_makeDatagram
-dart:io,::,_setupHooks
-dart:io,::,_getWatchSignalInternal
-dart:io,CertificateException,CertificateException.
-dart:io,Directory,Directory.
-dart:io,File,File.
-dart:io,FileSystemException,FileSystemException.
-dart:io,HandshakeException,HandshakeException.
-dart:io,Link,Link.
-dart:io,OSError,OSError.
-dart:io,TlsException,TlsException.
-dart:io,X509Certificate,X509Certificate._
-dart:io,_ExternalBuffer,set:data
-dart:io,_Platform,set:_nativeScript
-dart:io,_ProcessStartStatus,set:_errorCode
-dart:io,_ProcessStartStatus,set:_errorMessage
-dart:io,_SecureFilterImpl,get:ENCRYPTED_SIZE
-dart:io,_SecureFilterImpl,get:SIZE
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 02f6016..b7f418b 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -180,6 +180,16 @@
 }
 
 
+const char* DartUtils::RemoveScheme(const char* url) {
+  const char* colon = strchr(url, ':');
+  if (colon == NULL) {
+    return url;
+  } else {
+    return colon + 1;
+  }
+}
+
+
 void* DartUtils::MapExecutable(const char* name, intptr_t* len) {
   File* file = File::Open(name, File::kRead);
   if (file == NULL) {
@@ -346,12 +356,12 @@
 }
 
 
-Dart_Handle DartUtils::ExtensionPathFromUri(Dart_Handle extension_uri) {
+Dart_Handle DartUtils::LibraryFilePath(Dart_Handle library_uri) {
   const int kNumArgs = 1;
   Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = extension_uri;
+  dart_args[0] = library_uri;
   return Dart_Invoke(DartUtils::BuiltinLib(),
-                     NewString("_extensionPathFromUri"),
+                     NewString("_libraryFilePath"),
                      kNumArgs,
                      dart_args);
 }
@@ -452,25 +462,18 @@
     if (tag != Dart_kImportTag) {
       return NewError("Dart extensions must use import: '%s'", url_string);
     }
-    Dart_Handle path_parts = DartUtils::ExtensionPathFromUri(url);
-    if (Dart_IsError(path_parts)) {
-      return path_parts;
+    Dart_Handle library_file_path = DartUtils::LibraryFilePath(library_url);
+    const char* lib_path_str = NULL;
+    Dart_StringToCString(library_file_path, &lib_path_str);
+    const char* extension_path = DartUtils::RemoveScheme(url_string);
+    if (strchr(extension_path, '/') != NULL ||
+        (IsWindowsHost() && strchr(extension_path, '\\') != NULL)) {
+      return NewError(
+          "Relative paths for dart extensions are not supported: '%s'",
+          extension_path);
     }
-#if defined(DEBUG)
-    intptr_t path_parts_length;
-    result = Dart_ListLength(path_parts, &path_parts_length);
-    if (Dart_IsError(result)) {
-      return result;
-    }
-    ASSERT(path_parts_length == 2);
-#endif
-    const char* extension_directory = NULL;
-    Dart_StringToCString(Dart_ListGetAt(path_parts, 0), &extension_directory);
-    const char* extension_name = NULL;
-    Dart_StringToCString(Dart_ListGetAt(path_parts, 1), &extension_name);
-
-    return Extensions::LoadExtension(extension_directory,
-                                     extension_name,
+    return Extensions::LoadExtension(lib_path_str,
+                                     extension_path,
                                      library);
   }
 
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index ed63c7c..b416a93 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -115,6 +115,7 @@
   static bool IsDartIOLibURL(const char* url_name);
   static bool IsDartBuiltinLibURL(const char* url_name);
   static bool IsHttpSchemeURL(const char* url_name);
+  static const char* RemoveScheme(const char* url);
   static void* MapExecutable(const char* name, intptr_t* file_len);
   static void* OpenFile(const char* name, bool write);
   static void ReadFile(const uint8_t** data, intptr_t* file_len, void* stream);
@@ -232,8 +233,7 @@
 
  private:
   static Dart_Handle SetWorkingDirectory();
-  static Dart_Handle ExtensionPathFromUri(Dart_Handle extension_uri);
-
+  static Dart_Handle LibraryFilePath(Dart_Handle library_uri);
   static Dart_Handle PrepareBuiltinLibrary(Dart_Handle builtin_lib,
                                            Dart_Handle internal_lib,
                                            bool is_service_isolate,
diff --git a/runtime/lib/array_patch.dart b/runtime/lib/array_patch.dart
index c0ddfee..94f29f1 100644
--- a/runtime/lib/array_patch.dart
+++ b/runtime/lib/array_patch.dart
@@ -36,8 +36,10 @@
     if (elements is EfficientLength) {
       int length = elements.length;
       var list = growable ? new _GrowableList<E>(length) : new _List<E>(length);
-      int i = 0;
-      for (var element in elements) { list[i++] = element; }
+      if (length > 0) {  // Avoid creating iterator unless necessary.
+        int i = 0;
+        for (var element in elements) { list[i++] = element; }
+      }
       return list;
     }
     List<E> list = new _GrowableList<E>(0);
@@ -47,7 +49,7 @@
     if (growable) return list;
     if (list.length == 0) {
       // Avoid getting an immutable list from makeListFixedLength.
-      return new List<E>(0);
+      return new _List<E>(0);
     }
     return makeListFixedLength(list);
   }
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index c4b532f..ad0d89a 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -735,6 +735,14 @@
   }
 
   Iterator<int> get iterator => new _TypedListIterator<int>(this);
+
+  List<int> toList({bool growable: true}) {
+    return new List<int>.from(this, growable: growable);
+  }
+
+  Set<int> toSet() {
+    return new Set<int>.from(this);
+  }
 }
 
 
@@ -762,6 +770,14 @@
   }
 
   Iterator<double> get iterator => new _TypedListIterator<double>(this);
+
+  List<double> toList({bool growable: true}) {
+    return new List<double>.from(this, growable: growable);
+  }
+
+  Set<double> toSet() {
+    return new Set<double>.from(this);
+  }
 }
 
 
@@ -790,6 +806,14 @@
   }
 
   Iterator<Float32x4> get iterator => new _TypedListIterator<Float32x4>(this);
+
+  List<Float32x4> toList({bool growable: true}) {
+    return new List<Float32x4>.from(this, growable: growable);
+  }
+
+  Set<Float32x4> toSet() {
+    return new Set<Float32x4>.from(this);
+  }
 }
 
 
@@ -817,6 +841,14 @@
   }
 
   Iterator<Int32x4> get iterator => new _TypedListIterator<Int32x4>(this);
+
+  List<Int32x4> toList({bool growable: true}) {
+    return new List<Int32x4>.from(this, growable: growable);
+  }
+
+  Set<Int32x4> toSet() {
+    return new Set<Int32x4>.from(this);
+  }
 }
 
 
@@ -845,6 +877,14 @@
   }
 
   Iterator<Float64x2> get iterator => new _TypedListIterator<Float64x2>(this);
+
+  List<Float64x2> toList({bool growable: true}) {
+    return new List<Float64x2>.from(this, growable: growable);
+  }
+
+  Set<Float64x2> toSet() {
+    return new Set<Float64x2>.from(this);
+  }
 }
 
 
@@ -1146,7 +1186,6 @@
     return Uint8List.BYTES_PER_ELEMENT;
   }
 
-
   // Internal utility methods.
 
   Uint8List _createList(int length) {
diff --git a/runtime/observatory/observatory_sources.gypi b/runtime/observatory/observatory_sources.gypi
index a3a2510..9c9baec 100644
--- a/runtime/observatory/observatory_sources.gypi
+++ b/runtime/observatory/observatory_sources.gypi
@@ -14,8 +14,8 @@
     'lib/object_graph.dart',
     'lib/service.dart',
     'lib/service_common.dart',
-    'lib/service_io.dart',
     'lib/service_html.dart',
+    'lib/service_io.dart',
     'lib/src/app/analytics.dart',
     'lib/src/app/application.dart',
     'lib/src/app/location_manager.dart',
@@ -45,6 +45,7 @@
     'lib/src/elements/context_view.html',
     'lib/src/elements/cpu_profile.dart',
     'lib/src/elements/cpu_profile.html',
+    'lib/src/elements/css/shared.css',
     'lib/src/elements/curly_block.dart',
     'lib/src/elements/curly_block.html',
     'lib/src/elements/debugger.dart',
@@ -77,6 +78,9 @@
     'lib/src/elements/heap_snapshot.html',
     'lib/src/elements/icdata_view.dart',
     'lib/src/elements/icdata_view.html',
+    'lib/src/elements/img/chromium_icon.png',
+    'lib/src/elements/img/dart_icon.png',
+    'lib/src/elements/img/isolate_icon.png',
     'lib/src/elements/inbound_reference.dart',
     'lib/src/elements/inbound_reference.html',
     'lib/src/elements/instance_ref.dart',
@@ -145,18 +149,15 @@
     'lib/src/elements/vm_ref.html',
     'lib/src/elements/vm_view.dart',
     'lib/src/elements/vm_view.html',
-    'lib/src/elements/css/shared.css',
-    'lib/src/elements/img/chromium_icon.png',
-    'lib/src/elements/img/dart_icon.png',
-    'lib/src/elements/img/isolate_icon.png',
     'lib/src/service/object.dart',
     'lib/tracer.dart',
     'lib/utils.dart',
+    'web/favicon.ico',
     'web/index.html',
     'web/main.dart',
-    'web/favicon.ico',
     'web/third_party/trace_viewer_full.html',
-    'web/timeline.js',
     'web/timeline.html',
+    'web/timeline.js',
+    'web/timeline_message_handler.js',
   ],
 }
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index bb742ac..3ec12e9 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -2,6 +2,12 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+# Flaky failures
+vm_timeline_flags_test: Pass, RuntimeError # Issue 26483
+gc_test: Pass, RuntimeError # Issue 26490
+pause_on_start_and_exit_test: Pass, RuntimeError # Issue 26470
+pause_on_start_then_step_test: Pass, RuntimeError # Issue 26470
+
 [ ($compiler == none || $compiler == precompiler) && ($runtime == vm || $runtime == dart_precompiled) ]
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
 evaluate_activation_test/scope: RuntimeError # http://dartbug.com/20047
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 0fa725f..8c08954 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -26,8 +26,8 @@
 cc/CorelibIsolateStartup: Skip
 # Negative tests of VerifiedMemory should crash iff in DEBUG mode.
 # TODO(koda): Improve support for negative tests.
-cc/VerifyImplicit_Crash: Crash, Timeout  # Timeout: Issue #24596
-cc/VerifyExplicit_Crash: Crash, Timeout  # Timeout: Issue #24596
+cc/VerifyImplicit_Crash: Crash
+cc/VerifyExplicit_Crash: Crash
 # It can take some time for all the isolates to shutdown in a Debug build.
 dart/spawn_shutdown_test: Pass, Slow  # VM Shutdown test
 
@@ -190,3 +190,29 @@
 cc/Debug_InspectStack_Optimized: Skip
 cc/Debug_InspectStackWithClosure_Optimized: Skip
 
+# Isolate reload code assumes that all static calls have ICData attached to
+# them. However this is not the case on DBC.
+cc/IsolateReload_LiveStack: Skip
+cc/IsolateReload_StaticValuePreserved: Skip
+cc/IsolateReload_TopLevelFieldAdded: Skip
+cc/IsolateReload_ConstructorChanged: Skip
+cc/IsolateReload_ImplicitConstructorChanged: Skip
+cc/IsolateReload_MixinChanged: Skip
+cc/IsolateReload_SuperClassChanged: Skip
+cc/IsolateReload_ComplexInheritanceChange: Skip
+cc/IsolateReload_LibraryImportAdded: Skip
+cc/IsolateReload_LibraryHide: Skip
+cc/IsolateReload_LibraryLookup: Skip
+cc/IsolateReload_LibraryShow: Skip
+cc/IsolateReload_LiveStack: Skip
+cc/IsolateReload_StaticValuePreserved: Skip
+cc/IsolateReload_TopLevelFieldAdded: Skip
+cc/IsolateReload_ConstructorChanged: Skip
+cc/IsolateReload_ImplicitConstructorChanged: Skip
+cc/IsolateReload_MixinChanged: Skip
+cc/IsolateReload_SuperClassChanged: Skip
+cc/IsolateReload_ComplexInheritanceChange: Skip
+cc/IsolateReload_LibraryImportAdded: Skip
+cc/IsolateReload_LibraryHide: Skip
+cc/IsolateReload_LibraryLookup: Skip
+cc/IsolateReload_LibraryShow: Skip
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
index e81ddfc..8b66e49 100644
--- a/runtime/vm/aot_optimizer.cc
+++ b/runtime/vm/aot_optimizer.cc
@@ -2060,15 +2060,13 @@
 
   // Private classes cannot be subclassed by later loaded libs.
   if (!type_class.IsPrivate()) {
-    if (FLAG_use_cha_deopt || isolate()->all_classes_finalized()) {
+    if (isolate()->all_classes_finalized()) {
       if (FLAG_trace_cha) {
         THR_Print("  **(CHA) Typecheck as class equality since no "
             "subclasses: %s\n",
             type_class.ToCString());
       }
-      if (FLAG_use_cha_deopt) {
-        thread()->cha()->AddToLeafClasses(type_class);
-      }
+      ASSERT(!FLAG_use_cha_deopt);
     } else {
       return false;
     }
@@ -2456,8 +2454,10 @@
             instr->function_name(),
             args_desc));
     if (!function.IsNull()) {
+      intptr_t subclasses = 0;
       if (!thread()->cha()->HasOverride(receiver_class,
-                                        instr->function_name())) {
+                                        instr->function_name(),
+                                        &subclasses)) {
         if (FLAG_trace_cha) {
           THR_Print("  **(CHA) Instance call needs no check, "
               "no overrides of '%s' '%s'\n",
diff --git a/runtime/vm/cha.cc b/runtime/vm/cha.cc
index 57214bb..6a0a16d 100644
--- a/runtime/vm/cha.cc
+++ b/runtime/vm/cha.cc
@@ -12,13 +12,26 @@
 
 namespace dart {
 
-void CHA::AddToLeafClasses(const Class& cls) {
-  for (intptr_t i = 0; i < leaf_classes_.length(); i++) {
-    if (leaf_classes_[i]->raw() == cls.raw()) {
+void CHA::AddToGuardedClasses(const Class& cls, intptr_t subclass_count) {
+  for (intptr_t i = 0; i < guarded_classes_.length(); i++) {
+    if (guarded_classes_[i].cls->raw() == cls.raw()) {
       return;
     }
   }
-  leaf_classes_.Add(&Class::ZoneHandle(thread_->zone(), cls.raw()));
+  GuardedClassInfo info = {
+    &Class::ZoneHandle(thread_->zone(), cls.raw()),
+    subclass_count
+  };
+  guarded_classes_.Add(info);
+  return;
+}
+
+
+bool CHA::IsGuardedClass(intptr_t cid) const {
+  for (intptr_t i = 0; i < guarded_classes_.length(); ++i) {
+    if (guarded_classes_[i].cls->id() == cid) return true;
+  }
+  return false;
 }
 
 
@@ -86,7 +99,41 @@
 }
 
 
-bool CHA::HasOverride(const Class& cls, const String& function_name) {
+static intptr_t CountFinalizedSubclasses(Thread* thread, const Class& cls) {
+  intptr_t count = 0;
+  const GrowableObjectArray& cls_direct_subclasses =
+      GrowableObjectArray::Handle(thread->zone(), cls.direct_subclasses());
+  if (cls_direct_subclasses.IsNull()) return count;
+  Class& direct_subclass = Class::Handle(thread->zone());
+  for (intptr_t i = 0; i < cls_direct_subclasses.Length(); i++) {
+    direct_subclass ^= cls_direct_subclasses.At(i);
+    // Unfinalized classes are treated as non-existent for CHA purposes,
+    // as that means that no instance of that class exists at runtime.
+    if (!direct_subclass.is_finalized()) {
+      continue;
+    }
+
+    count += 1 + CountFinalizedSubclasses(thread, direct_subclass);
+  }
+  return count;
+}
+
+
+bool CHA::IsConsistentWithCurrentHierarchy() const {
+  for (intptr_t i = 0; i < guarded_classes_.length(); i++) {
+    const intptr_t subclass_count =
+        CountFinalizedSubclasses(thread_, *guarded_classes_[i].cls);
+    if (guarded_classes_[i].subclass_count != subclass_count) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+bool CHA::HasOverride(const Class& cls,
+                      const String& function_name,
+                      intptr_t* subclasses_count) {
   // Can't track dependencies for classes on the VM heap since those are
   // read-only.
   // TODO(fschneider): Enable tracking of CHA dependent code for VM heap
@@ -109,16 +156,31 @@
     direct_subclass ^= cls_direct_subclasses.At(i);
     // Unfinalized classes are treated as non-existent for CHA purposes,
     // as that means that no instance of that class exists at runtime.
-    if (direct_subclass.is_finalized() &&
-        (direct_subclass.LookupDynamicFunction(function_name) !=
-         Function::null())) {
+    if (!direct_subclass.is_finalized()) {
+      continue;
+    }
+
+    if (direct_subclass.LookupDynamicFunction(function_name) !=
+            Function::null()) {
       return true;
     }
-    if (HasOverride(direct_subclass, function_name)) {
+
+    if (HasOverride(direct_subclass, function_name, subclasses_count)) {
       return true;
     }
+
+    (*subclasses_count)++;
   }
+
   return false;
 }
 
+
+void CHA::RegisterDependencies(const Code& code) const {
+  for (intptr_t i = 0; i < guarded_classes_.length(); ++i) {
+    guarded_classes_[i].cls->RegisterCHACode(code);
+  }
+}
+
+
 }  // namespace dart
diff --git a/runtime/vm/cha.h b/runtime/vm/cha.h
index a1ea229..7aa7774 100644
--- a/runtime/vm/cha.h
+++ b/runtime/vm/cha.h
@@ -21,7 +21,7 @@
   explicit CHA(Thread* thread)
       : StackResource(thread),
         thread_(thread),
-        leaf_classes_(thread->zone(), 1),
+        guarded_classes_(thread->zone(), 1),
         previous_(thread->cha()) {
     thread->set_cha(this);
   }
@@ -44,20 +44,42 @@
   static bool IsImplemented(const Class& cls);
 
   // Returns true if any subclass of 'cls' contains the function.
-  bool HasOverride(const Class& cls, const String& function_name);
+  // If no override was found subclass_count would contain total count of
+  // finalized subclasses that CHA looked at.
+  // This count will be used to validate CHA decision before installing
+  // optimized code compiled in background.
+  bool HasOverride(const Class& cls,
+                   const String& function_name,
+                   intptr_t* subclass_count);
 
-  const GrowableArray<Class*>& leaf_classes() const {
-    return leaf_classes_;
-  }
-
-  // Adds class 'cls' to the list of guarded leaf classes, deoptimization occurs
-  // if any of those leaf classes gets subclassed through later loaded/finalized
+  // Adds class 'cls' to the list of guarded classes, deoptimization occurs
+  // if any of those classes gets subclassed through later loaded/finalized
   // libraries. Only classes that were used for CHA optimizations are added.
-  void AddToLeafClasses(const Class& cls);
+  void AddToGuardedClasses(const Class& cls, intptr_t subclass_count);
+
+  // When compiling in background we need to check that no new finalized
+  // subclasses were added to guarded classes.
+  bool IsConsistentWithCurrentHierarchy() const;
+
+  void RegisterDependencies(const Code& code) const;
+
+  // Used for testing.
+  bool IsGuardedClass(intptr_t cid) const;
 
  private:
   Thread* thread_;
-  GrowableArray<Class*> leaf_classes_;
+
+  struct GuardedClassInfo {
+    Class* cls;
+
+    // Number of finalized subclasses that this class had at the moment
+    // when CHA made the first decision based on this class.
+    // Used to validate correctness of background compilation: if
+    // any subclasses were added we will discard compiled code.
+    intptr_t subclass_count;
+  };
+
+  GrowableArray<GuardedClassInfo> guarded_classes_;
   CHA* previous_;
 };
 
diff --git a/runtime/vm/cha_test.cc b/runtime/vm/cha_test.cc
index 7316da0..107c233 100644
--- a/runtime/vm/cha_test.cc
+++ b/runtime/vm/cha_test.cc
@@ -11,13 +11,6 @@
 
 namespace dart {
 
-static bool ContainsCid(const GrowableArray<Class*>& classes, intptr_t cid) {
-  for (intptr_t i = 0; i < classes.length(); ++i) {
-    if (classes[i]->id() == cid) return true;
-  }
-  return false;
-}
-
 
 TEST_CASE(ClassHierarchyAnalysis) {
   const char* kScriptChars =
@@ -89,14 +82,14 @@
   EXPECT(CHA::HasSubclasses(class_a));
   EXPECT(CHA::HasSubclasses(class_b));
   EXPECT(!CHA::HasSubclasses(class_c));
-  cha.AddToLeafClasses(class_c);
+  cha.AddToGuardedClasses(class_c, /*subclass_count=*/0);
   EXPECT(!CHA::HasSubclasses(class_d));
-  cha.AddToLeafClasses(class_d);
+  cha.AddToGuardedClasses(class_d, /*subclass_count=*/0);
 
-  EXPECT(!ContainsCid(cha.leaf_classes(), class_a.id()));
-  EXPECT(!ContainsCid(cha.leaf_classes(), class_b.id()));
-  EXPECT(ContainsCid(cha.leaf_classes(), class_c.id()));
-  EXPECT(ContainsCid(cha.leaf_classes(), class_d.id()));
+  EXPECT(!cha.IsGuardedClass(class_a.id()));
+  EXPECT(!cha.IsGuardedClass(class_b.id()));
+  EXPECT(cha.IsGuardedClass(class_c.id()));
+  EXPECT(cha.IsGuardedClass(class_d.id()));
 
   const Class& closure_class =
       Class::Handle(Isolate::Current()->object_store()->closure_class());
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 3a8cf41..5d4e3cb 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1604,7 +1604,9 @@
   // Patch call site (lazy deoptimization is quite rare, patching it twice
   // is not a performance issue).
   uword lazy_deopt_jump = optimized_code.GetLazyDeoptPc();
+#if !defined(TARGET_ARCH_DBC)
   ASSERT(lazy_deopt_jump != 0);
+#endif
   const Instructions& instrs =
       Instructions::Handle(zone, optimized_code.instructions());
   {
@@ -1637,14 +1639,22 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
+#if !defined(TARGET_ARCH_DBC)
+static const intptr_t kNumberOfSavedCpuRegisters = kNumberOfCpuRegisters;
+static const intptr_t kNumberOfSavedFpuRegisters = kNumberOfFpuRegisters;
+#else
+static const intptr_t kNumberOfSavedCpuRegisters = 0;
+static const intptr_t kNumberOfSavedFpuRegisters = 0;
+#endif
+
 static void CopySavedRegisters(uword saved_registers_address,
                                fpu_register_t** fpu_registers,
                                intptr_t** cpu_registers) {
   ASSERT(sizeof(fpu_register_t) == kFpuRegisterSize);
   fpu_register_t* fpu_registers_copy =
-      new fpu_register_t[kNumberOfFpuRegisters];
+      new fpu_register_t[kNumberOfSavedFpuRegisters];
   ASSERT(fpu_registers_copy != NULL);
-  for (intptr_t i = 0; i < kNumberOfFpuRegisters; i++) {
+  for (intptr_t i = 0; i < kNumberOfSavedFpuRegisters; i++) {
     fpu_registers_copy[i] =
         *reinterpret_cast<fpu_register_t*>(saved_registers_address);
     saved_registers_address += kFpuRegisterSize;
@@ -1652,9 +1662,9 @@
   *fpu_registers = fpu_registers_copy;
 
   ASSERT(sizeof(intptr_t) == kWordSize);
-  intptr_t* cpu_registers_copy = new intptr_t[kNumberOfCpuRegisters];
+  intptr_t* cpu_registers_copy = new intptr_t[kNumberOfSavedCpuRegisters];
   ASSERT(cpu_registers_copy != NULL);
-  for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) {
+  for (intptr_t i = 0; i < kNumberOfSavedCpuRegisters; i++) {
     cpu_registers_copy[i] =
         *reinterpret_cast<intptr_t*>(saved_registers_address);
     saved_registers_address += kWordSize;
@@ -1681,12 +1691,13 @@
 
   // All registers have been saved below last-fp as if they were locals.
   const uword last_fp = saved_registers_address
-                        + (kNumberOfCpuRegisters * kWordSize)
-                        + (kNumberOfFpuRegisters * kFpuRegisterSize)
+                        + (kNumberOfSavedCpuRegisters * kWordSize)
+                        + (kNumberOfSavedFpuRegisters * kFpuRegisterSize)
                         - ((kFirstLocalSlotFromFp + 1) * kWordSize);
 
   // Get optimized code and frame that need to be deoptimized.
   DartFrameIterator iterator(last_fp);
+
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
   const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode());
@@ -1760,11 +1771,7 @@
   }
 #endif
 
-  // TODO(turnidge): Compute the start of the dest frame in the
-  // DeoptContext instead of passing it in here.
-  intptr_t* start = reinterpret_cast<intptr_t*>(
-      caller_frame->sp() - (kDartFrameFixedSize * kWordSize));
-  deopt_context->set_dest_frame(start);
+  deopt_context->set_dest_frame(caller_frame);
   deopt_context->FillDestFrame();
 #else
   UNREACHABLE();
diff --git a/runtime/vm/code_patcher_dbc.cc b/runtime/vm/code_patcher_dbc.cc
index e0010ab..6a273ac 100644
--- a/runtime/vm/code_patcher_dbc.cc
+++ b/runtime/vm/code_patcher_dbc.cc
@@ -31,8 +31,7 @@
 
 
 void CodePatcher::InsertDeoptimizationCallAt(uword start, uword target) {
-  // The inserted call should not overlap the lazy deopt jump code.
-  ASSERT(start + CallPattern::DeoptCallPatternLengthInBytes() <= target);
+  ASSERT(target == 0);  // Always 0 on DBC.
   CallPattern::InsertDeoptCallAt(start, target);
 }
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 7685b3c..a15dca3 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -448,12 +448,8 @@
         optimized_(optimized),
         osr_id_(osr_id),
         thread_(Thread::Current()),
-        field_invalidation_gen_at_start_(isolate()->field_invalidation_gen()),
         loading_invalidation_gen_at_start_(
             isolate()->loading_invalidation_gen()) {
-    if (Compiler::IsBackgroundCompilation()) {
-      isolate()->ClearDisablingFieldList();
-    }
   }
 
   bool Compile(CompilationPipeline* pipeline);
@@ -464,9 +460,6 @@
   intptr_t osr_id() const { return osr_id_; }
   Thread* thread() const { return thread_; }
   Isolate* isolate() const { return thread_->isolate(); }
-  intptr_t field_invalidation_gen_at_start() const {
-    return field_invalidation_gen_at_start_;
-  }
   intptr_t loading_invalidation_gen_at_start() const {
     return loading_invalidation_gen_at_start_;
   }
@@ -479,35 +472,12 @@
   const bool optimized_;
   const intptr_t osr_id_;
   Thread* const thread_;
-  const intptr_t field_invalidation_gen_at_start_;
   const intptr_t loading_invalidation_gen_at_start_;
 
   DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper);
 };
 
 
-// Returns true if any of disabling fields is inside the guarded_fields.
-// The number of guarded_fields and disabling-fields is expected to be small
-// (less than 5).
-static bool CheckDisablingFields(
-    Thread* thread,
-    const ZoneGrowableArray<const Field*>& guarded_fields) {
-  Isolate* isolate = thread->isolate();
-  Zone* zone = thread->zone();
-  Field& field = Field::Handle(zone, isolate->GetDisablingField());
-  while (!field.IsNull()) {
-    for (intptr_t i = 0; i < guarded_fields.length(); i++) {
-      if (guarded_fields.At(i)->raw() == field.raw()) {
-        return true;
-      }
-    }
-    // Get next field.
-    field = isolate->GetDisablingField();
-  }
-  return false;
-}
-
-
 void CompileParsedFunctionHelper::FinalizeCompilation(
     Assembler* assembler,
     FlowGraphCompiler* graph_compiler,
@@ -593,17 +563,21 @@
           FLAG_trace_compiler || FLAG_trace_optimizing_compiler;
       bool code_is_valid = true;
       if (!flow_graph->parsed_function().guarded_fields()->is_empty()) {
-        if (field_invalidation_gen_at_start() !=
-            isolate()->field_invalidation_gen()) {
-          const ZoneGrowableArray<const Field*>& guarded_fields =
-              *flow_graph->parsed_function().guarded_fields();
-          bool field_conflict = CheckDisablingFields(thread(), guarded_fields);
-          if (field_conflict) {
+        const ZoneGrowableArray<const Field*>& guarded_fields =
+            *flow_graph->parsed_function().guarded_fields();
+        Field& original = Field::Handle();
+        for (intptr_t i = 0; i < guarded_fields.length(); i++) {
+          const Field& field = *guarded_fields[i];
+          ASSERT(!field.IsOriginal());
+          original = field.Original();
+          if (!field.IsConsistentWith(original)) {
             code_is_valid = false;
             if (trace_compiler) {
-              THR_Print("--> FAIL: Field invalidation.");
+              THR_Print("--> FAIL: Field %s guarded state changed.",
+                        field.ToCString());
             }
-         }
+            break;
+          }
         }
       }
       if (loading_invalidation_gen_at_start() !=
@@ -613,6 +587,13 @@
           THR_Print("--> FAIL: Loading invalidation.");
         }
       }
+      if (!thread()->cha()->IsConsistentWithCurrentHierarchy()) {
+        code_is_valid = false;
+        if (trace_compiler) {
+          THR_Print("--> FAIL: Class hierarchy has new subclasses.");
+        }
+      }
+
       // Setting breakpoints at runtime could make a function non-optimizable.
       if (code_is_valid && Compiler::CanOptimizeFunction(thread(), function)) {
         const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId;
@@ -632,19 +613,17 @@
     }
 
     if (code_was_installed) {
-      // Register code with the classes it depends on because of CHA and
-      // fields it depends on because of store guards, unless we cannot
-      // deopt.
-      for (intptr_t i = 0;
-           i < thread()->cha()->leaf_classes().length();
-           ++i) {
-        thread()->cha()->leaf_classes()[i]->RegisterCHACode(code);
-      }
+      // The generated code was compiled under certain assumptions about
+      // class hierarchy and field types. Register these dependencies
+      // to ensure that the code will be deoptimized if they are violated.
+      thread()->cha()->RegisterDependencies(code);
+
       const ZoneGrowableArray<const Field*>& guarded_fields =
           *flow_graph->parsed_function().guarded_fields();
+      Field& field = Field::Handle();
       for (intptr_t i = 0; i < guarded_fields.length(); i++) {
-        const Field* field = guarded_fields[i];
-        field->RegisterDependentCode(code);
+        field = guarded_fields[i]->Original();
+        field.RegisterDependentCode(code);
       }
     }
   } else {  // not optimized.
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 5639af5..f544a77 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -283,7 +283,7 @@
 const Register ARGS_DESC_REG = R4;
 const Register CODE_REG = R6;
 const Register THR = R10;  // Caches current thread in generated code.
-const Register CALLEE_SAVED_TEMP = R6;
+const Register CALLEE_SAVED_TEMP = R8;
 
 // R15 encodes APSR in the vmrs instruction.
 const Register APSR = R15;
diff --git a/runtime/vm/constants_dbc.h b/runtime/vm/constants_dbc.h
index 54fc66b..657ffb0 100644
--- a/runtime/vm/constants_dbc.h
+++ b/runtime/vm/constants_dbc.h
@@ -119,6 +119,12 @@
 //    Note: rX is signed so it can be used to address parameters which are
 //    at negative indices with respect to FP.
 //
+//  - Swap rA, rX
+//
+//    FP[rA], FP[rX] <- FP[rX], FP[rA]
+//    Note: rX is signed so it can be used to address parameters which are
+//    at negative indices with respect to FP.
+//
 //  - Push rX
 //
 //    Push FP[rX] to the stack.
@@ -137,10 +143,10 @@
 //    Invoke function in SP[0] with arguments SP[-(1+ArgC)], ..., SP[-1] and
 //    argument descriptor PP[D].
 //
-//  - InstanceCall ArgC, D; InstanceCall2 ArgC, D; InstanceCall3 ArgC, D
+//  - InstanceCall<N> ArgC, D; InstanceCall<N>Opt ArgC, D
 //
-//    Lookup and invoke method using ICData in PP[D] with arguments
-//    SP[-(1+ArgC)], ..., SP[-1].
+//    Lookup and invoke method with N checked arguments using ICData in PP[D]
+//    with arguments SP[-(1+ArgC)], ..., SP[-1].
 //
 //  - NativeCall, NativeBootstrapCall
 //
@@ -166,7 +172,10 @@
 //
 //    Takes static field from TOS and ensures that it is initialized.
 //
-//  - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS
+//  - If<Cond>(Num)TOS
+//    If<Cond>(Num) rA, rD
+//
+//    Cond is either NeStrict or EqStrict
 //
 //    Skips the next instruction unless the given condition holds. 'Num'
 //    variants perform number check while non-Num variants just compare
@@ -194,6 +203,11 @@
 //    Store SP[0] into array SP[-2] at index SP[-1]. No typechecking is done.
 //    SP[-2] is assumed to be a RawArray, SP[-1] to be a smi.
 //
+//  - StoreIndexed rA, rB, rC
+//
+//    Store rC into array rA at index rB. No typechecking is done.
+//    rA is assumed to be a RawArray, rB to be a smi.
+//
 //  - StoreField rA, B, rC
 //
 //    Store value FP[rC] into object FP[rA] at offset (in words) B.
@@ -214,6 +228,10 @@
 //
 //    SP[0] = !SP[0]
 //
+//  - BooleanNegate rA, rD
+//
+//    FP[rA] = !FP[rD]
+//
 //  - Throw A
 //
 //    Throw (Rethrow if A != 0) exception. Exception object and stack object
@@ -226,7 +244,7 @@
 //        B - number of local slots to reserve;
 //        rC - specifies context register to initialize with empty context.
 //
-//  - EntryOpt A, B, C
+//  - EntryOptional A, B, C
 //
 //    Function prologue for the function with optional or named arguments:
 //        A - expected number of positional arguments;
@@ -235,19 +253,36 @@
 //
 //    Only one of B and C can be not 0.
 //
-//    If B is not 0 then EntryOpt bytecode is followed by B LoadConstant
+//    If B is not 0 then EntryOptional bytecode is followed by B LoadConstant
 //    bytecodes specifying default values for optional arguments.
 //
-//    If C is not 0 then EntryOpt is followed by 2 * B LoadConstant bytecodes.
+//    If C is not 0 then EntryOptional is followed by 2 * B LoadConstant
+//    bytecodes.
 //    Bytecode at 2 * i specifies name of the i-th named argument and at
 //    2 * i + 1 default value. rA part of the LoadConstant bytecode specifies
 //    the location of the parameter on the stack. Here named arguments are
 //    sorted alphabetically to enable linear matching similar to how function
 //    prologues are implemented on other architectures.
 //
-//    Note: Unlike Entry bytecode EntryOpt does not setup the frame for
+//    Note: Unlike Entry bytecode EntryOptional does not setup the frame for
 //    local variables this is done by a separate bytecode Frame.
 //
+//  - EntryOptimized A, D
+//
+//    Function prologue for optimized functions with no optional or named
+//    arguments.
+//        A - expected number of positional arguments;
+//        B - number of local slots to reserve for registers;
+//
+//    Note: reserved slots are not initialized because optimized code
+//    has stack maps attached to call sites.
+//
+//  - HotCheck A, D
+//
+//    Increment current function's usage counter by A and check if it
+//    exceeds D. If it does trigger (re)optimization of the current
+//    function.
+//
 //  - Frame D
 //
 //    Reserve and initialize with null space for D local variables.
@@ -302,14 +337,29 @@
 //    match patched call's argument count so that Return instructions continue
 //    to work.
 //
+// TODO(vegorov) the way we replace calls with DebugBreak does not work
+//               with our smi fast paths because DebugBreak is simply skipped.
+//
 //  - LoadClassIdTOS, LoadClassId rA, D
 //
 //    LoadClassIdTOS loads the class id from the object at SP[0] and stores it
 //    to SP[0]. LoadClassId loads the class id from FP[rA] and stores it to
 //    FP[D].
 //
-// TODO(vegorov) the way we replace calls with DebugBreak does not work
-//               with our smi fast paths because DebugBreak is simply skipped.
+//  - Deopt ArgC, D
+//
+//    If D != 0 then trigger eager deoptimization with deopt id (D - 1).
+//    If D == 0 then trigger lazy deoptimization.
+//
+//    The meaning of operand ArgC (encoded as A operand) matches that of an
+//    ArgC operand in call instructions. This is needed because we could
+//    potentially patch calls instructions with a lazy deopt and we need to
+//    ensure that any Return/ReturnTOS instructions
+//    returning from the patched calls will continue to function,
+//    e.g. in bytecode sequences like
+//
+//    InstanceCall ... <- lazy deopt inside first call
+//    InstanceCall ... <- patches seconds call with Deopt
 //
 // BYTECODE LIST FORMAT
 //
@@ -336,14 +386,16 @@
 #define BYTECODES_LIST(V)                              \
   V(Trap,                            0, ___, ___, ___) \
   V(Compile,                         0, ___, ___, ___) \
+  V(HotCheck,                      A_D, num, num, ___) \
   V(Intrinsic,                       A, num, ___, ___) \
   V(Drop1,                           0, ___, ___, ___) \
   V(DropR,                           A, num, ___, ___) \
   V(Drop,                            A, num, ___, ___) \
   V(Jump,                            T, tgt, ___, ___) \
-  V(Return,                          A, num, ___, ___) \
+  V(Return,                          A, reg, ___, ___) \
   V(ReturnTOS,                       0, ___, ___, ___) \
   V(Move,                          A_X, reg, xeg, ___) \
+  V(Swap,                          A_X, reg, xeg, ___) \
   V(Push,                            X, xeg, ___, ___) \
   V(LoadConstant,                  A_D, reg, lit, ___) \
   V(LoadClassId,                   A_D, reg, reg, ___) \
@@ -352,9 +404,10 @@
   V(StoreLocal,                      X, xeg, ___, ___) \
   V(PopLocal,                        X, xeg, ___, ___) \
   V(StaticCall,                    A_D, num, num, ___) \
-  V(InstanceCall,                  A_D, num, num, ___) \
+  V(InstanceCall1,                  A_D, num, num, ___) \
   V(InstanceCall2,                 A_D, num, num, ___) \
-  V(InstanceCall3,                 A_D, num, num, ___) \
+  V(InstanceCall1Opt,              A_D, num, num, ___) \
+  V(InstanceCall2Opt,              A_D, num, num, ___) \
   V(NativeCall,                      0, ___, ___, ___) \
   V(NativeBootstrapCall,             0, ___, ___, ___) \
   V(AddTOS,                          0, ___, ___, ___) \
@@ -372,18 +425,25 @@
   V(IfEqStrictTOS,                   0, ___, ___, ___) \
   V(IfNeStrictNumTOS,                0, ___, ___, ___) \
   V(IfEqStrictNumTOS,                0, ___, ___, ___) \
+  V(IfNeStrict,                    A_D, reg, reg, ___) \
+  V(IfEqStrict,                    A_D, reg, reg, ___) \
+  V(IfNeStrictNum,                 A_D, reg, reg, ___) \
+  V(IfEqStrictNum,                 A_D, reg, reg, ___) \
   V(CreateArrayTOS,                  0, ___, ___, ___) \
   V(Allocate,                        D, lit, ___, ___) \
   V(AllocateT,                       0, ___, ___, ___) \
   V(StoreIndexedTOS,                 0, ___, ___, ___) \
-  V(StoreField,                  A_B_C, reg, reg, reg) \
+  V(StoreIndexed,                A_B_C, reg, reg, reg) \
+  V(StoreField,                  A_B_C, reg, num, reg) \
   V(StoreFieldTOS,                   D, num, ___, ___) \
-  V(LoadField,                   A_B_C, reg, reg, reg) \
+  V(LoadField,                   A_B_C, reg, reg, num) \
   V(LoadFieldTOS,                    D, num, ___, ___) \
   V(BooleanNegateTOS,                0, ___, ___, ___) \
+  V(BooleanNegate,                 A_D, reg, reg, ___) \
   V(Throw,                           A, num, ___, ___) \
   V(Entry,                       A_B_C, num, num, num) \
-  V(EntryOpt,                    A_B_C, num, num, num) \
+  V(EntryOptional,               A_B_C, num, num, num) \
+  V(EntryOptimized,                A_D, num, num, ___) \
   V(Frame,                           D, num, ___, ___) \
   V(SetFrame,                        A, num, ___, num) \
   V(AllocateContext,                 D, num, ___, ___) \
@@ -396,6 +456,7 @@
   V(CheckStack,                      0, ___, ___, ___) \
   V(DebugStep,                       0, ___, ___, ___) \
   V(DebugBreak,                      A, num, ___, ___) \
+  V(Deopt,                         A_D, num, num, ___) \
 
 typedef uint32_t Instr;
 
@@ -457,15 +518,23 @@
     return static_cast<Opcode>(bc & 0xFF);
   }
 
+  DART_FORCE_INLINE static bool IsCallOpcode(Instr instr) {
+    switch (DecodeOpcode(instr)) {
+      case Bytecode::kStaticCall:
+      case Bytecode::kInstanceCall1:
+      case Bytecode::kInstanceCall2:
+      case Bytecode::kInstanceCall1Opt:
+      case Bytecode::kInstanceCall2Opt:
+      case Bytecode::kDebugBreak:
+        return true;
+
+      default:
+        return false;
+    }
+  }
+
   DART_FORCE_INLINE static uint8_t DecodeArgc(Instr call) {
-#if defined(DEBUG)
-    const Opcode op = DecodeOpcode(call);
-    ASSERT((op == Bytecode::kStaticCall) ||
-           (op == Bytecode::kInstanceCall) ||
-           (op == Bytecode::kInstanceCall2) ||
-           (op == Bytecode::kInstanceCall3) ||
-           (op == Bytecode::kDebugBreak));
-#endif
+    ASSERT(IsCallOpcode(call));
     return (call >> 8) & 0xFF;
   }
 
@@ -484,7 +553,7 @@
 const int16_t FPREG = 0;
 const int16_t SPREG = 1;
 const intptr_t kNumberOfCpuRegisters = 20;
-const intptr_t kDartAvailableCpuRegs = 0;
+const intptr_t kDartAvailableCpuRegs = -1;
 const intptr_t kNoRegister = -1;
 const intptr_t kReservedCpuRegisters = 0;
 const intptr_t ARGS_DESC_REG = 0;
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 0cfee29..72c4710 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -93,7 +93,7 @@
 const Register ARGS_DESC_REG = R10;  // Arguments descriptor register.
 const Register CODE_REG = R12;
 const Register THR = R14;  // Caches current thread in generated code.
-const Register CALLEE_SAVED_TEMP = R13;
+const Register CALLEE_SAVED_TEMP = RBX;
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index f6e8bb7..fcc4e79 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -8957,6 +8957,41 @@
 }
 
 
+TEST_CASE(ExternalStringLoadElimination) {
+  const bool saved_flag = FLAG_support_externalizable_strings;
+  FLAG_support_externalizable_strings = true;
+
+  const char* kScriptChars =
+      "class A {\n"
+      "  static change_str(String s) native 'A_change_str';\n"
+      "}\n"
+      "double_char0(str) {\n"
+      "  return str.codeUnitAt(0) + str.codeUnitAt(0);\n"
+      "}\n"
+      "main() {\n"
+      "  var externalA = 'AA' + 'AA';\n"
+      "  A.change_str(externalA);\n"
+      "  for (var i = 0; i < 10000; i++) double_char0(externalA);\n"
+      "  var result = double_char0(externalA);\n"
+      "  return result == 130;\n"
+      "}\n";
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars,
+                               &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib,
+                                   NewString("main"),
+                                   0,
+                                   NULL);
+  EXPECT_VALID(result);
+  bool value = false;
+  result = Dart_BooleanValue(result, &value);
+  EXPECT_VALID(result);
+  EXPECT(value);
+
+  FLAG_support_externalizable_strings = saved_flag;
+}
+
+
 TEST_CASE(ExternalStringGuardFieldDeoptimize) {
   const bool saved_flag = FLAG_support_externalizable_strings;
   FLAG_support_externalizable_strings = true;
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 1d89239..1839f7f 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -66,14 +66,19 @@
   // optimized function contains FP, PP (ARM and MIPS only), PC-marker and
   // return-address. This section is copied as well, so that its contained
   // values can be updated before returning to the deoptimized function.
+  // Note: on DBC stack grows upwards unlike on all other architectures.
   source_frame_size_ =
       + kDartFrameFixedSize  // For saved values below sp.
+#if !defined(TARGET_ARCH_DBC)
       + ((frame->fp() - frame->sp()) / kWordSize)  // For frame size incl. sp.
+#else
+      + ((frame->sp() - frame->fp()) / kWordSize)  // For frame size incl. sp.
+#endif  // !defined(TARGET_ARCH_DBC)
       + 1  // For fp.
       + kParamEndSlotFromFp  // For saved values above fp.
       + num_args_;  // For arguments.
-  source_frame_ = reinterpret_cast<intptr_t*>(
-      frame->sp() - (kDartFrameFixedSize * kWordSize));
+
+  source_frame_ = FrameBase(frame);
 
   if (dest_options == kDestIsOriginalFrame) {
     // Work from a copy of the source frame.
@@ -182,29 +187,46 @@
 
 
 intptr_t DeoptContext::DestStackAdjustment() const {
-  return (dest_frame_size_
-          - kDartFrameFixedSize
-          - num_args_
-          - kParamEndSlotFromFp
-          - 1);  // For fp.
+  return dest_frame_size_
+         - kDartFrameFixedSize
+         - num_args_
+#if !defined(TARGET_ARCH_DBC)
+         - 1  // For fp.
+#endif
+         - kParamEndSlotFromFp;
 }
 
 
 intptr_t DeoptContext::GetSourceFp() const {
+#if !defined(TARGET_ARCH_DBC)
   return source_frame_[source_frame_size_ - 1 - num_args_ -
                        kParamEndSlotFromFp];
+#else
+  return source_frame_[num_args_ + kDartFrameFixedSize +
+      kSavedCallerFpSlotFromFp];
+#endif
 }
 
 
 intptr_t DeoptContext::GetSourcePp() const {
+#if !defined(TARGET_ARCH_DBC)
   return source_frame_[source_frame_size_ - 1 - num_args_ -
                        kParamEndSlotFromFp +
                        StackFrame::SavedCallerPpSlotFromFp()];
+#else
+  UNREACHABLE();
+  return 0;
+#endif
 }
 
 
 intptr_t DeoptContext::GetSourcePc() const {
+#if !defined(TARGET_ARCH_DBC)
   return source_frame_[source_frame_size_ - num_args_ + kSavedPcSlotFromSp];
+#else
+  return source_frame_[num_args_ + kDartFrameFixedSize +
+      kSavedCallerPcSlotFromFp];
+#endif
 }
 
 
@@ -305,12 +327,12 @@
   }
 
   if (FLAG_trace_deoptimization_verbose) {
-    intptr_t* start = dest_frame_;
     for (intptr_t i = 0; i < frame_size; i++) {
-      OS::PrintErr("*%" Pd ". [0x%" Px "] 0x%" Px " [%s]\n",
+      intptr_t* to_addr = GetDestFrameAddressAt(i);
+      OS::PrintErr("*%" Pd ". [%p] 0x%" Px " [%s]\n",
                    i,
-                   reinterpret_cast<uword>(&start[i]),
-                   start[i],
+                   to_addr,
+                   *to_addr,
                    deopt_instructions[i + (len - frame_size)]->ToCString());
     }
   }
@@ -660,12 +682,9 @@
     Function& function = Function::Handle(deopt_context->zone());
     function ^= deopt_context->ObjectAt(object_table_index_);
     if (function.IsNull()) {
-      // There are no deoptimization stubs on DBC.
-#if !defined(TARGET_ARCH_DBC)
       *reinterpret_cast<RawObject**>(dest_addr) = deopt_context->is_lazy_deopt()
           ? StubCode::DeoptimizeLazy_entry()->code()
           : StubCode::Deoptimize_entry()->code();
-#endif
       return;
     }
 
@@ -729,7 +748,7 @@
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = deopt_context->GetCallerFp();
     deopt_context->SetCallerFp(reinterpret_cast<intptr_t>(
-        dest_addr - (kSavedCallerFpSlotFromFp * kWordSize)));
+        dest_addr - kSavedCallerFpSlotFromFp));
   }
 
  private:
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 229a0aa..5dfab38 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -9,9 +9,11 @@
 #include "vm/assembler.h"
 #include "vm/code_generator.h"
 #include "vm/deferred_objects.h"
+#include "vm/flow_graph_compiler.h"
 #include "vm/growable_array.h"
 #include "vm/locations.h"
 #include "vm/object.h"
+#include "vm/stack_frame.h"
 #include "vm/thread.h"
 
 namespace dart {
@@ -48,6 +50,10 @@
   intptr_t* GetSourceFrameAddressAt(intptr_t index) const {
     ASSERT(source_frame_ != NULL);
     ASSERT((0 <= index) && (index < source_frame_size_));
+#if !defined(TARGET_ARCH_DBC)
+    // Convert FP relative index to SP relative one.
+    index = source_frame_size_ - 1 - index;
+#endif  // !defined(TARGET_ARCH_DBC)
     return &source_frame_[index];
   }
 
@@ -64,13 +70,20 @@
   }
 
   intptr_t RegisterValue(Register reg) const {
-    ASSERT(cpu_registers_ != NULL);
     ASSERT(reg >= 0);
     ASSERT(reg < kNumberOfCpuRegisters);
+#if !defined(TARGET_ARCH_DBC)
+    ASSERT(cpu_registers_ != NULL);
     return cpu_registers_[reg];
+#else
+    // On DBC registers and stack slots are the same.
+    const intptr_t stack_index = num_args_ + kDartFrameFixedSize + reg;
+    return *GetSourceFrameAddressAt(stack_index);
+#endif  // !defined(TARGET_ARCH_DBC)
   }
 
   double FpuRegisterValue(FpuRegister reg) const {
+    ASSERT(FlowGraphCompiler::SupportsUnboxedDoubles());
     ASSERT(fpu_registers_ != NULL);
     ASSERT(reg >= 0);
     ASSERT(reg < kNumberOfFpuRegisters);
@@ -78,6 +91,7 @@
   }
 
   simd128_value_t FpuRegisterValueAsSimd128(FpuRegister reg) const {
+    ASSERT(FlowGraphCompiler::SupportsUnboxedSimd128());
     ASSERT(fpu_registers_ != NULL);
     ASSERT(reg >= 0);
     ASSERT(reg < kNumberOfFpuRegisters);
@@ -85,9 +99,29 @@
     return simd128_value_t().readFrom(address);
   }
 
-  void set_dest_frame(intptr_t* dest_frame) {
-    ASSERT(dest_frame != NULL && dest_frame_ == NULL);
-    dest_frame_ = dest_frame;
+  // Return base pointer for the given frame (either source or destination).
+  // Base pointer points to the slot with the lowest address in the frame
+  // including incoming arguments and artificial deoptimization frame
+  // on top of it.
+  // Note: artificial frame created by the deoptimization stub is considered
+  // part of the frame because it contains saved caller PC and FP that
+  // deoptimization will fill in.
+  intptr_t* FrameBase(const StackFrame* frame) {
+#if !defined(TARGET_ARCH_DBC)
+    // SP of the deoptimization frame is the lowest slot because
+    // stack is growing downwards.
+    return reinterpret_cast<intptr_t*>(
+      frame->sp() - (kDartFrameFixedSize * kWordSize));
+#else
+    // First argument is the lowest slot because stack is growing upwards.
+    return reinterpret_cast<intptr_t*>(
+      frame->fp() - (kDartFrameFixedSize + num_args_) * kWordSize);
+#endif  // !defined(TARGET_ARCH_DBC)
+  }
+
+  void set_dest_frame(const StackFrame* frame) {
+    ASSERT(frame != NULL && dest_frame_ == NULL);
+    dest_frame_ = FrameBase(frame);
   }
 
   Thread* thread() const { return thread_; }
@@ -188,10 +222,18 @@
     return deferred_objects_[idx];
   }
 
+  intptr_t num_args() const { return num_args_; }
+
  private:
   intptr_t* GetDestFrameAddressAt(intptr_t index) const {
     ASSERT(dest_frame_ != NULL);
     ASSERT((0 <= index) && (index < dest_frame_size_));
+#if defined(TARGET_ARCH_DBC)
+    // Stack on DBC is growing upwards but we record deopt commands
+    // in the same order we record them on other architectures as if
+    // the stack was growing downwards.
+    index = dest_frame_size_ - 1 - index;
+#endif  // defined(TARGET_ARCH_DBC)
     return &dest_frame_[index];
   }
 
@@ -383,7 +425,7 @@
         context, reg()));
     } else {
       return *reinterpret_cast<T*>(context->GetSourceFrameAddressAt(
-          context->source_frame_size() - raw_index() - 1));
+          raw_index()));
     }
   }
 
diff --git a/runtime/vm/disassembler_dbc.cc b/runtime/vm/disassembler_dbc.cc
index 85d734d..5c8b3a0 100644
--- a/runtime/vm/disassembler_dbc.cc
+++ b/runtime/vm/disassembler_dbc.cc
@@ -63,7 +63,11 @@
 
 
 static void Fmtxeg(char** buf, intptr_t* size, uword pc, int32_t value) {
-  FormatOperand(buf, size, "R(%d)", value);
+  if (value < 0) {
+    FormatOperand(buf, size, "FP[%d]", value);
+  } else {
+    Fmtreg(buf, size, pc, value);
+  }
 }
 
 
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index ee483ad..5818624 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -61,6 +61,8 @@
   "Disassemble dart code.")                                                    \
 R(disassemble_optimized, false, bool, false,                                   \
   "Disassemble optimized code.")                                               \
+R(dump_megamorphic_stats, false, bool, false,                                  \
+  "Dump megamorphic cache statistics")                                         \
 R(dump_symbol_stats, false, bool, false,                                       \
   "Dump symbol table statistics")                                              \
 R(enable_asserts, false, bool, false,                                          \
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index bac0c4b..0c8dbc0 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -444,13 +444,14 @@
         ? String::Handle(zone(), Field::NameFromGetter(call->function_name()))
         : call->function_name();
     const Class& cls = Class::Handle(zone(), function().Owner());
-    if (!thread()->cha()->HasOverride(cls, name)) {
+    intptr_t subclass_count = 0;
+    if (!thread()->cha()->HasOverride(cls, name, &subclass_count)) {
       if (FLAG_trace_cha) {
         THR_Print("  **(CHA) Instance call needs no check, "
             "no overrides of '%s' '%s'\n",
             name.ToCString(), cls.ToCString());
       }
-      thread()->cha()->AddToLeafClasses(cls);
+      thread()->cha()->AddToGuardedClasses(cls, subclass_count);
       return false;
     }
   }
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 747094c..d4fd498 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -152,6 +152,15 @@
 
       // Initialize location summary for instruction.
       current->InitializeLocationSummary(zone(), true);  // opt
+#if defined(TARGET_ARCH_DBC)
+      // TODO(vegorov) remove this once we have ported all necessary
+      // instructions to DBC.
+      if (!current->HasLocs()) {
+        graph_entry_->parsed_function().Bailout("SSALivenessAnalysis",
+                                                current->ToCString());
+      }
+#endif
+
       LocationSummary* locs = current->locs();
 #if defined(DEBUG)
       locs->DiscoverWritableInputs();
@@ -598,6 +607,10 @@
     } else if (block->IsCatchBlockEntry()) {
       // Process initial definitions.
       CatchBlockEntryInstr* catch_entry = block->AsCatchBlockEntry();
+#if defined(TARGET_ARCH_DBC)
+      // TODO(vegorov) support try-catch/finally for DBC.
+      flow_graph_.parsed_function().Bailout("FlowGraphAllocator", "Catch");
+#endif
       for (intptr_t i = 0;
            i < catch_entry->initial_definitions()->length();
            i++) {
@@ -652,14 +665,35 @@
       slot_index -= flow_graph_.num_non_copied_params();
     }
 
+#if defined(TARGET_ARCH_DBC)
+    ASSERT(param->base_reg() == FPREG);
+    if (slot_index >= 0) {
+      AssignSafepoints(defn, range);
+      range->finger()->Initialize(range);
+      range->set_assigned_location(Location::RegisterLocation(slot_index));
+      if (range->End() > kNormalEntryPos) {
+        LiveRange* tail = range->SplitAt(kNormalEntryPos);
+        CompleteRange(tail, Location::kRegister);
+      }
+      ConvertAllUses(range);
+      return;
+    }
+#endif  // defined(TARGET_ARCH_DBC)
     range->set_assigned_location(Location::StackSlot(slot_index,
                                                      param->base_reg()));
     range->set_spill_slot(Location::StackSlot(slot_index,
                                               param->base_reg()));
+
   } else if (defn->IsCurrentContext()) {
+#if !defined(TARGET_ARCH_DBC)
+    const Register context_reg = CTX;
+#else
+    const intptr_t context_reg = flow_graph_.num_copied_params();
+#endif
+
     AssignSafepoints(defn, range);
     range->finger()->Initialize(range);
-    range->set_assigned_location(Location::RegisterLocation(CTX));
+    range->set_assigned_location(Location::RegisterLocation(context_reg));
     if (range->End() > kNormalEntryPos) {
       LiveRange* tail = range->SplitAt(kNormalEntryPos);
       CompleteRange(tail, Location::kRegister);
@@ -1323,7 +1357,10 @@
     }
   }
 
-  // Block all allocatable registers for calls and record the stack bitmap.
+  // Block all allocatable registers for calls.
+  // Note that on DBC registers are always essentially spilled so
+  // we don't need to block anything.
+#if !defined(TARGET_ARCH_DBC)
   if (locs->always_calls()) {
     // Expected shape of live range:
     //
@@ -1373,6 +1410,7 @@
     }
 #endif
   }
+#endif
 
   if (locs->can_call()) {
     safepoints_.Add(current);
@@ -1906,6 +1944,14 @@
 
 
 void FlowGraphAllocator::AllocateSpillSlotFor(LiveRange* range) {
+#if defined(TARGET_ARCH_DBC)
+  // There is no need to support spilling on DBC because we have a lot of
+  // registers and registers and spill-slots have the same performance
+  // characteristics.
+  flow_graph_.parsed_function().Bailout("FlowGraphAllocator", "SPILL");
+  UNREACHABLE();
+#endif
+
   ASSERT(range->spill_slot().IsInvalid());
 
   // Compute range start and end.
@@ -2242,6 +2288,9 @@
 
   registers_[candidate]->Add(unallocated);
   unallocated->set_assigned_location(MakeRegisterLocation(candidate));
+#if defined(TARGET_ARCH_DBC)
+  last_used_register_ = Utils::Maximum(last_used_register_, candidate);
+#endif
 
   return true;
 }
@@ -2441,6 +2490,9 @@
 
   registers_[reg]->Add(unallocated);
   unallocated->set_assigned_location(MakeRegisterLocation(reg));
+#if defined(TARGET_ARCH_DBC)
+  last_used_register_ = Utils::Maximum(last_used_register_, reg);
+#endif
 }
 
 
@@ -2530,10 +2582,16 @@
     for (SafepointPosition* safepoint = range->first_safepoint();
          safepoint != NULL;
          safepoint = safepoint->next()) {
+#if !defined(TARGET_ARCH_DBC)
       if (!safepoint->locs()->always_calls()) {
         ASSERT(safepoint->locs()->can_call());
         safepoint->locs()->live_registers()->Add(loc, range->representation());
       }
+#else
+      if (range->representation() == kTagged) {
+        safepoint->locs()->SetStackBit(loc.reg());
+      }
+#endif  // !defined(TARGET_ARCH_DBC)
     }
   }
 }
@@ -2683,6 +2741,10 @@
       registers_[reg]->Add(range);
     }
   }
+
+#if defined(TARGET_ARCH_DBC)
+  last_used_register_ = -1;
+#endif
 }
 
 
@@ -2949,10 +3011,6 @@
 
   BuildLiveRanges();
 
-  if (FLAG_print_ssa_liveness) {
-    liveness_.Dump();
-  }
-
   if (FLAG_print_ssa_liveranges) {
     const Function& function = flow_graph_.function();
     THR_Print("-- [before ssa allocator] ranges [%s] ---------\n",
@@ -2977,6 +3035,9 @@
                        cpu_regs_,
                        blocked_cpu_registers_);
   AllocateUnallocatedRanges();
+#if defined(TARGET_ARCH_DBC)
+  const intptr_t last_used_cpu_register = last_used_register_;
+#endif
 
   cpu_spill_slot_count_ = spill_slots_.length();
   spill_slots_.Clear();
@@ -2989,6 +3050,10 @@
                        fpu_regs_,
                        blocked_fpu_registers_);
   AllocateUnallocatedRanges();
+#if defined(TARGET_ARCH_DBC)
+  const intptr_t last_used_fpu_register = last_used_register_;
+  ASSERT(last_used_fpu_register == -1);  // Not supported right now.
+#endif
 
   ResolveControlFlow();
 
@@ -2997,6 +3062,21 @@
   intptr_t double_spill_slot_count = spill_slots_.length() * kDoubleSpillFactor;
   entry->set_spill_slot_count(cpu_spill_slot_count_ + double_spill_slot_count);
 
+#if defined(TARGET_ARCH_DBC)
+  // Spilling is unsupported on DBC.
+  if (entry->spill_slot_count() != 0) {
+    UNREACHABLE();
+  }
+
+  // We store number of used DBC registers in the spill slot count to avoid
+  // introducing a separate field. It has roughly the same meaning:
+  // number of used registers determines how big of a frame to reserve for
+  // this function on DBC stack.
+  entry->set_spill_slot_count(Utils::Maximum((last_used_cpu_register + 1) +
+                                             (last_used_fpu_register + 1),
+                                             flow_graph_.num_copied_params()));
+#endif
+
   if (FLAG_print_ssa_liveranges) {
     const Function& function = flow_graph_.function();
 
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index fe2c710..7df1a6a 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -298,6 +298,10 @@
 
   intptr_t number_of_registers_;
 
+#if defined(TARGET_ARCH_DBC)
+  intptr_t last_used_register_;
+#endif
+
   // Per register lists of allocated live ranges.  Contain only those
   // ranges that can be affected by future allocation decisions.
   // Those live ranges that end before the start of the current live range are
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index b968585..bd07667 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -860,7 +860,7 @@
                                                 Value* value,
                                                 TokenPosition token_pos) {
   if (local.is_captured()) {
-    LocalVariable* tmp_var = EnterTempLocalScope(value, token_pos);
+    LocalVariable* tmp_var = EnterTempLocalScope(value);
     intptr_t delta =
         owner()->context_level() - local.owner()->context_level();
     ASSERT(delta >= 0);
@@ -878,7 +878,7 @@
                                        kEmitStoreBarrier,
                                        token_pos);
     Do(store);
-    return ExitTempLocalScope(tmp_var, token_pos);
+    return ExitTempLocalScope(value);
   } else {
     return new(Z) StoreLocalInstr(local, value, token_pos);
   }
@@ -1318,20 +1318,17 @@
   ValueGraphVisitor for_value(owner());
   node->expr()->Visit(&for_value);
   Append(for_value);
-  Definition* checked_value;
   if (CanSkipTypeCheck(node->expr()->token_pos(),
                        for_value.value(),
                        node->type(),
                        node->dst_name())) {
-    // Drop the value and 0 additional temporaries.
-    checked_value = new(Z) DropTempsInstr(0, for_value.value());
+    ReturnValue(for_value.value());
   } else {
-    checked_value = BuildAssertAssignable(node->expr()->token_pos(),
-                                          for_value.value(),
-                                          node->type(),
-                                          node->dst_name());
+    ReturnDefinition(BuildAssertAssignable(node->expr()->token_pos(),
+                                           for_value.value(),
+                                           node->type(),
+                                           node->dst_name()));
   }
-  ReturnDefinition(checked_value);
 }
 
 
@@ -2245,8 +2242,7 @@
 }
 
 
-LocalVariable* EffectGraphVisitor::EnterTempLocalScope(
-    Value* value, TokenPosition token_pos) {
+LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
   ASSERT(value->definition()->temp_index() == (owner()->temp_count() - 1));
   intptr_t index = GetCurrentTempLocalIndex();
   char name[64];
@@ -2260,12 +2256,8 @@
 }
 
 
-Definition* EffectGraphVisitor::ExitTempLocalScope(
-    LocalVariable* var, TokenPosition token_pos) {
-  Value* tmp = Bind(new(Z) LoadLocalInstr(*var, token_pos));
-  owner()->DeallocateTemps(1);
-  ASSERT(GetCurrentTempLocalIndex() == var->index());
-  return new(Z) DropTempsInstr(1, tmp);
+Definition* EffectGraphVisitor::ExitTempLocalScope(Value* value) {
+  return new(Z) DropTempsInstr(0, value);
 }
 
 
@@ -2337,7 +2329,7 @@
                                                      num_elements);
   Value* array_val = Bind(create);
 
-  { LocalVariable* tmp_var = EnterTempLocalScope(array_val, node->token_pos());
+  { LocalVariable* tmp_var = EnterTempLocalScope(array_val);
     const intptr_t class_id = kArrayCid;
     const intptr_t deopt_id = Thread::kNoDeoptId;
     for (int i = 0; i < node->length(); ++i) {
@@ -2359,7 +2351,7 @@
           index_scale, class_id, deopt_id, node->token_pos());
       Do(store);
     }
-    ReturnDefinition(ExitTempLocalScope(tmp_var, node->token_pos()));
+    ReturnDefinition(ExitTempLocalScope(array_val));
   }
 }
 
@@ -2452,8 +2444,7 @@
   alloc->set_closure_function(function);
 
   Value* closure_val = Bind(alloc);
-  { LocalVariable* closure_tmp_var = EnterTempLocalScope(closure_val,
-                                                         node->token_pos());
+  { LocalVariable* closure_tmp_var = EnterTempLocalScope(closure_val);
     // Store type arguments if scope class is generic.
     const Type& function_type = Type::ZoneHandle(Z, function.SignatureType());
     const Class& scope_cls = Class::ZoneHandle(Z, function_type.type_class());
@@ -2489,8 +2480,7 @@
       Value* allocated_context =
           Bind(new(Z) AllocateContextInstr(node->token_pos(),
                                            kNumContextVariables));
-      { LocalVariable* context_tmp_var =
-            EnterTempLocalScope(allocated_context, node->token_pos());
+      { LocalVariable* context_tmp_var = EnterTempLocalScope(allocated_context);
         // Store receiver in context.
         Value* context_tmp_val =
             Bind(new(Z) LoadLocalInstr(*context_tmp_var, node->token_pos()));
@@ -2513,7 +2503,7 @@
                                           context_tmp_val,
                                           kEmitStoreBarrier,
                                           node->token_pos()));
-        Do(ExitTempLocalScope(context_tmp_var, node->token_pos()));
+        Do(ExitTempLocalScope(allocated_context));
       }
     } else {
       // Store current context in closure.
@@ -2526,7 +2516,7 @@
                                         kEmitStoreBarrier,
                                         node->token_pos()));
     }
-    ReturnDefinition(ExitTempLocalScope(closure_tmp_var, node->token_pos()));
+    ReturnDefinition(ExitTempLocalScope(closure_val));
   }
 }
 
@@ -2687,8 +2677,8 @@
   node->closure()->Visit(&for_closure);
   Append(for_closure);
 
-  LocalVariable* tmp_var =
-      EnterTempLocalScope(for_closure.value(), node->token_pos());
+  Value* closure_value = for_closure.value();
+  LocalVariable* tmp_var = EnterTempLocalScope(closure_value);
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new(Z) ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
@@ -2714,7 +2704,7 @@
   } else {
     Do(closure_call);
   }
-  ReturnDefinition(ExitTempLocalScope(tmp_var, node->token_pos()));
+  ReturnDefinition(ExitTempLocalScope(closure_value));
 }
 
 
@@ -2953,12 +2943,12 @@
   //   tn       <- LoadLocal(temp)
 
   Value* allocate = BuildObjectAllocation(node);
-  { LocalVariable* tmp_var = EnterTempLocalScope(allocate, node->token_pos());
+  { LocalVariable* tmp_var = EnterTempLocalScope(allocate);
     Value* allocated_tmp =
         Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
     PushArgumentInstr* push_allocated_value = PushArgument(allocated_tmp);
     BuildConstructorCall(node, push_allocated_value);
-    ReturnDefinition(ExitTempLocalScope(tmp_var, node->token_pos()));
+    ReturnDefinition(ExitTempLocalScope(allocate));
   }
 }
 
@@ -3974,8 +3964,7 @@
     Value* allocated_context =
         Bind(new(Z) AllocateContextInstr(node->token_pos(),
                                          num_context_variables));
-    { LocalVariable* tmp_var =
-          EnterTempLocalScope(allocated_context, node->token_pos());
+    { LocalVariable* tmp_var = EnterTempLocalScope(allocated_context);
       if (!is_top_level_sequence || HasContextScope()) {
         ASSERT(is_top_level_sequence ||
                (nested_block.ContextLevel() ==
@@ -3990,7 +3979,7 @@
                                           node->token_pos()));
       }
       Do(BuildStoreContext(
-          Bind(ExitTempLocalScope(tmp_var, node->token_pos())),
+          Bind(ExitTempLocalScope(allocated_context)),
           node->token_pos()));
     }
 
@@ -4605,15 +4594,7 @@
 
 
 void FlowGraphBuilder::Bailout(const char* reason) const {
-  const Function& function = parsed_function_.function();
-  Report::MessageF(Report::kBailout,
-                   Script::Handle(function.script()),
-                   function.token_pos(),
-                   Report::AtLocation,
-                   "FlowGraphBuilder Bailout: %s %s",
-                   String::Handle(function.name()).ToCString(),
-                   reason);
-  UNREACHABLE();
+  parsed_function_.Bailout("FlowGraphBuilder", reason);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 977df17..870773b 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -436,8 +436,8 @@
 
   // Helpers for allocating and deallocating temporary locals on top of the
   // expression stack.
-  LocalVariable* EnterTempLocalScope(Value* value, TokenPosition token_pos);
-  Definition* ExitTempLocalScope(LocalVariable* var, TokenPosition token_pos);
+  LocalVariable* EnterTempLocalScope(Value* value);
+  Definition* ExitTempLocalScope(Value* value);
 
   void BuildLetTempExpressions(LetNode* node);
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 93225db..b403bbf 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -644,15 +644,7 @@
 
 
 void FlowGraphCompiler::Bailout(const char* reason) {
-  const Function& function = parsed_function_.function();
-  Report::MessageF(Report::kBailout,
-                   Script::Handle(function.script()),
-                   function.token_pos(),
-                   Report::AtLocation,
-                   "FlowGraphCompiler Bailout: %s %s",
-                   String::Handle(function.name()).ToCString(),
-                   reason);
-  UNREACHABLE();
+  parsed_function_.Bailout("FlowGraphCompiler", reason);
 }
 
 
@@ -1188,7 +1180,7 @@
     return;
   }
   if (FLAG_always_megamorphic_calls) {
-    EmitMegamorphicInstanceCall(ic_data, argument_count,
+    EmitMegamorphicInstanceCall(ic_data_in, argument_count,
                                 deopt_id, token_pos, locs,
                                 CatchClauseNode::kInvalidTryIndex);
     return;
@@ -1216,7 +1208,7 @@
   }
 
   if (is_optimizing()) {
-    EmitMegamorphicInstanceCall(ic_data, argument_count,
+    EmitMegamorphicInstanceCall(ic_data_in, argument_count,
                                 deopt_id, token_pos, locs,
                                 CatchClauseNode::kInvalidTryIndex);
     return;
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index f7aa76e..a94eaa6 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -613,6 +613,10 @@
   void BeginCodeSourceRange();
   bool EndCodeSourceRange(TokenPosition token_pos);
 
+#if defined(TARGET_ARCH_DBC)
+  void RecordAfterCall(Instruction* instr);
+#endif
+
  private:
   friend class CheckStackOverflowSlowPath;  // For pending_deoptimization_env_.
 
diff --git a/runtime/vm/flow_graph_compiler_dbc.cc b/runtime/vm/flow_graph_compiler_dbc.cc
index 92ba799..86352cc 100644
--- a/runtime/vm/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/flow_graph_compiler_dbc.cc
@@ -90,8 +90,120 @@
 RawTypedData* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder,
                                                  const Array& deopt_table) {
-  UNIMPLEMENTED();
-  return TypedData::null();
+  if (deopt_env_ == NULL) {
+    ++builder->current_info_number_;
+    return TypedData::null();
+  }
+
+  intptr_t stack_height = compiler->StackSize();
+  AllocateIncomingParametersRecursive(deopt_env_, &stack_height);
+
+  intptr_t slot_ix = 0;
+  Environment* current = deopt_env_;
+
+  // Emit all kMaterializeObject instructions describing objects to be
+  // materialized on the deoptimization as a prefix to the deoptimization info.
+  EmitMaterializations(deopt_env_, builder);
+
+  // The real frame starts here.
+  builder->MarkFrameStart();
+
+  Zone* zone = compiler->zone();
+
+  builder->AddCallerFp(slot_ix++);
+  builder->AddReturnAddress(current->function(), deopt_id(), slot_ix++);
+  builder->AddPcMarker(Function::ZoneHandle(zone), slot_ix++);
+  builder->AddConstant(Function::ZoneHandle(zone), slot_ix++);
+
+  // Emit all values that are needed for materialization as a part of the
+  // expression stack for the bottom-most frame. This guarantees that GC
+  // will be able to find them during materialization.
+  slot_ix = builder->EmitMaterializationArguments(slot_ix);
+
+  // For the innermost environment, set outgoing arguments and the locals.
+  for (intptr_t i = current->Length() - 1;
+       i >= current->fixed_parameter_count();
+       i--) {
+    builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
+  }
+
+  builder->AddCallerFp(slot_ix++);
+
+  Environment* previous = current;
+  current = current->outer();
+  while (current != NULL) {
+    // For any outer environment the deopt id is that of the call instruction
+    // which is recorded in the outer environment.
+    builder->AddReturnAddress(
+        current->function(),
+        Thread::ToDeoptAfter(current->deopt_id()),
+        slot_ix++);
+
+    builder->AddPcMarker(previous->function(), slot_ix++);
+    builder->AddConstant(previous->function(), slot_ix++);
+
+    // The values of outgoing arguments can be changed from the inlined call so
+    // we must read them from the previous environment.
+    for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
+      builder->AddCopy(previous->ValueAt(i),
+                       previous->LocationAt(i),
+                       slot_ix++);
+    }
+
+    // Set the locals, note that outgoing arguments are not in the environment.
+    for (intptr_t i = current->Length() - 1;
+         i >= current->fixed_parameter_count();
+         i--) {
+      builder->AddCopy(current->ValueAt(i),
+                       current->LocationAt(i),
+                       slot_ix++);
+    }
+
+    builder->AddCallerFp(slot_ix++);
+
+    // Iterate on the outer environment.
+    previous = current;
+    current = current->outer();
+  }
+  // The previous pointer is now the outermost environment.
+  ASSERT(previous != NULL);
+
+  // For the outermost environment, set caller PC.
+  builder->AddCallerPc(slot_ix++);
+
+  builder->AddPcMarker(previous->function(), slot_ix++);
+  builder->AddConstant(previous->function(), slot_ix++);
+
+
+  // For the outermost environment, set the incoming arguments.
+  for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
+    builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
+  }
+
+  return builder->CreateDeoptInfo(deopt_table);
+}
+
+
+void FlowGraphCompiler::RecordAfterCall(Instruction* instr) {
+  RecordSafepoint(instr->locs());
+  // Marks either the continuation point in unoptimized code or the
+  // deoptimization point in optimized code, after call.
+  const intptr_t deopt_id_after = Thread::ToDeoptAfter(instr->deopt_id());
+  if (is_optimizing()) {
+    // Return/ReturnTOS instruction drops incoming arguments so
+    // we have to drop outgoing arguments from the innermost environment.
+    // On all other architectures caller drops outgoing arguments itself
+    // hence the difference.
+    pending_deoptimization_env_->DropArguments(instr->ArgumentCount());
+    AddDeoptIndexAtCall(deopt_id_after, instr->token_pos());
+  } else {
+    // Add deoptimization continuation point after the call and before the
+    // arguments are removed.
+    // In optimized code this descriptor is needed for exception handling.
+    AddCurrentDescriptor(RawPcDescriptors::kDeopt,
+                         deopt_id_after,
+                         instr->token_pos());
+  }
 }
 
 
@@ -109,16 +221,28 @@
                                                  const AbstractType& dst_type,
                                                  const String& dst_name,
                                                  LocationSummary* locs) {
-  ASSERT(!is_optimizing());
   SubtypeTestCache& test_cache = SubtypeTestCache::Handle();
   if (!dst_type.IsVoidType() && dst_type.IsInstantiated()) {
     test_cache = SubtypeTestCache::New();
   }
 
+  if (is_optimizing()) {
+    __ Push(locs->in(0).reg());
+    __ Push(locs->in(1).reg());
+  }
   __ PushConstant(dst_type);
   __ PushConstant(dst_name);
   __ AssertAssignable(__ AddConstant(test_cache));
+  RecordSafepoint(locs);
   AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id, token_pos);
+  if (is_optimizing()) {
+    // Assert assignable keeps the instance on the stack as the result,
+    // all other arguments are popped.
+    // In optimized code we need to drop it because optimized code
+    // expects the result in the register and it is already there
+    // because locs()->in(0).reg() == locs()->out(0).reg().
+    __ Drop1();
+  }
 }
 
 
@@ -168,10 +292,21 @@
   const intptr_t context_index =
       -parsed_function().current_context_var()->index() - 1;
 
+  if (CanOptimizeFunction() &&
+      function.IsOptimizable() &&
+      (!is_optimizing() || may_reoptimize())) {
+    __ HotCheck(!is_optimizing(), GetOptimizationThreshold());
+  }
+
   if (has_optional_params) {
-    __ EntryOpt(num_fixed_params, num_opt_pos_params, num_opt_named_params);
-  } else {
+    __ EntryOptional(num_fixed_params,
+                     num_opt_pos_params,
+                     num_opt_named_params);
+  } else if (!is_optimizing()) {
     __ Entry(num_fixed_params, num_locals, context_index);
+  } else {
+    __ EntryOptimized(num_fixed_params,
+                      flow_graph_.graph_entry()->spill_slot_count());
   }
 
   if (num_opt_named_params != 0) {
@@ -212,14 +347,20 @@
   }
 
 
-  ASSERT(num_locals > 0);  // There is always at least context_var.
   if (has_optional_params) {
-    ASSERT(!is_optimizing());
-    __ Frame(num_locals);  // Reserve space for locals.
+    if (!is_optimizing()) {
+      ASSERT(num_locals > 0);  // There is always at least context_var.
+      __ Frame(num_locals);  // Reserve space for locals.
+    } else if (flow_graph_.graph_entry()->spill_slot_count() >
+                   flow_graph_.num_copied_params()) {
+      __ Frame(flow_graph_.graph_entry()->spill_slot_count() -
+          flow_graph_.num_copied_params());
+    }
   }
 
   if (function.IsClosureFunction()) {
-    Register reg = context_index;
+    Register reg = is_optimizing() ? flow_graph_.num_copied_params()
+                                   : context_index;
     Register closure_reg = reg;
     LocalScope* scope = parsed_function().node_sequence()->scope();
     LocalVariable* local = scope->VariableAt(0);
@@ -229,7 +370,7 @@
       closure_reg = -local->index() - 1;
     }
     __ LoadField(reg, closure_reg, Closure::context_offset() / kWordSize);
-  } else if (has_optional_params) {
+  } else if (has_optional_params && !is_optimizing()) {
     __ LoadConstant(context_index,
         Object::Handle(isolate()->object_store()->empty_context()));
   }
@@ -254,12 +395,48 @@
 
 
 void ParallelMoveResolver::EmitMove(int index) {
-  UNIMPLEMENTED();
+  MoveOperands* move = moves_[index];
+  const Location source = move->src();
+  const Location destination = move->dest();
+  if (source.IsStackSlot() && destination.IsRegister()) {
+    // Only allow access to the arguments.
+    ASSERT(source.base_reg() == FPREG);
+    ASSERT(source.stack_index() < 0);
+    __ Move(destination.reg(), -kParamEndSlotFromFp + source.stack_index());
+  } else if (source.IsRegister() && destination.IsRegister()) {
+    __ Move(destination.reg(), source.reg());
+  } else if (source.IsConstant() && destination.IsRegister()) {
+    __ LoadConstant(destination.reg(), source.constant());
+  } else {
+    compiler_->Bailout("Unsupported move");
+  }
+
+  move->Eliminate();
 }
 
 
 void ParallelMoveResolver::EmitSwap(int index) {
-  UNIMPLEMENTED();
+  MoveOperands* move = moves_[index];
+  const Location source = move->src();
+  const Location destination = move->dest();
+  ASSERT(source.IsRegister() && destination.IsRegister());
+  __ Swap(destination.reg(), source.reg());
+
+  // The swap of source and destination has executed a move from source to
+  // destination.
+  move->Eliminate();
+
+  // Any unperformed (including pending) move with a source of either
+  // this move's source or destination needs to have their source
+  // changed to reflect the state of affairs after the swap.
+  for (int i = 0; i < moves_.length(); ++i) {
+    const MoveOperands& other_move = *moves_[i];
+    if (other_move.Blocks(source)) {
+      moves_[i]->set_src(destination);
+    } else if (other_move.Blocks(destination)) {
+      moves_[i]->set_src(source);
+    }
+  }
 }
 
 
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index af0a03fc..d0ffe77 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -356,6 +356,8 @@
         new CheckSmiInstr(assert->value()->Copy(zone()),
                           assert->env()->deopt_id(),
                           check->token_pos());
+    check_clone->AsCheckSmi()->set_licm_hoisted(
+        check->AsCheckSmi()->licm_hoisted());
   } else {
     ASSERT(check->IsCheckClass());
     check_clone =
@@ -363,6 +365,8 @@
                             assert->env()->deopt_id(),
                             check->AsCheckClass()->unary_checks(),
                             check->token_pos());
+    check_clone->AsCheckClass()->set_licm_hoisted(
+        check->AsCheckClass()->licm_hoisted());
   }
   ASSERT(check_clone != NULL);
   ASSERT(assert->deopt_id() == assert->env()->deopt_id());
@@ -504,7 +508,7 @@
                 type_class.ToCString());
           }
           if (FLAG_use_cha_deopt) {
-            cha->AddToLeafClasses(type_class);
+            cha->AddToGuardedClasses(type_class, /*subclass_count=*/0);
           }
           cid_ = type_class.id();
         } else {
@@ -752,7 +756,8 @@
                   type_class.ToCString());
             }
             if (FLAG_use_cha_deopt) {
-              thread->cha()->AddToLeafClasses(type_class);
+              thread->cha()->AddToGuardedClasses(
+                  type_class, /*subclass_count=*/0);
             }
             cid = type_class.id();
           }
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index 2c2643e..069f341 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -4,10 +4,6 @@
 
 #include "vm/gc_marker.h"
 
-#include <map>
-#include <utility>
-#include <vector>
-
 #include "vm/allocation.h"
 #include "vm/dart_api_state.h"
 #include "vm/isolate.h"
@@ -25,64 +21,6 @@
 
 namespace dart {
 
-class DelaySet {
- private:
-  typedef std::multimap<RawObject*, RawWeakProperty*> Map;
-  typedef std::pair<RawObject*, RawWeakProperty*> MapEntry;
-
- public:
-  DelaySet() : mutex_(new Mutex()) {}
-  ~DelaySet() { delete mutex_; }
-
-  // After atomically setting the watched bit on a white key (see
-  // EnsureWatchedIfWhitewhich; this means the mark bit cannot be set
-  // without observing the watched bit), this method atomically
-  // inserts raw_weak if its key is *still* white, so that any future
-  // call to VisitValuesForKey is guaranteed to include its
-  // value. Returns true on success, and false if the key is no longer white.
-  bool InsertIfWhite(RawWeakProperty* raw_weak) {
-    MutexLocker ml(mutex_);
-    RawObject* raw_key = raw_weak->ptr()->key_;
-    if (raw_key->IsMarked()) return false;
-    // The key was white *after* acquiring the lock. Thus any future call to
-    // VisitValuesForKey is guaranteed to include the entry inserted below.
-    delay_set_.insert(std::make_pair(raw_key, raw_weak));
-    return true;
-  }
-
-  void ClearReferences() {
-    MutexLocker ml(mutex_);
-    for (Map::iterator it = delay_set_.begin(); it != delay_set_.end(); ++it) {
-      ASSERT(!it->first->IsMarked());
-      WeakProperty::Clear(it->second);
-    }
-  }
-
-  // Visit all values with a key equal to raw_obj, which must already be marked.
-  void VisitValuesForKey(RawObject* raw_obj, ObjectPointerVisitor* visitor) {
-    ASSERT(raw_obj->IsMarked());
-    // Extract the range into a temporary vector to iterate over it
-    // while delay_set_ may be modified.
-    std::vector<MapEntry> temp_copy;
-    {
-      MutexLocker ml(mutex_);
-      std::pair<Map::iterator, Map::iterator> ret =
-          delay_set_.equal_range(raw_obj);
-      temp_copy.insert(temp_copy.end(), ret.first, ret.second);
-      delay_set_.erase(ret.first, ret.second);
-    }
-    for (std::vector<MapEntry>::iterator it = temp_copy.begin();
-         it != temp_copy.end(); ++it) {
-      it->second->VisitPointers(visitor);
-    }
-  }
-
- private:
-  Map delay_set_;
-  Mutex* mutex_;
-};
-
-
 class SkippedCodeFunctions : public ZoneAllocated {
  public:
   SkippedCodeFunctions() {}
@@ -206,7 +144,6 @@
                  Heap* heap,
                  PageSpace* page_space,
                  MarkingStack* marking_stack,
-                 DelaySet* delay_set,
                  SkippedCodeFunctions* skipped_code_functions)
       : ObjectPointerVisitor(isolate),
         thread_(Thread::Current()),
@@ -216,7 +153,7 @@
         class_stats_size_(isolate->class_table()->NumCids()),
         page_space_(page_space),
         work_list_(marking_stack),
-        delay_set_(delay_set),
+        delayed_weak_properties_(NULL),
         visiting_old_object_(NULL),
         skipped_code_functions_(skipped_code_functions),
         marked_bytes_(0) {
@@ -248,15 +185,44 @@
       return false;
     }
     do {
-      VisitingOldObject(raw_obj);
-      const intptr_t class_id = raw_obj->GetClassId();
-      if (class_id != kWeakPropertyCid) {
-        marked_bytes_ += raw_obj->VisitPointers(this);
-      } else {
-        RawWeakProperty* raw_weak = reinterpret_cast<RawWeakProperty*>(raw_obj);
-        marked_bytes_ += raw_weak->Size();
-        ProcessWeakProperty(raw_weak);
+      do {
+        // First drain the marking stacks.
+        VisitingOldObject(raw_obj);
+        const intptr_t class_id = raw_obj->GetClassId();
+        if (class_id != kWeakPropertyCid) {
+          marked_bytes_ += raw_obj->VisitPointers(this);
+        } else {
+          RawWeakProperty* raw_weak =
+              reinterpret_cast<RawWeakProperty*>(raw_obj);
+          marked_bytes_ += ProcessWeakProperty(raw_weak);
+        }
+        raw_obj = work_list_.Pop();
+      } while (raw_obj != NULL);
+
+      // Marking stack is empty.
+      // Process all the pending weak properties in this visitor.
+      RawWeakProperty* cur_weak = delayed_weak_properties_;
+      delayed_weak_properties_ = NULL;
+      while (cur_weak != NULL) {
+        uword next_weak = cur_weak->ptr()->next_;
+        RawObject* raw_key = cur_weak->ptr()->key_;
+        // Reset the next pointer in the weak property.
+        cur_weak->ptr()->next_ = 0;
+        if (raw_key->IsMarked()) {
+          // The key is marked so we make sure to properly visit all pointers
+          // originating from this weak property.
+          VisitingOldObject(cur_weak);
+          cur_weak->VisitPointers(this);
+        } else {
+          // Requeue this weak property to be handled later.
+          EnqueueWeakProperty(cur_weak);
+        }
+        // Advance to next weak property in the queue.
+        cur_weak = reinterpret_cast<RawWeakProperty*>(next_weak);
       }
+
+      // Check whether any further work was pushed either by other markers or
+      // by the handling of weak properties.
       raw_obj = work_list_.Pop();
     } while (raw_obj != NULL);
     VisitingOldObject(NULL);
@@ -278,47 +244,49 @@
     skipped_code_functions_->Add(func);
   }
 
-  // If unmarked, sets the watch bit and returns true.
-  // If marked, does nothing and returns false.
-  static bool EnsureWatchedIfWhite(RawObject* obj) {
-    if (!sync) {
-      if (obj->IsMarked()) return false;
-      if (!obj->IsWatched()) obj->SetWatchedBitUnsynchronized();
-      return true;
-    }
-    uword tags = obj->ptr()->tags_;
-    uword old_tags;
-    do {
-      old_tags = tags;
-      if (RawObject::MarkBit::decode(tags)) return false;
-      if (RawObject::WatchedBit::decode(tags)) return true;
-      uword new_tags = RawObject::WatchedBit::update(true, old_tags);
-      tags = AtomicOperations::CompareAndSwapWord(
-          &obj->ptr()->tags_, old_tags, new_tags);
-    } while (tags != old_tags);
-    return true;
+  void EnqueueWeakProperty(RawWeakProperty* raw_weak) {
+    ASSERT(raw_weak->IsHeapObject());
+    ASSERT(raw_weak->IsOldObject());
+    ASSERT(raw_weak->IsWeakProperty());
+    ASSERT(raw_weak->IsMarked());
+    ASSERT(raw_weak->ptr()->next_ == 0);
+    raw_weak->ptr()->next_ = reinterpret_cast<uword>(delayed_weak_properties_);
+    delayed_weak_properties_ = raw_weak;
   }
 
-  void ProcessWeakProperty(RawWeakProperty* raw_weak) {
+  intptr_t ProcessWeakProperty(RawWeakProperty* raw_weak) {
     // The fate of the weak property is determined by its key.
     RawObject* raw_key = raw_weak->ptr()->key_;
     if (raw_key->IsHeapObject() &&
         raw_key->IsOldObject() &&
-        EnsureWatchedIfWhite(raw_key) &&
-        delay_set_->InsertIfWhite(raw_weak)) {
-      // Key was white.  Delayed the weak property.
-    } else {
-      // Key is gray or black.  Make the weak property black.
-      raw_weak->VisitPointers(this);
+        !raw_key->IsMarked()) {
+      // Key was white. Enqueue the weak property.
+      EnqueueWeakProperty(raw_weak);
+      return raw_weak->Size();
     }
+    // Key is gray or black. Make the weak property black.
+    return raw_weak->VisitPointers(this);
   }
 
   // Called when all marking is complete.
   void Finalize() {
     work_list_.Finalize();
+    // Detach code from functions.
     if (skipped_code_functions_ != NULL) {
       skipped_code_functions_->DetachCode();
     }
+    // Clear pending weak properties.
+    RawWeakProperty* cur_weak = delayed_weak_properties_;
+    delayed_weak_properties_ = NULL;
+    intptr_t weak_properties_cleared = 0;
+    while (cur_weak != NULL) {
+      uword next_weak = cur_weak->ptr()->next_;
+      cur_weak->ptr()->next_ = 0;
+      WeakProperty::Clear(cur_weak);
+      weak_properties_cleared++;
+      // Advance to next weak property in the queue.
+      cur_weak = reinterpret_cast<RawWeakProperty*>(next_weak);
+    }
   }
 
   void VisitingOldObject(RawObject* obj) {
@@ -335,15 +303,10 @@
 
     // Push the marked object on the marking stack.
     ASSERT(raw_obj->IsMarked());
-    const bool is_watched = raw_obj->IsWatched();
     // We acquired the mark bit => no other task is modifying the header.
     // TODO(koda): For concurrent mutator, this needs synchronization. Consider
     // clearing these bits already in the CAS for the mark bit.
     raw_obj->ClearRememberedBitUnsynchronized();
-    raw_obj->ClearWatchedBitUnsynchronized();
-    if (is_watched) {
-      delay_set_->VisitValuesForKey(raw_obj, this);
-    }
     work_list_.Push(raw_obj);
   }
 
@@ -430,7 +393,7 @@
   GrowableArray<intptr_t> class_stats_size_;
   PageSpace* page_space_;
   MarkerWorkList work_list_;
-  DelaySet* delay_set_;
+  RawWeakProperty* delayed_weak_properties_;
   RawObject* visiting_old_object_;
   SkippedCodeFunctions* skipped_code_functions_;
   uintptr_t marked_bytes_;
@@ -574,7 +537,6 @@
            Heap* heap,
            PageSpace* page_space,
            MarkingStack* marking_stack,
-           DelaySet* delay_set,
            ThreadBarrier* barrier,
            bool collect_code,
            intptr_t task_index,
@@ -585,7 +547,6 @@
         heap_(heap),
         page_space_(page_space),
         marking_stack_(marking_stack),
-        delay_set_(delay_set),
         barrier_(barrier),
         collect_code_(collect_code),
         task_index_(task_index),
@@ -605,7 +566,7 @@
       SkippedCodeFunctions* skipped_code_functions =
           collect_code_ ? new(zone) SkippedCodeFunctions() : NULL;
       SyncMarkingVisitor visitor(isolate_, heap_, page_space_, marking_stack_,
-                                 delay_set_, skipped_code_functions);
+                                 skipped_code_functions);
       // Phase 1: Iterate over roots and drain marking stack in tasks.
       marker_->IterateRoots(isolate_, &visitor, task_index_, num_tasks_);
       do {
@@ -653,7 +614,6 @@
   Heap* heap_;
   PageSpace* page_space_;
   MarkingStack* marking_stack_;
-  DelaySet* delay_set_;
   ThreadBarrier* barrier_;
   bool collect_code_;
   const intptr_t task_index_;
@@ -692,10 +652,10 @@
   // The API prologue/epilogue may create/destroy zones, so we must not
   // depend on zone allocations surviving beyond the epilogue callback.
   {
-    StackZone stack_zone(Thread::Current());
+    Thread* thread = Thread::Current();
+    StackZone stack_zone(thread);
     Zone* zone = stack_zone.GetZone();
     MarkingStack marking_stack;
-    DelaySet delay_set;
     marked_bytes_ = 0;
     const int num_tasks = FLAG_marker_tasks;
     if (num_tasks == 0) {
@@ -703,11 +663,14 @@
       SkippedCodeFunctions* skipped_code_functions =
           collect_code ? new(zone) SkippedCodeFunctions() : NULL;
       UnsyncMarkingVisitor mark(isolate, heap_, page_space, &marking_stack,
-                                &delay_set, skipped_code_functions);
+                                skipped_code_functions);
       IterateRoots(isolate, &mark, 0, 1);
       mark.DrainMarkingStack();
-      MarkingWeakVisitor mark_weak;
-      IterateWeakRoots(isolate, &mark_weak);
+      {
+        TIMELINE_FUNCTION_GC_DURATION(thread, "WeakHandleProcessing");
+        MarkingWeakVisitor mark_weak;
+        IterateWeakRoots(isolate, &mark_weak);
+      }
       // All marking done; detach code, etc.
       FinalizeResultsFrom(&mark);
     } else {
@@ -720,31 +683,24 @@
       for (intptr_t i = 0; i < num_tasks; ++i) {
         MarkTask* mark_task =
             new MarkTask(this, isolate, heap_, page_space, &marking_stack,
-                         &delay_set, &barrier, collect_code,
+                         &barrier, collect_code,
                          i, num_tasks, &num_busy);
         ThreadPool* pool = Dart::thread_pool();
         pool->Run(mark_task);
       }
       barrier.Sync();
 
-      // Phase 2: Weak processing and follow-up marking on main thread.
-      SkippedCodeFunctions* skipped_code_functions =
-          collect_code ? new(zone) SkippedCodeFunctions() : NULL;
-      SyncMarkingVisitor mark(isolate, heap_, page_space, &marking_stack,
-                              &delay_set, skipped_code_functions);
-      MarkingWeakVisitor mark_weak;
-      IterateWeakRoots(isolate, &mark_weak);
+      // Phase 2: Weak processing on main thread.
+      {
+        TIMELINE_FUNCTION_GC_DURATION(thread, "WeakHandleProcessing");
+        MarkingWeakVisitor mark_weak;
+        IterateWeakRoots(isolate, &mark_weak);
+      }
       barrier.Sync();
 
       // Phase 3: Finalize results from all markers (detach code, etc.).
-      if (FLAG_log_marker_tasks) {
-        THR_Print("Main thread marked %" Pd " bytes.\n",
-                  mark.marked_bytes());
-      }
-      FinalizeResultsFrom(&mark);
       barrier.Exit();
     }
-    delay_set.ClearReferences();
     ProcessWeakTables(page_space);
     ProcessObjectIdTable(isolate);
   }
diff --git a/runtime/vm/instructions_dbc.cc b/runtime/vm/instructions_dbc.cc
index ec7945f..3656722 100644
--- a/runtime/vm/instructions_dbc.cc
+++ b/runtime/vm/instructions_dbc.cc
@@ -114,9 +114,10 @@
     case Bytecode::kLoadConstant:
     case Bytecode::kPushConstant:
     case Bytecode::kStaticCall:
-    case Bytecode::kInstanceCall:
+    case Bytecode::kInstanceCall1:
     case Bytecode::kInstanceCall2:
-    case Bytecode::kInstanceCall3:
+    case Bytecode::kInstanceCall1Opt:
+    case Bytecode::kInstanceCall2Opt:
     case Bytecode::kStoreStaticTOS:
     case Bytecode::kPushStatic:
     case Bytecode::kAllocate:
@@ -165,7 +166,9 @@
 
 
 void CallPattern::InsertDeoptCallAt(uword pc, uword target_address) {
-  UNIMPLEMENTED();
+  const uint8_t argc = Bytecode::IsCallOpcode(Bytecode::At(pc)) ?
+      Bytecode::DecodeArgc(Bytecode::At(pc)) : 0;
+  *reinterpret_cast<Instr*>(pc) = Bytecode::Encode(Bytecode::kDeopt, argc, 0);
 }
 
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 66abf75..4704219 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -3110,6 +3110,8 @@
     }
   }
 #else
+  call_ic_data = &ICData::ZoneHandle(call_ic_data->Original());
+
   // Emit smi fast path instruction. If fast-path succeeds it skips the next
   // instruction otherwise it falls through.
   if (function_name().raw() == Symbols::Plus().raw()) {
@@ -3131,13 +3133,18 @@
   const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data);
   switch (call_ic_data->NumArgsTested()) {
     case 1:
-      __ InstanceCall(ArgumentCount(), call_ic_data_kidx);
+      if (compiler->is_optimizing()) {
+        __ InstanceCall1Opt(ArgumentCount(), call_ic_data_kidx);
+      } else {
+        __ InstanceCall1(ArgumentCount(), call_ic_data_kidx);
+      }
       break;
     case 2:
-      __ InstanceCall2(ArgumentCount(), call_ic_data_kidx);
-      break;
-    case 3:
-      __ InstanceCall3(ArgumentCount(), call_ic_data_kidx);
+      if (compiler->is_optimizing()) {
+        __ InstanceCall2Opt(ArgumentCount(), call_ic_data_kidx);
+      } else {
+        __ InstanceCall2(ArgumentCount(), call_ic_data_kidx);
+      }
       break;
     default:
       UNIMPLEMENTED();
@@ -3146,6 +3153,11 @@
   compiler->AddCurrentDescriptor(RawPcDescriptors::kIcCall,
                                  deopt_id(),
                                  token_pos());
+  compiler->RecordAfterCall(this);
+
+  if (compiler->is_optimizing()) {
+    __ PopLocal(locs()->out(0).reg());
+  }
 #endif  // !defined(TARGET_ARCH_DBC)
 }
 
@@ -3252,6 +3264,12 @@
   compiler->AddCurrentDescriptor(RawPcDescriptors::kUnoptStaticCall,
                                  deopt_id(),
                                  token_pos());
+
+  compiler->RecordAfterCall(this);
+
+  if (compiler->is_optimizing()) {
+    __ PopLocal(locs()->out(0).reg());
+  }
 #endif  // !defined(TARGET_ARCH_DBC)
 }
 
@@ -3266,7 +3284,10 @@
   // DBC does not use LocationSummaries in the same way as other architectures.
 #if !defined(TARGET_ARCH_DBC)
   ASSERT(locs()->in(0).reg() == locs()->out(0).reg());
-#endif
+#else
+  ASSERT(!compiler->is_optimizing() ||
+         (locs()->in(0).reg() == locs()->out(0).reg()));
+#endif  // !defined(TARGET_ARCH_DBC)
 }
 
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index a7f3d7f..be04e5e 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -3032,7 +3032,8 @@
                 const ZoneGrowableArray<intptr_t>& cid_results,
                 intptr_t deopt_id)
       : ComparisonInstr(token_pos, kind, value, NULL, deopt_id),
-        cid_results_(cid_results) {
+        cid_results_(cid_results),
+        licm_hoisted_(false) {
     ASSERT((kind == Token::kIS) || (kind == Token::kISNOT));
     set_operation_cid(kObjectCid);
   }
@@ -3067,10 +3068,13 @@
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
 
+  void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
   const ZoneGrowableArray<intptr_t>& cid_results_;
+  bool licm_hoisted_;
   DISALLOW_COPY_AND_ASSIGN(TestCidsInstr);
 };
 
@@ -7788,6 +7792,7 @@
   virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const;
 
+  bool licm_hoisted() const { return licm_hoisted_; }
   void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
 
   PRINT_OPERANDS_TO_SUPPORT
@@ -7823,6 +7828,7 @@
 
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
+  bool licm_hoisted() const { return licm_hoisted_; }
   void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
 
  private:
@@ -8188,6 +8194,17 @@
   // from the copy.
   Environment* DeepCopy(Zone* zone, intptr_t length) const;
 
+#if defined(TARGET_ARCH_DBC)
+  // Return/ReturnTOS instruction drops incoming arguments so
+  // we have to drop outgoing arguments from the innermost environment.
+  // On all other architectures caller drops outgoing arguments itself
+  // hence the difference.
+  // Note: this method can only be used at the code generation stage because
+  // it mutates environment in unsafe way (e.g. does not update def-use
+  // chains).
+  void DropArguments(intptr_t argc);
+#endif
+
  private:
   friend class ShallowIterator;
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 4123a2a..a0fa8cc 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -763,8 +763,11 @@
   const Register val_reg = locs()->in(0).reg();
   const Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+  Label* deopt = CanDeoptimize()
+      ? compiler->AddDeoptStub(deopt_id(),
+                               ICData::kDeoptTestCids,
+                               licm_hoisted_ ? ICData::kHoisted : 0)
+      : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 29eae7d..9d167dc 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -639,8 +639,11 @@
   const Register val_reg = locs()->in(0).reg();
   const Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+  Label* deopt = CanDeoptimize()
+      ? compiler->AddDeoptStub(deopt_id(),
+                               ICData::kDeoptTestCids,
+                               licm_hoisted_ ? ICData::kHoisted : 0)
+      : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
diff --git a/runtime/vm/intermediate_language_dbc.cc b/runtime/vm/intermediate_language_dbc.cc
index c4399e0..16a2baf 100644
--- a/runtime/vm/intermediate_language_dbc.cc
+++ b/runtime/vm/intermediate_language_dbc.cc
@@ -119,36 +119,40 @@
 
 // Location summaries actually are not used by the unoptimizing DBC compiler
 // because we don't allocate any registers.
-static LocationSummary* CreateLocationSummary(Zone* zone,
-                                              intptr_t num_inputs,
-                                              bool has_result) {
+static LocationSummary* CreateLocationSummary(
+    Zone* zone,
+    intptr_t num_inputs,
+    Location output = Location::NoLocation(),
+    LocationSummary::ContainsCall contains_call = LocationSummary::kNoCall) {
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(zone) LocationSummary(
-      zone, num_inputs, kNumTemps, LocationSummary::kNoCall);
+      zone, num_inputs, kNumTemps, contains_call);
   for (intptr_t i = 0; i < num_inputs; i++) {
-    locs->set_in(i, Location::RequiresRegister());
+    locs->set_in(i, (contains_call == LocationSummary::kNoCall) ?
+        Location::RequiresRegister() : Location::RegisterLocation(i));
   }
-  if (has_result) {
-    locs->set_out(0, Location::RequiresRegister());
+  if (!output.IsInvalid()) {
+    // For instructions that call we default to returning result in R0.
+    locs->set_out(0, output);
   }
   return locs;
 }
 
 
-#define DEFINE_MAKE_LOCATION_SUMMARY(Name, In, Out)                            \
+#define DEFINE_MAKE_LOCATION_SUMMARY(Name, ...)                                \
   LocationSummary* Name##Instr::MakeLocationSummary(Zone* zone, bool opt)      \
       const {                                                                  \
-    return CreateLocationSummary(zone, In, Out);                               \
+    return CreateLocationSummary(zone, __VA_ARGS__);                           \
   }                                                                            \
 
-#define EMIT_NATIVE_CODE(Name, In, Out)                                        \
-  DEFINE_MAKE_LOCATION_SUMMARY(Name, In, Out);                                 \
+#define EMIT_NATIVE_CODE(Name, ...)                                            \
+  DEFINE_MAKE_LOCATION_SUMMARY(Name, __VA_ARGS__);                             \
   void Name##Instr::EmitNativeCode(FlowGraphCompiler* compiler)                \
 
 #define DEFINE_UNIMPLEMENTED_MAKE_LOCATION_SUMMARY(Name)                       \
   LocationSummary* Name##Instr::MakeLocationSummary(Zone* zone, bool opt)      \
       const {                                                                  \
-    UNIMPLEMENTED();                                                           \
+    if (!opt) UNIMPLEMENTED();                                                 \
     return NULL;                                                               \
   }                                                                            \
 
@@ -181,51 +185,63 @@
 DEFINE_UNIMPLEMENTED_EMIT_BRANCH_CODE(EqualityCompare)
 
 
-DEFINE_MAKE_LOCATION_SUMMARY(AssertAssignable, 2, true);
+DEFINE_MAKE_LOCATION_SUMMARY(AssertAssignable, 2, Location::SameAsFirstInput());
 
 
-EMIT_NATIVE_CODE(AssertBoolean, 1, true) {
+EMIT_NATIVE_CODE(AssertBoolean,
+                 1, Location::SameAsFirstInput(),
+                 LocationSummary::kCall) {
+  if (compiler->is_optimizing()) {
+    __ Push(locs()->in(0).reg());
+  }
   __ AssertBoolean(Isolate::Current()->type_checks() ? 1 : 0);
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
                                  deopt_id(),
                                  token_pos());
+  if (compiler->is_optimizing()) {
+    __ Drop1();
+  }
 }
 
 
-LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(Zone* zone,
-                                                        bool optimizing) const {
+LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
+    Zone* zone, bool optimizing) const {
   return MakeCallSummary(zone);
 }
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  compiler->Bailout(ToCString());
 }
 
 
-EMIT_NATIVE_CODE(CheckStackOverflow, 0, false) {
+EMIT_NATIVE_CODE(CheckStackOverflow,
+                 0, Location::NoLocation(),
+                 LocationSummary::kCall) {
   __ CheckStack();
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                                  Thread::kNoDeoptId,
                                  token_pos());
 }
 
 
-EMIT_NATIVE_CODE(PushArgument, 1, false) {
+EMIT_NATIVE_CODE(PushArgument, 1) {
   if (compiler->is_optimizing()) {
     __ Push(locs()->in(0).reg());
   }
 }
 
 
-EMIT_NATIVE_CODE(LoadLocal, 0, false) {
+EMIT_NATIVE_CODE(LoadLocal, 0) {
   ASSERT(!compiler->is_optimizing());
   ASSERT(local().index() != 0);
   __ Push((local().index() > 0) ? (-local().index()) : (-local().index() - 1));
 }
 
 
-EMIT_NATIVE_CODE(StoreLocal, 0, false) {
+EMIT_NATIVE_CODE(StoreLocal, 0) {
   ASSERT(!compiler->is_optimizing());
   ASSERT(local().index() != 0);
   if (HasTemp()) {
@@ -238,7 +254,7 @@
 }
 
 
-EMIT_NATIVE_CODE(LoadClassId, 1, true) {
+EMIT_NATIVE_CODE(LoadClassId, 1, Location::RequiresRegister()) {
   if (compiler->is_optimizing()) {
     __ LoadClassId(locs()->out(0).reg(), locs()->in(0).reg());
   } else {
@@ -247,40 +263,80 @@
 }
 
 
-EMIT_NATIVE_CODE(Constant, 0, true) {
-  const intptr_t kidx = __ AddConstant(value());
+EMIT_NATIVE_CODE(Constant, 0, Location::RequiresRegister()) {
   if (compiler->is_optimizing()) {
-    __ LoadConstant(locs()->out(0).reg(), kidx);
+    __ LoadConstant(locs()->out(0).reg(), value());
   } else {
-    __ PushConstant(kidx);
+    __ PushConstant(value());
   }
 }
 
 
-EMIT_NATIVE_CODE(Return, 1, false) {
-  __ ReturnTOS();
+EMIT_NATIVE_CODE(Return, 1) {
+  if (compiler->is_optimizing()) {
+    __ Return(locs()->in(0).reg());
+  } else {
+    __ ReturnTOS();
+  }
 }
 
 
-EMIT_NATIVE_CODE(StoreStaticField, 1, false) {
-  const intptr_t kidx = __ AddConstant(field());
-  __ StoreStaticTOS(kidx);
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(
+    Zone* zone, bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs = new(zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  for (intptr_t i = 0; i < kNumInputs; i++) {
+    locs->set_in(i, Location::RequiresRegister());
+  }
+  for (intptr_t i = 0; i < kNumTemps; i++) {
+    locs->set_temp(i, Location::RequiresRegister());
+  }
+  return locs;
 }
 
 
-EMIT_NATIVE_CODE(LoadStaticField, 1, true) {
-  const intptr_t kidx = __ AddConstant(StaticField());
-  __ PushStatic(kidx);
+void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (compiler->is_optimizing()) {
+    __ LoadConstant(locs()->temp(0).reg(),
+                    Field::ZoneHandle(field().Original()));
+    __ StoreField(locs()->temp(0).reg(),
+                  Field::static_value_offset() / kWordSize,
+                  locs()->in(0).reg());
+  } else {
+    const intptr_t kidx = __ AddConstant(field());
+    __ StoreStaticTOS(kidx);
+  }
 }
 
 
-EMIT_NATIVE_CODE(InitStaticField, 0, false) {
+EMIT_NATIVE_CODE(LoadStaticField, 1, Location::RequiresRegister()) {
+  if (compiler->is_optimizing()) {
+    __ LoadField(locs()->out(0).reg(),
+                 locs()->in(0).reg(),
+                 Field::static_value_offset() / kWordSize);
+  } else {
+    const intptr_t kidx = __ AddConstant(StaticField());
+    __ PushStatic(kidx);
+  }
+}
+
+
+EMIT_NATIVE_CODE(InitStaticField, 0) {
   ASSERT(!compiler->is_optimizing());
   __ InitStaticTOS();
 }
 
 
-EMIT_NATIVE_CODE(ClosureCall, 0, false) {
+EMIT_NATIVE_CODE(ClosureCall,
+                 1,
+                 Location::RegisterLocation(0),
+                 LocationSummary::kCall) {
+  if (compiler->is_optimizing()) {
+    __ Push(locs()->in(0).reg());
+  }
+
   intptr_t argument_count = ArgumentCount();
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
@@ -288,20 +344,11 @@
   const intptr_t argdesc_kidx =
       compiler->assembler()->AddConstant(arguments_descriptor);
   __ StaticCall(argument_count, argdesc_kidx);
+  compiler->RecordAfterCall(this);
 
-  compiler->RecordSafepoint(locs());
-  // Marks either the continuation point in unoptimized code or the
-  // deoptimization point in optimized code, after call.
-  const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id());
   if (compiler->is_optimizing()) {
-    compiler->AddDeoptIndexAtCall(deopt_id_after, token_pos());
+    __ PopLocal(locs()->out(0).reg());
   }
-  // Add deoptimization continuation point after the call and before the
-  // arguments are removed.
-  // In optimized code this descriptor is needed for exception handling.
-  compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                 deopt_id_after,
-                                 token_pos());
 }
 
 
@@ -327,18 +374,39 @@
                                                  BranchLabels labels) {
   ASSERT((kind() == Token::kNE_STRICT) ||
          (kind() == Token::kEQ_STRICT));
-  const Bytecode::Opcode eq_op = needs_number_check() ?
-      Bytecode::kIfEqStrictNumTOS : Bytecode::kIfEqStrictTOS;
-  const Bytecode::Opcode ne_op = needs_number_check() ?
-      Bytecode::kIfNeStrictNumTOS : Bytecode::kIfNeStrictTOS;
 
-  if (kind() == Token::kEQ_STRICT) {
-    __ Emit((labels.fall_through == labels.false_label) ? eq_op : ne_op);
+  if (!compiler->is_optimizing()) {
+    const Bytecode::Opcode eq_op = needs_number_check() ?
+        Bytecode::kIfEqStrictNumTOS : Bytecode::kIfEqStrictTOS;
+    const Bytecode::Opcode ne_op = needs_number_check() ?
+        Bytecode::kIfNeStrictNumTOS : Bytecode::kIfNeStrictTOS;
+
+    if (kind() == Token::kEQ_STRICT) {
+      __ Emit((labels.fall_through == labels.false_label) ? eq_op : ne_op);
+    } else {
+      __ Emit((labels.fall_through == labels.false_label) ? ne_op : eq_op);
+    }
   } else {
-    __ Emit((labels.fall_through == labels.false_label) ? ne_op : eq_op);
+    const Bytecode::Opcode eq_op = needs_number_check() ?
+        Bytecode::kIfEqStrictNum : Bytecode::kIfEqStrict;
+    const Bytecode::Opcode ne_op = needs_number_check() ?
+        Bytecode::kIfNeStrictNum : Bytecode::kIfNeStrict;
+
+    if (kind() == Token::kEQ_STRICT) {
+      __ Emit(Bytecode::Encode(
+          (labels.fall_through == labels.false_label) ? eq_op : ne_op,
+          locs()->in(0).reg(),
+          locs()->in(1).reg()));
+    } else {
+      __ Emit(Bytecode::Encode(
+          (labels.fall_through == labels.false_label) ? ne_op : eq_op,
+          locs()->in(0).reg(),
+          locs()->in(1).reg()));
+    }
   }
 
   if (needs_number_check() && token_pos().IsReal()) {
+    compiler->RecordSafepoint(locs());
     compiler->AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall,
                                    Thread::kNoDeoptId,
                                    token_pos());
@@ -358,7 +426,11 @@
 }
 
 
-EMIT_NATIVE_CODE(StrictCompare, 2, true) {
+EMIT_NATIVE_CODE(StrictCompare,
+                 2,
+                 Location::RequiresRegister(),
+                 needs_number_check() ? LocationSummary::kCall
+                                      : LocationSummary::kNoCall) {
   ASSERT((kind() == Token::kEQ_STRICT) ||
          (kind() == Token::kNE_STRICT));
 
@@ -367,18 +439,31 @@
   Condition true_condition = EmitComparisonCode(compiler, labels);
   EmitBranchOnCondition(compiler, true_condition, labels);
   Label done;
-  __ Bind(&is_false);
-  __ PushConstant(Bool::False());
-  __ Jump(&done);
-  __ Bind(&is_true);
-  __ PushConstant(Bool::True());
-  __ Bind(&done);
+  if (compiler->is_optimizing()) {
+    const Register result = locs()->out(0).reg();
+    __ Bind(&is_false);
+    __ LoadConstant(result, Bool::False());
+    __ Jump(&done);
+    __ Bind(&is_true);
+    __ LoadConstant(result, Bool::True());
+    __ Bind(&done);
+  } else {
+    __ Bind(&is_false);
+    __ PushConstant(Bool::False());
+    __ Jump(&done);
+    __ Bind(&is_true);
+    __ PushConstant(Bool::True());
+    __ Bind(&done);
+  }
 }
 
 
 LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
                                                   bool opt) const {
   comparison()->InitializeLocationSummary(zone, opt);
+  if (!comparison()->HasLocs()) {
+    return NULL;
+  }
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -390,7 +475,7 @@
 }
 
 
-EMIT_NATIVE_CODE(Goto, 0, false) {
+EMIT_NATIVE_CODE(Goto, 0) {
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
   }
@@ -402,28 +487,60 @@
 }
 
 
-EMIT_NATIVE_CODE(CreateArray, 2, true) {
+EMIT_NATIVE_CODE(CreateArray,
+                 2, Location::RequiresRegister(),
+                 LocationSummary::kCall) {
+  if (compiler->is_optimizing()) {
+    __ Push(locs()->in(0).reg());
+    __ Push(locs()->in(1).reg());
+  }
   __ CreateArrayTOS();
+  compiler->RecordSafepoint(locs());
+  if (compiler->is_optimizing()) {
+    __ PopLocal(locs()->out(0).reg());
+  }
 }
 
 
-EMIT_NATIVE_CODE(StoreIndexed, 3, false) {
-  ASSERT(class_id() == kArrayCid);
-  __ StoreIndexedTOS();
+EMIT_NATIVE_CODE(StoreIndexed, 3) {
+  if (compiler->is_optimizing()) {
+    if (class_id() != kArrayCid) {
+      compiler->Bailout(ToCString());
+    }
+
+    __ StoreIndexed(locs()->in(kArrayPos).reg(),
+                    locs()->in(kIndexPos).reg(),
+                    locs()->in(kValuePos).reg());
+  } else {
+    ASSERT(class_id() == kArrayCid);
+    __ StoreIndexedTOS();
+  }
 }
 
 
-EMIT_NATIVE_CODE(StringInterpolate, 0, false) {
+EMIT_NATIVE_CODE(StringInterpolate,
+                 1, Location::RegisterLocation(0),
+                 LocationSummary::kCall) {
+  if (compiler->is_optimizing()) {
+    __ Push(locs()->in(0).reg());
+  }
   const intptr_t kArgumentCount = 1;
   const Array& arguments_descriptor = Array::Handle(
       ArgumentsDescriptor::New(kArgumentCount, Object::null_array()));
   __ PushConstant(CallFunction());
   const intptr_t argdesc_kidx = __ AddConstant(arguments_descriptor);
   __ StaticCall(kArgumentCount, argdesc_kidx);
+  compiler->RecordAfterCall(this);
+
+  if (compiler->is_optimizing()) {
+    __ PopLocal(locs()->out(0).reg());
+  }
 }
 
 
-EMIT_NATIVE_CODE(NativeCall, 0, false) {
+EMIT_NATIVE_CODE(NativeCall,
+                 0, Location::NoLocation(),
+                 LocationSummary::kCall) {
   SetupNative();
 
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
@@ -441,13 +558,16 @@
   } else {
     __ NativeCall();
   }
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
                                  Thread::kNoDeoptId,
                                  token_pos());
 }
 
 
-EMIT_NATIVE_CODE(AllocateObject, 0, true) {
+EMIT_NATIVE_CODE(AllocateObject,
+                 0, Location::RequiresRegister(),
+                 LocationSummary::kCall) {
   if (ArgumentCount() == 1) {
     __ PushConstant(cls());
     __ AllocateT();
@@ -461,10 +581,14 @@
                                    Thread::kNoDeoptId,
                                    token_pos());
   }
+  compiler->RecordSafepoint(locs());
+  if (compiler->is_optimizing()) {
+    __ PopLocal(locs()->out(0).reg());
+  }
 }
 
 
-EMIT_NATIVE_CODE(StoreInstanceField, 2, false) {
+EMIT_NATIVE_CODE(StoreInstanceField, 2) {
   ASSERT(!HasTemp());
   ASSERT(offset_in_bytes() % kWordSize == 0);
   if (compiler->is_optimizing()) {
@@ -477,34 +601,52 @@
 }
 
 
-EMIT_NATIVE_CODE(LoadField, 1, true) {
+EMIT_NATIVE_CODE(LoadField, 1, Location::RequiresRegister()) {
   ASSERT(offset_in_bytes() % kWordSize == 0);
-  __ LoadFieldTOS(offset_in_bytes() / kWordSize);
+  if (compiler->is_optimizing()) {
+    const Register result = locs()->out(0).reg();
+    const Register instance = locs()->in(0).reg();
+    __ LoadField(result, instance, offset_in_bytes() / kWordSize);
+  } else {
+    __ LoadFieldTOS(offset_in_bytes() / kWordSize);
+  }
 }
 
 
-EMIT_NATIVE_CODE(BooleanNegate, 1, true) {
-  __ BooleanNegateTOS();
+EMIT_NATIVE_CODE(BooleanNegate, 1, Location::RequiresRegister()) {
+  if (compiler->is_optimizing()) {
+    __ BooleanNegate(locs()->out(0).reg(), locs()->in(0).reg());
+  } else {
+    __ BooleanNegateTOS();
+  }
 }
 
 
-EMIT_NATIVE_CODE(AllocateContext, 0, false) {
+EMIT_NATIVE_CODE(AllocateContext,
+                 0, Location::RequiresRegister(),
+                 LocationSummary::kCall) {
+  ASSERT(!compiler->is_optimizing());
   __ AllocateContext(num_context_variables());
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
                                  Thread::kNoDeoptId,
                                  token_pos());
 }
 
 
-EMIT_NATIVE_CODE(CloneContext, 0, false) {
+EMIT_NATIVE_CODE(CloneContext,
+                 1, Location::RequiresRegister(),
+                 LocationSummary::kCall) {
+  ASSERT(!compiler->is_optimizing());
   __ CloneContext();
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
                                  Thread::kNoDeoptId,
                                  token_pos());
 }
 
 
-EMIT_NATIVE_CODE(CatchBlockEntry, 0, false) {
+EMIT_NATIVE_CODE(CatchBlockEntry, 0) {
   __ Bind(compiler->GetJumpLabel(this));
   compiler->AddExceptionHandler(catch_try_index(),
                                 try_index(),
@@ -519,8 +661,9 @@
 }
 
 
-EMIT_NATIVE_CODE(Throw, 0, false) {
+EMIT_NATIVE_CODE(Throw, 0, Location::NoLocation(), LocationSummary::kCall) {
   __ Throw(0);
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
                                  deopt_id(),
                                  token_pos());
@@ -528,29 +671,48 @@
 }
 
 
-EMIT_NATIVE_CODE(ReThrow, 0, false) {
+EMIT_NATIVE_CODE(ReThrow, 0, Location::NoLocation(), LocationSummary::kCall) {
   compiler->SetNeedsStacktrace(catch_try_index());
   __ Throw(1);
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
                                  deopt_id(),
                                  token_pos());
   __ Trap();
 }
 
-EMIT_NATIVE_CODE(InstantiateType, 1, true) {
+EMIT_NATIVE_CODE(InstantiateType,
+                 1, Location::RequiresRegister(),
+                 LocationSummary::kCall) {
+  if (compiler->is_optimizing()) {
+    __ Push(locs()->in(0).reg());
+  }
   __ InstantiateType(__ AddConstant(type()));
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
                                  deopt_id(),
                                  token_pos());
+  if (compiler->is_optimizing()) {
+    __ PopLocal(locs()->out(0).reg());
+  }
 }
 
-EMIT_NATIVE_CODE(InstantiateTypeArguments, 1, true) {
+EMIT_NATIVE_CODE(InstantiateTypeArguments,
+                 1, Location::RequiresRegister(),
+                 LocationSummary::kCall) {
+  if (compiler->is_optimizing()) {
+    __ Push(locs()->in(0).reg());
+  }
   __ InstantiateTypeArgumentsTOS(
       type_arguments().IsRawInstantiatedRaw(type_arguments().Length()),
       __ AddConstant(type_arguments()));
+  compiler->RecordSafepoint(locs());
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther,
                                  deopt_id(),
                                  token_pos());
+  if (compiler->is_optimizing()) {
+    __ PopLocal(locs()->out(0).reg());
+  }
 }
 
 
@@ -570,7 +732,9 @@
 LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
   LocationSummary* result = new(zone) LocationSummary(
       zone, 0, 0, LocationSummary::kCall);
-  result->set_out(0, Location::RequiresRegister());
+  // TODO(vegorov) support allocating out registers for calls.
+  // Currently we require them to be fixed.
+  result->set_out(0, Location::RegisterLocation(0));
   return result;
 }
 
@@ -624,6 +788,8 @@
     case kTypedDataUint16ArrayCid:
     case kOneByteStringCid:
     case kTwoByteStringCid:
+    case kExternalOneByteStringCid:
+    case kExternalTwoByteStringCid:
       return CompileType::FromCid(kSmiCid);
 
     case kTypedDataInt32ArrayCid:
@@ -650,6 +816,8 @@
     case kTypedDataUint16ArrayCid:
     case kOneByteStringCid:
     case kTwoByteStringCid:
+    case kExternalOneByteStringCid:
+    case kExternalTwoByteStringCid:
       return kTagged;
     case kTypedDataInt32ArrayCid:
       return kUnboxedInt32;
@@ -680,6 +848,9 @@
   switch (class_id_) {
     case kArrayCid:
     case kOneByteStringCid:
+    case kTwoByteStringCid:
+    case kExternalOneByteStringCid:
+    case kExternalTwoByteStringCid:
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ArrayCid:
@@ -707,6 +878,23 @@
   }
 }
 
+
+void Environment::DropArguments(intptr_t argc) {
+#if defined(DEBUG)
+    // Check that we are in the backend - register allocation has been run.
+    ASSERT(locations_ != NULL);
+
+    // Check that we are only dropping PushArgument instructions from the
+    // environment.
+    ASSERT(argc <= values_.length());
+    for (intptr_t i = 0; i < argc; i++) {
+      ASSERT(values_[values_.length() - i - 1]->definition()->IsPushArgument());
+    }
+#endif
+    values_.TruncateTo(values_.length() - argc);
+}
+
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_DBC
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 5a7d5ce..aa3c355 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -658,8 +658,11 @@
   Register val_reg = locs()->in(0).reg();
   Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+  Label* deopt = CanDeoptimize()
+      ? compiler->AddDeoptStub(deopt_id(),
+                               ICData::kDeoptTestCids,
+                               licm_hoisted_ ? ICData::kHoisted : 0)
+      : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index b1b078f..6b9100b 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -832,8 +832,11 @@
   Register val_reg = locs()->in(0).reg();
   Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+  Label* deopt = CanDeoptimize()
+      ? compiler->AddDeoptStub(deopt_id(),
+                               ICData::kDeoptTestCids,
+                               licm_hoisted_ ? ICData::kHoisted : 0)
+      : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 28159ed..2b71a16 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -637,8 +637,11 @@
   Register val_reg = locs()->in(0).reg();
   Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+  Label* deopt = CanDeoptimize()
+      ? compiler->AddDeoptStub(deopt_id(),
+                               ICData::kDeoptTestCids,
+                               licm_hoisted_ ? ICData::kHoisted : 0)
+      : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
@@ -5183,6 +5186,8 @@
       (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 3 : 1;
   LocationSummary* result = new(zone) LocationSummary(
       zone, InputCount(), kNumTemps, LocationSummary::kCall);
+  ASSERT(R13 != CALLEE_SAVED_TEMP);
+  ASSERT(((1 << R13) & CallingConventions::kCalleeSaveCpuRegisters) != 0);
   result->set_temp(0, Location::RegisterLocation(R13));
   result->set_in(0, Location::FpuRegisterLocation(XMM2));
   if (InputCount() == 2) {
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 119fd7a..e17abcb 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -33,7 +33,16 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
+static bool IsABIPreservedRegister(Register reg) {
+  return ((1 << reg) & kAbiPreservedCpuRegs) != 0;
+}
+
+
 void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  ASSERT(IsABIPreservedRegister(CODE_REG));
+  ASSERT(IsABIPreservedRegister(ARGS_DESC_REG));
+  ASSERT(IsABIPreservedRegister(CALLEE_SAVED_TEMP));
+
   // Save LR by moving it to a callee saved temporary register.
   assembler->Comment("IntrinsicCallPrologue");
   assembler->mov(CALLEE_SAVED_TEMP, Operand(LR));
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index 0ca8c25..fbaa1677 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -32,17 +32,31 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
+static bool IsABIPreservedRegister(Register reg) {
+  return ((1 << reg) & kAbiPreservedCpuRegs) != 0;
+}
+
+
 void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  ASSERT(IsABIPreservedRegister(CODE_REG));
+  ASSERT(!IsABIPreservedRegister(ARGS_DESC_REG));
+  ASSERT(IsABIPreservedRegister(CALLEE_SAVED_TEMP));
+  ASSERT(IsABIPreservedRegister(CALLEE_SAVED_TEMP2));
+  ASSERT(CALLEE_SAVED_TEMP != CODE_REG);
+  ASSERT(CALLEE_SAVED_TEMP != ARGS_DESC_REG);
+  ASSERT(CALLEE_SAVED_TEMP2 != CODE_REG);
+  ASSERT(CALLEE_SAVED_TEMP2 != ARGS_DESC_REG);
+
   assembler->Comment("IntrinsicCallPrologue");
   assembler->mov(CALLEE_SAVED_TEMP, LR);
-  assembler->mov(CALLEE_SAVED_TEMP2, R4);
+  assembler->mov(CALLEE_SAVED_TEMP2, ARGS_DESC_REG);
 }
 
 
 void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
   assembler->Comment("IntrinsicCallEpilogue");
   assembler->mov(LR, CALLEE_SAVED_TEMP);
-  assembler->mov(R4, CALLEE_SAVED_TEMP2);
+  assembler->mov(ARGS_DESC_REG, CALLEE_SAVED_TEMP2);
 }
 
 
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 576c6a0..130b5d6 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -41,16 +41,16 @@
 
 
 void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  COMPILE_ASSERT(CALLEE_SAVED_TEMP != ARGS_DESC_REG);
+
   assembler->Comment("IntrinsicCallPrologue");
-  assembler->movl(CALLEE_SAVED_TEMP, ICREG);
-  assembler->movl(CALLEE_SAVED_TEMP2, ARGS_DESC_REG);
+  assembler->movl(CALLEE_SAVED_TEMP, ARGS_DESC_REG);
 }
 
 
 void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
   assembler->Comment("IntrinsicCallEpilogue");
-  assembler->movl(ICREG, CALLEE_SAVED_TEMP);
-  assembler->movl(ARGS_DESC_REG, CALLEE_SAVED_TEMP2);
+  assembler->movl(ARGS_DESC_REG, CALLEE_SAVED_TEMP);
 }
 
 
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index ea2183c..d8da470 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -32,15 +32,25 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
+static bool IsABIPreservedRegister(Register reg) {
+  return ((1 << reg) & kAbiPreservedCpuRegs) != 0;
+}
+
 void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  ASSERT(IsABIPreservedRegister(CODE_REG));
+  ASSERT(IsABIPreservedRegister(ARGS_DESC_REG));
+  ASSERT(IsABIPreservedRegister(CALLEE_SAVED_TEMP));
+  ASSERT(CALLEE_SAVED_TEMP != CODE_REG);
+  ASSERT(CALLEE_SAVED_TEMP != ARGS_DESC_REG);
+
   assembler->Comment("IntrinsicCallPrologue");
-  assembler->mov(CALLEE_SAVED_TEMP, RA);
+  assembler->mov(CALLEE_SAVED_TEMP, LRREG);
 }
 
 
 void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
   assembler->Comment("IntrinsicCallEpilogue");
-  assembler->mov(RA, CALLEE_SAVED_TEMP);
+  assembler->mov(LRREG, CALLEE_SAVED_TEMP);
 }
 
 
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 58f096d..5ac5d39 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -32,15 +32,26 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return 0; }
 
 
+static bool IsABIPreservedRegister(Register reg) {
+  return ((1 << reg) & CallingConventions::kCalleeSaveCpuRegisters) != 0;
+}
+
+
 void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  ASSERT(IsABIPreservedRegister(CODE_REG));
+  ASSERT(!IsABIPreservedRegister(ARGS_DESC_REG));
+  ASSERT(IsABIPreservedRegister(CALLEE_SAVED_TEMP));
+  ASSERT(CALLEE_SAVED_TEMP != CODE_REG);
+  ASSERT(CALLEE_SAVED_TEMP != ARGS_DESC_REG);
+
   assembler->Comment("IntrinsicCallPrologue");
-  assembler->movq(CALLEE_SAVED_TEMP, R10);
+  assembler->movq(CALLEE_SAVED_TEMP, ARGS_DESC_REG);
 }
 
 
 void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
   assembler->Comment("IntrinsicCallEpilogue");
-  assembler->movq(R10, CALLEE_SAVED_TEMP);
+  assembler->movq(ARGS_DESC_REG, CALLEE_SAVED_TEMP);
 }
 
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 11f5536..b184f6c 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -822,12 +822,10 @@
       all_classes_finalized_(false),
       next_(NULL),
       pause_loop_monitor_(NULL),
-      field_invalidation_gen_(kInvalidGen),
       loading_invalidation_gen_(kInvalidGen),
       top_level_parsing_count_(0),
       field_list_mutex_(new Mutex()),
       boxed_field_list_(GrowableObjectArray::null()),
-      disabling_field_list_(GrowableObjectArray::null()),
       spawn_count_monitor_(new Monitor()),
       spawn_count_(0),
       has_attempted_reload_(false),
@@ -1610,9 +1608,11 @@
   FinalizeWeakPersistentHandlesVisitor visitor;
   api_state()->weak_persistent_handles().VisitHandles(&visitor);
 
+  if (FLAG_dump_megamorphic_stats) {
+    MegamorphicCacheTable::PrintSizes(this);
+  }
   if (FLAG_trace_isolates) {
     heap()->PrintSizes();
-    MegamorphicCacheTable::PrintSizes(this);
     Symbols::DumpStats();
     OS::Print("[-] Stopping isolate:\n"
               "\tisolate:    %s\n", name());
@@ -1766,12 +1766,6 @@
   // when at safepoint or the field_list_mutex_ lock has been taken.
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_));
 
-  // Visit the disabling_field_list.
-  // 'disabling_field_list_' access via mutator and background compilation
-  // threads is guarded with a monitor. This means that we can visit it only
-  // when at safepoint or the field_list_mutex_ lock has been taken.
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&disabling_field_list_));
-
   // Visit objects in the debugger.
   if (FLAG_support_debugger) {
     debugger()->VisitObjectPointers(visitor);
@@ -2020,50 +2014,6 @@
 }
 
 
-// Used by mutator thread to notify background compiler which fields
-// triggered code invalidation.
-void Isolate::AddDisablingField(const Field& field) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  SafepointMutexLocker ml(field_list_mutex_);
-  if (disabling_field_list_ == GrowableObjectArray::null()) {
-    disabling_field_list_ = GrowableObjectArray::New(Heap::kOld);
-  }
-  const GrowableObjectArray& array =
-      GrowableObjectArray::Handle(disabling_field_list_);
-  array.Add(field, Heap::kOld);
-}
-
-
-RawField* Isolate::GetDisablingField() {
-  ASSERT(Compiler::IsBackgroundCompilation() &&
-         (!Isolate::Current()->HasMutatorThread() ||
-         Isolate::Current()->mutator_thread()->IsAtSafepoint()));
-  ASSERT(Thread::Current()->IsAtSafepoint());
-  if (disabling_field_list_ == GrowableObjectArray::null()) {
-    return Field::null();
-  }
-  const GrowableObjectArray& array =
-      GrowableObjectArray::Handle(disabling_field_list_);
-  if (array.Length() == 0) {
-    return Field::null();
-  }
-  return Field::RawCast(array.RemoveLast());
-}
-
-
-void Isolate::ClearDisablingFieldList() {
-  MutexLocker ml(field_list_mutex_);
-  if (disabling_field_list_ == GrowableObjectArray::null()) {
-    return;
-  }
-  const GrowableObjectArray& array =
-      GrowableObjectArray::Handle(disabling_field_list_);
-  if (array.Length() > 0) {
-    array.SetLength(0);
-  }
-}
-
-
 void Isolate::AddDeoptimizingBoxedField(const Field& field) {
   ASSERT(Compiler::IsBackgroundCompilation());
   ASSERT(field.IsOriginal());
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index b418fd6..5c219cc 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -560,14 +560,6 @@
 
   static const intptr_t kInvalidGen = 0;
 
-  void IncrFieldInvalidationGen() {
-    AtomicOperations::IncrementBy(&field_invalidation_gen_, 1);
-    if (field_invalidation_gen_ == kInvalidGen) {
-      AtomicOperations::IncrementBy(&field_invalidation_gen_, 1);
-    }
-  }
-  intptr_t field_invalidation_gen() const { return field_invalidation_gen_; }
-
   void IncrLoadingInvalidationGen() {
     AtomicOperations::IncrementBy(&loading_invalidation_gen_, 1);
     if (loading_invalidation_gen_ == kInvalidGen) {
@@ -578,14 +570,6 @@
     return AtomicOperations::LoadRelaxedIntPtr(&loading_invalidation_gen_);
   }
 
-  // Used by mutator thread to notify background compiler which fields
-  // triggered code invalidation.
-  void AddDisablingField(const Field& field);
-  // Returns Field::null() if none available in the list. Can be called
-  // only from background compiler and while mutator thread is at safepoint.
-  RawField* GetDisablingField();
-  void ClearDisablingFieldList();
-
   // Used by background compiler which field became boxed and must trigger
   // deoptimization in the mutator thread.
   void AddDeoptimizingBoxedField(const Field& field);
@@ -805,17 +789,13 @@
   // Invalidation generations; used to track events occuring in parallel
   // to background compilation. The counters may overflow, which is OK
   // since we check for equality to detect if an event occured.
-  intptr_t field_invalidation_gen_;
   intptr_t loading_invalidation_gen_;
   intptr_t top_level_parsing_count_;
 
-  // Protect access to boxed_field_list_ and disabling_field_list_.
+  // Protect access to boxed_field_list_.
   Mutex* field_list_mutex_;
   // List of fields that became boxed and that trigger deoptimization.
   RawGrowableObjectArray* boxed_field_list_;
-  // List of fields that were disabling code while background compiler
-  // was running.
-  RawGrowableObjectArray* disabling_field_list_;
 
   // This guards spawn_count_. An isolate cannot complete shutdown and be
   // destroyed while there are child isolates in the midst of a spawn.
diff --git a/runtime/vm/jit_optimizer.cc b/runtime/vm/jit_optimizer.cc
index f4d8757..f05813d 100644
--- a/runtime/vm/jit_optimizer.cc
+++ b/runtime/vm/jit_optimizer.cc
@@ -2391,7 +2391,7 @@
             type_class.ToCString());
       }
       if (FLAG_use_cha_deopt) {
-        thread()->cha()->AddToLeafClasses(type_class);
+        thread()->cha()->AddToGuardedClasses(type_class, /*subclass_count=*/0);
       }
     } else {
       return false;
@@ -2917,9 +2917,10 @@
     // usage count of at least 1/kGetterSetterRatio of the getter usage count.
     // This is to avoid unboxing fields where the setter is never or rarely
     // executed.
-    const Field& field = Field::ZoneHandle(Z, instr->field().Original());
+    const Field& field = instr->field();
     const String& field_name = String::Handle(Z, field.name());
-    const Class& owner = Class::Handle(Z, field.Owner());
+    const Class& owner =
+        Class::Handle(Z, Field::Handle(Z, field.Original()).Owner());
     const Function& getter =
         Function::Handle(Z, owner.LookupGetterFunction(field_name));
     const Function& setter =
@@ -2954,6 +2955,7 @@
           OS::Print("  getter usage count: %" Pd "\n", getter.usage_counter());
         }
       }
+      ASSERT(field.IsOriginal());
       field.set_is_unboxing_candidate(false);
       field.DeoptimizeDependentCode();
     } else {
diff --git a/runtime/vm/megamorphic_cache_table.cc b/runtime/vm/megamorphic_cache_table.cc
index 3a55d5a..9b80f80 100644
--- a/runtime/vm/megamorphic_cache_table.cc
+++ b/runtime/vm/megamorphic_cache_table.cc
@@ -91,14 +91,64 @@
   const GrowableObjectArray& table = GrowableObjectArray::Handle(
       isolate->object_store()->megamorphic_cache_table());
   if (table.IsNull()) return;
+  intptr_t max_size = 0;
   for (intptr_t i = 0; i < table.Length(); i++) {
     cache ^= table.At(i);
     buckets = cache.buckets();
     size += MegamorphicCache::InstanceSize();
     size += Array::InstanceSize(buckets.Length());
+    if (buckets.Length() > max_size) {
+      max_size = buckets.Length();
+    }
   }
   OS::Print("%" Pd " megamorphic caches using %" Pd "KB.\n",
             table.Length(), size / 1024);
+
+  intptr_t* probe_counts = new intptr_t[max_size];
+  intptr_t entry_count = 0;
+  intptr_t max_probe_count = 0;
+  for (intptr_t i = 0; i < max_size; i++) {
+    probe_counts[i] = 0;
+  }
+  for (intptr_t i = 0; i < table.Length(); i++) {
+    cache ^= table.At(i);
+    buckets = cache.buckets();
+    intptr_t mask = cache.mask();
+    intptr_t capacity = mask + 1;
+    for (intptr_t j = 0; j < capacity; j++) {
+      intptr_t class_id =
+          Smi::Value(Smi::RawCast(cache.GetClassId(buckets, j)));
+      if (class_id != kIllegalCid) {
+        intptr_t probe_count = 0;
+        intptr_t probe_index =
+            (class_id * MegamorphicCache::kSpreadFactor) & mask;
+        intptr_t probe_cid;
+        while (true) {
+          probe_count++;
+          probe_cid =
+              Smi::Value(Smi::RawCast(cache.GetClassId(buckets, probe_index)));
+          if (probe_cid == class_id) {
+            break;
+          }
+          probe_index = (probe_index + 1) & mask;
+        }
+        probe_counts[probe_count]++;
+        if (probe_count > max_probe_count) {
+          max_probe_count = probe_count;
+        }
+        entry_count++;
+      }
+    }
+  }
+  intptr_t cumulative_entries = 0;
+  for (intptr_t i = 0; i <= max_probe_count; i++) {
+    cumulative_entries += probe_counts[i];
+    OS::Print("Megamorphic probe %" Pd ": %" Pd " (%lf)\n",
+              i, probe_counts[i],
+              static_cast<double>(cumulative_entries) /
+              static_cast<double>(entry_count));
+  }
+  delete probe_counts;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a8ccce5..2230804 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -165,7 +165,7 @@
 RawClass* Object::unwind_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 
 
-const double MegamorphicCache::kLoadFactor = 0.75;
+const double MegamorphicCache::kLoadFactor = 0.50;
 
 
 static void AppendSubString(Zone* zone,
@@ -2753,8 +2753,6 @@
     }
   }
 
-  virtual void IncrementInvalidationGen() {}
-
  private:
   const Class& cls_;
   DISALLOW_COPY_AND_ASSIGN(CHACodeArray);
@@ -7684,10 +7682,6 @@
     }
   }
 
-  virtual void IncrementInvalidationGen() {
-    Isolate::Current()->IncrFieldInvalidationGen();
-  }
-
  private:
   const Field& field_;
   DISALLOW_COPY_AND_ASSIGN(FieldDependentArray);
@@ -7706,14 +7700,19 @@
 void Field::DeoptimizeDependentCode() const {
   ASSERT(Thread::Current()->IsMutatorThread());
   ASSERT(IsOriginal());
-  if (FLAG_background_compilation) {
-    Isolate::Current()->AddDisablingField(*this);
-  }
   FieldDependentArray a(*this);
   a.DisableCode();
 }
 
 
+bool Field::IsConsistentWith(const Field& other) const {
+  return (raw_ptr()->guarded_cid_ == other.raw_ptr()->guarded_cid_) &&
+         (raw_ptr()->is_nullable_ == other.raw_ptr()->is_nullable_) &&
+         (raw_ptr()->guarded_list_length_ ==
+             other.raw_ptr()->guarded_list_length_);
+}
+
+
 bool Field::IsUninitialized() const {
   const Instance& value = Instance::Handle(raw_ptr()->value_.static_value_);
   ASSERT(value.raw() != Object::transition_sentinel().raw());
@@ -10974,8 +10973,6 @@
     }
   }
 
-  virtual void IncrementInvalidationGen() {}
-
  private:
   const LibraryPrefix& prefix_;
   DISALLOW_COPY_AND_ASSIGN(PrefixDependentArray);
@@ -14735,7 +14732,7 @@
          (kLoadFactor * static_cast<double>(mask() + 1)));
   const Array& backing_array = Array::Handle(buckets());
   intptr_t id_mask = mask();
-  intptr_t index = class_id.Value() & id_mask;
+  intptr_t index = (class_id.Value() * kSpreadFactor) & id_mask;
   intptr_t i = index;
   do {
     if (Smi::Value(Smi::RawCast(GetClassId(backing_array, i))) == kIllegalCid) {
@@ -15249,16 +15246,17 @@
     // other instances to be canonical otherwise report error (return false).
     Zone* zone = thread->zone();
     Object& obj = Object::Handle(zone);
-    intptr_t end_field_offset = SizeFromClass() - kWordSize;
-    for (intptr_t field_offset = 0;
-         field_offset <= end_field_offset;
-         field_offset += kWordSize) {
-      obj = *this->FieldAddrAtOffset(field_offset);
+    const intptr_t instance_size = SizeFromClass();
+    ASSERT(instance_size != 0);
+    for (intptr_t offset = Instance::NextFieldOffset();
+         offset < instance_size;
+         offset += kWordSize) {
+      obj = *this->FieldAddrAtOffset(offset);
       if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) {
         if (obj.IsNumber() || obj.IsString()) {
           obj = Instance::Cast(obj).CheckAndCanonicalize(thread, NULL);
           ASSERT(!obj.IsNull());
-          this->SetFieldAtOffset(field_offset, obj);
+          this->SetFieldAtOffset(offset, obj);
         } else {
           ASSERT(error_str != NULL);
           char* chars = OS::SCreate(zone, "field: %s\n", obj.ToCString());
@@ -22414,7 +22412,9 @@
   RawObject* raw = Object::Allocate(WeakProperty::kClassId,
                                     WeakProperty::InstanceSize(),
                                     space);
-  return reinterpret_cast<RawWeakProperty*>(raw);
+  RawWeakProperty* result = reinterpret_cast<RawWeakProperty*>(raw);
+  result->ptr()->next_ = 0;  // Init the list to NULL.
+  return result;
 }
 
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index c517514..30cc72d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -3125,10 +3125,19 @@
   // Return class id that any non-null value read from this field is guaranteed
   // to have or kDynamicCid if such class id is not known.
   // Stores to this field must update this information hence the name.
-  intptr_t guarded_cid() const { return raw_ptr()->guarded_cid_; }
+  intptr_t guarded_cid() const {
+#if defined(DEGUG)
+    Thread* thread = Thread::Current();
+    ASSERT(!IsOriginal() || thread->IsMutator() || thread->IsAtSafepoint());
+#endif
+    return raw_ptr()->guarded_cid_;
+  }
 
   void set_guarded_cid(intptr_t cid) const {
-    ASSERT(Thread::Current()->IsMutatorThread());
+#if defined(DEGUG)
+    Thread* thread = Thread::Current();
+    ASSERT(!IsOriginal() || thread->IsMutator() || thread->IsAtSafepoint());
+#endif
     StoreNonPointer(&raw_ptr()->guarded_cid_, cid);
   }
   static intptr_t guarded_cid_offset() {
@@ -3213,6 +3222,10 @@
   // Deoptimize all dependent code objects.
   void DeoptimizeDependentCode() const;
 
+  // Used by background compiler to check consistency of field copy with its
+  // original.
+  bool IsConsistentWith(const Field& field) const;
+
   bool IsUninitialized() const;
 
   void EvaluateInitializer() const;
@@ -4975,7 +4988,8 @@
 
 class MegamorphicCache : public Object {
  public:
-  static const int kInitialCapacity = 16;
+  static const intptr_t kInitialCapacity = 16;
+  static const intptr_t kSpreadFactor = 7;
   static const double kLoadFactor;
 
   RawArray* buckets() const;
@@ -5018,6 +5032,7 @@
 
  private:
   friend class Class;
+  friend class MegamorphicCacheTable;
 
   static RawMegamorphicCache* New();
 
@@ -8398,6 +8413,7 @@
   }
 
   static void Clear(RawWeakProperty* raw_weak) {
+    ASSERT(raw_weak->ptr()->next_ == 0);
     raw_weak->StorePointer(&(raw_weak->ptr()->key_), Object::null());
     raw_weak->StorePointer(&(raw_weak->ptr()->value_), Object::null());
   }
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index 0ed04ec..3806ed5 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -90,7 +90,9 @@
 }
 
 
+#if !TARGET_OS_IOS
 static mach_timebase_info_data_t timebase_info;
+#endif
 
 
 int64_t OS::GetCurrentMonotonicTicks() {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 7819cd7..a07921f 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -161,12 +161,42 @@
       (field->guarded_cid() == kIllegalCid)) {
     return;
   }
+
   for (intptr_t j = 0; j < guarded_fields_->length(); j++) {
-    if ((*guarded_fields_)[j]->raw() == field->raw()) {
+    const Field* other = (*guarded_fields_)[j];
+    if (field->Original() == other->Original()) {
+      // Abort background compilation early if the guarded state of this field
+      // has changed during compilation. We will not be able to commit
+      // the resulting code anyway.
+      if (Compiler::IsBackgroundCompilation()) {
+        if (!other->IsConsistentWith(*field)) {
+          Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+              "Field's guarded state changed during compilation");
+        }
+      }
       return;
     }
   }
-  guarded_fields_->Add(&Field::ZoneHandle(Z, field->Original()));
+
+  // Note: the list of guarded fields must contain copies during background
+  // compilation because we will look at their guarded_cid when copying
+  // the array of guarded fields from callee into the caller during
+  // inlining.
+  ASSERT(!field->IsOriginal() || Thread::Current()->IsMutatorThread());
+  guarded_fields_->Add(&Field::ZoneHandle(Z, field->raw()));
+}
+
+
+void ParsedFunction::Bailout(const char* origin, const char* reason) const {
+  Report::MessageF(Report::kBailout,
+                   Script::Handle(function_.script()),
+                   function_.token_pos(),
+                   Report::AtLocation,
+                   "%s Bailout in %s: %s",
+                   origin,
+                   String::Handle(function_.name()).ToCString(),
+                   reason);
+  UNREACHABLE();
 }
 
 
@@ -9269,8 +9299,10 @@
     return;
   }
   ASSERT(node->IsReturnNode() || node->IsJumpNode());
+  const intptr_t func_level = current_block_->scope->function_level();
   TryStack* iterator = try_stack_;
-  while (iterator != NULL) {
+  while ((iterator != NULL) &&
+      (iterator->try_block()->scope->function_level() == func_level)) {
     // For continue and break node check if the target label is in scope.
     if (node->IsJumpNode()) {
       SourceLabel* label = node->AsJumpNode()->label();
@@ -14453,6 +14485,11 @@
 }
 
 
+void ParsedFunction::Bailout(const char* origin, const char* reason) const {
+  UNREACHABLE();
+}
+
+
 void Parser::ParseCompilationUnit(const Library& library,
                                   const Script& script) {
   UNREACHABLE();
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index ba284a5..84301f2 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -230,6 +230,8 @@
   // relevant.
   void AddToGuardedFields(const Field* field) const;
 
+  void Bailout(const char* origin, const char* reason) const;
+
  private:
   Thread* thread_;
   const Function& function_;
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
index b366396..52c6e88 100644
--- a/runtime/vm/precompiler.cc
+++ b/runtime/vm/precompiler.cc
@@ -192,57 +192,63 @@
     StackZone stack_zone(T);
     zone_ = stack_zone.GetZone();
 
-    // Make sure class hierarchy is stable before compilation so that CHA
-    // can be used. Also ensures lookup of entry points won't miss functions
-    // because their class hasn't been finalized yet.
-    FinalizeAllClasses();
+    { HANDLESCOPE(T);
+      // Make sure class hierarchy is stable before compilation so that CHA
+      // can be used. Also ensures lookup of entry points won't miss functions
+      // because their class hasn't been finalized yet.
+      FinalizeAllClasses();
 
-    // Precompile static initializers to compute result type information.
-    PrecompileStaticInitializers();
+      // Precompile static initializers to compute result type information.
+      PrecompileStaticInitializers();
 
-    for (intptr_t round = 0; round < FLAG_precompiler_rounds; round++) {
-      if (FLAG_trace_precompiler) {
-        THR_Print("Precompiler round %" Pd "\n", round);
+      for (intptr_t round = 0; round < FLAG_precompiler_rounds; round++) {
+        if (FLAG_trace_precompiler) {
+          THR_Print("Precompiler round %" Pd "\n", round);
+        }
+
+        if (round > 0) {
+          ResetPrecompilerState();
+        }
+
+        // TODO(rmacnak): We should be able to do a more thorough job and drop
+        // some
+        //  - implicit static closures
+        //  - field initializers
+        //  - invoke-field-dispatchers
+        //  - method-extractors
+        // that are needed in early iterations but optimized away in later
+        // iterations.
+        ClearAllCode();
+
+        CollectDynamicFunctionNames();
+
+        // Start with the allocations and invocations that happen from C++.
+        AddRoots(embedder_entry_points);
+
+        // Compile newly found targets and add their callees until we reach a
+        // fixed point.
+        Iterate();
       }
 
-      if (round > 0) {
-        ResetPrecompilerState();
-      }
+      I->set_compilation_allowed(false);
 
-      // TODO(rmacnak): We should be able to do a more thorough job and drop
-      // some
-      //  - implicit static closures
-      //  - field initializers
-      //  - invoke-field-dispatchers
-      //  - method-extractors
-      // that are needed in early iterations but optimized away in later
-      // iterations.
-      ClearAllCode();
+      TraceForRetainedFunctions();
+      DropFunctions();
+      DropFields();
+      TraceTypesFromRetainedClasses();
+      DropTypes();
+      DropTypeArguments();
 
-      CollectDynamicFunctionNames();
-
-      // Start with the allocations and invocations that happen from C++.
-      AddRoots(embedder_entry_points);
-
-      // Compile newly found targets and add their callees until we reach a
-      // fixed point.
-      Iterate();
+      // Clear these before dropping classes as they may hold onto otherwise
+      // dead instances of classes we will remove.
+      I->object_store()->set_compile_time_constants(Array::null_array());
+      I->object_store()->set_unique_dynamic_targets(Array::null_array());
+      Class& null_class = Class::Handle(Z);
+      I->object_store()->set_future_class(null_class);
+      I->object_store()->set_completer_class(null_class);
+      I->object_store()->set_stream_iterator_class(null_class);
+      I->object_store()->set_symbol_class(null_class);
     }
-
-    I->set_compilation_allowed(false);
-
-    TraceForRetainedFunctions();
-    DropFunctions();
-    DropFields();
-    TraceTypesFromRetainedClasses();
-    DropTypes();
-    DropTypeArguments();
-
-    // Clear these before dropping classes as they may hold onto otherwise
-    // dead instances of classes we will remove.
-    I->object_store()->set_compile_time_constants(Array::null_array());
-    I->object_store()->set_unique_dynamic_targets(Array::null_array());
-
     DropClasses();
     DropLibraries();
 
@@ -324,6 +330,8 @@
     Field& field_;
     Function& function_;
   };
+
+  HANDLESCOPE(T);
   StaticInitializerVisitor visitor(Z);
   VisitClasses(&visitor);
 }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index ef5924e..f81f02d 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -256,21 +256,19 @@
   // The tags field which is a part of the object header uses the following
   // bit fields for storing tags.
   enum TagBits {
-    kWatchedBit = 0,
-    kMarkBit = 1,
-    kCanonicalBit = 2,
-    kVMHeapObjectBit = 3,
-    kRememberedBit = 4,
+    kMarkBit = 0,
+    kCanonicalBit = 1,
+    kVMHeapObjectBit = 2,
+    kRememberedBit = 3,
+    kReservedTagPos = 4,  // kReservedBit{100K,1M,10M}
 #if defined(ARCH_IS_32_BIT)
-    kReservedTagPos = 5,  // kReservedBit{100K,1M,10M}
-    kReservedTagSize = 3,
+    kReservedTagSize = 4,
     kSizeTagPos = kReservedTagPos + kReservedTagSize,  // = 8
     kSizeTagSize = 8,
     kClassIdTagPos = kSizeTagPos + kSizeTagSize,  // = 16
     kClassIdTagSize = 16,
 #elif defined(ARCH_IS_64_BIT)
-    kReservedTagPos = 5,  // kReservedBit{100K,1M,10M}
-    kReservedTagSize = 11,
+    kReservedTagSize = 12,
     kSizeTagPos = kReservedTagPos + kReservedTagSize,  // = 16
     kSizeTagSize = 16,
     kClassIdTagPos = kSizeTagPos + kSizeTagSize,  // = 32
@@ -374,21 +372,6 @@
     return TryAcquireTagBit<MarkBit>();
   }
 
-  // Support for GC watched bit.
-  // TODO(iposva): Get rid of this.
-  bool IsWatched() const {
-    return WatchedBit::decode(ptr()->tags_);
-  }
-  void SetWatchedBitUnsynchronized() {
-    ASSERT(!IsWatched());
-    uword tags = ptr()->tags_;
-    ptr()->tags_ = WatchedBit::update(true, tags);
-  }
-  void ClearWatchedBitUnsynchronized() {
-    uword tags = ptr()->tags_;
-    ptr()->tags_ = WatchedBit::update(false, tags);
-  }
-
   // Support for object tags.
   bool IsCanonical() const {
     return CanonicalObjectTag::decode(ptr()->tags_);
@@ -521,8 +504,6 @@
  private:
   uword tags_;  // Various object tags (bits).
 
-  class WatchedBit : public BitField<uword, bool, kWatchedBit, 1> {};
-
   class MarkBit : public BitField<uword, bool, kMarkBit, 1> {};
 
   class RememberedBit : public BitField<uword, bool, kRememberedBit, 1> {};
@@ -1135,15 +1116,12 @@
   RawObject* owner_;  // Function, Null, or a Class.
   RawExceptionHandlers* exception_handlers_;
   RawPcDescriptors* pc_descriptors_;
-  RawCodeSourceMap* code_source_map_;
   RawArray* stackmaps_;
-  RawObject** to_snapshot() {
-    return reinterpret_cast<RawObject**>(&ptr()->stackmaps_);
-  }
   RawArray* deopt_info_array_;
   RawArray* static_calls_target_table_;  // (code-offset, function, code).
   RawLocalVarDescriptors* var_descriptors_;
   RawArray* inlined_metadata_;
+  RawCodeSourceMap* code_source_map_;
   RawArray* comments_;
   // If return_address_metadata_ is a Smi, it is the offset to the prologue.
   // Else, return_address_metadata_ is null.
@@ -2183,7 +2161,10 @@
     return reinterpret_cast<RawObject**>(&ptr()->value_);
   }
 
-  friend class DelaySet;
+  // Linked list is chaining all pending weak properties.
+  // Untyped to make it clear that it is not to be visited by GC.
+  uword next_;
+
   friend class GCMarker;
   template<bool> friend class MarkingVisitorBase;
   friend class Scavenger;
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 5f5a15c..1543db6 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1443,11 +1443,6 @@
 
   (*reader->PassiveObjectHandle()) ^= reader->ReadObjectImpl(kAsReference);
   result.StorePointer(reinterpret_cast<RawObject*const*>(
-                          &result.raw_ptr()->code_source_map_),
-                      reader->PassiveObjectHandle()->raw());
-
-  (*reader->PassiveObjectHandle()) ^= reader->ReadObjectImpl(kAsReference);
-  result.StorePointer(reinterpret_cast<RawObject*const*>(
                           &result.raw_ptr()->stackmaps_),
                       reader->PassiveObjectHandle()->raw());
 
@@ -1459,6 +1454,8 @@
                       LocalVarDescriptors::null());
   result.StorePointer(&result.raw_ptr()->inlined_metadata_,
                       Array::null());
+  result.StorePointer(&result.raw_ptr()->code_source_map_,
+                      CodeSourceMap::null());
   result.StorePointer(&result.raw_ptr()->comments_,
                       Array::null());
   result.StorePointer(&result.raw_ptr()->return_address_metadata_,
@@ -1520,7 +1517,6 @@
   writer->WriteObjectImpl(ptr()->owner_, kAsReference);
   writer->WriteObjectImpl(ptr()->exception_handlers_, kAsReference);
   writer->WriteObjectImpl(ptr()->pc_descriptors_, kAsReference);
-  writer->WriteObjectImpl(ptr()->code_source_map_, kAsReference);
   writer->WriteObjectImpl(ptr()->stackmaps_, kAsReference);
 }
 
diff --git a/runtime/vm/redundancy_elimination.cc b/runtime/vm/redundancy_elimination.cc
index adc1319..93b3951 100644
--- a/runtime/vm/redundancy_elimination.cc
+++ b/runtime/vm/redundancy_elimination.cc
@@ -550,6 +550,8 @@
       case kImmutableArrayCid:
       case kOneByteStringCid:
       case kTwoByteStringCid:
+      case kExternalOneByteStringCid:
+      case kExternalTwoByteStringCid:
         // Object arrays and strings do not allow accessing them through
         // different types. No need to attach scale.
         return kNoSize;
@@ -1353,6 +1355,8 @@
     current->AsCheckEitherNonSmi()->set_licm_hoisted(true);
   } else if (current->IsCheckArrayBound()) {
     current->AsCheckArrayBound()->set_licm_hoisted(true);
+  } else if (current->IsTestCids()) {
+    current->AsTestCids()->set_licm_hoisted(true);
   }
   if (FLAG_trace_optimization) {
     THR_Print("Hoisting instruction %s:%" Pd " from B%" Pd " to B%" Pd "\n",
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index f9cd8c2..f3e98bc 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -52,14 +52,20 @@
     // We cache the Dart stack pointer and the stack limit in callee-saved
     // registers, then align and call, restoring CSP and SP on return from the
     // call.
-    __ mov(R24, CSP);
+    // This sequence may occur in an intrinsic, so don't use registers an
+    // intrinsic must preserve.
+    COMPILE_ASSERT(R23 != CODE_REG);
+    COMPILE_ASSERT(R25 != CODE_REG);
+    COMPILE_ASSERT(R23 != ARGS_DESC_REG);
+    COMPILE_ASSERT(R25 != ARGS_DESC_REG);
+    __ mov(R23, CSP);
     __ mov(R25, SP);
     __ ReserveAlignedFrameSpace(0);
     __ mov(CSP, SP);
     __ ldr(TMP, Address(THR, Thread::OffsetFromThread(this)));
     __ blr(TMP);
     __ mov(SP, R25);
-    __ mov(CSP, R24);
+    __ mov(CSP, R23);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index 2ca7b09..03f0912 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -4,10 +4,6 @@
 
 #include "vm/scavenger.h"
 
-#include <algorithm>
-#include <map>
-#include <utility>
-
 #include "vm/dart.h"
 #include "vm/dart_api_state.h"
 #include "vm/isolate.h"
@@ -18,6 +14,7 @@
 #include "vm/stack_frame.h"
 #include "vm/store_buffer.h"
 #include "vm/thread_registry.h"
+#include "vm/timeline.h"
 #include "vm/verified_memory.h"
 #include "vm/verifier.h"
 #include "vm/visitor.h"
@@ -62,21 +59,6 @@
 }
 
 
-class BoolScope : public ValueObject {
- public:
-  BoolScope(bool* addr, bool value) : _addr(addr), _value(*addr) {
-    *_addr = value;
-  }
-  ~BoolScope() {
-    *_addr = _value;
-  }
-
- private:
-  bool* _addr;
-  bool _value;
-};
-
-
 class ScavengerVisitor : public ObjectPointerVisitor {
  public:
   explicit ScavengerVisitor(Isolate* isolate,
@@ -89,45 +71,23 @@
         heap_(scavenger->heap_),
         vm_heap_(Dart::vm_isolate()->heap()),
         page_space_(scavenger->heap_->old_space()),
-        delayed_weak_stack_(),
         bytes_promoted_(0),
-        visiting_old_object_(NULL),
-        in_scavenge_pointer_(false) { }
+        visiting_old_object_(NULL) { }
 
   void VisitPointers(RawObject** first, RawObject** last) {
+    ASSERT((visiting_old_object_ != NULL) ||
+           scavenger_->Contains(reinterpret_cast<uword>(first)) ||
+           !heap_->Contains(reinterpret_cast<uword>(first)));
     for (RawObject** current = first; current <= last; current++) {
       ScavengePointer(current);
     }
   }
 
-  GrowableArray<RawObject*>* DelayedWeakStack() {
-    return &delayed_weak_stack_;
-  }
-
   void VisitingOldObject(RawObject* obj) {
     ASSERT((obj == NULL) || obj->IsOldObject());
     visiting_old_object_ = obj;
   }
 
-  void DelayWeakProperty(RawWeakProperty* raw_weak) {
-    RawObject* raw_key = raw_weak->ptr()->key_;
-    DelaySet::iterator it = delay_set_.find(raw_key);
-    if (it != delay_set_.end()) {
-      ASSERT(raw_key->IsWatched());
-    } else {
-      ASSERT(!raw_key->IsWatched());
-      raw_key->SetWatchedBitUnsynchronized();
-    }
-    delay_set_.insert(std::make_pair(raw_key, raw_weak));
-  }
-
-  void Finalize() {
-    DelaySet::iterator it = delay_set_.begin();
-    for (; it != delay_set_.end(); ++it) {
-      WeakProperty::Clear(it->second);
-    }
-  }
-
   intptr_t bytes_promoted() const { return bytes_promoted_; }
 
  private:
@@ -147,11 +107,6 @@
 
   void ScavengePointer(RawObject** p) {
     // ScavengePointer cannot be called recursively.
-#ifdef DEBUG
-    ASSERT(!in_scavenge_pointer_);
-    BoolScope bs(&in_scavenge_pointer_, true);
-#endif
-
     RawObject* raw_obj = *p;
 
     if (raw_obj->IsSmiOrOldObject()) {
@@ -169,20 +124,6 @@
       // Get the new location of the object.
       new_addr = ForwardedAddr(header);
     } else {
-      if (raw_obj->IsWatched()) {
-        raw_obj->ClearWatchedBitUnsynchronized();
-        std::pair<DelaySet::iterator, DelaySet::iterator> ret;
-        // Visit all elements with a key equal to this raw_obj.
-        ret = delay_set_.equal_range(raw_obj);
-        for (DelaySet::iterator it = ret.first; it != ret.second; ++it) {
-          // Remember the delayed WeakProperty. These objects have been
-          // forwarded, but have not been scavenged because their key was not
-          // known to be reachable. Now that the key object is known to be
-          // reachable, we need to visit its key and value pointers.
-          delayed_weak_stack_.Add(it->second);
-        }
-        delay_set_.erase(ret.first, ret.second);
-      }
       intptr_t size = raw_obj->Size();
       intptr_t cid = raw_obj->GetClassId();
       ClassTable* class_table = isolate()->class_table();
@@ -240,14 +181,11 @@
   Heap* heap_;
   Heap* vm_heap_;
   PageSpace* page_space_;
-  typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet;
-  DelaySet delay_set_;
-  GrowableArray<RawObject*> delayed_weak_stack_;
-  // TODO(cshapiro): use this value to compute survival statistics for
-  // new space growth policy.
+  RawWeakProperty* delayed_weak_properties_;
   intptr_t bytes_promoted_;
   RawObject* visiting_old_object_;
-  bool in_scavenge_pointer_;
+
+  friend class Scavenger;
 
   DISALLOW_COPY_AND_ASSIGN(ScavengerVisitor);
 };
@@ -396,6 +334,7 @@
       max_semi_capacity_in_words_(max_semi_capacity_in_words),
       object_alignment_(object_alignment),
       scavenging_(false),
+      delayed_weak_properties_(NULL),
       gc_time_micros_(0),
       collections_(0),
       external_size_(0) {
@@ -607,12 +546,9 @@
 
 
 void Scavenger::ProcessToSpace(ScavengerVisitor* visitor) {
-  GrowableArray<RawObject*>* delayed_weak_stack = visitor->DelayedWeakStack();
-
   // Iterate until all work has been drained.
   while ((resolved_top_ < top_) ||
-         PromotedStackHasMore() ||
-         !delayed_weak_stack->is_empty()) {
+         PromotedStackHasMore()) {
     while (resolved_top_ < top_) {
       RawObject* raw_obj = RawObject::FromAddr(resolved_top_);
       intptr_t class_id = raw_obj->GetClassId();
@@ -624,6 +560,8 @@
       }
     }
     {
+      // Visit all the promoted objects and update/scavenge their internal
+      // pointers. Potentially this adds more objects to the to space.
       while (PromotedStackHasMore()) {
         RawObject* raw_object = RawObject::FromAddr(PopFromPromotedStack());
         // Resolve or copy all objects referred to by the current object. This
@@ -635,10 +573,36 @@
       }
       visitor->VisitingOldObject(NULL);
     }
-    while (!delayed_weak_stack->is_empty()) {
-      // Pop the delayed weak object from the stack and visit its pointers.
-      RawObject* weak_property = delayed_weak_stack->RemoveLast();
-      weak_property->VisitPointers(visitor);
+    {
+      // Finished this round of scavenging. Process the pending weak properties
+      // for which the keys have become reachable. Potentially this adds more
+      // objects to the to space.
+      RawWeakProperty* cur_weak = delayed_weak_properties_;
+      delayed_weak_properties_ = NULL;
+      while (cur_weak != NULL) {
+        uword next_weak = cur_weak->ptr()->next_;
+        // Promoted weak properties are not enqueued. So we can guarantee that
+        // we do not need to think about store barriers here.
+        ASSERT(cur_weak->IsNewObject());
+        RawObject* raw_key = cur_weak->ptr()->key_;
+        ASSERT(raw_key->IsHeapObject());
+        // Key still points into from space even if the object has been
+        // promoted to old space by now. The key will be updated accordingly
+        // below when VisitPointers is run.
+        ASSERT(raw_key->IsNewObject());
+        uword raw_addr = RawObject::ToAddr(raw_key);
+        ASSERT(visitor->from_->Contains(raw_addr));
+        uword header = *reinterpret_cast<uword*>(raw_addr);
+        // Reset the next pointer in the weak property.
+        cur_weak->ptr()->next_ = 0;
+        if (IsForwarding(header)) {
+          cur_weak->VisitPointers(visitor);
+        } else {
+          EnqueueWeakProperty(cur_weak);
+        }
+        // Advance to next weak property in the queue.
+        cur_weak = reinterpret_cast<RawWeakProperty*>(next_weak);
+      }
     }
   }
 }
@@ -671,6 +635,21 @@
 }
 
 
+void Scavenger::EnqueueWeakProperty(RawWeakProperty* raw_weak) {
+  ASSERT(raw_weak->IsHeapObject());
+  ASSERT(raw_weak->IsNewObject());
+  ASSERT(raw_weak->IsWeakProperty());
+  DEBUG_ONLY(
+      uword raw_addr = RawObject::ToAddr(raw_weak);
+      uword header = *reinterpret_cast<uword*>(raw_addr);
+      ASSERT(!IsForwarding(header));
+  )
+  ASSERT(raw_weak->ptr()->next_ == 0);
+  raw_weak->ptr()->next_ = reinterpret_cast<uword>(delayed_weak_properties_);
+  delayed_weak_properties_ = raw_weak;
+}
+
+
 uword Scavenger::ProcessWeakProperty(RawWeakProperty* raw_weak,
                                      ScavengerVisitor* visitor) {
   // The fate of the weak property is determined by its key.
@@ -679,8 +658,8 @@
     uword raw_addr = RawObject::ToAddr(raw_key);
     uword header = *reinterpret_cast<uword*>(raw_addr);
     if (!IsForwarding(header)) {
-      // Key is white.  Delay the weak property.
-      visitor->DelayWeakProperty(raw_weak);
+      // Key is white.  Enqueue the weak property.
+      EnqueueWeakProperty(raw_weak);
       return raw_weak->Size();
     }
   }
@@ -689,7 +668,8 @@
 }
 
 
-void Scavenger::ProcessWeakTables() {
+void Scavenger::ProcessWeakReferences() {
+  // Rehash the weak tables now that we know which objects survive this cycle.
   for (int sel = 0;
        sel < Heap::kNumWeakSelectors;
        sel++) {
@@ -719,6 +699,32 @@
     // table above.
     delete table;
   }
+
+  // The queued weak properties at this point do not refer to reachable keys,
+  // so we clear their key and value fields.
+  {
+    RawWeakProperty* cur_weak = delayed_weak_properties_;
+    delayed_weak_properties_ = NULL;
+    while (cur_weak != NULL) {
+      uword next_weak = cur_weak->ptr()->next_;
+      // Reset the next pointer in the weak property.
+      cur_weak->ptr()->next_ = 0;
+
+      DEBUG_ONLY(
+          RawObject* raw_key = cur_weak->ptr()->key_;
+          uword raw_addr = RawObject::ToAddr(raw_key);
+          uword header = *reinterpret_cast<uword*>(raw_addr);
+          ASSERT(!IsForwarding(header));
+          ASSERT(raw_key->IsHeapObject());
+          ASSERT(raw_key->IsNewObject());  // Key still points into from space.
+      )
+
+      WeakProperty::Clear(cur_weak);
+
+      // Advance to next weak property in the queue.
+      cur_weak = reinterpret_cast<RawWeakProperty*>(next_weak);
+    }
+  }
 }
 
 
@@ -773,7 +779,8 @@
   // will continue with its scavenge after waiting for the winner to complete.
   // TODO(koda): Consider moving SafepointThreads into allocation failure/retry
   // logic to avoid needless collections.
-  SafepointOperationScope safepoint_scope(Thread::Current());
+  Thread* thread = Thread::Current();
+  SafepointOperationScope safepoint_scope(thread);
 
   // Scavenging is not reentrant. Make sure that is the case.
   ASSERT(!scavenging_);
@@ -797,7 +804,7 @@
   // The API prologue/epilogue may create/destroy zones, so we must not
   // depend on zone allocations surviving beyond the epilogue callback.
   {
-    StackZone zone(Thread::Current());
+    StackZone zone(thread);
     // Setup the visitor and run the scavenge.
     ScavengerVisitor visitor(isolate, this, from);
     page_space->AcquireDataLock();
@@ -805,10 +812,12 @@
     int64_t start = OS::GetCurrentTimeMicros();
     ProcessToSpace(&visitor);
     int64_t middle = OS::GetCurrentTimeMicros();
-    ScavengerWeakVisitor weak_visitor(this);
-    IterateWeakRoots(isolate, &weak_visitor);
-    visitor.Finalize();
-    ProcessWeakTables();
+    {
+      TIMELINE_FUNCTION_GC_DURATION(thread, "WeakHandleProcessing");
+      ScavengerWeakVisitor weak_visitor(this);
+      IterateWeakRoots(isolate, &weak_visitor);
+    }
+    ProcessWeakReferences();
     page_space->ReleaseDataLock();
 
     // Scavenge finished. Run accounting.
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index c5f2b81..5e7dcb1 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -233,6 +233,7 @@
   void IterateWeakReferences(Isolate* isolate, ScavengerVisitor* visitor);
   void IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor);
   void ProcessToSpace(ScavengerVisitor* visitor);
+  void EnqueueWeakProperty(RawWeakProperty* raw_weak);
   uword ProcessWeakProperty(RawWeakProperty* raw_weak,
                             ScavengerVisitor* visitor);
   void Epilogue(Isolate* isolate, SemiSpace* from, bool invoke_api_callbacks);
@@ -264,7 +265,7 @@
   void UpdateMaxHeapCapacity();
   void UpdateMaxHeapUsage();
 
-  void ProcessWeakTables();
+  void ProcessWeakReferences();
 
   intptr_t NewSizeInWords(intptr_t old_size_in_words) const;
 
@@ -292,6 +293,9 @@
   // Keep track whether a scavenge is currently running.
   bool scavenging_;
 
+  // Keep track of pending weak properties discovered while scagenging.
+  RawWeakProperty* delayed_weak_properties_;
+
   int64_t gc_time_micros_;
   intptr_t collections_;
   static const int kStatsHistoryCapacity = 2;
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index e732409..ffe4e92 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -87,24 +87,26 @@
 }
 
 
-DART_FORCE_INLINE static RawCode* FrameCode(RawObject** FP) {
-  return static_cast<RawCode*>(FP[kPcMarkerSlotFromFp]);
-}
-
-
-DART_FORCE_INLINE static void SetFrameCode(RawObject** FP, RawCode* code) {
-  FP[kPcMarkerSlotFromFp] = code;
-}
-
-
 DART_FORCE_INLINE static RawObject** FrameArguments(RawObject** FP,
                                                     intptr_t argc) {
   return FP - (kDartFrameFixedSize + argc);
 }
 
 
+#define RAW_CAST(Type, val)  (SimulatorHelpers::CastTo##Type(val))
+
+
 class SimulatorHelpers {
  public:
+#define DEFINE_CASTS(Type)                                              \
+    DART_FORCE_INLINE static Raw##Type* CastTo##Type(RawObject* obj) {  \
+      ASSERT((k##Type##Cid == kSmiCid) ? !obj->IsHeapObject()           \
+                                       : obj->Is##Type());              \
+      return reinterpret_cast<Raw##Type*>(obj);                         \
+    }
+  CLASS_LIST(DEFINE_CASTS)
+#undef DEFINE_CASTS
+
   DART_FORCE_INLINE static RawSmi* GetClassIdAsSmi(RawObject* obj) {
     return Smi::New(obj->IsHeapObject() ? obj->GetClassId()
                                         : static_cast<intptr_t>(kSmiCid));
@@ -115,10 +117,8 @@
                                : static_cast<intptr_t>(kSmiCid);
   }
 
-  DART_FORCE_INLINE static void IncrementUsageCounter(RawICData* icdata) {
-    reinterpret_cast<RawFunction*>(icdata->ptr()->owner_)
-        ->ptr()
-        ->usage_counter_++;
+  DART_FORCE_INLINE static void IncrementUsageCounter(RawFunction* f) {
+    f->ptr()->usage_counter_++;
   }
 
   DART_FORCE_INLINE static bool IsStrictEqualWithNumberCheck(RawObject* lhs,
@@ -226,6 +226,17 @@
     }
     return false;
   }
+
+  DART_FORCE_INLINE static RawCode* FrameCode(RawObject** FP) {
+    ASSERT(GetClassId(FP[kPcMarkerSlotFromFp]) == kCodeCid);
+    return static_cast<RawCode*>(FP[kPcMarkerSlotFromFp]);
+  }
+
+
+  DART_FORCE_INLINE static void SetFrameCode(RawObject** FP, RawCode* code) {
+    ASSERT(GetClassId(code) == kCodeCid);
+    FP[kPcMarkerSlotFromFp] = code;
+  }
 };
 
 
@@ -482,6 +493,26 @@
 }
 
 
+DART_FORCE_INLINE static void EnterSyntheticFrame(RawObject*** FP,
+                                                  RawObject*** SP,
+                                                  uint32_t* pc) {
+  RawObject** fp = *SP + kDartFrameFixedSize;
+  fp[kPcMarkerSlotFromFp] = 0;
+  fp[kSavedCallerPcSlotFromFp] = reinterpret_cast<RawObject*>(pc);
+  fp[kSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(*FP);
+  *FP = fp;
+  *SP = fp - 1;
+}
+
+
+DART_FORCE_INLINE static void LeaveSyntheticFrame(RawObject*** FP,
+                                                  RawObject*** SP) {
+  RawObject** fp = *FP;
+  *FP = reinterpret_cast<RawObject**>(fp[kSavedCallerFpSlotFromFp]);
+  *SP = fp - kDartFrameFixedSize;
+}
+
+
 DART_FORCE_INLINE void Simulator::Invoke(Thread* thread,
                                          RawObject** call_base,
                                          RawObject** call_top,
@@ -557,7 +588,6 @@
                                                 RawObject*** FP,
                                                 RawObject*** SP) {
   ASSERT(icdata->GetClassId() == kICDataCid);
-  SimulatorHelpers::IncrementUsageCounter(icdata);
 
   const intptr_t kCheckedArgs = 1;
   RawObject** args = call_base;
@@ -596,7 +626,6 @@
                                                 RawObject*** FP,
                                                 RawObject*** SP) {
   ASSERT(icdata->GetClassId() == kICDataCid);
-  SimulatorHelpers::IncrementUsageCounter(icdata);
 
   const intptr_t kCheckedArgs = 2;
   RawObject** args = call_base;
@@ -627,49 +656,6 @@
 }
 
 
-DART_FORCE_INLINE void Simulator::InstanceCall3(Thread* thread,
-                                                RawICData* icdata,
-                                                RawObject** call_base,
-                                                RawObject** top,
-                                                RawArray** argdesc,
-                                                RawObjectPool** pp,
-                                                uint32_t** pc,
-                                                RawObject*** FP,
-                                                RawObject*** SP) {
-  ASSERT(icdata->GetClassId() == kICDataCid);
-  SimulatorHelpers::IncrementUsageCounter(icdata);
-
-  const intptr_t kCheckedArgs = 3;
-  RawObject** args = call_base;
-  RawArray* cache = icdata->ptr()->ic_data_->ptr();
-
-  RawSmi* receiver_cid = SimulatorHelpers::GetClassIdAsSmi(args[0]);
-  RawSmi* arg0_cid = SimulatorHelpers::GetClassIdAsSmi(args[1]);
-  RawSmi* arg1_cid = SimulatorHelpers::GetClassIdAsSmi(args[2]);
-
-  bool found = false;
-  const intptr_t length = Smi::Value(cache->length_);
-  for (intptr_t i = 0;
-       i < (length - (kCheckedArgs + 2)); i += (kCheckedArgs + 2)) {
-    if ((cache->data()[i + 0] == receiver_cid) &&
-        (cache->data()[i + 1] == arg0_cid) &&
-        (cache->data()[i + 2] == arg1_cid)) {
-      top[0] = cache->data()[i + kCheckedArgs];
-      found = true;
-      break;
-    }
-  }
-
-  if (!found) {
-    InlineCacheMiss(
-        kCheckedArgs, thread, icdata, call_base, top, *pc, *FP, *SP);
-  }
-
-  *argdesc = icdata->ptr()->args_descriptor_;
-  Invoke(thread, call_base, top, pp, pc, FP, SP);
-}
-
-
 // Note: functions below are marked DART_NOINLINE to recover performance on
 // ARM where inlining these functions into the interpreter loop seemed to cause
 // some code quality issues.
@@ -801,7 +787,7 @@
       thread->set_vm_tag(vm_tag);                                              \
       return special_[kExceptionSpecialIndex];                                 \
     }                                                                          \
-    pp = FrameCode(FP)->ptr()->object_pool_->ptr();                            \
+    pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr();          \
     goto DispatchAfterException;                                               \
   } while (0)                                                                  \
 
@@ -950,7 +936,29 @@
   }
 
   {
-    BYTECODE(EntryOpt, A_B_C);
+    BYTECODE(EntryOptimized, A_D);
+    const uint8_t num_fixed_params = rA;
+    const uint16_t num_registers = rD;
+
+    // Decode arguments descriptor.
+    const intptr_t pos_count = Smi::Value(*reinterpret_cast<RawSmi**>(
+        reinterpret_cast<uword>(argdesc->ptr()) +
+        Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
+
+    // Check that we got the right number of positional parameters.
+    if (pos_count != num_fixed_params) {
+      // Mismatch can only occur if current function is a closure.
+      goto ClosureNoSuchMethod;
+    }
+
+    // Reserve space for registers used by the optimized code.
+    SP = FP + num_registers - 1;
+
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(EntryOptional, A_B_C);
     const uint16_t num_fixed_params = rA;
     const uint16_t num_opt_pos_params = rB;
     const uint16_t num_opt_named_params = rC;
@@ -1098,7 +1106,7 @@
     {
       // Function should be compiled now, dispatch to its entry point.
       RawCode* code = FrameFunction(FP)->ptr()->code_;
-      SetFrameCode(FP, code);
+      SimulatorHelpers::SetFrameCode(FP, code);
       pp = code->ptr()->object_pool_->ptr();
       pc = reinterpret_cast<uint32_t*>(code->ptr()->entry_point_);
     }
@@ -1106,6 +1114,36 @@
   }
 
   {
+    BYTECODE(HotCheck, A_D);
+    const uint8_t increment = rA;
+    const uint16_t threshold = rD;
+    RawFunction* f =  FrameFunction(FP);
+    int32_t counter = f->ptr()->usage_counter_;
+    // Note: we don't increment usage counter in the prologue of optimized
+    // functions.
+    if (increment) {
+      counter += increment;
+      f->ptr()->usage_counter_ = counter;
+    }
+    if (counter >= threshold) {
+      FP[0] = f;
+      FP[1] = 0;
+      Exit(thread, FP, FP + 2, pc);
+      NativeArguments args(thread, 1, FP, FP + 1);
+      INVOKE_RUNTIME(DRT_OptimizeInvokedFunction, args);
+      {
+        // DRT_OptimizeInvokedFunction returns the code object to execute.
+        ASSERT(FP[1]->GetClassId() == kCodeCid);
+        RawCode* code = static_cast<RawCode*>(FP[1]);
+        SimulatorHelpers::SetFrameCode(FP, code);
+        pp = code->ptr()->object_pool_->ptr();
+        pc = reinterpret_cast<uint32_t*>(code->ptr()->entry_point_);
+      }
+    }
+    DISPATCH();
+  }
+
+  {
     BYTECODE(CheckStack, A);
     {
       if (reinterpret_cast<uword>(SP) >= thread->stack_limit()) {
@@ -1259,6 +1297,14 @@
   }
 
   {
+    BYTECODE(Swap, A_X);
+    RawObject* tmp = FP[rD];
+    FP[rD] = FP[rA];
+    FP[rA] = tmp;
+    DISPATCH();
+  }
+
+  {
     BYTECODE(StoreLocal, A_X);
     FP[rD] = *SP;
     DISPATCH();
@@ -1283,6 +1329,12 @@
   }
 
   {
+    BYTECODE(BooleanNegate, A_D);
+    FP[rA] = (FP[rD] == true_value) ? false_value : true_value;
+    DISPATCH();
+  }
+
+  {
     BYTECODE(StaticCall, A_D);
 
     // Check if single stepping.
@@ -1305,7 +1357,7 @@
   }
 
   {
-    BYTECODE(InstanceCall, A_D);
+    BYTECODE(InstanceCall1, A_D);
 
     // Check if single stepping.
     if (thread->isolate()->single_step()) {
@@ -1320,9 +1372,12 @@
 
       RawObject** call_base = SP - argc + 1;
       RawObject** call_top = SP + 1;
-      InstanceCall1(thread,
-                    static_cast<RawICData*>(LOAD_CONSTANT(kidx)),
-                    call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
+
+      RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
+      SimulatorHelpers::IncrementUsageCounter(
+          RAW_CAST(Function, icdata->ptr()->owner_));
+      InstanceCall1(
+          thread, icdata, call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
     }
 
     DISPATCH();
@@ -1342,21 +1397,19 @@
 
       RawObject** call_base = SP - argc + 1;
       RawObject** call_top = SP + 1;
-      InstanceCall2(thread,
-                    static_cast<RawICData*>(LOAD_CONSTANT(kidx)),
-                    call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
+
+      RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
+      SimulatorHelpers::IncrementUsageCounter(
+          RAW_CAST(Function, icdata->ptr()->owner_));
+      InstanceCall2(
+          thread, icdata, call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
     }
 
     DISPATCH();
   }
 
   {
-    BYTECODE(InstanceCall3, A_D);
-    if (thread->isolate()->single_step()) {
-      Exit(thread, FP, SP + 1, pc);
-      NativeArguments args(thread, 0, NULL, NULL);
-      INVOKE_RUNTIME(DRT_SingleStepHandler, args);
-    }
+    BYTECODE(InstanceCall1Opt, A_D);
 
     {
       const uint16_t argc = rA;
@@ -1364,9 +1417,30 @@
 
       RawObject** call_base = SP - argc + 1;
       RawObject** call_top = SP + 1;
-      InstanceCall3(thread,
-                    static_cast<RawICData*>(LOAD_CONSTANT(kidx)),
-                    call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
+
+      RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
+      SimulatorHelpers::IncrementUsageCounter(FrameFunction(FP));
+      InstanceCall1(
+          thread, icdata, call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
+    }
+
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(InstanceCall2Opt, A_D);
+
+    {
+      const uint16_t argc = rA;
+      const uint16_t kidx = rD;
+
+      RawObject** call_base = SP - argc + 1;
+      RawObject** call_top = SP + 1;
+
+      RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));
+      SimulatorHelpers::IncrementUsageCounter(FrameFunction(FP));
+      InstanceCall2(
+          thread, icdata, call_base, call_top, &argdesc, &pp, &pc, &FP, &SP);
     }
 
     DISPATCH();
@@ -1495,7 +1569,7 @@
     // Restore SP, FP and PP. Push result and dispatch.
     SP = FrameArguments(FP, argc);
     FP = SavedCallerFP(FP);
-    pp = FrameCode(FP)->ptr()->object_pool_->ptr();
+    pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr();
     *SP = result;
     DISPATCH();
   }
@@ -1740,7 +1814,7 @@
   }
 
   {
-    BYTECODE(IfEqStrictTOS, A_D);
+    BYTECODE(IfEqStrictTOS, 0);
     SP -= 2;
     if (SP[1] != SP[2]) {
       pc++;
@@ -1749,7 +1823,7 @@
   }
 
   {
-    BYTECODE(IfNeStrictTOS, A_D);
+    BYTECODE(IfNeStrictTOS, 0);
     SP -= 2;
     if (SP[1] == SP[2]) {
       pc++;
@@ -1758,7 +1832,7 @@
   }
 
   {
-    BYTECODE(IfEqStrictNumTOS, A_D);
+    BYTECODE(IfEqStrictNumTOS, 0);
     if (thread->isolate()->single_step()) {
       Exit(thread, FP, SP + 1, pc);
       NativeArguments args(thread, 0, NULL, NULL);
@@ -1773,7 +1847,7 @@
   }
 
   {
-    BYTECODE(IfNeStrictNumTOS, A_D);
+    BYTECODE(IfNeStrictNumTOS, 0);
     if (thread->isolate()->single_step()) {
       Exit(thread, FP, SP + 1, pc);
       NativeArguments args(thread, 0, NULL, NULL);
@@ -1788,6 +1862,46 @@
   }
 
   {
+    BYTECODE(IfEqStrict, A_D);
+    RawObject* lhs = FP[rA];
+    RawObject* rhs = FP[rD];
+    if (lhs != rhs) {
+      pc++;
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(IfNeStrict, A_D);
+    RawObject* lhs = FP[rA];
+    RawObject* rhs = FP[rD];
+    if (lhs == rhs) {
+      pc++;
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(IfEqStrictNum, A_D);
+    RawObject* lhs = FP[rA];
+    RawObject* rhs = FP[rD];
+    if (!SimulatorHelpers::IsStrictEqualWithNumberCheck(lhs, rhs)) {
+      pc++;
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(IfNeStrictNum, A_D);
+    RawObject* lhs = FP[rA];
+    RawObject* rhs = FP[rD];
+    if (SimulatorHelpers::IsStrictEqualWithNumberCheck(lhs, rhs)) {
+      pc++;
+    }
+    DISPATCH();
+  }
+
+  {
     BYTECODE(Jump, 0);
     const int32_t target = static_cast<int32_t>(op) >> 8;
     pc += (target - 1);
@@ -1817,11 +1931,79 @@
     RawObject* value = SP[3];
     ASSERT(array->GetClassId() == kArrayCid);
     ASSERT(!index->IsHeapObject());
+    ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
     array->StorePointer(array->ptr()->data() + Smi::Value(index), value);
     DISPATCH();
   }
 
   {
+    BYTECODE(StoreIndexed, A_B_C);
+    RawArray* array = static_cast<RawArray*>(FP[rA]);
+    RawSmi* index = static_cast<RawSmi*>(FP[rB]);
+    RawObject* value = FP[rC];
+    ASSERT(array->GetClassId() == kArrayCid);
+    ASSERT(!index->IsHeapObject());
+    ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
+    array->StorePointer(array->ptr()->data() + Smi::Value(index), value);
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(Deopt, A_D);
+    const uint16_t deopt_id = rD;
+    if (deopt_id == 0) {  // Lazy deoptimization.
+      // Preserve result of the previous call.
+      // TODO(vegorov) we could have actually included result into the
+      // deoptimization environment because it is passed through the stack.
+      // If we do then we could remove special result handling from this code.
+      RawObject* result = SP[0];
+
+      // Leaf runtime function DeoptimizeCopyFrame expects a Dart frame.
+      // The code in this frame may not cause GC.
+      // DeoptimizeCopyFrame and DeoptimizeFillFrame are leaf runtime calls.
+      EnterSyntheticFrame(&FP, &SP, pc - 1);
+      const intptr_t frame_size_in_bytes =
+          DLRT_DeoptimizeCopyFrame(reinterpret_cast<uword>(FP),
+                                   /*is_lazy_deopt=*/1);
+      LeaveSyntheticFrame(&FP, &SP);
+
+      SP = FP + (frame_size_in_bytes / kWordSize);
+      EnterSyntheticFrame(&FP, &SP, pc - 1);
+      DLRT_DeoptimizeFillFrame(reinterpret_cast<uword>(FP));
+
+      // We are now inside a valid frame.
+      {
+        *++SP = result;  // Preserve result (call below can cause GC).
+        *++SP = 0;  // Space for the result: number of materialization args.
+        Exit(thread, FP, SP + 1, /*pc=*/0);
+        NativeArguments native_args(thread, 0, SP, SP);
+        INVOKE_RUNTIME(DRT_DeoptimizeMaterialize, native_args);
+      }
+      const intptr_t materialization_arg_count =
+          Smi::Value(RAW_CAST(Smi, *SP--));
+      result = *SP--;  // Reload the result. It might have been relocated by GC.
+
+      // Restore caller PC.
+      pc = SavedCallerPC(FP);
+
+      // Check if it is a fake PC marking the entry frame.
+      ASSERT((reinterpret_cast<uword>(pc) & 2) == 0);
+
+      // Restore SP, FP and PP. Push result and dispatch.
+      // Note: unlike in a normal return sequence we don't need to drop
+      // arguments - those are not part of the innermost deoptimization
+      // environment they were dropped by FlowGraphCompiler::RecordAfterCall.
+      SP = FrameArguments(FP, materialization_arg_count);
+      FP = SavedCallerFP(FP);
+      pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr();
+      *SP = result;
+    } else {
+      UNIMPLEMENTED();
+    }
+    DISPATCH();
+  }
+
+  {
     BYTECODE(Trap, 0);
     UNIMPLEMENTED();
     DISPATCH();
@@ -1847,7 +2029,7 @@
     RawObject** args = SP - argc;
     FP = SavedCallerFP(FP);
     if (has_dart_caller) {
-      pp = FrameCode(FP)->ptr()->object_pool_->ptr();
+      pp = SimulatorHelpers::FrameCode(FP)->ptr()->object_pool_->ptr();
     }
 
     *++SP = null_value;
diff --git a/runtime/vm/simulator_dbc.h b/runtime/vm/simulator_dbc.h
index c1d3ff9a..9865ca9 100644
--- a/runtime/vm/simulator_dbc.h
+++ b/runtime/vm/simulator_dbc.h
@@ -156,15 +156,6 @@
                      uint32_t** pc,
                      RawObject*** B, RawObject*** SP);
 
-  void InstanceCall3(Thread* thread,
-                     RawICData* icdata,
-                     RawObject** call_base,
-                     RawObject** call_top,
-                     RawArray** argdesc,
-                     RawObjectPool** pp,
-                     uint32_t** pc,
-                     RawObject*** B, RawObject*** SP);
-
   // Longjmp support for exceptions.
   SimulatorSetjmpBuffer* last_setjmp_buffer() {
     return last_setjmp_buffer_;
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index b1b2f4a..e5c5b0b 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -143,11 +143,6 @@
   ASSERT(kLengthIndex == length_offset());
   ASSERT((kSnapshotFlagIndex * sizeof(int64_t)) == kind_offset());
   ASSERT((kHeapObjectTag & kInlined));
-  // The kWatchedBit and kMarkBit are only set during GC operations. This
-  // allows the two low bits in the header to be used for snapshotting.
-  ASSERT(kObjectId ==
-         ((1 << RawObject::kWatchedBit) | (1 << RawObject::kMarkBit)));
-  ASSERT((kObjectAlignmentMask & kObjectId) == kObjectId);
   const Snapshot* snapshot = reinterpret_cast<const Snapshot*>(raw_memory);
   // If the raw length is negative or greater than what the local machine can
   // handle, then signal an error.
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index da26ca1..601eba5 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -297,7 +297,6 @@
 
   intptr_t ReadTags() {
     const intptr_t tags = static_cast<intptr_t>(Read<int8_t>()) & 0xff;
-    ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
     return tags;
   }
 
@@ -757,7 +756,6 @@
   }
 
   void WriteTags(intptr_t tags) {
-    ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
     const intptr_t flags = tags & 0xff;
     Write<int8_t>(static_cast<int8_t>(flags));
   }
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 28636b8..827407d 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -89,7 +89,6 @@
 void StackFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(thread() == Thread::Current());
   ASSERT(visitor != NULL);
-#if !defined(TARGET_ARCH_DBC)
   // NOTE: This code runs while GC is in progress and runs within
   // a NoHandleScope block. Hence it is not ok to use regular Zone or
   // Scope handles. We use direct stack handles, the raw pointers in
@@ -113,6 +112,7 @@
                         Instructions::HeaderSize();
     map = code.GetStackmap(pc() - entry, &maps, &map);
     if (!map.IsNull()) {
+#if !defined(TARGET_ARCH_DBC)
       RawObject** first = reinterpret_cast<RawObject**>(sp());
       RawObject** last = reinterpret_cast<RawObject**>(
           fp() + (kFirstLocalSlotFromFp * kWordSize));
@@ -157,24 +157,59 @@
       last = reinterpret_cast<RawObject**>(
           fp() + (kFirstObjectSlotFromFp * kWordSize));
       visitor->VisitPointers(first, last);
+#else
+      RawObject** first = reinterpret_cast<RawObject**>(fp());
+      RawObject** last = reinterpret_cast<RawObject**>(sp());
+
+      // Visit fixed prefix of the frame.
+      ASSERT((first + kFirstObjectSlotFromFp) < first);
+      visitor->VisitPointers(first + kFirstObjectSlotFromFp, first - 1);
+
+      // A stack map is present in the code object, use the stack map to
+      // visit frame slots which are marked as having objects.
+      //
+      // The layout of the frame is (lower addresses to the left):
+      // | registers | outgoing arguments |
+      // |XXXXXXXXXXX|--------------------|
+      //
+      // The DBC registers are described in the stack map.
+      // The outgoing arguments are assumed to be tagged; the number
+      // of outgoing arguments is not explicitly tracked.
+      ASSERT(map.SlowPathBitCount() == 0);
+
+      // Visit DBC registers that contain tagged values.
+      intptr_t length = map.Length();
+      for (intptr_t bit = 0; bit < length; ++bit) {
+        if (map.IsObject(bit)) {
+          visitor->VisitPointer(first + bit);
+        }
+      }
+
+      // Visit outgoing arguments.
+      if ((first + length) <= last) {
+        visitor->VisitPointers(first + length, last);
+      }
+#endif  // !defined(TARGET_ARCH_DBC)
       return;
     }
 
     // No stack map, fall through.
   }
+
+#if !defined(TARGET_ARCH_DBC)
   // For normal unoptimized Dart frames and Stub frames each slot
   // between the first and last included are tagged objects.
   RawObject** first = reinterpret_cast<RawObject**>(sp());
   RawObject** last = reinterpret_cast<RawObject**>(
       fp() + (kFirstObjectSlotFromFp * kWordSize));
-  visitor->VisitPointers(first, last);
 #else
   // On DBC stack grows upwards: fp() <= sp().
   RawObject** first = reinterpret_cast<RawObject**>(
       fp() + (kFirstObjectSlotFromFp * kWordSize));
   RawObject** last = reinterpret_cast<RawObject**>(sp());
-  visitor->VisitPointers(first, last);
 #endif  // !defined(TARGET_ARCH_DBC)
+
+  visitor->VisitPointers(first, last);
 }
 
 
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index aa20321..8232a4b 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -69,6 +69,8 @@
 #define VM_STUB_CODE_LIST(V)                                                   \
   V(LazyCompile)                                                               \
   V(FixCallersTarget)                                                          \
+  V(Deoptimize)                                                                \
+  V(DeoptimizeLazy)                                                            \
 
 #endif  // !defined(TARGET_ARCH_DBC)
 
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index e4e32ce..538cd33 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -2055,7 +2055,8 @@
   __ ldr(R1, FieldAddress(R9, MegamorphicCache::mask_offset()));
   // R2: cache buckets array.
   // R1: mask.
-  __ mov(R3, Operand(R0));
+  __ LoadImmediate(IP, MegamorphicCache::kSpreadFactor);
+  __ mul(R3, R0, IP);
   // R3: probe.
 
   Label loop, update, load_target_function;
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index cb31d8e..15b7e0f 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -2106,7 +2106,8 @@
   __ ldr(R1, FieldAddress(R5, MegamorphicCache::mask_offset()));
   // R2: cache buckets array.
   // R1: mask.
-  __ mov(R3, R0);
+  __ LoadImmediate(TMP, MegamorphicCache::kSpreadFactor);
+  __ mul(R3, R0, TMP);
   // R3: probe.
 
   Label loop, update, load_target_function;
diff --git a/runtime/vm/stub_code_dbc.cc b/runtime/vm/stub_code_dbc.cc
index 0f66414..36e44b3c 100644
--- a/runtime/vm/stub_code_dbc.cc
+++ b/runtime/vm/stub_code_dbc.cc
@@ -51,6 +51,19 @@
 }
 
 
+// These deoptimization stubs are only used to populate stack frames
+// with something meaningful to make sure GC can scan the stack during
+// the last phase of deoptimization which materializes objects.
+void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
+  __ Trap();
+}
+
+
+void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
+  __ Trap();
+}
+
+
 // Print the stop message.
 DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, 1, const char* message) {
   OS::Print("Stop message: %s\n", message);
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 772e39b..836e4b5 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -2029,6 +2029,7 @@
   // EBX: mask.
   __ pushl(ECX);  // Spill MegamorphicCache.
   __ movl(ECX, EAX);
+  __ imull(ECX, Immediate(MegamorphicCache::kSpreadFactor));
   // ECX: probe.
 
   Label loop, update, load_target_function;
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index ce5db80..27aa782 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -2220,7 +2220,9 @@
   __ lw(T1, FieldAddress(S5, MegamorphicCache::mask_offset()));
   // T2: cache buckets array.
   // T1: mask.
-  __ mov(T3, T0);
+  __ LoadImmediate(TMP, MegamorphicCache::kSpreadFactor);
+  __ mult(TMP, T0);
+  __ mflo(T3);
   // T3: probe.
 
   Label loop, update, call_target_function;
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 4e8f0e0..d66c125 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -2092,6 +2092,7 @@
   // RDI: cache buckets array.
   // RBX: mask.
   __ movq(RCX, RAX);
+  __ imulq(RCX, Immediate(MegamorphicCache::kSpreadFactor));
 
   Label loop, update, load_target_function;
   __ jmp(&loop);
diff --git a/runtime/vm/weak_code.cc b/runtime/vm/weak_code.cc
index 1305443..6dedc88 100644
--- a/runtime/vm/weak_code.cc
+++ b/runtime/vm/weak_code.cc
@@ -61,7 +61,6 @@
 
 
 void WeakCodeReferences::DisableCode() {
-  IncrementInvalidationGen();
   const Array& code_objects = Array::Handle(array_.raw());
   if (code_objects.IsNull()) {
     return;
diff --git a/runtime/vm/weak_code.h b/runtime/vm/weak_code.h
index ea2d9c1..9fd11c1 100644
--- a/runtime/vm/weak_code.h
+++ b/runtime/vm/weak_code.h
@@ -25,7 +25,6 @@
   virtual void UpdateArrayTo(const Array& array) = 0;
   virtual void ReportDeoptimization(const Code& code) = 0;
   virtual void ReportSwitchingCode(const Code& code) = 0;
-  virtual void IncrementInvalidationGen() = 0;
 
   static bool IsOptimizedCode(const Array& dependent_code, const Code& code);
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 5e4d69a..6cfcda8 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -1039,7 +1039,7 @@
     return JS('String', "#.charCodeAt(0) == 0 ? # : #", str, str, str);
   }
 
-  static String getTimeZoneName(receiver) {
+  static String getTimeZoneName(DateTime receiver) {
     // Firefox and Chrome emit the timezone in parenthesis.
     // Example: "Wed May 16 2012 21:13:00 GMT+0200 (CEST)".
     // We extract this name using a regexp.
@@ -1073,7 +1073,7 @@
     return "";
   }
 
-  static int getTimeZoneOffsetInMinutes(receiver) {
+  static int getTimeZoneOffsetInMinutes(DateTime receiver) {
     // Note that JS and Dart disagree on the sign of the offset.
     return -JS('int', r'#.getTimezoneOffset()', lazyAsJsDate(receiver));
   }
@@ -1118,7 +1118,7 @@
   }
 
   // Lazily keep a JS Date stored in the JS object.
-  static lazyAsJsDate(receiver) {
+  static lazyAsJsDate(DateTime receiver) {
     if (JS('bool', r'#.date === (void 0)', receiver)) {
       JS('void', r'#.date = new Date(#)', receiver,
          receiver.millisecondsSinceEpoch);
@@ -1130,49 +1130,49 @@
   // that the result is really an integer, because the JavaScript implementation
   // may return -0.0 instead of 0.
 
-  static getYear(receiver) {
+  static getYear(DateTime receiver) {
     return (receiver.isUtc)
       ? JS('int', r'(#.getUTCFullYear() + 0)', lazyAsJsDate(receiver))
       : JS('int', r'(#.getFullYear() + 0)', lazyAsJsDate(receiver));
   }
 
-  static getMonth(receiver) {
+  static getMonth(DateTime receiver) {
     return (receiver.isUtc)
       ? JS('JSUInt31', r'#.getUTCMonth() + 1', lazyAsJsDate(receiver))
       : JS('JSUInt31', r'#.getMonth() + 1', lazyAsJsDate(receiver));
   }
 
-  static getDay(receiver) {
+  static getDay(DateTime receiver) {
     return (receiver.isUtc)
       ? JS('JSUInt31', r'(#.getUTCDate() + 0)', lazyAsJsDate(receiver))
       : JS('JSUInt31', r'(#.getDate() + 0)', lazyAsJsDate(receiver));
   }
 
-  static getHours(receiver) {
+  static getHours(DateTime receiver) {
     return (receiver.isUtc)
       ? JS('JSUInt31', r'(#.getUTCHours() + 0)', lazyAsJsDate(receiver))
       : JS('JSUInt31', r'(#.getHours() + 0)', lazyAsJsDate(receiver));
   }
 
-  static getMinutes(receiver) {
+  static getMinutes(DateTime receiver) {
     return (receiver.isUtc)
       ? JS('JSUInt31', r'(#.getUTCMinutes() + 0)', lazyAsJsDate(receiver))
       : JS('JSUInt31', r'(#.getMinutes() + 0)', lazyAsJsDate(receiver));
   }
 
-  static getSeconds(receiver) {
+  static getSeconds(DateTime receiver) {
     return (receiver.isUtc)
       ? JS('JSUInt31', r'(#.getUTCSeconds() + 0)', lazyAsJsDate(receiver))
       : JS('JSUInt31', r'(#.getSeconds() + 0)', lazyAsJsDate(receiver));
   }
 
-  static getMilliseconds(receiver) {
+  static getMilliseconds(DateTime receiver) {
     return (receiver.isUtc)
       ? JS('JSUInt31', r'(#.getUTCMilliseconds() + 0)', lazyAsJsDate(receiver))
       : JS('JSUInt31', r'(#.getMilliseconds() + 0)', lazyAsJsDate(receiver));
   }
 
-  static getWeekday(receiver) {
+  static getWeekday(DateTime receiver) {
     int weekday = (receiver.isUtc)
       ? JS('int', r'#.getUTCDay() + 0', lazyAsJsDate(receiver))
       : JS('int', r'#.getDay() + 0', lazyAsJsDate(receiver));
diff --git a/sdk/lib/collection/hash_map.dart b/sdk/lib/collection/hash_map.dart
index c8c31c5..d934e8c 100644
--- a/sdk/lib/collection/hash_map.dart
+++ b/sdk/lib/collection/hash_map.dart
@@ -92,8 +92,8 @@
    *
    * Effectively a shorthand for:
    *
-   *     new HashMap(equals: identical,
-   *                 hashCode: identityHashCode)
+   *     new HashMap<K, V>(equals: identical,
+   *                       hashCode: identityHashCode)
    */
   external factory HashMap.identity();
 
diff --git a/sdk/lib/collection/linked_hash_map.dart b/sdk/lib/collection/linked_hash_map.dart
index 91814ed..d4ce4ca 100644
--- a/sdk/lib/collection/linked_hash_map.dart
+++ b/sdk/lib/collection/linked_hash_map.dart
@@ -79,8 +79,8 @@
    *
    * Effectively a shorthand for:
    *
-   *     new LinkedHashMap(equals: identical,
-   *                       hashCode: identityHashCode)
+   *     new LinkedHashMap<K, V>(equals: identical,
+   *                             hashCode: identityHashCode)
    */
   external factory LinkedHashMap.identity();
 
diff --git a/sdk/lib/collection/linked_hash_set.dart b/sdk/lib/collection/linked_hash_set.dart
index 3bc170f..5addba5 100644
--- a/sdk/lib/collection/linked_hash_set.dart
+++ b/sdk/lib/collection/linked_hash_set.dart
@@ -83,8 +83,8 @@
    *
    * Effectively a shorthand for:
    *
-   *     new LinkedHashSet(equals: identical,
-   *                       hashCode: identityHashCode)
+   *     new LinkedHashSet<E>(equals: identical,
+   *                          hashCode: identityHashCode)
    */
   external factory LinkedHashSet.identity();
 
@@ -92,7 +92,7 @@
    * Create a linked hash set containing all [elements].
    *
    * Creates a linked hash set as by `new LinkedHashSet<E>()` and adds each
-   * element of`elements` to this set in the order they are iterated.
+   * element of `elements` to this set in the order they are iterated.
    *
    * All the [elements] should be assignable to [E].
    * The `elements` iterable itself may have any element type,
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index 816f62e..386cf50 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -444,7 +444,7 @@
  *
  * The structure is efficient for any queue or stack usage.
  */
-class ListQueue<E> extends Iterable<E> implements Queue<E> {
+class ListQueue<E> extends ListIterable<E> implements Queue<E> {
   static const int _INITIAL_CAPACITY = 8;
   List<E> _table;
   int _head;
@@ -478,7 +478,7 @@
   factory ListQueue.from(Iterable elements) {
     if (elements is List) {
       int length = elements.length;
-      ListQueue<E> queue = new ListQueue(length + 1);
+      ListQueue<E> queue = new ListQueue<E>(length + 1);
       assert(queue._table.length > length);
       for (int i = 0; i < length; i++) {
         queue._table[i] = elements[i] as Object/*=E*/;
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 300b2ef..3e7c1cb 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -336,8 +336,9 @@
    * The elements are in iteration order.
    * The list is fixed-length if [growable] is false.
    */
-  List<E> toList({ bool growable: true }) =>
-      new List<E>.from(this, growable: growable);
+  List<E> toList({bool growable: true}) {
+    return new List<E>.from(this, growable: growable);
+  }
 
   /**
    * Creates a [Set] containing the same elements as this iterable.
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 1d35106..5718ca8 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -500,6 +500,12 @@
         if (i == start) _fail(uri, start, "Invalid empty scheme");
         scheme = _makeScheme(uri, start, i);
         i++;
+        if (scheme == "data") {
+          // This generates a URI that is (potentially) not path normalized.
+          // Applying part normalization to a non-hierarchial URI isn't
+          // meaningful.
+          return UriData._parse(uri, i, null).uri;
+        }
         pathStart = i;
         if (i == end) {
           char = EOI;
@@ -3040,9 +3046,10 @@
       end = queryIndex;
     }
     path = _text.substring(colonIndex + 1, end);
-    // TODO(lrn): This is probably too simple. We should ensure URI
-    // normalization before passing in the raw strings, maybe using
-    // Uri._makePath, Uri._makeQuery.
+    // TODO(lrn): This can generate a URI that isn't path normalized.
+    // That's perfectly reasonable - data URIs are not hierarchical,
+    // but it may make some consumers stumble.
+    // Should we at least do escape normalization?
     _uriCache = new Uri._internal("data", "", null, null, path, query, null);
     return _uriCache;
   }
diff --git a/sdk/lib/internal/sort.dart b/sdk/lib/internal/sort.dart
index 562d8b8..63037ea 100644
--- a/sdk/lib/internal/sort.dart
+++ b/sdk/lib/internal/sort.dart
@@ -29,7 +29,7 @@
    * The function's behavior must be consistent. It must not return different
    * results for the same values.
    */
-  static void sort(List a, int compare(a, b)) {
+  static void sort/*<E>*/(List/*<E>*/ a, int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
     _doSort(a, 0, a.length - 1, compare);
   }
 
@@ -42,7 +42,7 @@
    *
    * See [:sort:] for requirements of the [:compare:] function.
    */
-  static void sortRange(List a, int from, int to, int compare(a, b)) {
+  static void sortRange/*<E>*/(List/*<E>*/ a, int from, int to, int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
     if ((from < 0) || (to > a.length) || (to < from)) {
       throw "OutOfRange";
     }
@@ -52,7 +52,7 @@
   /**
    * Sorts the list in the interval [:left:] to [:right:] (both inclusive).
    */
-  static void _doSort(List a, int left, int right, int compare(a, b)) {
+  static void _doSort/*<E>*/(List/*<E>*/ a, int left, int right, int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
     if ((right - left) <= _INSERTION_SORT_THRESHOLD) {
       _insertionSort(a, left, right, compare);
     } else {
@@ -60,7 +60,7 @@
     }
   }
 
-  static void _insertionSort(List a, int left, int right, int compare(a, b)) {
+  static void _insertionSort/*<E>*/(List/*<E>*/ a, int left, int right, int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
     for (int i = left + 1; i <= right; i++) {
       var el = a[i];
       int j = i;
@@ -72,9 +72,9 @@
     }
   }
 
-  static void _dualPivotQuicksort(List a,
+  static void _dualPivotQuicksort/*<E>*/(List/*<E>*/ a,
                                   int left, int right,
-                                  int compare(a, b)) {
+                                  int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
     assert(right - left > _INSERTION_SORT_THRESHOLD);
 
     // Compute the two pivots by looking at 5 elements.
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 07257ea..4e1d8e3 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -975,7 +975,7 @@
    * To reconstruct the scheme, first 'X-Forwarded-Proto' is checked, and then
    * falling back to server type.
    *
-   * To reconstruct the host, fisrt 'X-Forwarded-Host' is checked, then 'Host'
+   * To reconstruct the host, first 'X-Forwarded-Host' is checked, then 'Host'
    * and finally calling back to server.
    */
   Uri get requestedUri;
diff --git a/sdk/lib/js/dartium/js_dartium.dart b/sdk/lib/js/dartium/js_dartium.dart
index 97e927e..8d0b248 100644
--- a/sdk/lib/js/dartium/js_dartium.dart
+++ b/sdk/lib/js/dartium/js_dartium.dart
@@ -311,7 +311,16 @@
   return false;
 }
 
-bool _hasJsName(mirrors.DeclarationMirror mirror) => _getJsName(mirror) != null;
+bool _hasJsName(mirrors.DeclarationMirror mirror) {
+  if (_atJsType != null) {
+    for (var annotation in mirror.metadata) {
+      if (annotation.type.reflectedType == _atJsType) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
 
 var _domNameType;
 
@@ -634,15 +643,7 @@
 // Remember the @JS type to compare annotation type.
 var _atJsType = -1;
 
-/**
- * Generates part files defining source code for JSObjectImpl, all DOM classes
- * classes. This codegen  is needed so that type checks for all registered
- * JavaScript interop classes pass.
- * If genCachedPatches is true then the patch files don't exist this is a special
- * signal to generate and emit the patches to stdout to be captured and put into
- * the file sdk/lib/js/dartium/cached_patches.dart
- */
-List<String> _generateInteropPatchFiles(List<String> libraryPaths, genCachedPatches) {
+void setupJsTypeCache() {
   // Cache the @JS Type.
   if (_atJsType == -1) {
     var uri = new Uri(scheme: "package", path: "js/js.dart");
@@ -656,6 +657,19 @@
       _atJsType = null;
     }
   }
+}
+
+/**
+ * Generates part files defining source code for JSObjectImpl, all DOM classes
+ * classes. This codegen  is needed so that type checks for all registered
+ * JavaScript interop classes pass.
+ * If genCachedPatches is true then the patch files don't exist this is a special
+ * signal to generate and emit the patches to stdout to be captured and put into
+ * the file sdk/lib/js/dartium/cached_patches.dart
+ */
+List<String> _generateInteropPatchFiles(List<String> libraryPaths, genCachedPatches) {
+  // Cache the @JS Type.
+  if (_atJsType == -1) setupJsTypeCache();
 
   var ret = _generateExternalMethods(libraryPaths, genCachedPatches ? false : true);
   var libraryPrefixes = new Map<mirrors.LibraryMirror, String>();
diff --git a/site/try/build_sdk_json.dart b/site/try/build_sdk_json.dart
new file mode 100644
index 0000000..ec5b56b
--- /dev/null
+++ b/site/try/build_sdk_json.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'dart:convert';
+import 'package:compiler/src/util/uri_extras.dart' show relativize;
+
+main(List<String> arguments) async {
+  if (arguments.length == 0) {
+    print('usage: build_sdk_json.dart <out-path>');
+    exit(1);
+  }
+
+  var out = arguments[0];
+  List<Uri> sdkFiles = await collectSdkFiles();
+  new File(out).writeAsStringSync(emitSdkAsJson(sdkFiles));
+}
+
+Uri sdkRoot = Uri.base.resolveUri(Platform.script).resolve('../../');
+
+/// Collects a list of files that are part of the SDK.
+List<Uri> collectSdkFiles() {
+  var files = <Uri>[];
+  var sdkDir = new Directory.fromUri(sdkRoot.resolve('sdk/lib/'));
+  for (var entity in sdkDir.listSync(recursive: true)) {
+    if (entity is File &&
+        (entity.path.endsWith('.dart') || entity.path.endsWith('.platform'))) {
+      files.add(entity.uri);
+    }
+  }
+  return files;
+}
+
+/// Creates a string that encodes the contents of the sdk libraries in json.
+///
+/// The keys of the json file are sdk-relative paths to source files, and the
+/// values are the contents of the file.
+String emitSdkAsJson(List<Uri> paths) {
+  var map = <String, String>{};
+  for (var uri in paths) {
+    String filename = relativize(sdkRoot, uri, false);
+    var contents = new File.fromUri(uri).readAsStringSync();
+    map['sdk:/$filename'] = contents;
+  }
+  return JSON.encode(map);
+}
diff --git a/site/try/build_try.gyp b/site/try/build_try.gyp
index c421c85..07717a3 100644
--- a/site/try/build_try.gyp
+++ b/site/try/build_try.gyp
@@ -69,8 +69,7 @@
 
             # This dependency is redundant for now, as this directory is
             # implicitly part of the dependencies for dart-sdk/README.
-            '<!@(["python", "../../tools/list_files.py", "\\.dart$", '
-                 '"../../pkg/compiler/samples/jsonify"])',
+            'build_sdk_json.dart',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/sdk.json',
@@ -80,10 +79,8 @@
             '<(PRODUCT_DIR)/dart-sdk/bin/'
             '<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
 
-            '-Dlist_all_libraries=true',
-            '-DoutputJson=true',
             '--package-root=<(PRODUCT_DIR)/packages/',
-            '../../pkg/compiler/samples/jsonify/jsonify.dart',
+            'build_sdk_json.dart',
             '<(SHARED_INTERMEDIATE_DIR)/sdk.json',
           ],
         },
diff --git a/site/try/poi/poi.dart b/site/try/poi/poi.dart
index be98153..f73e4e7 100644
--- a/site/try/poi/poi.dart
+++ b/site/try/poi/poi.dart
@@ -565,7 +565,7 @@
 }
 
 class PoiTask extends CompilerTask {
-  PoiTask(Compiler compiler) : super(compiler);
+  PoiTask(Compiler compiler) : super(compiler.measurer);
 
   String get name => 'POI';
 }
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 69afd94..fb4c02e 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -86,7 +86,7 @@
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $mode == debug && $builder_tag == asan ]
 Language/Types/Interface_Types/subtype_t27: Skip  # Issue 21174.
 
-[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $arch == arm ]
+[ ($runtime == vm || $runtime == dart_product) && $arch == arm ]
 LibTest/typed_data/Float32x4/operator_multiplication_A01_t01: Fail # Dart issue 24416
 
 [ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) ]
diff --git a/tests/compiler/dart2js/analyze_test_test.dart b/tests/compiler/dart2js/analyze_test_test.dart
index af3eb25..ea2524d 100644
--- a/tests/compiler/dart2js/analyze_test_test.dart
+++ b/tests/compiler/dart2js/analyze_test_test.dart
@@ -30,10 +30,6 @@
       "Library 'package:async/async.dart' doesn't export a "
       "'ForkableStream' declaration.",
   ],
-  "mirrors_test.dart": const [
-      MessageKind.INVALID_SYMBOL,
-      MessageKind.PRIVATE_IDENTIFIER,
-  ],
 };
 
 const List<String> SKIP_LIST = const <String>[
@@ -51,11 +47,6 @@
   "packages/",
 ];
 
-const List<MessageKind> MESSAGE_SKIP_LIST = const <MessageKind>[
-  // TODO(johnniwinther): Support checking of this warning. (Issue 26132)
-  MessageKind.IMPORT_EXPERIMENTAL_MIRRORS,
-];
-
 main(List<String> arguments) {
   List<String> options = <String>[];
   List<Uri> uriList = <Uri>[];
@@ -108,7 +99,6 @@
         uriList,
         WHITE_LIST,
         mode: AnalysisMode.URI,
-        options: options,
-        skipList: MESSAGE_SKIP_LIST);
+        options: options);
   });
 }
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index e6c7b74..d4ef503 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -56,6 +56,8 @@
 
 check_elements_invariants_test: Slow, Pass, Timeout # Slow due to inlining in the CPS backend
 
+uri_retention_test: Fail # Issue 26504
+
 [ $unchecked ]
 exit_code_test: Skip # This tests requires checked mode.
 
diff --git a/tests/compiler/dart2js/diagnostic_reporter_helper.dart b/tests/compiler/dart2js/diagnostic_reporter_helper.dart
index afc199d..16ff636 100644
--- a/tests/compiler/dart2js/diagnostic_reporter_helper.dart
+++ b/tests/compiler/dart2js/diagnostic_reporter_helper.dart
@@ -73,4 +73,7 @@
   withCurrentElement(Element element, f()) {
     return reporter.withCurrentElement(element, f);
   }
+
+  @override
+  bool get hasReportedError => reporter.hasReportedError;
 }
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index 3c7b2d9..ff419c7 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -137,10 +137,11 @@
 }
 
 class TestScanner extends ScannerTask {
-  TestScanner(TestCompiler compiler)
-      : super(compiler, compiler.dietParser);
+  final TestCompiler compiler;
 
-  TestCompiler get compiler => super.compiler;
+  TestScanner(TestCompiler compiler)
+      : compiler = compiler,
+        super(compiler.dietParser, compiler.reporter, compiler.measurer);
 
   void scanElements(CompilationUnitElement compilationUnit) {
     compiler.test('ScannerTask.scanElements');
diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/members_test.dart
index 0856b32..10e8859 100644
--- a/tests/compiler/dart2js/members_test.dart
+++ b/tests/compiler/dart2js/members_test.dart
@@ -219,7 +219,7 @@
                 functionType: env.functionType(String_, []));
 
     InterfaceType A = env['A'];
-    MembersCreator.computeAllClassMembers(env.compiler, A.element);
+    MembersCreator.computeAllClassMembers(env.resolution, A.element);
 
     checkMemberCount(A, 5 /*inherited*/ + 9 /*non-static declared*/,
                      interfaceMembers: true);
@@ -264,7 +264,7 @@
                 isStatic: true, functionType: env.functionType(dynamic_, []));
 
     ClassElement B = env.getElement('B');
-    MembersCreator.computeAllClassMembers(env.compiler, B);
+    MembersCreator.computeAllClassMembers(env.resolution, B);
     InterfaceType B_this = B.thisType;
     TypeVariableType B_T = B_this.typeArguments.first;
     checkMemberCount(B_this, 4 /*inherited*/ + 4 /*non-static declared*/,
@@ -290,7 +290,7 @@
                                                optionalParameters: [B_T]));
 
     ClassElement C = env.getElement('C');
-    MembersCreator.computeAllClassMembers(env.compiler, C);
+    MembersCreator.computeAllClassMembers(env.resolution, C);
     InterfaceType C_this = C.thisType;
     TypeVariableType C_S = C_this.typeArguments.first;
     checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: true);
@@ -317,7 +317,7 @@
                                                optionalParameters: [C_S]));
 
     InterfaceType D = env['D'];
-    MembersCreator.computeAllClassMembers(env.compiler, D.element);
+    MembersCreator.computeAllClassMembers(env.resolution, D.element);
     checkMemberCount(D, 8 /*inherited*/, interfaceMembers: true);
     checkMemberCount(D, 8 /*inherited*/, interfaceMembers: false);
     InterfaceType B_int = instantiate(B, [int_]);
@@ -342,7 +342,7 @@
                                                optionalParameters: [int_]));
 
     InterfaceType E = env['E'];
-    MembersCreator.computeAllClassMembers(env.compiler, E.element);
+    MembersCreator.computeAllClassMembers(env.resolution, E.element);
     checkMemberCount(E, 8 /*inherited*/, interfaceMembers: true);
     checkMemberCount(E, 8 /*inherited*/, interfaceMembers: false);
 
@@ -425,7 +425,7 @@
     InterfaceType D = env['D'];
 
     // Ensure that members have been computed on all classes.
-    MembersCreator.computeAllClassMembers(env.compiler, D.element);
+    MembersCreator.computeAllClassMembers(env.resolution, D.element);
 
     // A: num method1()
     // B: int method1()
@@ -593,7 +593,7 @@
     InterfaceType C = env['C'];
 
     // Ensure that members have been computed on all classes.
-    MembersCreator.computeAllClassMembers(env.compiler, C.element);
+    MembersCreator.computeAllClassMembers(env.resolution, C.element);
 
     // A: method1()
     // B: method1()
@@ -654,7 +654,7 @@
     InterfaceType B_V = instantiate(B, [C_V]);
 
     // Ensure that members have been computed on all classes.
-    MembersCreator.computeAllClassMembers(env.compiler, C);
+    MembersCreator.computeAllClassMembers(env.resolution, C);
 
     // A: method1()
     // B: method1()
@@ -725,7 +725,7 @@
     InterfaceType C = env['C'];
 
     // Ensure that members have been computed on all classes.
-    MembersCreator.computeAllClassMembers(env.compiler, C.element);
+    MembersCreator.computeAllClassMembers(env.resolution, C.element);
 
     checkMember(C, 'm', checkType: NO_CLASS_MEMBER,
                 inheritedFrom: A,
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index 47c1a43..411257b 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -16,8 +16,6 @@
     PackagesDiscoveryProvider;
 import 'package:compiler/src/diagnostics/messages.dart' show
     Message;
-import 'package:compiler/src/mirrors/source_mirrors.dart';
-import 'package:compiler/src/mirrors/analyze.dart';
 import 'package:compiler/src/null_compiler_output.dart' show
     NullCompilerOutput;
 import 'package:compiler/src/library_loader.dart' show
@@ -73,6 +71,7 @@
     {Map<String, String> memorySourceFiles: const <String, String>{},
      Uri entryPoint,
      List<Uri> entryPoints,
+     List<Uri> resolutionInputs,
      CompilerDiagnostics diagnosticHandler,
      CompilerOutput outputProvider,
      List<String> options: const <String>[],
@@ -87,6 +86,7 @@
   }
   CompilerImpl compiler = compilerFor(
       entryPoint: entryPoint,
+      resolutionInputs: resolutionInputs,
       memorySourceFiles: memorySourceFiles,
       diagnosticHandler: diagnosticHandler,
       outputProvider: outputProvider,
@@ -106,6 +106,7 @@
 
 CompilerImpl compilerFor(
     {Uri entryPoint,
+     List<Uri> resolutionInputs,
      Map<String, String> memorySourceFiles: const <String, String>{},
      CompilerDiagnostics diagnosticHandler,
      CompilerOutput outputProvider,
@@ -149,6 +150,7 @@
       diagnosticHandler,
       new CompilerOptions.parse(
           entryPoint: entryPoint,
+          resolutionInputs: resolutionInputs,
           libraryRoot: libraryRoot,
           packageRoot: packageRoot,
           options: options,
@@ -259,23 +261,3 @@
   }
   return handler;
 }
-
-Future<MirrorSystem> mirrorSystemFor(Map<String,String> memorySourceFiles,
-                                     {DiagnosticHandler diagnosticHandler,
-                                      List<String> options: const [],
-                                      bool showDiagnostics: true}) {
-  Uri libraryRoot = Uri.base.resolve('sdk/');
-  Uri packageRoot = Uri.base.resolve(Platform.packageRoot);
-
-  var provider = new MemorySourceFileProvider(memorySourceFiles);
-  var handler =
-      createDiagnosticHandler(diagnosticHandler, provider, showDiagnostics);
-
-  List<Uri> libraries = <Uri>[];
-  memorySourceFiles.forEach((String path, _) {
-    libraries.add(new Uri(scheme: 'memory', path: path));
-  });
-
-  return analyze(libraries, libraryRoot, packageRoot,
-                 provider, handler, options);
-}
diff --git a/tests/compiler/dart2js/mirror_system_helper.dart b/tests/compiler/dart2js/mirror_system_helper.dart
deleted file mode 100644
index 323ff8e..0000000
--- a/tests/compiler/dart2js/mirror_system_helper.dart
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library mirror_system_helper;
-
-import 'dart:async';
-import 'package:compiler/src/mirrors/source_mirrors.dart';
-import 'package:compiler/src/mirrors/dart2js_mirrors.dart';
-import 'mock_compiler.dart';
-
-export 'package:compiler/src/mirrors/source_mirrors.dart';
-export 'package:compiler/src/mirrors/mirrors_util.dart';
-
-const String SOURCE = 'source';
-final Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE);
-
-// TODO(johnniwinther): Move this to a mirrors helper library.
-Future<MirrorSystem> createMirrorSystem(String source) {
-  MockCompiler compiler = new MockCompiler.internal(
-      analyzeOnly: true,
-      analyzeAll: true,
-      preserveComments: true);
-    compiler.registerSource(SOURCE_URI, source);
-    compiler.librariesToAnalyzeWhenRun = <Uri>[SOURCE_URI];
-  return compiler.run(null).then((_) {
-    return new Dart2JsMirrorSystem(compiler);
-  });
-}
-
-/**
- * Returns [:true:] if [type] is an instance of [:decl:] with type arguments
- * equal to [typeArgument].
- */
-bool isInstance(ClassMirror decl, List<TypeMirror> typeArguments,
-            ClassMirror type) {
-  if (type.isOriginalDeclaration) return false;
-  if (!isSameDeclaration(decl, type)) return false;
-  return areEqualsTypes(typeArguments, type.typeArguments);
-}
-
-/**
- * Returns [:true:] if [type] is the same type as [expected]. This method
- * equates a non-generic declaration with its instantiation.
- */
-bool isEqualType(TypeMirror expected, TypeMirror type) {
-  if (expected == type) return true;
-  if (expected is ClassMirror && type is ClassMirror) {
-    if (!isSameDeclaration(expected, type)) return false;
-    if (expected.isOriginalDeclaration || expected.typeArguments.isEmpty) {
-      return type.isOriginalDeclaration || type.typeArguments.isEmpty;
-    }
-    return areEqualsTypes(expected.typeArguments, type.typeArguments);
-  }
-  return true;
-}
-
-/**
- * Returns [:true:] if [types] are equals to [expected] using the equalitry
- * defined by [isEqualType].
- */
-bool areEqualsTypes(List<TypeMirror> expected, List<TypeMirror> types) {
-  return checkSameList(expected, types, isEqualType);
-}
-
-/**
- * Returns [:true:] if an instance of [type] with type arguments equal to
- * [typeArguments] is found in [types].
- */
-bool containsType(ClassMirror decl, List<TypeMirror> typeArguments,
-                  Iterable<TypeMirror> types) {
-  return types.any((type) => isInstance(decl, typeArguments, type));
-}
-
-/**
- * Returns the declaration of [type].
- */
-TypeMirror toDeclaration(TypeMirror type) {
-  return type is ClassMirror ? type.originalDeclaration : type;
-}
-
-/**
- * Returns [:true:] if [type] is of the same declaration as [expected].
- */
-bool isSameDeclaration(TypeMirror expected, TypeMirror type) {
-  return toDeclaration(expected) == toDeclaration(type);
-}
-
-/**
- * Returns [:true:] if a type of the declaration of [expected] is in [types].
- */
-bool containsDeclaration(TypeMirror expected, Iterable<TypeMirror> types) {
-  for (var type in types) {
-    if (isSameDeclaration(expected, type)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-/**
- * Returns [:true:] if declarations of [expected] are the same as those of
- * [types], taking order into account.
- */
-bool isSameDeclarationList(Iterable<TypeMirror> expected,
-                           Iterable<TypeMirror> types) {
-  return checkSameList(expected, types, isSameDeclaration);
-}
-
-/**
- * Returns [:true:] if declarations of [expected] are the same as those of
- * [iterable], not taking order into account.
- */
-bool isSameDeclarationSet(Iterable<TypeMirror> expected,
-                          Iterable<TypeMirror> types) {
-   Set<TypeMirror> expectedSet = expected.map(toDeclaration).toSet();
-   Set<TypeMirror> typesSet = types.map(toDeclaration).toSet();
-   return expectedSet.length == typesSet.length &&
-          expectedSet.containsAll(typesSet);
-}
-
-/**
- * Utility method for checking whether [expected] and [iterable] contains the
- * same elements with respect to the checking function [check], takin order
- * into account.
- */
-bool checkSameList(Iterable<TypeMirror> expected,
-                   Iterable<TypeMirror> types,
-                   bool check(TypeMirror a, TypeMirror b)) {
-  if (expected.length != types.length) return false;
-  Iterator<TypeMirror> expectedIterator = expected.iterator;
-  Iterator<TypeMirror> typesIterator = types.iterator;
-  while (expectedIterator.moveNext() && typesIterator.moveNext()) {
-    if (!check(expectedIterator.current, typesIterator.current)) {
-      return false;
-    }
-  }
-  return true;
-}
diff --git a/tests/compiler/dart2js/mirrors/class_mirror_type_variables_test.dart b/tests/compiler/dart2js/mirrors/class_mirror_type_variables_test.dart
deleted file mode 100644
index b8b2e56f..0000000
--- a/tests/compiler/dart2js/mirrors/class_mirror_type_variables_test.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/class_mirror_type_variables_expect.dart";
-
-class CompileTimeEnv implements Env {
-  final MirrorSystem mirrors;
-
-  CompileTimeEnv(this.mirrors);
-
-  LibraryMirror get core => mirrors.libraries[Uri.parse('dart:core')];
-
-  LibraryMirror get test =>
-      mirrors.findLibrary(#class_mirror_type_variables_data);
-
-
-  ClassMirror getA() => test.declarations[#A];
-  ClassMirror getB() => test.declarations[#B];
-  ClassMirror getC() => test.declarations[#C];
-  ClassMirror getD() => test.declarations[#D];
-  ClassMirror getE() => test.declarations[#E];
-  ClassMirror getF() => test.declarations[#F];
-  ClassMirror getNoTypeParams() => test.declarations[#NoTypeParams];
-  ClassMirror getObject() => core.declarations[#Object];
-  ClassMirror getString() => core.declarations[#String];
-  ClassMirror getHelperOfString() =>
-      createInstantiation(test.declarations[#Helper], [getString()]);
-}
-
-main() {
-  asyncTest(() => analyze("class_mirror_type_variables_data.dart").
-      then((MirrorSystem mirrors) {
-    test(new CompileTimeEnv(mirrors));
-  }));
-
-}
diff --git a/tests/compiler/dart2js/mirrors/default_value_test.dart b/tests/compiler/dart2js/mirrors/default_value_test.dart
deleted file mode 100644
index b4ea3dc..0000000
--- a/tests/compiler/dart2js/mirrors/default_value_test.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-import "../memory_compiler.dart";
-
-const SOURCE = const {
-  'main.dart': """
-library main;
-
-class Class {
-  var a, b, c, d, e, f, g, h;
-  Class.optional(this.a, int b, void this.c(), 
-                 [this.d, int this.e, void this.f(), 
-                  this.g = 0, int this.h = 0]);
-  Class.named(this.a, int b, void this.c(), 
-                 {this.d, int this.e, void this.f(), 
-                  this.g: 0, int this.h: 0});
-  methodOptional(a, int b, void c(), 
-                 [d, int e, void f(), 
-                  g = 0, int h = 0]) {}
-  methodNamed(a, int b, void c(), 
-              {d, int e, void f(), 
-               g: 0, int h: 0}) {}
-} 
-""",
-};
-
-main() {
-  asyncTest(() => mirrorSystemFor(SOURCE).then((MirrorSystem mirrors) {
-    LibraryMirror dartCore = mirrors.libraries[Uri.parse('memory:main.dart')];
-    ClassMirror classMirror = dartCore.declarations[#Class];
-    testMethod(classMirror.declarations[#optional]);
-    testMethod(classMirror.declarations[#named]);
-    testMethod(classMirror.declarations[#methodOptional]);
-    testMethod(classMirror.declarations[#methodNamed]);
-  }));
-}
-
-testMethod(MethodMirror mirror) {
-  Expect.equals(8, mirror.parameters.length);
-  for (int i = 0 ; i < 6 ; i++) {
-    testParameter(mirror.parameters[i], false);
-  }
-  for (int i = 6 ; i < 8 ; i++) {
-    testParameter(mirror.parameters[i], true);
-  }
-}
-
-testParameter(ParameterMirror mirror, bool expectDefaultValue) {
-  if (expectDefaultValue) {
-    Expect.isTrue(mirror.hasDefaultValue);
-    Expect.isNotNull(mirror.defaultValue);
-  } else {
-    Expect.isFalse(mirror.hasDefaultValue);
-    Expect.isNull(mirror.defaultValue);
-  }
-}
diff --git a/tests/compiler/dart2js/mirrors/field_parameter_type_test.dart b/tests/compiler/dart2js/mirrors/field_parameter_type_test.dart
deleted file mode 100644
index 3dbabd1..0000000
--- a/tests/compiler/dart2js/mirrors/field_parameter_type_test.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-import "../memory_compiler.dart";
-
-const SOURCE = const {
-  'main.dart': """
-library main;
-
-class Class {
-  var a, b, c, d, e, f, g, h;
-  Class.optional(this.a, int b, void this.c(),
-                 [this.d, int this.e, void this.f(),
-                  this.g = 0, int this.h = 0]);
-  Class.named(this.a, int b, void this.c(),
-                 {this.d, int this.e, void this.f(),
-                  this.g: 0, int this.h: 0});
-  methodOptional(a, int b, void c(),
-                 [d, int e, void f(),
-                  g = 0, int h = 0]) {}
-  methodNamed(a, int b, void c(),
-              {d, int e, void f(),
-               g: 0, int h: 0}) {}
-}
-""",
-};
-
-main() {
-  asyncTest(() => mirrorSystemFor(SOURCE).then((MirrorSystem mirrors) {
-    LibraryMirror dartCore = mirrors.libraries[Uri.parse('memory:main.dart')];
-    ClassMirror classMirror = dartCore.declarations[#Class];
-    testMethod(classMirror.declarations[#optional]);
-    testMethod(classMirror.declarations[#named]);
-    testMethod(classMirror.declarations[#methodOptional]);
-    testMethod(classMirror.declarations[#methodNamed]);
-  }));
-}
-
-testMethod(MethodMirror mirror) {
-  Expect.equals(8, mirror.parameters.length);
-  for (int i = 0 ; i < 6 ; i++) {
-    testParameter(mirror.parameters[i], false);
-  }
-  for (int i = 6 ; i < 8 ; i++) {
-    testParameter(mirror.parameters[i], true);
-  }
-}
-
-testParameter(ParameterMirror mirror, bool expectDefaultValue) {
-  if (expectDefaultValue) {
-    Expect.isTrue(mirror.hasDefaultValue);
-    Expect.isNotNull(mirror.defaultValue);
-  } else {
-    Expect.isFalse(mirror.hasDefaultValue);
-    Expect.isNull(mirror.defaultValue);
-  }
-}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart b/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart
deleted file mode 100644
index ec22898..0000000
--- a/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/library_exports_hidden_test.dart";
-
-main() {
-  asyncTest(() => analyze("library_exports_hidden_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart b/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart
deleted file mode 100644
index 0234524..0000000
--- a/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/library_exports_shown_test.dart";
-
-main() {
-  asyncTest(() => analyze("library_exports_shown_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart b/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart
deleted file mode 100644
index d72132d..0000000
--- a/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/library_imports_hidden_test.dart";
-
-main() {
-  asyncTest(() => analyze("library_imports_hidden_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart b/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart
deleted file mode 100644
index 45b7dd5..0000000
--- a/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/library_imports_prefixed_show_hide_test.dart";
-
-main() {
-  asyncTest(() => analyze("library_imports_prefixed_show_hide_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart b/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart
deleted file mode 100644
index 528247d..0000000
--- a/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/library_imports_prefixed_test.dart";
-
-main() {
-  asyncTest(() => analyze("library_imports_prefixed_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart b/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart
deleted file mode 100644
index 83a77b0..0000000
--- a/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/library_imports_shown_test.dart";
-
-main() {
-  asyncTest(() => analyze("library_imports_shown_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart b/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart
deleted file mode 100644
index ed8d8fd..0000000
--- a/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that everything reachable from a [MirrorSystem] can be accessed.
-
-library test.mirrors.reader;
-
-import "dart:mirrors" hide SourceLocation;
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/mirrors_reader.dart";
-import "package:compiler/src/diagnostics/spannable.dart";
-import "package:compiler/src/mirrors/dart2js_mirrors.dart";
-import "package:compiler/src/mirrors/source_mirrors.dart";
-
-class SourceMirrorsReader extends MirrorsReader {
-  final Dart2JsMirrorSystem mirrorSystem;
-
-  SourceMirrorsReader(this.mirrorSystem,
-                      {bool verbose: false, bool includeStackTrace: false})
-      : super(verbose: verbose, includeStackTrace: includeStackTrace);
-
-  evaluate(f()) {
-    try {
-      return f();
-    } on SpannableAssertionFailure catch (e) {
-      var reporter = mirrorSystem.compiler.reporter;
-      reporter.reportAssertionFailure(e);
-      rethrow;
-    }
-  }
-
-  visitMirror(Mirror mirror) {
-    if (mirror is CombinatorMirror) {
-      visitCombinatorMirror(mirror);
-    } else if (mirror is LibraryDependencyMirror) {
-      visitLibraryDependencyMirror(mirror);
-    } else if (mirror is CommentInstanceMirror) {
-      visitCommentInstanceMirror(mirror);
-    } else if (mirror is ListInstanceMirror) {
-      visitListInstanceMirror(mirror);
-    } else if (mirror is MapInstanceMirror) {
-      visitMapInstanceMirror(mirror);
-    } else if (mirror is TypeInstanceMirror) {
-      visitTypeInstanceMirror(mirror);
-    } else {
-      super.visitMirror(mirror);
-    }
-  }
-
-  visitDeclarationMirror(DeclarationSourceMirror mirror) {
-    super.visitDeclarationMirror(mirror);
-    visit(mirror, 'isNameSynthetic', () => mirror.isNameSynthetic);
-  }
-
-  visitClassMirror(ClassSourceMirror mirror) {
-    super.visitClassMirror(mirror);
-    visit(mirror, 'isAbstract', () => mirror.isAbstract);
-  }
-
-  visitLibraryMirror(LibrarySourceMirror mirror) {
-    super.visitLibraryMirror(mirror);
-    visit(mirror, 'libraryDependencies', () => mirror.libraryDependencies);
-  }
-
-  visitParameterMirror(ParameterMirror mirror) {
-    super.visitParameterMirror(mirror);
-    if (mirror is ParameterSourceMirror) {
-      visit(mirror, 'isInitializingFormal', () => mirror.isInitializingFormal);
-      visit(mirror, 'initializedField', () => mirror.initializedField);
-    }
-  }
-
-  visitTypeMirror(TypeSourceMirror mirror) {
-    super.visitTypeMirror(mirror);
-    visit(mirror, 'isVoid', () => mirror.isVoid);
-    visit(mirror, 'isDynamic', () => mirror.isDynamic);
-  }
-
-  visitSourceLocation(SourceLocation location) {
-    super.visitSourceLocation(location);
-    visit(location, 'line', () => location.line);
-    visit(location, 'column', () => location.column);
-    visit(location, 'offset', () => location.offset);
-    visit(location, 'length', () => location.length);
-    visit(location, 'text', () => location.text);
-    visit(location, 'sourceUri', () => location.sourceUri);
-    visit(location, 'sourceText', () => location.sourceText);
-  }
-
-  visitCombinatorMirror(CombinatorMirror mirror) {
-    visit(mirror, 'identifiers', () => mirror.identifiers);
-    visit(mirror, 'isShow', () => mirror.isShow);
-    visit(mirror, 'isHide', () => mirror.isHide);
-  }
-
-  visitLibraryDependencyMirror(LibraryDependencyMirror mirror) {
-    visit(mirror, 'isImport', () => mirror.isImport);
-    visit(mirror, 'isExport', () => mirror.isExport);
-    visit(mirror, 'sourceLibrary', () => mirror.sourceLibrary);
-    visit(mirror, 'targetLibrary', () => mirror.targetLibrary);
-    visit(mirror, 'prefix', () => mirror.prefix);
-    visit(mirror, 'combinators', () => mirror.combinators);
-    visit(mirror, 'location', () => mirror.location);
-  }
-
-  visitCommentInstanceMirror(CommentInstanceMirror mirror) {
-    visitInstanceMirror(mirror);
-    visit(mirror, 'text', () => mirror.text);
-    visit(mirror, 'trimmedText', () => mirror.trimmedText);
-    visit(mirror, 'isDocComment', () => mirror.isDocComment);
-  }
-
-  visitListInstanceMirror(ListInstanceMirror mirror) {
-    visitInstanceMirror(mirror);
-    visit(mirror, 'length', () => mirror.length);
-  }
-
-  visitMapInstanceMirror(MapInstanceMirror mirror) {
-    visitInstanceMirror(mirror);
-    visit(mirror, 'keys', () => mirror.keys);
-    visit(mirror, 'length', () => mirror.length);
-  }
-
-  visitTypeInstanceMirror(TypeInstanceMirror mirror) {
-    visitInstanceMirror(mirror);
-    visit(mirror, 'representedType', () => mirror.representedType);
-  }
-}
-
-main(List<String> arguments) {
-  asyncTest(() => analyzeUri(Uri.parse('dart:core')).
-      then((MirrorSystem mirrors) {
-    MirrorsReader reader = new SourceMirrorsReader(mirrors,
-        verbose: arguments.contains('-v'),
-        includeStackTrace: arguments.contains('-s'));
-    reader.checkMirrorSystem(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart b/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart
deleted file mode 100644
index c308dae..0000000
--- a/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-import 'dart:async';
-
-import 'package:compiler/src/mirrors/source_mirrors.dart';
-import 'package:compiler/src/mirrors/analyze.dart' as source_mirrors;
-import 'package:compiler/src/source_file_provider.dart';
-
-TypeMirror createInstantiation(TypeSourceMirror type,
-                               List<TypeMirror> typeArguments) {
-  return type.createInstantiation(typeArguments);
-}
-
-Future<MirrorSystem> analyze(String test) {
-  Uri repository = Platform.script.resolve('../../../../');
-  Uri testUri = repository.resolve('tests/lib/mirrors/$test');
-  return analyzeUri(testUri);
-}
-
-
-Future<MirrorSystem> analyzeUri(Uri testUri) {
-  Uri repository = Platform.script.resolve('../../../../');
-  Uri libraryRoot = repository.resolve('sdk/');
-  Uri packageRoot = Uri.base.resolve(Platform.packageRoot);
-  var provider = new CompilerSourceFileProvider();
-  var handler = new FormattingDiagnosticHandler(provider);
-  return source_mirrors.analyze(
-      [testUri],
-      libraryRoot,
-      packageRoot,
-      provider,
-      handler);
-}
diff --git a/tests/compiler/dart2js/mirrors/relation_assignable_test.dart b/tests/compiler/dart2js/mirrors/relation_assignable_test.dart
deleted file mode 100644
index eeb6190..0000000
--- a/tests/compiler/dart2js/mirrors/relation_assignable_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/relation_assignable_test.dart";
-
-main() {
-  asyncTest(() => analyze("relation_assignable_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/relation_subclass_test.dart b/tests/compiler/dart2js/mirrors/relation_subclass_test.dart
deleted file mode 100644
index 86503eb..0000000
--- a/tests/compiler/dart2js/mirrors/relation_subclass_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/relation_subclass_test.dart";
-
-main() {
-  asyncTest(() => analyze("relation_subclass_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors/relation_subtype_test.dart b/tests/compiler/dart2js/mirrors/relation_subtype_test.dart
deleted file mode 100644
index 2fca90c..0000000
--- a/tests/compiler/dart2js/mirrors/relation_subtype_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:mirrors";
-
-import "package:async_helper/async_helper.dart";
-
-import "mirrors_test_helper.dart";
-import "../../../lib/mirrors/relation_subtype_test.dart";
-
-main() {
-  asyncTest(() => analyze("relation_subtype_test.dart").
-      then((MirrorSystem mirrors) {
-    test(mirrors);
-  }));
-}
diff --git a/tests/compiler/dart2js/mirrors_exports_test.dart b/tests/compiler/dart2js/mirrors_exports_test.dart
deleted file mode 100644
index 302dd31..0000000
--- a/tests/compiler/dart2js/mirrors_exports_test.dart
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/mirrors/source_mirrors.dart';
-
-import 'memory_compiler.dart';
-
-const SOURCE_FILES = const {
-'main.dart': '''
-import 'a.dart' show A1, A2;
-import 'b.dart' as b hide B1;
-export 'a.dart' show A2 hide A3, A1;
-export 'b.dart' hide B1, B2 show B3;
-import 'dart:core' as core;
-import 'c.dart' deferred as c;
-
-main() {}
-''',
-'a.dart': '''
-class A1 {}
-class A2 {}
-class A3 {}
-''',
-'b.dart': '''
-class B1 {}
-class B2 {}
-class B3 {}
-''',
-'c.dart': '''
-foo() => 499;
-'''
-};
-
-void main() {
-  asyncTest(() => mirrorSystemFor(SOURCE_FILES).then((MirrorSystem mirrors) {
-    LibrarySourceMirror mainLibrary =
-        mirrors.libraries[Uri.parse('memory:main.dart')];
-    Expect.isNotNull(mainLibrary);
-
-    LibrarySourceMirror aLibrary =
-        mirrors.libraries[Uri.parse('memory:a.dart')];
-    Expect.isNotNull(aLibrary);
-
-    LibrarySourceMirror bLibrary =
-        mirrors.libraries[Uri.parse('memory:b.dart')];
-    Expect.isNotNull(bLibrary);
-
-    LibrarySourceMirror cLibrary =
-        mirrors.libraries[Uri.parse('memory:c.dart')];
-    Expect.isNotNull(cLibrary);
-
-    LibrarySourceMirror coreLibrary =
-        mirrors.libraries[Uri.parse('dart:core')];
-    Expect.isNotNull(coreLibrary);
-
-    var dependencies = mainLibrary.libraryDependencies;
-    Expect.isNotNull(dependencies);
-    Expect.equals(6, dependencies.length);
-
-    // import 'a.dart' show A1, A2;
-    var dependency = dependencies[0];
-    Expect.isNotNull(dependency);
-    Expect.isTrue(dependency.isImport);
-    Expect.isFalse(dependency.isExport);
-    Expect.equals(mainLibrary, dependency.sourceLibrary);
-    Expect.equals(aLibrary, dependency.targetLibrary);
-    Expect.isNull(dependency.prefix);
-    Expect.isFalse(dependency.isDeferred);
-
-    var combinators = dependency.combinators;
-    Expect.isNotNull(combinators);
-    Expect.equals(1, combinators.length);
-
-    var combinator = combinators[0];
-    Expect.isNotNull(combinator);
-    Expect.isTrue(combinator.isShow);
-    Expect.isFalse(combinator.isHide);
-    Expect.listEquals(['A1', 'A2'], combinator.identifiers);
-
-    // import 'b.dart' as b hide B1;
-    dependency = dependencies[1];
-    Expect.isNotNull(dependency);
-    Expect.isTrue(dependency.isImport);
-    Expect.isFalse(dependency.isExport);
-    Expect.equals(mainLibrary, dependency.sourceLibrary);
-    Expect.equals(bLibrary, dependency.targetLibrary);
-    Expect.equals('b', dependency.prefix);
-    Expect.isFalse(dependency.isDeferred);
-
-    combinators = dependency.combinators;
-    Expect.isNotNull(combinators);
-    Expect.equals(1, combinators.length);
-
-    combinator = combinators[0];
-    Expect.isNotNull(combinator);
-    Expect.isFalse(combinator.isShow);
-    Expect.isTrue(combinator.isHide);
-    Expect.listEquals(['B1'], combinator.identifiers);
-
-    // export 'a.dart' show A2 hide A3, A1;
-    dependency = dependencies[2];
-    Expect.isNotNull(dependency);
-    Expect.isFalse(dependency.isImport);
-    Expect.isTrue(dependency.isExport);
-    Expect.equals(mainLibrary, dependency.sourceLibrary);
-    Expect.equals(aLibrary, dependency.targetLibrary);
-    Expect.isNull(dependency.prefix);
-    Expect.isFalse(dependency.isDeferred);
-
-    combinators = dependency.combinators;
-    Expect.isNotNull(combinators);
-    Expect.equals(2, combinators.length);
-
-    combinator = combinators[0];
-    Expect.isNotNull(combinator);
-    Expect.isTrue(combinator.isShow);
-    Expect.isFalse(combinator.isHide);
-    Expect.listEquals(['A2'], combinator.identifiers);
-
-    combinator = combinators[1];
-    Expect.isNotNull(combinator);
-    Expect.isFalse(combinator.isShow);
-    Expect.isTrue(combinator.isHide);
-    Expect.listEquals(['A3', 'A1'], combinator.identifiers);
-
-    // export 'b.dart' hide B1, B2 show B3;
-    dependency = dependencies[3];
-    Expect.isNotNull(dependency);
-    Expect.isFalse(dependency.isImport);
-    Expect.isTrue(dependency.isExport);
-    Expect.equals(mainLibrary, dependency.sourceLibrary);
-    Expect.equals(bLibrary, dependency.targetLibrary);
-    Expect.isNull(dependency.prefix);
-    Expect.isFalse(dependency.isDeferred);
-
-    combinators = dependency.combinators;
-    Expect.isNotNull(combinators);
-    Expect.equals(2, combinators.length);
-
-    combinator = combinators[0];
-    Expect.isNotNull(combinator);
-    Expect.isFalse(combinator.isShow);
-    Expect.isTrue(combinator.isHide);
-    Expect.listEquals(['B1', 'B2'], combinator.identifiers);
-
-    combinator = combinators[1];
-    Expect.isNotNull(combinator);
-    Expect.isTrue(combinator.isShow);
-    Expect.isFalse(combinator.isHide);
-    Expect.listEquals(['B3'], combinator.identifiers);
-
-    // import 'dart:core' as core;
-    dependency = dependencies[4];
-    Expect.isNotNull(dependency);
-    Expect.isTrue(dependency.isImport);
-    Expect.isFalse(dependency.isExport);
-    Expect.equals(mainLibrary, dependency.sourceLibrary);
-    Expect.equals(coreLibrary, dependency.targetLibrary);
-    Expect.equals('core', dependency.prefix);
-    Expect.isFalse(dependency.isDeferred);
-
-    combinators = dependency.combinators;
-    Expect.isNotNull(combinators);
-    Expect.equals(0, combinators.length);
-
-    // import 'c.dart' deferred as c;
-    dependency = dependencies[5];
-    Expect.isNotNull(dependency);
-    Expect.isTrue(dependency.isImport);
-    Expect.isFalse(dependency.isExport);
-    Expect.equals(mainLibrary, dependency.sourceLibrary);
-    Expect.equals(cLibrary, dependency.targetLibrary);
-    Expect.equals('c', dependency.prefix);
-    Expect.isTrue(dependency.isDeferred);
-
-    combinators = dependency.combinators;
-    Expect.isNotNull(combinators);
-    Expect.equals(0, combinators.length);
-  }));
-}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/mirrors_lookup_test.dart b/tests/compiler/dart2js/mirrors_lookup_test.dart
deleted file mode 100644
index 32e04e1..0000000
--- a/tests/compiler/dart2js/mirrors_lookup_test.dart
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.test.mirrors_lookup;
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'memory_compiler.dart';
-import 'package:compiler/src/mirrors/source_mirrors.dart';
-import 'package:compiler/src/mirrors/mirrors_util.dart';
-
-const Map MEMORY_SOURCE_FILES = const {
-  'main.dart': r"""
-
-library main;
-
-import 'dart:async' as async show Future;
-
-var variable;
-
-method(a, [b]) {}
-
-class Class<A> {
-  var field;
-  var variable;
-  method(c, {d}) {}
-}
-
-class Subclass<B> extends Class<B> {
-  var subfield;
-}
-""",
-};
-
-void main() {
-  asyncTest(() => mirrorSystemFor(MEMORY_SOURCE_FILES).then(
-      (MirrorSystem mirrors) => test(mirrors),
-      onError: (e) => Expect.fail('$e')));
-}
-
-void test(MirrorSystem mirrors) {
-  LibrarySourceMirror dartCore = mirrors.libraries[Uri.parse('dart:core')];
-  Expect.isNotNull(dartCore);
-
-  LibrarySourceMirror dartAsync = mirrors.libraries[Uri.parse('dart:async')];
-  Expect.isNotNull(dartAsync);
-
-  LibrarySourceMirror library = mirrors.libraries[Uri.parse('memory:main.dart')];
-  Expect.isNotNull(library);
-
-  // Check top-level scope.
-
-  DeclarationSourceMirror String_ = library.lookupInScope('String');
-  Expect.isTrue(String_ is ClassMirror);
-  Expect.equals(#String, String_.simpleName);
-  Expect.equals(dartCore, String_.owner);
-
-  Expect.isNull(library.lookupInScope('async'));
-  Expect.isNull(library.lookupInScope('Future'));
-  DeclarationSourceMirror Future_ = library.lookupInScope('async.Future');
-  Expect.isTrue(Future_ is ClassMirror);
-  Expect.equals(#Future, Future_.simpleName);
-  Expect.equals(dartAsync, Future_.owner);
-  // Timer is not in scope.
-  Expect.isNull(library.lookupInScope('Timer'));
-  // async.Timer is hidden.
-  Expect.isNull(library.lookupInScope('async.Timer'));
-
-  DeclarationSourceMirror variable = library.lookupInScope('variable');
-  Expect.isTrue(variable is VariableMirror);
-  Expect.equals(#variable, variable.simpleName);
-  Expect.equals(#main.variable, variable.qualifiedName);
-  Expect.equals(library, variable.owner);
-  // Parameter `a` is not in scope.
-  Expect.isNull(library.lookupInScope('a'));
-  // Parameter `b` is not in scope.
-  Expect.isNull(library.lookupInScope('b'));
-
-  DeclarationSourceMirror method = library.lookupInScope('method');
-  Expect.isTrue(method is MethodMirror);
-  Expect.equals(#method, method.simpleName);
-  Expect.equals(#main.method, method.qualifiedName);
-  Expect.equals(library, method.owner);
-
-  DeclarationSourceMirror Class = library.lookupInScope('Class');
-  Expect.isTrue(Class is ClassMirror);
-  Expect.equals(#Class, Class.simpleName);
-  Expect.equals(#main.Class, Class.qualifiedName);
-  Expect.equals(library, Class.owner);
-  // Type variable `A` is not in scope.
-  Expect.isNull(library.lookupInScope('A'));
-
-  DeclarationSourceMirror Subclass = library.lookupInScope('Subclass');
-  Expect.isTrue(Subclass is ClassMirror);
-  Expect.equals(#Subclass, Subclass.simpleName);
-  Expect.equals(#main.Subclass, Subclass.qualifiedName);
-  Expect.equals(library, Subclass.owner);
-  // Type variable `B` is not in scope.
-  Expect.isNull(library.lookupInScope('B'));
-
-  // Check top-level declaration scope.
-  checkTopScope(DeclarationSourceMirror declaration) {
-    Expect.equals(String_, declaration.lookupInScope('String'));
-    Expect.equals(Future_, declaration.lookupInScope('async.Future'));
-    Expect.isNull(method.lookupInScope('Timer'));
-    Expect.isNull(declaration.lookupInScope('async.Timer'));
-    Expect.equals(variable, declaration.lookupInScope('variable'));
-    Expect.equals(method, declaration.lookupInScope('method'));
-    Expect.equals(Class, declaration.lookupInScope('Class'));
-    // Type variable `A` is not in scope.
-    Expect.isNull(declaration.lookupInScope('A'));
-    // Field `field` is not in scope.
-    Expect.isNull(declaration.lookupInScope('field'));
-    Expect.equals(Subclass, declaration.lookupInScope('Subclass'));
-    // Type variable `B` is not in scope.
-    Expect.isNull(declaration.lookupInScope('B'));
-    // Field `subfield` is not in scope.
-    Expect.isNull(declaration.lookupInScope('subfield'));
-  }
-
-  checkTopScope(variable);
-  // Parameter `a` is not in scope of `variable`.
-  Expect.isNull(variable.lookupInScope('a'));
-  // Parameter `b` is not in scope of `variable`.
-  Expect.isNull(variable.lookupInScope('b'));
-
-  checkTopScope(method);
-  // Parameter `a` is in scope of `method`.
-  print(method.lookupInScope('a'));
-  Expect.isTrue(method.lookupInScope('a') is ParameterMirror);
-  // Parameter `b` is in scope of `method`.
-  Expect.isTrue(method.lookupInScope('b') is ParameterMirror);
-
-  // Check class scope.
-  DeclarationSourceMirror Class_field = Class.lookupInScope('field');
-  Expect.isTrue(Class_field is VariableMirror);
-  Expect.notEquals(variable, Class_field);
-  Expect.equals(Class, Class_field.owner);
-
-  DeclarationSourceMirror Class_variable = Class.lookupInScope('variable');
-  Expect.isTrue(Class_variable is VariableMirror);
-  Expect.notEquals(variable, Class_variable);
-  Expect.equals(Class, Class_variable.owner);
-
-  DeclarationSourceMirror Class_method = Class.lookupInScope('method');
-  Expect.isTrue(Class_method is MethodMirror);
-  Expect.notEquals(method, Class_method);
-  Expect.equals(Class, Class_method.owner);
-
-  checkClassScope(DeclarationSourceMirror declaration, {bool parametersInScope}) {
-    Expect.equals(String_, declaration.lookupInScope('String'));
-    Expect.equals(Future_, declaration.lookupInScope('async.Future'));
-    Expect.isNull(declaration.lookupInScope('Timer'));
-    Expect.isNull(declaration.lookupInScope('async.Timer'));
-
-    Expect.equals(Class_field, declaration.lookupInScope('field'));
-    Expect.equals(Class_variable, declaration.lookupInScope('variable'));
-    Expect.equals(Class_method, declaration.lookupInScope('method'));
-
-    // Parameter `a` is not in scope.
-    Expect.isNull(declaration.lookupInScope('a'));
-    // Parameter `b` is not in scope.
-    Expect.isNull(declaration.lookupInScope('b'));
-
-    if (parametersInScope) {
-      // Parameter `c` is in scope.
-      Expect.isTrue(declaration.lookupInScope('c') is ParameterMirror);
-      // Parameter `d` is in scope.
-      Expect.isTrue(declaration.lookupInScope('d') is ParameterMirror);
-    } else {
-      // Parameter `c` is not in scope.
-      Expect.isNull(declaration.lookupInScope('c'));
-      // Parameter `d` is not in scope.
-      Expect.isNull(declaration.lookupInScope('d'));
-    }
-
-    Expect.equals(Class, declaration.lookupInScope('Class'));
-    // Type variable `A` is in scope.
-    Expect.isTrue(declaration.lookupInScope('A') is TypeVariableMirror);
-    Expect.equals(Subclass, declaration.lookupInScope('Subclass'));
-    // Type variable `B` is not in scope.
-    Expect.isNull(declaration.lookupInScope('B'));
-    // Field `subfield` is not in scope.
-    Expect.isNull(declaration.lookupInScope('subfield'));
-  }
-  checkClassScope(Class, parametersInScope: false);
-  checkClassScope(Class_field, parametersInScope: false);
-  checkClassScope(Class_variable, parametersInScope: false);
-  checkClassScope(Class_method, parametersInScope: true);
-
-  // Check class scope.
-  DeclarationSourceMirror Subclass_subfield = Subclass.lookupInScope('subfield');
-  Expect.isTrue(Subclass_subfield is VariableMirror);
-  Expect.notEquals(variable, Subclass_subfield);
-  Expect.equals(Subclass, Subclass_subfield.owner);
-
-  checkSubclassScope(DeclarationSourceMirror declaration) {
-    Expect.equals(String_, declaration.lookupInScope('String'));
-    Expect.equals(Future_, declaration.lookupInScope('async.Future'));
-    Expect.isNull(declaration.lookupInScope('Timer'));
-    Expect.isNull(declaration.lookupInScope('async.Timer'));
-
-    // Top level `variable` is in scope.
-    Expect.equals(variable, declaration.lookupInScope('variable'));
-    // Top level `method` is in scope.
-    Expect.equals(method, declaration.lookupInScope('method'));
-
-    // Parameter `a` is not in scope
-    Expect.isNull(declaration.lookupInScope('a'));
-    // Parameter `b` is not in scope
-    Expect.isNull(declaration.lookupInScope('b'));
-
-    // Parameter `c` is not in scope.
-    Expect.isNull(declaration.lookupInScope('c'));
-    // Parameter `d` is not in scope.
-    Expect.isNull(declaration.lookupInScope('d'));
-
-    Expect.equals(Class, declaration.lookupInScope('Class'));
-    // Type variable `A` is not in scope
-    Expect.isNull(declaration.lookupInScope('A'));
-    // Field `field` is in scope
-    Expect.equals(Class_field, declaration.lookupInScope('field'));
-    Expect.equals(Subclass, declaration.lookupInScope('Subclass'));
-    // Type variable `B` is in scope
-    Expect.isTrue(declaration.lookupInScope('B') is TypeVariableMirror);
-    // Field `subfield` is in scope
-    Expect.equals(Subclass_subfield, declaration.lookupInScope('subfield'));
-  }
-  checkSubclassScope(Subclass);
-  checkSubclassScope(Subclass_subfield);
-
-  // `Timer` is in scope of `Future`.
-  Expect.isTrue(Future_.lookupInScope('Timer') is ClassMirror);
-
-  // Check qualified lookup.
-  Expect.equals(variable, lookupQualifiedInScope(library, 'variable'));
-  Expect.equals(method, lookupQualifiedInScope(library, 'method'));
-  Expect.isTrue(lookupQualifiedInScope(library, 'method.a') is ParameterMirror);
-
-  Expect.equals(Class, lookupQualifiedInScope(library, 'Class'));
-  Expect.isTrue(
-      lookupQualifiedInScope(library, 'Class.A') is TypeVariableMirror);
-
-  Expect.isNull(library.lookupInScope('Class.field'));
-  Expect.equals(Class_field, lookupQualifiedInScope(library, 'Class.field'));
-
-  Expect.equals(Class_method, lookupQualifiedInScope(library, 'Class.method'));
-  Expect.isTrue(
-      lookupQualifiedInScope(library, 'Class.method.c') is ParameterMirror);
-
-  // `field` should not be found through the prefix `Subclass`.
-  Expect.isNull(lookupQualifiedInScope(library, 'Subclass.field'));
-  Expect.equals(Subclass_subfield,
-                lookupQualifiedInScope(library, 'Subclass.subfield'));
-
-  Expect.equals(Future_, lookupQualifiedInScope(library, 'async.Future'));
-  Expect.isTrue(
-      lookupQualifiedInScope(library, 'async.Future.then') is MethodMirror);
-  // `Timer` should not be found through the prefix `async.Future`.
-  Expect.isNull(
-      lookupQualifiedInScope(library, 'async.Future.Timer'));
-}
diff --git a/tests/compiler/dart2js/mirrors_metadata_test.dart b/tests/compiler/dart2js/mirrors_metadata_test.dart
deleted file mode 100644
index 4097da7..0000000
--- a/tests/compiler/dart2js/mirrors_metadata_test.dart
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import "package:async_helper/async_helper.dart";
-import 'dart:async';
-import 'mirror_system_helper.dart';
-
-Future validateDeclarationComment(String code,
-                                String text,
-                                String trimmedText,
-                                bool isDocComment,
-                                List<Symbol> declarationNames) {
-  return createMirrorSystem(code).then((mirrors) {
-    LibraryMirror library = mirrors.libraries[SOURCE_URI];
-    Expect.isNotNull(library);
-    for (Symbol declarationName in declarationNames) {
-      DeclarationMirror declaration = library.declarations[declarationName];
-      Expect.isNotNull(declaration);
-      List<InstanceMirror> metadata = declaration.metadata;
-      Expect.isNotNull(metadata);
-      Expect.equals(1, metadata.length);
-      Expect.isTrue(metadata[0] is CommentInstanceMirror);
-      CommentInstanceMirror commentMetadata = metadata[0];
-      Expect.equals(text, commentMetadata.text);
-      Expect.equals(trimmedText, commentMetadata.trimmedText);
-      Expect.equals(isDocComment, commentMetadata.isDocComment);
-    }
-  });
-}
-
-Future testDeclarationComment(String declaration,
-                              List<Symbol> declarationNames) {
-  return Future.forEach([
-    () {
-      String text = 'Single line comment';
-      String comment = '// $text';
-      String code = '$comment\n$declaration';
-      return validateDeclarationComment(
-          code, comment, text, false, declarationNames);
-    },
-    () {
-      String text = 'Single line comment';
-      String comment = '/// $text';
-      String code = '$comment\n$declaration';
-      return validateDeclarationComment(
-          code, comment, text, true, declarationNames);
-    },
-    () {
-      String text = 'Multiline comment';
-      String comment = '/* $text*/';
-      String code = '$comment$declaration';
-      return validateDeclarationComment(
-          code, comment, text, false, declarationNames);
-    },
-    () {
-      String text = 'Multiline comment';
-      String comment = '/** $text*/';
-      String code = '$comment$declaration';
-      return validateDeclarationComment(
-          code, comment, text, true, declarationNames);
-    },
-  ], (f) => f());
-}
-
-void main() {
-  asyncTest(() => Future.forEach([
-    () => testDeclarationComment('var field;', [#field]),
-    () => testDeclarationComment('int field;', [#field]),
-    () => testDeclarationComment('int field = 0;', [#field]),
-    () => testDeclarationComment('int field1, field2;', [#field1, #field2]),
-    () => testDeclarationComment('final field = 0;', [#field]),
-    () => testDeclarationComment('final int field = 0;', [#field]),
-    () => testDeclarationComment('final field1 = 0, field2 = 0;',
-                                 [#field1, #field2]),
-    () => testDeclarationComment('final int field1 = 0, field2 = 0;',
-                                 [#field1, #field2]),
-    () => testDeclarationComment('const field = 0;', [#field]),
-    () => testDeclarationComment('const int field = 0;', [#field]),
-    () => testDeclarationComment('const field1 = 0, field2 = 0;',
-                                 [#field1, #field2]),
-    () => testDeclarationComment('const int field1 = 0, field2 = 0;',
-                                 [#field1, #field2]),
-  ], (f) => f()));
-}
diff --git a/tests/compiler/dart2js/mirrors_mixin_test.dart b/tests/compiler/dart2js/mirrors_mixin_test.dart
deleted file mode 100644
index d5ab821..0000000
--- a/tests/compiler/dart2js/mirrors_mixin_test.dart
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library mirrors_mixin_test;
-
-import 'package:expect/expect.dart';
-import 'package:async_helper/async_helper.dart';
-import 'mirror_system_helper.dart';
-
-const String CLASS_SOURCE = '''
-class A {}
-
-class S {}
-class M1<T> {}
-class M2 {}
-
-class C extends S with M1<A> {}
-class D extends S with M1, M2 {}
-class E extends S with M2, M1 implements A, M1 {}
-class E2 extends E {}
-
-class F = S with M1<A>;
-abstract class G = S with M1, M2;
-class H = S with M2, M1 implements A, M1;
-class H2 extends H {}
-''';
-
-void main() {
-  asyncTest(() => createMirrorSystem(CLASS_SOURCE).then((MirrorSystem mirrors) {
-    LibraryMirror library = mirrors.libraries[SOURCE_URI];
-
-    checkSimpleClass(var cls) {
-      Expect.isNotNull(cls);
-      Expect.isTrue(cls is ClassMirror);
-      Expect.isFalse(isMixinApplication(cls));
-      Expect.isFalse(cls.isNameSynthetic);
-      Expect.isFalse(isObject(cls));
-      Expect.isTrue(isObject(cls.superclass));
-      Expect.equals(0, cls.superinterfaces.length);
-
-      Expect.isTrue(isObject(getSuperclass(cls)));
-      Expect.isTrue(getAppliedMixins(cls).isEmpty);
-      Expect.isTrue(getExplicitInterfaces(cls).isEmpty);
-    }
-
-    // class A {}
-    var A = library.declarations[#A];
-    checkSimpleClass(A);
-
-    // class S {}
-    var S = library.declarations[#S];
-    checkSimpleClass(S);
-
-    // class M1 {}
-    var M1 = library.declarations[#M1];
-    checkSimpleClass(M1);
-
-    // class M2 {}
-    var M2 = library.declarations[#M2];
-    checkSimpleClass(M2);
-
-    // class C extends S with M1<A> {}
-    var C = library.declarations[#C];
-    Expect.isNotNull(C);
-    Expect.isTrue(C is ClassMirror);
-    Expect.isFalse(isMixinApplication(C));
-    Expect.isFalse(isObject(C));
-    Expect.equals(0, C.superinterfaces.length);
-    var C_super = C.superclass;
-    Expect.isNotNull(C_super);
-    Expect.isTrue(C_super is ClassMirror);
-    Expect.isTrue(isMixinApplication(C_super));
-    Expect.isTrue(C_super.isNameSynthetic);
-    Expect.equals(1, C_super.superinterfaces.length);
-    Expect.isTrue(containsType(M1, [A], C_super.superinterfaces));
-    Expect.isTrue(isInstance(M1, [A], C_super.mixin));
-    Expect.isFalse(isObject(C_super));
-    Expect.isTrue(isSameDeclaration(S, C_super.superclass));
-
-    Expect.isTrue(isSameDeclaration(S, getSuperclass(C)));
-    Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(C)));
-    Expect.isTrue(getExplicitInterfaces(C).isEmpty);
-
-    // D extends S with M1, M2 {}
-    var D = library.declarations[#D];
-    Expect.isNotNull(D);
-    Expect.isTrue(D is ClassMirror);
-    Expect.isFalse(isMixinApplication(D));
-    Expect.isFalse(isObject(D));
-    Expect.equals(0, D.superinterfaces.length);
-    var D_super = D.superclass;
-    Expect.isNotNull(D_super);
-    Expect.isTrue(D_super is ClassMirror);
-    Expect.isTrue(isMixinApplication(D_super));
-    Expect.isTrue(D_super.isNameSynthetic);
-    Expect.equals(1, D_super.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(M2, D_super.superinterfaces));
-    Expect.isTrue(isSameDeclaration(M2, D_super.mixin));
-    Expect.isFalse(isObject(D_super));
-    Expect.isFalse(isSameDeclaration(S, D_super.superclass));
-    var D_super_super = D_super.superclass;
-    Expect.isNotNull(D_super_super);
-    Expect.isTrue(D_super_super is ClassMirror);
-    Expect.isTrue(isMixinApplication(D_super_super));
-    Expect.isTrue(D_super_super.isNameSynthetic);
-    Expect.equals(1, D_super_super.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(M1, D_super_super.superinterfaces));
-    Expect.isTrue(isSameDeclaration(M1, D_super_super.mixin));
-    Expect.isFalse(isObject(D_super_super));
-    Expect.isTrue(isSameDeclaration(S, D_super_super.superclass));
-
-    Expect.isTrue(isSameDeclaration(S, getSuperclass(D)));
-    Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(D)));
-    Expect.isTrue(getExplicitInterfaces(D).isEmpty);
-
-    // class E extends S with M2, M1 implements A, M1 {}
-    var E = library.declarations[#E];
-    Expect.isNotNull(E);
-    Expect.isTrue(E is ClassMirror);
-    Expect.isFalse(isMixinApplication(E));
-    Expect.isFalse(isObject(E));
-    Expect.equals(2, E.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(A, E.superinterfaces));
-    Expect.isTrue(containsDeclaration(M1, E.superinterfaces));
-    var E_super = E.superclass;
-    Expect.isNotNull(E_super);
-    Expect.isTrue(E_super is ClassMirror);
-    Expect.isTrue(isMixinApplication(E_super));
-    Expect.isTrue(E_super.isNameSynthetic);
-    Expect.equals(1, E_super.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(M1, E_super.superinterfaces));
-    Expect.isTrue(isSameDeclaration(M1, E_super.mixin));
-    Expect.isFalse(isObject(E_super));
-    Expect.isFalse(isSameDeclaration(S, E_super.superclass));
-    var E_super_super = E_super.superclass;
-    Expect.isNotNull(E_super_super);
-    Expect.isTrue(E_super_super is ClassMirror);
-    Expect.isTrue(isMixinApplication(E_super_super));
-    Expect.isTrue(E_super_super.isNameSynthetic);
-    Expect.equals(1, E_super_super.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(M2, E_super_super.superinterfaces));
-    Expect.isTrue(isSameDeclaration(M2, E_super_super.mixin));
-    Expect.isFalse(isObject(E_super_super));
-    Expect.isTrue(isSameDeclaration(S, E_super_super.superclass));
-
-    Expect.isTrue(isSameDeclaration(S, getSuperclass(E)));
-    Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(E)));
-    Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(E)));
-
-    // class E2 extends E {}
-    var E2 = library.declarations[#E2];
-    Expect.isTrue(isSameDeclaration(E, getSuperclass(E2)));
-    Expect.isTrue(getAppliedMixins(E2).isEmpty);
-    Expect.isTrue(getExplicitInterfaces(E2).isEmpty);
-
-    // class F = S with M1<A>;
-    var F = library.declarations[#F];
-    Expect.isNotNull(F);
-    Expect.isTrue(F is ClassMirror);
-    Expect.isFalse(F.isAbstract);
-    Expect.isTrue(isMixinApplication(F));
-    Expect.isFalse(F.isNameSynthetic);
-    Expect.equals(#F, F.simpleName);
-    Expect.isFalse(isObject(F));
-    Expect.equals(1, F.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(M1, F.superinterfaces));
-    Expect.isTrue(isInstance(M1, [A], F.mixin));
-    var F_super = F.superclass;
-    Expect.isNotNull(F_super);
-    Expect.isTrue(F_super is ClassMirror);
-    Expect.isFalse(isMixinApplication(F_super));
-    Expect.isFalse(isObject(F_super));
-    Expect.isTrue(isSameDeclaration(S, F_super));
-
-    Expect.isTrue(isSameDeclaration(S, getSuperclass(F)));
-    Expect.isTrue(isSameDeclarationList([M1], getAppliedMixins(F)));
-    Expect.isTrue(getExplicitInterfaces(F).isEmpty);
-
-    // typedef G = abstract S with M1, M2;
-    var G = library.declarations[#G];
-    Expect.isNotNull(G);
-    Expect.isTrue(G is ClassMirror);
-    Expect.isTrue(G.isAbstract);
-    Expect.isTrue(isMixinApplication(G));
-    Expect.isFalse(G.isNameSynthetic);
-    Expect.equals(#G, G.simpleName);
-    Expect.isFalse(isObject(G));
-    Expect.equals(1, G.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(M2, G.superinterfaces));
-    Expect.isTrue(isSameDeclaration(M2, G.mixin));
-    var G_super = G.superclass;
-    Expect.isNotNull(G_super);
-    Expect.isTrue(G_super is ClassMirror);
-    Expect.isTrue(isMixinApplication(G_super));
-    Expect.equals(1, G_super.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(M1, G_super.superinterfaces));
-    Expect.isTrue(isSameDeclaration(M1, G_super.mixin));
-    Expect.isFalse(isObject(G_super));
-    Expect.isTrue(isSameDeclaration(S, G_super.superclass));
-
-    Expect.isTrue(isSameDeclaration(S, getSuperclass(G)));
-    Expect.isTrue(isSameDeclarationList([M1, M2], getAppliedMixins(G)));
-    Expect.isTrue(getExplicitInterfaces(G).isEmpty);
-
-    // typedef H = S with M2, M1 implements A, M1;
-    var H = library.declarations[#H];
-    Expect.isNotNull(H);
-    Expect.isTrue(H is ClassMirror);
-    Expect.isFalse(H.isAbstract);
-    Expect.isTrue(isMixinApplication(H));
-    Expect.isFalse(H.isNameSynthetic);
-    Expect.equals(#H, H.simpleName);
-    Expect.isFalse(isObject(H));
-    Expect.equals(3, H.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(A, H.superinterfaces));
-    Expect.isTrue(containsDeclaration(M1, H.superinterfaces));
-    Expect.isFalse(containsDeclaration(M2, H.superinterfaces));
-    Expect.isTrue(isSameDeclaration(M1, H.mixin));
-    var H_super = H.superclass;
-    Expect.isNotNull(H_super);
-    Expect.isTrue(H_super is ClassMirror);
-    Expect.isTrue(isMixinApplication(H_super));
-    Expect.equals(1, H_super.superinterfaces.length);
-    Expect.isTrue(containsDeclaration(M2, H_super.superinterfaces));
-    Expect.isTrue(isSameDeclaration(M2, H_super.mixin));
-    Expect.isFalse(isObject(H_super));
-    Expect.isTrue(isSameDeclaration(S, H_super.superclass));
-
-    Expect.isTrue(isSameDeclaration(S, getSuperclass(H)));
-    Expect.isTrue(isSameDeclarationList([M2, M1], getAppliedMixins(H)));
-    Expect.isTrue(isSameDeclarationSet([A, M1], getExplicitInterfaces(H)));
-
-    // class H2 extends H {}
-    var H2 = library.declarations[#H2];
-    Expect.isTrue(isSameDeclaration(H, getSuperclass(H2)));
-    Expect.isTrue(getAppliedMixins(H2).isEmpty);
-    Expect.isTrue(getExplicitInterfaces(H2).isEmpty);
-  }));
-}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index a96cf2a..71d92ae 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -69,7 +69,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 431;
+    int expectedMethodCount = 449;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 59dc3da..9c5b770 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -41,6 +41,7 @@
     FunctionElementX;
 
 import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/common/tasks.dart' show Measurer;
 
 import 'package:compiler/src/deferred_load.dart' show
     DeferredLoadTask,
@@ -69,6 +70,7 @@
   final DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
   final ResolvedUriTranslator resolvedUriTranslator =
       new MockResolvedUriTranslator();
+  final Measurer measurer = new Measurer();
 
   MockCompiler.internal(
       {Map<String, String> coreSource,
diff --git a/tests/compiler/dart2js/no_such_method_enabled_test.dart b/tests/compiler/dart2js/no_such_method_enabled_test.dart
index ac8e480..c9e651a 100644
--- a/tests/compiler/dart2js/no_such_method_enabled_test.dart
+++ b/tests/compiler/dart2js/no_such_method_enabled_test.dart
@@ -271,6 +271,25 @@
           clsA.lookupMember('noSuchMethod')));
 }
 
+Future dummyImplTest13() async {
+  String source = """
+class A {
+  noSuchMethod(x) => super.noSuchMethod(x) as dynamic;
+}
+main() {
+  print(new A().foo());
+}
+""";
+  Uri uri = new Uri(scheme: 'source');
+  var compiler = compilerFor(source, uri);
+  await compiler.run(uri);
+  Expect.isFalse(compiler.backend.enabledNoSuchMethod);
+  ClassElement clsA = findElement(compiler, 'A');
+  Expect.isTrue(
+      compiler.backend.noSuchMethodRegistry.defaultImpls.contains(
+          clsA.lookupMember('noSuchMethod')));
+}
+
 main() {
   asyncTest(() async {
     await dummyImplTest();
@@ -285,5 +304,6 @@
     await dummyImplTest10();
     await dummyImplTest11();
     await dummyImplTest12();
+    await dummyImplTest13();
   });
 }
diff --git a/tests/compiler/dart2js/override_inheritance_test.dart b/tests/compiler/dart2js/override_inheritance_test.dart
index ef4387f..f44b871 100644
--- a/tests/compiler/dart2js/override_inheritance_test.dart
+++ b/tests/compiler/dart2js/override_inheritance_test.dart
@@ -30,7 +30,7 @@
     compiler.parseScript(source);
     var cls = compiler.mainApp.find('Class');
     cls.ensureResolved(compiler.resolution);
-    MembersCreator.computeAllClassMembers(compiler, cls);
+    MembersCreator.computeAllClassMembers(compiler.resolution, cls);
 
     toList(o) => o == null ? [] : o is List ? o : [o];
 
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index 13556b7..a86aebe 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -92,6 +92,9 @@
         null, spannable,
         new Message(MessageTemplate.TEMPLATES[messageKind], arguments, false));
   }
+
+  @override
+  bool get hasReportedError => false;
 }
 
 Token scan(String text) =>
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index 2ee3d9e..762d074 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -319,7 +319,8 @@
   }
 
   @override
-  DiagnosticMessage createMessage(spannable, messageKind, [arguments]) {
+  DiagnosticMessage createMessage(
+      spannable, messageKind, [arguments = const {}]) {
     return new DiagnosticMessage(null, spannable, null);
   }
 }
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index 00ef722..2130f06 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -206,7 +206,7 @@
         }
 
         compiler.analyzeElement(origin);
-        compiler.enqueuer.resolution.emptyDeferredTaskQueue();
+        compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
 
         DiagnosticCollector collector = compiler.diagnosticCollector;
         Expect.isTrue(collector.warnings.isEmpty,
diff --git a/tests/compiler/dart2js/quarantined/mirrors_test.dart b/tests/compiler/dart2js/quarantined/mirrors_test.dart
deleted file mode 100644
index 428442f..0000000
--- a/tests/compiler/dart2js/quarantined/mirrors_test.dart
+++ /dev/null
@@ -1,974 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/mirrors/source_mirrors.dart';
-import 'package:compiler/src/mirrors/mirrors_util.dart';
-import 'package:compiler/src/mirrors/analyze.dart';
-import 'package:compiler/src/filenames.dart'
-       show currentDirectory;
-import 'package:compiler/src/source_file_provider.dart';
-
-import 'dart:io';
-
-final Uri DART_MIRRORS_URI = new Uri(scheme: 'dart', path: 'mirrors');
-
-int count(Iterable iterable) {
-  var count = 0;
-  for (var element in iterable) {
-    count++;
-  }
-  return count;
-}
-
-bool containsType(TypeMirror expected, Iterable<TypeMirror> iterable) {
-  for (var element in iterable) {
-    if (element.originalDeclaration == expected.originalDeclaration) {
-      return true;
-    }
-  }
-  return false;
-}
-
-DeclarationMirror findMirror(Iterable<DeclarationMirror> list, Symbol name) {
-  for (DeclarationMirror mirror in list) {
-    if (mirror.simpleName == name) {
-      return mirror;
-    }
-  }
-  return null;
-}
-
-main() {
-  Uri scriptUri = currentDirectory.resolveUri(Platform.script);
-  Uri packageRoot = scriptUri.resolve('../packages/');
-  Uri libUri = scriptUri.resolve('../../../../sdk/');
-  Uri inputUri = scriptUri.resolve('../data/mirrors_helper.dart');
-  var provider = new CompilerSourceFileProvider();
-  var diagnosticHandler = new FormattingDiagnosticHandler(provider);
-  asyncStart();
-  var result = analyze([inputUri], libUri, packageRoot,
-                       provider.readStringFromUri, diagnosticHandler,
-                       <String>['--preserve-comments']);
-  result.then((MirrorSystem mirrors) {
-    test(mirrors);
-  }).then(asyncSuccess);
-}
-
-void test(MirrorSystem mirrors) {
-  Expect.isNotNull(mirrors, "No mirror system returned from compilation");
-
-  var libraries = mirrors.libraries;
-  Expect.isNotNull(libraries, "No libraries map returned");
-  Expect.isFalse(libraries.isEmpty, "Empty libraries map returned");
-
-  var helperLibrary = findMirror(libraries.values, #mirrors_helper);
-  Expect.isNotNull(helperLibrary, "Library 'mirrors_helper' not found");
-  Expect.equals(#mirrors_helper, helperLibrary.simpleName,
-    "Unexpected library simple name");
-  Expect.equals(#mirrors_helper, helperLibrary.qualifiedName,
-    "Unexpected library qualified name");
-  Expect.equals(helperLibrary, mirrors.findLibrary(#mirrors_helper));
-
-  var helperLibraryLocation = helperLibrary.location;
-  Expect.isNotNull(helperLibraryLocation);
-  Expect.equals(271, helperLibraryLocation.offset, "Unexpected offset");
-  Expect.equals(23, helperLibraryLocation.length, "Unexpected length");
-  Expect.equals(9, helperLibraryLocation.line, "Unexpected line");
-  Expect.equals(1, helperLibraryLocation.column, "Unexpected column");
-
-
-  var declarations = helperLibrary.declarations;
-  Expect.isNotNull(declarations, "No declarations map returned");
-  Expect.isFalse(declarations.isEmpty, "Empty declarations map returned");
-
-  testFoo(mirrors, helperLibrary, declarations);
-  testBar(mirrors, helperLibrary, declarations);
-  testBaz(mirrors, helperLibrary, declarations);
-  // TODO(johnniwinther): Add test of class [Boz] and typedef [Func].
-  // TODO(johnniwinther): Add tests of type argument substitution, which
-  // is not currently implemented in dart2js.
-  // TODO(johnniwinther): Add tests of Location and Source.
-  testPrivate(mirrors, helperLibrary, declarations);
-}
-
-// Testing class Foo:
-//
-// class Foo {
-//
-// }
-void testFoo(MirrorSystem system, LibraryMirror helperLibrary,
-             Map<Symbol, DeclarationMirror> declarations) {
-  var fooClass = declarations[#Foo];
-  Expect.isNotNull(fooClass, "Type 'Foo' not found");
-  Expect.isTrue(fooClass is ClassMirror,
-                "Unexpected mirror type returned");
-  Expect.equals(#Foo, fooClass.simpleName,
-                      "Unexpected type simple name");
-  Expect.equals(#mirrors_helper.Foo, fooClass.qualifiedName,
-                      "Unexpected type qualified name");
-
-  Expect.equals(helperLibrary, getLibrary(fooClass),
-                "Unexpected library returned from type");
-
-  Expect.isFalse(isObject(fooClass), "Class is Object");
-  Expect.isFalse(fooClass.isDynamic, "Class is dynamic");
-  Expect.isFalse(fooClass.isVoid, "Class is void");
-  Expect.isFalse(fooClass is TypeVariableMirror, "Class is a type variable");
-  Expect.isFalse(fooClass is TypedefMirror, "Class is a typedef");
-  Expect.isFalse(fooClass is FunctionTypeMirror, "Class is a function");
-
-  Expect.isTrue(fooClass.isOriginalDeclaration);
-  Expect.equals(fooClass, fooClass.originalDeclaration);
-
-  Expect.isTrue(fooClass is ClassMirror, "Class is not class");
-  Expect.isFalse(fooClass.isAbstract);
-  Expect.isFalse(fooClass.isPrivate, "Class is private");
-
-  var objectType = fooClass.superclass;
-  Expect.isNotNull(objectType, "Superclass is null");
-  Expect.isTrue(isObject(objectType), "Object is not Object");
-  Expect.isTrue(objectType.isOriginalDeclaration);
-  Expect.isTrue(containsType(fooClass,
-                             computeSubdeclarations(system, objectType)),
-                "Class is not subclass of superclass");
-
-  var fooInterfaces = fooClass.superinterfaces;
-  Expect.isNotNull(fooInterfaces, "Interfaces map is null");
-  Expect.isTrue(fooInterfaces.isEmpty, "Interfaces map is not empty");
-
-  var fooSubdeclarations = computeSubdeclarations(system, fooClass);
-  Expect.equals(1, count(fooSubdeclarations), "Unexpected subtype count");
-  for (var fooSubdeclaration in fooSubdeclarations) {
-    Expect.equals(fooClass, fooSubdeclaration.superclass.originalDeclaration);
-  }
-
-  Expect.isTrue(fooClass.typeArguments.isEmpty);
-  var fooClassTypeVariables = fooClass.typeVariables;
-  Expect.isNotNull(fooClassTypeVariables, "Type variable list is null");
-  Expect.isTrue(fooClassTypeVariables.isEmpty,
-                "Type variable list is not empty");
-
-  var fooClassMembers = fooClass.declarations;
-  Expect.isNotNull(fooClassMembers, "Declared members map is null");
-  Expect.equals(1, fooClassMembers.length);
-
-  var fooM = fooClassMembers[#m];
-  Expect.isNotNull(fooM);
-  Expect.isTrue(fooM is MethodMirror);
-  Expect.equals(1, fooM.parameters.length);
-  var fooMa = fooM.parameters[0];
-  Expect.isNotNull(fooMa);
-  Expect.isTrue(fooMa is ParameterMirror);
-
-  //////////////////////////////////////////////////////////////////////////////
-  // Metadata tests
-  //////////////////////////////////////////////////////////////////////////////
-
-  var metadataList = fooClass.metadata;
-  Expect.isNotNull(metadataList);
-  Expect.equals(14, metadataList.length);
-  var metadataListIndex = 0;
-  var metadata;
-
-  var dartMirrorsLibrary = system.libraries[DART_MIRRORS_URI];
-  Expect.isNotNull(dartMirrorsLibrary);
-  var commentType = dartMirrorsLibrary.declarations[#Comment];
-  Expect.isNotNull(commentType);
-
-  // /// Singleline doc comment.
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.isTrue(metadata is CommentInstanceMirror,
-      "Unexpected metadata: $metadata");
-  Expect.equals(commentType.originalDeclaration, metadata.type);
-  Expect.isTrue(metadata.isDocComment);
-  Expect.stringEquals(
-      "/// Singleline doc comment.", metadata.text);
-  Expect.stringEquals(
-      "Singleline doc comment.", metadata.trimmedText);
-
-  // @Metadata(null)
-  metadata = metadataList[metadataListIndex++];
-  var metadataType = metadata.type;
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.isTrue(metadataType.isOriginalDeclaration);
-  InstanceMirror data = metadata.getField(#data);
-  Expect.isNotNull(data);
-  Expect.isTrue(data.hasReflectee);
-  Expect.isNull(data.reflectee);
-
-  // Singleline comment 1.
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.isTrue(metadata is CommentInstanceMirror);
-  Expect.equals(commentType.originalDeclaration, metadata.type);
-  Expect.isFalse(metadata.isDocComment);
-  Expect.stringEquals(
-      "// Singleline comment 1.", metadata.text);
-  Expect.stringEquals(
-      "Singleline comment 1.", metadata.trimmedText);
-
-  // Singleline comment 2.
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.isTrue(metadata is CommentInstanceMirror);
-  Expect.equals(commentType.originalDeclaration, metadata.type);
-  Expect.isFalse(metadata.isDocComment);
-  Expect.stringEquals(
-      "// Singleline comment 2.", metadata.text);
-  Expect.stringEquals(
-      "Singleline comment 2.", metadata.trimmedText);
-
-  // @Metadata(true)
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.equals(metadataType.originalDeclaration, metadata.type);
-  data = metadata.getField(#data);
-  Expect.isNotNull(data);
-  Expect.isTrue(data.hasReflectee);
-  Expect.isTrue(data.reflectee);
-
-  // @Metadata(false)
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.equals(metadataType.originalDeclaration, metadata.type);
-  data = metadata.getField(#data);
-  Expect.isNotNull(data);
-  Expect.isTrue(data.hasReflectee);
-  Expect.isFalse(data.reflectee);
-
-  // @Metadata(0)
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.equals(metadataType.originalDeclaration, metadata.type);
-  data = metadata.getField(#data);
-  Expect.isNotNull(data);
-  Expect.isTrue(data.hasReflectee);
-  Expect.equals(0, data.reflectee);
-
-  // @Metadata(1.5)
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.equals(metadataType.originalDeclaration, metadata.type);
-  data = metadata.getField(#data);
-  Expect.isNotNull(data);
-  Expect.isTrue(data.hasReflectee);
-  Expect.equals(1.5, data.reflectee);
-
-  // @Metadata("Foo")
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.equals(metadataType.originalDeclaration, metadata.type);
-  data = metadata.getField(#data);
-  Expect.isNotNull(data);
-  Expect.isTrue(data.hasReflectee);
-  Expect.stringEquals("Foo", data.reflectee);
-
-  // @Metadata(const ["Foo"])
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.equals(metadataType.originalDeclaration, metadata.type);
-  data = metadata.getField(#data);
-  Expect.isTrue(data is ListInstanceMirror);
-  Expect.isFalse(data.hasReflectee);
-  Expect.throws(() => data.reflectee, (_) => true);
-  ListInstanceMirror listData = data;
-  Expect.equals(1, listData.length);
-  InstanceMirror element = listData.getElement(0);
-  Expect.isNotNull(element);
-  Expect.isTrue(element.hasReflectee);
-  Expect.stringEquals("Foo", element.reflectee);
-
-  // @Metadata(/* Inline comment */ const {'foo':"Foo"})
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.equals(metadataType.originalDeclaration, metadata.type);
-  data = metadata.getField(#data);
-  Expect.isTrue(data is MapInstanceMirror);
-  Expect.isFalse(data.hasReflectee);
-  Expect.throws(() => data.reflectee, (_) => true);
-  MapInstanceMirror mapData = data;
-  Expect.equals(1, mapData.length);
-  var it = mapData.keys.iterator;
-  Expect.isTrue(it.moveNext());
-  Expect.stringEquals('foo', it.current);
-  element = mapData.getValue('foo');
-  Expect.isNotNull(element);
-  Expect.isTrue(element.hasReflectee);
-  Expect.stringEquals("Foo", element.reflectee);
-  Expect.isNull(mapData.getValue('bar'));
-
-  // @metadata
-  var metadataRef = metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.equals(metadataType.originalDeclaration, metadata.type);
-  data = metadata.getField(#data);
-  Expect.isNotNull(data);
-  Expect.isTrue(data.hasReflectee);
-  Expect.isNull(data.reflectee);
-
-  // /** Multiline doc comment. */
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.isTrue(metadata is CommentInstanceMirror);
-  Expect.equals(commentType.originalDeclaration, metadata.type);
-  Expect.isTrue(metadata.isDocComment);
-  Expect.stringEquals(
-      "/** Multiline doc comment. */", metadata.text);
-  Expect.stringEquals(
-      "Multiline doc comment. ", metadata.trimmedText);
-
-  // /* Multiline comment. */
-  metadata = metadataList[metadataListIndex++];
-  Expect.isTrue(metadata is InstanceMirror);
-  Expect.isFalse(metadata.hasReflectee);
-  Expect.throws(() => metadata.reflectee, (_) => true);
-  Expect.isTrue(metadata is CommentInstanceMirror);
-  Expect.equals(commentType.originalDeclaration, metadata.type);
-  Expect.isFalse(metadata.isDocComment);
-  Expect.stringEquals(
-      "/* Multiline comment. */", metadata.text);
-  Expect.stringEquals(
-      "Multiline comment. ", metadata.trimmedText);
-
-  Expect.equals(metadataList.length, metadataListIndex);
-
-  Expect.isNotNull(fooMa.metadata);
-  Expect.equals(1, fooMa.metadata.length);
-  Expect.equals(metadataRef, fooMa.metadata[0]);
-
-  //////////////////////////////////////////////////////////////////////////////
-  // Location test
-  //////////////////////////////////////////////////////////////////////////////
-
-  var fooClassLocation = fooClass.location;
-  Expect.isNotNull(fooClassLocation);
-  // Expect the location to start with the first metadata, not including the
-  // leading comment.
-  Expect.equals(376, fooClassLocation.offset, "Unexpected offset");
-  // Expect the location to end with the class body.
-  Expect.equals(298, fooClassLocation.length, "Unexpected length");
-  Expect.equals(18, fooClassLocation.line, "Unexpected line");
-  Expect.equals(1, fooClassLocation.column, "Unexpected column");
-
-}
-
-// Testing abstract class Bar:
-//
-// abstract class Bar<E> {
-//
-// }
-void testBar(MirrorSystem system, LibraryMirror helperLibrary,
-             Map<Symbol, DeclarationMirror> classes) {
-  var barClass = classes[#Bar];
-  Expect.isNotNull(barClass, "Type 'Bar' not found");
-  Expect.isTrue(barClass is ClassMirror,
-               "Unexpected mirror type returned");
-  Expect.equals(#Bar, barClass.simpleName,
-                      "Unexpected type simple name");
-  Expect.equals(#mirrors_helper.Bar, barClass.qualifiedName,
-                "Unexpected type qualified name");
-
-  Expect.equals(helperLibrary, getLibrary(barClass),
-                "Unexpected library returned from type");
-
-  Expect.isFalse(isObject(barClass), "Interface is Object");
-  Expect.isFalse(barClass.isDynamic, "Interface is dynamic");
-  Expect.isFalse(barClass.isVoid, "Interface is void");
-  Expect.isFalse(barClass is TypeVariableMirror, "Interface is a type variable");
-  Expect.isFalse(barClass is TypedefMirror, "Interface is a typedef");
-  Expect.isFalse(barClass is FunctionTypeMirror, "Interface is a function");
-
-  Expect.isTrue(barClass.isOriginalDeclaration);
-  Expect.equals(barClass, barClass.originalDeclaration);
-
-  Expect.isTrue(barClass is ClassMirror);
-  Expect.isTrue(barClass.isAbstract);
-  Expect.isFalse(barClass.isPrivate, "Interface is private");
-
-  var objectType = barClass.superclass;
-  Expect.isNotNull(objectType, "Superclass is null");
-  Expect.isTrue(isObject(objectType), "Object is not Object");
-  Expect.isTrue(objectType.isOriginalDeclaration);
-  Expect.isTrue(containsType(barClass,
-                             computeSubdeclarations(system, objectType)),
-                "Class is not subclass of superclass");
-
-  var barInterfaces = barClass.superinterfaces;
-  Expect.isNotNull(barInterfaces, "Interfaces map is null");
-  Expect.isTrue(barInterfaces.isEmpty, "Interfaces map is not empty");
-
-  var barSubdeclarations = computeSubdeclarations(system, barClass);
-  Expect.equals(1, count(barSubdeclarations), "Unexpected subtype count");
-  for (var barSubdeclaration in barSubdeclarations) {
-    Expect.isTrue(containsType(barClass,
-                               barSubdeclaration.superinterfaces),
-                  "Interface is not superinterface of subclass");
-  }
-
-  Expect.isTrue(barClass.typeArguments.isEmpty);
-  var barInterfaceTypeVariables = barClass.typeVariables;
-  Expect.isNotNull(barInterfaceTypeVariables, "Type variable list is null");
-  Expect.isFalse(barInterfaceTypeVariables.isEmpty,
-                 "Type variable list is empty");
-  Expect.equals(barInterfaceTypeVariables.length, 1,
-                "Unexpected number of type variables");
-
-  var barE = barInterfaceTypeVariables[0];
-  Expect.isNotNull(barE, "Type variable is null");
-  Expect.isTrue(barE is TypeVariableMirror);
-
-  var barInterfaceMembers = barClass.declarations;
-  Expect.isNotNull(barInterfaceMembers, "Declared members map is null");
-  Expect.isTrue(barInterfaceMembers.isEmpty,
-                "Declarations map is unempty");
-
-  var metadata = barClass.metadata;
-  Expect.isNotNull(metadata);
-  Expect.equals(0, metadata.length);
-}
-
-// Testing class Baz:
-//
-// class Baz<E,F extends Foo> implements Bar<E> {
-//   Baz();
-//   const Baz.named();
-//   factory Baz.factory() => new Baz<E,F>();
-//
-//   static method1(e) {}
-//   void method2(E e, [F f = null]) {}
-//   Baz<E,F> method3(E func1(F f), Func<E,F> func2) => null;
-//
-//   bool operator==(Object other) => false;
-//   int operator -() => 0;
-//   operator$foo() {}
-// }
-void testBaz(MirrorSystem system, LibraryMirror helperLibrary,
-             Map<Symbol, DeclarationMirror> declarations) {
-  var bazClass = declarations[#Baz];
-  Expect.isNotNull(bazClass, "Type 'Baz' not found");
-  Expect.isTrue(bazClass is ClassMirror,
-                "Unexpected mirror type returned");
-  Expect.equals(#Baz, bazClass.simpleName,
-                "Unexpected type simple name");
-  Expect.equals(#mirrors_helper.Baz, bazClass.qualifiedName,
-                "Unexpected type qualified name");
-
-  Expect.equals(helperLibrary, getLibrary(bazClass),
-                "Unexpected library returned from type");
-
-  Expect.isFalse(isObject(bazClass), "Class is Object");
-  Expect.isFalse(bazClass.isDynamic, "Class is dynamic");
-  Expect.isFalse(bazClass.isVoid, "Class is void");
-  Expect.isFalse(bazClass is TypeVariableMirror, "Class is a type variable");
-  Expect.isFalse(bazClass is TypedefMirror, "Class is a typedef");
-  Expect.isFalse(bazClass is FunctionTypeMirror, "Class is a function");
-
-  Expect.isTrue(bazClass.isOriginalDeclaration);
-  Expect.equals(bazClass, bazClass.originalDeclaration);
-
-  Expect.isTrue(bazClass is ClassMirror, "Class is not class");
-  Expect.isFalse(bazClass.isAbstract);
-  Expect.isFalse(bazClass.isPrivate, "Class is private");
-
-  var objectType = bazClass.superclass;
-  Expect.isNotNull(objectType, "Superclass is null");
-  Expect.isTrue(isObject(objectType), "Object is not Object");
-  Expect.isTrue(objectType.isOriginalDeclaration);
-  Expect.isTrue(containsType(bazClass,
-                             computeSubdeclarations(system, objectType)),
-                "Class is not subclass of superclass");
-
-  var bazInterfaces = bazClass.superinterfaces;
-  Expect.isNotNull(bazInterfaces, "Interfaces map is null");
-  Expect.isTrue(!bazInterfaces.isEmpty, "Interfaces map is empty");
-  for (var bazInterface in bazInterfaces) {
-    Expect.isTrue(containsType(bazClass,
-                               computeSubdeclarations(system, objectType)),
-                  "Class is not subclass of superinterface");
-  }
-
-  var bazSubdeclarations = computeSubdeclarations(system, bazClass);
-  Expect.equals(0, count(bazSubdeclarations), "Unexpected subtype count");
-
-  var barInterface = findMirror(bazInterfaces, #Bar);
-  Expect.isNotNull(barInterface, "Interface bar is missing");
-  Expect.isFalse(barInterface.isOriginalDeclaration);
-  var barInterfaceTypeArguments = barInterface.typeArguments;
-  Expect.isNotNull(barInterfaceTypeArguments, "Type arguments are missing");
-  Expect.equals(1, barInterfaceTypeArguments.length,
-                "Type arguments is empty");
-
-  Expect.isTrue(bazClass.typeArguments.isEmpty, "Class has type arguments");
-  var bazClassTypeVariables = bazClass.typeVariables;
-  Expect.isNotNull(bazClassTypeVariables, "Type variable list is null");
-  Expect.equals(2, bazClassTypeVariables.length,
-                "Type variable list is not empty");
-
-  var bazE = bazClassTypeVariables[0];
-  Expect.isNotNull(bazE, "Type variable is null");
-  Expect.equals(#E, bazE.simpleName, "Unexpected simpleName");
-  Expect.equals(#mirrors_helper.Baz.E, bazE.qualifiedName,
-                "Unexpected qualifiedName");
-  Expect.equals(bazClass, bazE.owner,
-                "Unexpected type variable declarer");
-  var bazEbound = bazE.upperBound;
-  Expect.isNotNull(bazEbound);
-  Expect.isTrue(bazEbound.isOriginalDeclaration);
-  Expect.isTrue(isObject(bazEbound), "Bound is not object");
-
-  var bazF = bazClassTypeVariables[1];
-  Expect.isNotNull(bazF, "Type variable is null");
-  Expect.equals(#F, bazF.simpleName, "Unexpected simpleName");
-  Expect.equals(#mirrors_helper.Baz.F, bazF.qualifiedName,
-                "Unexpected qualifiedName");
-  Expect.equals(bazClass, bazF.owner);
-  var bazFbound = bazF.upperBound;
-  Expect.isNotNull(bazFbound);
-  Expect.isTrue(bazFbound.isOriginalDeclaration);
-  Expect.equals(#mirrors_helper.Foo, bazFbound.qualifiedName,
-                "Bound is not Foo");
-
-  var bazClassMembers = bazClass.declarations;
-  Expect.isNotNull(bazClassMembers, "Declared members map is null");
-  Expect.equals(9, bazClassMembers.length,
-                "Unexpected number of declared members");
-
-  ////////////////////////////////////////////////////////////////////////////
-  // static method1(e) {}
-  ////////////////////////////////////////////////////////////////////////////
-  var method1 = bazClassMembers[#method1];
-  Expect.isNotNull(method1, "method1 not found");
-  Expect.equals(#method1, method1.simpleName);
-  Expect.equals(#mirrors_helper.Baz.method1, method1.qualifiedName);
-  Expect.equals(method1.owner, bazClass);
-  Expect.isFalse(method1.isTopLevel);
-  Expect.isTrue(method1 is MethodMirror);
-  Expect.isFalse(method1.isConstructor);
-  Expect.isFalse(method1.isPrivate);
-  Expect.isTrue(method1.isStatic);
-  Expect.isTrue(method1.isRegularMethod);
-  Expect.isFalse(method1.isConstConstructor);
-  Expect.isFalse(method1.isGenerativeConstructor);
-  Expect.isFalse(method1.isRedirectingConstructor);
-  Expect.isFalse(method1.isFactoryConstructor);
-  Expect.isFalse(method1.isGetter);
-  Expect.isFalse(method1.isSetter);
-  Expect.isFalse(method1.isOperator);
-
-  var dynamicType = method1.returnType;
-  Expect.isNotNull(dynamicType, "Return type was null");
-  Expect.isFalse(isObject(dynamicType), "dynamic is Object");
-  Expect.isTrue(dynamicType.isDynamic, "dynamic is not dynamic");
-  Expect.isFalse(dynamicType.isVoid, "dynamic is void");
-  Expect.isFalse(dynamicType is TypeVariableMirror, "dynamic is a type variable");
-  Expect.isFalse(dynamicType is TypedefMirror, "dynamic is a typedef");
-  Expect.isFalse(dynamicType is FunctionTypeMirror, "dynamic is a function");
-
-  var method1Parameters = method1.parameters;
-  Expect.isNotNull(method1Parameters, "Method parameters is null");
-  Expect.equals(1, method1Parameters.length, "Unexpected parameter count");
-  var method1Parameter1 = method1Parameters[0];
-  Expect.isNotNull(method1Parameter1, "Parameter is null");
-  Expect.equals(dynamicType, method1Parameter1.type);
-  Expect.equals(#e, method1Parameter1.simpleName);
-  Expect.equals(#mirrors_helper.Baz.method1.e, method1Parameter1.qualifiedName);
-  Expect.isFalse(method1Parameter1.hasDefaultValue,
-    "Parameter has default value");
-  Expect.isNull(method1Parameter1.defaultValue,
-    "Parameter default value is non-null");
-  Expect.isFalse(method1Parameter1.isOptional, "Parameter is optional");
-
-  ////////////////////////////////////////////////////////////////////////////
-  // static void method2(E e, [F f = null]) {}
-  ////////////////////////////////////////////////////////////////////////////
-  var method2 = bazClassMembers[#method2];
-  Expect.isNotNull(method2, "method2 not found");
-  Expect.equals(#method2, method2.simpleName);
-  Expect.equals(#mirrors_helper.Baz.method2, method2.qualifiedName);
-  Expect.equals(method2.owner, bazClass);
-  Expect.isFalse(method2.isTopLevel);
-  Expect.isTrue(method2 is MethodMirror);
-  Expect.isFalse(method2.isConstructor);
-  Expect.isFalse(method2.isPrivate);
-  Expect.isFalse(method2.isStatic);
-  Expect.isTrue(method2.isRegularMethod);
-  Expect.isFalse(method2.isConstConstructor);
-  Expect.isFalse(method2.isGenerativeConstructor);
-  Expect.isFalse(method2.isRedirectingConstructor);
-  Expect.isFalse(method2.isFactoryConstructor);
-  Expect.isFalse(method2.isGetter);
-  Expect.isFalse(method2.isSetter);
-  Expect.isFalse(method2.isOperator);
-
-  var voidType = method2.returnType;
-  Expect.isNotNull(voidType, "Return type was null");
-  Expect.isFalse(isObject(voidType), "void is Object");
-  Expect.isFalse(voidType.isDynamic, "void is dynamic");
-  Expect.isTrue(voidType.isVoid, "void is not void");
-  Expect.isFalse(voidType is TypeVariableMirror, "void is a type variable");
-  Expect.isFalse(voidType is TypedefMirror, "void is a typedef");
-  Expect.isFalse(voidType is FunctionTypeMirror, "void is a function");
-
-  var method2Parameters = method2.parameters;
-  Expect.isNotNull(method2Parameters, "Method parameters is null");
-  Expect.equals(2, method2Parameters.length, "Unexpected parameter count");
-  var method2Parameter1 = method2Parameters[0];
-  Expect.isNotNull(method2Parameter1, "Parameter is null");
-  Expect.equals(bazE, method2Parameter1.type);
-  Expect.equals(#e, method2Parameter1.simpleName);
-  Expect.equals(#mirrors_helper.Baz.method2.e, method2Parameter1.qualifiedName);
-  Expect.isFalse(method2Parameter1.hasDefaultValue,
-                      "Parameter has default value");
-  Expect.isNull(method2Parameter1.defaultValue,
-                "Parameter default value is non-null");
-  Expect.isFalse(method2Parameter1.isOptional, "Parameter is optional");
-  var method2Parameter2 = method2Parameters[1];
-  Expect.isNotNull(method2Parameter2, "Parameter is null");
-  Expect.equals(bazF, method2Parameter2.type);
-  Expect.equals(#f, method2Parameter2.simpleName);
-  Expect.equals(#mirrors_helper.Baz.method2.f,
-                method2Parameter2.qualifiedName);
-  Expect.isTrue(method2Parameter2.hasDefaultValue,
-                 "Parameter has default value");
-  Expect.isNotNull(method2Parameter2.defaultValue,
-                   "Parameter default value is null");
-  Expect.isTrue(method2Parameter2.isOptional, "Parameter is not optional");
-
-  ////////////////////////////////////////////////////////////////////////////
-  // Baz<E,F> method3(E func1(F f), Func<E,F> func2) => null;
-  ////////////////////////////////////////////////////////////////////////////
-  var method3 = bazClassMembers[#method3];
-  Expect.isNotNull(method3, "method3 not found");
-  Expect.equals(#method3, method3.simpleName);
-  Expect.equals(#mirrors_helper.Baz.method3, method3.qualifiedName);
-  Expect.equals(method3.owner, bazClass);
-  Expect.isFalse(method3.isTopLevel);
-  Expect.isTrue(method3 is MethodMirror);
-  Expect.isFalse(method3.isConstructor);
-  Expect.isFalse(method3.isPrivate);
-  Expect.isFalse(method3.isStatic);
-  Expect.isTrue(method3.isRegularMethod);
-  Expect.isFalse(method3.isConstConstructor);
-  Expect.isFalse(method3.isGenerativeConstructor);
-  Expect.isFalse(method3.isRedirectingConstructor);
-  Expect.isFalse(method3.isFactoryConstructor);
-  Expect.isFalse(method3.isGetter);
-  Expect.isFalse(method3.isSetter);
-  Expect.isFalse(method3.isOperator);
-
-  var method3ReturnType = method3.returnType;
-  Expect.isNotNull(method3ReturnType, "Return type is null");
-  Expect.isTrue(method3ReturnType is ClassMirror,
-                "Return type is not interface");
-  Expect.equals(bazClass, method3ReturnType.originalDeclaration);
-  // TODO(johnniwinther): Test type arguments of [method3ReturnType].
-
-  var method3Parameters = method3.parameters;
-  Expect.isNotNull(method3Parameters, "Method parameters is null");
-  Expect.equals(2, method3Parameters.length, "Unexpected parameter count");
-  var method3Parameter1 = method3Parameters[0];
-  Expect.isNotNull(method3Parameter1, "Parameter is null");
-  var method3Parameter1type = method3Parameter1.type;
-  Expect.isNotNull(method3Parameter1type, "Parameter type of 'func1' is null");
-  Expect.isTrue(method3Parameter1type is FunctionTypeMirror,
-                "Parameter type of 'func1' is not a function");
-  Expect.equals(bazE, method3Parameter1type.returnType,
-                "Return type of 'func1' is not a E");
-  Expect.isNotNull(method3Parameter1type.parameters,
-                   "Parameters of 'func1' is null");
-  Expect.equals(1, method3Parameter1type.parameters.length,
-                "Unexpected parameter count of 'func1'");
-  Expect.equals(bazE, method3Parameter1type.returnType,
-                "Return type of 'func1' is not a E");
-  Expect.isNotNull(method3Parameter1type.parameters[0],
-                "Parameter 1 of 'func1' is null");
-  Expect.equals(#f, method3Parameter1type.parameters[0].simpleName);
-  Expect.equals(bazF, method3Parameter1type.parameters[0].type,
-                "Argument type of 'func1' is not a F");
-  Expect.equals(#func1, method3Parameter1.simpleName);
-  Expect.equals(#mirrors_helper.Baz.method3.func1,
-                method3Parameter1.qualifiedName);
-  Expect.isFalse(method3Parameter1.hasDefaultValue,
-                 "Parameter has default value");
-  Expect.isNull(method3Parameter1.defaultValue,
-                "Parameter default value is non-null");
-  Expect.isFalse(method3Parameter1.isOptional, "Parameter is optional");
-
-  var method3Parameter2 = method3Parameters[1];
-  Expect.isNotNull(method3Parameter2, "Parameter is null");
-  var funcTypedef = method3Parameter2.type;
-  Expect.isNotNull(funcTypedef, "Parameter type is null");
-  Expect.equals(#Func, funcTypedef.simpleName);
-  Expect.equals(#mirrors_helper.Func, funcTypedef.qualifiedName);
-  Expect.isFalse(isObject(funcTypedef), "Typedef is Object");
-  Expect.isFalse(funcTypedef.isDynamic, "Typedef is dynamic");
-  Expect.isFalse(funcTypedef.isVoid, "Typedef is void");
-  Expect.isFalse(funcTypedef is TypeVariableMirror, "Typedef is a type variable");
-  Expect.isTrue(funcTypedef is TypedefMirror, "Typedef is not a typedef");
-  Expect.isFalse(funcTypedef is FunctionTypeMirror, "Typedef is a function");
-
-  Expect.equals(helperLibrary, getLibrary(funcTypedef),
-                "Unexpected typedef library");
-
-  Expect.isFalse(funcTypedef.isOriginalDeclaration);
-  Expect.isFalse(funcTypedef is ClassMirror, "Typedef is class");
-  Expect.isFalse(funcTypedef.isPrivate, "Typedef is private");
-  Expect.equals(2, funcTypedef.typeArguments.length);
-  var funcTypedefTypeVariables = funcTypedef.typeVariables;
-  Expect.isNotNull(funcTypedefTypeVariables);
-  Expect.equals(2, funcTypedefTypeVariables.length);
-
-  var funcTypedefDefinition = funcTypedef.referent;
-  Expect.isNotNull(funcTypedefDefinition);
-  Expect.isTrue(funcTypedefDefinition is FunctionTypeMirror);
-
-  Expect.equals(#func2, method3Parameter2.simpleName);
-  Expect.equals(#mirrors_helper.Baz.method3.func2,
-                method3Parameter2.qualifiedName);
-  Expect.isFalse(method3Parameter2.hasDefaultValue,
-                 "Parameter 'func2' has default value: "
-                 "${method3Parameter2.defaultValue}");
-  Expect.isNull(method3Parameter2.defaultValue,
-                "Parameter default value is non-null");
-  Expect.isFalse(method3Parameter2.isOptional, "Parameter is optional");
-
-  ////////////////////////////////////////////////////////////////////////////
-  // bool operator==(Object other) => false;
-  ////////////////////////////////////////////////////////////////////////////
-  var operator_eq = bazClassMembers[const Symbol('==')];
-  Expect.isNotNull(operator_eq, "operator == not found");
-  Expect.equals(const Symbol('=='), operator_eq.simpleName,
-                "Unexpected method simpleName");
-  Expect.stringEquals('operator ==', displayName(operator_eq));
-  Expect.equals(const Symbol('mirrors_helper.Baz.=='),
-                operator_eq.qualifiedName,
-                "Unexpected method qualifiedName");
-  Expect.equals(operator_eq.owner, bazClass);
-  Expect.isFalse(operator_eq.isTopLevel);
-  Expect.isTrue(operator_eq is MethodMirror);
-  Expect.isFalse(operator_eq.isConstructor);
-  Expect.isFalse(operator_eq.isPrivate);
-  Expect.isFalse(operator_eq.isStatic);
-  Expect.isTrue(operator_eq.isRegularMethod);
-  Expect.isFalse(operator_eq.isConstConstructor);
-  Expect.isFalse(operator_eq.isGenerativeConstructor);
-  Expect.isFalse(operator_eq.isRedirectingConstructor);
-  Expect.isFalse(operator_eq.isFactoryConstructor);
-  Expect.isFalse(operator_eq.isGetter);
-  Expect.isFalse(operator_eq.isSetter);
-  Expect.isTrue(operator_eq.isOperator);
-  Expect.stringEquals('==', operatorName(operator_eq));
-
-  ////////////////////////////////////////////////////////////////////////////
-  // int operator -() => 0;
-  ////////////////////////////////////////////////////////////////////////////
-  var operator_negate = bazClassMembers[const Symbol('unary-')];
-  Expect.isNotNull(operator_negate, "operator < not found");
-  Expect.equals(const Symbol('unary-'), operator_negate.simpleName,
-                      "Unexpected method simpleName");
-  Expect.stringEquals('operator -', displayName(operator_negate));
-  Expect.equals(const Symbol('mirrors_helper.Baz.unary-'),
-                      operator_negate.qualifiedName,
-                      "Unexpected method qualifiedName");
-  Expect.equals(operator_negate.owner, bazClass);
-  Expect.isFalse(operator_negate.isTopLevel);
-  Expect.isTrue(operator_negate is MethodMirror);
-  Expect.isFalse(operator_negate.isConstructor);
-  Expect.isFalse(operator_negate.isPrivate);
-  Expect.isFalse(operator_negate.isStatic);
-  Expect.isTrue(operator_negate.isRegularMethod);
-  Expect.isFalse(operator_negate.isConstConstructor);
-  Expect.isFalse(operator_negate.isGenerativeConstructor);
-  Expect.isFalse(operator_negate.isRedirectingConstructor);
-  Expect.isFalse(operator_negate.isFactoryConstructor);
-  Expect.isFalse(operator_negate.isGetter);
-  Expect.isFalse(operator_negate.isSetter);
-  Expect.isTrue(operator_negate.isOperator);
-  Expect.stringEquals('-', operatorName(operator_negate));
-
-
-  ////////////////////////////////////////////////////////////////////////////
-  // operator$foo() {}
-  ////////////////////////////////////////////////////////////////////////////
-  var operator$foo = bazClassMembers[#operator$foo];
-  Expect.isNotNull(operator$foo, "operator\$foo not found");
-  Expect.equals(#operator$foo, operator$foo.simpleName);
-  Expect.equals(#mirrors_helper.Baz.operator$foo, operator$foo.qualifiedName);
-  Expect.equals(operator$foo.owner, bazClass);
-  Expect.isFalse(operator$foo.isTopLevel);
-  Expect.isTrue(operator$foo is MethodMirror);
-  Expect.isFalse(operator$foo.isConstructor);
-  Expect.isFalse(operator$foo.isPrivate);
-  Expect.isFalse(operator$foo.isStatic);
-  Expect.isTrue(operator$foo.isRegularMethod);
-  Expect.isFalse(operator$foo.isConstConstructor);
-  Expect.isFalse(operator$foo.isGenerativeConstructor);
-  Expect.isFalse(operator$foo.isRedirectingConstructor);
-  Expect.isFalse(operator$foo.isFactoryConstructor);
-  Expect.isFalse(operator$foo.isGetter);
-  Expect.isFalse(operator$foo.isSetter);
-  Expect.isFalse(operator$foo.isOperator);
-
-  Expect.equals(dynamicType, operator$foo.returnType);
-
-  var operator$fooParameters = operator$foo.parameters;
-  Expect.isNotNull(operator$fooParameters, "Method parameters is null");
-  Expect.equals(0, operator$fooParameters.length, "Unexpected parameter count");
-
-  ////////////////////////////////////////////////////////////////////////////
-  //   Baz();
-  ////////////////////////////////////////////////////////////////////////////
-  var bazClassNonameConstructor = bazClassMembers[const Symbol('')];
-  Expect.isNotNull(bazClassNonameConstructor);
-  Expect.isTrue(bazClassNonameConstructor is MethodMirror);
-  Expect.isTrue(bazClassNonameConstructor.isConstructor);
-  Expect.isFalse(bazClassNonameConstructor.isRegularMethod);
-  Expect.isFalse(bazClassNonameConstructor.isConstConstructor);
-  Expect.isTrue(bazClassNonameConstructor.isGenerativeConstructor);
-  Expect.isFalse(bazClassNonameConstructor.isRedirectingConstructor);
-  Expect.isFalse(bazClassNonameConstructor.isFactoryConstructor);
-  Expect.equals(const Symbol(''), bazClassNonameConstructor.simpleName);
-  Expect.stringEquals('Baz', displayName(bazClassNonameConstructor));
-  Expect.equals(const Symbol('mirrors_helper.Baz.'),
-      bazClassNonameConstructor.qualifiedName);
-
-  ////////////////////////////////////////////////////////////////////////////
-  //   const Baz.named();
-  ////////////////////////////////////////////////////////////////////////////
-  var bazClassNamedConstructor = bazClassMembers[#named];
-  Expect.isNotNull(bazClassNamedConstructor);
-  Expect.isTrue(bazClassNamedConstructor is MethodMirror);
-  Expect.isTrue(bazClassNamedConstructor.isConstructor);
-  Expect.isFalse(bazClassNamedConstructor.isRegularMethod);
-  Expect.isTrue(bazClassNamedConstructor.isConstConstructor);
-  Expect.isFalse(bazClassNamedConstructor.isGenerativeConstructor);
-  Expect.isFalse(bazClassNamedConstructor.isRedirectingConstructor);
-  Expect.isFalse(bazClassNamedConstructor.isFactoryConstructor);
-  Expect.equals(#named, bazClassNamedConstructor.simpleName);
-  Expect.stringEquals('Baz.named', displayName(bazClassNamedConstructor));
-  Expect.equals(#mirrors_helper.Baz.named,
-      bazClassNamedConstructor.qualifiedName);
-
-  ////////////////////////////////////////////////////////////////////////////
-  //   factory Baz.factory() => new Baz<E,F>();
-  ////////////////////////////////////////////////////////////////////////////
-  var bazClassFactoryConstructor = bazClassMembers[#factory];
-  Expect.isNotNull(bazClassFactoryConstructor);
-  Expect.isTrue(bazClassFactoryConstructor is MethodMirror);
-  Expect.isTrue(bazClassFactoryConstructor.isConstructor);
-  Expect.isFalse(bazClassFactoryConstructor.isRegularMethod);
-  Expect.isFalse(bazClassFactoryConstructor.isConstConstructor);
-  Expect.isFalse(bazClassFactoryConstructor.isGenerativeConstructor);
-  Expect.isFalse(bazClassFactoryConstructor.isRedirectingConstructor);
-  Expect.isTrue(bazClassFactoryConstructor.isFactoryConstructor);
-  Expect.equals(#factory, bazClassFactoryConstructor.simpleName);
-  Expect.stringEquals('Baz.factory', displayName(bazClassFactoryConstructor));
-  Expect.equals(#mirrors_helper.Baz.factory,
-      bazClassFactoryConstructor.qualifiedName);
-
-  // TODO(johnniwinther): Add more tests of constructors.
-  // TODO(johnniwinther): Add a test for unnamed factory methods.
-
-  var metadata = bazClass.metadata;
-  Expect.isNotNull(metadata);
-  Expect.equals(0, metadata.length);
-}
-
-// class _PrivateClass {
-//   var _privateField;
-//   get _privateGetter => _privateField;
-//   void set _privateSetter(value) => _privateField = value;
-//   void _privateMethod() {}
-//   _PrivateClass._privateConstructor();
-//   factory _PrivateClass._privateFactoryConstructor() => new _PrivateClass();
-// }
-void testPrivate(MirrorSystem system, LibraryMirror helperLibrary,
-                 Map<Symbol, DeclarationMirror> declarations) {
-  var privateClass = declarations[const Symbol('_PrivateClass')];
-  Expect.isNotNull(privateClass);
-  Expect.isTrue(privateClass is ClassMirror);
-  Expect.isFalse(privateClass.isAbstract);
-  Expect.isTrue(privateClass.isPrivate);
-
-  var privateField = privateClass.declarations[const Symbol('_privateField')];
-  Expect.isNotNull(privateField);
-  Expect.isTrue(privateField is VariableMirror);
-  Expect.isTrue(privateField.isPrivate);
-
-  var privateGetter = privateClass.declarations[const Symbol('_privateGetter')];
-  Expect.isNotNull(privateGetter);
-  Expect.isTrue(privateGetter is MethodMirror);
-  Expect.isTrue(privateGetter.isGetter);
-  Expect.isTrue(privateGetter.isPrivate);
-  Expect.isFalse(privateGetter.isRegularMethod);
-
-  var privateSetter =
-      privateClass.declarations[const Symbol('_privateSetter=')];
-  Expect.isNotNull(privateSetter);
-  Expect.isTrue(privateSetter is MethodMirror);
-  Expect.isTrue(privateSetter.isSetter);
-  Expect.isTrue(privateSetter.isPrivate);
-  Expect.isFalse(privateSetter.isRegularMethod);
-
-  var privateMethod = privateClass.declarations[const Symbol('_privateMethod')];
-  Expect.isNotNull(privateMethod);
-  Expect.isTrue(privateMethod is MethodMirror);
-  Expect.isTrue(privateMethod.isPrivate);
-  Expect.isTrue(privateMethod.isRegularMethod);
-
-  var privateConstructor =
-      privateClass.declarations[const Symbol('_privateConstructor')];
-  Expect.isNotNull(privateConstructor);
-  Expect.isTrue(privateConstructor is MethodMirror);
-  Expect.isTrue(privateConstructor.isConstructor);
-  Expect.isTrue(privateConstructor.isPrivate);
-  Expect.isFalse(privateConstructor.isConstConstructor);
-  Expect.isFalse(privateConstructor.isRedirectingConstructor);
-  Expect.isTrue(privateConstructor.isGenerativeConstructor);
-  Expect.isFalse(privateConstructor.isFactoryConstructor);
-
-  var privateFactoryConstructor =
-      privateClass.declarations[const Symbol('_privateFactoryConstructor')];
-  Expect.isNotNull(privateFactoryConstructor);
-  Expect.isTrue(privateFactoryConstructor is MethodMirror);
-  Expect.isTrue(privateFactoryConstructor.isConstructor);
-  Expect.isTrue(privateFactoryConstructor.isPrivate);
-  Expect.isFalse(privateFactoryConstructor.isConstConstructor);
-  Expect.isFalse(privateFactoryConstructor.isRedirectingConstructor);
-  Expect.isFalse(privateFactoryConstructor.isGenerativeConstructor);
-  Expect.isTrue(privateFactoryConstructor.isFactoryConstructor);
-
-  var metadata = privateClass.metadata;
-  Expect.isNotNull(metadata);
-  Expect.equals(0, metadata.length);
-}
diff --git a/tests/compiler/dart2js/serialization/analysis_test.dart b/tests/compiler/dart2js/serialization/analysis_test.dart
index 1630660..42c1f5f 100644
--- a/tests/compiler/dart2js/serialization/analysis_test.dart
+++ b/tests/compiler/dart2js/serialization/analysis_test.dart
@@ -14,32 +14,38 @@
 import 'helper.dart';
 import 'test_data.dart';
 
-main(List<String> arguments) {
+main(List<String> args) {
   asyncTest(() async {
-    String serializedData = await serializeDartCore();
-
-    if (arguments.isNotEmpty) {
-      Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.last));
+    Arguments arguments = new Arguments.from(args);
+    SerializedData serializedData =
+        await serializeDartCore(arguments: arguments);
+    if (arguments.filename != null) {
+      Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
       await analyze(serializedData, entryPoint, null);
     } else {
       Uri entryPoint = Uri.parse('memory:main.dart');
-      for (Test test in TESTS) {
+      await arguments.forEachTest(TESTS, (int index, Test test) async {
         await analyze(serializedData, entryPoint, test);
-      }
+      });
     }
   });
 }
 
-Future analyze(String serializedData, Uri entryPoint, Test test) async {
+Future analyze(SerializedData serializedData, Uri entryPoint, Test test,
+               {int index}) async {
+  String testDescription =
+  test != null ? test.sourceFiles[entryPoint.path] : '${entryPoint}';
+  print('------------------------------------------------------------------');
+  print('analyze ${index != null ? '$index:' :''}${testDescription}');
+  print('------------------------------------------------------------------');
   DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
   await runCompiler(
       entryPoint: entryPoint,
-      memorySourceFiles: test != null ? test.sourceFiles : const {},
+      resolutionInputs: serializedData.toUris(),
+      memorySourceFiles: serializedData.toMemorySourceFiles(
+          test != null ? test.sourceFiles : null),
       options: [Flags.analyzeOnly],
-      diagnosticHandler: diagnosticCollector,
-      beforeRun: (Compiler compiler) {
-        compiler.serialization.deserializeFromText(serializedData);
-      });
+      diagnosticHandler: diagnosticCollector);
   if (test != null) {
     Expect.equals(test.expectedErrorCount, diagnosticCollector.errors.length,
         "Unexpected error count.");
diff --git a/tests/compiler/dart2js/serialization/compilation_test.dart b/tests/compiler/dart2js/serialization/compilation_test.dart
index 7346b86..595803a 100644
--- a/tests/compiler/dart2js/serialization/compilation_test.dart
+++ b/tests/compiler/dart2js/serialization/compilation_test.dart
@@ -16,13 +16,14 @@
 main(List<String> args) {
   asyncTest(() async {
     Arguments arguments = new Arguments.from(args);
-    String serializedData = await serializeDartCore(arguments: arguments);
+    SerializedData serializedData =
+        await serializeDartCore(arguments: arguments);
     if (arguments.filename != null) {
       Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
       await compile(serializedData, entryPoint, null);
     } else {
       Uri entryPoint = Uri.parse('memory:main.dart');
-      arguments.forEachTest(TESTS, (int index, Test test) async {
+      await arguments.forEachTest(TESTS, (int index, Test test) async {
         await compile(serializedData, entryPoint, test,
                       index: index,
                       verbose: arguments.verbose);
@@ -31,7 +32,7 @@
   });
 }
 
-Future compile(String serializedData, Uri entryPoint, Test test,
+Future compile(SerializedData serializedData, Uri entryPoint, Test test,
                {int index, bool verbose: false}) async {
   String testDescription =
       test != null ? test.sourceFiles[entryPoint.path] : '${entryPoint}';
@@ -41,12 +42,11 @@
   OutputCollector outputCollector = new OutputCollector();
   await runCompiler(
       entryPoint: entryPoint,
-      memorySourceFiles: test != null ? test.sourceFiles : const {},
+      resolutionInputs: serializedData.toUris(),
+      memorySourceFiles: serializedData.toMemorySourceFiles(
+          test != null ? test.sourceFiles : null),
       options: [],
-      outputProvider: outputCollector,
-      beforeRun: (Compiler compiler) {
-        compiler.serialization.deserializeFromText(serializedData);
-      });
+      outputProvider: outputCollector);
   if (verbose) {
     print(outputCollector.getOutput('', 'js'));
   }
diff --git a/tests/compiler/dart2js/serialization/duplicate_library_test.dart b/tests/compiler/dart2js/serialization/duplicate_library_test.dart
new file mode 100644
index 0000000..3380c66
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/duplicate_library_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.serialization.duplicate_libraryc_test;
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common/names.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/filenames.dart';
+import '../memory_compiler.dart';
+import 'helper.dart';
+import 'test_data.dart';
+
+void main(List<String> args) {
+  asyncTest(() async {
+    SerializedData data = await serializeDartCore(
+        arguments: new Arguments.from(args));
+    Map<String, String> sourceFiles = data.toMemorySourceFiles();
+    List<Uri> resolutionInputs = data.toUris();
+    Uri extraUri = Uri.parse('memory:extraUri');
+    sourceFiles[extraUri.path] = data.data;
+    resolutionInputs.add(extraUri);
+
+    DiagnosticCollector collector = new DiagnosticCollector();
+    await runCompiler(
+        entryPoint: Uris.dart_core,
+        memorySourceFiles: sourceFiles,
+        resolutionInputs: resolutionInputs,
+        diagnosticHandler: collector,
+        options: [Flags.analyzeAll]);
+    Expect.isTrue(collector.errors.isNotEmpty,
+        "Expected duplicate serialized library errors.");
+  });
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/serialization/equivalence_test.dart b/tests/compiler/dart2js/serialization/equivalence_test.dart
index fb1ace8..7caae28 100644
--- a/tests/compiler/dart2js/serialization/equivalence_test.dart
+++ b/tests/compiler/dart2js/serialization/equivalence_test.dart
@@ -8,6 +8,7 @@
 import '../memory_compiler.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common.dart';
 import 'package:compiler/src/constants/constructors.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/invariant.dart';
@@ -18,6 +19,7 @@
 import 'package:compiler/src/serialization/equivalence.dart';
 import 'package:compiler/src/serialization/json_serializer.dart';
 import 'package:compiler/src/serialization/serialization.dart';
+import 'package:expect/expect.dart';
 import 'test_helper.dart';
 
 main(List<String> arguments) {
@@ -51,14 +53,19 @@
         entryPoint: entryPoint, options: [Flags.analyzeAll]);
     Compiler compiler = result.compiler;
     testSerialization(compiler.libraryLoader.libraries,
+                      compiler.reporter,
                       outPath: outPath,
                       prettyPrint: prettyPrint);
+    Expect.isFalse(compiler.reporter.hasReportedError,
+        "Unexpected errors occured.");
   });
 }
 
-void testSerialization(Iterable<LibraryElement> libraries1,
-                       {String outPath,
-                        bool prettyPrint}) {
+void testSerialization(
+    Iterable<LibraryElement> libraries1,
+    DiagnosticReporter reporter,
+    {String outPath,
+     bool prettyPrint}) {
   Serializer serializer = new Serializer();
   for (LibraryElement library1 in libraries1) {
     serializer.serialize(library1);
@@ -75,7 +82,7 @@
   }
 
   Deserializer deserializer = new Deserializer.fromText(
-      new DeserializationContext(),
+      new DeserializationContext(reporter), Uri.parse('out1.data'),
       text, const JsonSerializationDecoder());
   List<LibraryElement> libraries2 = <LibraryElement>[];
   for (LibraryElement library1 in libraries1) {
@@ -95,7 +102,7 @@
   String text2 = serializer2.toText(const JsonSerializationEncoder());
 
   Deserializer deserializer3 = new Deserializer.fromText(
-      new DeserializationContext(),
+      new DeserializationContext(reporter), Uri.parse('out2.data'),
       text2, const JsonSerializationDecoder());
   for (LibraryElement library1 in libraries1) {
     LibraryElement library2 =
@@ -572,6 +579,11 @@
         element1.computeEffectiveTargetType(element1.enclosingClass.thisType),
         element2.computeEffectiveTargetType(element2.enclosingClass.thisType),
         areTypesEquivalent);
+    check(
+        element1, element2, 'effectiveTargetType.raw',
+        element1.computeEffectiveTargetType(element1.enclosingClass.rawType),
+        element2.computeEffectiveTargetType(element2.enclosingClass.rawType),
+        areTypesEquivalent);
     checkElementIdentities(element1, element2, 'immediateRedirectionTarget',
         element1.immediateRedirectionTarget,
         element2.immediateRedirectionTarget);
diff --git a/tests/compiler/dart2js/serialization/helper.dart b/tests/compiler/dart2js/serialization/helper.dart
index 1ce8c2b..0471658 100644
--- a/tests/compiler/dart2js/serialization/helper.dart
+++ b/tests/compiler/dart2js/serialization/helper.dart
@@ -14,6 +14,8 @@
 import '../memory_compiler.dart';
 import 'test_data.dart';
 
+const String DEFAULT_DATA_FILE_NAME = 'out.data';
+
 class Arguments {
   final String filename;
   final int start;
@@ -29,7 +31,7 @@
     this.end,
     this.loadSerializedData: false,
     this.saveSerializedData: false,
-    this.serializedDataFileName: 'out.data',
+    this.serializedDataFileName: DEFAULT_DATA_FILE_NAME,
     this.verbose: false});
 
   factory Arguments.from(List<String> arguments) {
@@ -38,7 +40,7 @@
     int end;
     for (String arg in arguments) {
       if (!arg.startsWith('-')) {
-        int index = int.parse(arg);
+        int index = int.parse(arg, onError: (_) => null);
         if (index == null) {
           filename = arg;
         } else if (start == null) {
@@ -51,6 +53,14 @@
     bool verbose = arguments.contains('-v');
     bool loadSerializedData = arguments.contains('-l');
     bool saveSerializedData = arguments.contains('-s');
+    if (arguments.contains('--auto')) {
+      File file = new File(DEFAULT_DATA_FILE_NAME);
+      if (file.existsSync()) {
+        loadSerializedData = true;
+      } else {
+        saveSerializedData = true;
+      }
+    }
     return new Arguments(
         filename: filename,
         start: start,
@@ -71,17 +81,18 @@
 }
 
 
-Future<String> serializeDartCore(
+Future<SerializedData> serializeDartCore(
     {Arguments arguments: const Arguments()}) async {
+  Uri uri = Uri.parse('memory:${arguments.serializedDataFileName}');
   print('------------------------------------------------------------------');
   print('serialize dart:core');
   print('------------------------------------------------------------------');
-  String serializedData;
+  SerializedData serializedData;
   if (arguments.loadSerializedData) {
     File file = new File(arguments.serializedDataFileName);
     if (file.existsSync()) {
       print('Loading data from $file');
-      serializedData = file.readAsStringSync();
+      serializedData = new SerializedData(uri, file.readAsStringSync());
     }
   }
   if (serializedData == null) {
@@ -92,12 +103,47 @@
     BufferedEventSink sink = new BufferedEventSink();
     compiler.serialization.serializeToSink(
         sink, compiler.libraryLoader.libraries);
-    serializedData = sink.text;
+    serializedData = new SerializedData(uri, sink.text);
     if (arguments.saveSerializedData) {
       File file = new File(arguments.serializedDataFileName);
       print('Saving data to $file');
-      file.writeAsStringSync(serializedData);
+      file.writeAsStringSync(serializedData.data);
     }
   }
   return serializedData;
 }
+
+class SerializedData {
+  final Uri uri;
+  final String data;
+
+  SerializedData(this.uri, this.data);
+
+  Map<String, String> toMemorySourceFiles([Map<String, String> input]) {
+    Map<String, String> sourceFiles = <String, String>{};
+    if (input != null) {
+      sourceFiles.addAll(input);
+    }
+    expandMemorySourceFiles(sourceFiles);
+    return sourceFiles;
+  }
+
+  void expandMemorySourceFiles(Map<String, String> sourceFiles) {
+    if (uri.scheme == 'memory') {
+      sourceFiles[uri.path] = data;
+    }
+  }
+
+  List<Uri> toUris([List<Uri> input]) {
+    List<Uri> uris = <Uri>[];
+    if (input != null) {
+      uris.addAll(input);
+    }
+    expandUris(uris);
+    return uris;
+  }
+
+  void expandUris(List<Uri> uris) {
+    uris.add(uri);
+  }
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/serialization/impact_test.dart b/tests/compiler/dart2js/serialization/impact_test.dart
index 5b062fe..3858f70 100644
--- a/tests/compiler/dart2js/serialization/impact_test.dart
+++ b/tests/compiler/dart2js/serialization/impact_test.dart
@@ -16,7 +16,8 @@
 main(List<String> args) {
   Arguments arguments = new Arguments.from(args);
   asyncTest(() async {
-    String serializedData = await serializeDartCore(arguments: arguments);
+    SerializedData serializedData =
+        await serializeDartCore(arguments: arguments);
     if (arguments.filename != null) {
       Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
       await check(serializedData, entryPoint);
@@ -30,7 +31,7 @@
 }
 
 Future check(
-  String serializedData,
+  SerializedData serializedData,
   Uri entryPoint,
   {Map<String, String> sourceFiles: const <String, String>{},
    bool verbose: false}) async {
@@ -42,10 +43,10 @@
   await compilerNormal.run(entryPoint);
 
   Compiler compilerDeserialized = compilerFor(
-      memorySourceFiles: sourceFiles,
+      memorySourceFiles: serializedData.toMemorySourceFiles(sourceFiles),
+      resolutionInputs: serializedData.toUris(),
       options: [Flags.analyzeAll]);
   compilerDeserialized.resolution.retainCachesForTesting = true;
-  compilerDeserialized.serialization.deserializeFromText(serializedData);
   await compilerDeserialized.run(entryPoint);
 
   checkAllImpacts(compilerNormal, compilerDeserialized, verbose: verbose);
diff --git a/tests/compiler/dart2js/serialization/library_test.dart b/tests/compiler/dart2js/serialization/library_test.dart
index c8cfd4c..840cd78 100644
--- a/tests/compiler/dart2js/serialization/library_test.dart
+++ b/tests/compiler/dart2js/serialization/library_test.dart
@@ -4,9 +4,11 @@
 
 library dart2js.serialization_library_test;
 
+import 'dart:async';
 import 'dart:io';
 import '../memory_compiler.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common/names.dart';
 import 'package:compiler/src/compiler.dart';
@@ -14,8 +16,12 @@
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/serialization/json_serializer.dart';
 import 'package:compiler/src/serialization/serialization.dart';
+import 'package:expect/expect.dart';
 
 import 'equivalence_test.dart';
+import 'test_helper.dart';
+import 'resolved_ast_test.dart';
+import 'helper.dart';
 
 main(List<String> arguments) {
   // Ensure that we can print out constant expressions.
@@ -47,20 +53,25 @@
     entryPoint = Uris.dart_core;
   }
   asyncTest(() async {
-    CompilationResult result = await runCompiler(
+    Compiler compiler = await compilerFor(
         entryPoint: entryPoint, options: [Flags.analyzeAll]);
-    Compiler compiler = result.compiler;
-    testSerialization(compiler.libraryLoader.libraries,
-                      outPath: outPath,
-                      prettyPrint: prettyPrint,
-                      shardCount: shardCount);
+    compiler.serialization.supportSerialization = true;
+    await compiler.run(entryPoint);
+    List<SerializedData> data =
+        createData(compiler,
+                   outPath: outPath,
+                   prettyPrint: prettyPrint,
+                   shardCount: shardCount);
+    await testAnalysis(compiler, data, entryPoint);
   });
 }
 
-void testSerialization(Iterable<LibraryElement> libraries1,
-                       {String outPath,
-                        bool prettyPrint,
-                        int shardCount: 3}) {
+List<SerializedData> createData(
+    Compiler compiler,
+    {String outPath,
+     bool prettyPrint,
+     int shardCount: 3}) {
+  Iterable<LibraryElement> libraries1 = compiler.libraryLoader.libraries;
   if (shardCount < 1 || shardCount > libraries1.length) {
     shardCount = libraries1.length;
   }
@@ -78,14 +89,11 @@
     offset += shardSize;
   }
   print(librarySplits.join('\n'));
-  List<String> texts = <String>[];
+  List<SerializedData> data = <SerializedData>[];
   for (int shard = 0; shard < shardCount; shard++) {
     List<LibraryElement> libraries = librarySplits[shard];
-    Serializer serializer = new Serializer(
-        shouldInclude: (e) => libraries.contains(e.library));
-    for (LibraryElement library in libraries) {
-      serializer.serialize(library);
-    }
+    Serializer serializer =
+        compiler.serialization.createSerializer(libraries);
     String text = serializer.toText(const JsonSerializationEncoder());
     String outText = text;
     if (prettyPrint) {
@@ -103,22 +111,37 @@
     } else if (prettyPrint) {
       print(outText);
     }
-    texts.add(text);
+    data.add(new SerializedData(Uri.parse('memory:out$shard.data'), text));
   }
-  DeserializationContext deserializationContext =
-      new DeserializationContext();
-  for (int shard = 0; shard < shardCount; shard++) {
-    new Deserializer.fromText(
-        deserializationContext, texts[shard], const JsonSerializationDecoder());
+  return data;
+}
+
+Future testAnalysis(
+    Compiler compiler1,
+    List<SerializedData> data,
+    Uri entryPoint) async {
+  Map<String, String> memorySourceFiles = <String, String>{};
+  List<Uri> resolutionInputs = <Uri>[];
+  for (int index = 0; index < data.length; index++) {
+    SerializedData serializedData = data[index];
+    serializedData.expandMemorySourceFiles(memorySourceFiles);
+    serializedData.expandUris(resolutionInputs);
   }
-  List<LibraryElement> libraries2 = <LibraryElement>[];
-  for (LibraryElement library1 in libraries1) {
+  CompilationResult result = await runCompiler(
+      entryPoint: entryPoint,
+      memorySourceFiles: memorySourceFiles,
+      resolutionInputs: resolutionInputs,
+      options: [Flags.analyzeAll]);
+  Compiler compiler2 = result.compiler;
+  for (LibraryElement library1 in compiler1.libraryLoader.libraries) {
     LibraryElement library2 =
-        deserializationContext.lookupLibrary(library1.canonicalUri);
+        compiler2.libraryLoader.lookupLibrary(library1.canonicalUri);
     if (library2 == null) {
       throw new ArgumentError('No library ${library1.canonicalUri} found.');
     }
     checkLibraryContent('library1', 'library2', 'library', library1, library2);
-    libraries2.add(library2);
+    checkAllResolvedAsts(compiler1, compiler2);
+    checkAllImpacts(compiler1, compiler2);
   }
+  Expect.isFalse(compiler2.reporter.hasReportedError, "Unexpected errors");
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/serialization/model_test.dart b/tests/compiler/dart2js/serialization/model_test.dart
index a8704ae..2ab28e9 100644
--- a/tests/compiler/dart2js/serialization/model_test.dart
+++ b/tests/compiler/dart2js/serialization/model_test.dart
@@ -24,7 +24,8 @@
 main(List<String> args) {
   asyncTest(() async {
     Arguments arguments = new Arguments.from(args);
-    String serializedData = await serializeDartCore(arguments: arguments);
+    SerializedData serializedData =
+        await serializeDartCore(arguments: arguments);
     if (arguments.filename != null) {
       Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
       await checkModels(serializedData, entryPoint);
@@ -36,7 +37,7 @@
         await checkModels(
           serializedData,
           entryPoint,
-          sourceFiles: test.sourceFiles,
+          memorySourceFiles: test.sourceFiles,
           verbose: arguments.verbose);
       });
     }
@@ -44,16 +45,16 @@
 }
 
 Future checkModels(
-  String serializedData,
-  Uri entryPoint,
-  {Map<String, String> sourceFiles: const <String, String>{},
+    SerializedData serializedData,
+    Uri entryPoint,
+  {Map<String, String> memorySourceFiles: const <String, String>{},
    bool verbose: false}) async {
 
   print('------------------------------------------------------------------');
   print('compile normal');
   print('------------------------------------------------------------------');
   Compiler compilerNormal = compilerFor(
-      memorySourceFiles: sourceFiles,
+      memorySourceFiles: memorySourceFiles,
       options: [Flags.analyzeOnly]);
   compilerNormal.resolution.retainCachesForTesting = true;
   await compilerNormal.run(entryPoint);
@@ -65,10 +66,10 @@
   print('compile deserialized');
   print('------------------------------------------------------------------');
   Compiler compilerDeserialized = compilerFor(
-      memorySourceFiles: sourceFiles,
+      memorySourceFiles: serializedData.toMemorySourceFiles(memorySourceFiles),
+      resolutionInputs: serializedData.toUris(),
       options: [Flags.analyzeOnly]);
   compilerDeserialized.resolution.retainCachesForTesting = true;
-  compilerDeserialized.serialization.deserializeFromText(serializedData);
   await compilerDeserialized.run(entryPoint);
   compilerDeserialized.phase = Compiler.PHASE_DONE_RESOLVING;
   compilerDeserialized.world.populate();
diff --git a/tests/compiler/dart2js/serialization/resolved_ast_test.dart b/tests/compiler/dart2js/serialization/resolved_ast_test.dart
index b9bae80..9cba5af 100644
--- a/tests/compiler/dart2js/serialization/resolved_ast_test.dart
+++ b/tests/compiler/dart2js/serialization/resolved_ast_test.dart
@@ -20,7 +20,8 @@
 main(List<String> args) {
   Arguments arguments = new Arguments.from(args);
   asyncTest(() async {
-    String serializedData = await serializeDartCore(arguments: arguments);
+    SerializedData serializedData =
+        await serializeDartCore(arguments: arguments);
     if (arguments.filename != null) {
       Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.filename));
       await check(serializedData, entryPoint);
@@ -35,7 +36,7 @@
 }
 
 Future check(
-  String serializedData,
+  SerializedData serializedData,
   Uri entryPoint,
   [Map<String, String> sourceFiles = const <String, String>{}]) async {
 
@@ -46,10 +47,10 @@
   await compilerNormal.run(entryPoint);
 
   Compiler compilerDeserialized = compilerFor(
-      memorySourceFiles: sourceFiles,
+      memorySourceFiles: serializedData.toMemorySourceFiles(sourceFiles),
+      resolutionInputs: serializedData.toUris(),
       options: [Flags.analyzeAll]);
   compilerDeserialized.resolution.retainCachesForTesting = true;
-  compilerDeserialized.serialization.deserializeFromText(serializedData);
   await compilerDeserialized.run(entryPoint);
 
   checkAllResolvedAsts(compilerNormal, compilerDeserialized, verbose: true);
diff --git a/tests/compiler/dart2js/serialization/test_data.dart b/tests/compiler/dart2js/serialization/test_data.dart
index 0606a48..62126fd 100644
--- a/tests/compiler/dart2js/serialization/test_data.dart
+++ b/tests/compiler/dart2js/serialization/test_data.dart
@@ -217,6 +217,53 @@
 }
 main() => const C();'''
   }),
+
+  const Test(const {
+    'main.dart': '''
+class C {
+  factory C() = Object;
+}
+main() => new C();'''
+  }),
+
+  const Test(const {
+    'main.dart': '''
+abstract class C implements List {
+  factory C([_]) = List;
+}
+main() => new C();'''
+  }),
+
+  const Test(const {
+    'main.dart': '''
+main() => const Duration();
+''',
+  }),
+
+  const Test(const {
+    'main.dart': '''
+import 'dart:collection';
+main() => new UnmodifiableListView(null);
+''',
+  }),
+
+  const Test(const {
+    'main.dart': '''
+var myIdentical = identical;
+main() => myIdentical;
+''',
+  }),
+
+  const Test(const {
+    'main.dart': '''
+class Foo {
+  String toString() => super.toString();
+}
+main() {
+  print(new Foo());
+}
+''',
+  }),
 ];
 
 class Test {
diff --git a/tests/compiler/dart2js/strip_comment_test.dart b/tests/compiler/dart2js/strip_comment_test.dart
deleted file mode 100644
index 40921a9..0000000
--- a/tests/compiler/dart2js/strip_comment_test.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library strip_comment_test;
-
-import "package:expect/expect.dart";
-import 'package:compiler/src/mirrors/mirrors_util.dart';
-
-testComment(String strippedText, String commentText) {
-  Expect.stringEquals(strippedText, stripComment(commentText));
-}
-
-void main() {
-  testComment('', '//');
-  testComment('', '// ');
-  testComment(' ', '//  ');
-  testComment('foo bar baz', '//foo bar baz');
-  testComment('foo bar baz', '// foo bar baz');
-  testComment('foo bar baz ', '// foo bar baz ');
-  testComment(' foo bar baz  ', '//  foo bar baz  ');
-
-  testComment('', '///');
-  testComment('', '/// ');
-  testComment(' ', '///  ');
-  testComment('foo bar baz', '///foo bar baz');
-  testComment('foo bar baz', '/// foo bar baz');
-  testComment('foo bar baz ', '/// foo bar baz ');
-  testComment(' foo bar baz  ', '///  foo bar baz  ');
-
-  testComment('', '/**/');
-  testComment('', '/* */');
-  testComment(' ', '/*  */');
-  testComment('foo bar baz', '/*foo bar baz*/');
-  testComment('foo bar baz', '/* foo bar baz*/');
-  testComment('foo bar baz ', '/* foo bar baz */');
-  testComment(' foo bar baz  ', '/*  foo bar baz  */');
-  testComment('foo\nbar\nbaz', '/*foo\nbar\nbaz*/');
-  testComment('foo\nbar\nbaz', '/* foo\nbar\nbaz*/');
-  testComment('foo \n bar \n baz ', '/* foo \n bar \n baz */');
-  testComment('foo\nbar\nbaz', '/* foo\n *bar\n *baz*/');
-  testComment('foo\nbar\nbaz', '/* foo\n * bar\n * baz*/');
-  testComment('foo \nbar \nbaz ', '/* foo \n * bar \n * baz */');
-  testComment('\nfoo\nbar\nbaz',
-      '''/*
-          * foo
-          * bar
-          * baz*/''');
-  testComment('\nfoo\nbar\nbaz\n',
-      '''/*
-          * foo
-          * bar
-          * baz
-          */''');
-
-  testComment('', '/***/');
-  testComment('', '/** */');
-  testComment(' ', '/**  */');
-  testComment('foo bar baz', '/**foo bar baz*/');
-  testComment('foo bar baz', '/** foo bar baz*/');
-  testComment('foo bar baz ', '/** foo bar baz */');
-  testComment(' foo bar baz  ', '/**  foo bar baz  */');
-  testComment('foo\nbar\nbaz', '/**foo\nbar\nbaz*/');
-  testComment('foo\nbar\nbaz', '/** foo\nbar\nbaz*/');
-  testComment('foo \n bar \n baz ', '/** foo \n bar \n baz */');
-  testComment('foo\nbar\nbaz', '/** foo\n *bar\n *baz*/');
-  testComment('foo\nbar\nbaz', '/** foo\n * bar\n * baz*/');
-  testComment('foo \nbar \nbaz ', '/** foo \n * bar \n * baz */');
-  testComment('\nfoo\nbar\nbaz',
-      '''/**
-          * foo
-          * bar
-          * baz*/''');
-  testComment('\nfoo\nbar\nbaz\n',
-      '''/**
-          * foo
-          * bar
-          * baz
-          */''');
-}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 0b3fb87..d471cf1 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -2563,14 +2563,14 @@
     new CompilationUnitElementX(new Script(null, null, null), compiler.mainApp);
   Element function = new MockElement(compilationUnit);
   TreeElements elements = compiler.resolveNodeStatement(node, function);
-  compiler.enqueuer.resolution.emptyDeferredTaskQueue();
+  compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
   TypeCheckerVisitor checker = new TypeCheckerVisitor(
       compiler, elements, compiler.types);
   DiagnosticCollector collector = compiler.diagnosticCollector;
   collector.clear();
   checker.analyze(node);
   if (flushDeferred) {
-    compiler.enqueuer.resolution.emptyDeferredTaskQueue();
+    compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
   }
   compareWarningKinds(text, warnings, collector.warnings);
   compareWarningKinds(text, errors, collector.errors);
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index 1e20ba7..5e91f77 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -8,6 +8,7 @@
 import 'package:expect/expect.dart';
 import 'compiler_helper.dart' as mock;
 import 'memory_compiler.dart' as memory;
+import 'package:compiler/src/common/resolution.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/dart_types.dart';
 import 'package:compiler/src/compiler.dart'
@@ -31,6 +32,8 @@
 class TypeEnvironment {
   final Compiler compiler;
 
+  Resolution get resolution => compiler.resolution;
+
   static Future<TypeEnvironment> create(
       String source, {bool useMockCompiler: true,
                       bool expectNoErrors: false,
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 62f45da..9757816 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -29,9 +29,6 @@
 symbol_operator_test/03: Fail # bug 11669
 string_case_test/01: Fail # Bug 18061
 
-iterable_return_type_test/01: RuntimeError # Issue 13646
-iterable_return_type_test/02: RuntimeError # Issue 13646
-
 # #void should be a valid symbol.
 [ $compiler == none || $compiler == precompiler || $compiler == dart2app || $compiler == dart2js ]
 symbol_reserved_word_test/02: CompileTimeError # bug 20191
@@ -92,6 +89,7 @@
 integer_to_string_test/01: RuntimeError # Issue 1533
 iterable_return_type_test/01: RuntimeError # Issue 20085
 iterable_return_type_test/02: RuntimeError # Dart2js does not support Uint64*.
+iterable_to_list_test/01: RuntimeError # Issue 26501
 
 big_integer_*: Skip # VM specific test.
 bit_twiddling_bigint_test: RuntimeError # Requires bigint support.
diff --git a/tests/corelib/iterable_to_list_test.dart b/tests/corelib/iterable_to_list_test.dart
index 3ee443a..2257d8f 100644
--- a/tests/corelib/iterable_to_list_test.dart
+++ b/tests/corelib/iterable_to_list_test.dart
@@ -2,70 +2,70 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "dart:collection" show Queue;
+import "dart:typed_data" show Uint8List, Float32List;
 import "package:expect/expect.dart";
 
-dynamicCheck(input, {isInt, isString}) {
-  var copy = input.toList();
-  Expect.isTrue(isInt == copy is List<int>);
-  Expect.isTrue(isString == copy is List<String>);
+main() {
+  // testIterable takes an iterable and a list expected to be equal to
+  // the iterable's toList result, including the type parameter of the list.
+  testIterable([], []);
+  testIterable(<int>[], <int>[]);
+  testIterable(<String>[], <String>[]);
+  testIterable([1, 2, 3], [1, 2, 3]);
+  testIterable(<int>[1, 2, 3], <int>[1, 2, 3]);
+  testIterable(const [1, 2], [1, 2]);
+  testIterable(const <int>[1, 2], <int>[1, 2]);
+  testIterable({"x": 1, "y": 1}.keys, ["x", "y"]);
+  testIterable(<String, int>{"x": 1, "y": 1}.keys, <String>["x", "y"]);
+  testIterable({"x": 2, "y": 3}.values, [2, 3]);
+  testIterable(<String, int>{"x": 2, "y": 3}.values, <int>[2, 3]);
+  testIterable(new Iterable.generate(3), [0, 1, 2]);
+  testIterable(new Iterable<int>.generate(3), <int>[0, 1, 2]);
+  testIterable(new Iterable<String>.generate(3, (x)=>"$x"),
+               <String>["0", "1", "2"]);
+  testIterable(new Set.from([1, 2, 3]), [1, 2, 3]);
+  testIterable(new Set<int>.from([1, 2, 3]), <int>[1, 2, 3]);
+  testIterable(new Queue.from([1, 2, 3]), [1, 2, 3]);
+  testIterable(new Queue<int>.from(<int>[1, 2, 3]), <int>[1, 2, 3]);
+  testIterable(new Uint8List.fromList(<int>[1, 2, 3]),     /// 01: ok
+               <int>[1, 2, 3]);                            /// 01: continued
+  testIterable(new Float32List.fromList([1.0, 2.0, 3.0]),  /// 01: continued
+               <double>[1.0, 2.0, 3.0]);                   /// 01: continued
+  testIterable("abc".codeUnits, <int>[97, 98, 99]);        /// 01: continued
+  testIterable("abc".runes, <int>[97, 98, 99]);
 }
 
-main() {
-  List<int> list1 = <int>[1, 2, 3];
-  List<int> list2 = const <int>[4, 5];
-  List<String> list3 = <String>[];
-  Set<int> set1 = new Set<int>();
-  set1..add(11)
-      ..add(12)
-      ..add(13);
-  Set<String> set2 = new Set<String>();
-  set2..add("foo")
-      ..add("bar")
-      ..add("toto");
-  Set set3 = new Set();
+testIterable(Iterable iterable, List expected, [int depth = 0]) {
+  print(" " * depth + "${iterable.runtimeType} vs ${expected.runtimeType}");
+  test(iterable, expected);
+  test(iterable, expected, growable: true);
+  test(iterable, expected, growable: false);
+  if (depth < 2) {
+    depth++;
+    testIterable(iterable.map((x) => x), new List.from(expected), depth);
+    testIterable(iterable.where((x) => true), expected, depth);
+    testIterable(iterable.expand((x) => [x]), new List.from(expected), depth);
+    testIterable(iterable.map((x) => x), new List.from(expected), depth);
+    testIterable(iterable.skipWhile((x) => false), expected, depth);
+    testIterable(iterable.takeWhile((x) => true), expected, depth);
+    testIterable(iterable.skip(0), expected, depth);
+    testIterable(iterable.take(expected.length * 2), expected, depth);
+    testIterable(iterable.toSet(), expected, depth);
+  }
+}
 
-  var listCopy = list1.toList();
-  Expect.listEquals(list1, listCopy);
-  Expect.isTrue(listCopy is List<int>);
-  Expect.isFalse(listCopy is List<String>);
-  Expect.isFalse(identical(list1, listCopy));
-  dynamicCheck(list1, isInt: true, isString: false);
-
-  listCopy = list2.toList();
-  Expect.listEquals(list2, listCopy);
-  Expect.isTrue(listCopy is List<int>);
-  Expect.isFalse(listCopy is List<String>);
-  Expect.isFalse(identical(list2, listCopy));
-  dynamicCheck(list2, isInt: true, isString: false);
-
-  listCopy = list3.toList();
-  Expect.listEquals(list3, listCopy);
-  Expect.isTrue(listCopy is List<String>);
-  Expect.isFalse(listCopy is List<int>);
-  Expect.isFalse(identical(list3, listCopy));
-  dynamicCheck(list3, isInt: false, isString: true);
-
-  listCopy = set1.toList();
-  Expect.equals(3, listCopy.length);
-  Expect.isTrue(listCopy.contains(11));
-  Expect.isTrue(listCopy.contains(12));
-  Expect.isTrue(listCopy.contains(13));
-  Expect.isTrue(listCopy is List<int>);
-  Expect.isFalse(listCopy is List<String>);
-  dynamicCheck(set1, isInt: true, isString: false);
-
-  listCopy = set2.toList();
-  Expect.equals(3, listCopy.length);
-  Expect.isTrue(listCopy.contains("foo"));
-  Expect.isTrue(listCopy.contains("bar"));
-  Expect.isTrue(listCopy.contains("toto"));
-  Expect.isTrue(listCopy is List<String>);
-  Expect.isFalse(listCopy is List<int>);
-  dynamicCheck(set2, isInt: false, isString: true);
-
-  listCopy = set3.toList();
-  Expect.isTrue(listCopy.isEmpty);
-  Expect.isTrue(listCopy is List<int>);
-  Expect.isTrue(listCopy is List<String>);
-  dynamicCheck(set3, isInt: true, isString: true);
+test(Iterable iterable, List expected, { bool growable: true}) {
+  var list = iterable.toList(growable: growable);
+  Expect.listEquals(expected, list);
+  Expect.equals(expected is List<int>, list is List<int>, "int");
+  Expect.equals(expected is List<double>, list is List<double>, "double");
+  Expect.equals(expected is List<String>, list is List<String>, "str");
+  if (growable) {
+    int length = list.length;
+    list.add(null);
+    Expect.equals(length + 1, list.length);
+  } else {
+    Expect.throws(() { list.add(null); });
+  }
 }
diff --git a/tests/language/generic_local_functions_test.dart b/tests/language/generic_local_functions_test.dart
index 21bd7a7..1ec1227 100644
--- a/tests/language/generic_local_functions_test.dart
+++ b/tests/language/generic_local_functions_test.dart
@@ -7,7 +7,7 @@
 /// Dart test verifying that the parser can handle type parameterization of
 /// local function declarations, and declarations of function parameters.
 
-library generic_functions_test;
+library generic_local_functions_test;
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/generic_methods_function_type_test.dart b/tests/language/generic_methods_function_type_test.dart
new file mode 100644
index 0000000..17a4c1a
--- /dev/null
+++ b/tests/language/generic_methods_function_type_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// DartOptions=--generic-method-syntax
+
+/// Dart test on the usage of method type arguments in a function typed
+/// parameter declaration.
+
+library generic_methods_function_type_test;
+
+import "package:expect/expect.dart";
+
+class C<V> {
+  U m1<U>(U f(V v), V v) => f(v);
+  V m2<U>(V f(U v), U u) => f(u);
+}
+
+main() {
+  Expect.equals(new C<int>().m1<int>((x) => x, 10), 10);
+  Expect.equals(new C<int>().m2<int>((x) => x, 20), 20);
+}
+
diff --git a/tests/language/generic_methods_function_type_test.options b/tests/language/generic_methods_function_type_test.options
new file mode 100644
index 0000000..86e2aac
--- /dev/null
+++ b/tests/language/generic_methods_function_type_test.options
@@ -0,0 +1,3 @@
+analyzer:
+  language:
+    enableGenericMethods: true
diff --git a/tests/language/generic_methods_new_test.dart b/tests/language/generic_methods_new_test.dart
new file mode 100644
index 0000000..ea23b94
--- /dev/null
+++ b/tests/language/generic_methods_new_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// DartOptions=--generic-method-syntax
+
+/// Dart test on the usage of method type arguments in object creation. With
+/// '--generic-method-syntax', the type argument is available at runtime,
+/// but erased to `dynamic`.
+
+library generic_methods_new_test;
+
+import "package:expect/expect.dart";
+
+class C<E> {
+  E e;
+  C(this.e);
+}
+
+C<T> f1<T>(T t) => new C<T>(t);
+
+List<T> f2<T>(T t) => <T>[t];
+
+main() {
+  C c = f1<int>(42);
+  List i = f2<String>("Hello!");
+  Expect.isTrue(c is C<int> && c is C<String>); // C<dynamic>.
+  Expect.isTrue(i is List<String> && i is List<int>); // List<dynamic>.
+  Expect.equals(c.e, 42);
+  Expect.equals(i[0], "Hello!");
+}
diff --git a/tests/language/generic_methods_new_test.options b/tests/language/generic_methods_new_test.options
new file mode 100644
index 0000000..86e2aac
--- /dev/null
+++ b/tests/language/generic_methods_new_test.options
@@ -0,0 +1,3 @@
+analyzer:
+  language:
+    enableGenericMethods: true
diff --git a/tests/language/generic_methods_type_expression_test.dart b/tests/language/generic_methods_type_expression_test.dart
new file mode 100644
index 0000000..cbe0802
--- /dev/null
+++ b/tests/language/generic_methods_type_expression_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// DartOptions=--generic-method-syntax
+
+/// Dart test on the usage of method type arguments in type expressions. With
+/// '--generic-method-syntax', the type argument is available at runtime,
+/// but erased to `dynamic`.
+
+library generic_methods_type_expression_test;
+
+import "package:expect/expect.dart";
+
+bool f1<T>(Object o) => o is T;
+
+bool f2<T>(Object o) => o is List<T>;
+
+bool f3<T>(Object o) => o is! T;
+
+bool f4<T>(Object o) => o is! List<T>;
+
+T f5<T>(Object o) => o as T;
+
+List<T> f6<T>(Object o) => o as List<T>;
+
+Type f7<T>() => T;
+
+class TypeValue<X> {
+  Type get value => X;
+}
+
+Type f8<T>() => new TypeValue<List<T>>().value;
+
+main() {
+  String s = "Hello!";
+  List<String> ss = <String>[s];
+  Expect.throws(() => f1<int>(42), (e) => e is TypeError);
+  Expect.throws(() => f1<String>(42), (e) => e is TypeError);
+  Expect.equals(f2<int>(<int>[42]), true);
+  Expect.equals(f2<String>(<int>[42]), true); // `is List<dynamic>` is true.
+  Expect.throws(() => f3<int>(42), (e) => e is TypeError);
+  Expect.throws(() => f3<String>(42), (e) => e is TypeError);
+  Expect.equals(f4<int>(<int>[42]), false);
+  Expect.equals(f4<String>(<int>[42]), false); // `is! List<dynamic>` is false.
+  Expect.throws(() => f5<String>(s), (e) => e is TypeError);
+  Expect.throws(() => f5<int>(s), (e) => e is TypeError);
+  Expect.equals(f6<String>(ss), ss);
+  Expect.equals(f6<int>(ss), ss); // `as List<dynamic>` succeeds.
+  Expect.throws(() => f7<int>(), (e) => e is TypeError);
+  Expect.equals(f8<int>(), List); // Returns `List<dynamic>`.
+}
diff --git a/tests/language/generic_methods_type_expression_test.options b/tests/language/generic_methods_type_expression_test.options
new file mode 100644
index 0000000..86e2aac
--- /dev/null
+++ b/tests/language/generic_methods_type_expression_test.options
@@ -0,0 +1,3 @@
+analyzer:
+  language:
+    enableGenericMethods: true
diff --git a/tests/language/language.status b/tests/language/language.status
index 4b75506..b64df81 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -49,6 +49,9 @@
 generic_functions_test: CompiletimeError # Issue 25869
 generic_local_functions_test: CompiletimeError # Issue 25869
 generic_sends_test: CompiletimeError # Issue 25869
+generic_methods_new_test: CompiletimeError # Issue 25869
+generic_methods_function_type_test: CompiletimeError # Issue 25869
+generic_methods_type_expression_test: CompiletimeError # Issue 25869
 
 [ ($compiler == none || $compiler == precompiler || $compiler == dart2app) && ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) ]
 
@@ -94,6 +97,9 @@
 generic_functions_test: RuntimeError # Issue 25869
 generic_local_functions_test: RuntimeError # Issue 25869
 generic_sends_test: RuntimeError # Issue 25869
+generic_methods_new_test: RuntimeError # Issue 25869
+generic_methods_function_type_test: RuntimeError # Issue 25869
+generic_methods_type_expression_test: RuntimeError # Issue 25869
 config_import_test: Skip  # Issue 26250
 
 [ $compiler == none && $runtime == dartium && $system == linux && $arch != x64 ]
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 2035434..a0e3ee5 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -506,3 +506,6 @@
 generic_local_functions_test: CompileTimeError # Issue 25868
 generic_methods_test: CompileTimeError # Issue 25868
 generic_sends_test: CompileTimeError # Issue 25868
+generic_methods_new_test: CompiletimeError # Issue 25868
+generic_methods_function_type_test: CompiletimeError # Issue 25868
+generic_methods_type_expression_test: CompiletimeError # Issue 25868
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 25902c1..b61dd39 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -50,6 +50,9 @@
 generic_local_functions_test: CompileTimeError # DartOptions not passed to compiler.
 generic_methods_test: CompileTimeError # DartOptions not passed to compiler.
 generic_sends_test: CompileTimeError # DartOptions not passed to compiler.
+generic_methods_new_test: CompiletimeError # DartOptions not passed to compiler.
+generic_methods_function_type_test: CompiletimeError # DartOptions not passed to compiler.
+generic_methods_type_expression_test: CompiletimeError # DartOptions not passed to compiler.
 
 [ $compiler == dart2js ]
 invocation_mirror_empty_arguments_test: Fail # Issue 24331
@@ -132,9 +135,6 @@
 malbounded_type_test_test/04: Fail # Issue 14121
 malbounded_type_test2_test: Fail # Issue 14121
 default_factory2_test/01: Fail # Issue 14121
-generic_functions_test: Crash # Issue 26436
-generic_local_functions_test: Crash # Issue 26436
-generic_methods_test: Crash # Issue 26436
 
 [ $compiler == dart2js && $unchecked ]
 type_checks_in_factory_method_test: RuntimeError # Issue 12746
diff --git a/tests/lib/math/call_cmath_box_failure_path_test.dart b/tests/lib/math/call_cmath_box_failure_path_test.dart
new file mode 100644
index 0000000..9718489
--- /dev/null
+++ b/tests/lib/math/call_cmath_box_failure_path_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--optimization-counter-threshold=-1 --new_gen_semi_max_size=2
+
+import 'dart:math';
+
+main() {
+  // 2MB / 16 bytes = 125000 allocations
+
+  for (var i = 0; i < 500000; i++) {
+    sin(i);
+  }
+
+  for (var i = 0; i < 500000; i++) {
+    cos(i);
+  }
+
+  for (var i = 0; i < 500000; i++) {
+    i.toDouble().truncateToDouble();
+  }
+}
diff --git a/tests/lib/typed_data/typed_list_iterable_test.dart b/tests/lib/typed_data/typed_list_iterable_test.dart
index acdfa4b..787bfec 100644
--- a/tests/lib/typed_data/typed_list_iterable_test.dart
+++ b/tests/lib/typed_data/typed_list_iterable_test.dart
@@ -153,10 +153,11 @@
   Expect.isTrue(list.takeWhile((x) => true).isEmpty);
   Expect.isTrue(list.toList().isEmpty);
   var l2 = list.toList();
-  l2.add(0);
-  Expect.equals(0, l2.last);
+  var sampleValue = list is List<int> ? 0 : 0.0;
+  l2.add(sampleValue);
+  Expect.equals(sampleValue, l2.last);
   var l3 = list.toList(growable: false);
-  Expect.throws(() => l3.add(0), (e) => e is UnsupportedError);
+  Expect.throws(() => l3.add(sampleValue), (e) => e is UnsupportedError);
 }
 
 main() {
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index b163964..975dad7 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -181,7 +181,6 @@
 io/skipping_dart2js_compilations_test: Fail # Issue 19551.
 verbose_gc_to_bmu_test: Skip
 io/platform_resolved_executable_test/06: RuntimeError  # Issue 23641
-io/process_sync_test: Pass, Timeout  # Issue 24596
 io/sleep_test: Pass, Fail # Issue 25757
 
 [ $arch != ia32 && $arch != x64 && $arch != simarm && $arch != simarmv5te && $mode == debug ]
diff --git a/tests/utils/source_mirrors_test.dart b/tests/utils/source_mirrors_test.dart
deleted file mode 100644
index 8a748c7..0000000
--- a/tests/utils/source_mirrors_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// VMOptions=
-// VMOptions=--print-object-histogram
-
-// Smoke test of the dart2js compiler API.
-library source_mirrors_test;
-
-import 'dart:async';
-import "package:async_helper/async_helper.dart";
-
-import 'package:compiler/src/mirrors/analyze.dart';
-import 'dummy_compiler_test.dart';
-
-main() {
-  asyncStart();
-  Future result =
-      analyze([new Uri(scheme: 'main')],
-              new Uri(scheme: 'lib', path: '/'),
-              new Uri(scheme: 'package', path: '/'),
-              provider, handler);
-  result.then((mirrorSystem) {
-    if (mirrorSystem == null) {
-      throw 'Analysis failed';
-    }
-    mirrorSystem.libraries.forEach((uri, library) {
-      print(library);
-      library.declarations.forEach((name, declaration) {
-        print(' $name:$declaration');
-      });
-    });
-  }, onError: (e, s) {
-      throw 'Analysis failed: $e\n$s';
-  }).then(asyncSuccess);
-}
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index bec008c..b1dc829 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -7,7 +7,6 @@
 
 [ $compiler == dart2js ]
 recursive_import_test: Slow, Pass
-source_mirrors_test: Slow, Pass
 
 [ $compiler == dart2js && $browser ]
 *: Skip
@@ -18,10 +17,6 @@
 [ $compiler == dart2js && $mode == debug ]
 dummy_compiler_test: Slow, Pass
 
-[ $noopt || $compiler == precompiler || $mode == product ]
-source_mirrors_test: SkipByDesign # Imports dart:mirrors
-
 [ $compiler == dart2js && $cps_ir && $host_checked ]
 dummy_compiler_test: Crash # Issue 24485
 recursive_import_test: Crash # Issue 24485
-source_mirrors_test: Crash # Issue 24485
diff --git a/tools/VERSION b/tools/VERSION
index 2739e60..7b28ec1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 17
 PATCH 0
-PRERELEASE 4
-PRERELEASE_PATCH 1
+PRERELEASE 5
+PRERELEASE_PATCH 0
diff --git a/tools/deps/dartium.deps/DEPS b/tools/deps/dartium.deps/DEPS
index 960cf72..f1fa97c 100644
--- a/tools/deps/dartium.deps/DEPS
+++ b/tools/deps/dartium.deps/DEPS
@@ -8,8 +8,8 @@
 # Now we need to override some settings and add some new ones.
 
 vars.update({
-  "dartium_chromium_commit": "81ac1404ddd8fde55b9eb28a97c8a6d8b75e264f",
-  "dartium_webkit_commit": "ef30dc04127c86283c1f5c5c6b0094d73b1e29df",
+  "dartium_chromium_commit": "b6b6b76417ce80120ee48b662a7c7ef257723494",
+  "dartium_webkit_commit": "ca3b07f5929e6adb390901b31db634f4dfe0d2bf",
   "chromium_base_revision": "338390",
 
   # We use mirrors of all github repos to guarantee reproducibility and
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 125d64a..db47521 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -14,6 +14,46 @@
 from htmlrenamer import custom_html_constructors, html_interface_renames, \
     typed_array_renames
 
+_pure_interfaces = monitored.Set('generator._pure_interfaces', [
+    'AbstractWorker',
+    'CanvasPathMethods',
+    'ChildNode',
+    'DocumentAnimation',
+    'DocumentFontFaceSet',
+    'DocumentFullscreen',
+    'DocumentXPathEvaluator',
+    'ElementAnimation',
+    'ElementFullscreen',
+    'EventListener',
+    'GlobalEventHandlers',
+    'ImageBitmapFactories',
+    'MediaQueryListListener',
+    'MouseEventHitRegion',
+    'MutationCallback',
+    'NavigatorCPU',
+    'NavigatorEvents',
+    'NavigatorID',
+    'NavigatorLanguage',
+    'NavigatorOnLine',
+    'ParentNode',
+    'SVGDocument',
+    'SVGExternalResourcesRequired',
+    'SVGFilterPrimitiveStandardAttributes',
+    'SVGFitToViewBox',
+    'SVGTests',
+    'SVGURIReference',
+    'SVGZoomAndPan',
+    'TimeoutHandler',
+    'URLUtils',
+    'URLUtilsReadOnly',
+    'WebGLRenderingContextBase',
+    'WindowBase64',
+    'WindowEventHandlers',
+    'WindowImageBitmapFactories',
+    'WindowPagePopup',
+    'WindowTimers',
+    ])
+
 _safe_interfaces = monitored.Set('generator._safe_interfaces', [
     'double',
     'Float32Array',
@@ -149,6 +189,8 @@
 # SpeechGrammarList and friends
 
 def IsPureInterface(interface_name, database):
+  if (interface_name in _pure_interfaces):
+    return True
   if (interface_name in _safe_interfaces or
       interface_name in _safe_interfaces_legacy or
       database.HasInterface(interface_name)):
