diff --git a/DEPS b/DEPS
index 685fbc7..44e124f 100644
--- a/DEPS
+++ b/DEPS
@@ -57,8 +57,8 @@
   "csslib_tag" : "@0.13.2",
   "dart2js_info_tag" : "@0.5.0",
   "dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
-  "dart_style_rev": "@a2b84e46a9e4044e61e3cc130087c18da40b9665",
-  "dartdoc_tag" : "@v0.9.7+6",
+  "dart_style_tag": "@0.2.13",
+  "dartdoc_tag" : "@v0.9.8",
   "fixnum_tag": "@0.10.5",
   "func_tag": "@0.1.0",
   "glob_tag": "@1.1.3",
@@ -203,7 +203,7 @@
       (Var("github_mirror") % "dart-services") +
       Var("dart_services_rev"),
   Var("dart_root") + "/third_party/pkg_tested/dart_style":
-      (Var("github_mirror") % "dart_style") + Var("dart_style_rev"),
+      (Var("github_mirror") % "dart_style") + Var("dart_style_tag"),
   Var("dart_root") + "/third_party/pkg/dart2js_info":
       (Var("github_mirror") % "dart2js_info") + Var("dart2js_info_tag"),
   Var("dart_root") + "/third_party/pkg/dartdoc":
diff --git a/README.md b/README.md
index a95407c..e2a2f1e 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
 
 ## Building Dart
 
-Learn how to [get the source](https://github.com/dart-lang/sdk/wiki/Getting-The-Source)
+Learn how to [get the source](https://github.com/dart-lang/sdk/wiki/Building#getting-the-source)
 and [prepare your machine to build the SDK](https://github.com/dart-lang/sdk/wiki/Preparing-your-machine-to-build-the-Dart-SDK).
 
 There are more documents on our [wiki](https://github.com/dart-lang/sdk/wiki).
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 076e01c..e179dda 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -801,6 +801,10 @@
    * Dart file or cannot be resolved.
    */
   Future<CompilationUnit> getResolvedCompilationUnit(String path) async {
+    if (options.enableNewAnalysisDriver) {
+      nd.AnalysisResult result = await getAnalysisResult(path);
+      return result?.unit;
+    }
     ContextSourcePair contextSource = getContextSourcePair(path);
     AnalysisContext context = contextSource.context;
     if (context == null) {
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 47293f7..19737b8 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -676,6 +676,65 @@
   }
 
   /**
+   * Process [options] for the given context [info].
+   */
+  void processOptionsForDriver(ContextInfo info, Map<String, Object> options,
+      {bool optionsRemoved: false}) {
+    if (options == null && !optionsRemoved) {
+      return;
+    }
+    AnalysisOptions analysisOptions = info.analysisDriver.analysisOptions;
+
+    // In case options files are removed, revert to defaults.
+    if (optionsRemoved) {
+      // Start with defaults.
+      analysisOptions.resetToDefaults();
+
+      // Apply inherited options.
+      options = _toStringMap(_getEmbeddedOptions(info));
+      if (options != null) {
+        applyToAnalysisOptions(analysisOptions, options);
+      }
+    } else {
+      // Check for embedded options.
+      Map embeddedOptions = _getEmbeddedOptions(info);
+      if (embeddedOptions != null) {
+        options = _toStringMap(new Merger().merge(embeddedOptions, options));
+      }
+    }
+
+    // TODO(brianwilkerson) Figure out what to do here.
+//    // Notify options processors.
+//    AnalysisEngine.instance.optionsPlugin.optionsProcessors
+//        .forEach((OptionsProcessor p) {
+//      try {
+//        p.optionsProcessed(info.context, options);
+//      } catch (e, stacktrace) {
+//        AnalysisEngine.instance.logger.logError(
+//            'Error processing analysis options',
+//            new CaughtException(e, stacktrace));
+//      }
+//    });
+
+    applyToAnalysisOptions(analysisOptions, options);
+
+    // Nothing more to do.
+    if (options == null) {
+      return;
+    }
+
+    var analyzer = options[AnalyzerOptions.analyzer];
+    if (analyzer is Map) {
+      // Set ignore patterns.
+      YamlList exclude = analyzer[AnalyzerOptions.exclude];
+      List<String> excludeList = toStringList(exclude);
+      if (excludeList != null) {
+        setIgnorePatternsForContext(info, excludeList);
+      }
+    }
+  }
+
+  /**
    * Return the options from the analysis options file in the given [folder]
    * if exists, or in one of the parent folders, or `null` if no analysis
    * options file is found or if the contents of the file are not valid YAML.
@@ -1105,7 +1164,7 @@
     }
 
     if (enableNewAnalysisDriver) {
-      // TODO(scheglov) implement for the new analysis driver
+      processOptionsForDriver(info, optionMap);
     } else {
       processOptionsForContext(info, optionMap);
     }
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 441a9f4..58137c6 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -205,21 +205,23 @@
       engine.AnalysisErrorInfo errorInfo = server.getErrors(file);
       if (errorInfo != null) {
         LineInfo lineInfo = errorInfo.lineInfo;
-        int requestLine = lineInfo.getLocation(offset).lineNumber;
-        for (engine.AnalysisError error in errorInfo.errors) {
-          int errorLine = lineInfo.getLocation(error.offset).lineNumber;
-          if (errorLine == requestLine) {
-            List<Fix> fixes = await computeFixes(server.serverPlugin,
-                server.resourceProvider, unit.element.context, error);
-            if (fixes.isNotEmpty) {
-              AnalysisError serverError =
-                  newAnalysisError_fromEngine(lineInfo, error);
-              AnalysisErrorFixes errorFixes =
-                  new AnalysisErrorFixes(serverError);
-              errorFixesList.add(errorFixes);
-              fixes.forEach((fix) {
-                errorFixes.fixes.add(fix.change);
-              });
+        if (lineInfo != null) {
+          int requestLine = lineInfo.getLocation(offset).lineNumber;
+          for (engine.AnalysisError error in errorInfo.errors) {
+            int errorLine = lineInfo.getLocation(error.offset).lineNumber;
+            if (errorLine == requestLine) {
+              List<Fix> fixes = await computeFixes(server.serverPlugin,
+                  server.resourceProvider, unit.element.context, error);
+              if (fixes.isNotEmpty) {
+                AnalysisError serverError =
+                    newAnalysisError_fromEngine(lineInfo, error);
+                AnalysisErrorFixes errorFixes =
+                    new AnalysisErrorFixes(serverError);
+                errorFixesList.add(errorFixes);
+                fixes.forEach((fix) {
+                  errorFixes.fixes.add(fix.change);
+                });
+              }
             }
           }
         }
@@ -634,6 +636,9 @@
    * [kind] in the given [file].
    */
   Future<Null> _analyzeForRefactoring(String file, RefactoringKind kind) async {
+    if (server.options.enableNewAnalysisDriver) {
+      return;
+    }
     // "Extract Local" and "Inline Local" refactorings need only local analysis.
     if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE ||
         kind == RefactoringKind.INLINE_LOCAL_VARIABLE) {
@@ -755,7 +760,11 @@
       CompilationUnit unit = await server.getResolvedCompilationUnit(file);
       if (unit != null) {
         _resetOnAnalysisStarted();
-        refactoring = new InlineMethodRefactoring(searchEngine, unit, offset);
+        refactoring =
+            new InlineMethodRefactoring(searchEngine, (Element element) async {
+          String elementPath = element.source.fullName;
+          return await server.getResolvedCompilationUnit(elementPath);
+        }, unit, offset);
       }
     }
     if (kind == RefactoringKind.MOVE_FILE) {
@@ -863,6 +872,9 @@
    * But when any other file is changed or analyzed, we can continue.
    */
   void _resetOnFileResolutionChanged(String file) {
+    if (server.options.enableNewAnalysisDriver) {
+      return;
+    }
     subscriptionToReset?.cancel();
     subscriptionToReset = server
         .getAnalysisContext(file)
diff --git a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
index 06eb530..b3582c9 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
@@ -88,6 +88,12 @@
   Source get source;
 
   /**
+   * Return the content of the [source] in which the completion is being
+   * requested, or `null` if the content could not be accessed.
+   */
+  String get sourceContents;
+
+  /**
    * Throw [AbortCompletion] if the completion request has been aborted.
    */
   void checkAborted();
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_core.dart b/pkg/analysis_server/lib/src/services/completion/completion_core.dart
index c43a144..0a8b431 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_core.dart
@@ -87,12 +87,12 @@
    * that can be used to filter the suggestions on the server side.
    */
   String get filterText {
-    return context
-        .getContents(source)
-        .data
-        .substring(replacementOffset, offset);
+    return sourceContents.substring(replacementOffset, offset);
   }
 
+  @override
+  String get sourceContents => context.getContents(source)?.data;
+
   /**
    * Abort the current completion request.
    */
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index ea320be..e00ec2a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -226,6 +226,9 @@
   }
 
   @override
+  String get sourceContents => context.getContents(source)?.data;
+
+  @override
   SourceFactory get sourceFactory {
     return context?.sourceFactory ?? result.sourceFactory;
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 5f78297..70b2b44 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -211,7 +211,7 @@
     // then do not suppress the relevance of private members
     var data = request.result != null
         ? request.result.content
-        : request.context.getContents(request.source)?.data;
+        : request.sourceContents;
     int offset = request.offset;
     if (data != null && 0 < offset && offset <= data.length) {
       bool isIdentifierChar(int index) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
index 802beae..b2b624d 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
@@ -66,7 +66,7 @@
             // Quoted empty string
             visitSimpleStringLiteral(uri);
           } else {
-            String data = request.source.contents.data;
+            String data = request.sourceContents;
             if (end == data.length) {
               String ch = data[end - 1];
               if (ch != '"' && ch != "'") {
@@ -78,7 +78,7 @@
           }
         }
       } else if (offset == start && offset == end) {
-        String data = request.source.contents.data;
+        String data = request.sourceContents;
         if (end == data.length) {
           String ch = data[end - 1];
           if (ch == '"' || ch == "'") {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 486f724..8a0322c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -191,11 +191,18 @@
 }
 
 /**
+ * Completes with the resolved [CompilationUnit] that contains the [element].
+ */
+typedef Future<CompilationUnit> GetResolvedUnitContainingElement(
+    Element element);
+
+/**
  * [InlineMethodRefactoring] implementation.
  */
 class InlineMethodRefactoringImpl extends RefactoringImpl
     implements InlineMethodRefactoring {
   final SearchEngine searchEngine;
+  final GetResolvedUnitContainingElement getResolvedUnit;
   final CompilationUnit unit;
   final int offset;
   CorrectionUtils utils;
@@ -218,7 +225,8 @@
   List<_ReferenceProcessor> _referenceProcessors = [];
   Set<FunctionBody> _alreadyMadeAsync = new Set<FunctionBody>();
 
-  InlineMethodRefactoringImpl(this.searchEngine, this.unit, this.offset) {
+  InlineMethodRefactoringImpl(
+      this.searchEngine, this.getResolvedUnit, this.unit, this.offset) {
     utils = new CorrectionUtils(unit);
   }
 
@@ -279,7 +287,7 @@
   Future<RefactoringStatus> checkInitialConditions() async {
     RefactoringStatus result = new RefactoringStatus();
     // prepare method information
-    result.addStatus(_prepareMethod());
+    result.addStatus(await _prepareMethod());
     if (result.hasFatalError) {
       return new Future<RefactoringStatus>.value(result);
     }
@@ -301,6 +309,7 @@
     _referenceProcessors.clear();
     for (SearchMatch reference in references) {
       _ReferenceProcessor processor = new _ReferenceProcessor(this, reference);
+      await processor.init();
       _referenceProcessors.add(processor);
     }
     return result;
@@ -327,7 +336,7 @@
   /**
    * Initializes [_methodElement] and related fields.
    */
-  RefactoringStatus _prepareMethod() {
+  Future<RefactoringStatus> _prepareMethod() async {
     _methodElement = null;
     _methodParameters = null;
     _methodBody = null;
@@ -352,7 +361,7 @@
     }
     _methodElement = element as ExecutableElement;
     _isAccessor = element is PropertyAccessorElement;
-    _methodUnit = element.unit;
+    _methodUnit = await getResolvedUnit(element);
     _methodUtils = new CorrectionUtils(_methodUnit);
     // class member
     bool isClassMember = element.enclosingElement is ClassElement;
@@ -435,6 +444,7 @@
  */
 class _ReferenceProcessor {
   final InlineMethodRefactoringImpl ref;
+  final SearchMatch reference;
 
   Element refElement;
   CorrectionUtils _refUtils;
@@ -442,10 +452,12 @@
   SourceRange _refLineRange;
   String _refPrefix;
 
-  _ReferenceProcessor(this.ref, SearchMatch reference) {
+  _ReferenceProcessor(this.ref, this.reference);
+
+  Future<Null> init() async {
     refElement = reference.element;
     // prepare CorrectionUtils
-    CompilationUnit refUnit = refElement.unit;
+    CompilationUnit refUnit = await ref.getResolvedUnit(refElement);
     _refUtils = new CorrectionUtils(refUnit);
     // prepare node and environment
     _node = _refUtils.findNode(reference.sourceRange.offset);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index b4abf87..5cf982f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -249,8 +249,12 @@
    * Returns a new [InlineMethodRefactoring] instance.
    */
   factory InlineMethodRefactoring(
-      SearchEngine searchEngine, CompilationUnit unit, int offset) {
-    return new InlineMethodRefactoringImpl(searchEngine, unit, offset);
+      SearchEngine searchEngine,
+      GetResolvedUnitContainingElement getResolvedUnit,
+      CompilationUnit unit,
+      int offset) {
+    return new InlineMethodRefactoringImpl(
+        searchEngine, getResolvedUnit, unit, offset);
   }
 
   /**
diff --git a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
index bc1d29c..c629f93 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
@@ -1712,6 +1712,7 @@
 
   void _createRefactoring(String search) {
     int offset = findOffset(search);
-    refactoring = new InlineMethodRefactoring(searchEngine, testUnit, offset);
+    refactoring = new InlineMethodRefactoring(
+        searchEngine, (element) async => element.unit, testUnit, offset);
   }
 }
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 851890c..c36925f 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -461,7 +461,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class AssignmentExpression extends Expression {
+abstract class AssignmentExpression extends Expression
+    implements MethodReferenceExpression {
   /**
    * Initialize a newly created assignment expression.
    */
@@ -470,15 +471,6 @@
       new AssignmentExpressionImpl(leftHandSide, operator, rightHandSide);
 
   /**
-   * Return the best element available for this operator. If resolution was able
-   * to find a better element based on type propagation, that element will be
-   * returned. Otherwise, the element found using the result of static analysis
-   * will be returned. If resolution has not been performed, then `null` will be
-   * returned.
-   */
-  MethodElement get bestElement;
-
-  /**
    * Return the expression used to compute the left hand side.
    */
   Expression get leftHandSide;
@@ -499,20 +491,6 @@
   void set operator(Token token);
 
   /**
-   * Return the element associated with the operator based on the propagated
-   * type of the left-hand-side, or `null` if the AST structure has not been
-   * resolved, if the operator is not a compound operator, or if the operator
-   * could not be resolved.
-   */
-  MethodElement get propagatedElement;
-
-  /**
-   * Set the element associated with the operator based on the propagated
-   * type of the left-hand-side to the given [element].
-   */
-  void set propagatedElement(MethodElement element);
-
-  /**
    * Return the expression used to compute the right hand side.
    */
   Expression get rightHandSide;
@@ -522,20 +500,6 @@
    * [expression].
    */
   void set rightHandSide(Expression expression);
-
-  /**
-   * Return the element associated with the operator based on the static type of
-   * the left-hand-side, or `null` if the AST structure has not been resolved,
-   * if the operator is not a compound operator, or if the operator could not be
-   * resolved.
-   */
-  MethodElement get staticElement;
-
-  /**
-   * Set the element associated with the operator based on the static type of
-   * the left-hand-side to the given [element].
-   */
-  void set staticElement(MethodElement element);
 }
 
 /**
@@ -926,7 +890,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class BinaryExpression extends Expression {
+abstract class BinaryExpression extends Expression
+    implements MethodReferenceExpression {
   /**
    * Initialize a newly created binary expression.
    */
@@ -935,15 +900,6 @@
       new BinaryExpressionImpl(leftOperand, operator, rightOperand);
 
   /**
-   * Return the best element available for this operator. If resolution was able
-   * to find a better element based on type propagation, that element will be
-   * returned. Otherwise, the element found using the result of static analysis
-   * will be returned. If resolution has not been performed, then `null` will be
-   * returned.
-   */
-  MethodElement get bestElement;
-
-  /**
    * Return the expression used to compute the left operand.
    */
   Expression get leftOperand;
@@ -965,20 +921,6 @@
   void set operator(Token token);
 
   /**
-   * Return the element associated with the operator based on the propagated
-   * type of the left operand, or `null` if the AST structure has not been
-   * resolved, if the operator is not user definable, or if the operator could
-   * not be resolved.
-   */
-  MethodElement get propagatedElement;
-
-  /**
-   * Set the element associated with the operator based on the propagated
-   * type of the left operand to the given [element].
-   */
-  void set propagatedElement(MethodElement element);
-
-  /**
    * Return the expression used to compute the right operand.
    */
   Expression get rightOperand;
@@ -988,20 +930,6 @@
    * [expression].
    */
   void set rightOperand(Expression expression);
-
-  /**
-   * Return the element associated with the operator based on the static type of
-   * the left operand, or `null` if the AST structure has not been resolved, if
-   * the operator is not user definable, or if the operator could not be
-   * resolved.
-   */
-  MethodElement get staticElement;
-
-  /**
-   * Set the element associated with the operator based on the static type of
-   * the left operand to the given [element].
-   */
-  void set staticElement(MethodElement element);
 }
 
 /**
@@ -2429,7 +2357,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class ConstructorName extends AstNode {
+abstract class ConstructorName extends AstNode
+    implements ConstructorReferenceNode {
   /**
    * Initialize a newly created constructor name. The [period] and [name] can be
    * `null` if the constructor being named is the unnamed constructor.
@@ -2461,19 +2390,6 @@
   void set period(Token token);
 
   /**
-   * Return the element associated with this constructor name based on static
-   * type information, or `null` if the AST structure has not been resolved or
-   * if this constructor name could not be resolved.
-   */
-  ConstructorElement get staticElement;
-
-  /**
-   * Set the element associated with this constructor name based on static type
-   * information to the given [element].
-   */
-  void set staticElement(ConstructorElement element);
-
-  /**
    * Return the name of the type defining the constructor.
    */
   TypeName get type;
@@ -2485,6 +2401,26 @@
 }
 
 /**
+ * An AST node that makes reference to a constructor.
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class ConstructorReferenceNode {
+  /**
+   * Return the element associated with the referenced constructor based on
+   * static type information, or `null` if the AST structure has not been
+   * resolved or if the constructor could not be resolved.
+   */
+  ConstructorElement get staticElement;
+
+  /**
+   * Set the element associated with the referenced constructor based on static
+   * type information to the given [element].
+   */
+  void set staticElement(ConstructorElement element);
+}
+
+/**
  * A continue statement.
  *
  *    continueStatement ::=
@@ -4192,25 +4128,6 @@
   void set propagatedElement(ExecutableElement element);
 
   /**
-   * Return the function type of the method invocation based on the propagated
-   * type information, or `null` if the AST structure has not been resolved, or
-   * if the invoke could not be resolved.
-   *
-   * This will usually be a [FunctionType], but it can also be an
-   * [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
-   * interface type that implements `Function`.
-   */
-  @override
-  DartType get propagatedInvokeType;
-
-  /**
-   * Set the function type of the method invocation based on the propagated type
-   * information to the given [type].
-   */
-  @override
-  void set propagatedInvokeType(DartType type);
-
-  /**
    * Return the element associated with the function being invoked based on
    * static type information, or `null` if the AST structure has not been
    * resolved or the function could not be resolved.
@@ -4224,25 +4141,6 @@
   void set staticElement(ExecutableElement element);
 
   /**
-   * Return the function type of the method invocation based on the static type
-   * information, or `null` if the AST structure has not been resolved, or if
-   * the invoke could not be resolved.
-   *
-   * This will usually be a [FunctionType], but it can also be an
-   * [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
-   * interface type that implements `Function`.
-   */
-  @override
-  DartType get staticInvokeType;
-
-  /**
-   * Set the function type of the method invocation based on the static type
-   * information to the given [type].
-   */
-  @override
-  void set staticInvokeType(DartType type);
-
-  /**
    * Set the type arguments to be applied to the method being invoked to the
    * given [typeArguments].
    */
@@ -4781,7 +4679,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class IndexExpression extends Expression {
+abstract class IndexExpression extends Expression
+    implements MethodReferenceExpression {
   /**
    * Initialize a newly created index expression.
    */
@@ -4815,15 +4714,6 @@
   void set auxiliaryElements(AuxiliaryElements elements);
 
   /**
-   * Return the best element available for this operator. If resolution was able
-   * to find a better element based on type propagation, that element will be
-   * returned. Otherwise, the element found using the result of static analysis
-   * will be returned. If resolution has not been performed, then `null` will be
-   * returned.
-   */
-  MethodElement get bestElement;
-
-  /**
    * Return the expression used to compute the index.
    */
   Expression get index;
@@ -4863,19 +4753,6 @@
   void set period(Token token);
 
   /**
-   * Return the element associated with the operator based on the propagated
-   * type of the target, or `null` if the AST structure has not been resolved or
-   * if the operator could not be resolved.
-   */
-  MethodElement get propagatedElement;
-
-  /**
-   * Set the element associated with the operator based on the propagated
-   * type of the target to the given [element].
-   */
-  void set propagatedElement(MethodElement element);
-
-  /**
    * Return the expression used to compute the object being indexed. If this
    * index expression is not part of a cascade expression, then this is the same
    * as [target]. If this index expression is part of a cascade expression, then
@@ -4889,19 +4766,6 @@
   Token get rightBracket;
 
   /**
-   * Return the element associated with the operator based on the static type of
-   * the target, or `null` if the AST structure has not been resolved or if the
-   * operator could not be resolved.
-   */
-  MethodElement get staticElement;
-
-  /**
-   * Set the element associated with the operator based on the static type of
-   * the target to the given [element].
-   */
-  void set staticElement(MethodElement element);
-
-  /**
    * Return the expression used to compute the object being indexed, or `null`
    * if this index expression is part of a cascade expression.
    *
@@ -4949,7 +4813,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class InstanceCreationExpression extends Expression {
+abstract class InstanceCreationExpression extends Expression
+    implements ConstructorReferenceNode {
   /**
    * Initialize a newly created instance creation expression.
    */
@@ -4995,19 +4860,6 @@
    * created to the given [token].
    */
   void set keyword(Token token);
-
-  /**
-   * Return the element associated with the constructor based on static type
-   * information, or `null` if the AST structure has not been resolved or if the
-   * constructor could not be resolved.
-   */
-  ConstructorElement get staticElement;
-
-  /**
-   * Set the element associated with the constructor based on static type
-   * information to the given [element].
-   */
-  void set staticElement(ConstructorElement element);
 }
 
 /**
@@ -5838,25 +5690,6 @@
   void set operator(Token token);
 
   /**
-   * Return the function type of the method invocation based on the propagated
-   * type information, or `null` if the AST structure has not been resolved, or
-   * if the invoke could not be resolved.
-   *
-   * This will usually be a [FunctionType], but it can also be an
-   * [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
-   * interface type that implements `Function`.
-   */
-  @override
-  DartType get propagatedInvokeType;
-
-  /**
-   * Set the function type of the method invocation based on the propagated type
-   * information to the given [type].
-   */
-  @override
-  void set propagatedInvokeType(DartType type);
-
-  /**
    * Return the expression used to compute the receiver of the invocation. If
    * this invocation is not part of a cascade expression, then this is the same
    * as [target]. If this invocation is part of a cascade expression, then the
@@ -5865,25 +5698,6 @@
   Expression get realTarget;
 
   /**
-   * Return the function type of the method invocation based on the static type
-   * information, or `null` if the AST structure has not been resolved, or if
-   * the invoke could not be resolved.
-   *
-   * This will usually be a [FunctionType], but it can also be an
-   * [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
-   * interface type that implements `Function`.
-   */
-  @override
-  DartType get staticInvokeType;
-
-  /**
-   * Set the function type of the method invocation based on the static type
-   * information to the given [type].
-   */
-  @override
-  void set staticInvokeType(DartType type);
-
-  /**
    * Return the expression producing the object on which the method is defined,
    * or `null` if there is no target (that is, the target is implicitly `this`)
    * or if this method invocation is part of a cascade expression.
@@ -5907,6 +5721,52 @@
 }
 
 /**
+ * An expression that implicity makes reference to a method.
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class MethodReferenceExpression {
+  /**
+   * Return the best element available for this expression. If resolution was
+   * able to find a better element based on type propagation, that element will
+   * be returned. Otherwise, the element found using the result of static
+   * analysis will be returned. If resolution has not been performed, then
+   * `null` will be returned.
+   */
+  MethodElement get bestElement;
+
+  /**
+   * Return the element associated with the expression based on propagated
+   * types, or `null` if the AST structure has not been resolved, or there is
+   * no meaningful propagated element to return (e.g. because this is a
+   * non-compound assignment expression, or because the method referred to could
+   * not be resolved).
+   */
+  MethodElement get propagatedElement;
+
+  /**
+   * Set the element associated with the expression based on propagated types to
+   * the given [element].
+   */
+  void set propagatedElement(MethodElement element);
+
+  /**
+   * Return the element associated with the expression based on the static
+   * types, or `null` if the AST structure has not been resolved, or there is no
+   * meaningful static element to return (e.g. because this is a non-compound
+   * assignment expression, or because the method referred to could not be
+   * resolved).
+   */
+  MethodElement get staticElement;
+
+  /**
+   * Set the element associated with the expression based on static types to the
+   * given [element].
+   */
+  void set staticElement(MethodElement element);
+}
+
+/**
  * A node that declares a single name within the scope of a compilation unit.
  *
  * Clients may not extend, implement or mix-in this class.
@@ -6417,7 +6277,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class PostfixExpression extends Expression {
+abstract class PostfixExpression extends Expression
+    implements MethodReferenceExpression {
   /**
    * Initialize a newly created postfix expression.
    */
@@ -6425,15 +6286,6 @@
       new PostfixExpressionImpl(operand, operator);
 
   /**
-   * Return the best element available for this operator. If resolution was able
-   * to find a better element based on type propagation, that element will be
-   * returned. Otherwise, the element found using the result of static analysis
-   * will be returned. If resolution has not been performed, then `null` will be
-   * returned.
-   */
-  MethodElement get bestElement;
-
-  /**
    * Return the expression computing the operand for the operator.
    */
   Expression get operand;
@@ -6453,33 +6305,6 @@
    * Set the postfix operator being applied to the operand to the given [token].
    */
   void set operator(Token token);
-
-  /**
-   * Return the element associated with this the operator based on the
-   * propagated type of the operand, or `null` if the AST structure has not been
-   * resolved, if the operator is not user definable, or if the operator could
-   * not be resolved.
-   */
-  MethodElement get propagatedElement;
-
-  /**
-   * Set the element associated with this the operator based on the propagated
-   * type of the operand to the given [element].
-   */
-  void set propagatedElement(MethodElement element);
-
-  /**
-   * Return the element associated with the operator based on the static type of
-   * the operand, or `null` if the AST structure has not been resolved, if the
-   * operator is not user definable, or if the operator could not be resolved.
-   */
-  MethodElement get staticElement;
-
-  /**
-   * Set the element associated with the operator based on the static type of
-   * the operand to the given [element].
-   */
-  void set staticElement(MethodElement element);
 }
 
 /**
@@ -6550,7 +6375,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class PrefixExpression extends Expression {
+abstract class PrefixExpression extends Expression
+    implements MethodReferenceExpression {
   /**
    * Initialize a newly created prefix expression.
    */
@@ -6558,15 +6384,6 @@
       new PrefixExpressionImpl(operator, operand);
 
   /**
-   * Return the best element available for this operator. If resolution was able
-   * to find a better element based on type propagation, that element will be
-   * returned. Otherwise, the element found using the result of static analysis
-   * will be returned. If resolution has not been performed, then `null` will be
-   * returned.
-   */
-  MethodElement get bestElement;
-
-  /**
    * Return the expression computing the operand for the operator.
    */
   Expression get operand;
@@ -6586,33 +6403,6 @@
    * Set the prefix operator being applied to the operand to the given [token].
    */
   void set operator(Token token);
-
-  /**
-   * Return the element associated with the operator based on the propagated
-   * type of the operand, or `null` if the AST structure has not been resolved,
-   * if the operator is not user definable, or if the operator could not be
-   * resolved.
-   */
-  MethodElement get propagatedElement;
-
-  /**
-   * Set the element associated with the operator based on the propagated type
-   * of the operand to the given [element].
-   */
-  void set propagatedElement(MethodElement element);
-
-  /**
-   * Return the element associated with the operator based on the static type of
-   * the operand, or `null` if the AST structure has not been resolved, if the
-   * operator is not user definable, or if the operator could not be resolved.
-   */
-  MethodElement get staticElement;
-
-  /**
-   * Set the element associated with the operator based on the static type of
-   * the operand to the given [element].
-   */
-  void set staticElement(MethodElement element);
 }
 
 /**
@@ -6695,7 +6485,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class RedirectingConstructorInvocation extends ConstructorInitializer {
+abstract class RedirectingConstructorInvocation extends ConstructorInitializer
+    implements ConstructorReferenceNode {
   /**
    * Initialize a newly created redirecting invocation to invoke the constructor
    * with the given name with the given arguments. The [constructorName] can be
@@ -6741,19 +6532,6 @@
   void set period(Token token);
 
   /**
-   * Return the element associated with the constructor based on static type
-   * information, or `null` if the AST structure has not been resolved or if the
-   * constructor could not be resolved.
-   */
-  ConstructorElement get staticElement;
-
-  /**
-   * Set the element associated with the constructor based on static type
-   * information to the given [element].
-   */
-  void set staticElement(ConstructorElement element);
-
-  /**
    * Return the token for the 'this' keyword.
    */
   Token get thisKeyword;
@@ -7193,7 +6971,8 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-abstract class SuperConstructorInvocation extends ConstructorInitializer {
+abstract class SuperConstructorInvocation extends ConstructorInitializer
+    implements ConstructorReferenceNode {
   /**
    * Initialize a newly created super invocation to invoke the inherited
    * constructor with the given name with the given arguments. The [period] and
@@ -7240,19 +7019,6 @@
   void set period(Token token);
 
   /**
-   * Return the element associated with the constructor based on static type
-   * information, or `null` if the AST structure has not been resolved or if the
-   * constructor could not be resolved.
-   */
-  ConstructorElement get staticElement;
-
-  /**
-   * Set the element associated with the constructor based on static type
-   * information to the given [element].
-   */
-  void set staticElement(ConstructorElement element);
-
-  /**
    * Return the token for the 'super' keyword.
    */
   Token get superKeyword;
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 147ade7..939623d 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -46,8 +46,6 @@
   // Analysis options.
   //
   AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
-  defaultOptions.enableInitializingFormalAccess =
-      args[enableInitializingFormalAccessFlag];
   defaultOptions.enableStrictCallChecks = args[enableStrictCallChecksFlag];
   defaultOptions.enableSuperMixins = args[enableSuperInMixinFlag];
   defaultOptions.implicitCasts = !args[noImplicitCastsFlag];
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 3068176..30d48e2 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -283,8 +283,6 @@
         this._options.enableAssertInitializer !=
             options.enableAssertInitializer ||
         this._options.enableAssertMessage != options.enableAssertMessage ||
-        this._options.enableInitializingFormalAccess !=
-            options.enableInitializingFormalAccess ||
         this._options.enableLazyAssignmentOperators !=
             options.enableLazyAssignmentOperators ||
         ((options is AnalysisOptionsImpl)
@@ -311,8 +309,6 @@
     this._options.enableAssertInitializer = options.enableAssertInitializer;
     this._options.enableAssertMessage = options.enableAssertMessage;
     this._options.enableStrictCallChecks = options.enableStrictCallChecks;
-    this._options.enableInitializingFormalAccess =
-        options.enableInitializingFormalAccess;
     this._options.enableLazyAssignmentOperators =
         options.enableLazyAssignmentOperators;
     this._options.enableSuperMixins = options.enableSuperMixins;
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 7d493d6..a903243 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -71,7 +71,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 8;
+  static const int DATA_VERSION = 9;
 
   /**
    * The name of the driver, e.g. the name of the folder.
@@ -592,9 +592,14 @@
     AnalysisContext analysisContext = _createAnalysisContext(libraryContext);
 
     // Resynthesize the CompilationUnitElement in the context.
-    CompilationUnitElement unitElement = analysisContext.computeResult(
-        new LibrarySpecificUnit(libraryFile.source, file.source),
-        COMPILATION_UNIT_ELEMENT);
+    CompilationUnitElement unitElement;
+    try {
+      unitElement = analysisContext.computeResult(
+          new LibrarySpecificUnit(libraryFile.source, file.source),
+          COMPILATION_UNIT_ELEMENT);
+    } finally {
+      analysisContext.dispose();
+    }
 
     // Return as IndexResult.
     return new IndexResult(unitElement, analysisResult._index);
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 6b5c09c..8c8c132 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -440,6 +440,13 @@
         false) {
       return;
     }
+    // Ignore named parameters of synthetic functions, e.g. created for LUB.
+    // These functions are not bound to a source, we cannot index them.
+    if (elementKind == ElementKind.PARAMETER &&
+        element is ParameterElement &&
+        element.enclosingElement.isSynthetic) {
+      return;
+    }
     // Add the relation.
     assembler.addElementRelation(element, kind, offset, length, isQualified);
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 2c3448c..8ca2f31 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -60,6 +60,8 @@
       return _searchReferences_Local(element, (n) => n is Block);
     } else if (kind == ElementKind.PARAMETER) {
       return _searchReferences_Parameter(element);
+    } else if (kind == ElementKind.PREFIX) {
+      return _searchReferences_Prefix(element);
     } else if (kind == ElementKind.TYPE_PARAMETER) {
       return _searchReferences_Local(
           element, (n) => n.parent is CompilationUnit);
@@ -69,7 +71,7 @@
   }
 
   Future<Null> _addResults(List<SearchResult> results, Element element,
-      IndexRelationKind relationKind, SearchResultKind resultKind) async {
+      Map<IndexRelationKind, SearchResultKind> relationToResultKind) async {
     String path = element.source.fullName;
 
     // If the file with the element is not known, then the element is not used.
@@ -93,8 +95,8 @@
       int elementId = request.findElementId(element);
       if (elementId != -1) {
         CompilationUnitElement unitElement = result.unitElement;
-        List<SearchResult> fileResults = request.getRelations(
-            elementId, relationKind, resultKind, unitElement);
+        List<SearchResult> fileResults =
+            request.getRelations(elementId, relationToResultKind, unitElement);
         results.addAll(fileResults);
       }
     }
@@ -102,8 +104,8 @@
 
   Future<List<SearchResult>> _searchReferences(Element element) async {
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, element, IndexRelationKind.IS_REFERENCED_BY,
-        SearchResultKind.REFERENCE);
+    await _addResults(results, element,
+        {IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE});
     return results;
   }
 
@@ -113,20 +115,20 @@
     PropertyAccessorElement getter = field.getter;
     PropertyAccessorElement setter = field.setter;
     if (!field.isSynthetic) {
-      await _addResults(results, field, IndexRelationKind.IS_WRITTEN_BY,
-          SearchResultKind.WRITE);
-      await _addResults(results, field, IndexRelationKind.IS_REFERENCED_BY,
-          SearchResultKind.REFERENCE);
+      await _addResults(results, field, {
+        IndexRelationKind.IS_WRITTEN_BY: SearchResultKind.WRITE,
+        IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE
+      });
     }
     if (getter != null) {
-      await _addResults(results, getter, IndexRelationKind.IS_REFERENCED_BY,
-          SearchResultKind.READ);
-      await _addResults(results, getter, IndexRelationKind.IS_INVOKED_BY,
-          SearchResultKind.INVOCATION);
+      await _addResults(results, getter, {
+        IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.READ,
+        IndexRelationKind.IS_INVOKED_BY: SearchResultKind.INVOCATION
+      });
     }
     if (setter != null) {
-      await _addResults(results, setter, IndexRelationKind.IS_REFERENCED_BY,
-          SearchResultKind.WRITE);
+      await _addResults(results, setter,
+          {IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.WRITE});
     }
     return results;
   }
@@ -136,20 +138,20 @@
       element = (element as Member).baseElement;
     }
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, element, IndexRelationKind.IS_REFERENCED_BY,
-        SearchResultKind.REFERENCE);
-    await _addResults(results, element, IndexRelationKind.IS_INVOKED_BY,
-        SearchResultKind.INVOCATION);
+    await _addResults(results, element, {
+      IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE,
+      IndexRelationKind.IS_INVOKED_BY: SearchResultKind.INVOCATION
+    });
     return results;
   }
 
   Future<List<SearchResult>> _searchReferences_Getter(
       PropertyAccessorElement getter) async {
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, getter, IndexRelationKind.IS_REFERENCED_BY,
-        SearchResultKind.REFERENCE);
-    await _addResults(results, getter, IndexRelationKind.IS_INVOKED_BY,
-        SearchResultKind.INVOCATION);
+    await _addResults(results, getter, {
+      IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE,
+      IndexRelationKind.IS_INVOKED_BY: SearchResultKind.INVOCATION
+    });
     return results;
   }
 
@@ -196,6 +198,27 @@
     }));
     return results;
   }
+
+  Future<List<SearchResult>> _searchReferences_Prefix(
+      PrefixElement element) async {
+    // Search only in drivers to which the library with the prefix was added.
+    String path = element.source.fullName;
+    if (!_driver.addedFiles.contains(path)) {
+      return const <SearchResult>[];
+    }
+
+    List<SearchResult> results = <SearchResult>[];
+    LibraryElement libraryElement = element.library;
+    for (CompilationUnitElement unitElement in libraryElement.units) {
+      String unitPath = unitElement.source.fullName;
+      AnalysisResult unitAnalysisResult = await _driver.getResult(unitPath);
+      _LocalReferencesVisitor visitor =
+          new _LocalReferencesVisitor(element, unitElement);
+      unitAnalysisResult.unit.accept(visitor);
+      results.addAll(visitor.results);
+    }
+    return results;
+  }
 }
 
 /**
@@ -377,12 +400,11 @@
 
   /**
    * Return a list of results where an element with the given [elementId] has
-   * relation of the given [indexKind].
+   * a relation with the kind from [relationToResultKind].
    */
   List<SearchResult> getRelations(
       int elementId,
-      IndexRelationKind indexKind,
-      SearchResultKind searchKind,
+      Map<IndexRelationKind, SearchResultKind> relationToResultKind,
       CompilationUnitElement enclosingUnitElement) {
     // Find the first usage of the element.
     int i = _findFirstOccurrence(index.usedElements, elementId);
@@ -394,14 +416,16 @@
     for (;
         i < index.usedElements.length && index.usedElements[i] == elementId;
         i++) {
-      if (index.usedElementKinds[i] == indexKind) {
+      IndexRelationKind relationKind = index.usedElementKinds[i];
+      SearchResultKind resultKind = relationToResultKind[relationKind];
+      if (resultKind != null) {
         int offset = index.usedElementOffsets[i];
         Element enclosingElement =
             _getEnclosingElement(enclosingUnitElement, offset);
         results.add(new SearchResult._(
             null,
             enclosingElement,
-            searchKind,
+            resultKind,
             offset,
             index.usedElementLengths[i],
             true,
diff --git a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
index 57c4169..69d3948 100644
--- a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
@@ -54,12 +54,22 @@
       new HashMap<ClassElement, Set<AnalysisError>>();
 
   /**
+   * Indicates whether errors should be ignored.
+   *
+   * When this bool is `true`, we skip the logic that figures out which error
+   * to report; this avoids a crash when the inheritance manager is used in the
+   * context of summary linking (where there is not enough information available
+   * to determine error locations).
+   */
+  final bool ignoreErrors;
+
+  /**
    * Initialize a newly created inheritance manager.
    *
    * @param library the library element context that the inheritance mappings are being generated
    */
   InheritanceManager(LibraryElement library,
-      {bool includeAbstractFromSuperclasses: false}) {
+      {bool includeAbstractFromSuperclasses: false, this.ignoreErrors: false}) {
     this._library = library;
     _includeAbstractFromSuperclasses = includeAbstractFromSuperclasses;
     _classLookup = new HashMap<ClassElement, Map<String, ExecutableElement>>();
@@ -654,15 +664,15 @@
    * @param errorCode the error code to be associated with this error
    * @param arguments the arguments used to build the error message
    */
-  void _reportError(ClassElement classElt, int offset, int length,
-      ErrorCode errorCode, List<Object> arguments) {
-    HashSet<AnalysisError> errorSet = _errorsInClassElement[classElt];
-    if (errorSet == null) {
-      errorSet = new HashSet<AnalysisError>();
-      _errorsInClassElement[classElt] = errorSet;
+  void _reportError(
+      ClassElement classElt, ErrorCode errorCode, List<Object> arguments) {
+    if (ignoreErrors) {
+      return;
     }
-    errorSet.add(new AnalysisError(
-        classElt.source, offset, length, errorCode, arguments));
+    HashSet<AnalysisError> errorSet = _errorsInClassElement.putIfAbsent(
+        classElt, () => new HashSet<AnalysisError>());
+    errorSet.add(new AnalysisError(classElt.source, classElt.nameOffset,
+        classElt.nameLength, errorCode, arguments));
   }
 
   /**
@@ -793,8 +803,6 @@
                     "${executableElementTypes[0]}, ${executableElementTypes[1]}";
                 _reportError(
                     classElt,
-                    classElt.nameOffset,
-                    classElt.nameLength,
                     StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
                     [key, firstTwoFuntionTypesStr]);
               }
@@ -823,8 +831,6 @@
         } else {
           _reportError(
               classElt,
-              classElt.nameOffset,
-              classElt.nameLength,
               StaticWarningCode
                   .INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
               [key]);
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 0301ed0..3860533 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1129,6 +1129,7 @@
    * Return `true` if access to field formal parameters should be allowed in a
    * constructor's initializer list.
    */
+  @deprecated
   bool get enableInitializingFormalAccess;
 
   /**
@@ -1259,6 +1260,11 @@
   List<int> encodeCrossContextOptions();
 
   /**
+   * Reset the state of this set of analysis options to its original state.
+   */
+  void resetToDefaults();
+
+  /**
    * Set the values of the cross-context options to match those in the given set
    * of [options].
    */
@@ -1330,9 +1336,6 @@
   bool enableAssertMessage = false;
 
   @override
-  bool enableInitializingFormalAccess = false;
-
-  @override
   bool enableLazyAssignmentOperators = false;
 
   @override
@@ -1453,7 +1456,6 @@
     enableAssertInitializer = options.enableAssertInitializer;
     enableAssertMessage = options.enableAssertMessage;
     enableStrictCallChecks = options.enableStrictCallChecks;
-    enableInitializingFormalAccess = options.enableInitializingFormalAccess;
     enableLazyAssignmentOperators = options.enableLazyAssignmentOperators;
     enableSuperMixins = options.enableSuperMixins;
     enableTiming = options.enableTiming;
@@ -1533,6 +1535,13 @@
   @deprecated
   void set enableGenericMethods(bool enable) {}
 
+  @deprecated
+  @override
+  bool get enableInitializingFormalAccess => true;
+
+  @deprecated
+  void set enableInitializingFormalAccess(bool enable) {}
+
   @override
   List<ErrorProcessor> get errorProcessors =>
       _errorProcessors ??= const <ErrorProcessor>[];
@@ -1579,6 +1588,38 @@
   }
 
   @override
+  void resetToDefaults() {
+    dart2jsHint = false;
+    disableCacheFlushing = false;
+    enableAssertInitializer = false;
+    enableAssertMessage = false;
+    enableLazyAssignmentOperators = false;
+    enableStrictCallChecks = false;
+    enableSuperMixins = false;
+    enableTiming = false;
+    enableUriInPartOf = false;
+    _errorProcessors = null;
+    _excludePatterns = null;
+    finerGrainedInvalidation = false;
+    generateImplicitErrors = true;
+    generateSdkErrors = false;
+    hint = true;
+    implicitCasts = true;
+    implicitDynamic = true;
+    incremental = false;
+    incrementalApi = false;
+    incrementalValidation = false;
+    lint = false;
+    _lintRules = null;
+    nonnullableTypes = NONNULLABLE_TYPES;
+    patchPlatform = 0;
+    preserveComments = true;
+    strongMode = false;
+    strongModeHints = false;
+    trackCacheDependencies = true;
+  }
+
+  @override
   void setCrossContextOptionsFrom(AnalysisOptions options) {
     enableAssertMessage = options.enableAssertMessage;
     enableLazyAssignmentOperators = options.enableLazyAssignmentOperators;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index b345876..df3ad03 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -7169,12 +7169,6 @@
   LabelScope labelScope;
 
   /**
-   * A flag indicating whether to enable support for allowing access to field
-   * formal parameters in a constructor's initializer list.
-   */
-  bool enableInitializingFormalAccess = false;
-
-  /**
    * The class containing the AST nodes being visited,
    * or `null` if we are not in the scope of a class.
    */
@@ -7205,8 +7199,6 @@
     } else {
       this.nameScope = nameScope;
     }
-    enableInitializingFormalAccess =
-        definingLibrary.context.analysisOptions.enableInitializingFormalAccess;
   }
 
   /**
@@ -7368,7 +7360,7 @@
       node.parameters?.accept(this);
       Scope functionScope = nameScope;
       try {
-        if (constructorElement != null && enableInitializingFormalAccess) {
+        if (constructorElement != null) {
           nameScope =
               new ConstructorInitializerScope(nameScope, constructorElement);
         }
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index d3df9c0..de75fea 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -765,7 +765,13 @@
    * keep it and discard the second.  Otherwise, keep the second and discard the
    * first.
    */
-  ifNull
+  ifNull,
+
+  /**
+   * Pop the top value from the stack.  Treat it as a Future and await its
+   * completion.  Then push the awaited value onto the stack.
+   */
+  await
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 53102b1..9c07aff 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -2341,6 +2341,12 @@
    * first.
    */
   ifNull,
+
+  /**
+   * Pop the top value from the stack.  Treat it as a Future and await its
+   * completion.  Then push the awaited value onto the stack.
+   */
+  await,
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 7bfbed1..ec0806e 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -2228,6 +2228,9 @@
         case UnlinkedExprOperation.assignToIndex:
           _doAssignToIndex();
           break;
+        case UnlinkedExprOperation.await:
+          _doAwait();
+          break;
         case UnlinkedExprOperation.extractIndex:
           _doExtractIndex();
           break;
@@ -2363,6 +2366,13 @@
     }
   }
 
+  void _doAwait() {
+    DartType type = stack.removeLast();
+    DartType typeArgument = type?.flattenFutures(linker.typeSystem);
+    typeArgument = _dynamicIfNull(typeArgument);
+    stack.add(typeArgument);
+  }
+
   void _doConditional() {
     DartType elseType = stack.removeLast();
     DartType thenType = stack.removeLast();
@@ -3413,10 +3423,10 @@
       _linkedLibrary.importDependencies.map(_getDependency).toList();
 
   @override
-  bool get isDartAsync => _absoluteUri == 'dart:async';
+  bool get isDartAsync => _absoluteUri.toString() == 'dart:async';
 
   @override
-  bool get isDartCore => _absoluteUri == 'dart:core';
+  bool get isDartCore => _absoluteUri.toString() == 'dart:core';
 
   /**
    * If this library is part of the build unit being linked, return the library
@@ -3529,7 +3539,7 @@
    * Get the inheritance manager for this library (creating it if necessary).
    */
   InheritanceManager get inheritanceManager =>
-      _inheritanceManager ??= new InheritanceManager(this);
+      _inheritanceManager ??= new InheritanceManager(this, ignoreErrors: true);
 
   @override
   LibraryCycleForLink get libraryCycleForLink {
@@ -3551,9 +3561,15 @@
       }
     }
     int result = _linkedLibrary.dependencies.length;
+    Uri libraryUri = library._absoluteUri;
+    List<String> partsRelativeToDependency =
+        library.definingUnlinkedUnit.publicNamespace.parts;
+    List<String> partsRelativeToLibraryBeingLinked = partsRelativeToDependency
+        .map((partUri) =>
+            resolveRelativeUri(libraryUri, Uri.parse(partUri)).toString())
+        .toList();
     _linkedLibrary.dependencies.add(new LinkedDependencyBuilder(
-        parts: library.definingUnlinkedUnit.publicNamespace.parts,
-        uri: library._absoluteUri.toString()));
+        parts: partsRelativeToLibraryBeingLinked, uri: libraryUri.toString()));
     _dependencies.add(library);
     return result;
   }
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index f8f2060..bee1e9e 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -500,6 +500,10 @@
         case UnlinkedExprOperation.ifNull:
           _pushBinary(TokenType.QUESTION_QUESTION);
           break;
+        case UnlinkedExprOperation.await:
+          Expression expression = _pop();
+          _push(AstTestFactory.awaitExpression(expression));
+          break;
         case UnlinkedExprOperation.assignToRef:
         case UnlinkedExprOperation.assignToProperty:
         case UnlinkedExprOperation.assignToIndex:
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index f7e6911..5a8702a 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -66,7 +66,7 @@
   bool isValidConst = true;
 
   /**
-   * See [UnlinkedExprBuilder.nmae].
+   * See [UnlinkedExprBuilder.name].
    */
   String name = null;
 
@@ -380,6 +380,10 @@
       isValidConst = false;
       _serialize(expr.expression);
       operations.add(UnlinkedExprOperation.throwException);
+    } else if (expr is AwaitExpression) {
+      isValidConst = false;
+      _serialize(expr.expression);
+      operations.add(UnlinkedExprOperation.await);
     } else {
       throw new StateError('Unknown expression type: $expr');
     }
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 5dfe1dc..4cf2afe 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -635,8 +635,6 @@
     if (boolValue != null) {
       if (feature == AnalyzerOptions.enableAssertInitializer) {
         options.enableAssertInitializer = boolValue;
-      } else if (feature == AnalyzerOptions.enableInitializingFormalAccess) {
-        options.enableInitializingFormalAccess = boolValue;
       } else if (feature == AnalyzerOptions.enableSuperMixins) {
         options.enableSuperMixins = boolValue;
       }
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index 8bcd6bc..93b3108 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -28,10 +28,80 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(AnalysisOptionsImplTest);
     defineReflectiveTests(SourcesChangedEventTest);
   });
 }
 
+@reflectiveTest
+class AnalysisOptionsImplTest {
+  test_resetToDefaults() {
+    // Note that this only tests options visible from the interface.
+    AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
+    AnalysisOptionsImpl modifiedOptions = new AnalysisOptionsImpl();
+    modifiedOptions.dart2jsHint = true;
+    modifiedOptions.disableCacheFlushing = true;
+    modifiedOptions.enableAssertInitializer = true;
+    modifiedOptions.enableAssertMessage = true;
+    modifiedOptions.enableLazyAssignmentOperators = true;
+    modifiedOptions.enableStrictCallChecks = true;
+    modifiedOptions.enableSuperMixins = true;
+    modifiedOptions.enableTiming = true;
+    modifiedOptions.enableUriInPartOf = true;
+    modifiedOptions.errorProcessors = [null];
+    modifiedOptions.excludePatterns = ['a'];
+    modifiedOptions.finerGrainedInvalidation = true;
+    modifiedOptions.generateImplicitErrors = false;
+    modifiedOptions.generateSdkErrors = true;
+    modifiedOptions.hint = false;
+    modifiedOptions.incremental = true;
+    modifiedOptions.incrementalApi = true;
+    modifiedOptions.incrementalValidation = true;
+    modifiedOptions.lint = true;
+    modifiedOptions.lintRules = [null];
+    modifiedOptions.patchPlatform = 3;
+    modifiedOptions.preserveComments = false;
+    modifiedOptions.strongMode = true;
+    modifiedOptions.trackCacheDependencies = false;
+
+    modifiedOptions.resetToDefaults();
+
+    expect(modifiedOptions.dart2jsHint, defaultOptions.dart2jsHint);
+    expect(modifiedOptions.disableCacheFlushing,
+        defaultOptions.disableCacheFlushing);
+    expect(modifiedOptions.enableAssertInitializer,
+        defaultOptions.enableAssertInitializer);
+    expect(modifiedOptions.enableAssertMessage,
+        defaultOptions.enableAssertMessage);
+    expect(modifiedOptions.enableLazyAssignmentOperators,
+        defaultOptions.enableLazyAssignmentOperators);
+    expect(modifiedOptions.enableStrictCallChecks,
+        defaultOptions.enableStrictCallChecks);
+    expect(modifiedOptions.enableSuperMixins, defaultOptions.enableSuperMixins);
+    expect(modifiedOptions.enableTiming, defaultOptions.enableTiming);
+    expect(modifiedOptions.enableUriInPartOf, defaultOptions.enableUriInPartOf);
+    expect(modifiedOptions.errorProcessors, defaultOptions.errorProcessors);
+    expect(modifiedOptions.excludePatterns, defaultOptions.excludePatterns);
+    expect(modifiedOptions.finerGrainedInvalidation,
+        defaultOptions.finerGrainedInvalidation);
+    expect(modifiedOptions.generateImplicitErrors,
+        defaultOptions.generateImplicitErrors);
+    expect(modifiedOptions.generateSdkErrors, defaultOptions.generateSdkErrors);
+    expect(modifiedOptions.hint, defaultOptions.hint);
+    expect(modifiedOptions.incremental, defaultOptions.incremental);
+    expect(modifiedOptions.incrementalApi, defaultOptions.incrementalApi);
+    expect(modifiedOptions.incrementalValidation,
+        defaultOptions.incrementalValidation);
+    expect(modifiedOptions.lint, defaultOptions.lint);
+    expect(modifiedOptions.lintRules, defaultOptions.lintRules);
+    expect(modifiedOptions.patchPlatform, defaultOptions.patchPlatform);
+    expect(modifiedOptions.preserveComments, defaultOptions.preserveComments);
+    expect(modifiedOptions.strongMode, defaultOptions.strongMode);
+    expect(modifiedOptions.trackCacheDependencies,
+        defaultOptions.trackCacheDependencies);
+  }
+}
+
 /**
  * A listener used to gather the [ImplicitAnalysisEvent]s that are produced
  * during analysis.
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 8a3059b..4df27be 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -656,9 +656,6 @@
   }
 
   void test_fieldFormalParameter() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.enableInitializingFormalAccess = true;
-    resetWithOptions(options);
     Source source = addSource(r'''
 class A {
   int x;
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index 3e1e940..eb6704c 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -35,7 +35,6 @@
       '-Dfoo=1',
       '-Dbar=2',
       '--enable-strict-call-checks',
-      '--initializing-formal-access',
       '--no-implicit-casts',
       '--no-implicit-dynamic',
       '--options=$defaultAnalysisOptionsFilePath',
@@ -58,7 +57,6 @@
     expect(options.defaultPackagesDirectoryPath, defaultPackagesDirectoryPath);
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
-    expect(defaultOptions.enableInitializingFormalAccess, true);
     expect(defaultOptions.enableStrictCallChecks, true);
     expect(defaultOptions.strongMode, true);
     expect(defaultOptions.implicitCasts, false);
@@ -81,7 +79,6 @@
     expect(options.defaultPackagesDirectoryPath, isNull);
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
-    expect(defaultOptions.enableInitializingFormalAccess, false);
     expect(defaultOptions.enableStrictCallChecks, false);
     expect(defaultOptions.strongMode, false);
     expect(defaultOptions.implicitCasts, true);
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index d090dbb..51fb995 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -814,6 +814,18 @@
     assertThat(element)..isReferencedAt('p: 1', true);
   }
 
+  test_isReferencedBy_synthetic_leastUpperBound() async {
+    await _indexTestUnit('''
+int f1({int p}) => 1;
+int f2({int p}) => 2;
+main(bool b) {
+  var f = b ? f1 : f2;
+  f(p: 0);
+}''');
+    // We should not crash because of reference to "p" - a named parameter
+    // of a synthetic LUB FunctionElement created for "f".
+  }
+
   test_isReferencedBy_TopLevelVariableElement() async {
     provider.newFile(
         _p('$testProject/lib.dart'),
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 8872ebd..e473ffc 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -38,6 +38,7 @@
         result.isResolved == this.isResolved &&
         result.isQualified == this.isQualified &&
         result.offset == this.offset &&
+        result.length == this.length &&
         result.enclosingElement == this.enclosingElement;
   }
 
@@ -510,6 +511,34 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_PrefixElement() async {
+    String partCode = r'''
+part of my_lib;
+ppp.Future c;
+''';
+    provider.newFile(_p('$testProject/my_part.dart'), partCode);
+    await _resolveTestUnit('''
+library my_lib;
+import 'dart:async' as ppp;
+part 'my_part.dart';
+main() {
+  ppp.Future a;
+  ppp.Stream b;
+}
+''');
+    PrefixElement element = _findElementAtString('ppp;');
+    Element a = _findElement('a');
+    Element b = _findElement('b');
+    Element c = findChildElement(testLibraryElement, 'c');
+    var expected = [
+      _expectId(a, SearchResultKind.REFERENCE, 'ppp.Future'),
+      _expectId(b, SearchResultKind.REFERENCE, 'ppp.Stream'),
+      new ExpectedResult(c, SearchResultKind.REFERENCE,
+          partCode.indexOf('ppp.Future c'), 'ppp'.length)
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_PropertyAccessorElement_getter() async {
     await _resolveTestUnit('''
 class A {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 48293c1..ddff695 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -3617,6 +3617,32 @@
         ' abstract class D { void set f(int g(String s)); }');
   }
 
+  void test_inferredType_definedInSdkLibraryPart() {
+    addSource(
+        '/a.dart',
+        r'''
+import 'dart:async';
+class A {
+  m(Stream p) {}
+}
+''');
+    LibraryElement library = checkLibrary(r'''
+import 'a.dart';
+class B extends A {
+  m(p) {}
+}
+  ''');
+    ClassElement b = library.definingCompilationUnit.types[0];
+    ParameterElement p = b.methods[0].parameters[0];
+    // This test should verify that we correctly record inferred types,
+    // when the type is defined in a part of an SDK library. So, test that
+    // the type is actually in a part.
+    Element streamElement = p.type.element;
+    if (streamElement is ClassElement) {
+      expect(streamElement.source, isNot(streamElement.library.source));
+    }
+  }
+
   void test_inferredType_usesSyntheticFunctionType_functionTypedParam() {
     checkLibrary('''
 int f(int x(String y)) => null;
@@ -3625,10 +3651,53 @@
 ''');
   }
 
+  test_inheritance_errors() {
+    checkLibrary('''
+abstract class A {
+  int m();
+}
+
+abstract class B {
+  String m();
+}
+
+abstract class C implements A, B {}
+
+abstract class D extends C {
+  var f;
+}
+''');
+  }
+
   test_initializer_executable_with_return_type_from_closure() {
     checkLibrary('var v = () => 0;');
   }
 
+  test_initializer_executable_with_return_type_from_closure_await_dynamic() {
+    checkLibrary('var v = (f) async => await f;');
+  }
+
+  test_initializer_executable_with_return_type_from_closure_await_future3_int() {
+    checkLibrary(r'''
+import 'dart:async';
+var v = (Future<Future<Future<int>>> f) async => await f;
+''');
+  }
+
+  test_initializer_executable_with_return_type_from_closure_await_future_int() {
+    checkLibrary(r'''
+import 'dart:async';
+var v = (Future<int> f) async => await f;
+''');
+  }
+
+  test_initializer_executable_with_return_type_from_closure_await_future_noArg() {
+    checkLibrary(r'''
+import 'dart:async';
+var v = (Future f) async => await f;
+''');
+  }
+
   test_initializer_executable_with_return_type_from_closure_field() {
     checkLibrary('''
 class C {
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 16f3f3c..fd93301 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -1843,6 +1843,26 @@
         operators: [UnlinkedExprOperation.pushParameter], strings: ['T']);
   }
 
+  test_constExpr_functionExpression() {
+    if (skipNonConstInitializers) {
+      return;
+    }
+    UnlinkedVariable variable = serializeVariableText('''
+import 'dart:async';
+const v = (f) async => await f;
+''');
+    _assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+        isValidConst: false,
+        operators: [
+          UnlinkedExprOperation.pushParameter,
+          UnlinkedExprOperation.await
+        ],
+        strings: [
+          'f'
+        ],
+        ints: []);
+  }
+
   test_constExpr_functionExpression_asArgument() {
     // Even though function expressions are not allowed in constant
     // declarations, they might occur due to erroneous code, so make sure they
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 386a95d..16ec22d 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -280,10 +280,6 @@
     if (options.disableHints != _previousOptions.disableHints) {
       return false;
     }
-    if (options.enableInitializingFormalAccess !=
-        _previousOptions.enableInitializingFormalAccess) {
-      return false;
-    }
     if (options.enableStrictCallChecks !=
         _previousOptions.enableStrictCallChecks) {
       return false;
@@ -671,8 +667,6 @@
     contextOptions.trackCacheDependencies = false;
     contextOptions.disableCacheFlushing = options.disableCacheFlushing;
     contextOptions.hint = !options.disableHints;
-    contextOptions.enableInitializingFormalAccess =
-        options.enableInitializingFormalAccess;
     contextOptions.enableStrictCallChecks = options.enableStrictCallChecks;
     contextOptions.enableSuperMixins = options.enableSuperMixins;
     contextOptions.generateImplicitErrors = options.showPackageWarnings;
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index be7dbae..abb3623 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -85,10 +85,6 @@
   /// Whether to display version information
   final bool displayVersion;
 
-  /// A flag indicating whether access to field formal parameters should be
-  /// allowed in a constructor's initializer list.
-  final bool enableInitializingFormalAccess;
-
   /// Whether to enable null-aware operators (DEP 9).
   final bool enableNullAwareOperators;
 
@@ -179,7 +175,6 @@
         disableCacheFlushing = args['disable-cache-flushing'],
         disableHints = args['no-hints'],
         displayVersion = args['version'],
-        enableInitializingFormalAccess = args['initializing-formal-access'],
         enableNullAwareOperators = args['enable-null-aware-operators'],
         enableStrictCallChecks = args['enable-strict-call-checks'],
         enableSuperMixins = args['supermixin'],
diff --git a/pkg/compiler/lib/src/common/backend_api.dart b/pkg/compiler/lib/src/common/backend_api.dart
index 2bb7001..089058c 100644
--- a/pkg/compiler/lib/src/common/backend_api.dart
+++ b/pkg/compiler/lib/src/common/backend_api.dart
@@ -82,7 +82,8 @@
 
   void initializeHelperClasses() {}
 
-  void enqueueHelpers(ResolutionEnqueuer world);
+  /// Compute the [WorldImpact] for backend helper methods.
+  WorldImpact computeHelpersImpact();
 
   /// Creates an [Enqueuer] for code generation specific to this backend.
   Enqueuer createCodegenEnqueuer(CompilerTask task, Compiler compiler);
@@ -116,21 +117,27 @@
 
   /// Enable deferred loading. Returns `true` if the backend supports deferred
   /// loading.
-  bool enableDeferredLoadingIfSupported(
-      ResolutionEnqueuer enqueuer, Spannable node);
+  bool enableDeferredLoadingIfSupported(Spannable node);
+
+  /// Returns the [WorldImpact] of enabling deferred loading.
+  WorldImpact computeDeferredLoadingImpact() => const WorldImpact();
 
   /// Called during codegen when [constant] has been used.
   void computeImpactForCompileTimeConstant(ConstantValue constant,
       WorldImpactBuilder impactBuilder, bool isForResolution) {}
 
-  /// Called to notify to the backend that a class is being instantiated.
-  // TODO(johnniwinther): Remove this. It's only called once for each [cls] and
-  // only with [Compiler.globalDependencies] as [registry].
-  void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {}
+  /// Called to notify to the backend that a class is being instantiated. Any
+  /// backend specific [WorldImpact] of this is returned.
+  WorldImpact registerInstantiatedClass(ClassElement cls,
+          {bool forResolution}) =>
+      const WorldImpact();
 
   /// Called to notify to the backend that a class is implemented by an
-  /// instantiated class.
-  void registerImplementedClass(ClassElement cls, Enqueuer enqueuer) {}
+  /// instantiated class. Any backend specific [WorldImpact] of this is
+  /// returned.
+  WorldImpact registerImplementedClass(ClassElement cls,
+          {bool forResolution}) =>
+      const WorldImpact();
 
   /// Called to instruct to the backend register [type] as instantiated on
   /// [enqueuer].
@@ -141,40 +148,47 @@
   void registerTypeVariableBoundsSubtypeCheck(
       DartType typeArgument, DartType bound) {}
 
-  /**
-   * Call this to register that an instantiated generic class has a call
-   * method.
-   */
-  void registerCallMethodWithFreeTypeVariables(
-      Element callMethod, Enqueuer enqueuer) {}
+  /// Called to register that an instantiated generic class has a call method.
+  /// Any backend specific [WorldImpact] of this is returned.
+  ///
+  /// Note: The [callMethod] is registered even thought it doesn't reference
+  /// the type variables.
+  WorldImpact registerCallMethodWithFreeTypeVariables(Element callMethod,
+          {bool forResolution}) =>
+      const WorldImpact();
 
   /// Called to instruct the backend to register that a closure exists for a
-  /// function on an instantiated generic class.
-  void registerClosureWithFreeTypeVariables(
-      Element closure, Enqueuer enqueuer) {}
+  /// function on an instantiated generic class. Any backend specific
+  /// [WorldImpact] of this is returned.
+  WorldImpact registerClosureWithFreeTypeVariables(Element closure,
+          {bool forResolution}) =>
+      const WorldImpact();
 
-  /// Call this to register that a member has been closurized.
-  void registerBoundClosure(Enqueuer enqueuer) {}
+  /// Called to register that a member has been closurized. Any backend specific
+  /// [WorldImpact] of this is returned.
+  WorldImpact registerBoundClosure() => const WorldImpact();
 
-  /// Call this to register that a static function has been closurized.
-  void registerGetOfStaticFunction(Enqueuer enqueuer) {}
+  /// Called to register that a static function has been closurized. Any backend
+  /// specific [WorldImpact] of this is returned.
+  WorldImpact registerGetOfStaticFunction() => const WorldImpact();
 
-  /**
-   * Call this to register that the [:runtimeType:] property has been accessed.
-   */
-  void registerRuntimeType(Enqueuer enqueuer) {}
+  /// Called to register that the `runtimeType` property has been accessed. Any
+  /// backend specific [WorldImpact] of this is returned.
+  WorldImpact registerRuntimeType() => const WorldImpact();
 
-  /// Call this to register a `noSuchMethod` implementation.
+  /// Called to register a `noSuchMethod` implementation.
   void registerNoSuchMethod(FunctionElement noSuchMethodElement) {}
 
-  /// Call this method to enable support for `noSuchMethod`.
-  void enableNoSuchMethod(Enqueuer enqueuer) {}
+  /// Called to enable support for `noSuchMethod`. Any backend specific
+  /// [WorldImpact] of this is returned.
+  WorldImpact enableNoSuchMethod() => const WorldImpact();
 
   /// Returns whether or not `noSuchMethod` support has been enabled.
   bool get enabledNoSuchMethod => false;
 
-  /// Call this method to enable support for isolates.
-  void enableIsolateSupport(Enqueuer enqueuer) {}
+  /// Called to enable support for isolates. Any backend specific [WorldImpact]
+  /// of this is returned.
+  WorldImpact enableIsolateSupport({bool forResolution});
 
   void registerConstSymbol(String name) {}
 
@@ -206,7 +220,10 @@
     return false;
   }
 
-  void registerStaticUse(Enqueuer enqueuer, Element element) {}
+  /// Called to register that [element] is statically known to be used. Any
+  /// backend specific [WorldImpact] of this is returned.
+  WorldImpact registerStaticUse(Element element, {bool forResolution}) =>
+      const WorldImpact();
 
   /// This method is called immediately after the [LibraryElement] [library] has
   /// been created.
@@ -314,7 +331,9 @@
   void forgetElement(Element element) {}
 
   /// Computes the [WorldImpact] of calling [mainMethod] as the entry point.
-  WorldImpact computeMainImpact(Enqueuer enqueuer, MethodElement mainMethod) {}
+  WorldImpact computeMainImpact(MethodElement mainMethod,
+          {bool forResolution}) =>
+      const WorldImpact();
 
   /// Returns the location of the patch-file associated with [libraryName]
   /// resolved from [plaformConfigUri].
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index 285e032..748f222 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -5,7 +5,7 @@
 library dart2js.common.codegen;
 
 import '../common.dart';
-import '../compiler.dart' show Compiler;
+import '../common/backend_api.dart' show Backend;
 import '../constants/values.dart' show ConstantValue;
 import '../dart_types.dart' show DartType, InterfaceType;
 import '../elements/elements.dart'
@@ -146,19 +146,22 @@
 // TODO(johnniwinther): Split this class into interface and implementation.
 // TODO(johnniwinther): Move this implementation to the JS backend.
 class CodegenRegistry {
-  final Compiler compiler;
   final Element currentElement;
   final _CodegenImpact worldImpact;
 
-  CodegenRegistry(Compiler compiler, AstElement currentElement)
-      : this.compiler = compiler,
-        this.currentElement = currentElement,
+  CodegenRegistry(AstElement currentElement)
+      : this.currentElement = currentElement,
         this.worldImpact = new _CodegenImpact();
 
   bool get isForResolution => false;
 
   String toString() => 'CodegenRegistry for $currentElement';
 
+  /// Add the uses in [impact] to the impact of this registry.
+  void addImpact(WorldImpact impact) {
+    worldImpact.addImpact(impact);
+  }
+
   @deprecated
   void registerInstantiatedClass(ClassElement element) {
     registerInstantiation(element.rawType);
@@ -218,8 +221,9 @@
 class CodegenWorkItem extends WorkItem {
   CodegenRegistry registry;
   final ResolvedAst resolvedAst;
+  final Backend backend;
 
-  factory CodegenWorkItem(Compiler compiler, AstElement element) {
+  factory CodegenWorkItem(Backend backend, AstElement element) {
     // If this assertion fails, the resolution callbacks of the backend may be
     // missing call of form registry.registerXXX. Alternatively, the code
     // generation could spuriously be adding dependencies on things we know we
@@ -227,18 +231,16 @@
     assert(invariant(element, element.hasResolvedAst,
         message: "$element has no resolved ast."));
     ResolvedAst resolvedAst = element.resolvedAst;
-    return new CodegenWorkItem.internal(resolvedAst);
+    return new CodegenWorkItem.internal(resolvedAst, backend);
   }
 
-  CodegenWorkItem.internal(ResolvedAst resolvedAst)
+  CodegenWorkItem.internal(ResolvedAst resolvedAst, this.backend)
       : this.resolvedAst = resolvedAst,
         super(resolvedAst.element);
 
-  WorldImpact run(Compiler compiler, Enqueuer world) {
-    if (world.isProcessed(element)) return const WorldImpact();
-
-    registry = new CodegenRegistry(compiler, element);
-    return compiler.codegen(this, world);
+  WorldImpact run() {
+    registry = new CodegenRegistry(element);
+    return backend.codegen(this);
   }
 
   String toString() => 'CodegenWorkItem(${resolvedAst.element})';
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 9012c82..2adfe26 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -41,18 +41,24 @@
 import 'work.dart' show WorkItem;
 
 /// [WorkItem] used exclusively by the [ResolutionEnqueuer].
-class ResolutionWorkItem extends WorkItem {
+abstract class ResolutionWorkItem implements WorkItem {
+  factory ResolutionWorkItem(Resolution resolution, AstElement element) =
+      _ResolutionWorkItem;
+}
+
+class _ResolutionWorkItem extends WorkItem implements ResolutionWorkItem {
   bool _isAnalyzed = false;
+  final Resolution resolution;
 
-  ResolutionWorkItem(AstElement element) : super(element);
+  _ResolutionWorkItem(this.resolution, AstElement element) : super(element);
 
-  WorldImpact run(Compiler compiler, ResolutionEnqueuer world) {
-    WorldImpact impact = compiler.analyze(this, world);
+  WorldImpact run() {
+    assert(invariant(element, !_isAnalyzed,
+        message: 'Element ${element} has already been analyzed'));
+    WorldImpact impact = resolution.computeWorldImpact(element);
     _isAnalyzed = true;
     return impact;
   }
-
-  bool get isAnalyzed => _isAnalyzed;
 }
 
 class ResolutionImpact extends WorldImpact {
@@ -210,11 +216,8 @@
 
 /// A container of commonly used dependencies for tasks that involve parsing.
 abstract class ParsingContext {
-  factory ParsingContext(
-      DiagnosticReporter reporter,
-      ParserTask parser,
-      PatchParserTask patchParser,
-      Backend backend) = _ParsingContext;
+  factory ParsingContext(DiagnosticReporter reporter, ParserTask parser,
+      PatchParserTask patchParser, Backend backend) = _ParsingContext;
 
   DiagnosticReporter get reporter;
   ParserTask get parser;
@@ -238,8 +241,7 @@
   final PatchParserTask patchParser;
   final Backend backend;
 
-  _ParsingContext(this.reporter, this.parser,
-      this.patchParser, this.backend);
+  _ParsingContext(this.reporter, this.parser, this.patchParser, this.backend);
 
   @override
   measure(f()) => parser.measure(f);
diff --git a/pkg/compiler/lib/src/common/work.dart b/pkg/compiler/lib/src/common/work.dart
index c44c4251..c36a2a5 100644
--- a/pkg/compiler/lib/src/common/work.dart
+++ b/pkg/compiler/lib/src/common/work.dart
@@ -18,5 +18,5 @@
     assert(invariant(element, element.isDeclaration));
   }
 
-  WorldImpact run(Compiler compiler, Enqueuer world);
+  WorldImpact run();
 }
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 7b4d9ce..db282a3 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -35,8 +35,7 @@
 import 'dump_info.dart' show DumpInfoTask;
 import 'elements/elements.dart';
 import 'elements/modelx.dart' show ErroneousElementX;
-import 'enqueue.dart'
-    show Enqueuer, EnqueueTask, ResolutionEnqueuer, QueueFilter;
+import 'enqueue.dart' show Enqueuer, EnqueueTask, ResolutionEnqueuer;
 import 'environment.dart';
 import 'id_generator.dart';
 import 'io/source_information.dart' show SourceInformation;
@@ -56,9 +55,7 @@
 import 'parser/diet_parser_task.dart' show DietParserTask;
 import 'parser/parser_task.dart' show ParserTask;
 import 'patch_parser.dart' show PatchParserTask;
-import 'resolution/registry.dart' show ResolutionRegistry;
 import 'resolution/resolution.dart' show ResolverTask;
-import 'resolution/tree_elements.dart' show TreeElementMapping;
 import 'resolved_uri_translator.dart';
 import 'scanner/scanner_task.dart' show ScannerTask;
 import 'script.dart' show Script;
@@ -70,11 +67,10 @@
 import 'tree/tree.dart' show Node, TypeAnnotation;
 import 'typechecker.dart' show TypeCheckerTask;
 import 'types/types.dart' show GlobalTypeInferenceTask;
-import 'types/masks.dart' show CommonMasks;
 import 'universe/selector.dart' show Selector;
 import 'universe/world_builder.dart'
     show ResolutionWorldBuilder, CodegenWorldBuilder;
-import 'universe/use.dart' show StaticUse;
+import 'universe/use.dart' show StaticUse, TypeUse;
 import 'universe/world_impact.dart'
     show
         ImpactStrategy,
@@ -97,7 +93,7 @@
   Types types;
   _CompilerCoreTypes _coreTypes;
   CompilerDiagnosticReporter _reporter;
-  _CompilerResolution _resolution;
+  CompilerResolution _resolution;
   ParsingContext _parsingContext;
 
   final CacheStrategy cacheStrategy;
@@ -184,9 +180,6 @@
   MirrorUsageAnalyzerTask mirrorUsageAnalyzerTask;
   DumpInfoTask dumpInfoTask;
 
-  /// A customizable filter that is applied to enqueued work items.
-  QueueFilter enqueuerFilter = new QueueFilter();
-
   bool get hasFunctionApplySupport => resolverWorld.hasFunctionApplySupport;
   bool get hasIsolateSupport => resolverWorld.hasIsolateSupport;
 
@@ -222,7 +215,7 @@
     } else {
       _reporter = new CompilerDiagnosticReporter(this, options);
     }
-    _resolution = new _CompilerResolution(this);
+    _resolution = createResolution();
     // TODO(johnniwinther): Initialize core types in [initializeCoreClasses] and
     // make its field final.
     _coreTypes = new _CompilerCoreTypes(_resolution, reporter);
@@ -240,13 +233,7 @@
     if (makeBackend != null) {
       backend = makeBackend(this);
     } else {
-      js_backend.JavaScriptBackend jsBackend = new js_backend.JavaScriptBackend(
-          this,
-          generateSourceMap: options.generateSourceMap,
-          useStartupEmitter: options.useStartupEmitter,
-          useNewSourceInfo: options.useNewSourceInfo,
-          useKernel: options.useKernel);
-      backend = jsBackend;
+      backend = createBackend();
     }
     enqueuer = backend.makeEnqueuer();
 
@@ -256,8 +243,7 @@
     }
 
     tasks = [
-      dietParser =
-          new DietParserTask(idGenerator, backend, reporter, measurer),
+      dietParser = new DietParserTask(idGenerator, backend, reporter, measurer),
       scanner = createScannerTask(),
       serialization = new SerializationTask(this),
       libraryLoader = new LibraryLoaderTask(
@@ -310,6 +296,17 @@
     return _world;
   }
 
+  /// Creates the backend.
+  ///
+  /// Override this to mock the backend for testing.
+  Backend createBackend() {
+    return new js_backend.JavaScriptBackend(this,
+        generateSourceMap: options.generateSourceMap,
+        useStartupEmitter: options.useStartupEmitter,
+        useNewSourceInfo: options.useNewSourceInfo,
+        useKernel: options.useKernel);
+  }
+
   /// Creates the scanner task.
   ///
   /// Override this to mock the scanner for testing.
@@ -317,6 +314,11 @@
       new ScannerTask(dietParser, reporter, measurer,
           preserveComments: options.preserveComments, commentMap: commentMap);
 
+  /// Creates the resolution object.
+  ///
+  /// Override this to mock resolution for testing.
+  Resolution createResolution() => new CompilerResolution(this);
+
   /// Creates the resolver task.
   ///
   /// Override this to mock the resolver for testing.
@@ -553,9 +555,10 @@
     });
   }
 
-  void computeMain() {
-    if (mainApp == null) return;
+  WorldImpact computeMain() {
+    if (mainApp == null) return const WorldImpact();
 
+    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
     Element main = mainApp.findExported(Identifiers.main);
     ErroneousElement errorElement = null;
     if (main == null) {
@@ -596,7 +599,7 @@
               parameter);
           mainFunction = backend.helperForMainArity();
           // Don't warn about main not being used:
-          enqueuer.resolution.registerStaticUse(new StaticUse.foreignUse(main));
+          impactBuilder.registerStaticUse(new StaticUse.foreignUse(main));
         });
       }
     }
@@ -613,6 +616,7 @@
       reporter.reportWarningMessage(errorElement, errorElement.messageKind,
           errorElement.messageArguments);
     }
+    return impactBuilder;
   }
 
   /// Analyze all members of the library in [libraryUri].
@@ -630,8 +634,8 @@
         .loadLibrary(libraryUri, skipFileWithPartOfTag: true)
         .then((LibraryElement library) {
       if (library == null) return null;
-      fullyEnqueueLibrary(library, enqueuer.resolution);
-      emptyQueue(enqueuer.resolution);
+      enqueuer.resolution.applyImpact(computeImpactForLibrary(library));
+      emptyQueue(enqueuer.resolution, onProgress: showResolutionProgress);
       enqueuer.resolution.logSummary(reporter.log);
       return library;
     });
@@ -640,7 +644,7 @@
   /// Performs the compilation when all libraries have been loaded.
   void compileLoadedLibraries() =>
       selfTask.measureSubtask("Compiler.compileLoadedLibraries", () {
-        computeMain();
+        WorldImpact mainImpact = computeMain();
 
         mirrorUsageAnalyzerTask.analyzeUsage(mainApp);
 
@@ -649,45 +653,51 @@
         // something to the resolution queue.  So we cannot wait with
         // this until after the resolution queue is processed.
         deferredLoadTask.beforeResolution(this);
-        ImpactStrategy impactStrategy = backend.createImpactStrategy(
+        impactStrategy = backend.createImpactStrategy(
             supportDeferredLoad: deferredLoadTask.isProgramSplit,
             supportDumpInfo: options.dumpInfo,
             supportSerialization: serialization.supportSerialization);
 
         phase = PHASE_RESOLVING;
+        enqueuer.resolution.applyImpact(mainImpact);
         if (options.resolveOnly) {
           libraryLoader.libraries.where((LibraryElement library) {
             return !serialization.isDeserialized(library);
           }).forEach((LibraryElement library) {
             reporter.log('Enqueuing ${library.canonicalUri}');
-            fullyEnqueueLibrary(library, enqueuer.resolution);
+            enqueuer.resolution.applyImpact(computeImpactForLibrary(library));
           });
         } else if (analyzeAll) {
           libraryLoader.libraries.forEach((LibraryElement library) {
             reporter.log('Enqueuing ${library.canonicalUri}');
-            fullyEnqueueLibrary(library, enqueuer.resolution);
+            enqueuer.resolution.applyImpact(computeImpactForLibrary(library));
           });
         } else if (options.analyzeMain) {
           if (mainApp != null) {
-            fullyEnqueueLibrary(mainApp, enqueuer.resolution);
+            enqueuer.resolution.applyImpact(computeImpactForLibrary(mainApp));
           }
           if (librariesToAnalyzeWhenRun != null) {
             for (Uri libraryUri in librariesToAnalyzeWhenRun) {
-              fullyEnqueueLibrary(
-                  libraryLoader.lookupLibrary(libraryUri), enqueuer.resolution);
+              enqueuer.resolution.applyImpact(computeImpactForLibrary(
+                  libraryLoader.lookupLibrary(libraryUri)));
             }
           }
         }
+        if (deferredLoadTask.isProgramSplit) {
+          enqueuer.resolution
+              .applyImpact(backend.computeDeferredLoadingImpact());
+        }
         // Elements required by enqueueHelpers are global dependencies
         // that are not pulled in by a particular element.
-        backend.enqueueHelpers(enqueuer.resolution);
+        enqueuer.resolution.applyImpact(backend.computeHelpersImpact());
         resolveLibraryMetadata();
         reporter.log('Resolving...');
         if (mainFunction != null && !mainFunction.isMalformed) {
           mainFunction.computeType(resolution);
         }
 
-        processQueue(enqueuer.resolution, mainFunction);
+        processQueue(enqueuer.resolution, mainFunction,
+            onProgress: showResolutionProgress);
         enqueuer.resolution.logSummary(reporter.log);
 
         _reporter.reportSuppressedMessagesSummary();
@@ -733,16 +743,19 @@
 
         reporter.log('Compiling...');
         phase = PHASE_COMPILING;
+
         backend.onCodegenStart();
         if (hasIsolateSupport) {
-          backend.enableIsolateSupport(enqueuer.codegen);
+          enqueuer.codegen
+              .applyImpact(backend.enableIsolateSupport(forResolution: false));
         }
         if (compileAll) {
           libraryLoader.libraries.forEach((LibraryElement library) {
-            fullyEnqueueLibrary(library, enqueuer.codegen);
+            enqueuer.codegen.applyImpact(computeImpactForLibrary(library));
           });
         }
-        processQueue(enqueuer.codegen, mainFunction);
+        processQueue(enqueuer.codegen, mainFunction,
+            onProgress: showCodegenProgress);
         enqueuer.codegen.logSummary(reporter.log);
 
         int programSize = backend.assembleProgram();
@@ -773,19 +786,34 @@
     closureToClassMapper.createClosureClasses();
   }
 
-  void fullyEnqueueLibrary(LibraryElement library, Enqueuer world) {
-    void enqueueAll(Element element) {
-      fullyEnqueueTopLevelElement(element, world);
+  /// Compute the [WorldImpact] for accessing all elements in [library].
+  WorldImpact computeImpactForLibrary(LibraryElement library) {
+    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
+
+    void registerStaticUse(Element element) {
+      impactBuilder.registerStaticUse(new StaticUse.directUse(element));
     }
 
-    library.implementation.forEachLocalMember(enqueueAll);
+    void registerElement(Element element) {
+      if (element.isClass) {
+        ClassElement cls = element;
+        cls.ensureResolved(resolution);
+        cls.forEachLocalMember(registerStaticUse);
+        impactBuilder.registerTypeUse(new TypeUse.instantiation(cls.rawType));
+      } else {
+        registerStaticUse(element);
+      }
+    }
+
+    library.implementation.forEachLocalMember(registerElement);
+
     library.imports.forEach((ImportElement import) {
       if (import.isDeferred) {
         // `import.prefix` and `loadLibrary` may be `null` when the deferred
         // import has compile-time errors.
         GetterElement loadLibrary = import.prefix?.loadLibrary;
         if (loadLibrary != null) {
-          world.addToWorkList(loadLibrary);
+          registerStaticUse(loadLibrary);
         }
       }
       if (serialization.supportSerialization) {
@@ -806,17 +834,7 @@
         }
       });
     }
-  }
-
-  void fullyEnqueueTopLevelElement(Element element, Enqueuer world) {
-    if (element.isClass) {
-      ClassElement cls = element;
-      cls.ensureResolved(resolution);
-      cls.forEachLocalMember(enqueuer.resolution.addToWorkList);
-      world.registerInstantiatedType(cls.rawType);
-    } else {
-      world.addToWorkList(element);
-    }
+    return impactBuilder;
   }
 
   // Resolves metadata on library elements.  This is necessary in order to
@@ -835,37 +853,39 @@
   /**
    * Empty the [enqueuer] queue.
    */
-  void emptyQueue(Enqueuer enqueuer) {
+  void emptyQueue(Enqueuer enqueuer, {void onProgress()}) {
     selfTask.measureSubtask("Compiler.emptyQueue", () {
       enqueuer.forEach((WorkItem work) {
+        if (onProgress != null) {
+          onProgress();
+        }
         reporter.withCurrentElement(
             work.element,
             () => selfTask.measureSubtask("world.applyImpact", () {
                   enqueuer.applyImpact(
-                      impactStrategy,
-                      selfTask.measureSubtask(
-                          "work.run", () => work.run(this, enqueuer)),
+                      selfTask.measureSubtask("work.run", () => work.run()),
                       impactSource: work.element);
                 }));
       });
     });
   }
 
-  void processQueue(Enqueuer enqueuer, MethodElement mainMethod) {
+  void processQueue(Enqueuer enqueuer, MethodElement mainMethod,
+      {void onProgress()}) {
     selfTask.measureSubtask("Compiler.processQueue", () {
-      enqueuer.applyImpact(
-          impactStrategy,
-          enqueuer.nativeEnqueuer
-              .processNativeClasses(libraryLoader.libraries));
+      enqueuer.open(impactStrategy);
+      enqueuer.applyImpact(enqueuer.nativeEnqueuer
+          .processNativeClasses(libraryLoader.libraries));
       if (mainMethod != null && !mainMethod.isMalformed) {
-        enqueuer.applyImpact(
-            impactStrategy, backend.computeMainImpact(enqueuer, mainMethod));
+        enqueuer.applyImpact(backend.computeMainImpact(mainMethod,
+            forResolution: enqueuer.isResolutionQueue));
       }
       if (options.verbose) {
         progress.reset();
       }
-      emptyQueue(enqueuer);
+      emptyQueue(enqueuer, onProgress: onProgress);
       enqueuer.queueIsClosed = true;
+      enqueuer.close();
       // Notify the impact strategy impacts are no longer needed for this
       // enqueuer.
       impactStrategy.onImpactUsed(enqueuer.impactUse);
@@ -914,49 +934,18 @@
     }
   }
 
-  WorldImpact analyzeElement(Element element) =>
-      selfTask.measureSubtask("Compiler.analyzeElement", () {
-        assert(invariant(
-            element,
-            element.impliesType ||
-                element.isField ||
-                element.isFunction ||
-                element.isConstructor ||
-                element.isGetter ||
-                element.isSetter,
-            message: 'Unexpected element kind: ${element.kind}'));
-        assert(invariant(element, element is AnalyzableElement,
-            message: 'Element $element is not analyzable.'));
-        assert(invariant(element, element.isDeclaration));
-        return resolution.computeWorldImpact(element);
-      });
+  void showResolutionProgress() {
+    if (shouldPrintProgress) {
+      // TODO(ahe): Add structured diagnostics to the compiler API and
+      // use it to separate this from the --verbose option.
+      assert(phase == PHASE_RESOLVING);
+      reporter.log('Resolved ${enqueuer.resolution.processedElements.length} '
+          'elements.');
+      progress.reset();
+    }
+  }
 
-  WorldImpact analyze(ResolutionWorkItem work, ResolutionEnqueuer world) =>
-      selfTask.measureSubtask("Compiler.analyze", () {
-        assert(invariant(work.element, identical(world, enqueuer.resolution)));
-        assert(invariant(work.element, !work.isAnalyzed,
-            message: 'Element ${work.element} has already been analyzed'));
-        if (shouldPrintProgress) {
-          // TODO(ahe): Add structured diagnostics to the compiler API and
-          // use it to separate this from the --verbose option.
-          if (phase == PHASE_RESOLVING) {
-            reporter
-                .log('Resolved ${enqueuer.resolution.processedElements.length} '
-                    'elements.');
-            progress.reset();
-          }
-        }
-        AstElement element = work.element;
-        if (world.hasBeenProcessed(element)) {
-          return const WorldImpact();
-        }
-        WorldImpact worldImpact = analyzeElement(element);
-        world.registerProcessedElement(element);
-        return worldImpact;
-      });
-
-  WorldImpact codegen(CodegenWorkItem work, Enqueuer world) {
-    assert(invariant(work.element, identical(world, enqueuer.codegen)));
+  void showCodegenProgress() {
     if (shouldPrintProgress) {
       // TODO(ahe): Add structured diagnostics to the compiler API and
       // use it to separate this from the --verbose option.
@@ -964,7 +953,6 @@
           'Compiled ${enqueuer.codegen.processedEntities.length} methods.');
       progress.reset();
     }
-    return backend.codegen(work);
   }
 
   void reportDiagnostic(DiagnosticMessage message,
@@ -1940,94 +1928,94 @@
 }
 
 // TODO(johnniwinther): Move [ResolverTask] here.
-class _CompilerResolution implements Resolution {
-  final Compiler compiler;
+class CompilerResolution implements Resolution {
+  final Compiler _compiler;
   final Map<Element, ResolutionImpact> _resolutionImpactCache =
       <Element, ResolutionImpact>{};
   final Map<Element, WorldImpact> _worldImpactCache = <Element, WorldImpact>{};
   bool retainCachesForTesting = false;
 
-  _CompilerResolution(this.compiler);
+  CompilerResolution(this._compiler);
 
   @override
-  DiagnosticReporter get reporter => compiler.reporter;
+  DiagnosticReporter get reporter => _compiler.reporter;
 
   @override
-  ParsingContext get parsingContext => compiler.parsingContext;
+  ParsingContext get parsingContext => _compiler.parsingContext;
 
   @override
-  CoreClasses get coreClasses => compiler.coreClasses;
+  CoreClasses get coreClasses => _compiler.coreClasses;
 
   @override
-  CoreTypes get coreTypes => compiler.coreTypes;
+  CoreTypes get coreTypes => _compiler.coreTypes;
 
   @override
-  CommonElements get commonElements => compiler.commonElements;
+  CommonElements get commonElements => _compiler.commonElements;
 
   @override
-  Types get types => compiler.types;
+  Types get types => _compiler.types;
 
   @override
-  Target get target => compiler.backend;
+  Target get target => _compiler.backend;
 
   @override
-  ResolverTask get resolver => compiler.resolver;
+  ResolverTask get resolver => _compiler.resolver;
 
   @override
-  ResolutionEnqueuer get enqueuer => compiler.enqueuer.resolution;
+  ResolutionEnqueuer get enqueuer => _compiler.enqueuer.resolution;
 
   @override
-  CompilerOptions get options => compiler.options;
+  CompilerOptions get options => _compiler.options;
 
   @override
-  IdGenerator get idGenerator => compiler.idGenerator;
+  IdGenerator get idGenerator => _compiler.idGenerator;
 
   @override
-  ConstantEnvironment get constants => compiler.constants;
+  ConstantEnvironment get constants => _compiler.constants;
 
   @override
   MirrorUsageAnalyzerTask get mirrorUsageAnalyzerTask =>
-      compiler.mirrorUsageAnalyzerTask;
+      _compiler.mirrorUsageAnalyzerTask;
 
   @override
-  LibraryElement get coreLibrary => compiler._coreTypes.coreLibrary;
+  LibraryElement get coreLibrary => _compiler._coreTypes.coreLibrary;
 
   @override
   bool get wasProxyConstantComputedTestingOnly => _proxyConstant != null;
 
   @override
   void registerClass(ClassElement cls) {
-    compiler.openWorld.registerClass(cls);
+    _compiler.openWorld.registerClass(cls);
   }
 
   @override
   void resolveClass(ClassElement cls) {
-    compiler.resolver.resolveClass(cls);
+    _compiler.resolver.resolveClass(cls);
   }
 
   @override
   void resolveTypedef(TypedefElement typdef) {
-    compiler.resolver.resolve(typdef);
+    _compiler.resolver.resolve(typdef);
   }
 
   @override
   void resolveMetadataAnnotation(MetadataAnnotation metadataAnnotation) {
-    compiler.resolver.resolveMetadataAnnotation(metadataAnnotation);
+    _compiler.resolver.resolveMetadataAnnotation(metadataAnnotation);
   }
 
   @override
   FunctionSignature resolveSignature(FunctionElement function) {
-    return compiler.resolver.resolveSignature(function);
+    return _compiler.resolver.resolveSignature(function);
   }
 
   @override
   DartType resolveTypeAnnotation(Element element, TypeAnnotation node) {
-    return compiler.resolver.resolveTypeAnnotation(element, node);
+    return _compiler.resolver.resolveTypeAnnotation(element, node);
   }
 
   @override
   void ensureResolved(Element element) {
-    if (compiler.serialization.isDeserialized(element)) {
+    if (_compiler.serialization.isDeserialized(element)) {
       return;
     }
     computeWorldImpact(element);
@@ -2035,21 +2023,21 @@
 
   @override
   void ensureClassMembers(ClassElement element) {
-    if (!compiler.serialization.isDeserialized(element)) {
-      compiler.resolver.checkClass(element);
+    if (!_compiler.serialization.isDeserialized(element)) {
+      _compiler.resolver.checkClass(element);
     }
   }
 
   @override
   void registerCompileTimeError(Element element, DiagnosticMessage message) =>
-      compiler.registerCompileTimeError(element, message);
+      _compiler.registerCompileTimeError(element, message);
 
   @override
   bool hasResolvedAst(ExecutableElement element) {
     assert(invariant(element, element.isDeclaration,
         message: "Element $element must be the declaration."));
-    if (compiler.serialization.isDeserialized(element)) {
-      return compiler.serialization.hasResolvedAst(element);
+    if (_compiler.serialization.isDeserialized(element)) {
+      return _compiler.serialization.hasResolvedAst(element);
     }
     return hasBeenResolved(element.memberContext.declaration) &&
         element.hasResolvedAst;
@@ -2061,8 +2049,8 @@
         message: "Element $element must be the declaration."));
     assert(invariant(element, hasResolvedAst(element),
         message: "ResolvedAst not available for $element."));
-    if (compiler.serialization.isDeserialized(element)) {
-      return compiler.serialization.getResolvedAst(element);
+    if (_compiler.serialization.isDeserialized(element)) {
+      return _compiler.serialization.getResolvedAst(element);
     }
     return element.resolvedAst;
   }
@@ -2077,8 +2065,8 @@
   bool hasResolutionImpact(Element element) {
     assert(invariant(element, element.isDeclaration,
         message: "Element $element must be the declaration."));
-    if (compiler.serialization.isDeserialized(element)) {
-      return compiler.serialization.hasResolutionImpact(element);
+    if (_compiler.serialization.isDeserialized(element)) {
+      return _compiler.serialization.hasResolutionImpact(element);
     }
     return _resolutionImpactCache.containsKey(element);
   }
@@ -2088,8 +2076,8 @@
     assert(invariant(element, element.isDeclaration,
         message: "Element $element must be the declaration."));
     ResolutionImpact resolutionImpact;
-    if (compiler.serialization.isDeserialized(element)) {
-      resolutionImpact = compiler.serialization.getResolutionImpact(element);
+    if (_compiler.serialization.isDeserialized(element)) {
+      resolutionImpact = _compiler.serialization.getResolutionImpact(element);
     } else {
       resolutionImpact = _resolutionImpactCache[element];
     }
@@ -2110,39 +2098,53 @@
 
   @override
   WorldImpact computeWorldImpact(Element element) {
-    assert(invariant(element, element.isDeclaration,
-        message: "Element $element must be the declaration."));
-    return _worldImpactCache.putIfAbsent(element, () {
-      assert(compiler.parser != null);
-      Node tree = compiler.parser.parse(element);
-      assert(invariant(element, !element.isSynthesized || tree == null));
-      ResolutionImpact resolutionImpact = compiler.resolver.resolve(element);
+    return _compiler.selfTask.measureSubtask("Resolution.computeWorldImpact",
+        () {
+      assert(invariant(
+          element,
+          element.impliesType ||
+              element.isField ||
+              element.isFunction ||
+              element.isConstructor ||
+              element.isGetter ||
+              element.isSetter,
+          message: 'Unexpected element kind: ${element.kind}'));
+      assert(invariant(element, element is AnalyzableElement,
+          message: 'Element $element is not analyzable.'));
+      assert(invariant(element, element.isDeclaration,
+          message: "Element $element must be the declaration."));
+      return _worldImpactCache.putIfAbsent(element, () {
+        assert(_compiler.parser != null);
+        Node tree = _compiler.parser.parse(element);
+        assert(invariant(element, !element.isSynthesized || tree == null));
+        ResolutionImpact resolutionImpact = _compiler.resolver.resolve(element);
 
-      if (compiler.serialization.supportSerialization ||
-          retainCachesForTesting) {
-        // [ResolutionImpact] is currently only used by serialization. The
-        // enqueuer uses the [WorldImpact] which is always cached.
-        // TODO(johnniwinther): Align these use cases better; maybe only
-        // cache [ResolutionImpact] and let the enqueuer transform it into
-        // a [WorldImpact].
-        _resolutionImpactCache[element] = resolutionImpact;
-      }
-      if (tree != null && !compiler.options.analyzeSignaturesOnly) {
-        // TODO(het): don't do this if suppressWarnings is on, currently we have
-        // to do it because the typechecker also sets types
-        // Only analyze nodes with a corresponding [TreeElements].
-        compiler.checker.check(element);
-      }
-      return transformResolutionImpact(element, resolutionImpact);
+        if (_compiler.serialization.supportSerialization ||
+            retainCachesForTesting) {
+          // [ResolutionImpact] is currently only used by serialization. The
+          // enqueuer uses the [WorldImpact] which is always cached.
+          // TODO(johnniwinther): Align these use cases better; maybe only
+          // cache [ResolutionImpact] and let the enqueuer transform it into
+          // a [WorldImpact].
+          _resolutionImpactCache[element] = resolutionImpact;
+        }
+        if (tree != null && !_compiler.options.analyzeSignaturesOnly) {
+          // TODO(het): don't do this if suppressWarnings is on, currently we
+          // have to do it because the typechecker also sets types
+          // Only analyze nodes with a corresponding [TreeElements].
+          _compiler.checker.check(element);
+        }
+        return transformResolutionImpact(element, resolutionImpact);
+      });
     });
   }
 
   @override
   WorldImpact transformResolutionImpact(
       Element element, ResolutionImpact resolutionImpact) {
-    WorldImpact worldImpact = compiler.backend.impactTransformer
+    WorldImpact worldImpact = _compiler.backend.impactTransformer
         .transformResolutionImpact(
-            compiler.enqueuer.resolution, resolutionImpact);
+            _compiler.enqueuer.resolution, resolutionImpact);
     _worldImpactCache[element] = worldImpact;
     return worldImpact;
   }
@@ -2152,7 +2154,7 @@
     assert(invariant(element, element.isDeclaration,
         message: "Element $element must be the declaration."));
     if (retainCachesForTesting) return;
-    if (compiler.serialization.isDeserialized(element)) return;
+    if (_compiler.serialization.isDeserialized(element)) return;
     assert(invariant(element, _worldImpactCache[element] != null,
         message: "WorldImpact not computed for $element."));
     _worldImpactCache[element] = const WorldImpact();
@@ -2175,10 +2177,10 @@
 
   @override
   ResolutionWorkItem createWorkItem(Element element) {
-    if (compiler.serialization.isDeserialized(element)) {
-      return compiler.serialization.createResolutionWorkItem(element);
+    if (_compiler.serialization.isDeserialized(element)) {
+      return _compiler.serialization.createResolutionWorkItem(element);
     } else {
-      return new ResolutionWorkItem(element);
+      return new ResolutionWorkItem(this, element);
     }
   }
 
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index b29dae6..d2c8ddb 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -843,8 +843,8 @@
       });
     }
     if (isProgramSplit) {
-      isProgramSplit = compiler.backend.enableDeferredLoadingIfSupported(
-          compiler.enqueuer.resolution, lastDeferred);
+      isProgramSplit =
+          compiler.backend.enableDeferredLoadingIfSupported(lastDeferred);
     }
   }
 
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 6c7de3f..cdd46e9 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -54,9 +54,8 @@
         this,
         compiler.options,
         compiler.resolution,
-        compiler.enqueuerFilter,
         compiler.options.analyzeOnly && compiler.options.analyzeMain
-            ? const EnqueuerStrategy()
+            ? const DirectEnqueuerStrategy()
             : const TreeShakingEnqueuerStrategy(),
         compiler.globalDependencies,
         compiler.backend,
@@ -75,16 +74,24 @@
 }
 
 abstract class Enqueuer {
-  CompilerTask get task;
   WorldBuilder get universe;
   native.NativeEnqueuer get nativeEnqueuer;
   void forgetElement(Element element, Compiler compiler);
-  void processInstantiatedClassMembers(ClassElement cls);
-  void processInstantiatedClassMember(ClassElement cls, Element member);
-  void handleUnseenSelectorInternal(DynamicUse dynamicUse);
-  void registerStaticUse(StaticUse staticUse);
-  void registerStaticUseInternal(StaticUse staticUse);
-  void registerDynamicUse(DynamicUse dynamicUse);
+
+  // TODO(johnniwinther): Initialize [_impactStrategy] to `null`.
+  ImpactStrategy _impactStrategy = const ImpactStrategy();
+
+  ImpactStrategy get impactStrategy => _impactStrategy;
+
+  void open(ImpactStrategy impactStrategy) {
+    _impactStrategy = impactStrategy;
+  }
+
+  void close() {
+    // TODO(johnniwinther): Set [_impactStrategy] to `null` and [queueIsClosed]
+    // to `true` here.
+    _impactStrategy = const ImpactStrategy();
+  }
 
   /// Returns [:true:] if this enqueuer is the resolution enqueuer.
   bool get isResolutionQueue;
@@ -95,23 +102,12 @@
 
   ImpactUseCase get impactUse;
 
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [element] must be a declaration element.
-   */
-  void addToWorkList(Element element);
-
-  void enableIsolateSupport();
-
-  void registerInstantiatedType(InterfaceType type);
   void forEach(void f(WorkItem work));
 
-  /// Apply the [worldImpact] to this enqueuer. If the [impactSource] is provided
-  /// the impact strategy will remove it from the element impact cache, if it is
-  /// no longer needed.
-  void applyImpact(ImpactStrategy impactStrategy, WorldImpact worldImpact,
-      {Element impactSource});
+  /// Apply the [worldImpact] to this enqueuer. If the [impactSource] is
+  /// provided the impact strategy will remove it from the element impact cache,
+  /// if it is no longer needed.
+  void applyImpact(WorldImpact worldImpact, {Element impactSource});
   bool checkNoEnqueuedInvokedInstanceMethods();
   void logSummary(log(message));
 
@@ -123,12 +119,23 @@
   Iterable<ClassElement> get processedClasses;
 }
 
+abstract class EnqueuerImpl extends Enqueuer {
+  CompilerTask get task;
+  void processInstantiatedClassMembers(ClassElement cls);
+  void processInstantiatedClassMember(ClassElement cls, Element member);
+  void registerStaticUse(StaticUse staticUse);
+  void registerStaticUseInternal(StaticUse staticUse);
+  void registerTypeUse(TypeUse typeUse);
+  void registerTypeUseInternal(TypeUse typeUse);
+  void registerDynamicUse(DynamicUse dynamicUse);
+  void handleUnseenSelectorInternal(DynamicUse dynamicUse);
+}
+
 /// [Enqueuer] which is specific to resolution.
-class ResolutionEnqueuer extends Enqueuer {
+class ResolutionEnqueuer extends EnqueuerImpl {
   final CompilerTask task;
   final String name;
   final Resolution resolution;
-  final QueueFilter filter;
   final CompilerOptions options;
   final Backend backend;
   final GlobalDependencyRegistry globalDependencies;
@@ -148,13 +155,10 @@
 
   WorldImpactVisitor impactVisitor;
 
-  ImpactStrategy impactStrategy;
-
   ResolutionEnqueuer(
       this.task,
       this.options,
       this.resolution,
-      this.filter,
       this.strategy,
       this.globalDependencies,
       Backend backend,
@@ -169,7 +173,7 @@
         deferredQueue = new Queue<_DeferredAction>(),
         _universe = new ResolutionWorldBuilderImpl(
             backend, commonElements, cacheStrategy, const TypeMaskStrategy()) {
-    impactVisitor = new _EnqueuerImpactVisitor(this);
+    impactVisitor = new EnqueuerImplImpactVisitor(this);
   }
 
   ResolutionWorldBuilder get universe => _universe;
@@ -194,8 +198,8 @@
     internalAddToWorkList(element);
   }
 
-  void applyImpact(ImpactStrategy impactStrategy, WorldImpact worldImpact,
-      {Element impactSource}) {
+  void applyImpact(WorldImpact worldImpact, {Element impactSource}) {
+    if (worldImpact.isEmpty) return;
     impactStrategy.visitImpact(
         impactSource, worldImpact, impactVisitor, impactUse);
   }
@@ -219,7 +223,7 @@
           isNative: isNative,
           byMirrors: mirrorUsage,
           isRedirection: isRedirection, onImplemented: (ClassElement cls) {
-        backend.registerImplementedClass(cls, this);
+        applyImpact(backend.registerImplementedClass(cls, forResolution: true));
       });
       if (globalDependency && !mirrorUsage) {
         globalDependencies.registerDependency(type.element);
@@ -236,7 +240,7 @@
   }
 
   bool checkNoEnqueuedInvokedInstanceMethods() {
-    return filter.checkNoEnqueuedInvokedInstanceMethods(this);
+    return strategy.checkEnqueuerConsistency(this);
   }
 
   void processInstantiatedClassMembers(ClassElement cls) {
@@ -284,7 +288,7 @@
         registerNoSuchMethod(function);
       }
       if (function.name == Identifiers.call && !cls.typeVariables.isEmpty) {
-        registerCallMethodWithFreeTypeVariables(function);
+        _registerCallMethodWithFreeTypeVariables(function);
       }
       // If there is a property access with the same name as a method we
       // need to emit the method.
@@ -349,7 +353,8 @@
         // We only tell the backend once that [superclass] was instantiated, so
         // any additional dependencies must be treated as global
         // dependencies.
-        backend.registerInstantiatedClass(superclass, this);
+        applyImpact(
+            backend.registerInstantiatedClass(superclass, forResolution: true));
       }
 
       ClassElement superclass = cls;
@@ -433,11 +438,11 @@
     assert(invariant(element, element.isDeclaration,
         message: "Element ${element} is not the declaration."));
     _universe.registerStaticUse(staticUse);
-    backend.registerStaticUse(this, element);
+    applyImpact(backend.registerStaticUse(element, forResolution: true));
     bool addElement = true;
     switch (staticUse.kind) {
       case StaticUseKind.STATIC_TEAR_OFF:
-        backend.registerGetOfStaticFunction(this);
+        applyImpact(backend.registerGetOfStaticFunction());
         break;
       case StaticUseKind.FIELD_GET:
       case StaticUseKind.FIELD_SET:
@@ -455,6 +460,7 @@
       case StaticUseKind.SUPER_FIELD_SET:
       case StaticUseKind.SUPER_TEAR_OFF:
       case StaticUseKind.GENERAL:
+      case StaticUseKind.DIRECT_USE:
         break;
       case StaticUseKind.CONSTRUCTOR_INVOKE:
       case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
@@ -477,7 +483,11 @@
     }
   }
 
-  void _registerTypeUse(TypeUse typeUse) {
+  void registerTypeUse(TypeUse typeUse) {
+    strategy.processTypeUse(this, typeUse);
+  }
+
+  void registerTypeUseInternal(TypeUse typeUse) {
     DartType type = typeUse.type;
     switch (typeUse.kind) {
       case TypeUseKind.INSTANTIATION:
@@ -514,18 +524,20 @@
     assert(!type.isTypeVariable || !type.element.enclosingElement.isTypedef);
   }
 
-  void registerCallMethodWithFreeTypeVariables(Element element) {
-    backend.registerCallMethodWithFreeTypeVariables(element, this);
+  void _registerCallMethodWithFreeTypeVariables(Element element) {
+    applyImpact(backend.registerCallMethodWithFreeTypeVariables(element,
+        forResolution: true));
     _universe.callMethodsWithFreeTypeVariables.add(element);
   }
 
   void registerClosurizedMember(TypedElement element) {
     assert(element.isInstanceMember);
     if (element.computeType(resolution).containsTypeVariables) {
-      backend.registerClosureWithFreeTypeVariables(element, this);
+      applyImpact(backend.registerClosureWithFreeTypeVariables(element,
+          forResolution: true));
       _universe.closuresWithFreeTypeVariables.add(element);
     }
-    backend.registerBoundClosure(this);
+    applyImpact(backend.registerBoundClosure());
     _universe.closurizedMembers.add(element);
   }
 
@@ -533,7 +545,11 @@
     do {
       while (queue.isNotEmpty) {
         // TODO(johnniwinther): Find an optimal process order.
-        filter.processWorkItem(f, queue.removeLast());
+        WorkItem work = queue.removeLast();
+        if (!isProcessed(work.element)) {
+          strategy.processWorkItem(f, work);
+          registerProcessedElement(work.element);
+        }
       }
       List recents = recentClasses.toList(growable: false);
       recentClasses.clear();
@@ -625,7 +641,7 @@
       // runtime type.
       _universe.hasRuntimeTypeSupport = true;
       // TODO(ahe): Record precise dependency here.
-      backend.registerRuntimeType(this);
+      applyImpact(backend.registerRuntimeType());
     } else if (commonElements.isFunctionApplyMethod(element)) {
       _universe.hasFunctionApplySupport = true;
     }
@@ -639,7 +655,7 @@
 
   void enableIsolateSupport() {
     _universe.hasIsolateSupport = true;
-    backend.enableIsolateSupport(this);
+    applyImpact(backend.enableIsolateSupport(forResolution: true));
   }
 
   /**
@@ -690,11 +706,32 @@
   }
 }
 
-/// Parameterizes filtering of which work items are enqueued.
-class QueueFilter {
-  bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) {
+void removeFromSet(Map<String, Set<Element>> map, Element element) {
+  Set<Element> set = map[element.name];
+  if (set == null) return;
+  set.remove(element);
+}
+
+/// Strategy used by the enqueuer to populate the world.
+class EnqueuerStrategy {
+  const EnqueuerStrategy();
+
+  /// Process a class instantiated in live code.
+  void processInstantiatedClass(EnqueuerImpl enqueuer, ClassElement cls) {}
+
+  /// Process a static use of and element in live code.
+  void processStaticUse(EnqueuerImpl enqueuer, StaticUse staticUse) {}
+
+  /// Process a type use in live code.
+  void processTypeUse(EnqueuerImpl enqueuer, TypeUse typeUse) {}
+
+  /// Process a dynamic use for a call site in live code.
+  void processDynamicUse(EnqueuerImpl enqueuer, DynamicUse dynamicUse) {}
+
+  /// Check enqueuer consistency after the queue has been closed.
+  bool checkEnqueuerConsistency(EnqueuerImpl enqueuer) {
     enqueuer.task.measure(() {
-      // Run through the classes and see if we need to compile methods.
+      // Run through the classes and see if we need to enqueue more methods.
       for (ClassElement classElement
           in enqueuer.universe.directlyInstantiatedClasses) {
         for (ClassElement currentClass = classElement;
@@ -707,55 +744,51 @@
     return true;
   }
 
+  /// Process [work] using [f].
   void processWorkItem(void f(WorkItem work), WorkItem work) {
     f(work);
   }
 }
 
-void removeFromSet(Map<String, Set<Element>> map, Element element) {
-  Set<Element> set = map[element.name];
-  if (set == null) return;
-  set.remove(element);
+/// Strategy that only enqueues directly used elements.
+class DirectEnqueuerStrategy extends EnqueuerStrategy {
+  const DirectEnqueuerStrategy();
+  void processStaticUse(EnqueuerImpl enqueuer, StaticUse staticUse) {
+    if (staticUse.kind == StaticUseKind.DIRECT_USE) {
+      enqueuer.registerStaticUseInternal(staticUse);
+    }
+  }
 }
 
-/// Strategy used by the enqueuer to populate the world.
-// TODO(johnniwinther): Merge this interface with [QueueFilter].
-class EnqueuerStrategy {
-  const EnqueuerStrategy();
-
-  /// Process a class instantiated in live code.
-  void processInstantiatedClass(Enqueuer enqueuer, ClassElement cls) {}
-
-  /// Process a static use of and element in live code.
-  void processStaticUse(Enqueuer enqueuer, StaticUse staticUse) {}
-
-  /// Process a dynamic use for a call site in live code.
-  void processDynamicUse(Enqueuer enqueuer, DynamicUse dynamicUse) {}
-}
-
-class TreeShakingEnqueuerStrategy implements EnqueuerStrategy {
+/// Strategy used for tree-shaking.
+class TreeShakingEnqueuerStrategy extends EnqueuerStrategy {
   const TreeShakingEnqueuerStrategy();
 
   @override
-  void processInstantiatedClass(Enqueuer enqueuer, ClassElement cls) {
+  void processInstantiatedClass(EnqueuerImpl enqueuer, ClassElement cls) {
     cls.implementation.forEachMember(enqueuer.processInstantiatedClassMember);
   }
 
   @override
-  void processStaticUse(Enqueuer enqueuer, StaticUse staticUse) {
+  void processStaticUse(EnqueuerImpl enqueuer, StaticUse staticUse) {
     enqueuer.registerStaticUseInternal(staticUse);
   }
 
   @override
-  void processDynamicUse(Enqueuer enqueuer, DynamicUse dynamicUse) {
+  void processTypeUse(EnqueuerImpl enqueuer, TypeUse typeUse) {
+    enqueuer.registerTypeUseInternal(typeUse);
+  }
+
+  @override
+  void processDynamicUse(EnqueuerImpl enqueuer, DynamicUse dynamicUse) {
     enqueuer.handleUnseenSelectorInternal(dynamicUse);
   }
 }
 
-class _EnqueuerImpactVisitor implements WorldImpactVisitor {
-  final ResolutionEnqueuer enqueuer;
+class EnqueuerImplImpactVisitor implements WorldImpactVisitor {
+  final EnqueuerImpl enqueuer;
 
-  _EnqueuerImpactVisitor(this.enqueuer);
+  EnqueuerImplImpactVisitor(this.enqueuer);
 
   @override
   void visitDynamicUse(DynamicUse dynamicUse) {
@@ -769,7 +802,7 @@
 
   @override
   void visitTypeUse(TypeUse typeUse) {
-    enqueuer._registerTypeUse(typeUse);
+    enqueuer.registerTypeUse(typeUse);
   }
 }
 
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
index d011dc0..7b913b0 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
@@ -763,9 +763,22 @@
 
   T visitAssert(Assert node) {
     // Avoid pollution from assert statement unless enabled.
-    if (compiler.options.enableUserAssertions) {
-      super.visitAssert(node);
+    if (!compiler.options.enableUserAssertions) {
+      return null;
     }
+    List<Send> tests = <Send>[];
+    bool simpleCondition = handleCondition(node.condition, tests);
+    LocalsHandler<T> saved = locals;
+    locals = new LocalsHandler<T>.from(locals, node);
+    updateIsChecks(tests, usePositive: true);
+
+    LocalsHandler<T> thenLocals = locals;
+    locals = new LocalsHandler<T>.from(saved, node);
+    if (simpleCondition) updateIsChecks(tests, usePositive: false);
+    visit(node.message);
+    locals.seenReturnOrThrow = true;
+    saved.mergeDiamondFlow(thenLocals, locals);
+    locals = saved;
     return null;
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 03e5839..c4d156b 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -335,7 +335,6 @@
   static const String TRACE_METHOD = const String.fromEnvironment('traceCalls');
   static const bool TRACE_CALLS =
       TRACE_METHOD == 'post' || TRACE_METHOD == 'console';
-  MethodElement traceHelper;
 
   TypeMask get stringType => compiler.closedWorld.commonMasks.stringType;
   TypeMask get doubleType => compiler.closedWorld.commonMasks.doubleType;
@@ -1036,9 +1035,9 @@
     });
   }
 
-  void addInterceptorsForNativeClassMembers(
-      ClassElement cls, Enqueuer enqueuer) {
-    if (enqueuer.isResolutionQueue) {
+  void addInterceptorsForNativeClassMembers(ClassElement cls,
+      {bool forResolution}) {
+    if (forResolution) {
       cls.ensureResolved(resolution);
       cls.forEachMember((ClassElement classElement, Element member) {
         if (member.name == Identifiers.call) {
@@ -1062,20 +1061,22 @@
     }
   }
 
-  void addInterceptors(ClassElement cls, Enqueuer enqueuer) {
-    if (enqueuer.isResolutionQueue) {
+  void addInterceptors(ClassElement cls, WorldImpactBuilder impactBuilder,
+      {bool forResolution}) {
+    if (forResolution) {
+      if (_interceptedClasses.add(cls)) {
+        cls.ensureResolved(resolution);
+        cls.forEachMember((ClassElement classElement, Element member) {
+          // All methods on [Object] are shadowed by [Interceptor].
+          if (classElement == coreClasses.objectClass) return;
+          Set<Element> set = interceptedElements.putIfAbsent(
+              member.name, () => new Set<Element>());
+          set.add(member);
+        }, includeSuperAndInjectedMembers: true);
+      }
       _interceptedClasses.add(helpers.jsInterceptorClass);
-      _interceptedClasses.add(cls);
-      cls.ensureResolved(resolution);
-      cls.forEachMember((ClassElement classElement, Element member) {
-        // All methods on [Object] are shadowed by [Interceptor].
-        if (classElement == coreClasses.objectClass) return;
-        Set<Element> set = interceptedElements.putIfAbsent(
-            member.name, () => new Set<Element>());
-        set.add(member);
-      }, includeSuperAndInjectedMembers: true);
     }
-    enqueueClass(enqueuer, cls);
+    impactTransformer.registerBackendInstantiation(impactBuilder, cls);
   }
 
   Set<ClassElement> get interceptedClasses {
@@ -1168,190 +1169,168 @@
     }
   }
 
-  void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {
-    _processClass(cls, enqueuer);
+  WorldImpact registerInstantiatedClass(ClassElement cls,
+      {bool forResolution}) {
+    return _processClass(cls, forResolution: forResolution);
   }
 
-  void registerImplementedClass(ClassElement cls, Enqueuer enqueuer) {
-    _processClass(cls, enqueuer);
+  WorldImpact registerImplementedClass(ClassElement cls, {bool forResolution}) {
+    return _processClass(cls, forResolution: forResolution);
   }
 
-  void _processClass(ClassElement cls, Enqueuer enqueuer) {
+  WorldImpact _processClass(ClassElement cls, {bool forResolution}) {
+    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
     if (!cls.typeVariables.isEmpty) {
-      typeVariableHandler.registerClassWithTypeVariables(cls, enqueuer);
+      typeVariableHandler.registerClassWithTypeVariables(cls,
+          forResolution: forResolution);
     }
 
     // Register any helper that will be needed by the backend.
-    if (enqueuer.isResolutionQueue) {
+    if (forResolution) {
       if (cls == coreClasses.intClass ||
           cls == coreClasses.doubleClass ||
           cls == coreClasses.numClass) {
-        // The backend will try to optimize number operations and use the
-        // `iae` helper directly.
-        enqueue(enqueuer, helpers.throwIllegalArgumentException);
+        impactTransformer.registerBackendImpact(
+            impactBuilder, impacts.numClasses);
       } else if (cls == coreClasses.listClass ||
           cls == coreClasses.stringClass) {
-        // The backend will try to optimize array and string access and use the
-        // `ioore` and `iae` helpers directly.
-        enqueue(enqueuer, helpers.throwIndexOutOfRangeException);
-        enqueue(enqueuer, helpers.throwIllegalArgumentException);
+        impactTransformer.registerBackendImpact(
+            impactBuilder, impacts.listOrStringClasses);
       } else if (cls == coreClasses.functionClass) {
-        enqueueClass(enqueuer, helpers.closureClass);
+        impactTransformer.registerBackendImpact(
+            impactBuilder, impacts.functionClass);
       } else if (cls == coreClasses.mapClass) {
-        // The backend will use a literal list to initialize the entries
-        // of the map.
-        enqueueClass(enqueuer, coreClasses.listClass);
-        enqueueClass(enqueuer, helpers.mapLiteralClass);
+        impactTransformer.registerBackendImpact(
+            impactBuilder, impacts.mapClass);
         // For map literals, the dependency between the implementation class
         // and [Map] is not visible, so we have to add it manually.
         rti.registerRtiDependency(helpers.mapLiteralClass, cls);
       } else if (cls == helpers.boundClosureClass) {
-        // TODO(johnniwinther): Is this a noop?
-        enqueueClass(enqueuer, helpers.boundClosureClass);
+        impactTransformer.registerBackendImpact(
+            impactBuilder, impacts.boundClosureClass);
       } else if (isNativeOrExtendsNative(cls)) {
-        enqueue(enqueuer, helpers.getNativeInterceptorMethod);
-        enqueueClass(enqueuer, helpers.jsInterceptorClass);
-        enqueueClass(enqueuer, helpers.jsJavaScriptObjectClass);
-        enqueueClass(enqueuer, helpers.jsPlainJavaScriptObjectClass);
-        enqueueClass(enqueuer, helpers.jsJavaScriptFunctionClass);
+        impactTransformer.registerBackendImpact(
+            impactBuilder, impacts.nativeOrExtendsClass);
       } else if (cls == helpers.mapLiteralClass) {
-        // For map literals, the dependency between the implementation class
-        // and [Map] is not visible, so we have to add it manually.
-        Element getFactory(String name, int arity) {
-          // The constructor is on the patch class, but dart2js unit tests don't
-          // have a patch class.
-          ClassElement implementation = cls.implementation;
-          ConstructorElement ctor = implementation.lookupConstructor(name);
-          if (ctor == null ||
-              (Name.isPrivateName(name) &&
-                  ctor.library != helpers.mapLiteralClass.library)) {
-            reporter.internalError(
-                helpers.mapLiteralClass,
-                "Map literal class ${helpers.mapLiteralClass} missing "
-                "'$name' constructor"
-                "  ${helpers.mapLiteralClass.constructors}");
-          }
-          return ctor;
-        }
-
-        Element getMember(String name) {
-          // The constructor is on the patch class, but dart2js unit tests don't
-          // have a patch class.
-          ClassElement implementation = cls.implementation;
-          Element element = implementation.lookupLocalMember(name);
-          if (element == null || !element.isFunction || !element.isStatic) {
-            reporter.internalError(
-                helpers.mapLiteralClass,
-                "Map literal class ${helpers.mapLiteralClass} missing "
-                "'$name' static member function");
-          }
-          return element;
-        }
-
-        helpers.mapLiteralConstructor = getFactory('_literal', 1);
-        helpers.mapLiteralConstructorEmpty = getFactory('_empty', 0);
-        enqueue(enqueuer, helpers.mapLiteralConstructor);
-        enqueue(enqueuer, helpers.mapLiteralConstructorEmpty);
-
-        helpers.mapLiteralUntypedMaker = getMember('_makeLiteral');
-        helpers.mapLiteralUntypedEmptyMaker = getMember('_makeEmpty');
-        enqueue(enqueuer, helpers.mapLiteralUntypedMaker);
-        enqueue(enqueuer, helpers.mapLiteralUntypedEmptyMaker);
+        impactTransformer.registerBackendImpact(
+            impactBuilder, impacts.mapLiteralClass);
       }
     }
     if (cls == helpers.closureClass) {
-      enqueue(enqueuer, helpers.closureFromTearOff);
+      impactTransformer.registerBackendImpact(
+          impactBuilder, impacts.closureClass);
     }
     if (cls == coreClasses.stringClass || cls == helpers.jsStringClass) {
-      addInterceptors(helpers.jsStringClass, enqueuer);
+      addInterceptors(helpers.jsStringClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == coreClasses.listClass ||
         cls == helpers.jsArrayClass ||
         cls == helpers.jsFixedArrayClass ||
         cls == helpers.jsExtendableArrayClass ||
         cls == helpers.jsUnmodifiableArrayClass) {
-      addInterceptors(helpers.jsArrayClass, enqueuer);
-      addInterceptors(helpers.jsMutableArrayClass, enqueuer);
-      addInterceptors(helpers.jsFixedArrayClass, enqueuer);
-      addInterceptors(helpers.jsExtendableArrayClass, enqueuer);
-      addInterceptors(helpers.jsUnmodifiableArrayClass, enqueuer);
-      if (enqueuer.isResolutionQueue) {
-        // Literal lists can be translated into calls to these functions:
-        enqueue(enqueuer, helpers.jsArrayTypedConstructor);
-        enqueue(enqueuer, helpers.setRuntimeTypeInfo);
-        enqueue(enqueuer, helpers.getTypeArgumentByIndex);
+      addInterceptors(helpers.jsArrayClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsMutableArrayClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsFixedArrayClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsExtendableArrayClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsUnmodifiableArrayClass, impactBuilder,
+          forResolution: forResolution);
+      if (forResolution) {
+        impactTransformer.registerBackendImpact(
+            impactBuilder, impacts.listClasses);
       }
     } else if (cls == coreClasses.intClass || cls == helpers.jsIntClass) {
-      addInterceptors(helpers.jsIntClass, enqueuer);
-      addInterceptors(helpers.jsPositiveIntClass, enqueuer);
-      addInterceptors(helpers.jsUInt32Class, enqueuer);
-      addInterceptors(helpers.jsUInt31Class, enqueuer);
-      addInterceptors(helpers.jsNumberClass, enqueuer);
+      addInterceptors(helpers.jsIntClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsPositiveIntClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsUInt32Class, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsUInt31Class, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsNumberClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == coreClasses.doubleClass || cls == helpers.jsDoubleClass) {
-      addInterceptors(helpers.jsDoubleClass, enqueuer);
-      addInterceptors(helpers.jsNumberClass, enqueuer);
+      addInterceptors(helpers.jsDoubleClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsNumberClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == coreClasses.boolClass || cls == helpers.jsBoolClass) {
-      addInterceptors(helpers.jsBoolClass, enqueuer);
+      addInterceptors(helpers.jsBoolClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == coreClasses.nullClass || cls == helpers.jsNullClass) {
-      addInterceptors(helpers.jsNullClass, enqueuer);
+      addInterceptors(helpers.jsNullClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == coreClasses.numClass || cls == helpers.jsNumberClass) {
-      addInterceptors(helpers.jsIntClass, enqueuer);
-      addInterceptors(helpers.jsPositiveIntClass, enqueuer);
-      addInterceptors(helpers.jsUInt32Class, enqueuer);
-      addInterceptors(helpers.jsUInt31Class, enqueuer);
-      addInterceptors(helpers.jsDoubleClass, enqueuer);
-      addInterceptors(helpers.jsNumberClass, enqueuer);
+      addInterceptors(helpers.jsIntClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsPositiveIntClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsUInt32Class, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsUInt31Class, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsDoubleClass, impactBuilder,
+          forResolution: forResolution);
+      addInterceptors(helpers.jsNumberClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == helpers.jsJavaScriptObjectClass) {
-      addInterceptors(helpers.jsJavaScriptObjectClass, enqueuer);
+      addInterceptors(helpers.jsJavaScriptObjectClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == helpers.jsPlainJavaScriptObjectClass) {
-      addInterceptors(helpers.jsPlainJavaScriptObjectClass, enqueuer);
+      addInterceptors(helpers.jsPlainJavaScriptObjectClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == helpers.jsUnknownJavaScriptObjectClass) {
-      addInterceptors(helpers.jsUnknownJavaScriptObjectClass, enqueuer);
+      addInterceptors(helpers.jsUnknownJavaScriptObjectClass, impactBuilder,
+          forResolution: forResolution);
     } else if (cls == helpers.jsJavaScriptFunctionClass) {
-      addInterceptors(helpers.jsJavaScriptFunctionClass, enqueuer);
+      addInterceptors(helpers.jsJavaScriptFunctionClass, impactBuilder,
+          forResolution: forResolution);
     } else if (isNativeOrExtendsNative(cls)) {
-      addInterceptorsForNativeClassMembers(cls, enqueuer);
+      addInterceptorsForNativeClassMembers(cls, forResolution: forResolution);
     } else if (cls == helpers.jsIndexingBehaviorInterface) {
-      // These two helpers are used by the emitter and the codegen.
-      // Because we cannot enqueue elements at the time of emission,
-      // we make sure they are always generated.
-      enqueue(enqueuer, helpers.isJsIndexable);
+      impactTransformer.registerBackendImpact(
+          impactBuilder, impacts.jsIndexingBehavior);
     }
 
     customElementsAnalysis.registerInstantiatedClass(cls,
-        forResolution: enqueuer.isResolutionQueue);
-    if (!enqueuer.isResolutionQueue) {
+        forResolution: forResolution);
+    if (!forResolution) {
       lookupMapAnalysis.registerInstantiatedClass(cls);
     }
+
+    return impactBuilder;
   }
 
   void registerInstantiatedType(InterfaceType type) {
     lookupMapAnalysis.registerInstantiatedType(type);
   }
 
-  void enqueueHelpers(ResolutionEnqueuer enqueuer) {
+  @override
+  WorldImpact computeHelpersImpact() {
     assert(helpers.interceptorsLibrary != null);
+    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
     // TODO(ngeoffray): Not enqueuing those two classes currently make
     // the compiler potentially crash. However, any reasonable program
     // will instantiate those two classes.
-    addInterceptors(helpers.jsBoolClass, enqueuer);
-    addInterceptors(helpers.jsNullClass, enqueuer);
+    addInterceptors(helpers.jsBoolClass, impactBuilder, forResolution: true);
+    addInterceptors(helpers.jsNullClass, impactBuilder, forResolution: true);
     if (compiler.options.enableTypeAssertions) {
-      // Unconditionally register the helper that checks if the
-      // expression in an if/while/for is a boolean.
-      // TODO(ngeoffray): Should we have the resolver register those instead?
-      Element e = helpers.boolConversionCheck;
-      if (e != null) enqueue(enqueuer, e);
+      impactTransformer.registerBackendImpact(
+          impactBuilder, impacts.enableTypeAssertions);
     }
 
     if (TRACE_CALLS) {
-      traceHelper = TRACE_METHOD == 'console'
-          ? helpers.consoleTraceHelper
-          : helpers.postTraceHelper;
-      assert(traceHelper != null);
-      enqueue(enqueuer, traceHelper);
+      impactTransformer.registerBackendImpact(
+          impactBuilder, impacts.traceHelper);
     }
-    enqueue(enqueuer, helpers.assertUnreachableMethod);
-    registerCheckedModeHelpers(enqueuer);
+    impactTransformer.registerBackendImpact(
+        impactBuilder, impacts.assertUnreachable);
+    _registerCheckedModeHelpers(impactBuilder);
+    return impactBuilder;
   }
 
   onResolutionComplete() {
@@ -1366,47 +1345,36 @@
     noSuchMethodRegistry.onTypeInferenceComplete();
   }
 
-  void registerGetRuntimeTypeArgument() {
-    enqueueImpact(compiler.enqueuer.resolution, impacts.getRuntimeTypeArgument);
-  }
-
-  void registerCallMethodWithFreeTypeVariables(
-      Element callMethod, Enqueuer enqueuer) {
-    if (enqueuer.isResolutionQueue || methodNeedsRti(callMethod)) {
-      registerComputeSignature(enqueuer);
+  WorldImpact registerCallMethodWithFreeTypeVariables(Element callMethod,
+      {bool forResolution}) {
+    if (forResolution || methodNeedsRti(callMethod)) {
+      return _registerComputeSignature();
     }
+    return const WorldImpact();
   }
 
-  void registerClosureWithFreeTypeVariables(
-      Element closure, Enqueuer enqueuer) {
-    if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) {
-      registerComputeSignature(enqueuer);
+  WorldImpact registerClosureWithFreeTypeVariables(Element closure,
+      {bool forResolution}) {
+    if (forResolution || methodNeedsRti(closure)) {
+      return _registerComputeSignature();
     }
+    return const WorldImpact();
   }
 
-  void registerBoundClosure(Enqueuer enqueuer) {
-    helpers.boundClosureClass.ensureResolved(resolution);
-    enqueuer.registerInstantiatedType(helpers.boundClosureClass.rawType);
+  WorldImpact registerBoundClosure() {
+    return impactTransformer.createImpactFor(impacts.memberClosure);
   }
 
-  void registerGetOfStaticFunction(Enqueuer enqueuer) {
-    helpers.closureClass.ensureResolved(resolution);
-    enqueuer.registerInstantiatedType(helpers.closureClass.rawType);
+  WorldImpact registerGetOfStaticFunction() {
+    return impactTransformer.createImpactFor(impacts.staticClosure);
   }
 
-  void registerComputeSignature(Enqueuer enqueuer) {
-    // Calls to [:computeSignature:] are generated by the emitter and we
-    // therefore need to enqueue the used elements in the codegen enqueuer as
-    // well as in the resolution enqueuer.
-    enqueueImpact(enqueuer, impacts.computeSignature);
+  WorldImpact _registerComputeSignature() {
+    return impactTransformer.createImpactFor(impacts.computeSignature);
   }
 
-  void registerRuntimeType(ResolutionEnqueuer enqueuer) {
-    registerComputeSignature(enqueuer);
-    enqueue(enqueuer, helpers.setRuntimeTypeInfo);
-    registerGetRuntimeTypeArgument();
-    enqueue(enqueuer, helpers.getRuntimeTypeInfo);
-    enqueueClass(enqueuer, coreClasses.listClass);
+  WorldImpact registerRuntimeType() {
+    return impactTransformer.createImpactFor(impacts.runtimeTypeSupport);
   }
 
   void registerTypeVariableBoundsSubtypeCheck(
@@ -1414,10 +1382,8 @@
     rti.registerTypeVariableBoundsSubtypeCheck(typeArgument, bound);
   }
 
-  void registerCheckDeferredIsLoaded(ResolutionEnqueuer enqueuer) {
-    enqueue(enqueuer, helpers.checkDeferredIsLoaded);
-    // Also register the types of the arguments passed to this method.
-    enqueueClass(enqueuer, coreClasses.stringClass);
+  WorldImpact computeDeferredLoadingImpact() {
+    return impactTransformer.createImpactFor(impacts.deferredLoading);
   }
 
   void registerNoSuchMethod(FunctionElement noSuchMethod) {
@@ -1458,12 +1424,12 @@
     return null;
   }
 
-  void enableNoSuchMethod(Enqueuer world) {
-    enqueue(world, helpers.createInvocationMirror);
-    world.registerDynamicUse(new DynamicUse(Selectors.noSuchMethod_, null));
+  WorldImpact enableNoSuchMethod() {
+    return impactTransformer.createImpactFor(impacts.noSuchMethodSupport);
   }
 
-  void enableIsolateSupport(Enqueuer enqueuer) {
+  WorldImpact enableIsolateSupport({bool forResolution}) {
+    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
     // TODO(floitsch): We should also ensure that the class IsolateMessage is
     // instantiated. Currently, just enabling isolate support works.
     if (compiler.mainFunction != null) {
@@ -1474,22 +1440,16 @@
       // The JavaScript backend of [Isolate.spawnUri] uses the same internal
       // implementation as [Isolate.spawn], and fails if it cannot look main up
       // by name.
-      enqueuer.registerStaticUse(
+      impactBuilder.registerStaticUse(
           new StaticUse.staticTearOff(compiler.mainFunction));
     }
-    if (enqueuer.isResolutionQueue) {
-      void enqueue(Element element) {
-        enqueuer.addToWorkList(element);
-        compiler.globalDependencies.registerDependency(element);
-        helpersUsed.add(element.declaration);
-      }
-
-      enqueue(helpers.startRootIsolate);
-      enqueue(helpers.currentIsolate);
-      enqueue(helpers.callInIsolate);
-    } else {
-      enqueuer.addToWorkList(helpers.startRootIsolate);
+    impactTransformer.registerBackendImpact(
+        impactBuilder, impacts.isolateSupport);
+    if (forResolution) {
+      impactTransformer.registerBackendImpact(
+          impactBuilder, impacts.isolateSupportForResolution);
     }
+    return impactBuilder;
   }
 
   bool classNeedsRti(ClassElement cls) {
@@ -1519,60 +1479,6 @@
         compiler.resolverWorld.hasRuntimeTypeSupport;
   }
 
-  /// Enqueue [e] in [enqueuer].
-  ///
-  /// This method calls [registerBackendUse].
-  void enqueue(Enqueuer enqueuer, Element e) {
-    if (e == null) return;
-    registerBackendUse(e);
-    enqueuer.addToWorkList(e);
-    compiler.globalDependencies.registerDependency(e);
-  }
-
-  /// Register instantiation of [cls] in [enqueuer].
-  ///
-  /// This method calls [registerBackendUse].
-  void enqueueClass(Enqueuer enqueuer, ClassElement cls) {
-    if (cls == null) return;
-    registerBackendUse(cls);
-    helpersUsed.add(cls.declaration);
-    if (cls.declaration != cls.implementation) {
-      helpersUsed.add(cls.implementation);
-    }
-    cls.ensureResolved(resolution);
-    enqueuer.registerInstantiatedType(cls.rawType);
-  }
-
-  /// Register instantiation of [type] in [enqueuer].
-  ///
-  /// This method calls [registerBackendUse].
-  void enqueueType(Enqueuer enqueuer, InterfaceType type) {
-    if (type == null) return;
-    ClassElement cls = type.element;
-    registerBackendUse(cls);
-    helpersUsed.add(cls.declaration);
-    if (cls.declaration != cls.implementation) {
-      helpersUsed.add(cls.implementation);
-    }
-    cls.ensureResolved(resolution);
-    enqueuer.registerInstantiatedType(type);
-  }
-
-  void enqueueImpact(Enqueuer enqueuer, BackendImpact impact) {
-    for (Element staticUse in impact.staticUses) {
-      enqueue(enqueuer, staticUse);
-    }
-    for (InterfaceType type in impact.instantiatedTypes) {
-      enqueueType(enqueuer, type);
-    }
-    for (ClassElement cls in impact.instantiatedClasses) {
-      enqueueClass(enqueuer, cls);
-    }
-    for (BackendImpact otherImpact in impact.otherImpacts) {
-      enqueueImpact(enqueuer, otherImpact);
-    }
-  }
-
   CodegenEnqueuer get codegenEnqueuer => compiler.enqueuer.codegen;
 
   CodegenEnqueuer createCodegenEnqueuer(CompilerTask task, Compiler compiler) {
@@ -1634,7 +1540,7 @@
         // go through the builder (below) to generate the lazy initializer for
         // the static variable.
         // We also need to register the use of the cyclic-error helper.
-        compiler.enqueuer.codegen.registerStaticUse(new StaticUse.staticInvoke(
+        work.registry.worldImpact.registerStaticUse(new StaticUse.staticInvoke(
             helpers.cyclicThrowHelper, CallStructure.ONE_ARG));
       }
     }
@@ -1856,12 +1762,15 @@
     }
   }
 
-  void registerCheckedModeHelpers(ResolutionEnqueuer enqueuer) {
+  void _registerCheckedModeHelpers(WorldImpactBuilder impactBuilder) {
     // We register all the helpers in the resolution queue.
     // TODO(13155): Find a way to register fewer helpers.
+    List<Element> staticUses = <Element>[];
     for (CheckedModeHelper helper in checkedModeHelpers) {
-      enqueue(enqueuer, helper.getStaticUse(compiler).element);
+      staticUses.add(helper.getStaticUse(compiler).element);
     }
+    impactTransformer.registerBackendImpact(
+        impactBuilder, new BackendImpact(globalUses: staticUses));
   }
 
   /**
@@ -1892,7 +1801,8 @@
     return compiler.closedWorld.hasOnlySubclasses(classElement);
   }
 
-  void registerStaticUse(Enqueuer enqueuer, Element element) {
+  WorldImpact registerStaticUse(Element element, {bool forResolution}) {
+    WorldImpactBuilderImpl worldImpact = new WorldImpactBuilderImpl();
     if (element == helpers.disableTreeShakingMarker) {
       isTreeShakingDisabled = true;
     } else if (element == helpers.preserveNamesMarker) {
@@ -1909,15 +1819,17 @@
       // TODO(sigurdm): Create a function registerLoadLibraryAccess.
       if (!isLoadLibraryFunctionResolved) {
         isLoadLibraryFunctionResolved = true;
-        if (enqueuer.isResolutionQueue) {
-          enqueue(enqueuer, helpers.loadLibraryWrapper);
+        if (forResolution) {
+          impactTransformer.registerBackendImpact(
+              worldImpact, impacts.loadLibrary);
         }
       }
     } else if (element == helpers.requiresPreambleMarker) {
       requiresPreamble = true;
     }
     customElementsAnalysis.registerStaticUse(element,
-        forResolution: enqueuer.isResolutionQueue);
+        forResolution: forResolution);
+    return worldImpact;
   }
 
   /// Called when [:const Symbol(name):] is seen.
@@ -2344,13 +2256,11 @@
     //
     // Return early if any elements are added to avoid counting the elements as
     // due to mirrors.
+    enqueuer.applyImpact(customElementsAnalysis.flush(
+        forResolution: enqueuer.isResolutionQueue));
     enqueuer.applyImpact(
-        compiler.impactStrategy,
-        customElementsAnalysis.flush(
-            forResolution: enqueuer.isResolutionQueue));
-    enqueuer.applyImpact(compiler.impactStrategy,
         lookupMapAnalysis.flush(forResolution: enqueuer.isResolutionQueue));
-    enqueuer.applyImpact(compiler.impactStrategy,
+    enqueuer.applyImpact(
         typeVariableHandler.flush(forResolution: enqueuer.isResolutionQueue));
 
     if (!enqueuer.queueIsEmpty) return false;
@@ -2359,7 +2269,7 @@
     if (!enabledNoSuchMethod &&
         (noSuchMethodRegistry.hasThrowingNoSuchMethod ||
             noSuchMethodRegistry.hasComplexNoSuchMethod)) {
-      enableNoSuchMethod(enqueuer);
+      enqueuer.applyImpact(enableNoSuchMethod());
       enabledNoSuchMethod = true;
     }
 
@@ -2369,10 +2279,10 @@
 
     if (compiler.options.hasIncrementalSupport) {
       // Always enable tear-off closures during incremental compilation.
-      Element e = helpers.closureFromTearOff;
-      if (e != null && !enqueuer.isProcessed(e)) {
-        registerBackendUse(e);
-        enqueuer.addToWorkList(e);
+      Element element = helpers.closureFromTearOff;
+      if (element != null && !enqueuer.isProcessed(element)) {
+        enqueuer.applyImpact(
+            impactTransformer.createImpactFor(impacts.closureClass));
       }
     }
 
@@ -2381,19 +2291,17 @@
     }
 
     if (isTreeShakingDisabled) {
-      enqueuer.applyImpact(
-          compiler.impactStrategy,
-          mirrorsAnalysis.computeImpactForReflectiveElements(recentClasses,
-              enqueuer.processedClasses, compiler.libraryLoader.libraries,
-              forResolution: enqueuer.isResolutionQueue));
+      enqueuer.applyImpact(mirrorsAnalysis.computeImpactForReflectiveElements(
+          recentClasses,
+          enqueuer.processedClasses,
+          compiler.libraryLoader.libraries,
+          forResolution: enqueuer.isResolutionQueue));
     } else if (!targetsUsed.isEmpty && enqueuer.isResolutionQueue) {
       // Add all static elements (not classes) that have been requested for
       // reflection. If there is no mirror-usage these are probably not
       // necessary, but the backend relies on them being resolved.
-      enqueuer.applyImpact(
-          compiler.impactStrategy,
-          mirrorsAnalysis.computeImpactForReflectiveStaticFields(
-              _findStaticFieldTargets(),
+      enqueuer.applyImpact(mirrorsAnalysis
+          .computeImpactForReflectiveStaticFields(_findStaticFieldTargets(),
               forResolution: enqueuer.isResolutionQueue));
     }
 
@@ -2430,7 +2338,7 @@
         }
         metadataConstants.clear();
       }
-      enqueuer.applyImpact(compiler.impactStrategy, impactBuilder.flush());
+      enqueuer.applyImpact(impactBuilder.flush());
     }
     return true;
   }
@@ -2579,7 +2487,8 @@
   }
 
   @override
-  WorldImpact computeMainImpact(Enqueuer enqueuer, MethodElement mainMethod) {
+  WorldImpact computeMainImpact(MethodElement mainMethod,
+      {bool forResolution}) {
     WorldImpactBuilderImpl mainImpact = new WorldImpactBuilderImpl();
     if (mainMethod.parameters.isNotEmpty) {
       impactTransformer.registerBackendImpact(
@@ -2590,7 +2499,7 @@
       // target of Isolate.spawnUri. Strictly speaking, that can happen also if
       // main takes no arguments, but in this case the spawned isolate can't
       // communicate with the spawning isolate.
-      enqueuer.enableIsolateSupport();
+      mainImpact.addImpact(enableIsolateSupport(forResolution: forResolution));
     }
     mainImpact.registerStaticUse(
         new StaticUse.staticInvoke(mainMethod, CallStructure.NO_ARGS));
@@ -2612,11 +2521,7 @@
   }
 
   @override
-  bool enableDeferredLoadingIfSupported(
-      ResolutionEnqueuer enqueuer, Spannable node) {
-    registerCheckDeferredIsLoaded(enqueuer);
-    return true;
-  }
+  bool enableDeferredLoadingIfSupported(Spannable node) => true;
 
   @override
   bool enableCodegenWithErrorsIfSupported(Spannable node) => true;
@@ -3011,14 +2916,44 @@
     return transformed;
   }
 
+  WorldImpact createImpactFor(BackendImpact impact) {
+    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
+    registerBackendImpact(impactBuilder, impact);
+    return impactBuilder;
+  }
+
+  void registerBackendStaticUse(
+      WorldImpactBuilder worldImpact, MethodElement element,
+      {bool isGlobal: false}) {
+    backend.registerBackendUse(element);
+    worldImpact.registerStaticUse(
+        // TODO(johnniwinther): Store the correct use in impacts.
+        new StaticUse.foreignUse(element));
+    if (isGlobal) {
+      backend.compiler.globalDependencies.registerDependency(element);
+    }
+  }
+
+  void registerBackendInstantiation(
+      WorldImpactBuilder worldImpact, ClassElement cls,
+      {bool isGlobal: false}) {
+    cls.ensureResolved(backend.resolution);
+    backend.registerBackendUse(cls);
+    worldImpact.registerTypeUse(new TypeUse.instantiation(cls.rawType));
+    if (isGlobal) {
+      backend.compiler.globalDependencies.registerDependency(cls);
+    }
+  }
+
   void registerBackendImpact(
       WorldImpactBuilder worldImpact, BackendImpact backendImpact) {
     for (Element staticUse in backendImpact.staticUses) {
       assert(staticUse != null);
-      backend.registerBackendUse(staticUse);
-      worldImpact.registerStaticUse(
-          // TODO(johnniwinther): Store the correct use in impacts.
-          new StaticUse.foreignUse(staticUse));
+      registerBackendStaticUse(worldImpact, staticUse);
+    }
+    for (Element staticUse in backendImpact.globalUses) {
+      assert(staticUse != null);
+      registerBackendStaticUse(worldImpact, staticUse, isGlobal: true);
     }
     for (Selector selector in backendImpact.dynamicUses) {
       assert(selector != null);
@@ -3029,9 +2964,10 @@
       worldImpact.registerTypeUse(new TypeUse.instantiation(instantiatedType));
     }
     for (ClassElement cls in backendImpact.instantiatedClasses) {
-      cls.ensureResolved(backend.resolution);
-      backend.registerBackendUse(cls);
-      worldImpact.registerTypeUse(new TypeUse.instantiation(cls.rawType));
+      registerBackendInstantiation(worldImpact, cls);
+    }
+    for (ClassElement cls in backendImpact.globalClasses) {
+      registerBackendInstantiation(worldImpact, cls, isGlobal: true);
     }
     for (BackendImpact otherImpact in backendImpact.otherImpacts) {
       registerBackendImpact(worldImpact, otherImpact);
diff --git a/pkg/compiler/lib/src/js_backend/backend_helpers.dart b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
index eb347c3..e50c744 100644
--- a/pkg/compiler/lib/src/js_backend/backend_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
@@ -21,6 +21,7 @@
         LibraryElement,
         MemberElement,
         MethodElement,
+        Name,
         PublicName;
 import '../library_loader.dart' show LoadedLibraries;
 import '../universe/call_structure.dart' show CallStructure;
@@ -120,10 +121,6 @@
   ClassElement mapLiteralClass;
   ClassElement constMapLiteralClass;
   ClassElement typeVariableClass;
-  ConstructorElement mapLiteralConstructor;
-  ConstructorElement mapLiteralConstructorEmpty;
-  Element mapLiteralUntypedMaker;
-  Element mapLiteralUntypedEmptyMaker;
 
   ClassElement noSideEffectsClass;
   ClassElement noThrowsClass;
@@ -396,6 +393,73 @@
     objectEquals = compiler.lookupElementIn(coreClasses.objectClass, '==');
   }
 
+  ConstructorElement _mapLiteralConstructor;
+  ConstructorElement _mapLiteralConstructorEmpty;
+  Element _mapLiteralUntypedMaker;
+  Element _mapLiteralUntypedEmptyMaker;
+
+  ConstructorElement get mapLiteralConstructor {
+    _ensureMapLiteralHelpers();
+    return _mapLiteralConstructor;
+  }
+
+  ConstructorElement get mapLiteralConstructorEmpty {
+    _ensureMapLiteralHelpers();
+    return _mapLiteralConstructorEmpty;
+  }
+
+  Element get mapLiteralUntypedMaker {
+    _ensureMapLiteralHelpers();
+    return _mapLiteralUntypedMaker;
+  }
+
+  Element get mapLiteralUntypedEmptyMaker {
+    _ensureMapLiteralHelpers();
+    return _mapLiteralUntypedEmptyMaker;
+  }
+
+  void _ensureMapLiteralHelpers() {
+    if (_mapLiteralConstructor != null) return;
+
+    // For map literals, the dependency between the implementation class
+    // and [Map] is not visible, so we have to add it manually.
+    Element getFactory(String name, int arity) {
+      // The constructor is on the patch class, but dart2js unit tests don't
+      // have a patch class.
+      ClassElement implementation = mapLiteralClass.implementation;
+      ConstructorElement ctor = implementation.lookupConstructor(name);
+      if (ctor == null ||
+          (Name.isPrivateName(name) &&
+              ctor.library != mapLiteralClass.library)) {
+        reporter.internalError(
+            mapLiteralClass,
+            "Map literal class ${mapLiteralClass} missing "
+            "'$name' constructor"
+            "  ${mapLiteralClass.constructors}");
+      }
+      return ctor;
+    }
+
+    Element getMember(String name) {
+      // The constructor is on the patch class, but dart2js unit tests don't
+      // have a patch class.
+      ClassElement implementation = mapLiteralClass.implementation;
+      Element element = implementation.lookupLocalMember(name);
+      if (element == null || !element.isFunction || !element.isStatic) {
+        reporter.internalError(
+            mapLiteralClass,
+            "Map literal class ${mapLiteralClass} missing "
+            "'$name' static member function");
+      }
+      return element;
+    }
+
+    _mapLiteralConstructor = getFactory('_literal', 1);
+    _mapLiteralConstructorEmpty = getFactory('_empty', 0);
+    _mapLiteralUntypedMaker = getMember('_makeLiteral');
+    _mapLiteralUntypedEmptyMaker = getMember('_makeEmpty');
+  }
+
   Element get badMain {
     return findHelper('badMain');
   }
@@ -416,11 +480,19 @@
     return findHelper('boolConversionCheck');
   }
 
-  Element get consoleTraceHelper {
+  MethodElement _traceHelper;
+
+  MethodElement get traceHelper {
+    return _traceHelper ??= JavaScriptBackend.TRACE_METHOD == 'console'
+        ? _consoleTraceHelper
+        : _postTraceHelper;
+  }
+
+  MethodElement get _consoleTraceHelper {
     return findHelper('consoleTraceHelper');
   }
 
-  Element get postTraceHelper {
+  MethodElement get _postTraceHelper {
     return findHelper('postTraceHelper');
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index afbd270..b5b9e72 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -24,17 +24,21 @@
 /// A set of JavaScript backend dependencies.
 class BackendImpact {
   final List<Element> staticUses;
+  final List<Element> globalUses;
   final List<Selector> dynamicUses;
   final List<InterfaceType> instantiatedTypes;
   final List<ClassElement> instantiatedClasses;
+  final List<ClassElement> globalClasses;
   final List<BackendImpact> otherImpacts;
   final EnumSet<BackendFeature> _features;
 
   const BackendImpact(
       {this.staticUses: const <Element>[],
+      this.globalUses: const <Element>[],
       this.dynamicUses: const <Selector>[],
       this.instantiatedTypes: const <InterfaceType>[],
       this.instantiatedClasses: const <ClassElement>[],
+      this.globalClasses: const <ClassElement>[],
       this.otherImpacts: const <BackendImpact>[],
       EnumSet<BackendFeature> features: const EnumSet<BackendFeature>.fixed(0)})
       : this._features = features;
@@ -58,172 +62,131 @@
   BackendImpact _getRuntimeTypeArgument;
 
   BackendImpact get getRuntimeTypeArgument {
-    if (_getRuntimeTypeArgument == null) {
-      _getRuntimeTypeArgument = new BackendImpact(staticUses: [
-        helpers.getRuntimeTypeArgument,
-        helpers.getTypeArgumentByIndex,
-      ]);
-    }
-    return _getRuntimeTypeArgument;
+    return _getRuntimeTypeArgument ??= new BackendImpact(globalUses: [
+      helpers.getRuntimeTypeArgument,
+      helpers.getTypeArgumentByIndex,
+    ]);
   }
 
   BackendImpact _computeSignature;
 
   BackendImpact get computeSignature {
-    if (_computeSignature == null) {
-      _computeSignature = new BackendImpact(staticUses: [
-        helpers.setRuntimeTypeInfo,
-        helpers.getRuntimeTypeInfo,
-        helpers.computeSignature,
-        helpers.getRuntimeTypeArguments
-      ], otherImpacts: [
-        listValues
-      ]);
-    }
-    return _computeSignature;
+    return _computeSignature ??= new BackendImpact(globalUses: [
+      helpers.setRuntimeTypeInfo,
+      helpers.getRuntimeTypeInfo,
+      helpers.computeSignature,
+      helpers.getRuntimeTypeArguments
+    ], otherImpacts: [
+      listValues
+    ]);
   }
 
   BackendImpact _mainWithArguments;
 
   BackendImpact get mainWithArguments {
-    if (_mainWithArguments == null) {
-      _mainWithArguments = new BackendImpact(
-          instantiatedClasses: [
-            helpers.jsArrayClass,
-            helpers.jsStringClass]);
-    }
-    return _mainWithArguments;
+    return _mainWithArguments ??= new BackendImpact(
+        instantiatedClasses: [helpers.jsArrayClass, helpers.jsStringClass]);
   }
 
   BackendImpact _asyncBody;
 
   BackendImpact get asyncBody {
-    if (_asyncBody == null) {
-      _asyncBody = new BackendImpact(staticUses: [
-        helpers.asyncHelper,
-        helpers.syncCompleterConstructor,
-        helpers.streamIteratorConstructor,
-        helpers.wrapBody
-      ]);
-    }
-    return _asyncBody;
+    return _asyncBody ??= new BackendImpact(staticUses: [
+      helpers.asyncHelper,
+      helpers.syncCompleterConstructor,
+      helpers.streamIteratorConstructor,
+      helpers.wrapBody
+    ]);
   }
 
   BackendImpact _syncStarBody;
 
   BackendImpact get syncStarBody {
-    if (_syncStarBody == null) {
-      _syncStarBody = new BackendImpact(staticUses: [
-        helpers.syncStarIterableConstructor,
-        helpers.endOfIteration,
-        helpers.yieldStar,
-        helpers.syncStarUncaughtError
-      ], instantiatedClasses: [
-        helpers.syncStarIterable
-      ]);
-    }
-    return _syncStarBody;
+    return _syncStarBody ??= new BackendImpact(staticUses: [
+      helpers.syncStarIterableConstructor,
+      helpers.endOfIteration,
+      helpers.yieldStar,
+      helpers.syncStarUncaughtError
+    ], instantiatedClasses: [
+      helpers.syncStarIterable
+    ]);
   }
 
   BackendImpact _asyncStarBody;
 
   BackendImpact get asyncStarBody {
-    if (_asyncStarBody == null) {
-      _asyncStarBody = new BackendImpact(staticUses: [
-        helpers.asyncStarHelper,
-        helpers.streamOfController,
-        helpers.yieldSingle,
-        helpers.yieldStar,
-        helpers.asyncStarControllerConstructor,
-        helpers.streamIteratorConstructor,
-        helpers.wrapBody
-      ], instantiatedClasses: [
-        helpers.asyncStarController
-      ]);
-    }
-    return _asyncStarBody;
+    return _asyncStarBody ??= new BackendImpact(staticUses: [
+      helpers.asyncStarHelper,
+      helpers.streamOfController,
+      helpers.yieldSingle,
+      helpers.yieldStar,
+      helpers.asyncStarControllerConstructor,
+      helpers.streamIteratorConstructor,
+      helpers.wrapBody
+    ], instantiatedClasses: [
+      helpers.asyncStarController
+    ]);
   }
 
   BackendImpact _typeVariableBoundCheck;
 
   BackendImpact get typeVariableBoundCheck {
-    if (_typeVariableBoundCheck == null) {
-      _typeVariableBoundCheck = new BackendImpact(
-          staticUses: [helpers.throwTypeError, helpers.assertIsSubtype]);
-    }
-    return _typeVariableBoundCheck;
+    return _typeVariableBoundCheck ??= new BackendImpact(
+        staticUses: [helpers.throwTypeError, helpers.assertIsSubtype]);
   }
 
   BackendImpact _abstractClassInstantiation;
 
   BackendImpact get abstractClassInstantiation {
-    if (_abstractClassInstantiation == null) {
-      _abstractClassInstantiation = new BackendImpact(
-          staticUses: [helpers.throwAbstractClassInstantiationError],
-          otherImpacts: [_needsString('Needed to encode the message.')]);
-    }
-    return _abstractClassInstantiation;
+    return _abstractClassInstantiation ??= new BackendImpact(
+        staticUses: [helpers.throwAbstractClassInstantiationError],
+        otherImpacts: [_needsString('Needed to encode the message.')]);
   }
 
   BackendImpact _fallThroughError;
 
   BackendImpact get fallThroughError {
-    if (_fallThroughError == null) {
-      _fallThroughError =
-          new BackendImpact(staticUses: [helpers.fallThroughError]);
-    }
-    return _fallThroughError;
+    return _fallThroughError ??=
+        new BackendImpact(staticUses: [helpers.fallThroughError]);
   }
 
   BackendImpact _asCheck;
 
   BackendImpact get asCheck {
-    if (_asCheck == null) {
-      _asCheck = new BackendImpact(staticUses: [helpers.throwRuntimeError]);
-    }
-    return _asCheck;
+    return _asCheck ??=
+        new BackendImpact(staticUses: [helpers.throwRuntimeError]);
   }
 
   BackendImpact _throwNoSuchMethod;
 
   BackendImpact get throwNoSuchMethod {
-    if (_throwNoSuchMethod == null) {
-      _throwNoSuchMethod = new BackendImpact(staticUses: [
-        helpers.throwNoSuchMethod
-      ], otherImpacts: [
-        // Also register the types of the arguments passed to this method.
-        _needsList(
-            'Needed to encode the arguments for throw NoSuchMethodError.'),
-        _needsString('Needed to encode the name for throw NoSuchMethodError.')
-      ]);
-    }
-    return _throwNoSuchMethod;
+    return _throwNoSuchMethod ??= new BackendImpact(staticUses: [
+      helpers.throwNoSuchMethod
+    ], otherImpacts: [
+      // Also register the types of the arguments passed to this method.
+      _needsList('Needed to encode the arguments for throw NoSuchMethodError.'),
+      _needsString('Needed to encode the name for throw NoSuchMethodError.')
+    ]);
   }
 
   BackendImpact _stringValues;
 
   BackendImpact get stringValues {
-    if (_stringValues == null) {
-      _stringValues =
-          new BackendImpact(instantiatedClasses: [helpers.jsStringClass]);
-    }
-    return _stringValues;
+    return _stringValues ??=
+        new BackendImpact(instantiatedClasses: [helpers.jsStringClass]);
   }
 
   BackendImpact _numValues;
 
   BackendImpact get numValues {
-    if (_numValues == null) {
-      _numValues = new BackendImpact(instantiatedClasses: [
-        helpers.jsIntClass,
-        helpers.jsPositiveIntClass,
-        helpers.jsUInt32Class,
-        helpers.jsUInt31Class,
-        helpers.jsNumberClass,
-        helpers.jsDoubleClass
-      ]);
-    }
-    return _numValues;
+    return _numValues ??= new BackendImpact(instantiatedClasses: [
+      helpers.jsIntClass,
+      helpers.jsPositiveIntClass,
+      helpers.jsUInt32Class,
+      helpers.jsUInt31Class,
+      helpers.jsNumberClass,
+      helpers.jsDoubleClass
+    ]);
   }
 
   BackendImpact get intValues => numValues;
@@ -233,67 +196,51 @@
   BackendImpact _boolValues;
 
   BackendImpact get boolValues {
-    if (_boolValues == null) {
-      _boolValues =
-          new BackendImpact(instantiatedClasses: [helpers.jsBoolClass]);
-    }
-    return _boolValues;
+    return _boolValues ??=
+        new BackendImpact(instantiatedClasses: [helpers.jsBoolClass]);
   }
 
   BackendImpact _nullValue;
 
   BackendImpact get nullValue {
-    if (_nullValue == null) {
-      _nullValue =
-          new BackendImpact(instantiatedClasses: [helpers.jsNullClass]);
-    }
-    return _nullValue;
+    return _nullValue ??=
+        new BackendImpact(instantiatedClasses: [helpers.jsNullClass]);
   }
 
   BackendImpact _listValues;
 
   BackendImpact get listValues {
-    if (_listValues == null) {
-      _listValues = new BackendImpact(instantiatedClasses: [
-        helpers.jsArrayClass,
-        helpers.jsMutableArrayClass,
-        helpers.jsFixedArrayClass,
-        helpers.jsExtendableArrayClass,
-        helpers.jsUnmodifiableArrayClass
-      ]);
-    }
-    return _listValues;
+    return _listValues ??= new BackendImpact(globalClasses: [
+      helpers.jsArrayClass,
+      helpers.jsMutableArrayClass,
+      helpers.jsFixedArrayClass,
+      helpers.jsExtendableArrayClass,
+      helpers.jsUnmodifiableArrayClass
+    ]);
   }
 
   BackendImpact _throwRuntimeError;
 
   BackendImpact get throwRuntimeError {
-    if (_throwRuntimeError == null) {
-      _throwRuntimeError = new BackendImpact(staticUses: [
-        helpers.throwRuntimeError
-      ], otherImpacts: [
-        // Also register the types of the arguments passed to this method.
-        stringValues
-      ]);
-    }
-    return _throwRuntimeError;
+    return _throwRuntimeError ??= new BackendImpact(staticUses: [
+      helpers.throwRuntimeError
+    ], otherImpacts: [
+      // Also register the types of the arguments passed to this method.
+      stringValues
+    ]);
   }
 
   BackendImpact _superNoSuchMethod;
 
   BackendImpact get superNoSuchMethod {
-    if (_superNoSuchMethod == null) {
-      _superNoSuchMethod = new BackendImpact(staticUses: [
-        helpers.createInvocationMirror,
-        helpers.objectNoSuchMethod
-      ], otherImpacts: [
-        _needsInt(
-            'Needed to encode the invocation kind of super.noSuchMethod.'),
-        _needsList('Needed to encode the arguments of super.noSuchMethod.'),
-        _needsString('Needed to encode the name of super.noSuchMethod.')
-      ]);
-    }
-    return _superNoSuchMethod;
+    return _superNoSuchMethod ??= new BackendImpact(staticUses: [
+      helpers.createInvocationMirror,
+      helpers.objectNoSuchMethod
+    ], otherImpacts: [
+      _needsInt('Needed to encode the invocation kind of super.noSuchMethod.'),
+      _needsList('Needed to encode the arguments of super.noSuchMethod.'),
+      _needsString('Needed to encode the name of super.noSuchMethod.')
+    ]);
   }
 
   BackendImpact _constantMapLiteral;
@@ -317,22 +264,16 @@
   BackendImpact _symbolConstructor;
 
   BackendImpact get symbolConstructor {
-    if (_symbolConstructor == null) {
-      _symbolConstructor =
-          new BackendImpact(staticUses: [helpers.symbolValidatedConstructor]);
-    }
-    return _symbolConstructor;
+    return _symbolConstructor ??=
+        new BackendImpact(staticUses: [helpers.symbolValidatedConstructor]);
   }
 
   BackendImpact _constSymbol;
 
   BackendImpact get constSymbol {
-    if (_constSymbol == null) {
-      _constSymbol = new BackendImpact(
-          instantiatedClasses: [commonElements.symbolClass],
-          staticUses: [commonElements.symbolConstructor.declaration]);
-    }
-    return _constSymbol;
+    return _constSymbol ??= new BackendImpact(
+        instantiatedClasses: [commonElements.symbolClass],
+        staticUses: [commonElements.symbolConstructor.declaration]);
   }
 
   /// Helper for registering that `int` is needed.
@@ -356,52 +297,37 @@
   BackendImpact _assertWithoutMessage;
 
   BackendImpact get assertWithoutMessage {
-    if (_assertWithoutMessage == null) {
-      _assertWithoutMessage =
-          new BackendImpact(staticUses: [helpers.assertHelper]);
-    }
-    return _assertWithoutMessage;
+    return _assertWithoutMessage ??=
+        new BackendImpact(staticUses: [helpers.assertHelper]);
   }
 
   BackendImpact _assertWithMessage;
 
   BackendImpact get assertWithMessage {
-    if (_assertWithMessage == null) {
-      _assertWithMessage = new BackendImpact(
-          staticUses: [helpers.assertTest, helpers.assertThrow]);
-    }
-    return _assertWithMessage;
+    return _assertWithMessage ??= new BackendImpact(
+        staticUses: [helpers.assertTest, helpers.assertThrow]);
   }
 
   BackendImpact _asyncForIn;
 
   BackendImpact get asyncForIn {
-    if (_asyncForIn == null) {
-      _asyncForIn =
-          new BackendImpact(staticUses: [helpers.streamIteratorConstructor]);
-    }
-    return _asyncForIn;
+    return _asyncForIn ??=
+        new BackendImpact(staticUses: [helpers.streamIteratorConstructor]);
   }
 
   BackendImpact _stringInterpolation;
 
   BackendImpact get stringInterpolation {
-    if (_stringInterpolation == null) {
-      _stringInterpolation = new BackendImpact(
-          dynamicUses: [Selectors.toString_],
-          staticUses: [helpers.stringInterpolationHelper],
-          otherImpacts: [_needsString('Strings are created.')]);
-    }
-    return _stringInterpolation;
+    return _stringInterpolation ??= new BackendImpact(
+        dynamicUses: [Selectors.toString_],
+        staticUses: [helpers.stringInterpolationHelper],
+        otherImpacts: [_needsString('Strings are created.')]);
   }
 
   BackendImpact _stringJuxtaposition;
 
   BackendImpact get stringJuxtaposition {
-    if (_stringJuxtaposition == null) {
-      _stringJuxtaposition = _needsString('String.concat is used.');
-    }
-    return _stringJuxtaposition;
+    return _stringJuxtaposition ??= _needsString('String.concat is used.');
   }
 
   BackendImpact get nullLiteral => nullValue;
@@ -417,231 +343,368 @@
   BackendImpact _catchStatement;
 
   BackendImpact get catchStatement {
-    if (_catchStatement == null) {
-      _catchStatement = new BackendImpact(staticUses: [
-        helpers.exceptionUnwrapper
-      ], instantiatedClasses: [
-        helpers.jsPlainJavaScriptObjectClass,
-        helpers.jsUnknownJavaScriptObjectClass
-      ]);
-    }
-    return _catchStatement;
+    return _catchStatement ??= new BackendImpact(staticUses: [
+      helpers.exceptionUnwrapper
+    ], instantiatedClasses: [
+      helpers.jsPlainJavaScriptObjectClass,
+      helpers.jsUnknownJavaScriptObjectClass
+    ]);
   }
 
   BackendImpact _throwExpression;
 
   BackendImpact get throwExpression {
-    if (_throwExpression == null) {
-      _throwExpression = new BackendImpact(
-          // We don't know ahead of time whether we will need the throw in a
-          // statement context or an expression context, so we register both
-          // here, even though we may not need the throwExpression helper.
-          staticUses: [
-            helpers.wrapExceptionHelper,
-            helpers.throwExpressionHelper
-          ]);
-    }
-    return _throwExpression;
+    return _throwExpression ??= new BackendImpact(
+        // We don't know ahead of time whether we will need the throw in a
+        // statement context or an expression context, so we register both
+        // here, even though we may not need the throwExpression helper.
+        staticUses: [
+          helpers.wrapExceptionHelper,
+          helpers.throwExpressionHelper
+        ]);
   }
 
   BackendImpact _lazyField;
 
   BackendImpact get lazyField {
-    if (_lazyField == null) {
-      _lazyField = new BackendImpact(staticUses: [helpers.cyclicThrowHelper]);
-    }
-    return _lazyField;
+    return _lazyField ??=
+        new BackendImpact(staticUses: [helpers.cyclicThrowHelper]);
   }
 
   BackendImpact _typeLiteral;
 
   BackendImpact get typeLiteral {
-    if (_typeLiteral == null) {
-      _typeLiteral = new BackendImpact(
-          instantiatedClasses: [backend.backendClasses.typeImplementation],
-          staticUses: [helpers.createRuntimeType]);
-    }
-    return _typeLiteral;
+    return _typeLiteral ??= new BackendImpact(
+        instantiatedClasses: [backend.backendClasses.typeImplementation],
+        staticUses: [helpers.createRuntimeType]);
   }
 
   BackendImpact _stackTraceInCatch;
 
   BackendImpact get stackTraceInCatch {
-    if (_stackTraceInCatch == null) {
-      _stackTraceInCatch = new BackendImpact(
-          instantiatedClasses: [helpers.stackTraceClass],
-          staticUses: [helpers.traceFromException]);
-    }
-    return _stackTraceInCatch;
+    return _stackTraceInCatch ??= new BackendImpact(
+        instantiatedClasses: [helpers.stackTraceClass],
+        staticUses: [helpers.traceFromException]);
   }
 
   BackendImpact _syncForIn;
 
   BackendImpact get syncForIn {
-    if (_syncForIn == null) {
-      _syncForIn = new BackendImpact(
-          // The SSA builder recognizes certain for-in loops and can generate
-          // calls to throwConcurrentModificationError.
-          staticUses: [helpers.checkConcurrentModificationError]);
-    }
-    return _syncForIn;
+    return _syncForIn ??= new BackendImpact(
+        // The SSA builder recognizes certain for-in loops and can generate
+        // calls to throwConcurrentModificationError.
+        staticUses: [helpers.checkConcurrentModificationError]);
   }
 
   BackendImpact _typeVariableExpression;
 
   BackendImpact get typeVariableExpression {
-    if (_typeVariableExpression == null) {
-      _typeVariableExpression = new BackendImpact(staticUses: [
-        helpers.setRuntimeTypeInfo,
-        helpers.getRuntimeTypeInfo,
-        helpers.runtimeTypeToString,
-        helpers.createRuntimeType
-      ], otherImpacts: [
-        listValues,
-        getRuntimeTypeArgument,
-        _needsInt('Needed for accessing a type variable literal on this.')
-      ]);
-    }
-    return _typeVariableExpression;
+    return _typeVariableExpression ??= new BackendImpact(staticUses: [
+      helpers.setRuntimeTypeInfo,
+      helpers.getRuntimeTypeInfo,
+      helpers.runtimeTypeToString,
+      helpers.createRuntimeType
+    ], otherImpacts: [
+      listValues,
+      getRuntimeTypeArgument,
+      _needsInt('Needed for accessing a type variable literal on this.')
+    ]);
   }
 
   BackendImpact _typeCheck;
 
   BackendImpact get typeCheck {
-    if (_typeCheck == null) {
-      _typeCheck = new BackendImpact(otherImpacts: [boolValues]);
-    }
-    return _typeCheck;
+    return _typeCheck ??= new BackendImpact(otherImpacts: [boolValues]);
   }
 
   BackendImpact _checkedModeTypeCheck;
 
   BackendImpact get checkedModeTypeCheck {
-    if (_checkedModeTypeCheck == null) {
-      _checkedModeTypeCheck =
-          new BackendImpact(staticUses: [helpers.throwRuntimeError]);
-    }
-    return _checkedModeTypeCheck;
+    return _checkedModeTypeCheck ??=
+        new BackendImpact(staticUses: [helpers.throwRuntimeError]);
   }
 
   BackendImpact _malformedTypeCheck;
 
   BackendImpact get malformedTypeCheck {
-    if (_malformedTypeCheck == null) {
-      _malformedTypeCheck =
-          new BackendImpact(staticUses: [helpers.throwTypeError]);
-    }
-    return _malformedTypeCheck;
+    return _malformedTypeCheck ??=
+        new BackendImpact(staticUses: [helpers.throwTypeError]);
   }
 
   BackendImpact _genericTypeCheck;
 
   BackendImpact get genericTypeCheck {
-    if (_genericTypeCheck == null) {
-      _genericTypeCheck = new BackendImpact(staticUses: [
-        helpers.checkSubtype,
-        // TODO(johnniwinther): Investigate why this is needed.
-        helpers.setRuntimeTypeInfo,
-        helpers.getRuntimeTypeInfo
-      ], otherImpacts: [
-        listValues,
-        getRuntimeTypeArgument
-      ]);
-    }
-    return _genericTypeCheck;
+    return _genericTypeCheck ??= new BackendImpact(staticUses: [
+      helpers.checkSubtype,
+      // TODO(johnniwinther): Investigate why this is needed.
+      helpers.setRuntimeTypeInfo,
+      helpers.getRuntimeTypeInfo
+    ], otherImpacts: [
+      listValues,
+      getRuntimeTypeArgument
+    ]);
   }
 
   BackendImpact _genericIsCheck;
 
   BackendImpact get genericIsCheck {
-    if (_genericIsCheck == null) {
-      _genericIsCheck = new BackendImpact(otherImpacts: [intValues]);
-    }
-    return _genericIsCheck;
+    return _genericIsCheck ??= new BackendImpact(otherImpacts: [intValues]);
   }
 
   BackendImpact _genericCheckedModeTypeCheck;
 
   BackendImpact get genericCheckedModeTypeCheck {
-    if (_genericCheckedModeTypeCheck == null) {
-      _genericCheckedModeTypeCheck =
-          new BackendImpact(staticUses: [helpers.assertSubtype]);
-    }
-    return _genericCheckedModeTypeCheck;
+    return _genericCheckedModeTypeCheck ??=
+        new BackendImpact(staticUses: [helpers.assertSubtype]);
   }
 
   BackendImpact _typeVariableTypeCheck;
 
   BackendImpact get typeVariableTypeCheck {
-    if (_typeVariableTypeCheck == null) {
-      _typeVariableTypeCheck =
-          new BackendImpact(staticUses: [helpers.checkSubtypeOfRuntimeType]);
-    }
-    return _typeVariableTypeCheck;
+    return _typeVariableTypeCheck ??=
+        new BackendImpact(staticUses: [helpers.checkSubtypeOfRuntimeType]);
   }
 
   BackendImpact _typeVariableCheckedModeTypeCheck;
 
   BackendImpact get typeVariableCheckedModeTypeCheck {
-    if (_typeVariableCheckedModeTypeCheck == null) {
-      _typeVariableCheckedModeTypeCheck =
-          new BackendImpact(staticUses: [helpers.assertSubtypeOfRuntimeType]);
-    }
-    return _typeVariableCheckedModeTypeCheck;
+    return _typeVariableCheckedModeTypeCheck ??=
+        new BackendImpact(staticUses: [helpers.assertSubtypeOfRuntimeType]);
   }
 
   BackendImpact _functionTypeCheck;
 
   BackendImpact get functionTypeCheck {
-    if (_functionTypeCheck == null) {
-      _functionTypeCheck =
-          new BackendImpact(staticUses: [helpers.functionTypeTestMetaHelper]);
-    }
-    return _functionTypeCheck;
+    return _functionTypeCheck ??=
+        new BackendImpact(staticUses: [helpers.functionTypeTestMetaHelper]);
   }
 
   BackendImpact _nativeTypeCheck;
 
   BackendImpact get nativeTypeCheck {
-    if (_nativeTypeCheck == null) {
-      _nativeTypeCheck = new BackendImpact(staticUses: [
-        // We will neeed to add the "$is" and "$as" properties on the
-        // JavaScript object prototype, so we make sure
-        // [:defineProperty:] is compiled.
-        helpers.defineProperty
-      ]);
-    }
-    return _nativeTypeCheck;
+    return _nativeTypeCheck ??= new BackendImpact(staticUses: [
+      // We will neeed to add the "$is" and "$as" properties on the
+      // JavaScript object prototype, so we make sure
+      // [:defineProperty:] is compiled.
+      helpers.defineProperty
+    ]);
   }
 
   BackendImpact _closure;
 
   BackendImpact get closure {
-    if (_closure == null) {
-      _closure = new BackendImpact(
-          instantiatedClasses: [commonElements.functionClass]);
-    }
-    return _closure;
+    return _closure ??=
+        new BackendImpact(instantiatedClasses: [commonElements.functionClass]);
   }
 
   BackendImpact _interceptorUse;
 
   BackendImpact get interceptorUse {
-    if (_interceptorUse == null) {
-      _interceptorUse = new BackendImpact(
-          staticUses: [
-            helpers.getNativeInterceptorMethod
-          ],
-          instantiatedClasses: [
-            helpers.jsJavaScriptObjectClass,
-            helpers.jsPlainJavaScriptObjectClass,
-            helpers.jsJavaScriptFunctionClass
-          ],
-          features: new EnumSet<BackendFeature>.fromValues([
-            BackendFeature.needToInitializeDispatchProperty,
-            BackendFeature.needToInitializeIsolateAffinityTag
-          ], fixed: true));
-    }
-    return _interceptorUse;
+    return _interceptorUse ??= new BackendImpact(
+        staticUses: [
+          helpers.getNativeInterceptorMethod
+        ],
+        instantiatedClasses: [
+          helpers.jsJavaScriptObjectClass,
+          helpers.jsPlainJavaScriptObjectClass,
+          helpers.jsJavaScriptFunctionClass
+        ],
+        features: new EnumSet<BackendFeature>.fromValues([
+          BackendFeature.needToInitializeDispatchProperty,
+          BackendFeature.needToInitializeIsolateAffinityTag
+        ], fixed: true));
+  }
+
+  BackendImpact _numClasses;
+
+  BackendImpact get numClasses {
+    return _numClasses ??= new BackendImpact(
+        // The backend will try to optimize number operations and use the
+        // `iae` helper directly.
+        globalUses: [helpers.throwIllegalArgumentException]);
+  }
+
+  BackendImpact _listOrStringClasses;
+
+  BackendImpact get listOrStringClasses {
+    return _listOrStringClasses ??= new BackendImpact(
+        // The backend will try to optimize array and string access and use the
+        // `ioore` and `iae` helpers directly.
+        globalUses: [
+          helpers.throwIndexOutOfRangeException,
+          helpers.throwIllegalArgumentException
+        ]);
+  }
+
+  BackendImpact _functionClass;
+
+  BackendImpact get functionClass {
+    return _functionClass ??=
+        new BackendImpact(globalClasses: [helpers.closureClass]);
+  }
+
+  BackendImpact _mapClass;
+
+  BackendImpact get mapClass {
+    return _mapClass ??= new BackendImpact(
+        // The backend will use a literal list to initialize the entries
+        // of the map.
+        globalClasses: [
+          helpers.coreClasses.listClass,
+          helpers.mapLiteralClass
+        ]);
+  }
+
+  BackendImpact _boundClosureClass;
+
+  BackendImpact get boundClosureClass {
+    return _boundClosureClass ??=
+        new BackendImpact(globalClasses: [helpers.boundClosureClass]);
+  }
+
+  BackendImpact _nativeOrExtendsClass;
+
+  BackendImpact get nativeOrExtendsClass {
+    return _nativeOrExtendsClass ??= new BackendImpact(globalUses: [
+      helpers.getNativeInterceptorMethod
+    ], globalClasses: [
+      helpers.jsInterceptorClass,
+      helpers.jsJavaScriptObjectClass,
+      helpers.jsPlainJavaScriptObjectClass,
+      helpers.jsJavaScriptFunctionClass
+    ]);
+  }
+
+  BackendImpact _mapLiteralClass;
+
+  BackendImpact get mapLiteralClass {
+    return _mapLiteralClass ??= new BackendImpact(globalUses: [
+      helpers.mapLiteralConstructor,
+      helpers.mapLiteralConstructorEmpty,
+      helpers.mapLiteralUntypedMaker,
+      helpers.mapLiteralUntypedEmptyMaker
+    ]);
+  }
+
+  BackendImpact _closureClass;
+
+  BackendImpact get closureClass {
+    return _closureClass ??=
+        new BackendImpact(globalUses: [helpers.closureFromTearOff]);
+  }
+
+  BackendImpact _listClasses;
+
+  BackendImpact get listClasses {
+    return _listClasses ??= new BackendImpact(
+        // Literal lists can be translated into calls to these functions:
+        globalUses: [
+          helpers.jsArrayTypedConstructor,
+          helpers.setRuntimeTypeInfo,
+          helpers.getTypeArgumentByIndex
+        ]);
+  }
+
+  BackendImpact _jsIndexingBehavior;
+
+  BackendImpact get jsIndexingBehavior {
+    return _jsIndexingBehavior ??= new BackendImpact(
+        // These two helpers are used by the emitter and the codegen.
+        // Because we cannot enqueue elements at the time of emission,
+        // we make sure they are always generated.
+        globalUses: [helpers.isJsIndexable]);
+  }
+
+  BackendImpact _enableTypeAssertions;
+
+  BackendImpact get enableTypeAssertions {
+    return _enableTypeAssertions ??= new BackendImpact(
+        // Register the helper that checks if the expression in an if/while/for
+        // is a boolean.
+        // TODO(johnniwinther): Should this be registered through a [Feature]
+        // instead?
+        globalUses: [helpers.boolConversionCheck]);
+  }
+
+  BackendImpact _traceHelper;
+
+  BackendImpact get traceHelper {
+    return _traceHelper ??=
+        new BackendImpact(globalUses: [helpers.traceHelper]);
+  }
+
+  BackendImpact _assertUnreachable;
+
+  BackendImpact get assertUnreachable {
+    return _assertUnreachable ??=
+        new BackendImpact(globalUses: [helpers.assertUnreachableMethod]);
+  }
+
+  BackendImpact _runtimeTypeSupport;
+
+  BackendImpact get runtimeTypeSupport {
+    return _runtimeTypeSupport ??= new BackendImpact(
+        globalClasses: [helpers.coreClasses.listClass],
+        globalUses: [helpers.setRuntimeTypeInfo, helpers.getRuntimeTypeInfo],
+        otherImpacts: [getRuntimeTypeArgument, computeSignature]);
+  }
+
+  BackendImpact _deferredLoading;
+
+  BackendImpact get deferredLoading {
+    return _deferredLoading ??=
+        new BackendImpact(globalUses: [helpers.checkDeferredIsLoaded],
+            // Also register the types of the arguments passed to this method.
+            globalClasses: [helpers.coreClasses.stringClass]);
+  }
+
+  BackendImpact _noSuchMethodSupport;
+
+  BackendImpact get noSuchMethodSupport {
+    return _noSuchMethodSupport ??= new BackendImpact(
+        staticUses: [helpers.createInvocationMirror],
+        dynamicUses: [Selectors.noSuchMethod_]);
+  }
+
+  BackendImpact _isolateSupport;
+
+  /// Backend impact for isolate support.
+  BackendImpact get isolateSupport {
+    return _isolateSupport ??=
+        new BackendImpact(globalUses: [helpers.startRootIsolate]);
+  }
+
+  BackendImpact _isolateSupportForResolution;
+
+  /// Additional backend impact for isolate support in resolution.
+  BackendImpact get isolateSupportForResolution {
+    return _isolateSupportForResolution ??= new BackendImpact(
+        globalUses: [helpers.currentIsolate, helpers.callInIsolate]);
+  }
+
+  BackendImpact _loadLibrary;
+
+  /// Backend impact for accessing a `loadLibrary` function on a deferred
+  /// prefix.
+  BackendImpact get loadLibrary {
+    return _loadLibrary ??=
+        new BackendImpact(globalUses: [helpers.loadLibraryWrapper]);
+  }
+
+  BackendImpact _memberClosure;
+
+  /// Backend impact for performing member closurization.
+  BackendImpact get memberClosure {
+    return _memberClosure ??=
+        new BackendImpact(globalClasses: [helpers.boundClosureClass]);
+  }
+
+  BackendImpact _staticClosure;
+
+  /// Backend impact for performing closurization of a top-level or static
+  /// function.
+  BackendImpact get staticClosure {
+    return _staticClosure ??=
+        new BackendImpact(globalClasses: [helpers.closureClass]);
   }
 }
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 07c1f06..c0b028c 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -43,7 +43,7 @@
 import '../world.dart';
 
 /// [Enqueuer] which is specific to code generation.
-class CodegenEnqueuer implements Enqueuer {
+class CodegenEnqueuer extends EnqueuerImpl {
   final String name;
   @deprecated
   final Compiler _compiler; // TODO(ahe): Remove this dependency.
@@ -70,7 +70,7 @@
         nativeEnqueuer = compiler.backend.nativeCodegenEnqueuer(),
         this.name = 'codegen enqueuer',
         this._compiler = compiler {
-    impactVisitor = new _EnqueuerImpactVisitor(this);
+    impactVisitor = new EnqueuerImplImpactVisitor(this);
   }
 
   CodegenWorldBuilder get universe => _universe;
@@ -86,8 +86,6 @@
   /// Returns [:true:] if this enqueuer is the resolution enqueuer.
   bool get isResolutionQueue => false;
 
-  QueueFilter get filter => _compiler.enqueuerFilter;
-
   DiagnosticReporter get reporter => _compiler.reporter;
 
   /**
@@ -116,15 +114,15 @@
       throw new SpannableAssertionFailure(
           element, "Codegen work list is closed. Trying to add $element");
     }
-    queue.add(new CodegenWorkItem(_compiler, element));
+    queue.add(new CodegenWorkItem(backend, element));
     // TODO(sigmund): add other missing dependencies (internals, selectors
     // enqueued after allocations).
     _compiler.dumpInfoTask
         .registerDependency(_compiler.currentElement, element);
   }
 
-  void applyImpact(ImpactStrategy impactStrategy, WorldImpact worldImpact,
-      {Element impactSource}) {
+  void applyImpact(WorldImpact worldImpact, {Element impactSource}) {
+    if (worldImpact.isEmpty) return;
     impactStrategy.visitImpact(
         impactSource, worldImpact, impactVisitor, impactUse);
   }
@@ -141,7 +139,8 @@
       _universe.registerTypeInstantiation(type,
           isNative: isNative,
           byMirrors: mirrorUsage, onImplemented: (ClassElement cls) {
-        backend.registerImplementedClass(cls, this);
+        applyImpact(
+            backend.registerImplementedClass(cls, forResolution: false));
       });
       if (nativeUsage) {
         nativeEnqueuer.onInstantiatedType(type);
@@ -155,7 +154,7 @@
   }
 
   bool checkNoEnqueuedInvokedInstanceMethods() {
-    return filter.checkNoEnqueuedInvokedInstanceMethods(this);
+    return strategy.checkEnqueuerConsistency(this);
   }
 
   void processInstantiatedClassMembers(ClassElement cls) {
@@ -272,7 +271,8 @@
         // We only tell the backend once that [superclass] was instantiated, so
         // any additional dependencies must be treated as global
         // dependencies.
-        backend.registerInstantiatedClass(superclass, this);
+        applyImpact(backend.registerInstantiatedClass(superclass,
+            forResolution: false));
       }
 
       ClassElement superclass = cls;
@@ -356,11 +356,11 @@
     assert(invariant(element, element.isDeclaration,
         message: "Element ${element} is not the declaration."));
     _universe.registerStaticUse(staticUse);
-    backend.registerStaticUse(this, element);
+    applyImpact(backend.registerStaticUse(element, forResolution: false));
     bool addElement = true;
     switch (staticUse.kind) {
       case StaticUseKind.STATIC_TEAR_OFF:
-        backend.registerGetOfStaticFunction(this);
+        applyImpact(backend.registerGetOfStaticFunction());
         break;
       case StaticUseKind.FIELD_GET:
       case StaticUseKind.FIELD_SET:
@@ -374,11 +374,12 @@
       case StaticUseKind.SUPER_FIELD_SET:
       case StaticUseKind.SUPER_TEAR_OFF:
       case StaticUseKind.GENERAL:
+      case StaticUseKind.DIRECT_USE:
         break;
       case StaticUseKind.CONSTRUCTOR_INVOKE:
       case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
       case StaticUseKind.REDIRECTION:
-        registerTypeUse(new TypeUse.instantiation(staticUse.type));
+        registerTypeUseInternal(new TypeUse.instantiation(staticUse.type));
         break;
       case StaticUseKind.DIRECT_INVOKE:
         _registerInstanceMethod(staticUse.element);
@@ -390,6 +391,10 @@
   }
 
   void registerTypeUse(TypeUse typeUse) {
+    strategy.processTypeUse(this, typeUse);
+  }
+
+  void registerTypeUseInternal(TypeUse typeUse) {
     DartType type = typeUse.type;
     switch (typeUse.kind) {
       case TypeUseKind.INSTANTIATION:
@@ -425,22 +430,29 @@
   }
 
   void registerCallMethodWithFreeTypeVariables(Element element) {
-    backend.registerCallMethodWithFreeTypeVariables(element, this);
+    applyImpact(backend.registerCallMethodWithFreeTypeVariables(element,
+        forResolution: false));
   }
 
   void registerClosurizedMember(TypedElement element) {
     assert(element.isInstanceMember);
     if (element.type.containsTypeVariables) {
-      backend.registerClosureWithFreeTypeVariables(element, this);
+      applyImpact(backend.registerClosureWithFreeTypeVariables(element,
+          forResolution: false));
     }
-    backend.registerBoundClosure(this);
+    applyImpact(backend.registerBoundClosure());
   }
 
   void forEach(void f(WorkItem work)) {
     do {
       while (queue.isNotEmpty) {
         // TODO(johnniwinther): Find an optimal process order.
-        filter.processWorkItem(f, queue.removeLast());
+        WorkItem work = queue.removeLast();
+        if (!isProcessed(work.element)) {
+          strategy.processWorkItem(f, work);
+          // TODO(johnniwinther): Register the processed element here. This
+          // is currently a side-effect of calling `work.run`.
+        }
       }
       List recents = recentClasses.toList(growable: false);
       recentClasses.clear();
@@ -491,7 +503,7 @@
 
   void registerNoSuchMethod(Element element) {
     if (!enabledNoSuchMethod && backend.enabledNoSuchMethod) {
-      backend.enableNoSuchMethod(this);
+      applyImpact(backend.enableNoSuchMethod());
       enabledNoSuchMethod = true;
     }
   }
@@ -531,24 +543,3 @@
   if (set == null) return;
   set.remove(element);
 }
-
-class _EnqueuerImpactVisitor implements WorldImpactVisitor {
-  final CodegenEnqueuer enqueuer;
-
-  _EnqueuerImpactVisitor(this.enqueuer);
-
-  @override
-  void visitDynamicUse(DynamicUse dynamicUse) {
-    enqueuer.registerDynamicUse(dynamicUse);
-  }
-
-  @override
-  void visitStaticUse(StaticUse staticUse) {
-    enqueuer.registerStaticUse(staticUse);
-  }
-
-  @override
-  void visitTypeUse(TypeUse typeUse) {
-    enqueuer.registerTypeUse(typeUse);
-  }
-}
diff --git a/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart b/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
index fec60e3..4a51239 100644
--- a/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
@@ -21,7 +21,7 @@
 import '../dart_types.dart' show InterfaceType;
 import '../elements/elements.dart'
     show ClassElement, FieldElement, LibraryElement, VariableElement;
-import '../enqueue.dart';
+import '../universe/use.dart' show StaticUse;
 import '../universe/world_impact.dart'
     show WorldImpact, StagedWorldImpactBuilder;
 import 'js_backend.dart' show JavaScriptBackend;
@@ -120,7 +120,10 @@
   /// entry with that key.
   final _pending = <ConstantValue, List<_LookupMapInfo>>{};
 
-  final StagedWorldImpactBuilder impactBuilder = new StagedWorldImpactBuilder();
+  final StagedWorldImpactBuilder impactBuilderForResolution =
+      new StagedWorldImpactBuilder();
+  final StagedWorldImpactBuilder impactBuilderForCodegen =
+      new StagedWorldImpactBuilder();
 
   /// Whether the backend is currently processing the codegen queue.
   bool _inCodegen = false;
@@ -129,8 +132,11 @@
 
   /// Compute the [WorldImpact] for the constants registered since last flush.
   WorldImpact flush({bool forResolution}) {
-    if (forResolution) return const WorldImpact();
-    return impactBuilder.flush();
+    if (forResolution) {
+      return impactBuilderForResolution.flush();
+    } else {
+      return impactBuilderForCodegen.flush();
+    }
   }
 
   /// Whether this analysis and optimization is enabled.
@@ -151,8 +157,8 @@
       reporter.reportInfo(
           library, MessageKind.UNRECOGNIZED_VERSION_OF_LOOKUP_MAP);
     } else {
-      backend.compiler.enqueuer.resolution
-          .addToWorkList(lookupMapVersionVariable);
+      impactBuilderForResolution.registerStaticUse(
+          new StaticUse.foreignUse(lookupMapVersionVariable));
     }
   }
 
@@ -277,7 +283,8 @@
         // type_lookup_map/generic_type_test
         // TODO(sigmund): can we get rid of this?
         backend.computeImpactForInstantiatedConstantType(
-            backend.backendClasses.typeImplementation.rawType, impactBuilder);
+            backend.backendClasses.typeImplementation.rawType,
+            impactBuilderForCodegen);
         _addGenerics(arg);
       }
     }
@@ -418,7 +425,7 @@
     ConstantValue constant = unusedEntries.remove(key);
     usedEntries[key] = constant;
     analysis.backend.computeImpactForCompileTimeConstant(
-        constant, analysis.impactBuilder, false);
+        constant, analysis.impactBuilderForCodegen, false);
   }
 
   /// Restores [original] to contain all of the entries marked as possibly used.
diff --git a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
index ff8822d..a32a3b5 100644
--- a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
+++ b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
@@ -44,9 +44,13 @@
   Map<TypeVariableElement, jsAst.Expression> _typeVariableConstants =
       new Map<TypeVariableElement, jsAst.Expression>();
 
+  /// Impact builder used for the resolution world computation.
+  final StagedWorldImpactBuilder impactBuilderForResolution =
+      new StagedWorldImpactBuilder();
+
   /// Impact builder used for the codegen world computation.
-  // TODO(johnniwinther): Add impact builder for resolution.
-  final StagedWorldImpactBuilder impactBuilder = new StagedWorldImpactBuilder();
+  final StagedWorldImpactBuilder impactBuilderForCodegen =
+      new StagedWorldImpactBuilder();
 
   TypeVariableHandler(this._compiler);
 
@@ -59,16 +63,18 @@
   /// Compute the [WorldImpact] for the type variables registered since last
   /// flush.
   WorldImpact flush({bool forResolution}) {
-    if (forResolution) return const WorldImpact();
-    return impactBuilder.flush();
+    if (forResolution) {
+      return impactBuilderForResolution.flush();
+    } else {
+      return impactBuilderForCodegen.flush();
+    }
   }
 
-  void registerClassWithTypeVariables(ClassElement cls, Enqueuer enqueuer) {
-    if (enqueuer.isResolutionQueue) {
+  void registerClassWithTypeVariables(ClassElement cls, {bool forResolution}) {
+    if (forResolution) {
       // On first encounter, we have to ensure that the support classes get
       // resolved.
       if (!_seenClassesWithTypeVariables) {
-        _backend.enqueueClass(enqueuer, _typeVariableClass);
         _typeVariableClass.ensureResolved(_compiler.resolution);
         Link constructors = _typeVariableClass.constructors;
         if (constructors.isEmpty && constructors.tail.isEmpty) {
@@ -76,11 +82,12 @@
               "Class '$_typeVariableClass' should only have one constructor");
         }
         _typeVariableConstructor = _typeVariableClass.constructors.head;
-        _backend.enqueue(enqueuer, _typeVariableConstructor);
-        enqueuer.registerInstantiatedType(_typeVariableClass.rawType);
-        enqueuer.registerStaticUse(new StaticUse.staticInvoke(
-            _backend.registerBackendUse(_backend.helpers.createRuntimeType),
-            CallStructure.ONE_ARG));
+        _backend.impactTransformer.registerBackendStaticUse(
+            impactBuilderForResolution, _typeVariableConstructor);
+        _backend.impactTransformer.registerBackendInstantiation(
+            impactBuilderForResolution, _typeVariableClass);
+        _backend.impactTransformer.registerBackendStaticUse(
+            impactBuilderForResolution, _backend.helpers.createRuntimeType);
         _seenClassesWithTypeVariables = true;
       }
     } else {
@@ -117,7 +124,8 @@
 
       _backend.constants.evaluate(constant);
       ConstantValue value = _backend.constants.getConstantValue(constant);
-      _backend.computeImpactForCompileTimeConstant(value, impactBuilder, false);
+      _backend.computeImpactForCompileTimeConstant(
+          value, impactBuilderForCodegen, false);
       _backend.addCompileTimeConstantForEmission(value);
       constants
           .add(_reifyTypeVariableConstant(value, currentTypeVariable.element));
diff --git a/pkg/compiler/lib/src/kernel/kernel.dart b/pkg/compiler/lib/src/kernel/kernel.dart
index 3bcad71..1210501 100644
--- a/pkg/compiler/lib/src/kernel/kernel.dart
+++ b/pkg/compiler/lib/src/kernel/kernel.dart
@@ -409,7 +409,7 @@
     }
     function = function.declaration;
     return functions.putIfAbsent(function, () {
-      compiler.analyzeElement(function);
+      compiler.resolution.ensureResolved(function);
       compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
       function = function.implementation;
       ir.Member member;
@@ -507,7 +507,7 @@
     }
     field = field.declaration;
     return fields.putIfAbsent(field, () {
-      compiler.analyzeElement(field);
+      compiler.resolution.ensureResolved(field);
       compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
       field = field.implementation;
       ir.DartType type =
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index ce40fd0..3784bd9 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -36,6 +36,9 @@
 
   ResolutionWorldImpactBuilder(this.name);
 
+  @override
+  bool get isEmpty => false;
+
   void registerMapLiteral(MapLiteralUse mapLiteralUse) {
     assert(mapLiteralUse != null);
     if (_mapLiterals == null) {
diff --git a/pkg/compiler/lib/src/serialization/impact_serialization.dart b/pkg/compiler/lib/src/serialization/impact_serialization.dart
index c6ce258..90c1570 100644
--- a/pkg/compiler/lib/src/serialization/impact_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/impact_serialization.dart
@@ -116,6 +116,9 @@
       this.nativeData: const <dynamic>[]})
       : this._features = features;
 
+  @override
+  bool get isEmpty => false;
+
   Iterable<Feature> get features {
     return _features != null
         ? _features.iterable(Feature.values)
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index 5bfae8b..acad224 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -138,17 +138,11 @@
 class DeserializedResolutionWorkItem implements ResolutionWorkItem {
   final Element element;
   final WorldImpact worldImpact;
-  bool _isAnalyzed = false;
 
   DeserializedResolutionWorkItem(this.element, this.worldImpact);
 
   @override
-  bool get isAnalyzed => _isAnalyzed;
-
-  @override
-  WorldImpact run(Compiler compiler, ResolutionEnqueuer world) {
-    _isAnalyzed = true;
-    world.registerProcessedElement(element);
+  WorldImpact run() {
     return worldImpact;
   }
 }
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 8bb5e0b..2fee721 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -407,10 +407,8 @@
   bool tryInlineMethod(Element element, Selector selector, TypeMask mask,
       List<HInstruction> providedArguments, ast.Node currentNode,
       {InterfaceType instanceType}) {
-    // TODO(johnniwinther): Register this on the [registry]. Currently the
-    // [CodegenRegistry] calls the enqueuer, but [element] should _not_ be
-    // enqueued.
-    backend.registerStaticUse(compiler.enqueuer.codegen, element);
+    registry
+        .addImpact(backend.registerStaticUse(element, forResolution: false));
 
     if (backend.isJsInterop(element) && !element.isFactoryConstructor) {
       // We only inline factory JavaScript interop constructors.
@@ -1497,23 +1495,23 @@
 
   insertTraceCall(Element element) {
     if (JavaScriptBackend.TRACE_METHOD == 'console') {
-      if (element == backend.traceHelper) return;
+      if (element == backend.helpers.traceHelper) return;
       n(e) => e == null ? '' : e.name;
       String name = "${n(element.library)}:${n(element.enclosingClass)}."
           "${n(element)}";
       HConstant nameConstant = addConstantString(name);
-      add(new HInvokeStatic(backend.traceHelper, <HInstruction>[nameConstant],
-          backend.dynamicType));
+      add(new HInvokeStatic(backend.helpers.traceHelper,
+          <HInstruction>[nameConstant], backend.dynamicType));
     }
   }
 
   insertCoverageCall(Element element) {
     if (JavaScriptBackend.TRACE_METHOD == 'post') {
-      if (element == backend.traceHelper) return;
+      if (element == backend.helpers.traceHelper) return;
       // TODO(sigmund): create a better uuid for elements.
       HConstant idConstant = graph.addConstantInt(element.hashCode, compiler);
       HConstant nameConstant = addConstantString(element.name);
-      add(new HInvokeStatic(backend.traceHelper,
+      add(new HInvokeStatic(backend.helpers.traceHelper,
           <HInstruction>[idConstant, nameConstant], backend.dynamicType));
     }
   }
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 3addf4b..c05772e 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -28,7 +28,7 @@
 import '../types/masks.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/selector.dart';
-import '../universe/use.dart' show TypeUse;
+import '../universe/use.dart' show StaticUse, TypeUse;
 import '../universe/side_effects.dart' show SideEffects;
 import 'graph_builder.dart';
 import 'kernel_ast_adapter.dart';
@@ -671,6 +671,41 @@
   }
 
   @override
+  void visitAsExpression(ir.AsExpression asExpression) {
+    asExpression.operand.accept(this);
+    HInstruction expressionInstruction = pop();
+    DartType type = astAdapter.getDartType(asExpression.type);
+    if (type.isMalformed) {
+      if (type is MalformedType) {
+        ErroneousElement element = type.element;
+        generateTypeError(asExpression, element.message);
+      } else {
+        assert(type is MethodTypeVariableType);
+        stack.add(expressionInstruction);
+      }
+    } else {
+      HInstruction converted = typeBuilder.buildTypeConversion(
+          expressionInstruction,
+          localsHandler.substInContext(type),
+          HTypeConversion.CAST_TYPE_CHECK);
+      if (converted != expressionInstruction) {
+        add(converted);
+      }
+      stack.add(converted);
+    }
+  }
+
+  void generateError(ir.Node node, String message, TypeMask typeMask) {
+    HInstruction errorMessage =
+        graph.addConstantString(new DartString.literal(message), compiler);
+    _pushStaticInvocation(node, [errorMessage], typeMask);
+  }
+
+  void generateTypeError(ir.Node node, String message) {
+    generateError(node, message, astAdapter.throwTypeErrorType);
+  }
+
+  @override
   void visitAssertStatement(ir.AssertStatement assertStatement) {
     if (!compiler.options.enableUserAssertions) return;
     if (assertStatement.message == null) {
@@ -1191,31 +1226,6 @@
       }
       _pushStaticInvocation(target, <HInstruction>[], backend.dynamicType);
     }
-
-    /*
-    if (!node.arguments.isEmpty) {
-      reporter.internalError(
-          node, 'Too many arguments to JS_CURRENT_ISOLATE_CONTEXT.');
-    }
-
-    if (!compiler.hasIsolateSupport) {
-      // If the isolate library is not used, we just generate code
-      // to fetch the static state.
-      String name = backend.namer.staticStateHolder;
-      push(new HForeignCode(
-          js.js.parseForeignJS(name), backend.dynamicType, <HInstruction>[],
-          nativeBehavior: native.NativeBehavior.DEPENDS_OTHER));
-    } else {
-      // Call a helper method from the isolate library. The isolate
-      // library uses its own isolate structure, that encapsulates
-      // Leg's isolate.
-      Element element = helpers.currentIsolate;
-      if (element == null) {
-        reporter.internalError(node, 'Isolate library and compiler mismatch.');
-      }
-      pushInvokeStatic(null, element, [], typeMask: backend.dynamicType);
-    }
-    */
   }
 
   void handleForeignJsCallInIsolate(ir.StaticInvocation invocation) {
@@ -1224,12 +1234,48 @@
 
   void handleForeignDartClosureToJs(
       ir.StaticInvocation invocation, String name) {
-    unhandledForeign(invocation);
+    // TODO(sra): Do we need to wrap the closure in something that saves the
+    // current isolate?
+    handleForeignRawFunctionRef(invocation, name);
   }
 
   void handleForeignRawFunctionRef(
       ir.StaticInvocation invocation, String name) {
-    unhandledForeign(invocation);
+    if (_unexpectedForeignArguments(invocation, 1, 1)) {
+      stack.add(graph.addConstantNull(compiler)); // Result expected on stack.
+      return;
+    }
+
+    ir.Expression closure = invocation.arguments.positional.single;
+    String problem = 'requires a static method or top-level method';
+    if (closure is ir.StaticGet) {
+      ir.Member staticTarget = closure.target;
+      if (staticTarget is ir.Procedure) {
+        if (staticTarget.kind == ir.ProcedureKind.Method) {
+          ir.FunctionNode function = staticTarget.function;
+          if (function != null &&
+              function.requiredParameterCount ==
+                  function.positionalParameters.length &&
+              function.namedParameters.isEmpty) {
+            registry?.registerStaticUse(
+                new StaticUse.foreignUse(astAdapter.getMember(staticTarget)));
+            push(new HForeignCode(
+                js.js.expressionTemplateYielding(backend.emitter
+                    .staticFunctionAccess(astAdapter.getMember(staticTarget))),
+                backend.dynamicType,
+                <HInstruction>[],
+                nativeBehavior: native.NativeBehavior.PURE));
+            return;
+          }
+          problem = 'does not handle a closure with optional parameters';
+        }
+      }
+    }
+
+    compiler.reporter.reportErrorMessage(astAdapter.getNode(invocation),
+        MessageKind.GENERIC, {'text': "'$name' $problem."});
+    stack.add(graph.addConstantNull(compiler)); // Result expected on stack.
+    return;
   }
 
   void handleForeignJsSetStaticState(ir.StaticInvocation invocation) {
@@ -1487,6 +1533,9 @@
   // TODO(het): Decide when to inline
   @override
   void visitMethodInvocation(ir.MethodInvocation invocation) {
+    // Handle `x == null` specially. When these come from null-aware operators,
+    // there is no mapping in the astAdapter.
+    if (_handleEqualsNull(invocation)) return;
     invocation.receiver.accept(this);
     HInstruction receiver = pop();
 
@@ -1497,6 +1546,27 @@
           ..addAll(_visitArguments(invocation.arguments)));
   }
 
+  bool _handleEqualsNull(ir.MethodInvocation invocation) {
+    if (invocation.name.name == '==') {
+      ir.Arguments arguments = invocation.arguments;
+      if (arguments.types.isEmpty &&
+          arguments.positional.length == 1 &&
+          arguments.named.isEmpty) {
+        bool finish(ir.Expression comparand) {
+          comparand.accept(this);
+          pushCheckNull(pop());
+          return true;
+        }
+
+        ir.Expression receiver = invocation.receiver;
+        ir.Expression argument = arguments.positional.first;
+        if (argument is ir.NullLiteral) return finish(receiver);
+        if (receiver is ir.NullLiteral) return finish(argument);
+      }
+    }
+    return false;
+  }
+
   HInterceptor _interceptorFor(HInstruction intercepted) {
     HInterceptor interceptor =
         new HInterceptor(intercepted, backend.nonNullType);
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index 6d8943d..07c515c 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -318,6 +318,9 @@
   ir.Procedure get assertHelper =>
       kernel.functions[_backend.helpers.assertHelper];
 
+  TypeMask get throwTypeErrorType => TypeMaskFactory
+      .inferredReturnTypeForElement(_backend.helpers.throwTypeError, _compiler);
+
   TypeMask get assertHelperReturnType => TypeMaskFactory
       .inferredReturnTypeForElement(_backend.helpers.assertHelper, _compiler);
 
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index ce9a2c4..f399509 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -75,6 +75,7 @@
   CONST_CONSTRUCTOR_INVOKE,
   REDIRECTION,
   DIRECT_INVOKE,
+  DIRECT_USE,
 }
 
 /// Statically known use of an [Element].
@@ -311,6 +312,11 @@
     return new StaticUse.internal(element, StaticUseKind.GENERAL);
   }
 
+  /// Direct use of [element] as done with `--analyze-all` and `--analyze-main`.
+  factory StaticUse.directUse(Element element) {
+    return new StaticUse.internal(element, StaticUseKind.DIRECT_USE);
+  }
+
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! StaticUse) return false;
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index afcd031..49deb8e 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -636,6 +636,7 @@
         methodsNeedingSuperGetter.add(element);
         break;
       case StaticUseKind.GENERAL:
+      case StaticUseKind.DIRECT_USE:
       case StaticUseKind.STATIC_TEAR_OFF:
       case StaticUseKind.FIELD_GET:
       case StaticUseKind.CONSTRUCTOR_INVOKE:
@@ -911,6 +912,7 @@
       case StaticUseKind.SUPER_FIELD_SET:
       case StaticUseKind.FIELD_SET:
       case StaticUseKind.GENERAL:
+      case StaticUseKind.DIRECT_USE:
       case StaticUseKind.CLOSURE:
       case StaticUseKind.FIELD_GET:
       case StaticUseKind.CONSTRUCTOR_INVOKE:
diff --git a/pkg/compiler/lib/src/universe/world_impact.dart b/pkg/compiler/lib/src/universe/world_impact.dart
index 9012057..2a1afb8 100644
--- a/pkg/compiler/lib/src/universe/world_impact.dart
+++ b/pkg/compiler/lib/src/universe/world_impact.dart
@@ -33,6 +33,8 @@
 
   Iterable<TypeUse> get typeUses => const <TypeUse>[];
 
+  bool get isEmpty => true;
+
   void apply(WorldImpactVisitor visitor) {
     staticUses.forEach(visitor.visitStaticUse);
     dynamicUses.forEach(visitor.visitDynamicUse);
@@ -74,6 +76,18 @@
   Set<StaticUse> _staticUses;
   Set<TypeUse> _typeUses;
 
+  @override
+  bool get isEmpty =>
+      _dynamicUses == null && _staticUses == null && _typeUses == null;
+
+  /// Copy uses in [impact] to this impact builder.
+  void addImpact(WorldImpact impact) {
+    if (impact.isEmpty) return;
+    impact.dynamicUses.forEach(registerDynamicUse);
+    impact.staticUses.forEach(registerStaticUse);
+    impact.typeUses.forEach(registerTypeUse);
+  }
+
   void registerDynamicUse(DynamicUse dynamicUse) {
     assert(dynamicUse != null);
     if (_dynamicUses == null) {
@@ -174,6 +188,14 @@
   TransformedWorldImpact(this.worldImpact);
 
   @override
+  bool get isEmpty {
+    return worldImpact.isEmpty &&
+        _staticUses == null &&
+        _typeUses == null &&
+        _dynamicUses == null;
+  }
+
+  @override
   Iterable<DynamicUse> get dynamicUses {
     return _dynamicUses != null ? _dynamicUses : worldImpact.dynamicUses;
   }
diff --git a/pkg/compiler/tool/perf.dart b/pkg/compiler/tool/perf.dart
index 7705061..4725014 100644
--- a/pkg/compiler/tool/perf.dart
+++ b/pkg/compiler/tool/perf.dart
@@ -11,7 +11,6 @@
 import 'package:compiler/compiler_new.dart';
 import 'package:compiler/src/apiimpl.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/kernel/task.dart';
 import 'package:compiler/src/elements/elements.dart';
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
@@ -28,6 +27,7 @@
 import 'package:compiler/src/scanner/scanner.dart';
 import 'package:compiler/src/source_file_provider.dart';
 import 'package:compiler/src/tokens/token.dart' show Token;
+import 'package:compiler/src/universe/world_impact.dart' show WorldImpact;
 import 'package:package_config/discovery.dart' show findPackages;
 import 'package:package_config/packages.dart' show Packages;
 import 'package:package_config/src/util.dart' show checkValidPackageUri;
@@ -359,7 +359,7 @@
   /// Performs the compilation when all libraries have been loaded.
   void compileLoadedLibraries() =>
       selfTask.measureSubtask("KernelCompiler.compileLoadedLibraries", () {
-        computeMain();
+        WorldImpact mainImpact = computeMain();
         mirrorUsageAnalyzerTask.analyzeUsage(mainApp);
 
         deferredLoadTask.beforeResolution(this);
@@ -369,14 +369,18 @@
             supportSerialization: serialization.supportSerialization);
 
         phase = Compiler.PHASE_RESOLVING;
-
+        enqueuer.resolution.applyImpact(mainImpact);
         // Note: we enqueue everything in the program so we measure generating
         // kernel for the entire code, not just what's reachable from main.
         libraryLoader.libraries.forEach((LibraryElement library) {
-          fullyEnqueueLibrary(library, enqueuer.resolution);
+          enqueuer.resolution.applyImpact(computeImpactForLibrary(library));
         });
 
-        backend.enqueueHelpers(enqueuer.resolution);
+        if (deferredLoadTask.isProgramSplit) {
+          enqueuer.resolution.applyImpact(
+              backend.computeDeferredLoadingImpact());
+        }
+        enqueuer.resolution.applyImpact(backend.computeHelpersImpact());
         resolveLibraryMetadata();
         reporter.log('Resolving...');
         processQueue(enqueuer.resolution, mainFunction);
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
index 34f67c64..8bf1c64 100644
--- a/pkg/dart2js_incremental/lib/caching_compiler.dart
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -85,7 +85,7 @@
         // Likewise, always be prepared for runtimeType support.
         // TODO(johnniwinther): Add global switch to force RTI.
         compiler.resolverWorld.hasRuntimeTypeSupport = true;
-        backend.registerRuntimeType(compiler.enqueuer.resolution);
+        compiler.enqueuer.resolution.applyImpact(backend.registerRuntimeType());
         return compiler;
       });
     });
diff --git a/pkg/dev_compiler/lib/js/amd/dart_sdk.js b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
index 7252d35..9935e21 100644
--- a/pkg/dev_compiler/lib/js/amd/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
@@ -17,6 +17,7 @@
   const collection = Object.create(null);
   const convert = Object.create(null);
   const core = Object.create(null);
+  const developer = Object.create(null);
   const isolate = Object.create(null);
   const js = Object.create(null);
   const js_util = Object.create(null);
@@ -376,6 +377,12 @@
   let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
   let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
   let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+  let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
+  let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
+  let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
+  let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
+  let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
+  let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
   let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
   let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
   let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
@@ -616,11 +623,12 @@
   let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
   let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
   let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
-  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
+  let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
+  let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
+  let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
   let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
   let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
   let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
-  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
   let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
   let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
@@ -678,9 +686,24 @@
   let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
   let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
   let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
+  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
   let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
   let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+  let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
+  let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
+  let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
+  let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
+  let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
+  let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
+  let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
+  let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
+  let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
+  let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
+  let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
+  let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
+  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
+  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
   let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
   let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
@@ -749,6 +772,7 @@
   let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
   let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
   let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
+  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
   let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
   let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
@@ -780,10 +804,10 @@
     return Mixin;
   };
   dart.getMixins = function(clazz) {
-    return clazz[dart._mixins];
+    return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
   };
   dart.getImplements = function(clazz) {
-    return clazz[dart.implements];
+    return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
   };
   dart.flattenFutures = function(builder) {
     function flatten(T) {
@@ -8657,18 +8681,26 @@
   });
   _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
   const _name = Symbol('_name');
+  const _nativeSymbol = Symbol('_nativeSymbol');
   _internal.Symbol = class Symbol extends core.Object {
     new(name) {
       this[_name] = name;
+      this[_nativeSymbol] = null;
+    }
+    es6(name, nativeSymbol) {
+      this[_name] = name;
+      this[_nativeSymbol] = nativeSymbol;
     }
     unvalidated(name) {
       this[_name] = name;
+      this[_nativeSymbol] = null;
     }
     validated(name) {
       this[_name] = _internal.Symbol.validatePublicSymbol(name);
+      this[_nativeSymbol] = null;
     }
     ['=='](other) {
-      return _internal.Symbol.is(other) && this[_name] == other[_name];
+      return _internal.Symbol.is(other) && this[_name] == other[_name] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
     }
     get hashCode() {
       let hash = this._hashCode;
@@ -8684,6 +8716,9 @@
     static getName(symbol) {
       return symbol[_name];
     }
+    static getNativeSymbol(symbol) {
+      return symbol[_nativeSymbol];
+    }
     static validatePublicSymbol(name) {
       if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
       if (dart.test(name[dartx.startsWith]('_'))) {
@@ -8695,16 +8730,21 @@
       return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
     }
   };
+  dart.defineNamedConstructor(_internal.Symbol, 'es6');
   dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
   dart.defineNamedConstructor(_internal.Symbol, 'validated');
   _internal.Symbol[dart.implements] = () => [core.Symbol];
   dart.setSignature(_internal.Symbol, {
     constructors: () => ({
       new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
+      es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
       unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
       validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
     }),
-    fields: () => ({[_name]: core.String}),
+    fields: () => ({
+      [_name]: core.String,
+      [_nativeSymbol]: dart.dynamic
+    }),
     methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
     sfields: () => ({
       reservedWordRE: core.String,
@@ -8716,10 +8756,11 @@
     }),
     statics: () => ({
       getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
+      getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
       validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
       isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
     }),
-    names: ['getName', 'validatePublicSymbol', 'isValidSymbol']
+    names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
   });
   _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
   _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
@@ -13230,73 +13271,109 @@
     return _js_mirrors._dart.definiteFunctionType(type, []);
   };
   dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
+  _js_mirrors._getMixins = function(type) {
+    return _js_mirrors._dart.getMixins(type, []);
+  };
+  dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
   _js_mirrors._Lazy$ = dart.generic(T => {
     const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
     return _Lazy;
   });
   _js_mirrors._Lazy = _Lazy();
+  _js_mirrors._getESSymbol = function(symbol) {
+    return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+  };
+  dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
+  _js_mirrors._getMember = function(symbol) {
+    let privateSymbol = _js_mirrors._getESSymbol(symbol);
+    if (privateSymbol != null) {
+      return privateSymbol;
+    }
+    return _js_mirrors.getName(symbol);
+  };
+  dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
   _js_mirrors._getNameForESSymbol = function(member) {
+    dart.assert(typeof member == "symbol");
     let str = dart.toString(member);
     dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
     return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
   };
   dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
+  _js_mirrors._getSymbolForESSymbol = function(member) {
+    let name = _js_mirrors._getNameForESSymbol(member);
+    return new _internal.Symbol.es6(name, member);
+  };
+  dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
+  _js_mirrors._getSymbolForMember = function(member) {
+    if (typeof member == 'string') {
+      return core.Symbol.new(member);
+    } else {
+      let name = _js_mirrors._getNameForESSymbol(member);
+      return new _internal.Symbol.es6(name, member);
+    }
+  };
+  dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
   _js_mirrors._toDartMap = function(data) {
-    if (data == null) return dart.map();
-    let map = _js_mirrors._dart.map(data);
+    if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
+    let map = MapOfSymbol$dynamic().new();
+    let publicMembers = Object.getOwnPropertyNames(data);
+    for (let member of core.Iterable._check(publicMembers)) {
+      let symbol = core.Symbol.new(core.String._check(member));
+      map[dartx._set](symbol, data[member]);
+    }
     let privateMembers = Object.getOwnPropertySymbols(data);
     for (let member of core.Iterable._check(privateMembers)) {
-      let name = _js_mirrors._getNameForESSymbol(member);
-      map[dartx._set](name, data[member]);
+      let symbol = _js_mirrors._getSymbolForESSymbol(member);
+      map[dartx._set](symbol, data[member]);
     }
     return map;
   };
-  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getConstructors = function(obj) {
     let sig = _js_mirrors._dart.getConstructorSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getFields = function(obj) {
     let sig = _js_mirrors._dart.getFieldSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getMethods = function(obj) {
     let sig = _js_mirrors._dart.getMethodSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getGetters = function(obj) {
     let sig = _js_mirrors._dart.getGetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getSetters = function(obj) {
     let sig = _js_mirrors._dart.getSetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticFields = function(obj) {
     let sig = _js_mirrors._dart.getStaticFieldSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStatics = function(obj) {
     let sig = _js_mirrors._dart.getStaticSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticGetters = function(obj) {
     let sig = _js_mirrors._dart.getStaticGetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticSetters = function(obj) {
     let sig = _js_mirrors._dart.getStaticSetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._unwrap = function(obj) {
     return _js_mirrors._dart.unwrapType(obj);
   };
@@ -13435,15 +13512,7 @@
     [_getAccessor](reflectee, symbol, args, namedArgs) {
       if (args === void 0) args = null;
       if (namedArgs === void 0) namedArgs = null;
-      let name = _js_mirrors.getName(symbol);
-      if (!dart.test(name[dartx.startsWith]('_'))) return name;
-      let privateMembers = Object.getOwnPropertySymbols(reflectee);
-      dart.dsend(privateMembers, 'addAll', Object.getOwnPropertySymbols(reflectee.__proto__));
-      for (let member of core.Iterable._check(privateMembers)) {
-        let privateName = _js_mirrors._getNameForESSymbol(member);
-        if (name == privateName) return member;
-      }
-      return new core.NoSuchMethodError(reflectee, symbol, args, namedArgs);
+      return _js_mirrors._getMember(symbol);
     }
     getField(symbol) {
       let name = this[_getAccessor](this.reflectee, symbol);
@@ -13520,6 +13589,7 @@
   let const$0;
   const _declarations = Symbol('_declarations');
   const _raw = Symbol('_raw');
+  const _mixin = Symbol('_mixin');
   const _typeArguments = Symbol('_typeArguments');
   let const$1;
   _js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
@@ -13536,67 +13606,66 @@
         this[_declarations] = MapOfSymbol$DeclarationMirror().new();
         let unwrapped = _js_mirrors._unwrap(this[_cls]);
         let constructors = _js_mirrors._getConstructors(unwrapped);
-        constructors[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        constructors[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         if (dart.test(constructors[dartx.isEmpty])) {
           let name = 'new';
           let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
           let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, name, ft));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
         }
         let fields = _js_mirrors._getFields(unwrapped);
-        fields[dartx.forEach](dart.fn((name, t) => {
-          let symbol = core.Symbol.new(name);
+        fields[dartx.forEach](dart.fn((symbol, t) => {
           let metadata = [];
           if (core.List.is(t)) {
             metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
             t = dart.dindex(t, 0);
           }
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(name, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, StringAnddynamicTovoid()));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+        }, SymbolAnddynamicTovoid()));
         let methods = _js_mirrors._getMethods(unwrapped);
-        methods[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        methods[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let getters = _js_mirrors._getGetters(unwrapped);
-        getters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        getters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let setters = _js_mirrors._getSetters(unwrapped);
-        setters[dartx.forEach](dart.fn((name, ft) => {
-          name = dart.notNull(name) + '=';
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        setters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
+          symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticFields = _js_mirrors._getStaticFields(unwrapped);
-        staticFields[dartx.forEach](dart.fn((name, t) => {
-          let symbol = core.Symbol.new(name);
+        staticFields[dartx.forEach](dart.fn((symbol, t) => {
+          let name = _js_mirrors.getName(symbol);
           let metadata = [];
           if (core.List.is(t)) {
             metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
             t = dart.dindex(t, 0);
           }
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(name, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, StringAnddynamicTovoid()));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+        }, SymbolAnddynamicTovoid()));
         let statics = _js_mirrors._getStatics(unwrapped);
-        statics[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        statics[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
-        staticGetters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
-        staticSetters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
       }
       return this[_declarations];
@@ -13605,7 +13674,7 @@
       this[_cls] = cls;
       this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
       this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
-      this.mixin = null;
+      this[_mixin] = null;
       this[_typeArguments] = null;
       this[_metadata$] = null;
       this[_declarations] = null;
@@ -13676,6 +13745,21 @@
         return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
       }
     }
+    get mixin() {
+      if (this[_mixin] != null) {
+        return this[_mixin];
+      }
+      let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
+      if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
+        this[_mixin] = this;
+        return this[_mixin];
+      }
+      if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
+        dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
+      }
+      this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
+      return this[_mixin];
+    }
     toString() {
       return dart.str`ClassMirror on '${this[_cls]}'`;
     }
@@ -13724,7 +13808,7 @@
       [_cls]: core.Type,
       simpleName: core.Symbol,
       [_raw]: dart.dynamic,
-      mixin: mirrors.ClassMirror,
+      [_mixin]: mirrors.ClassMirror,
       [_typeArguments]: ListOfTypeMirror(),
       [_metadata$]: ListOfInstanceMirror(),
       [_declarations]: MapOfSymbol$DeclarationMirror()
@@ -13738,7 +13822,8 @@
       isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
       typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
       originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
-      superclass: dart.definiteFunctionType(mirrors.ClassMirror, [])
+      superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
+      mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
     }),
     methods: () => ({
       newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
@@ -13747,13 +13832,15 @@
       invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
     })
   });
+  const _symbol = Symbol('_symbol');
   const _name$ = Symbol('_name');
   _js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
     get simpleName() {
-      return core.Symbol.new(this[_name$]);
+      return this[_symbol];
     }
-    _(name, t, annotations) {
-      this[_name$] = name;
+    _(symbol, t, annotations) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.type = _js_mirrors.reflectType(t);
       this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
       this.isStatic = false;
@@ -13784,8 +13871,9 @@
   dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
   _js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
   dart.setSignature(_js_mirrors.JsVariableMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.String, core.Type, core.List])}),
+    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
     fields: () => ({
+      [_symbol]: core.Symbol,
       [_name$]: core.String,
       type: mirrors.TypeMirror,
       metadata: ListOfInstanceMirror(),
@@ -13795,8 +13883,8 @@
     getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
   });
   _js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
-    _(name, t, annotations) {
-      super._(name, t, annotations);
+    _(member, t, annotations) {
+      super._(member, t, annotations);
     }
     toString() {
       return dart.str`ParameterMirror on '${this[_name$]}'`;
@@ -13835,7 +13923,7 @@
   dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
   _js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
   dart.setSignature(_js_mirrors.JsParameterMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.String, core.Type, core.List])})
+    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
   });
   const _params = Symbol('_params');
   const _createParameterMirrorList = Symbol('_createParameterMirrorList');
@@ -13850,10 +13938,11 @@
       return this[_name$][dartx.startsWith]('_');
     }
     get simpleName() {
-      return core.Symbol.new(this[_name$]);
+      return this[_symbol];
     }
-    _constructor(cls, name, ftype) {
-      this[_name$] = name;
+    _constructor(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = true;
       this.isStatic = false;
       this[_params] = null;
@@ -13861,8 +13950,9 @@
       this.isFinal = false;
       this[_createParameterMirrorList](ftype);
     }
-    _instanceMethod(cls, name, ftype) {
-      this[_name$] = name;
+    _instanceMethod(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = false;
       this.isStatic = false;
       this[_params] = null;
@@ -13870,8 +13960,9 @@
       this.isFinal = false;
       this[_createParameterMirrorList](ftype);
     }
-    _staticMethod(cls, name, ftype) {
-      this[_name$] = name;
+    _staticMethod(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = false;
       this.isStatic = true;
       this[_params] = null;
@@ -13880,7 +13971,7 @@
       this[_createParameterMirrorList](ftype);
     }
     get constructorName() {
-      return dart.test(this.isConstructor) ? core.Symbol.new(this[_name$]) : null;
+      return dart.test(this.isConstructor) ? this[_symbol] : null;
     }
     get parameters() {
       return this[_params];
@@ -13909,13 +14000,13 @@
       for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
         let type = args[dartx._get](i);
         let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
-        let param = new _js_mirrors.JsParameterMirror._('', core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
         params[dartx._set](i, param);
       }
       for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
         let type = opts[dartx._get](i);
         let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
-        let param = new _js_mirrors.JsParameterMirror._('', core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
         params[dartx._set](i + dart.notNull(args[dartx.length]), param);
       }
       this[_params] = ListOfParameterMirror().unmodifiable(params);
@@ -13975,11 +14066,12 @@
   _js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
   dart.setSignature(_js_mirrors.JsMethodMirror, {
     constructors: () => ({
-      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic]),
-      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic]),
-      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic])
+      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
     }),
     fields: () => ({
+      [_symbol]: core.Symbol,
       [_name$]: core.String,
       [_params]: ListOfParameterMirror(),
       [_metadata$]: ListOfInstanceMirror(),
@@ -36375,6 +36467,741 @@
   core.UriData._noScheme = -1;
   core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
   core.UriData._uricTable = core.Uri._queryCharTable;
+  developer.debugger = function(opts) {
+    let when = opts && 'when' in opts ? opts.when : true;
+    let message = opts && 'message' in opts ? opts.message : null;
+    if (dart.test(when)) {
+      debugger;
+    }
+    return when;
+  };
+  dart.fn(developer.debugger, __Tobool());
+  developer.inspect = function(object) {
+    return object;
+  };
+  dart.fn(developer.inspect, ObjectToObject());
+  developer.log = function(message, opts) {
+    let time = opts && 'time' in opts ? opts.time : null;
+    let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
+    let level = opts && 'level' in opts ? opts.level : 0;
+    let name = opts && 'name' in opts ? opts.name : '';
+    let zone = opts && 'zone' in opts ? opts.zone : null;
+    let error = opts && 'error' in opts ? opts.error : null;
+    let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
+  };
+  dart.fn(developer.log, String__Tovoid$());
+  dart.defineLazy(developer, {
+    get _extensions() {
+      return MapOfString$ServiceExtensionHandler().new();
+    }
+  });
+  developer._clockValue = 0;
+  const _result = Symbol('_result');
+  const _errorCode = Symbol('_errorCode');
+  const _errorDetail = Symbol('_errorDetail');
+  const _isError = Symbol('_isError');
+  const _toString = Symbol('_toString');
+  developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
+    result(result) {
+      this[_result] = result;
+      this[_errorCode] = null;
+      this[_errorDetail] = null;
+      if (!(typeof this[_result] == 'string')) {
+        dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
+      }
+    }
+    error(errorCode, errorDetail) {
+      this[_result] = null;
+      this[_errorCode] = errorCode;
+      this[_errorDetail] = errorDetail;
+      developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
+      if (!(typeof this[_errorDetail] == 'string')) {
+        dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
+      }
+    }
+    static _errorCodeMessage(errorCode) {
+      developer.ServiceExtensionResponse._validateErrorCode(errorCode);
+      if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
+        return "Invalid params";
+      }
+      return "Server error";
+    }
+    static _validateErrorCode(errorCode) {
+      if (!(typeof errorCode == 'number')) {
+        dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
+      }
+      if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
+        return;
+      }
+      if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
+        return;
+      }
+      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
+    }
+    [_isError]() {
+      return this[_errorCode] != null && this[_errorDetail] != null;
+    }
+    [_toString]() {
+      if (this[_result] != null) {
+        return this[_result];
+      } else {
+        dart.assert(this[_errorCode] != null);
+        dart.assert(this[_errorDetail] != null);
+        return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
+      }
+    }
+  };
+  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
+  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
+  dart.setSignature(developer.ServiceExtensionResponse, {
+    constructors: () => ({
+      result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
+      error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
+    }),
+    fields: () => ({
+      [_result]: core.String,
+      [_errorCode]: core.int,
+      [_errorDetail]: core.String
+    }),
+    methods: () => ({
+      [_isError]: dart.definiteFunctionType(core.bool, []),
+      [_toString]: dart.definiteFunctionType(core.String, [])
+    }),
+    sfields: () => ({
+      kInvalidParams: core.int,
+      kExtensionError: core.int,
+      kExtensionErrorMax: core.int,
+      kExtensionErrorMin: core.int,
+      invalidParams: core.int,
+      extensionError: core.int,
+      extensionErrorMax: core.int,
+      extensionErrorMin: core.int
+    }),
+    statics: () => ({
+      _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
+      _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
+    }),
+    names: ['_errorCodeMessage', '_validateErrorCode']
+  });
+  developer.ServiceExtensionResponse.invalidParams = -32602;
+  developer.ServiceExtensionResponse.extensionError = -32000;
+  developer.ServiceExtensionResponse.extensionErrorMax = -32000;
+  developer.ServiceExtensionResponse.extensionErrorMin = -32016;
+  dart.defineLazy(developer.ServiceExtensionResponse, {
+    get kInvalidParams() {
+      return developer.ServiceExtensionResponse.invalidParams;
+    },
+    get kExtensionError() {
+      return developer.ServiceExtensionResponse.extensionError;
+    },
+    get kExtensionErrorMax() {
+      return developer.ServiceExtensionResponse.extensionErrorMax;
+    },
+    get kExtensionErrorMin() {
+      return developer.ServiceExtensionResponse.extensionErrorMin;
+    }
+  });
+  developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
+  developer.registerExtension = function(method, handler) {
+    if (!(typeof method == 'string')) {
+      dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
+    }
+    if (!dart.test(method[dartx.startsWith]('ext.'))) {
+      dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
+    }
+    if (developer._lookupExtension(method) != null) {
+      dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
+    }
+    if (!developer.ServiceExtensionHandler.is(handler)) {
+      dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
+    }
+    developer._registerExtension(method, handler);
+  };
+  dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
+  developer.postEvent = function(eventKind, eventData) {
+    if (!(typeof eventKind == 'string')) {
+      dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
+    }
+    if (!core.Map.is(eventData)) {
+      dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
+    }
+    let eventDataAsString = convert.JSON.encode(eventData);
+    developer._postEvent(eventKind, eventDataAsString);
+  };
+  dart.fn(developer.postEvent, StringAndMapTovoid());
+  developer._postEvent = function(eventKind, eventData) {
+  };
+  dart.fn(developer._postEvent, StringAndStringTodynamic());
+  developer._lookupExtension = function(method) {
+    return developer._extensions[dartx._get](method);
+  };
+  dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
+  developer._registerExtension = function(method, handler) {
+    developer._extensions[dartx._set](method, handler);
+  };
+  dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
+  developer.UserTag = class UserTag extends core.Object {
+    static new(label) {
+      return developer._FakeUserTag.new(label);
+    }
+    static get defaultTag() {
+      return developer._FakeUserTag._defaultTag;
+    }
+  };
+  dart.setSignature(developer.UserTag, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
+    sfields: () => ({MAX_USER_TAGS: core.int}),
+    sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
+  });
+  developer.UserTag.MAX_USER_TAGS = 64;
+  developer._FakeUserTag = class _FakeUserTag extends core.Object {
+    real(label) {
+      this.label = label;
+    }
+    static new(label) {
+      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+      if (existingTag != null) {
+        return developer._FakeUserTag._check(existingTag);
+      }
+      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+      }
+      let instance = new developer._FakeUserTag.real(label);
+      developer._FakeUserTag._instances[dartx._set](label, instance);
+      return instance;
+    }
+    makeCurrent() {
+      let old = developer._currentTag;
+      developer._currentTag = this;
+      return old;
+    }
+  };
+  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+  dart.setSignature(developer._FakeUserTag, {
+    constructors: () => ({
+      real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
+      new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
+    }),
+    fields: () => ({label: core.String}),
+    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
+    sfields: () => ({
+      _instances: core.Map,
+      _defaultTag: developer.UserTag
+    })
+  });
+  dart.defineLazy(developer._FakeUserTag, {
+    get _instances() {
+      return dart.map();
+    },
+    set _instances(_) {},
+    get _defaultTag() {
+      return developer._FakeUserTag.new('Default');
+    }
+  });
+  dart.defineLazy(developer, {
+    get _currentTag() {
+      return developer._FakeUserTag._defaultTag;
+    },
+    set _currentTag(_) {}
+  });
+  developer.getCurrentTag = function() {
+    return developer._currentTag;
+  };
+  dart.fn(developer.getCurrentTag, VoidToUserTag());
+  developer.Metric = class Metric extends core.Object {
+    new(name, description) {
+      this.name = name;
+      this.description = description;
+      if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
+        dart.throw(new core.ArgumentError('Invalid Metric name.'));
+      }
+    }
+  };
+  dart.setSignature(developer.Metric, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
+    fields: () => ({
+      name: core.String,
+      description: core.String
+    })
+  });
+  const _value$0 = Symbol('_value');
+  const _toJSON = Symbol('_toJSON');
+  developer.Gauge = class Gauge extends developer.Metric {
+    get value() {
+      return this[_value$0];
+    }
+    set value(v) {
+      if (dart.notNull(v) < dart.notNull(this.min)) {
+        v = this.min;
+      } else if (dart.notNull(v) > dart.notNull(this.max)) {
+        v = this.max;
+      }
+      this[_value$0] = v;
+    }
+    new(name, description, min, max) {
+      this.min = min;
+      this.max = max;
+      this[_value$0] = null;
+      super.new(name, description);
+      if (!(typeof this.min == 'number')) {
+        dart.throw(new core.ArgumentError('min must be a double'));
+      }
+      if (!(typeof this.max == 'number')) {
+        dart.throw(new core.ArgumentError('max must be a double'));
+      }
+      if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
+        dart.throw(new core.ArgumentError('min must be less than max'));
+      }
+      this[_value$0] = this.min;
+    }
+    [_toJSON]() {
+      let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
+      return map;
+    }
+  };
+  dart.setSignature(developer.Gauge, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
+    fields: () => ({
+      min: core.double,
+      max: core.double,
+      [_value$0]: core.double
+    }),
+    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+  });
+  developer.Counter = class Counter extends developer.Metric {
+    new(name, description) {
+      this[_value$0] = 0.0;
+      super.new(name, description);
+    }
+    get value() {
+      return this[_value$0];
+    }
+    set value(v) {
+      this[_value$0] = v;
+    }
+    [_toJSON]() {
+      let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
+      return map;
+    }
+  };
+  dart.setSignature(developer.Counter, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
+    fields: () => ({[_value$0]: core.double}),
+    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+  });
+  developer.Metrics = class Metrics extends core.Object {
+    static register(metric) {
+      if (!developer.Metric.is(metric)) {
+        dart.throw(new core.ArgumentError('metric must be a Metric'));
+      }
+      if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
+        dart.throw(new core.ArgumentError('Registered metrics have unique names'));
+      }
+      developer.Metrics._metrics[dartx._set](metric.name, metric);
+    }
+    static deregister(metric) {
+      if (!developer.Metric.is(metric)) {
+        dart.throw(new core.ArgumentError('metric must be a Metric'));
+      }
+      developer.Metrics._metrics[dartx.remove](metric.name);
+    }
+    static _printMetric(id) {
+      let metric = developer.Metrics._metrics[dartx._get](id);
+      if (metric == null) {
+        return null;
+      }
+      return convert.JSON.encode(metric[_toJSON]());
+    }
+    static _printMetrics() {
+      let metrics = [];
+      for (let metric of developer.Metrics._metrics[dartx.values]) {
+        metrics[dartx.add](metric[_toJSON]());
+      }
+      let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
+      return convert.JSON.encode(map);
+    }
+  };
+  dart.setSignature(developer.Metrics, {
+    sfields: () => ({_metrics: MapOfString$Metric()}),
+    statics: () => ({
+      register: dart.definiteFunctionType(dart.void, [developer.Metric]),
+      deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
+      _printMetric: dart.definiteFunctionType(core.String, [core.String]),
+      _printMetrics: dart.definiteFunctionType(core.String, [])
+    }),
+    names: ['register', 'deregister', '_printMetric', '_printMetrics']
+  });
+  dart.defineLazy(developer.Metrics, {
+    get _metrics() {
+      return MapOfString$Metric().new();
+    }
+  });
+  developer._isProduct = false;
+  developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
+  developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
+  const _appendArguments = Symbol('_appendArguments');
+  developer.Timeline = class Timeline extends core.Object {
+    static startSync(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      if (!dart.test(developer._isDartStreamEnabled())) {
+        developer.Timeline._stack[dartx.add](null);
+        return;
+      }
+      let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
+      if (core.Map.is(arguments$)) {
+        block[_appendArguments](arguments$);
+      }
+      developer.Timeline._stack[dartx.add](block);
+    }
+    static finishSync() {
+      if (developer._isProduct) {
+        return;
+      }
+      if (developer.Timeline._stack[dartx.length] == 0) {
+        dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
+      }
+      let block = developer.Timeline._stack[dartx.removeLast]();
+      if (block == null) {
+        return;
+      }
+      block.finish();
+    }
+    static instantSync(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      if (!dart.test(developer._isDartStreamEnabled())) {
+        return;
+      }
+      let instantArguments = null;
+      if (core.Map.is(arguments$)) {
+        instantArguments = core.Map.from(arguments$);
+      }
+      developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
+    }
+    static timeSync(name, func, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      developer.Timeline.startSync(name, {arguments: arguments$});
+      try {
+        return func();
+      } finally {
+        developer.Timeline.finishSync();
+      }
+    }
+    static get now() {
+      return developer._getTraceClock();
+    }
+  };
+  dart.setSignature(developer.Timeline, {
+    sfields: () => ({
+      _stack: ListOf_SyncBlock(),
+      _isolateId: core.int,
+      _isolateIdString: core.String
+    }),
+    sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
+    statics: () => ({
+      startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      finishSync: dart.definiteFunctionType(dart.void, []),
+      instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
+    }),
+    names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
+  });
+  dart.defineLazy(developer.Timeline, {
+    get _stack() {
+      return ListOf_SyncBlock().new();
+    },
+    get _isolateId() {
+      return developer._getIsolateNum();
+    },
+    get _isolateIdString() {
+      return dart.toString(developer.Timeline._isolateId);
+    }
+  });
+  const _stack = Symbol('_stack');
+  const _taskId = Symbol('_taskId');
+  const _start$1 = Symbol('_start');
+  const _finish = Symbol('_finish');
+  developer.TimelineTask = class TimelineTask extends core.Object {
+    new() {
+      this[_stack] = JSArrayOf_AsyncBlock().of([]);
+      this[_taskId] = developer._getNextAsyncId();
+    }
+    withTaskId(taskId) {
+      this[_stack] = JSArrayOf_AsyncBlock().of([]);
+      this[_taskId] = taskId;
+      if (!(typeof taskId == 'number')) {
+        dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
+      }
+    }
+    start(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      let block = new developer._AsyncBlock._(name, this[_taskId]);
+      if (core.Map.is(arguments$)) {
+        block[_appendArguments](arguments$);
+      }
+      this[_stack][dartx.add](block);
+      block[_start$1]();
+    }
+    instant(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      let instantArguments = null;
+      if (core.Map.is(arguments$)) {
+        instantArguments = core.Map.from(arguments$);
+      }
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
+    }
+    finish() {
+      if (developer._isProduct) {
+        return;
+      }
+      if (this[_stack][dartx.length] == 0) {
+        dart.throw(new core.StateError('Uneven calls to start and finish'));
+      }
+      let block = this[_stack][dartx.removeLast]();
+      block[_finish]();
+    }
+    pass() {
+      if (dart.notNull(this[_stack][dartx.length]) > 0) {
+        dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
+      }
+      let r = this[_taskId];
+      return r;
+    }
+  };
+  dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
+  dart.setSignature(developer.TimelineTask, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(developer.TimelineTask, []),
+      withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
+    }),
+    fields: () => ({
+      [_taskId]: core.int,
+      [_stack]: ListOf_AsyncBlock()
+    }),
+    methods: () => ({
+      start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      finish: dart.definiteFunctionType(dart.void, []),
+      pass: dart.definiteFunctionType(core.int, [])
+    })
+  });
+  const _arguments$ = Symbol('_arguments');
+  developer._AsyncBlock = class _AsyncBlock extends core.Object {
+    _(name, taskId) {
+      this.name = name;
+      this[_taskId] = taskId;
+      this.category = 'Dart';
+      this[_arguments$] = null;
+    }
+    [_start$1]() {
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+    }
+    [_finish]() {
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
+    }
+    [_appendArguments](arguments$) {
+      if (this[_arguments$] == null) {
+        this[_arguments$] = dart.map();
+      }
+      this[_arguments$][dartx.addAll](arguments$);
+    }
+  };
+  dart.defineNamedConstructor(developer._AsyncBlock, '_');
+  dart.setSignature(developer._AsyncBlock, {
+    constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
+    fields: () => ({
+      category: core.String,
+      name: core.String,
+      [_taskId]: core.int,
+      [_arguments$]: core.Map
+    }),
+    methods: () => ({
+      [_start$1]: dart.definiteFunctionType(dart.void, []),
+      [_finish]: dart.definiteFunctionType(dart.void, []),
+      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+    })
+  });
+  const _startCpu = Symbol('_startCpu');
+  developer._SyncBlock = class _SyncBlock extends core.Object {
+    _(name, start, startCpu) {
+      this.name = name;
+      this[_start$1] = start;
+      this[_startCpu] = startCpu;
+      this.category = 'Dart';
+      this[_arguments$] = null;
+    }
+    finish() {
+      developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+    }
+    [_appendArguments](arguments$) {
+      if (arguments$ == null) {
+        return;
+      }
+      if (this[_arguments$] == null) {
+        this[_arguments$] = dart.map();
+      }
+      this[_arguments$][dartx.addAll](arguments$);
+    }
+  };
+  dart.defineNamedConstructor(developer._SyncBlock, '_');
+  dart.setSignature(developer._SyncBlock, {
+    constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
+    fields: () => ({
+      category: core.String,
+      name: core.String,
+      [_arguments$]: core.Map,
+      [_start$1]: core.int,
+      [_startCpu]: core.int
+    }),
+    methods: () => ({
+      finish: dart.definiteFunctionType(dart.void, []),
+      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+    })
+  });
+  developer._fastPathArguments = null;
+  developer._argumentsAsJson = function(arguments$) {
+    if (arguments$ == null || arguments$[dartx.length] == 0) {
+      if (developer._fastPathArguments == null) {
+        developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
+      }
+      return developer._fastPathArguments;
+    }
+    arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
+    return convert.JSON.encode(arguments$);
+  };
+  dart.fn(developer._argumentsAsJson, MapToString());
+  developer._isDartStreamEnabled = function() {
+    return false;
+  };
+  dart.fn(developer._isDartStreamEnabled, VoidTobool());
+  developer._getNextAsyncId = function() {
+    return 0;
+  };
+  dart.fn(developer._getNextAsyncId, VoidToint());
+  developer._getTraceClock = function() {
+    let x = developer._clockValue;
+    developer._clockValue = dart.notNull(x) + 1;
+    return x;
+  };
+  dart.fn(developer._getTraceClock, VoidToint());
+  developer._getThreadCpuClock = function() {
+    return -1;
+  };
+  dart.fn(developer._getThreadCpuClock, VoidToint());
+  developer._getIsolateNum = function() {
+    return 0;
+  };
+  dart.fn(developer._getIsolateNum, VoidToint());
+  developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
+  developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
+  developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
+  developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
+    new(serverUri) {
+      this.majorVersion = developer._getServiceMajorVersion();
+      this.minorVersion = developer._getServiceMinorVersion();
+      this.serverUri = serverUri;
+    }
+    toString() {
+      if (this.serverUri != null) {
+        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
+      } else {
+        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
+      }
+    }
+  };
+  dart.setSignature(developer.ServiceProtocolInfo, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
+    fields: () => ({
+      majorVersion: core.int,
+      minorVersion: core.int,
+      serverUri: core.Uri
+    })
+  });
+  developer.Service = class Service extends core.Object {
+    static getInfo() {
+      return dart.async(function*() {
+        let receivePort = isolate.RawReceivePort.new();
+        let uriCompleter = CompleterOfUri().new();
+        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+        developer._getServerInfo(receivePort.sendPort);
+        let uri = (yield uriCompleter.future);
+        receivePort.close();
+        return new developer.ServiceProtocolInfo(uri);
+      }, developer.ServiceProtocolInfo);
+    }
+    static controlWebServer(opts) {
+      return dart.async(function*(opts) {
+        let enable = opts && 'enable' in opts ? opts.enable : false;
+        if (!(typeof enable == 'boolean')) {
+          dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
+        }
+        let receivePort = isolate.RawReceivePort.new();
+        let uriCompleter = CompleterOfUri().new();
+        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+        developer._webServerControl(receivePort.sendPort, enable);
+        let uri = (yield uriCompleter.future);
+        receivePort.close();
+        return new developer.ServiceProtocolInfo(uri);
+      }, developer.ServiceProtocolInfo, opts);
+    }
+  };
+  dart.setSignature(developer.Service, {
+    statics: () => ({
+      getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
+      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+    }),
+    names: ['getInfo', 'controlWebServer']
+  });
+  developer._getServerInfo = function(sp) {
+    sp.send(null);
+  };
+  dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
+  developer._webServerControl = function(sp, enable) {
+    sp.send(null);
+  };
+  dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
+  developer._getServiceMajorVersion = function() {
+    return 0;
+  };
+  dart.fn(developer._getServiceMajorVersion, VoidToint());
+  developer._getServiceMinorVersion = function() {
+    return 0;
+  };
+  dart.fn(developer._getServiceMinorVersion, VoidToint());
   isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
     new(message) {
       this.message = message;
@@ -56881,19 +57708,19 @@
     statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
     names: ['createElement_tag']
   });
-  const _value$0 = Symbol('_value');
+  const _value$1 = Symbol('_value');
   html$.ScrollAlignment = class ScrollAlignment extends core.Object {
     _internal(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
     }
     toString() {
-      return dart.str`ScrollAlignment.${this[_value$0]}`;
+      return dart.str`ScrollAlignment.${this[_value$1]}`;
     }
   };
   dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
   dart.setSignature(html$.ScrollAlignment, {
     constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
-    fields: () => ({[_value$0]: dart.dynamic}),
+    fields: () => ({[_value$1]: dart.dynamic}),
     sfields: () => ({
       TOP: html$.ScrollAlignment,
       CENTER: html$.ScrollAlignment,
@@ -80154,43 +80981,43 @@
   const _unit = Symbol('_unit');
   html$.Dimension = class Dimension extends core.Object {
     percent(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = '%';
     }
     px(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'px';
     }
     pc(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'pc';
     }
     pt(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'pt';
     }
     inch(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'in';
     }
     cm(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'cm';
     }
     mm(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'mm';
     }
     em(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'em';
     }
     ex(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'ex';
     }
     css(cssValue) {
-      this[_value$0] = null;
+      this[_value$1] = null;
       this[_unit] = null;
       if (cssValue == '') cssValue = '0px';
       if (dart.test(cssValue[dartx.endsWith]('%'))) {
@@ -80199,16 +81026,16 @@
         this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
       }
       if (dart.test(cssValue[dartx.contains]('.'))) {
-        this[_value$0] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+        this[_value$1] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
       } else {
-        this[_value$0] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+        this[_value$1] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
       }
     }
     toString() {
-      return dart.str`${this[_value$0]}${this[_unit]}`;
+      return dart.str`${this[_value$1]}${this[_unit]}`;
     }
     get value() {
-      return this[_value$0];
+      return this[_value$1];
     }
   };
   dart.defineNamedConstructor(html$.Dimension, 'percent');
@@ -80235,7 +81062,7 @@
       css: dart.definiteFunctionType(html$.Dimension, [core.String])
     }),
     fields: () => ({
-      [_value$0]: core.num,
+      [_value$1]: core.num,
       [_unit]: core.String
     }),
     getters: () => ({value: dart.definiteFunctionType(core.num, [])})
@@ -94850,6 +95677,7 @@
     collection: collection,
     convert: convert,
     core: core,
+    developer: developer,
     isolate: isolate,
     js: js,
     js_util: js_util,
diff --git a/pkg/dev_compiler/lib/js/common/dart_sdk.js b/pkg/dev_compiler/lib/js/common/dart_sdk.js
index 2656bda..c053cc4 100644
--- a/pkg/dev_compiler/lib/js/common/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/common/dart_sdk.js
@@ -17,6 +17,7 @@
   const collection = Object.create(null);
   const convert = Object.create(null);
   const core = Object.create(null);
+  const developer = Object.create(null);
   const isolate = Object.create(null);
   const js = Object.create(null);
   const js_util = Object.create(null);
@@ -376,6 +377,12 @@
   let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
   let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
   let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+  let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
+  let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
+  let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
+  let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
+  let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
+  let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
   let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
   let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
   let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
@@ -616,11 +623,12 @@
   let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
   let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
   let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
-  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
+  let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
+  let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
+  let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
   let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
   let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
   let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
-  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
   let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
   let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
@@ -678,9 +686,24 @@
   let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
   let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
   let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
+  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
   let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
   let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+  let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
+  let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
+  let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
+  let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
+  let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
+  let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
+  let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
+  let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
+  let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
+  let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
+  let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
+  let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
+  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
+  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
   let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
   let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
@@ -749,6 +772,7 @@
   let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
   let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
   let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
+  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
   let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
   let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
@@ -780,10 +804,10 @@
     return Mixin;
   };
   dart.getMixins = function(clazz) {
-    return clazz[dart._mixins];
+    return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
   };
   dart.getImplements = function(clazz) {
-    return clazz[dart.implements];
+    return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
   };
   dart.flattenFutures = function(builder) {
     function flatten(T) {
@@ -8657,18 +8681,26 @@
   });
   _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
   const _name = Symbol('_name');
+  const _nativeSymbol = Symbol('_nativeSymbol');
   _internal.Symbol = class Symbol extends core.Object {
     new(name) {
       this[_name] = name;
+      this[_nativeSymbol] = null;
+    }
+    es6(name, nativeSymbol) {
+      this[_name] = name;
+      this[_nativeSymbol] = nativeSymbol;
     }
     unvalidated(name) {
       this[_name] = name;
+      this[_nativeSymbol] = null;
     }
     validated(name) {
       this[_name] = _internal.Symbol.validatePublicSymbol(name);
+      this[_nativeSymbol] = null;
     }
     ['=='](other) {
-      return _internal.Symbol.is(other) && this[_name] == other[_name];
+      return _internal.Symbol.is(other) && this[_name] == other[_name] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
     }
     get hashCode() {
       let hash = this._hashCode;
@@ -8684,6 +8716,9 @@
     static getName(symbol) {
       return symbol[_name];
     }
+    static getNativeSymbol(symbol) {
+      return symbol[_nativeSymbol];
+    }
     static validatePublicSymbol(name) {
       if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
       if (dart.test(name[dartx.startsWith]('_'))) {
@@ -8695,16 +8730,21 @@
       return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
     }
   };
+  dart.defineNamedConstructor(_internal.Symbol, 'es6');
   dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
   dart.defineNamedConstructor(_internal.Symbol, 'validated');
   _internal.Symbol[dart.implements] = () => [core.Symbol];
   dart.setSignature(_internal.Symbol, {
     constructors: () => ({
       new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
+      es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
       unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
       validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
     }),
-    fields: () => ({[_name]: core.String}),
+    fields: () => ({
+      [_name]: core.String,
+      [_nativeSymbol]: dart.dynamic
+    }),
     methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
     sfields: () => ({
       reservedWordRE: core.String,
@@ -8716,10 +8756,11 @@
     }),
     statics: () => ({
       getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
+      getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
       validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
       isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
     }),
-    names: ['getName', 'validatePublicSymbol', 'isValidSymbol']
+    names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
   });
   _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
   _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
@@ -13230,73 +13271,109 @@
     return _js_mirrors._dart.definiteFunctionType(type, []);
   };
   dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
+  _js_mirrors._getMixins = function(type) {
+    return _js_mirrors._dart.getMixins(type, []);
+  };
+  dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
   _js_mirrors._Lazy$ = dart.generic(T => {
     const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
     return _Lazy;
   });
   _js_mirrors._Lazy = _Lazy();
+  _js_mirrors._getESSymbol = function(symbol) {
+    return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+  };
+  dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
+  _js_mirrors._getMember = function(symbol) {
+    let privateSymbol = _js_mirrors._getESSymbol(symbol);
+    if (privateSymbol != null) {
+      return privateSymbol;
+    }
+    return _js_mirrors.getName(symbol);
+  };
+  dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
   _js_mirrors._getNameForESSymbol = function(member) {
+    dart.assert(typeof member == "symbol");
     let str = dart.toString(member);
     dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
     return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
   };
   dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
+  _js_mirrors._getSymbolForESSymbol = function(member) {
+    let name = _js_mirrors._getNameForESSymbol(member);
+    return new _internal.Symbol.es6(name, member);
+  };
+  dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
+  _js_mirrors._getSymbolForMember = function(member) {
+    if (typeof member == 'string') {
+      return core.Symbol.new(member);
+    } else {
+      let name = _js_mirrors._getNameForESSymbol(member);
+      return new _internal.Symbol.es6(name, member);
+    }
+  };
+  dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
   _js_mirrors._toDartMap = function(data) {
-    if (data == null) return dart.map();
-    let map = _js_mirrors._dart.map(data);
+    if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
+    let map = MapOfSymbol$dynamic().new();
+    let publicMembers = Object.getOwnPropertyNames(data);
+    for (let member of core.Iterable._check(publicMembers)) {
+      let symbol = core.Symbol.new(core.String._check(member));
+      map[dartx._set](symbol, data[member]);
+    }
     let privateMembers = Object.getOwnPropertySymbols(data);
     for (let member of core.Iterable._check(privateMembers)) {
-      let name = _js_mirrors._getNameForESSymbol(member);
-      map[dartx._set](name, data[member]);
+      let symbol = _js_mirrors._getSymbolForESSymbol(member);
+      map[dartx._set](symbol, data[member]);
     }
     return map;
   };
-  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getConstructors = function(obj) {
     let sig = _js_mirrors._dart.getConstructorSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getFields = function(obj) {
     let sig = _js_mirrors._dart.getFieldSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getMethods = function(obj) {
     let sig = _js_mirrors._dart.getMethodSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getGetters = function(obj) {
     let sig = _js_mirrors._dart.getGetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getSetters = function(obj) {
     let sig = _js_mirrors._dart.getSetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticFields = function(obj) {
     let sig = _js_mirrors._dart.getStaticFieldSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStatics = function(obj) {
     let sig = _js_mirrors._dart.getStaticSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticGetters = function(obj) {
     let sig = _js_mirrors._dart.getStaticGetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticSetters = function(obj) {
     let sig = _js_mirrors._dart.getStaticSetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._unwrap = function(obj) {
     return _js_mirrors._dart.unwrapType(obj);
   };
@@ -13435,15 +13512,7 @@
     [_getAccessor](reflectee, symbol, args, namedArgs) {
       if (args === void 0) args = null;
       if (namedArgs === void 0) namedArgs = null;
-      let name = _js_mirrors.getName(symbol);
-      if (!dart.test(name[dartx.startsWith]('_'))) return name;
-      let privateMembers = Object.getOwnPropertySymbols(reflectee);
-      dart.dsend(privateMembers, 'addAll', Object.getOwnPropertySymbols(reflectee.__proto__));
-      for (let member of core.Iterable._check(privateMembers)) {
-        let privateName = _js_mirrors._getNameForESSymbol(member);
-        if (name == privateName) return member;
-      }
-      return new core.NoSuchMethodError(reflectee, symbol, args, namedArgs);
+      return _js_mirrors._getMember(symbol);
     }
     getField(symbol) {
       let name = this[_getAccessor](this.reflectee, symbol);
@@ -13520,6 +13589,7 @@
   let const$0;
   const _declarations = Symbol('_declarations');
   const _raw = Symbol('_raw');
+  const _mixin = Symbol('_mixin');
   const _typeArguments = Symbol('_typeArguments');
   let const$1;
   _js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
@@ -13536,67 +13606,66 @@
         this[_declarations] = MapOfSymbol$DeclarationMirror().new();
         let unwrapped = _js_mirrors._unwrap(this[_cls]);
         let constructors = _js_mirrors._getConstructors(unwrapped);
-        constructors[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        constructors[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         if (dart.test(constructors[dartx.isEmpty])) {
           let name = 'new';
           let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
           let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, name, ft));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
         }
         let fields = _js_mirrors._getFields(unwrapped);
-        fields[dartx.forEach](dart.fn((name, t) => {
-          let symbol = core.Symbol.new(name);
+        fields[dartx.forEach](dart.fn((symbol, t) => {
           let metadata = [];
           if (core.List.is(t)) {
             metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
             t = dart.dindex(t, 0);
           }
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(name, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, StringAnddynamicTovoid()));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+        }, SymbolAnddynamicTovoid()));
         let methods = _js_mirrors._getMethods(unwrapped);
-        methods[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        methods[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let getters = _js_mirrors._getGetters(unwrapped);
-        getters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        getters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let setters = _js_mirrors._getSetters(unwrapped);
-        setters[dartx.forEach](dart.fn((name, ft) => {
-          name = dart.notNull(name) + '=';
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        setters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
+          symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticFields = _js_mirrors._getStaticFields(unwrapped);
-        staticFields[dartx.forEach](dart.fn((name, t) => {
-          let symbol = core.Symbol.new(name);
+        staticFields[dartx.forEach](dart.fn((symbol, t) => {
+          let name = _js_mirrors.getName(symbol);
           let metadata = [];
           if (core.List.is(t)) {
             metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
             t = dart.dindex(t, 0);
           }
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(name, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, StringAnddynamicTovoid()));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+        }, SymbolAnddynamicTovoid()));
         let statics = _js_mirrors._getStatics(unwrapped);
-        statics[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        statics[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
-        staticGetters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
-        staticSetters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
       }
       return this[_declarations];
@@ -13605,7 +13674,7 @@
       this[_cls] = cls;
       this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
       this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
-      this.mixin = null;
+      this[_mixin] = null;
       this[_typeArguments] = null;
       this[_metadata$] = null;
       this[_declarations] = null;
@@ -13676,6 +13745,21 @@
         return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
       }
     }
+    get mixin() {
+      if (this[_mixin] != null) {
+        return this[_mixin];
+      }
+      let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
+      if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
+        this[_mixin] = this;
+        return this[_mixin];
+      }
+      if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
+        dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
+      }
+      this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
+      return this[_mixin];
+    }
     toString() {
       return dart.str`ClassMirror on '${this[_cls]}'`;
     }
@@ -13724,7 +13808,7 @@
       [_cls]: core.Type,
       simpleName: core.Symbol,
       [_raw]: dart.dynamic,
-      mixin: mirrors.ClassMirror,
+      [_mixin]: mirrors.ClassMirror,
       [_typeArguments]: ListOfTypeMirror(),
       [_metadata$]: ListOfInstanceMirror(),
       [_declarations]: MapOfSymbol$DeclarationMirror()
@@ -13738,7 +13822,8 @@
       isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
       typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
       originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
-      superclass: dart.definiteFunctionType(mirrors.ClassMirror, [])
+      superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
+      mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
     }),
     methods: () => ({
       newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
@@ -13747,13 +13832,15 @@
       invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
     })
   });
+  const _symbol = Symbol('_symbol');
   const _name$ = Symbol('_name');
   _js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
     get simpleName() {
-      return core.Symbol.new(this[_name$]);
+      return this[_symbol];
     }
-    _(name, t, annotations) {
-      this[_name$] = name;
+    _(symbol, t, annotations) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.type = _js_mirrors.reflectType(t);
       this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
       this.isStatic = false;
@@ -13784,8 +13871,9 @@
   dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
   _js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
   dart.setSignature(_js_mirrors.JsVariableMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.String, core.Type, core.List])}),
+    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
     fields: () => ({
+      [_symbol]: core.Symbol,
       [_name$]: core.String,
       type: mirrors.TypeMirror,
       metadata: ListOfInstanceMirror(),
@@ -13795,8 +13883,8 @@
     getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
   });
   _js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
-    _(name, t, annotations) {
-      super._(name, t, annotations);
+    _(member, t, annotations) {
+      super._(member, t, annotations);
     }
     toString() {
       return dart.str`ParameterMirror on '${this[_name$]}'`;
@@ -13835,7 +13923,7 @@
   dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
   _js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
   dart.setSignature(_js_mirrors.JsParameterMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.String, core.Type, core.List])})
+    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
   });
   const _params = Symbol('_params');
   const _createParameterMirrorList = Symbol('_createParameterMirrorList');
@@ -13850,10 +13938,11 @@
       return this[_name$][dartx.startsWith]('_');
     }
     get simpleName() {
-      return core.Symbol.new(this[_name$]);
+      return this[_symbol];
     }
-    _constructor(cls, name, ftype) {
-      this[_name$] = name;
+    _constructor(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = true;
       this.isStatic = false;
       this[_params] = null;
@@ -13861,8 +13950,9 @@
       this.isFinal = false;
       this[_createParameterMirrorList](ftype);
     }
-    _instanceMethod(cls, name, ftype) {
-      this[_name$] = name;
+    _instanceMethod(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = false;
       this.isStatic = false;
       this[_params] = null;
@@ -13870,8 +13960,9 @@
       this.isFinal = false;
       this[_createParameterMirrorList](ftype);
     }
-    _staticMethod(cls, name, ftype) {
-      this[_name$] = name;
+    _staticMethod(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = false;
       this.isStatic = true;
       this[_params] = null;
@@ -13880,7 +13971,7 @@
       this[_createParameterMirrorList](ftype);
     }
     get constructorName() {
-      return dart.test(this.isConstructor) ? core.Symbol.new(this[_name$]) : null;
+      return dart.test(this.isConstructor) ? this[_symbol] : null;
     }
     get parameters() {
       return this[_params];
@@ -13909,13 +14000,13 @@
       for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
         let type = args[dartx._get](i);
         let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
-        let param = new _js_mirrors.JsParameterMirror._('', core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
         params[dartx._set](i, param);
       }
       for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
         let type = opts[dartx._get](i);
         let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
-        let param = new _js_mirrors.JsParameterMirror._('', core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
         params[dartx._set](i + dart.notNull(args[dartx.length]), param);
       }
       this[_params] = ListOfParameterMirror().unmodifiable(params);
@@ -13975,11 +14066,12 @@
   _js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
   dart.setSignature(_js_mirrors.JsMethodMirror, {
     constructors: () => ({
-      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic]),
-      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic]),
-      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic])
+      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
     }),
     fields: () => ({
+      [_symbol]: core.Symbol,
       [_name$]: core.String,
       [_params]: ListOfParameterMirror(),
       [_metadata$]: ListOfInstanceMirror(),
@@ -36375,6 +36467,741 @@
   core.UriData._noScheme = -1;
   core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
   core.UriData._uricTable = core.Uri._queryCharTable;
+  developer.debugger = function(opts) {
+    let when = opts && 'when' in opts ? opts.when : true;
+    let message = opts && 'message' in opts ? opts.message : null;
+    if (dart.test(when)) {
+      debugger;
+    }
+    return when;
+  };
+  dart.fn(developer.debugger, __Tobool());
+  developer.inspect = function(object) {
+    return object;
+  };
+  dart.fn(developer.inspect, ObjectToObject());
+  developer.log = function(message, opts) {
+    let time = opts && 'time' in opts ? opts.time : null;
+    let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
+    let level = opts && 'level' in opts ? opts.level : 0;
+    let name = opts && 'name' in opts ? opts.name : '';
+    let zone = opts && 'zone' in opts ? opts.zone : null;
+    let error = opts && 'error' in opts ? opts.error : null;
+    let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
+  };
+  dart.fn(developer.log, String__Tovoid$());
+  dart.defineLazy(developer, {
+    get _extensions() {
+      return MapOfString$ServiceExtensionHandler().new();
+    }
+  });
+  developer._clockValue = 0;
+  const _result = Symbol('_result');
+  const _errorCode = Symbol('_errorCode');
+  const _errorDetail = Symbol('_errorDetail');
+  const _isError = Symbol('_isError');
+  const _toString = Symbol('_toString');
+  developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
+    result(result) {
+      this[_result] = result;
+      this[_errorCode] = null;
+      this[_errorDetail] = null;
+      if (!(typeof this[_result] == 'string')) {
+        dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
+      }
+    }
+    error(errorCode, errorDetail) {
+      this[_result] = null;
+      this[_errorCode] = errorCode;
+      this[_errorDetail] = errorDetail;
+      developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
+      if (!(typeof this[_errorDetail] == 'string')) {
+        dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
+      }
+    }
+    static _errorCodeMessage(errorCode) {
+      developer.ServiceExtensionResponse._validateErrorCode(errorCode);
+      if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
+        return "Invalid params";
+      }
+      return "Server error";
+    }
+    static _validateErrorCode(errorCode) {
+      if (!(typeof errorCode == 'number')) {
+        dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
+      }
+      if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
+        return;
+      }
+      if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
+        return;
+      }
+      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
+    }
+    [_isError]() {
+      return this[_errorCode] != null && this[_errorDetail] != null;
+    }
+    [_toString]() {
+      if (this[_result] != null) {
+        return this[_result];
+      } else {
+        dart.assert(this[_errorCode] != null);
+        dart.assert(this[_errorDetail] != null);
+        return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
+      }
+    }
+  };
+  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
+  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
+  dart.setSignature(developer.ServiceExtensionResponse, {
+    constructors: () => ({
+      result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
+      error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
+    }),
+    fields: () => ({
+      [_result]: core.String,
+      [_errorCode]: core.int,
+      [_errorDetail]: core.String
+    }),
+    methods: () => ({
+      [_isError]: dart.definiteFunctionType(core.bool, []),
+      [_toString]: dart.definiteFunctionType(core.String, [])
+    }),
+    sfields: () => ({
+      kInvalidParams: core.int,
+      kExtensionError: core.int,
+      kExtensionErrorMax: core.int,
+      kExtensionErrorMin: core.int,
+      invalidParams: core.int,
+      extensionError: core.int,
+      extensionErrorMax: core.int,
+      extensionErrorMin: core.int
+    }),
+    statics: () => ({
+      _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
+      _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
+    }),
+    names: ['_errorCodeMessage', '_validateErrorCode']
+  });
+  developer.ServiceExtensionResponse.invalidParams = -32602;
+  developer.ServiceExtensionResponse.extensionError = -32000;
+  developer.ServiceExtensionResponse.extensionErrorMax = -32000;
+  developer.ServiceExtensionResponse.extensionErrorMin = -32016;
+  dart.defineLazy(developer.ServiceExtensionResponse, {
+    get kInvalidParams() {
+      return developer.ServiceExtensionResponse.invalidParams;
+    },
+    get kExtensionError() {
+      return developer.ServiceExtensionResponse.extensionError;
+    },
+    get kExtensionErrorMax() {
+      return developer.ServiceExtensionResponse.extensionErrorMax;
+    },
+    get kExtensionErrorMin() {
+      return developer.ServiceExtensionResponse.extensionErrorMin;
+    }
+  });
+  developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
+  developer.registerExtension = function(method, handler) {
+    if (!(typeof method == 'string')) {
+      dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
+    }
+    if (!dart.test(method[dartx.startsWith]('ext.'))) {
+      dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
+    }
+    if (developer._lookupExtension(method) != null) {
+      dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
+    }
+    if (!developer.ServiceExtensionHandler.is(handler)) {
+      dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
+    }
+    developer._registerExtension(method, handler);
+  };
+  dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
+  developer.postEvent = function(eventKind, eventData) {
+    if (!(typeof eventKind == 'string')) {
+      dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
+    }
+    if (!core.Map.is(eventData)) {
+      dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
+    }
+    let eventDataAsString = convert.JSON.encode(eventData);
+    developer._postEvent(eventKind, eventDataAsString);
+  };
+  dart.fn(developer.postEvent, StringAndMapTovoid());
+  developer._postEvent = function(eventKind, eventData) {
+  };
+  dart.fn(developer._postEvent, StringAndStringTodynamic());
+  developer._lookupExtension = function(method) {
+    return developer._extensions[dartx._get](method);
+  };
+  dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
+  developer._registerExtension = function(method, handler) {
+    developer._extensions[dartx._set](method, handler);
+  };
+  dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
+  developer.UserTag = class UserTag extends core.Object {
+    static new(label) {
+      return developer._FakeUserTag.new(label);
+    }
+    static get defaultTag() {
+      return developer._FakeUserTag._defaultTag;
+    }
+  };
+  dart.setSignature(developer.UserTag, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
+    sfields: () => ({MAX_USER_TAGS: core.int}),
+    sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
+  });
+  developer.UserTag.MAX_USER_TAGS = 64;
+  developer._FakeUserTag = class _FakeUserTag extends core.Object {
+    real(label) {
+      this.label = label;
+    }
+    static new(label) {
+      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+      if (existingTag != null) {
+        return developer._FakeUserTag._check(existingTag);
+      }
+      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+      }
+      let instance = new developer._FakeUserTag.real(label);
+      developer._FakeUserTag._instances[dartx._set](label, instance);
+      return instance;
+    }
+    makeCurrent() {
+      let old = developer._currentTag;
+      developer._currentTag = this;
+      return old;
+    }
+  };
+  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+  dart.setSignature(developer._FakeUserTag, {
+    constructors: () => ({
+      real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
+      new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
+    }),
+    fields: () => ({label: core.String}),
+    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
+    sfields: () => ({
+      _instances: core.Map,
+      _defaultTag: developer.UserTag
+    })
+  });
+  dart.defineLazy(developer._FakeUserTag, {
+    get _instances() {
+      return dart.map();
+    },
+    set _instances(_) {},
+    get _defaultTag() {
+      return developer._FakeUserTag.new('Default');
+    }
+  });
+  dart.defineLazy(developer, {
+    get _currentTag() {
+      return developer._FakeUserTag._defaultTag;
+    },
+    set _currentTag(_) {}
+  });
+  developer.getCurrentTag = function() {
+    return developer._currentTag;
+  };
+  dart.fn(developer.getCurrentTag, VoidToUserTag());
+  developer.Metric = class Metric extends core.Object {
+    new(name, description) {
+      this.name = name;
+      this.description = description;
+      if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
+        dart.throw(new core.ArgumentError('Invalid Metric name.'));
+      }
+    }
+  };
+  dart.setSignature(developer.Metric, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
+    fields: () => ({
+      name: core.String,
+      description: core.String
+    })
+  });
+  const _value$0 = Symbol('_value');
+  const _toJSON = Symbol('_toJSON');
+  developer.Gauge = class Gauge extends developer.Metric {
+    get value() {
+      return this[_value$0];
+    }
+    set value(v) {
+      if (dart.notNull(v) < dart.notNull(this.min)) {
+        v = this.min;
+      } else if (dart.notNull(v) > dart.notNull(this.max)) {
+        v = this.max;
+      }
+      this[_value$0] = v;
+    }
+    new(name, description, min, max) {
+      this.min = min;
+      this.max = max;
+      this[_value$0] = null;
+      super.new(name, description);
+      if (!(typeof this.min == 'number')) {
+        dart.throw(new core.ArgumentError('min must be a double'));
+      }
+      if (!(typeof this.max == 'number')) {
+        dart.throw(new core.ArgumentError('max must be a double'));
+      }
+      if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
+        dart.throw(new core.ArgumentError('min must be less than max'));
+      }
+      this[_value$0] = this.min;
+    }
+    [_toJSON]() {
+      let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
+      return map;
+    }
+  };
+  dart.setSignature(developer.Gauge, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
+    fields: () => ({
+      min: core.double,
+      max: core.double,
+      [_value$0]: core.double
+    }),
+    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+  });
+  developer.Counter = class Counter extends developer.Metric {
+    new(name, description) {
+      this[_value$0] = 0.0;
+      super.new(name, description);
+    }
+    get value() {
+      return this[_value$0];
+    }
+    set value(v) {
+      this[_value$0] = v;
+    }
+    [_toJSON]() {
+      let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
+      return map;
+    }
+  };
+  dart.setSignature(developer.Counter, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
+    fields: () => ({[_value$0]: core.double}),
+    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+  });
+  developer.Metrics = class Metrics extends core.Object {
+    static register(metric) {
+      if (!developer.Metric.is(metric)) {
+        dart.throw(new core.ArgumentError('metric must be a Metric'));
+      }
+      if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
+        dart.throw(new core.ArgumentError('Registered metrics have unique names'));
+      }
+      developer.Metrics._metrics[dartx._set](metric.name, metric);
+    }
+    static deregister(metric) {
+      if (!developer.Metric.is(metric)) {
+        dart.throw(new core.ArgumentError('metric must be a Metric'));
+      }
+      developer.Metrics._metrics[dartx.remove](metric.name);
+    }
+    static _printMetric(id) {
+      let metric = developer.Metrics._metrics[dartx._get](id);
+      if (metric == null) {
+        return null;
+      }
+      return convert.JSON.encode(metric[_toJSON]());
+    }
+    static _printMetrics() {
+      let metrics = [];
+      for (let metric of developer.Metrics._metrics[dartx.values]) {
+        metrics[dartx.add](metric[_toJSON]());
+      }
+      let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
+      return convert.JSON.encode(map);
+    }
+  };
+  dart.setSignature(developer.Metrics, {
+    sfields: () => ({_metrics: MapOfString$Metric()}),
+    statics: () => ({
+      register: dart.definiteFunctionType(dart.void, [developer.Metric]),
+      deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
+      _printMetric: dart.definiteFunctionType(core.String, [core.String]),
+      _printMetrics: dart.definiteFunctionType(core.String, [])
+    }),
+    names: ['register', 'deregister', '_printMetric', '_printMetrics']
+  });
+  dart.defineLazy(developer.Metrics, {
+    get _metrics() {
+      return MapOfString$Metric().new();
+    }
+  });
+  developer._isProduct = false;
+  developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
+  developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
+  const _appendArguments = Symbol('_appendArguments');
+  developer.Timeline = class Timeline extends core.Object {
+    static startSync(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      if (!dart.test(developer._isDartStreamEnabled())) {
+        developer.Timeline._stack[dartx.add](null);
+        return;
+      }
+      let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
+      if (core.Map.is(arguments$)) {
+        block[_appendArguments](arguments$);
+      }
+      developer.Timeline._stack[dartx.add](block);
+    }
+    static finishSync() {
+      if (developer._isProduct) {
+        return;
+      }
+      if (developer.Timeline._stack[dartx.length] == 0) {
+        dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
+      }
+      let block = developer.Timeline._stack[dartx.removeLast]();
+      if (block == null) {
+        return;
+      }
+      block.finish();
+    }
+    static instantSync(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      if (!dart.test(developer._isDartStreamEnabled())) {
+        return;
+      }
+      let instantArguments = null;
+      if (core.Map.is(arguments$)) {
+        instantArguments = core.Map.from(arguments$);
+      }
+      developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
+    }
+    static timeSync(name, func, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      developer.Timeline.startSync(name, {arguments: arguments$});
+      try {
+        return func();
+      } finally {
+        developer.Timeline.finishSync();
+      }
+    }
+    static get now() {
+      return developer._getTraceClock();
+    }
+  };
+  dart.setSignature(developer.Timeline, {
+    sfields: () => ({
+      _stack: ListOf_SyncBlock(),
+      _isolateId: core.int,
+      _isolateIdString: core.String
+    }),
+    sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
+    statics: () => ({
+      startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      finishSync: dart.definiteFunctionType(dart.void, []),
+      instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
+    }),
+    names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
+  });
+  dart.defineLazy(developer.Timeline, {
+    get _stack() {
+      return ListOf_SyncBlock().new();
+    },
+    get _isolateId() {
+      return developer._getIsolateNum();
+    },
+    get _isolateIdString() {
+      return dart.toString(developer.Timeline._isolateId);
+    }
+  });
+  const _stack = Symbol('_stack');
+  const _taskId = Symbol('_taskId');
+  const _start$1 = Symbol('_start');
+  const _finish = Symbol('_finish');
+  developer.TimelineTask = class TimelineTask extends core.Object {
+    new() {
+      this[_stack] = JSArrayOf_AsyncBlock().of([]);
+      this[_taskId] = developer._getNextAsyncId();
+    }
+    withTaskId(taskId) {
+      this[_stack] = JSArrayOf_AsyncBlock().of([]);
+      this[_taskId] = taskId;
+      if (!(typeof taskId == 'number')) {
+        dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
+      }
+    }
+    start(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      let block = new developer._AsyncBlock._(name, this[_taskId]);
+      if (core.Map.is(arguments$)) {
+        block[_appendArguments](arguments$);
+      }
+      this[_stack][dartx.add](block);
+      block[_start$1]();
+    }
+    instant(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      let instantArguments = null;
+      if (core.Map.is(arguments$)) {
+        instantArguments = core.Map.from(arguments$);
+      }
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
+    }
+    finish() {
+      if (developer._isProduct) {
+        return;
+      }
+      if (this[_stack][dartx.length] == 0) {
+        dart.throw(new core.StateError('Uneven calls to start and finish'));
+      }
+      let block = this[_stack][dartx.removeLast]();
+      block[_finish]();
+    }
+    pass() {
+      if (dart.notNull(this[_stack][dartx.length]) > 0) {
+        dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
+      }
+      let r = this[_taskId];
+      return r;
+    }
+  };
+  dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
+  dart.setSignature(developer.TimelineTask, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(developer.TimelineTask, []),
+      withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
+    }),
+    fields: () => ({
+      [_taskId]: core.int,
+      [_stack]: ListOf_AsyncBlock()
+    }),
+    methods: () => ({
+      start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      finish: dart.definiteFunctionType(dart.void, []),
+      pass: dart.definiteFunctionType(core.int, [])
+    })
+  });
+  const _arguments$ = Symbol('_arguments');
+  developer._AsyncBlock = class _AsyncBlock extends core.Object {
+    _(name, taskId) {
+      this.name = name;
+      this[_taskId] = taskId;
+      this.category = 'Dart';
+      this[_arguments$] = null;
+    }
+    [_start$1]() {
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+    }
+    [_finish]() {
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
+    }
+    [_appendArguments](arguments$) {
+      if (this[_arguments$] == null) {
+        this[_arguments$] = dart.map();
+      }
+      this[_arguments$][dartx.addAll](arguments$);
+    }
+  };
+  dart.defineNamedConstructor(developer._AsyncBlock, '_');
+  dart.setSignature(developer._AsyncBlock, {
+    constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
+    fields: () => ({
+      category: core.String,
+      name: core.String,
+      [_taskId]: core.int,
+      [_arguments$]: core.Map
+    }),
+    methods: () => ({
+      [_start$1]: dart.definiteFunctionType(dart.void, []),
+      [_finish]: dart.definiteFunctionType(dart.void, []),
+      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+    })
+  });
+  const _startCpu = Symbol('_startCpu');
+  developer._SyncBlock = class _SyncBlock extends core.Object {
+    _(name, start, startCpu) {
+      this.name = name;
+      this[_start$1] = start;
+      this[_startCpu] = startCpu;
+      this.category = 'Dart';
+      this[_arguments$] = null;
+    }
+    finish() {
+      developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+    }
+    [_appendArguments](arguments$) {
+      if (arguments$ == null) {
+        return;
+      }
+      if (this[_arguments$] == null) {
+        this[_arguments$] = dart.map();
+      }
+      this[_arguments$][dartx.addAll](arguments$);
+    }
+  };
+  dart.defineNamedConstructor(developer._SyncBlock, '_');
+  dart.setSignature(developer._SyncBlock, {
+    constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
+    fields: () => ({
+      category: core.String,
+      name: core.String,
+      [_arguments$]: core.Map,
+      [_start$1]: core.int,
+      [_startCpu]: core.int
+    }),
+    methods: () => ({
+      finish: dart.definiteFunctionType(dart.void, []),
+      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+    })
+  });
+  developer._fastPathArguments = null;
+  developer._argumentsAsJson = function(arguments$) {
+    if (arguments$ == null || arguments$[dartx.length] == 0) {
+      if (developer._fastPathArguments == null) {
+        developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
+      }
+      return developer._fastPathArguments;
+    }
+    arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
+    return convert.JSON.encode(arguments$);
+  };
+  dart.fn(developer._argumentsAsJson, MapToString());
+  developer._isDartStreamEnabled = function() {
+    return false;
+  };
+  dart.fn(developer._isDartStreamEnabled, VoidTobool());
+  developer._getNextAsyncId = function() {
+    return 0;
+  };
+  dart.fn(developer._getNextAsyncId, VoidToint());
+  developer._getTraceClock = function() {
+    let x = developer._clockValue;
+    developer._clockValue = dart.notNull(x) + 1;
+    return x;
+  };
+  dart.fn(developer._getTraceClock, VoidToint());
+  developer._getThreadCpuClock = function() {
+    return -1;
+  };
+  dart.fn(developer._getThreadCpuClock, VoidToint());
+  developer._getIsolateNum = function() {
+    return 0;
+  };
+  dart.fn(developer._getIsolateNum, VoidToint());
+  developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
+  developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
+  developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
+  developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
+    new(serverUri) {
+      this.majorVersion = developer._getServiceMajorVersion();
+      this.minorVersion = developer._getServiceMinorVersion();
+      this.serverUri = serverUri;
+    }
+    toString() {
+      if (this.serverUri != null) {
+        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
+      } else {
+        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
+      }
+    }
+  };
+  dart.setSignature(developer.ServiceProtocolInfo, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
+    fields: () => ({
+      majorVersion: core.int,
+      minorVersion: core.int,
+      serverUri: core.Uri
+    })
+  });
+  developer.Service = class Service extends core.Object {
+    static getInfo() {
+      return dart.async(function*() {
+        let receivePort = isolate.RawReceivePort.new();
+        let uriCompleter = CompleterOfUri().new();
+        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+        developer._getServerInfo(receivePort.sendPort);
+        let uri = (yield uriCompleter.future);
+        receivePort.close();
+        return new developer.ServiceProtocolInfo(uri);
+      }, developer.ServiceProtocolInfo);
+    }
+    static controlWebServer(opts) {
+      return dart.async(function*(opts) {
+        let enable = opts && 'enable' in opts ? opts.enable : false;
+        if (!(typeof enable == 'boolean')) {
+          dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
+        }
+        let receivePort = isolate.RawReceivePort.new();
+        let uriCompleter = CompleterOfUri().new();
+        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+        developer._webServerControl(receivePort.sendPort, enable);
+        let uri = (yield uriCompleter.future);
+        receivePort.close();
+        return new developer.ServiceProtocolInfo(uri);
+      }, developer.ServiceProtocolInfo, opts);
+    }
+  };
+  dart.setSignature(developer.Service, {
+    statics: () => ({
+      getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
+      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+    }),
+    names: ['getInfo', 'controlWebServer']
+  });
+  developer._getServerInfo = function(sp) {
+    sp.send(null);
+  };
+  dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
+  developer._webServerControl = function(sp, enable) {
+    sp.send(null);
+  };
+  dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
+  developer._getServiceMajorVersion = function() {
+    return 0;
+  };
+  dart.fn(developer._getServiceMajorVersion, VoidToint());
+  developer._getServiceMinorVersion = function() {
+    return 0;
+  };
+  dart.fn(developer._getServiceMinorVersion, VoidToint());
   isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
     new(message) {
       this.message = message;
@@ -56881,19 +57708,19 @@
     statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
     names: ['createElement_tag']
   });
-  const _value$0 = Symbol('_value');
+  const _value$1 = Symbol('_value');
   html$.ScrollAlignment = class ScrollAlignment extends core.Object {
     _internal(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
     }
     toString() {
-      return dart.str`ScrollAlignment.${this[_value$0]}`;
+      return dart.str`ScrollAlignment.${this[_value$1]}`;
     }
   };
   dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
   dart.setSignature(html$.ScrollAlignment, {
     constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
-    fields: () => ({[_value$0]: dart.dynamic}),
+    fields: () => ({[_value$1]: dart.dynamic}),
     sfields: () => ({
       TOP: html$.ScrollAlignment,
       CENTER: html$.ScrollAlignment,
@@ -80154,43 +80981,43 @@
   const _unit = Symbol('_unit');
   html$.Dimension = class Dimension extends core.Object {
     percent(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = '%';
     }
     px(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'px';
     }
     pc(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'pc';
     }
     pt(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'pt';
     }
     inch(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'in';
     }
     cm(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'cm';
     }
     mm(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'mm';
     }
     em(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'em';
     }
     ex(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'ex';
     }
     css(cssValue) {
-      this[_value$0] = null;
+      this[_value$1] = null;
       this[_unit] = null;
       if (cssValue == '') cssValue = '0px';
       if (dart.test(cssValue[dartx.endsWith]('%'))) {
@@ -80199,16 +81026,16 @@
         this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
       }
       if (dart.test(cssValue[dartx.contains]('.'))) {
-        this[_value$0] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+        this[_value$1] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
       } else {
-        this[_value$0] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+        this[_value$1] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
       }
     }
     toString() {
-      return dart.str`${this[_value$0]}${this[_unit]}`;
+      return dart.str`${this[_value$1]}${this[_unit]}`;
     }
     get value() {
-      return this[_value$0];
+      return this[_value$1];
     }
   };
   dart.defineNamedConstructor(html$.Dimension, 'percent');
@@ -80235,7 +81062,7 @@
       css: dart.definiteFunctionType(html$.Dimension, [core.String])
     }),
     fields: () => ({
-      [_value$0]: core.num,
+      [_value$1]: core.num,
       [_unit]: core.String
     }),
     getters: () => ({value: dart.definiteFunctionType(core.num, [])})
@@ -94849,6 +95676,7 @@
   exports.collection = collection;
   exports.convert = convert;
   exports.core = core;
+  exports.developer = developer;
   exports.isolate = isolate;
   exports.js = js;
   exports.js_util = js_util;
diff --git a/pkg/dev_compiler/lib/js/es6/dart_sdk.js b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
index 754189c..1092e10 100644
--- a/pkg/dev_compiler/lib/js/es6/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
@@ -15,6 +15,7 @@
 export const collection = Object.create(null);
 export const convert = Object.create(null);
 export const core = Object.create(null);
+export const developer = Object.create(null);
 export const isolate = Object.create(null);
 export const js = Object.create(null);
 export const js_util = Object.create(null);
@@ -374,6 +375,12 @@
 let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
 let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
 let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
+let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
+let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
+let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
+let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
+let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
 let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
 let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
 let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
@@ -614,11 +621,12 @@
 let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
 let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
 let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
-let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
+let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
+let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
+let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
 let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
 let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
 let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
-let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
 let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
 let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
 let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
@@ -676,9 +684,24 @@
 let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
 let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
 let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
+let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
 let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
 let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
 let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
+let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
+let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
+let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
+let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
+let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
+let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
+let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
+let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
+let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
+let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
+let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
+let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
+let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
 let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
 let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
 let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
@@ -747,6 +770,7 @@
 let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.Node, html.Node])))();
 let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html.ImageData, [dart.dynamic])))();
 let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html.ImageData])))();
+let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
 let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
 let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
 let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
@@ -778,10 +802,10 @@
   return Mixin;
 };
 dart.getMixins = function(clazz) {
-  return clazz[dart._mixins];
+  return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
 };
 dart.getImplements = function(clazz) {
-  return clazz[dart.implements];
+  return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
 };
 dart.flattenFutures = function(builder) {
   function flatten(T) {
@@ -8655,18 +8679,26 @@
 });
 _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
 const _name = Symbol('_name');
+const _nativeSymbol = Symbol('_nativeSymbol');
 _internal.Symbol = class Symbol extends core.Object {
   new(name) {
     this[_name] = name;
+    this[_nativeSymbol] = null;
+  }
+  es6(name, nativeSymbol) {
+    this[_name] = name;
+    this[_nativeSymbol] = nativeSymbol;
   }
   unvalidated(name) {
     this[_name] = name;
+    this[_nativeSymbol] = null;
   }
   validated(name) {
     this[_name] = _internal.Symbol.validatePublicSymbol(name);
+    this[_nativeSymbol] = null;
   }
   ['=='](other) {
-    return _internal.Symbol.is(other) && this[_name] == other[_name];
+    return _internal.Symbol.is(other) && this[_name] == other[_name] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
   }
   get hashCode() {
     let hash = this._hashCode;
@@ -8682,6 +8714,9 @@
   static getName(symbol) {
     return symbol[_name];
   }
+  static getNativeSymbol(symbol) {
+    return symbol[_nativeSymbol];
+  }
   static validatePublicSymbol(name) {
     if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
     if (dart.test(name[dartx.startsWith]('_'))) {
@@ -8693,16 +8728,21 @@
     return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
   }
 };
+dart.defineNamedConstructor(_internal.Symbol, 'es6');
 dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
 dart.defineNamedConstructor(_internal.Symbol, 'validated');
 _internal.Symbol[dart.implements] = () => [core.Symbol];
 dart.setSignature(_internal.Symbol, {
   constructors: () => ({
     new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
+    es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
     unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
     validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
   }),
-  fields: () => ({[_name]: core.String}),
+  fields: () => ({
+    [_name]: core.String,
+    [_nativeSymbol]: dart.dynamic
+  }),
   methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
   sfields: () => ({
     reservedWordRE: core.String,
@@ -8714,10 +8754,11 @@
   }),
   statics: () => ({
     getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
+    getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
     validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
     isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
   }),
-  names: ['getName', 'validatePublicSymbol', 'isValidSymbol']
+  names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
 });
 _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
 _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
@@ -13228,73 +13269,109 @@
   return _js_mirrors._dart.definiteFunctionType(type, []);
 };
 dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic());
+_js_mirrors._getMixins = function(type) {
+  return _js_mirrors._dart.getMixins(type, []);
+};
+dart.fn(_js_mirrors._getMixins, dynamicTodynamic());
 _js_mirrors._Lazy$ = dart.generic(T => {
   const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
   return _Lazy;
 });
 _js_mirrors._Lazy = _Lazy();
+_js_mirrors._getESSymbol = function(symbol) {
+  return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+};
+dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
+_js_mirrors._getMember = function(symbol) {
+  let privateSymbol = _js_mirrors._getESSymbol(symbol);
+  if (privateSymbol != null) {
+    return privateSymbol;
+  }
+  return _js_mirrors.getName(symbol);
+};
+dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
 _js_mirrors._getNameForESSymbol = function(member) {
+  dart.assert(typeof member == "symbol");
   let str = dart.toString(member);
   dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
   return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
 };
 dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
+_js_mirrors._getSymbolForESSymbol = function(member) {
+  let name = _js_mirrors._getNameForESSymbol(member);
+  return new _internal.Symbol.es6(name, member);
+};
+dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
+_js_mirrors._getSymbolForMember = function(member) {
+  if (typeof member == 'string') {
+    return core.Symbol.new(member);
+  } else {
+    let name = _js_mirrors._getNameForESSymbol(member);
+    return new _internal.Symbol.es6(name, member);
+  }
+};
+dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
 _js_mirrors._toDartMap = function(data) {
-  if (data == null) return dart.map();
-  let map = _js_mirrors._dart.map(data);
+  if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
+  let map = MapOfSymbol$dynamic().new();
+  let publicMembers = Object.getOwnPropertyNames(data);
+  for (let member of core.Iterable._check(publicMembers)) {
+    let symbol = core.Symbol.new(core.String._check(member));
+    map[dartx._set](symbol, data[member]);
+  }
   let privateMembers = Object.getOwnPropertySymbols(data);
   for (let member of core.Iterable._check(privateMembers)) {
-    let name = _js_mirrors._getNameForESSymbol(member);
-    map[dartx._set](name, data[member]);
+    let symbol = _js_mirrors._getSymbolForESSymbol(member);
+    map[dartx._set](symbol, data[member]);
   }
   return map;
 };
-dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getConstructors = function(obj) {
   let sig = _js_mirrors._dart.getConstructorSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getFields = function(obj) {
   let sig = _js_mirrors._dart.getFieldSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getFields, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getMethods = function(obj) {
   let sig = _js_mirrors._dart.getMethodSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getGetters = function(obj) {
   let sig = _js_mirrors._dart.getGetterSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getSetters = function(obj) {
   let sig = _js_mirrors._dart.getSetterSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getStaticFields = function(obj) {
   let sig = _js_mirrors._dart.getStaticFieldSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getStatics = function(obj) {
   let sig = _js_mirrors._dart.getStaticSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getStaticGetters = function(obj) {
   let sig = _js_mirrors._dart.getStaticGetterSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._getStaticSetters = function(obj) {
   let sig = _js_mirrors._dart.getStaticSetterSig(obj);
   return _js_mirrors._toDartMap(sig);
 };
-dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMap());
+dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
 _js_mirrors._unwrap = function(obj) {
   return _js_mirrors._dart.unwrapType(obj);
 };
@@ -13433,15 +13510,7 @@
   [_getAccessor](reflectee, symbol, args, namedArgs) {
     if (args === void 0) args = null;
     if (namedArgs === void 0) namedArgs = null;
-    let name = _js_mirrors.getName(symbol);
-    if (!dart.test(name[dartx.startsWith]('_'))) return name;
-    let privateMembers = Object.getOwnPropertySymbols(reflectee);
-    dart.dsend(privateMembers, 'addAll', Object.getOwnPropertySymbols(reflectee.__proto__));
-    for (let member of core.Iterable._check(privateMembers)) {
-      let privateName = _js_mirrors._getNameForESSymbol(member);
-      if (name == privateName) return member;
-    }
-    return new core.NoSuchMethodError(reflectee, symbol, args, namedArgs);
+    return _js_mirrors._getMember(symbol);
   }
   getField(symbol) {
     let name = this[_getAccessor](this.reflectee, symbol);
@@ -13518,6 +13587,7 @@
 let const;
 const _declarations = Symbol('_declarations');
 const _raw = Symbol('_raw');
+const _mixin = Symbol('_mixin');
 const _typeArguments = Symbol('_typeArguments');
 let const;
 _js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
@@ -13534,67 +13604,66 @@
       this[_declarations] = MapOfSymbol$DeclarationMirror().new();
       let unwrapped = _js_mirrors._unwrap(this[_cls]);
       let constructors = _js_mirrors._getConstructors(unwrapped);
-      constructors[dartx.forEach](dart.fn((name, ft) => {
-        let symbol = core.Symbol.new(name);
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, name, ft));
-      }, StringAnddynamicTovoid()));
+      constructors[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
+      }, SymbolAnddynamicTovoid()));
       if (dart.test(constructors[dartx.isEmpty])) {
         let name = 'new';
         let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
         let symbol = core.Symbol.new(name);
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, name, ft));
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
       }
       let fields = _js_mirrors._getFields(unwrapped);
-      fields[dartx.forEach](dart.fn((name, t) => {
-        let symbol = core.Symbol.new(name);
+      fields[dartx.forEach](dart.fn((symbol, t) => {
         let metadata = [];
         if (core.List.is(t)) {
           metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
           t = dart.dindex(t, 0);
         }
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(name, core.Type._check(_js_mirrors._wrap(t)), metadata));
-      }, StringAnddynamicTovoid()));
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+      }, SymbolAnddynamicTovoid()));
       let methods = _js_mirrors._getMethods(unwrapped);
-      methods[dartx.forEach](dart.fn((name, ft) => {
-        let symbol = core.Symbol.new(name);
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-      }, StringAnddynamicTovoid()));
+      methods[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+      }, SymbolAnddynamicTovoid()));
       let getters = _js_mirrors._getGetters(unwrapped);
-      getters[dartx.forEach](dart.fn((name, ft) => {
-        let symbol = core.Symbol.new(name);
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-      }, StringAnddynamicTovoid()));
+      getters[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+      }, SymbolAnddynamicTovoid()));
       let setters = _js_mirrors._getSetters(unwrapped);
-      setters[dartx.forEach](dart.fn((name, ft) => {
-        name = dart.notNull(name) + '=';
-        let symbol = core.Symbol.new(name);
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-      }, StringAnddynamicTovoid()));
+      setters[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
+        symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+      }, SymbolAnddynamicTovoid()));
       let staticFields = _js_mirrors._getStaticFields(unwrapped);
-      staticFields[dartx.forEach](dart.fn((name, t) => {
-        let symbol = core.Symbol.new(name);
+      staticFields[dartx.forEach](dart.fn((symbol, t) => {
+        let name = _js_mirrors.getName(symbol);
         let metadata = [];
         if (core.List.is(t)) {
           metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
           t = dart.dindex(t, 0);
         }
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(name, core.Type._check(_js_mirrors._wrap(t)), metadata));
-      }, StringAnddynamicTovoid()));
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+      }, SymbolAnddynamicTovoid()));
       let statics = _js_mirrors._getStatics(unwrapped);
-      statics[dartx.forEach](dart.fn((name, ft) => {
-        let symbol = core.Symbol.new(name);
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-      }, StringAnddynamicTovoid()));
+      statics[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+      }, SymbolAnddynamicTovoid()));
       let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
-      staticGetters[dartx.forEach](dart.fn((name, ft) => {
-        let symbol = core.Symbol.new(name);
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-      }, StringAnddynamicTovoid()));
+      staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+      }, SymbolAnddynamicTovoid()));
       let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
-      staticSetters[dartx.forEach](dart.fn((name, ft) => {
-        let symbol = core.Symbol.new(name);
-        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-      }, StringAnddynamicTovoid()));
+      staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+      }, SymbolAnddynamicTovoid()));
       this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
     }
     return this[_declarations];
@@ -13603,7 +13672,7 @@
     this[_cls] = cls;
     this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
     this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
-    this.mixin = null;
+    this[_mixin] = null;
     this[_typeArguments] = null;
     this[_metadata] = null;
     this[_declarations] = null;
@@ -13674,6 +13743,21 @@
       return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
     }
   }
+  get mixin() {
+    if (this[_mixin] != null) {
+      return this[_mixin];
+    }
+    let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
+    if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
+      this[_mixin] = this;
+      return this[_mixin];
+    }
+    if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
+      dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
+    }
+    this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
+    return this[_mixin];
+  }
   toString() {
     return dart.str`ClassMirror on '${this[_cls]}'`;
   }
@@ -13722,7 +13806,7 @@
     [_cls]: core.Type,
     simpleName: core.Symbol,
     [_raw]: dart.dynamic,
-    mixin: mirrors.ClassMirror,
+    [_mixin]: mirrors.ClassMirror,
     [_typeArguments]: ListOfTypeMirror(),
     [_metadata]: ListOfInstanceMirror(),
     [_declarations]: MapOfSymbol$DeclarationMirror()
@@ -13736,7 +13820,8 @@
     isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
     typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
     originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
-    superclass: dart.definiteFunctionType(mirrors.ClassMirror, [])
+    superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
+    mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
   }),
   methods: () => ({
     newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
@@ -13745,13 +13830,15 @@
     invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
   })
 });
+const _symbol = Symbol('_symbol');
 const _name = Symbol('_name');
 _js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
   get simpleName() {
-    return core.Symbol.new(this[_name]);
+    return this[_symbol];
   }
-  _(name, t, annotations) {
-    this[_name] = name;
+  _(symbol, t, annotations) {
+    this[_symbol] = symbol;
+    this[_name] = _js_mirrors.getName(symbol);
     this.type = _js_mirrors.reflectType(t);
     this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
     this.isStatic = false;
@@ -13782,8 +13869,9 @@
 dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
 _js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
 dart.setSignature(_js_mirrors.JsVariableMirror, {
-  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.String, core.Type, core.List])}),
+  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
   fields: () => ({
+    [_symbol]: core.Symbol,
     [_name]: core.String,
     type: mirrors.TypeMirror,
     metadata: ListOfInstanceMirror(),
@@ -13793,8 +13881,8 @@
   getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
 });
 _js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
-  _(name, t, annotations) {
-    super._(name, t, annotations);
+  _(member, t, annotations) {
+    super._(member, t, annotations);
   }
   toString() {
     return dart.str`ParameterMirror on '${this[_name]}'`;
@@ -13833,7 +13921,7 @@
 dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
 _js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
 dart.setSignature(_js_mirrors.JsParameterMirror, {
-  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.String, core.Type, core.List])})
+  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
 });
 const _params = Symbol('_params');
 const _createParameterMirrorList = Symbol('_createParameterMirrorList');
@@ -13848,10 +13936,11 @@
     return this[_name][dartx.startsWith]('_');
   }
   get simpleName() {
-    return core.Symbol.new(this[_name]);
+    return this[_symbol];
   }
-  _constructor(cls, name, ftype) {
-    this[_name] = name;
+  _constructor(cls, symbol, ftype) {
+    this[_symbol] = symbol;
+    this[_name] = _js_mirrors.getName(symbol);
     this.isConstructor = true;
     this.isStatic = false;
     this[_params] = null;
@@ -13859,8 +13948,9 @@
     this.isFinal = false;
     this[_createParameterMirrorList](ftype);
   }
-  _instanceMethod(cls, name, ftype) {
-    this[_name] = name;
+  _instanceMethod(cls, symbol, ftype) {
+    this[_symbol] = symbol;
+    this[_name] = _js_mirrors.getName(symbol);
     this.isConstructor = false;
     this.isStatic = false;
     this[_params] = null;
@@ -13868,8 +13958,9 @@
     this.isFinal = false;
     this[_createParameterMirrorList](ftype);
   }
-  _staticMethod(cls, name, ftype) {
-    this[_name] = name;
+  _staticMethod(cls, symbol, ftype) {
+    this[_symbol] = symbol;
+    this[_name] = _js_mirrors.getName(symbol);
     this.isConstructor = false;
     this.isStatic = true;
     this[_params] = null;
@@ -13878,7 +13969,7 @@
     this[_createParameterMirrorList](ftype);
   }
   get constructorName() {
-    return dart.test(this.isConstructor) ? core.Symbol.new(this[_name]) : null;
+    return dart.test(this.isConstructor) ? this[_symbol] : null;
   }
   get parameters() {
     return this[_params];
@@ -13907,13 +13998,13 @@
     for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
       let type = args[dartx._get](i);
       let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
-      let param = new _js_mirrors.JsParameterMirror._('', core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+      let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
       params[dartx._set](i, param);
     }
     for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
       let type = opts[dartx._get](i);
       let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
-      let param = new _js_mirrors.JsParameterMirror._('', core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+      let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
       params[dartx._set](i + dart.notNull(args[dartx.length]), param);
     }
     this[_params] = ListOfParameterMirror().unmodifiable(params);
@@ -13973,11 +14064,12 @@
 _js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
 dart.setSignature(_js_mirrors.JsMethodMirror, {
   constructors: () => ({
-    _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic]),
-    _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic]),
-    _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic])
+    _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+    _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+    _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
   }),
   fields: () => ({
+    [_symbol]: core.Symbol,
     [_name]: core.String,
     [_params]: ListOfParameterMirror(),
     [_metadata]: ListOfInstanceMirror(),
@@ -36373,6 +36465,741 @@
 core.UriData._noScheme = -1;
 core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
 core.UriData._uricTable = core.Uri._queryCharTable;
+developer.debugger = function(opts) {
+  let when = opts && 'when' in opts ? opts.when : true;
+  let message = opts && 'message' in opts ? opts.message : null;
+  if (dart.test(when)) {
+    debugger;
+  }
+  return when;
+};
+dart.fn(developer.debugger, __Tobool());
+developer.inspect = function(object) {
+  return object;
+};
+dart.fn(developer.inspect, ObjectToObject());
+developer.log = function(message, opts) {
+  let time = opts && 'time' in opts ? opts.time : null;
+  let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
+  let level = opts && 'level' in opts ? opts.level : 0;
+  let name = opts && 'name' in opts ? opts.name : '';
+  let zone = opts && 'zone' in opts ? opts.zone : null;
+  let error = opts && 'error' in opts ? opts.error : null;
+  let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
+};
+dart.fn(developer.log, String__Tovoid());
+dart.defineLazy(developer, {
+  get _extensions() {
+    return MapOfString$ServiceExtensionHandler().new();
+  }
+});
+developer._clockValue = 0;
+const _result = Symbol('_result');
+const _errorCode = Symbol('_errorCode');
+const _errorDetail = Symbol('_errorDetail');
+const _isError = Symbol('_isError');
+const _toString = Symbol('_toString');
+developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
+  result(result) {
+    this[_result] = result;
+    this[_errorCode] = null;
+    this[_errorDetail] = null;
+    if (!(typeof this[_result] == 'string')) {
+      dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
+    }
+  }
+  error(errorCode, errorDetail) {
+    this[_result] = null;
+    this[_errorCode] = errorCode;
+    this[_errorDetail] = errorDetail;
+    developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
+    if (!(typeof this[_errorDetail] == 'string')) {
+      dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
+    }
+  }
+  static _errorCodeMessage(errorCode) {
+    developer.ServiceExtensionResponse._validateErrorCode(errorCode);
+    if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
+      return "Invalid params";
+    }
+    return "Server error";
+  }
+  static _validateErrorCode(errorCode) {
+    if (!(typeof errorCode == 'number')) {
+      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
+    }
+    if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
+      return;
+    }
+    if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
+      return;
+    }
+    dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
+  }
+  [_isError]() {
+    return this[_errorCode] != null && this[_errorDetail] != null;
+  }
+  [_toString]() {
+    if (this[_result] != null) {
+      return this[_result];
+    } else {
+      dart.assert(this[_errorCode] != null);
+      dart.assert(this[_errorDetail] != null);
+      return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
+    }
+  }
+};
+dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
+dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
+dart.setSignature(developer.ServiceExtensionResponse, {
+  constructors: () => ({
+    result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
+    error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
+  }),
+  fields: () => ({
+    [_result]: core.String,
+    [_errorCode]: core.int,
+    [_errorDetail]: core.String
+  }),
+  methods: () => ({
+    [_isError]: dart.definiteFunctionType(core.bool, []),
+    [_toString]: dart.definiteFunctionType(core.String, [])
+  }),
+  sfields: () => ({
+    kInvalidParams: core.int,
+    kExtensionError: core.int,
+    kExtensionErrorMax: core.int,
+    kExtensionErrorMin: core.int,
+    invalidParams: core.int,
+    extensionError: core.int,
+    extensionErrorMax: core.int,
+    extensionErrorMin: core.int
+  }),
+  statics: () => ({
+    _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
+    _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
+  }),
+  names: ['_errorCodeMessage', '_validateErrorCode']
+});
+developer.ServiceExtensionResponse.invalidParams = -32602;
+developer.ServiceExtensionResponse.extensionError = -32000;
+developer.ServiceExtensionResponse.extensionErrorMax = -32000;
+developer.ServiceExtensionResponse.extensionErrorMin = -32016;
+dart.defineLazy(developer.ServiceExtensionResponse, {
+  get kInvalidParams() {
+    return developer.ServiceExtensionResponse.invalidParams;
+  },
+  get kExtensionError() {
+    return developer.ServiceExtensionResponse.extensionError;
+  },
+  get kExtensionErrorMax() {
+    return developer.ServiceExtensionResponse.extensionErrorMax;
+  },
+  get kExtensionErrorMin() {
+    return developer.ServiceExtensionResponse.extensionErrorMin;
+  }
+});
+developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
+developer.registerExtension = function(method, handler) {
+  if (!(typeof method == 'string')) {
+    dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
+  }
+  if (!dart.test(method[dartx.startsWith]('ext.'))) {
+    dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
+  }
+  if (developer._lookupExtension(method) != null) {
+    dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
+  }
+  if (!developer.ServiceExtensionHandler.is(handler)) {
+    dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
+  }
+  developer._registerExtension(method, handler);
+};
+dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
+developer.postEvent = function(eventKind, eventData) {
+  if (!(typeof eventKind == 'string')) {
+    dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
+  }
+  if (!core.Map.is(eventData)) {
+    dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
+  }
+  let eventDataAsString = convert.JSON.encode(eventData);
+  developer._postEvent(eventKind, eventDataAsString);
+};
+dart.fn(developer.postEvent, StringAndMapTovoid());
+developer._postEvent = function(eventKind, eventData) {
+};
+dart.fn(developer._postEvent, StringAndStringTodynamic());
+developer._lookupExtension = function(method) {
+  return developer._extensions[dartx._get](method);
+};
+dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
+developer._registerExtension = function(method, handler) {
+  developer._extensions[dartx._set](method, handler);
+};
+dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
+developer.UserTag = class UserTag extends core.Object {
+  static new(label) {
+    return developer._FakeUserTag.new(label);
+  }
+  static get defaultTag() {
+    return developer._FakeUserTag._defaultTag;
+  }
+};
+dart.setSignature(developer.UserTag, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
+  sfields: () => ({MAX_USER_TAGS: core.int}),
+  sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
+});
+developer.UserTag.MAX_USER_TAGS = 64;
+developer._FakeUserTag = class _FakeUserTag extends core.Object {
+  real(label) {
+    this.label = label;
+  }
+  static new(label) {
+    let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+    if (existingTag != null) {
+      return developer._FakeUserTag._check(existingTag);
+    }
+    if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+      dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+    }
+    let instance = new developer._FakeUserTag.real(label);
+    developer._FakeUserTag._instances[dartx._set](label, instance);
+    return instance;
+  }
+  makeCurrent() {
+    let old = developer._currentTag;
+    developer._currentTag = this;
+    return old;
+  }
+};
+dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+dart.setSignature(developer._FakeUserTag, {
+  constructors: () => ({
+    real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
+    new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
+  }),
+  fields: () => ({label: core.String}),
+  methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
+  sfields: () => ({
+    _instances: core.Map,
+    _defaultTag: developer.UserTag
+  })
+});
+dart.defineLazy(developer._FakeUserTag, {
+  get _instances() {
+    return dart.map();
+  },
+  set _instances(_) {},
+  get _defaultTag() {
+    return developer._FakeUserTag.new('Default');
+  }
+});
+dart.defineLazy(developer, {
+  get _currentTag() {
+    return developer._FakeUserTag._defaultTag;
+  },
+  set _currentTag(_) {}
+});
+developer.getCurrentTag = function() {
+  return developer._currentTag;
+};
+dart.fn(developer.getCurrentTag, VoidToUserTag());
+developer.Metric = class Metric extends core.Object {
+  new(name, description) {
+    this.name = name;
+    this.description = description;
+    if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
+      dart.throw(new core.ArgumentError('Invalid Metric name.'));
+    }
+  }
+};
+dart.setSignature(developer.Metric, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
+  fields: () => ({
+    name: core.String,
+    description: core.String
+  })
+});
+const _value = Symbol('_value');
+const _toJSON = Symbol('_toJSON');
+developer.Gauge = class Gauge extends developer.Metric {
+  get value() {
+    return this[_value];
+  }
+  set value(v) {
+    if (dart.notNull(v) < dart.notNull(this.min)) {
+      v = this.min;
+    } else if (dart.notNull(v) > dart.notNull(this.max)) {
+      v = this.max;
+    }
+    this[_value] = v;
+  }
+  new(name, description, min, max) {
+    this.min = min;
+    this.max = max;
+    this[_value] = null;
+    super.new(name, description);
+    if (!(typeof this.min == 'number')) {
+      dart.throw(new core.ArgumentError('min must be a double'));
+    }
+    if (!(typeof this.max == 'number')) {
+      dart.throw(new core.ArgumentError('max must be a double'));
+    }
+    if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
+      dart.throw(new core.ArgumentError('min must be less than max'));
+    }
+    this[_value] = this.min;
+  }
+  [_toJSON]() {
+    let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
+    return map;
+  }
+};
+dart.setSignature(developer.Gauge, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
+  fields: () => ({
+    min: core.double,
+    max: core.double,
+    [_value]: core.double
+  }),
+  getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+  setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+  methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+});
+developer.Counter = class Counter extends developer.Metric {
+  new(name, description) {
+    this[_value] = 0.0;
+    super.new(name, description);
+  }
+  get value() {
+    return this[_value];
+  }
+  set value(v) {
+    this[_value] = v;
+  }
+  [_toJSON]() {
+    let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
+    return map;
+  }
+};
+dart.setSignature(developer.Counter, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
+  fields: () => ({[_value]: core.double}),
+  getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+  setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+  methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+});
+developer.Metrics = class Metrics extends core.Object {
+  static register(metric) {
+    if (!developer.Metric.is(metric)) {
+      dart.throw(new core.ArgumentError('metric must be a Metric'));
+    }
+    if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
+      dart.throw(new core.ArgumentError('Registered metrics have unique names'));
+    }
+    developer.Metrics._metrics[dartx._set](metric.name, metric);
+  }
+  static deregister(metric) {
+    if (!developer.Metric.is(metric)) {
+      dart.throw(new core.ArgumentError('metric must be a Metric'));
+    }
+    developer.Metrics._metrics[dartx.remove](metric.name);
+  }
+  static _printMetric(id) {
+    let metric = developer.Metrics._metrics[dartx._get](id);
+    if (metric == null) {
+      return null;
+    }
+    return convert.JSON.encode(metric[_toJSON]());
+  }
+  static _printMetrics() {
+    let metrics = [];
+    for (let metric of developer.Metrics._metrics[dartx.values]) {
+      metrics[dartx.add](metric[_toJSON]());
+    }
+    let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
+    return convert.JSON.encode(map);
+  }
+};
+dart.setSignature(developer.Metrics, {
+  sfields: () => ({_metrics: MapOfString$Metric()}),
+  statics: () => ({
+    register: dart.definiteFunctionType(dart.void, [developer.Metric]),
+    deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
+    _printMetric: dart.definiteFunctionType(core.String, [core.String]),
+    _printMetrics: dart.definiteFunctionType(core.String, [])
+  }),
+  names: ['register', 'deregister', '_printMetric', '_printMetrics']
+});
+dart.defineLazy(developer.Metrics, {
+  get _metrics() {
+    return MapOfString$Metric().new();
+  }
+});
+developer._isProduct = false;
+developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
+developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
+const _appendArguments = Symbol('_appendArguments');
+developer.Timeline = class Timeline extends core.Object {
+  static startSync(name, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    if (developer._isProduct) {
+      return;
+    }
+    if (!(typeof name == 'string')) {
+      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+    }
+    if (!dart.test(developer._isDartStreamEnabled())) {
+      developer.Timeline._stack[dartx.add](null);
+      return;
+    }
+    let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
+    if (core.Map.is(arguments$)) {
+      block[_appendArguments](arguments$);
+    }
+    developer.Timeline._stack[dartx.add](block);
+  }
+  static finishSync() {
+    if (developer._isProduct) {
+      return;
+    }
+    if (developer.Timeline._stack[dartx.length] == 0) {
+      dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
+    }
+    let block = developer.Timeline._stack[dartx.removeLast]();
+    if (block == null) {
+      return;
+    }
+    block.finish();
+  }
+  static instantSync(name, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    if (developer._isProduct) {
+      return;
+    }
+    if (!(typeof name == 'string')) {
+      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+    }
+    if (!dart.test(developer._isDartStreamEnabled())) {
+      return;
+    }
+    let instantArguments = null;
+    if (core.Map.is(arguments$)) {
+      instantArguments = core.Map.from(arguments$);
+    }
+    developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
+  }
+  static timeSync(name, func, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    developer.Timeline.startSync(name, {arguments: arguments$});
+    try {
+      return func();
+    } finally {
+      developer.Timeline.finishSync();
+    }
+  }
+  static get now() {
+    return developer._getTraceClock();
+  }
+};
+dart.setSignature(developer.Timeline, {
+  sfields: () => ({
+    _stack: ListOf_SyncBlock(),
+    _isolateId: core.int,
+    _isolateIdString: core.String
+  }),
+  sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
+  statics: () => ({
+    startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+    finishSync: dart.definiteFunctionType(dart.void, []),
+    instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+    timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
+  }),
+  names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
+});
+dart.defineLazy(developer.Timeline, {
+  get _stack() {
+    return ListOf_SyncBlock().new();
+  },
+  get _isolateId() {
+    return developer._getIsolateNum();
+  },
+  get _isolateIdString() {
+    return dart.toString(developer.Timeline._isolateId);
+  }
+});
+const _stack = Symbol('_stack');
+const _taskId = Symbol('_taskId');
+const _start = Symbol('_start');
+const _finish = Symbol('_finish');
+developer.TimelineTask = class TimelineTask extends core.Object {
+  new() {
+    this[_stack] = JSArrayOf_AsyncBlock().of([]);
+    this[_taskId] = developer._getNextAsyncId();
+  }
+  withTaskId(taskId) {
+    this[_stack] = JSArrayOf_AsyncBlock().of([]);
+    this[_taskId] = taskId;
+    if (!(typeof taskId == 'number')) {
+      dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
+    }
+  }
+  start(name, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    if (developer._isProduct) {
+      return;
+    }
+    if (!(typeof name == 'string')) {
+      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+    }
+    let block = new developer._AsyncBlock._(name, this[_taskId]);
+    if (core.Map.is(arguments$)) {
+      block[_appendArguments](arguments$);
+    }
+    this[_stack][dartx.add](block);
+    block[_start]();
+  }
+  instant(name, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    if (developer._isProduct) {
+      return;
+    }
+    if (!(typeof name == 'string')) {
+      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+    }
+    let instantArguments = null;
+    if (core.Map.is(arguments$)) {
+      instantArguments = core.Map.from(arguments$);
+    }
+    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
+  }
+  finish() {
+    if (developer._isProduct) {
+      return;
+    }
+    if (this[_stack][dartx.length] == 0) {
+      dart.throw(new core.StateError('Uneven calls to start and finish'));
+    }
+    let block = this[_stack][dartx.removeLast]();
+    block[_finish]();
+  }
+  pass() {
+    if (dart.notNull(this[_stack][dartx.length]) > 0) {
+      dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
+    }
+    let r = this[_taskId];
+    return r;
+  }
+};
+dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
+dart.setSignature(developer.TimelineTask, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(developer.TimelineTask, []),
+    withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
+  }),
+  fields: () => ({
+    [_taskId]: core.int,
+    [_stack]: ListOf_AsyncBlock()
+  }),
+  methods: () => ({
+    start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+    instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+    finish: dart.definiteFunctionType(dart.void, []),
+    pass: dart.definiteFunctionType(core.int, [])
+  })
+});
+const _arguments = Symbol('_arguments');
+developer._AsyncBlock = class _AsyncBlock extends core.Object {
+  _(name, taskId) {
+    this.name = name;
+    this[_taskId] = taskId;
+    this.category = 'Dart';
+    this[_arguments] = null;
+  }
+  [_start]() {
+    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments]));
+  }
+  [_finish]() {
+    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
+  }
+  [_appendArguments](arguments$) {
+    if (this[_arguments] == null) {
+      this[_arguments] = dart.map();
+    }
+    this[_arguments][dartx.addAll](arguments$);
+  }
+};
+dart.defineNamedConstructor(developer._AsyncBlock, '_');
+dart.setSignature(developer._AsyncBlock, {
+  constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
+  fields: () => ({
+    category: core.String,
+    name: core.String,
+    [_taskId]: core.int,
+    [_arguments]: core.Map
+  }),
+  methods: () => ({
+    [_start]: dart.definiteFunctionType(dart.void, []),
+    [_finish]: dart.definiteFunctionType(dart.void, []),
+    [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+  })
+});
+const _startCpu = Symbol('_startCpu');
+developer._SyncBlock = class _SyncBlock extends core.Object {
+  _(name, start, startCpu) {
+    this.name = name;
+    this[_start] = start;
+    this[_startCpu] = startCpu;
+    this.category = 'Dart';
+    this[_arguments] = null;
+  }
+  finish() {
+    developer._reportCompleteEvent(this[_start], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments]));
+  }
+  [_appendArguments](arguments$) {
+    if (arguments$ == null) {
+      return;
+    }
+    if (this[_arguments] == null) {
+      this[_arguments] = dart.map();
+    }
+    this[_arguments][dartx.addAll](arguments$);
+  }
+};
+dart.defineNamedConstructor(developer._SyncBlock, '_');
+dart.setSignature(developer._SyncBlock, {
+  constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
+  fields: () => ({
+    category: core.String,
+    name: core.String,
+    [_arguments]: core.Map,
+    [_start]: core.int,
+    [_startCpu]: core.int
+  }),
+  methods: () => ({
+    finish: dart.definiteFunctionType(dart.void, []),
+    [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+  })
+});
+developer._fastPathArguments = null;
+developer._argumentsAsJson = function(arguments$) {
+  if (arguments$ == null || arguments$[dartx.length] == 0) {
+    if (developer._fastPathArguments == null) {
+      developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
+    }
+    return developer._fastPathArguments;
+  }
+  arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
+  return convert.JSON.encode(arguments$);
+};
+dart.fn(developer._argumentsAsJson, MapToString());
+developer._isDartStreamEnabled = function() {
+  return false;
+};
+dart.fn(developer._isDartStreamEnabled, VoidTobool());
+developer._getNextAsyncId = function() {
+  return 0;
+};
+dart.fn(developer._getNextAsyncId, VoidToint());
+developer._getTraceClock = function() {
+  let x = developer._clockValue;
+  developer._clockValue = dart.notNull(x) + 1;
+  return x;
+};
+dart.fn(developer._getTraceClock, VoidToint());
+developer._getThreadCpuClock = function() {
+  return -1;
+};
+dart.fn(developer._getThreadCpuClock, VoidToint());
+developer._getIsolateNum = function() {
+  return 0;
+};
+dart.fn(developer._getIsolateNum, VoidToint());
+developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
+};
+dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
+developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
+};
+dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid());
+developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
+};
+dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
+developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
+  new(serverUri) {
+    this.majorVersion = developer._getServiceMajorVersion();
+    this.minorVersion = developer._getServiceMinorVersion();
+    this.serverUri = serverUri;
+  }
+  toString() {
+    if (this.serverUri != null) {
+      return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
+    } else {
+      return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
+    }
+  }
+};
+dart.setSignature(developer.ServiceProtocolInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
+  fields: () => ({
+    majorVersion: core.int,
+    minorVersion: core.int,
+    serverUri: core.Uri
+  })
+});
+developer.Service = class Service extends core.Object {
+  static getInfo() {
+    return dart.async(function*() {
+      let receivePort = isolate.RawReceivePort.new();
+      let uriCompleter = CompleterOfUri().new();
+      receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+      developer._getServerInfo(receivePort.sendPort);
+      let uri = (yield uriCompleter.future);
+      receivePort.close();
+      return new developer.ServiceProtocolInfo(uri);
+    }, developer.ServiceProtocolInfo);
+  }
+  static controlWebServer(opts) {
+    return dart.async(function*(opts) {
+      let enable = opts && 'enable' in opts ? opts.enable : false;
+      if (!(typeof enable == 'boolean')) {
+        dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
+      }
+      let receivePort = isolate.RawReceivePort.new();
+      let uriCompleter = CompleterOfUri().new();
+      receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+      developer._webServerControl(receivePort.sendPort, enable);
+      let uri = (yield uriCompleter.future);
+      receivePort.close();
+      return new developer.ServiceProtocolInfo(uri);
+    }, developer.ServiceProtocolInfo, opts);
+  }
+};
+dart.setSignature(developer.Service, {
+  statics: () => ({
+    getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
+    controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+  }),
+  names: ['getInfo', 'controlWebServer']
+});
+developer._getServerInfo = function(sp) {
+  sp.send(null);
+};
+dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
+developer._webServerControl = function(sp, enable) {
+  sp.send(null);
+};
+dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
+developer._getServiceMajorVersion = function() {
+  return 0;
+};
+dart.fn(developer._getServiceMajorVersion, VoidToint());
+developer._getServiceMinorVersion = function() {
+  return 0;
+};
+dart.fn(developer._getServiceMinorVersion, VoidToint());
 isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
   new(message) {
     this.message = message;
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
index c9d9c75..5a352a1 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
@@ -18,6 +18,7 @@
   const collection = Object.create(null);
   const convert = Object.create(null);
   const core = Object.create(null);
+  const developer = Object.create(null);
   const isolate = Object.create(null);
   const js = Object.create(null);
   const js_util = Object.create(null);
@@ -377,6 +378,12 @@
   let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
   let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
   let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+  let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
+  let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
+  let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
+  let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
+  let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
+  let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
   let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
   let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
   let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
@@ -617,11 +624,12 @@
   let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
   let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
   let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
-  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
+  let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
+  let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
+  let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
   let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
   let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
   let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
-  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
   let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
   let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
@@ -679,9 +687,24 @@
   let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
   let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
   let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
+  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
   let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
   let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+  let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
+  let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
+  let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
+  let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
+  let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
+  let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
+  let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
+  let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
+  let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
+  let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
+  let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
+  let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
+  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
+  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
   let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
   let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
@@ -750,6 +773,7 @@
   let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
   let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
   let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
+  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
   let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
   let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
@@ -781,10 +805,10 @@
     return Mixin;
   };
   dart.getMixins = function(clazz) {
-    return clazz[dart._mixins];
+    return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
   };
   dart.getImplements = function(clazz) {
-    return clazz[dart.implements];
+    return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
   };
   dart.flattenFutures = function(builder) {
     function flatten(T) {
@@ -8658,18 +8682,26 @@
   });
   _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
   const _name = Symbol('_name');
+  const _nativeSymbol = Symbol('_nativeSymbol');
   _internal.Symbol = class Symbol extends core.Object {
     new(name) {
       this[_name] = name;
+      this[_nativeSymbol] = null;
+    }
+    es6(name, nativeSymbol) {
+      this[_name] = name;
+      this[_nativeSymbol] = nativeSymbol;
     }
     unvalidated(name) {
       this[_name] = name;
+      this[_nativeSymbol] = null;
     }
     validated(name) {
       this[_name] = _internal.Symbol.validatePublicSymbol(name);
+      this[_nativeSymbol] = null;
     }
     ['=='](other) {
-      return _internal.Symbol.is(other) && this[_name] == other[_name];
+      return _internal.Symbol.is(other) && this[_name] == other[_name] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
     }
     get hashCode() {
       let hash = this._hashCode;
@@ -8685,6 +8717,9 @@
     static getName(symbol) {
       return symbol[_name];
     }
+    static getNativeSymbol(symbol) {
+      return symbol[_nativeSymbol];
+    }
     static validatePublicSymbol(name) {
       if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
       if (dart.test(name[dartx.startsWith]('_'))) {
@@ -8696,16 +8731,21 @@
       return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
     }
   };
+  dart.defineNamedConstructor(_internal.Symbol, 'es6');
   dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
   dart.defineNamedConstructor(_internal.Symbol, 'validated');
   _internal.Symbol[dart.implements] = () => [core.Symbol];
   dart.setSignature(_internal.Symbol, {
     constructors: () => ({
       new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
+      es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
       unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
       validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
     }),
-    fields: () => ({[_name]: core.String}),
+    fields: () => ({
+      [_name]: core.String,
+      [_nativeSymbol]: dart.dynamic
+    }),
     methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
     sfields: () => ({
       reservedWordRE: core.String,
@@ -8717,10 +8757,11 @@
     }),
     statics: () => ({
       getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
+      getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
       validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
       isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
     }),
-    names: ['getName', 'validatePublicSymbol', 'isValidSymbol']
+    names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
   });
   _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
   _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
@@ -13231,73 +13272,109 @@
     return _js_mirrors._dart.definiteFunctionType(type, []);
   };
   dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
+  _js_mirrors._getMixins = function(type) {
+    return _js_mirrors._dart.getMixins(type, []);
+  };
+  dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
   _js_mirrors._Lazy$ = dart.generic(T => {
     const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
     return _Lazy;
   });
   _js_mirrors._Lazy = _Lazy();
+  _js_mirrors._getESSymbol = function(symbol) {
+    return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+  };
+  dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
+  _js_mirrors._getMember = function(symbol) {
+    let privateSymbol = _js_mirrors._getESSymbol(symbol);
+    if (privateSymbol != null) {
+      return privateSymbol;
+    }
+    return _js_mirrors.getName(symbol);
+  };
+  dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
   _js_mirrors._getNameForESSymbol = function(member) {
+    dart.assert(typeof member == "symbol");
     let str = dart.toString(member);
     dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
     return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
   };
   dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
+  _js_mirrors._getSymbolForESSymbol = function(member) {
+    let name = _js_mirrors._getNameForESSymbol(member);
+    return new _internal.Symbol.es6(name, member);
+  };
+  dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
+  _js_mirrors._getSymbolForMember = function(member) {
+    if (typeof member == 'string') {
+      return core.Symbol.new(member);
+    } else {
+      let name = _js_mirrors._getNameForESSymbol(member);
+      return new _internal.Symbol.es6(name, member);
+    }
+  };
+  dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
   _js_mirrors._toDartMap = function(data) {
-    if (data == null) return dart.map();
-    let map = _js_mirrors._dart.map(data);
+    if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
+    let map = MapOfSymbol$dynamic().new();
+    let publicMembers = Object.getOwnPropertyNames(data);
+    for (let member of core.Iterable._check(publicMembers)) {
+      let symbol = core.Symbol.new(core.String._check(member));
+      map[dartx._set](symbol, data[member]);
+    }
     let privateMembers = Object.getOwnPropertySymbols(data);
     for (let member of core.Iterable._check(privateMembers)) {
-      let name = _js_mirrors._getNameForESSymbol(member);
-      map[dartx._set](name, data[member]);
+      let symbol = _js_mirrors._getSymbolForESSymbol(member);
+      map[dartx._set](symbol, data[member]);
     }
     return map;
   };
-  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getConstructors = function(obj) {
     let sig = _js_mirrors._dart.getConstructorSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getFields = function(obj) {
     let sig = _js_mirrors._dart.getFieldSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getMethods = function(obj) {
     let sig = _js_mirrors._dart.getMethodSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getGetters = function(obj) {
     let sig = _js_mirrors._dart.getGetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getSetters = function(obj) {
     let sig = _js_mirrors._dart.getSetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticFields = function(obj) {
     let sig = _js_mirrors._dart.getStaticFieldSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStatics = function(obj) {
     let sig = _js_mirrors._dart.getStaticSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticGetters = function(obj) {
     let sig = _js_mirrors._dart.getStaticGetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._getStaticSetters = function(obj) {
     let sig = _js_mirrors._dart.getStaticSetterSig(obj);
     return _js_mirrors._toDartMap(sig);
   };
-  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMap());
+  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
   _js_mirrors._unwrap = function(obj) {
     return _js_mirrors._dart.unwrapType(obj);
   };
@@ -13436,15 +13513,7 @@
     [_getAccessor](reflectee, symbol, args, namedArgs) {
       if (args === void 0) args = null;
       if (namedArgs === void 0) namedArgs = null;
-      let name = _js_mirrors.getName(symbol);
-      if (!dart.test(name[dartx.startsWith]('_'))) return name;
-      let privateMembers = Object.getOwnPropertySymbols(reflectee);
-      dart.dsend(privateMembers, 'addAll', Object.getOwnPropertySymbols(reflectee.__proto__));
-      for (let member of core.Iterable._check(privateMembers)) {
-        let privateName = _js_mirrors._getNameForESSymbol(member);
-        if (name == privateName) return member;
-      }
-      return new core.NoSuchMethodError(reflectee, symbol, args, namedArgs);
+      return _js_mirrors._getMember(symbol);
     }
     getField(symbol) {
       let name = this[_getAccessor](this.reflectee, symbol);
@@ -13521,6 +13590,7 @@
   let const$0;
   const _declarations = Symbol('_declarations');
   const _raw = Symbol('_raw');
+  const _mixin = Symbol('_mixin');
   const _typeArguments = Symbol('_typeArguments');
   let const$1;
   _js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
@@ -13537,67 +13607,66 @@
         this[_declarations] = MapOfSymbol$DeclarationMirror().new();
         let unwrapped = _js_mirrors._unwrap(this[_cls]);
         let constructors = _js_mirrors._getConstructors(unwrapped);
-        constructors[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        constructors[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         if (dart.test(constructors[dartx.isEmpty])) {
           let name = 'new';
           let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
           let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, name, ft));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
         }
         let fields = _js_mirrors._getFields(unwrapped);
-        fields[dartx.forEach](dart.fn((name, t) => {
-          let symbol = core.Symbol.new(name);
+        fields[dartx.forEach](dart.fn((symbol, t) => {
           let metadata = [];
           if (core.List.is(t)) {
             metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
             t = dart.dindex(t, 0);
           }
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(name, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, StringAnddynamicTovoid()));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+        }, SymbolAnddynamicTovoid()));
         let methods = _js_mirrors._getMethods(unwrapped);
-        methods[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        methods[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let getters = _js_mirrors._getGetters(unwrapped);
-        getters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        getters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let setters = _js_mirrors._getSetters(unwrapped);
-        setters[dartx.forEach](dart.fn((name, ft) => {
-          name = dart.notNull(name) + '=';
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        setters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
+          symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticFields = _js_mirrors._getStaticFields(unwrapped);
-        staticFields[dartx.forEach](dart.fn((name, t) => {
-          let symbol = core.Symbol.new(name);
+        staticFields[dartx.forEach](dart.fn((symbol, t) => {
+          let name = _js_mirrors.getName(symbol);
           let metadata = [];
           if (core.List.is(t)) {
             metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
             t = dart.dindex(t, 0);
           }
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(name, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, StringAnddynamicTovoid()));
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+        }, SymbolAnddynamicTovoid()));
         let statics = _js_mirrors._getStatics(unwrapped);
-        statics[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        statics[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
-        staticGetters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
-        staticSetters[dartx.forEach](dart.fn((name, ft) => {
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, name, ft));
-        }, StringAnddynamicTovoid()));
+        staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
+          let name = _js_mirrors.getName(symbol);
+          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+        }, SymbolAnddynamicTovoid()));
         this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
       }
       return this[_declarations];
@@ -13606,7 +13675,7 @@
       this[_cls] = cls;
       this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
       this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
-      this.mixin = null;
+      this[_mixin] = null;
       this[_typeArguments] = null;
       this[_metadata$] = null;
       this[_declarations] = null;
@@ -13677,6 +13746,21 @@
         return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
       }
     }
+    get mixin() {
+      if (this[_mixin] != null) {
+        return this[_mixin];
+      }
+      let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
+      if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
+        this[_mixin] = this;
+        return this[_mixin];
+      }
+      if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
+        dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
+      }
+      this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
+      return this[_mixin];
+    }
     toString() {
       return dart.str`ClassMirror on '${this[_cls]}'`;
     }
@@ -13725,7 +13809,7 @@
       [_cls]: core.Type,
       simpleName: core.Symbol,
       [_raw]: dart.dynamic,
-      mixin: mirrors.ClassMirror,
+      [_mixin]: mirrors.ClassMirror,
       [_typeArguments]: ListOfTypeMirror(),
       [_metadata$]: ListOfInstanceMirror(),
       [_declarations]: MapOfSymbol$DeclarationMirror()
@@ -13739,7 +13823,8 @@
       isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
       typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
       originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
-      superclass: dart.definiteFunctionType(mirrors.ClassMirror, [])
+      superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
+      mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
     }),
     methods: () => ({
       newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
@@ -13748,13 +13833,15 @@
       invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
     })
   });
+  const _symbol = Symbol('_symbol');
   const _name$ = Symbol('_name');
   _js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
     get simpleName() {
-      return core.Symbol.new(this[_name$]);
+      return this[_symbol];
     }
-    _(name, t, annotations) {
-      this[_name$] = name;
+    _(symbol, t, annotations) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.type = _js_mirrors.reflectType(t);
       this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
       this.isStatic = false;
@@ -13785,8 +13872,9 @@
   dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
   _js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
   dart.setSignature(_js_mirrors.JsVariableMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.String, core.Type, core.List])}),
+    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
     fields: () => ({
+      [_symbol]: core.Symbol,
       [_name$]: core.String,
       type: mirrors.TypeMirror,
       metadata: ListOfInstanceMirror(),
@@ -13796,8 +13884,8 @@
     getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
   });
   _js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
-    _(name, t, annotations) {
-      super._(name, t, annotations);
+    _(member, t, annotations) {
+      super._(member, t, annotations);
     }
     toString() {
       return dart.str`ParameterMirror on '${this[_name$]}'`;
@@ -13836,7 +13924,7 @@
   dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
   _js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
   dart.setSignature(_js_mirrors.JsParameterMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.String, core.Type, core.List])})
+    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
   });
   const _params = Symbol('_params');
   const _createParameterMirrorList = Symbol('_createParameterMirrorList');
@@ -13851,10 +13939,11 @@
       return this[_name$][dartx.startsWith]('_');
     }
     get simpleName() {
-      return core.Symbol.new(this[_name$]);
+      return this[_symbol];
     }
-    _constructor(cls, name, ftype) {
-      this[_name$] = name;
+    _constructor(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = true;
       this.isStatic = false;
       this[_params] = null;
@@ -13862,8 +13951,9 @@
       this.isFinal = false;
       this[_createParameterMirrorList](ftype);
     }
-    _instanceMethod(cls, name, ftype) {
-      this[_name$] = name;
+    _instanceMethod(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = false;
       this.isStatic = false;
       this[_params] = null;
@@ -13871,8 +13961,9 @@
       this.isFinal = false;
       this[_createParameterMirrorList](ftype);
     }
-    _staticMethod(cls, name, ftype) {
-      this[_name$] = name;
+    _staticMethod(cls, symbol, ftype) {
+      this[_symbol] = symbol;
+      this[_name$] = _js_mirrors.getName(symbol);
       this.isConstructor = false;
       this.isStatic = true;
       this[_params] = null;
@@ -13881,7 +13972,7 @@
       this[_createParameterMirrorList](ftype);
     }
     get constructorName() {
-      return dart.test(this.isConstructor) ? core.Symbol.new(this[_name$]) : null;
+      return dart.test(this.isConstructor) ? this[_symbol] : null;
     }
     get parameters() {
       return this[_params];
@@ -13910,13 +14001,13 @@
       for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
         let type = args[dartx._get](i);
         let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
-        let param = new _js_mirrors.JsParameterMirror._('', core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
         params[dartx._set](i, param);
       }
       for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
         let type = opts[dartx._get](i);
         let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
-        let param = new _js_mirrors.JsParameterMirror._('', core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
         params[dartx._set](i + dart.notNull(args[dartx.length]), param);
       }
       this[_params] = ListOfParameterMirror().unmodifiable(params);
@@ -13976,11 +14067,12 @@
   _js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
   dart.setSignature(_js_mirrors.JsMethodMirror, {
     constructors: () => ({
-      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic]),
-      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic]),
-      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.String, dart.dynamic])
+      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
     }),
     fields: () => ({
+      [_symbol]: core.Symbol,
       [_name$]: core.String,
       [_params]: ListOfParameterMirror(),
       [_metadata$]: ListOfInstanceMirror(),
@@ -36376,6 +36468,741 @@
   core.UriData._noScheme = -1;
   core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
   core.UriData._uricTable = core.Uri._queryCharTable;
+  developer.debugger = function(opts) {
+    let when = opts && 'when' in opts ? opts.when : true;
+    let message = opts && 'message' in opts ? opts.message : null;
+    if (dart.test(when)) {
+      debugger;
+    }
+    return when;
+  };
+  dart.fn(developer.debugger, __Tobool());
+  developer.inspect = function(object) {
+    return object;
+  };
+  dart.fn(developer.inspect, ObjectToObject());
+  developer.log = function(message, opts) {
+    let time = opts && 'time' in opts ? opts.time : null;
+    let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
+    let level = opts && 'level' in opts ? opts.level : 0;
+    let name = opts && 'name' in opts ? opts.name : '';
+    let zone = opts && 'zone' in opts ? opts.zone : null;
+    let error = opts && 'error' in opts ? opts.error : null;
+    let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
+  };
+  dart.fn(developer.log, String__Tovoid$());
+  dart.defineLazy(developer, {
+    get _extensions() {
+      return MapOfString$ServiceExtensionHandler().new();
+    }
+  });
+  developer._clockValue = 0;
+  const _result = Symbol('_result');
+  const _errorCode = Symbol('_errorCode');
+  const _errorDetail = Symbol('_errorDetail');
+  const _isError = Symbol('_isError');
+  const _toString = Symbol('_toString');
+  developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
+    result(result) {
+      this[_result] = result;
+      this[_errorCode] = null;
+      this[_errorDetail] = null;
+      if (!(typeof this[_result] == 'string')) {
+        dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
+      }
+    }
+    error(errorCode, errorDetail) {
+      this[_result] = null;
+      this[_errorCode] = errorCode;
+      this[_errorDetail] = errorDetail;
+      developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
+      if (!(typeof this[_errorDetail] == 'string')) {
+        dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
+      }
+    }
+    static _errorCodeMessage(errorCode) {
+      developer.ServiceExtensionResponse._validateErrorCode(errorCode);
+      if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
+        return "Invalid params";
+      }
+      return "Server error";
+    }
+    static _validateErrorCode(errorCode) {
+      if (!(typeof errorCode == 'number')) {
+        dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
+      }
+      if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
+        return;
+      }
+      if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
+        return;
+      }
+      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
+    }
+    [_isError]() {
+      return this[_errorCode] != null && this[_errorDetail] != null;
+    }
+    [_toString]() {
+      if (this[_result] != null) {
+        return this[_result];
+      } else {
+        dart.assert(this[_errorCode] != null);
+        dart.assert(this[_errorDetail] != null);
+        return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
+      }
+    }
+  };
+  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
+  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
+  dart.setSignature(developer.ServiceExtensionResponse, {
+    constructors: () => ({
+      result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
+      error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
+    }),
+    fields: () => ({
+      [_result]: core.String,
+      [_errorCode]: core.int,
+      [_errorDetail]: core.String
+    }),
+    methods: () => ({
+      [_isError]: dart.definiteFunctionType(core.bool, []),
+      [_toString]: dart.definiteFunctionType(core.String, [])
+    }),
+    sfields: () => ({
+      kInvalidParams: core.int,
+      kExtensionError: core.int,
+      kExtensionErrorMax: core.int,
+      kExtensionErrorMin: core.int,
+      invalidParams: core.int,
+      extensionError: core.int,
+      extensionErrorMax: core.int,
+      extensionErrorMin: core.int
+    }),
+    statics: () => ({
+      _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
+      _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
+    }),
+    names: ['_errorCodeMessage', '_validateErrorCode']
+  });
+  developer.ServiceExtensionResponse.invalidParams = -32602;
+  developer.ServiceExtensionResponse.extensionError = -32000;
+  developer.ServiceExtensionResponse.extensionErrorMax = -32000;
+  developer.ServiceExtensionResponse.extensionErrorMin = -32016;
+  dart.defineLazy(developer.ServiceExtensionResponse, {
+    get kInvalidParams() {
+      return developer.ServiceExtensionResponse.invalidParams;
+    },
+    get kExtensionError() {
+      return developer.ServiceExtensionResponse.extensionError;
+    },
+    get kExtensionErrorMax() {
+      return developer.ServiceExtensionResponse.extensionErrorMax;
+    },
+    get kExtensionErrorMin() {
+      return developer.ServiceExtensionResponse.extensionErrorMin;
+    }
+  });
+  developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
+  developer.registerExtension = function(method, handler) {
+    if (!(typeof method == 'string')) {
+      dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
+    }
+    if (!dart.test(method[dartx.startsWith]('ext.'))) {
+      dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
+    }
+    if (developer._lookupExtension(method) != null) {
+      dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
+    }
+    if (!developer.ServiceExtensionHandler.is(handler)) {
+      dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
+    }
+    developer._registerExtension(method, handler);
+  };
+  dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
+  developer.postEvent = function(eventKind, eventData) {
+    if (!(typeof eventKind == 'string')) {
+      dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
+    }
+    if (!core.Map.is(eventData)) {
+      dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
+    }
+    let eventDataAsString = convert.JSON.encode(eventData);
+    developer._postEvent(eventKind, eventDataAsString);
+  };
+  dart.fn(developer.postEvent, StringAndMapTovoid());
+  developer._postEvent = function(eventKind, eventData) {
+  };
+  dart.fn(developer._postEvent, StringAndStringTodynamic());
+  developer._lookupExtension = function(method) {
+    return developer._extensions[dartx._get](method);
+  };
+  dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
+  developer._registerExtension = function(method, handler) {
+    developer._extensions[dartx._set](method, handler);
+  };
+  dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
+  developer.UserTag = class UserTag extends core.Object {
+    static new(label) {
+      return developer._FakeUserTag.new(label);
+    }
+    static get defaultTag() {
+      return developer._FakeUserTag._defaultTag;
+    }
+  };
+  dart.setSignature(developer.UserTag, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
+    sfields: () => ({MAX_USER_TAGS: core.int}),
+    sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
+  });
+  developer.UserTag.MAX_USER_TAGS = 64;
+  developer._FakeUserTag = class _FakeUserTag extends core.Object {
+    real(label) {
+      this.label = label;
+    }
+    static new(label) {
+      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+      if (existingTag != null) {
+        return developer._FakeUserTag._check(existingTag);
+      }
+      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+      }
+      let instance = new developer._FakeUserTag.real(label);
+      developer._FakeUserTag._instances[dartx._set](label, instance);
+      return instance;
+    }
+    makeCurrent() {
+      let old = developer._currentTag;
+      developer._currentTag = this;
+      return old;
+    }
+  };
+  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+  dart.setSignature(developer._FakeUserTag, {
+    constructors: () => ({
+      real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
+      new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
+    }),
+    fields: () => ({label: core.String}),
+    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
+    sfields: () => ({
+      _instances: core.Map,
+      _defaultTag: developer.UserTag
+    })
+  });
+  dart.defineLazy(developer._FakeUserTag, {
+    get _instances() {
+      return dart.map();
+    },
+    set _instances(_) {},
+    get _defaultTag() {
+      return developer._FakeUserTag.new('Default');
+    }
+  });
+  dart.defineLazy(developer, {
+    get _currentTag() {
+      return developer._FakeUserTag._defaultTag;
+    },
+    set _currentTag(_) {}
+  });
+  developer.getCurrentTag = function() {
+    return developer._currentTag;
+  };
+  dart.fn(developer.getCurrentTag, VoidToUserTag());
+  developer.Metric = class Metric extends core.Object {
+    new(name, description) {
+      this.name = name;
+      this.description = description;
+      if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
+        dart.throw(new core.ArgumentError('Invalid Metric name.'));
+      }
+    }
+  };
+  dart.setSignature(developer.Metric, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
+    fields: () => ({
+      name: core.String,
+      description: core.String
+    })
+  });
+  const _value$0 = Symbol('_value');
+  const _toJSON = Symbol('_toJSON');
+  developer.Gauge = class Gauge extends developer.Metric {
+    get value() {
+      return this[_value$0];
+    }
+    set value(v) {
+      if (dart.notNull(v) < dart.notNull(this.min)) {
+        v = this.min;
+      } else if (dart.notNull(v) > dart.notNull(this.max)) {
+        v = this.max;
+      }
+      this[_value$0] = v;
+    }
+    new(name, description, min, max) {
+      this.min = min;
+      this.max = max;
+      this[_value$0] = null;
+      super.new(name, description);
+      if (!(typeof this.min == 'number')) {
+        dart.throw(new core.ArgumentError('min must be a double'));
+      }
+      if (!(typeof this.max == 'number')) {
+        dart.throw(new core.ArgumentError('max must be a double'));
+      }
+      if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
+        dart.throw(new core.ArgumentError('min must be less than max'));
+      }
+      this[_value$0] = this.min;
+    }
+    [_toJSON]() {
+      let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
+      return map;
+    }
+  };
+  dart.setSignature(developer.Gauge, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
+    fields: () => ({
+      min: core.double,
+      max: core.double,
+      [_value$0]: core.double
+    }),
+    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+  });
+  developer.Counter = class Counter extends developer.Metric {
+    new(name, description) {
+      this[_value$0] = 0.0;
+      super.new(name, description);
+    }
+    get value() {
+      return this[_value$0];
+    }
+    set value(v) {
+      this[_value$0] = v;
+    }
+    [_toJSON]() {
+      let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
+      return map;
+    }
+  };
+  dart.setSignature(developer.Counter, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
+    fields: () => ({[_value$0]: core.double}),
+    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+  });
+  developer.Metrics = class Metrics extends core.Object {
+    static register(metric) {
+      if (!developer.Metric.is(metric)) {
+        dart.throw(new core.ArgumentError('metric must be a Metric'));
+      }
+      if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
+        dart.throw(new core.ArgumentError('Registered metrics have unique names'));
+      }
+      developer.Metrics._metrics[dartx._set](metric.name, metric);
+    }
+    static deregister(metric) {
+      if (!developer.Metric.is(metric)) {
+        dart.throw(new core.ArgumentError('metric must be a Metric'));
+      }
+      developer.Metrics._metrics[dartx.remove](metric.name);
+    }
+    static _printMetric(id) {
+      let metric = developer.Metrics._metrics[dartx._get](id);
+      if (metric == null) {
+        return null;
+      }
+      return convert.JSON.encode(metric[_toJSON]());
+    }
+    static _printMetrics() {
+      let metrics = [];
+      for (let metric of developer.Metrics._metrics[dartx.values]) {
+        metrics[dartx.add](metric[_toJSON]());
+      }
+      let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
+      return convert.JSON.encode(map);
+    }
+  };
+  dart.setSignature(developer.Metrics, {
+    sfields: () => ({_metrics: MapOfString$Metric()}),
+    statics: () => ({
+      register: dart.definiteFunctionType(dart.void, [developer.Metric]),
+      deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
+      _printMetric: dart.definiteFunctionType(core.String, [core.String]),
+      _printMetrics: dart.definiteFunctionType(core.String, [])
+    }),
+    names: ['register', 'deregister', '_printMetric', '_printMetrics']
+  });
+  dart.defineLazy(developer.Metrics, {
+    get _metrics() {
+      return MapOfString$Metric().new();
+    }
+  });
+  developer._isProduct = false;
+  developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
+  developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
+  const _appendArguments = Symbol('_appendArguments');
+  developer.Timeline = class Timeline extends core.Object {
+    static startSync(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      if (!dart.test(developer._isDartStreamEnabled())) {
+        developer.Timeline._stack[dartx.add](null);
+        return;
+      }
+      let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
+      if (core.Map.is(arguments$)) {
+        block[_appendArguments](arguments$);
+      }
+      developer.Timeline._stack[dartx.add](block);
+    }
+    static finishSync() {
+      if (developer._isProduct) {
+        return;
+      }
+      if (developer.Timeline._stack[dartx.length] == 0) {
+        dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
+      }
+      let block = developer.Timeline._stack[dartx.removeLast]();
+      if (block == null) {
+        return;
+      }
+      block.finish();
+    }
+    static instantSync(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      if (!dart.test(developer._isDartStreamEnabled())) {
+        return;
+      }
+      let instantArguments = null;
+      if (core.Map.is(arguments$)) {
+        instantArguments = core.Map.from(arguments$);
+      }
+      developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
+    }
+    static timeSync(name, func, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      developer.Timeline.startSync(name, {arguments: arguments$});
+      try {
+        return func();
+      } finally {
+        developer.Timeline.finishSync();
+      }
+    }
+    static get now() {
+      return developer._getTraceClock();
+    }
+  };
+  dart.setSignature(developer.Timeline, {
+    sfields: () => ({
+      _stack: ListOf_SyncBlock(),
+      _isolateId: core.int,
+      _isolateIdString: core.String
+    }),
+    sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
+    statics: () => ({
+      startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      finishSync: dart.definiteFunctionType(dart.void, []),
+      instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
+    }),
+    names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
+  });
+  dart.defineLazy(developer.Timeline, {
+    get _stack() {
+      return ListOf_SyncBlock().new();
+    },
+    get _isolateId() {
+      return developer._getIsolateNum();
+    },
+    get _isolateIdString() {
+      return dart.toString(developer.Timeline._isolateId);
+    }
+  });
+  const _stack = Symbol('_stack');
+  const _taskId = Symbol('_taskId');
+  const _start$1 = Symbol('_start');
+  const _finish = Symbol('_finish');
+  developer.TimelineTask = class TimelineTask extends core.Object {
+    new() {
+      this[_stack] = JSArrayOf_AsyncBlock().of([]);
+      this[_taskId] = developer._getNextAsyncId();
+    }
+    withTaskId(taskId) {
+      this[_stack] = JSArrayOf_AsyncBlock().of([]);
+      this[_taskId] = taskId;
+      if (!(typeof taskId == 'number')) {
+        dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
+      }
+    }
+    start(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      let block = new developer._AsyncBlock._(name, this[_taskId]);
+      if (core.Map.is(arguments$)) {
+        block[_appendArguments](arguments$);
+      }
+      this[_stack][dartx.add](block);
+      block[_start$1]();
+    }
+    instant(name, opts) {
+      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+      if (developer._isProduct) {
+        return;
+      }
+      if (!(typeof name == 'string')) {
+        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+      }
+      let instantArguments = null;
+      if (core.Map.is(arguments$)) {
+        instantArguments = core.Map.from(arguments$);
+      }
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
+    }
+    finish() {
+      if (developer._isProduct) {
+        return;
+      }
+      if (this[_stack][dartx.length] == 0) {
+        dart.throw(new core.StateError('Uneven calls to start and finish'));
+      }
+      let block = this[_stack][dartx.removeLast]();
+      block[_finish]();
+    }
+    pass() {
+      if (dart.notNull(this[_stack][dartx.length]) > 0) {
+        dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
+      }
+      let r = this[_taskId];
+      return r;
+    }
+  };
+  dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
+  dart.setSignature(developer.TimelineTask, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(developer.TimelineTask, []),
+      withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
+    }),
+    fields: () => ({
+      [_taskId]: core.int,
+      [_stack]: ListOf_AsyncBlock()
+    }),
+    methods: () => ({
+      start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+      finish: dart.definiteFunctionType(dart.void, []),
+      pass: dart.definiteFunctionType(core.int, [])
+    })
+  });
+  const _arguments$ = Symbol('_arguments');
+  developer._AsyncBlock = class _AsyncBlock extends core.Object {
+    _(name, taskId) {
+      this.name = name;
+      this[_taskId] = taskId;
+      this.category = 'Dart';
+      this[_arguments$] = null;
+    }
+    [_start$1]() {
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+    }
+    [_finish]() {
+      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
+    }
+    [_appendArguments](arguments$) {
+      if (this[_arguments$] == null) {
+        this[_arguments$] = dart.map();
+      }
+      this[_arguments$][dartx.addAll](arguments$);
+    }
+  };
+  dart.defineNamedConstructor(developer._AsyncBlock, '_');
+  dart.setSignature(developer._AsyncBlock, {
+    constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
+    fields: () => ({
+      category: core.String,
+      name: core.String,
+      [_taskId]: core.int,
+      [_arguments$]: core.Map
+    }),
+    methods: () => ({
+      [_start$1]: dart.definiteFunctionType(dart.void, []),
+      [_finish]: dart.definiteFunctionType(dart.void, []),
+      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+    })
+  });
+  const _startCpu = Symbol('_startCpu');
+  developer._SyncBlock = class _SyncBlock extends core.Object {
+    _(name, start, startCpu) {
+      this.name = name;
+      this[_start$1] = start;
+      this[_startCpu] = startCpu;
+      this.category = 'Dart';
+      this[_arguments$] = null;
+    }
+    finish() {
+      developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+    }
+    [_appendArguments](arguments$) {
+      if (arguments$ == null) {
+        return;
+      }
+      if (this[_arguments$] == null) {
+        this[_arguments$] = dart.map();
+      }
+      this[_arguments$][dartx.addAll](arguments$);
+    }
+  };
+  dart.defineNamedConstructor(developer._SyncBlock, '_');
+  dart.setSignature(developer._SyncBlock, {
+    constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
+    fields: () => ({
+      category: core.String,
+      name: core.String,
+      [_arguments$]: core.Map,
+      [_start$1]: core.int,
+      [_startCpu]: core.int
+    }),
+    methods: () => ({
+      finish: dart.definiteFunctionType(dart.void, []),
+      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+    })
+  });
+  developer._fastPathArguments = null;
+  developer._argumentsAsJson = function(arguments$) {
+    if (arguments$ == null || arguments$[dartx.length] == 0) {
+      if (developer._fastPathArguments == null) {
+        developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
+      }
+      return developer._fastPathArguments;
+    }
+    arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
+    return convert.JSON.encode(arguments$);
+  };
+  dart.fn(developer._argumentsAsJson, MapToString());
+  developer._isDartStreamEnabled = function() {
+    return false;
+  };
+  dart.fn(developer._isDartStreamEnabled, VoidTobool());
+  developer._getNextAsyncId = function() {
+    return 0;
+  };
+  dart.fn(developer._getNextAsyncId, VoidToint());
+  developer._getTraceClock = function() {
+    let x = developer._clockValue;
+    developer._clockValue = dart.notNull(x) + 1;
+    return x;
+  };
+  dart.fn(developer._getTraceClock, VoidToint());
+  developer._getThreadCpuClock = function() {
+    return -1;
+  };
+  dart.fn(developer._getThreadCpuClock, VoidToint());
+  developer._getIsolateNum = function() {
+    return 0;
+  };
+  dart.fn(developer._getIsolateNum, VoidToint());
+  developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
+  developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
+  developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
+  };
+  dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
+  developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
+    new(serverUri) {
+      this.majorVersion = developer._getServiceMajorVersion();
+      this.minorVersion = developer._getServiceMinorVersion();
+      this.serverUri = serverUri;
+    }
+    toString() {
+      if (this.serverUri != null) {
+        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
+      } else {
+        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
+      }
+    }
+  };
+  dart.setSignature(developer.ServiceProtocolInfo, {
+    constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
+    fields: () => ({
+      majorVersion: core.int,
+      minorVersion: core.int,
+      serverUri: core.Uri
+    })
+  });
+  developer.Service = class Service extends core.Object {
+    static getInfo() {
+      return dart.async(function*() {
+        let receivePort = isolate.RawReceivePort.new();
+        let uriCompleter = CompleterOfUri().new();
+        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+        developer._getServerInfo(receivePort.sendPort);
+        let uri = (yield uriCompleter.future);
+        receivePort.close();
+        return new developer.ServiceProtocolInfo(uri);
+      }, developer.ServiceProtocolInfo);
+    }
+    static controlWebServer(opts) {
+      return dart.async(function*(opts) {
+        let enable = opts && 'enable' in opts ? opts.enable : false;
+        if (!(typeof enable == 'boolean')) {
+          dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
+        }
+        let receivePort = isolate.RawReceivePort.new();
+        let uriCompleter = CompleterOfUri().new();
+        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+        developer._webServerControl(receivePort.sendPort, enable);
+        let uri = (yield uriCompleter.future);
+        receivePort.close();
+        return new developer.ServiceProtocolInfo(uri);
+      }, developer.ServiceProtocolInfo, opts);
+    }
+  };
+  dart.setSignature(developer.Service, {
+    statics: () => ({
+      getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
+      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+    }),
+    names: ['getInfo', 'controlWebServer']
+  });
+  developer._getServerInfo = function(sp) {
+    sp.send(null);
+  };
+  dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
+  developer._webServerControl = function(sp, enable) {
+    sp.send(null);
+  };
+  dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
+  developer._getServiceMajorVersion = function() {
+    return 0;
+  };
+  dart.fn(developer._getServiceMajorVersion, VoidToint());
+  developer._getServiceMinorVersion = function() {
+    return 0;
+  };
+  dart.fn(developer._getServiceMinorVersion, VoidToint());
   isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
     new(message) {
       this.message = message;
@@ -56882,19 +57709,19 @@
     statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
     names: ['createElement_tag']
   });
-  const _value$0 = Symbol('_value');
+  const _value$1 = Symbol('_value');
   html$.ScrollAlignment = class ScrollAlignment extends core.Object {
     _internal(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
     }
     toString() {
-      return dart.str`ScrollAlignment.${this[_value$0]}`;
+      return dart.str`ScrollAlignment.${this[_value$1]}`;
     }
   };
   dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
   dart.setSignature(html$.ScrollAlignment, {
     constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
-    fields: () => ({[_value$0]: dart.dynamic}),
+    fields: () => ({[_value$1]: dart.dynamic}),
     sfields: () => ({
       TOP: html$.ScrollAlignment,
       CENTER: html$.ScrollAlignment,
@@ -80155,43 +80982,43 @@
   const _unit = Symbol('_unit');
   html$.Dimension = class Dimension extends core.Object {
     percent(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = '%';
     }
     px(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'px';
     }
     pc(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'pc';
     }
     pt(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'pt';
     }
     inch(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'in';
     }
     cm(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'cm';
     }
     mm(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'mm';
     }
     em(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'em';
     }
     ex(value) {
-      this[_value$0] = value;
+      this[_value$1] = value;
       this[_unit] = 'ex';
     }
     css(cssValue) {
-      this[_value$0] = null;
+      this[_value$1] = null;
       this[_unit] = null;
       if (cssValue == '') cssValue = '0px';
       if (dart.test(cssValue[dartx.endsWith]('%'))) {
@@ -80200,16 +81027,16 @@
         this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
       }
       if (dart.test(cssValue[dartx.contains]('.'))) {
-        this[_value$0] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+        this[_value$1] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
       } else {
-        this[_value$0] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+        this[_value$1] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
       }
     }
     toString() {
-      return dart.str`${this[_value$0]}${this[_unit]}`;
+      return dart.str`${this[_value$1]}${this[_unit]}`;
     }
     get value() {
-      return this[_value$0];
+      return this[_value$1];
     }
   };
   dart.defineNamedConstructor(html$.Dimension, 'percent');
@@ -80236,7 +81063,7 @@
       css: dart.definiteFunctionType(html$.Dimension, [core.String])
     }),
     fields: () => ({
-      [_value$0]: core.num,
+      [_value$1]: core.num,
       [_unit]: core.String
     }),
     getters: () => ({value: dart.definiteFunctionType(core.num, [])})
@@ -94850,6 +95677,7 @@
   exports.collection = collection;
   exports.convert = convert;
   exports.core = core;
+  exports.developer = developer;
   exports.isolate = isolate;
   exports.js = js;
   exports.js_util = js_util;
diff --git a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
index fda5a6d..5c8c4f1 100644
--- a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
+++ b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
Binary files differ
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index 361f5ec..0bbe9ed 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -124,6 +124,7 @@
   final ClassElement numClass;
   final ClassElement objectClass;
   final ClassElement stringClass;
+  final ClassElement symbolClass;
 
   ConstFieldVisitor _constants;
 
@@ -164,6 +165,7 @@
         nullClass = _getLibrary(c, 'dart:core').getType('Null'),
         objectClass = _getLibrary(c, 'dart:core').getType('Object'),
         stringClass = _getLibrary(c, 'dart:core').getType('String'),
+        symbolClass = _getLibrary(c, 'dart:_internal').getType('Symbol'),
         dartJSLibrary = _getLibrary(c, 'dart:js');
 
   LibraryElement get currentLibrary => _loader.currentElement.library;
@@ -324,11 +326,8 @@
       elementJSName = getAnnotationName(e, isPublicJSAnnotation) ?? '';
     }
 
-    if (e is TopLevelVariableElement &&
-        e.getter != null &&
-        (e.getter.isExternal ||
-            findAnnotation(e.getter, isPublicJSAnnotation) != null)) {
-      elementJSName = getAnnotationName(e.getter, isPublicJSAnnotation) ?? '';
+    if (e is TopLevelVariableElement) {
+      elementJSName = _jsInteropStaticMemberName(e);
     }
     if (elementJSName == null) return null;
 
@@ -353,6 +352,38 @@
     return access;
   }
 
+  String _jsInteropStaticMemberName(Element e, {String name}) {
+    if (e == null ||
+        e.library == null ||
+        findAnnotation(e.library, isPublicJSAnnotation) == null) {
+      return null;
+    }
+    if (e is PropertyInducingElement) {
+      // Assume properties have consistent JS names for getters and setters.
+      return _jsInteropStaticMemberName(e.getter, name: e.name) ??
+          _jsInteropStaticMemberName(e.setter, name: e.name);
+    }
+    if (e is ExecutableElement &&
+        e.isExternal &&
+        findAnnotation(e, isPublicJSAnnotation) != null) {
+      return getAnnotationName(e, isPublicJSAnnotation) ?? name ?? e.name;
+    }
+    return null;
+  }
+
+  JS.Expression _emitJSInteropStaticMemberName(Element e) {
+    var name = _jsInteropStaticMemberName(e);
+    if (name == null) return null;
+    // We do not support statics names with JS annotations containing dots.
+    // See https://github.com/dart-lang/sdk/issues/27926
+    if (name.contains('.')) {
+      throw new UnimplementedError(
+          'We do not support JS annotations containing dots on static members. '
+          'See https://github.com/dart-lang/sdk/issues/27926');
+    }
+    return js.string(name);
+  }
+
   /// Flattens blocks in [items] to a single list.
   ///
   /// This will not flatten blocks that are marked as being scopes.
@@ -2705,7 +2736,8 @@
     if (element is ClassMemberElement && element is! ConstructorElement) {
       bool isStatic = element.isStatic;
       var type = element.enclosingElement.type;
-      var member = _emitMemberName(name, isStatic: isStatic, type: type);
+      var member = _emitMemberName(name,
+          isStatic: isStatic, type: type, element: element);
 
       if (isStatic) {
         var dynType = _emitStaticAccess(type);
@@ -3271,7 +3303,8 @@
     ClassElement classElement = element.enclosingElement;
     var type = classElement.type;
     var dynType = _emitStaticAccess(type);
-    var member = _emitMemberName(element.name, isStatic: true, type: type);
+    var member = _emitMemberName(element.name,
+        isStatic: true, type: type, element: element);
     return _visit(rhs).toAssignExpression(
         annotate(new JS.PropertyAccess(dynType, member), lhs));
   }
@@ -3282,7 +3315,7 @@
       JS.Expression jsTarget, Element element, JS.Expression value) {
     String memberName = element.name;
     var type = (element.enclosingElement as ClassElement).type;
-    var name = _emitMemberName(memberName, type: type);
+    var name = _emitMemberName(memberName, type: type, element: element);
     return value.toAssignExpression(
         annotate(new JS.PropertyAccess(jsTarget, name), lhs));
   }
@@ -3430,21 +3463,25 @@
         return _emitStaticAccess(
             (element.enclosingElement as ClassElement).type);
       }
+      if (element is FieldElement) {
+        return _emitStaticAccess(element.enclosingElement.type);
+      }
     }
     return _visit(target);
   }
 
-  /// Emits a (possibly generic) instance method call.
+  /// Emits a (possibly generic) instance, or static method call.
   JS.Expression _emitMethodCallInternal(
       Expression target,
       MethodInvocation node,
       List<JS.Expression> args,
       List<JS.Expression> typeArgs) {
     var type = getStaticType(target);
-    var name = node.methodName.name;
     var element = node.methodName.staticElement;
     bool isStatic = element is ExecutableElement && element.isStatic;
-    var memberName = _emitMemberName(name, type: type, isStatic: isStatic);
+    var name = node.methodName.name;
+    var memberName =
+        _emitMemberName(name, type: type, isStatic: isStatic, element: element);
 
     JS.Expression jsTarget = _emitTarget(target, element, isStatic);
     if (isDynamicInvoke(target) || isDynamicInvoke(node.methodName)) {
@@ -4807,7 +4844,7 @@
       String memberName, List<JS.Expression> typeArgs) {
     bool isStatic = member is ClassMemberElement && member.isStatic;
     var name = _emitMemberName(memberName,
-        type: getStaticType(target), isStatic: isStatic);
+        type: getStaticType(target), isStatic: isStatic, element: member);
     if (isDynamicInvoke(target)) {
       if (_inWhitelistCode(target)) {
         var vars = <JS.MetaLetVariable, JS.Expression>{};
@@ -5192,11 +5229,17 @@
   @override
   visitSymbolLiteral(SymbolLiteral node) {
     JS.Expression emitSymbol() {
-      // TODO(vsm): When we canonicalize, we need to treat private symbols
-      // correctly.
+      // TODO(vsm): Handle qualified symbols correctly.
+      var last = node.components.last.toString();
       var name = js.string(node.components.join('.'), "'");
-      return js
-          .call('#.new(#)', [_emitConstructorAccess(types.symbolType), name]);
+      if (last.startsWith('_')) {
+        var nativeSymbol = _emitPrivateNameSymbol(currentLibrary, last);
+        return js.call('new #.es6(#, #)',
+            [_emitConstructorAccess(symbolClass.type), name, nativeSymbol]);
+      } else {
+        return js
+            .call('#.new(#)', [_emitConstructorAccess(types.symbolType), name]);
+      }
     }
 
     return _emitConst(emitSymbol);
@@ -5426,9 +5469,14 @@
   /// helper, that checks for null. The user defined method is called '=='.
   ///
   JS.Expression _emitMemberName(String name,
-      {DartType type, bool isStatic: false, bool useExtension}) {
-    // Static members skip the rename steps.
-    if (isStatic) return _propertyName(name);
+      {DartType type,
+      bool isStatic: false,
+      bool useExtension,
+      Element element}) {
+    // Static members skip the rename steps and may require JS interop renames.
+    if (isStatic) {
+      return _emitJSInteropStaticMemberName(element) ?? _propertyName(name);
+    }
 
     if (name.startsWith('_')) {
       return _emitPrivateNameSymbol(currentLibrary, name);
diff --git a/pkg/dev_compiler/test/codegen/language/parameter_initializer5_negative_test.dart b/pkg/dev_compiler/test/codegen/language/parameter_initializer5_test.dart
similarity index 66%
rename from pkg/dev_compiler/test/codegen/language/parameter_initializer5_negative_test.dart
rename to pkg/dev_compiler/test/codegen/language/parameter_initializer5_test.dart
index afa5e2a..eb7208d 100644
--- a/pkg/dev_compiler/test/codegen/language/parameter_initializer5_negative_test.dart
+++ b/pkg/dev_compiler/test/codegen/language/parameter_initializer5_test.dart
@@ -1,15 +1,17 @@
 // Copyright (c) 2011, 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=--initializing-formal-access
+// VMOptions=--initializing-formal-access
 
-// Fails because this.x parameter is used in initializer expression.
+// Use the this.x parameter in an initializer expression.
 
 class Foo {
   var x, y;
   Foo(this.x): y = x { }
 }
 
-
 main() {
   new Foo(12);
 }
diff --git a/pkg/dev_compiler/test/codegen/lib/html/js_typed_interop_rename_static_test.dart b/pkg/dev_compiler/test/codegen/lib/html/js_typed_interop_rename_static_test.dart
new file mode 100644
index 0000000..99c3bac
--- /dev/null
+++ b/pkg/dev_compiler/test/codegen/lib/html/js_typed_interop_rename_static_test.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2015, 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.
+
+@JS()
+library js_typed_interop_rename_static_test;
+
+import 'dart:html';
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS('JSTopLevelField')
+external set topLevelFieldOnlySetter(v);
+
+@JS('JSTopLevelField')
+external get topLevelFieldOnlyGetter;
+
+@JS()
+external get topLevelFieldNoRename;
+
+@JS()
+external set topLevelSetterNoRename(v);
+
+@JS()
+external topLevelMethod(v);
+
+@JS('topLevelMethod')
+external renamedTopLevelMethod(v);
+
+@JS('JSFoo')
+class Foo {
+  @JS('JSBar')
+  external static get bar;
+
+  @JS('JSBar')
+  external static set bar(v);
+
+  @JS('JSBar2')
+  external static get bar2;
+
+  @JS('JSBaz')
+  external static set baz(v);
+
+  @JS('JSMethodAddBar')
+  external static addBar(a);
+}
+
+main() {
+  document.body.append(new ScriptElement()
+    ..type = 'text/javascript'
+    ..innerHtml = r"""
+window.JSFoo = {
+  'JSBar': 42,
+  'JSBar2': 80,
+  'JSMethodAddBar': function(a,b) { return a + this.JSBar; }
+};
+window.JSTopLevelField = 91;
+window.topLevelFieldNoRename = 8;
+window.topLevelMethod = function(a) { return a * 2; };
+""");
+
+  group('rename static', () {
+    test('getter', () {
+      expect(Foo.bar, equals(42));
+      expect(Foo.bar2, equals(80));
+      expect(topLevelFieldOnlyGetter, 91);
+      expect(topLevelFieldNoRename, 8);
+    });
+
+    test('setter', () {
+      Foo.baz = 100;
+      expect(js_util.getProperty(js_util.getProperty(window, 'JSFoo'), 'JSBaz'),
+          equals(100));
+      Foo.bar = 30;
+      expect(Foo.bar, equals(30));
+      expect(js_util.getProperty(js_util.getProperty(window, 'JSFoo'), 'JSBar'),
+          equals(30));
+      topLevelFieldOnlySetter = 83;
+      expect(topLevelFieldOnlyGetter, 83);
+      topLevelSetterNoRename = 10;
+      expect(js_util.getProperty(window, 'topLevelSetterNoRename'), 10);
+    });
+
+    test('method', () {
+      Foo.bar = 100;
+      expect(Foo.addBar(10), equals(110));
+      Foo.bar = 200;
+      expect(Foo.addBar(10), equals(210));
+      expect(topLevelMethod(10), equals(20));
+      expect(renamedTopLevelMethod(10), equals(20));
+    });
+  });
+}
diff --git a/pkg/dev_compiler/test/codegen/lib/mirrors/mixin_simple_test.dart b/pkg/dev_compiler/test/codegen/lib/mirrors/mixin_simple_test.dart
new file mode 100644
index 0000000..7edcbe4
--- /dev/null
+++ b/pkg/dev_compiler/test/codegen/lib/mirrors/mixin_simple_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 test.mixin;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class Super {}
+class Mixin {}
+class Mixin2 {}
+
+class Class extends Super with Mixin {}
+class MultipleMixins extends Class with Mixin2 {}
+
+main() {
+  Expect.equals(reflectClass(Class),
+                reflectClass(Class).mixin);
+  Expect.equals(reflectClass(Mixin),
+                reflectClass(Class).superclass.mixin);
+  Expect.equals(reflectClass(Super),
+                reflectClass(Class).superclass.superclass.mixin);
+
+  Expect.equals(reflectClass(MultipleMixins),
+                reflectClass(MultipleMixins).mixin);
+  Expect.equals(reflectClass(Mixin2),
+                reflectClass(MultipleMixins).superclass.mixin);
+  Expect.equals(reflectClass(Class),
+                reflectClass(MultipleMixins).superclass.superclass.mixin);
+  Expect.equals(reflectClass(Mixin),
+                reflectClass(MultipleMixins).superclass.superclass.superclass
+                    .mixin);
+  Expect.equals(reflectClass(Super),
+                reflectClass(MultipleMixins).superclass.superclass.superclass
+                    .superclass.mixin);
+}
diff --git a/pkg/dev_compiler/test/codegen/lib/mirrors/private_field_helper.dart b/pkg/dev_compiler/test/codegen/lib/mirrors/private_field_helper.dart
new file mode 100644
index 0000000..8c82450
--- /dev/null
+++ b/pkg/dev_compiler/test/codegen/lib/mirrors/private_field_helper.dart
@@ -0,0 +1,18 @@
+// 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 test.mixin;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class Bar {
+  String _field = "hello";
+  String get field => _field;
+}
+
+var privateSymbol2 = #_field;
+var publicSymbol2 = #field;
+
diff --git a/pkg/dev_compiler/test/codegen/lib/mirrors/private_field_test.dart b/pkg/dev_compiler/test/codegen/lib/mirrors/private_field_test.dart
new file mode 100644
index 0000000..14c110c
--- /dev/null
+++ b/pkg/dev_compiler/test/codegen/lib/mirrors/private_field_test.dart
@@ -0,0 +1,36 @@
+// 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 test.mixin;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+import 'private_field_helper.dart';
+
+class Foo extends Bar {
+  int _field = 42;
+
+  static int _staticField = 99;
+}
+
+var privateSymbol = #_field;
+var publicSymbol = #field;
+
+main() {
+  Expect.equals(publicSymbol, publicSymbol2);
+  Expect.notEquals(privateSymbol, privateSymbol2);
+  
+  var foo = new Foo();
+  var m = reflect(foo);
+  m.setField(privateSymbol, 38);
+  Expect.equals(38, foo._field);
+  m.setField(privateSymbol2, "world");
+  Expect.equals("world", foo.field);
+  Expect.equals("world", m.getField(publicSymbol).reflectee);
+
+  var type = reflectClass(Foo);
+  Expect.equals(99, type.getField(#_staticField).reflectee);
+}
diff --git a/pkg/dev_compiler/test/codegen_test.dart b/pkg/dev_compiler/test/codegen_test.dart
index 80a1a8a..b0a74ae 100644
--- a/pkg/dev_compiler/test/codegen_test.dart
+++ b/pkg/dev_compiler/test/codegen_test.dart
@@ -20,6 +20,7 @@
         StringLiteral,
         UriBasedDirective,
         parseDirectives;
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/source.dart' show Source;
 import 'package:args/args.dart' show ArgParser, ArgResults;
 import 'package:dev_compiler/src/analyzer/context.dart'
@@ -351,5 +352,7 @@
     uriContent = uriContent.trim();
     directive.uriContent = uriContent;
   }
-  return directive.validate() == null ? uriContent : null;
+  return (directive as UriBasedDirectiveImpl).validate() == null
+      ? uriContent
+      : null;
 }
diff --git a/pkg/dev_compiler/test/not_yet_strong_tests.dart b/pkg/dev_compiler/test/not_yet_strong_tests.dart
index d6d3976..0769af7 100644
--- a/pkg/dev_compiler/test/not_yet_strong_tests.dart
+++ b/pkg/dev_compiler/test/not_yet_strong_tests.dart
@@ -2345,7 +2345,6 @@
   'language/parameter_initializer2_negative_test',
   'language/parameter_initializer3_negative_test',
   'language/parameter_initializer4_negative_test',
-  'language/parameter_initializer5_negative_test',
   'language/parameter_initializer6_negative_test',
   'language/prefix11_negative_test',
   'language/prefix12_negative_test',
diff --git a/pkg/dev_compiler/tool/build_sdk.dart b/pkg/dev_compiler/tool/build_sdk.dart
index 7041b38..1b2b2cc 100644
--- a/pkg/dev_compiler/tool/build_sdk.dart
+++ b/pkg/dev_compiler/tool/build_sdk.dart
@@ -35,6 +35,7 @@
     'dart:collection',
     'dart:convert',
     'dart:core',
+    'dart:developer',
     'dart:isolate',
     'dart:js',
     'dart:js_util',
diff --git a/pkg/dev_compiler/tool/global_compile.dart b/pkg/dev_compiler/tool/global_compile.dart
index b604099..56f1b0a 100644
--- a/pkg/dev_compiler/tool/global_compile.dart
+++ b/pkg/dev_compiler/tool/global_compile.dart
@@ -14,6 +14,7 @@
         StringLiteral,
         UriBasedDirective,
         parseDirectives;
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:args/args.dart' show ArgParser;
 import 'package:path/path.dart' as path;
 
@@ -257,7 +258,9 @@
     uriContent = uriContent.trim();
     directive.uriContent = uriContent;
   }
-  return directive.validate() == null ? uriContent : null;
+  return (directive as UriBasedDirectiveImpl).validate() == null
+      ? uriContent
+      : null;
 }
 
 String _loadFile(String uri, String packageRoot) {
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/_internal/libraries.dart b/pkg/dev_compiler/tool/input_sdk/lib/_internal/libraries.dart
index 2814a08..4e56e9f 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/_internal/libraries.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/_internal/libraries.dart
@@ -42,6 +42,11 @@
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/compiler/js_lib/core_patch.dart"),
 
+  "developer": const LibraryInfo(
+      "developer/developer.dart",
+      maturity: Maturity.STABLE,
+      dart2jsPatchPath: "_internal/js_runtime/lib/developer_patch.dart"),
+
   "html": const LibraryInfo(
       "html/dart2js/html_dart2js.dart",
       category: "Client",
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/developer.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/developer.dart
new file mode 100644
index 0000000..47ea5ba
--- /dev/null
+++ b/pkg/dev_compiler/tool/input_sdk/lib/developer/developer.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2015, 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.
+
+/// Interact with developer tools such as the debugger and inspector.
+///
+/// The dart:developer library is _unstable_ and its API might change slightly
+/// as a result of developer feedback. This library is platform dependent and
+/// therefore it has implementations for both dart2js and the Dart VM. Both are
+/// under development and may not support all operations yet.
+///
+/// To use this library in your code:
+///
+///     import 'dart:developer';
+///
+library dart.developer;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:isolate' show RawReceivePort, SendPort;
+
+part 'extension.dart';
+part 'profiler.dart';
+part 'timeline.dart';
+part 'service.dart';
+
+/// If [when] is true, stop the program as if a breakpoint were hit at the
+/// following statement.
+///
+/// Returns the value of [when]. Some debuggers may display [message].
+///
+/// NOTE: When invoked, the isolate will not return until a debugger
+/// continues execution. When running in the Dart VM the behaviour is the same
+/// regardless of whether or not a debugger is connected. When compiled to
+/// JavaScript, this uses the "debugger" statement, and behaves exactly as
+/// that does.
+external bool debugger({bool when: true, String message});
+
+/// Send a reference to [object] to any attached debuggers.
+///
+/// Debuggers may open an inspector on the object. Returns the argument.
+external Object inspect(Object object);
+
+/// Emit a log event.
+/// [message] is the log message.
+/// [time]  (optional) is the timestamp.
+/// [sequenceNumber]  (optional) is a monotonically increasing sequence number.
+/// [level]  (optional) is the severity level (value between 0 and 2000).
+/// [name]  (optional) is the name of the source of the log message.
+/// [zone]  (optional) the zone where the log was emitted
+/// [error]  (optional) an error object associated with this log event.
+/// [stackTrace]  (optional) a stack trace associated with this log event.
+external void log(String message,
+                  {DateTime time,
+                   int sequenceNumber,
+                   int level: 0,
+                   String name: '',
+                   Zone zone,
+                   Object error,
+                   StackTrace stackTrace});
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/extension.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/extension.dart
new file mode 100644
index 0000000..5883fb5
--- /dev/null
+++ b/pkg/dev_compiler/tool/input_sdk/lib/developer/extension.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2015, 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 dart.developer;
+
+/// A response to a service protocol extension RPC.
+///
+/// If the RPC was successful, use [ServiceExtensionResponse.result], otherwise
+/// use [ServiceExtensionResponse.error].
+class ServiceExtensionResponse {
+  final String _result;
+  final int _errorCode;
+  final String _errorDetail;
+
+  /// Creates a successful response to a service protocol extension RPC.
+  ///
+  /// Requires [result] to be a JSON object encoded as a string. When forming
+  /// the JSON-RPC message [result] will be inlined directly.
+  ServiceExtensionResponse.result(String result)
+      : _result = result,
+        _errorCode = null,
+        _errorDetail = null {
+    if (_result is! String) {
+      throw new ArgumentError.value(_result, "result", "Must be a String");
+    }
+  }
+
+  /// Creates an error response to a service protocol extension RPC.
+  ///
+  /// Requires [errorCode] to be [invalidParams] or between [extensionErrorMin]
+  /// and [extensionErrorMax]. Requires [errorDetail] to be a JSON object
+  /// encoded as a string. When forming the JSON-RPC message [errorDetail] will
+  /// be inlined directly.
+  ServiceExtensionResponse.error(int errorCode, String errorDetail)
+      : _result = null,
+        _errorCode = errorCode,
+        _errorDetail = errorDetail {
+    _validateErrorCode(_errorCode);
+    if (_errorDetail is! String) {
+      throw new ArgumentError.value(_errorDetail,
+                                    "errorDetail",
+                                    "Must be a String");
+    }
+  }
+
+  /// Invalid method parameter(s) error code.
+  @deprecated static const kInvalidParams = invalidParams;
+  /// Generic extension error code.
+  @deprecated static const kExtensionError = extensionError;
+  /// Maximum extension provided error code.
+  @deprecated static const kExtensionErrorMax = extensionErrorMax;
+  /// Minimum extension provided error code.
+  @deprecated static const kExtensionErrorMin = extensionErrorMin;
+
+  /// Invalid method parameter(s) error code.
+  static const invalidParams = -32602;
+  /// Generic extension error code.
+  static const extensionError = -32000;
+  /// Maximum extension provided error code.
+  static const extensionErrorMax = -32000;
+  /// Minimum extension provided error code.
+  static const extensionErrorMin = -32016;
+
+
+  static String _errorCodeMessage(int errorCode) {
+    _validateErrorCode(errorCode);
+    if (errorCode == kInvalidParams) {
+      return "Invalid params";
+    }
+    return "Server error";
+  }
+
+  static _validateErrorCode(int errorCode) {
+    if (errorCode is! int) {
+      throw new ArgumentError.value(errorCode, "errorCode", "Must be an int");
+    }
+    if (errorCode == invalidParams) {
+      return;
+    }
+    if ((errorCode >= extensionErrorMin) &&
+        (errorCode <= extensionErrorMax)) {
+      return;
+    }
+    throw new ArgumentError.value(errorCode, "errorCode", "Out of range");
+  }
+
+  bool _isError() => (_errorCode != null) && (_errorDetail != null);
+
+  String _toString() {
+    if (_result != null) {
+      return _result;
+    } else {
+      assert(_errorCode != null);
+      assert(_errorDetail != null);
+      return JSON.encode({
+        'code': _errorCode,
+        'message': _errorCodeMessage(_errorCode),
+        'data': {
+          'details': _errorDetail
+        }
+      });
+    }
+  }
+}
+
+/// A service protocol extension handler. Registered with [registerExtension].
+///
+/// Must complete to a [ServiceExtensionResponse].
+///
+/// [method] - the method name of the service protocol request.
+/// [parameters] - A map holding the parameters to the service protocol request.
+///
+/// *NOTE*: All parameter names and values are **encoded as strings**.
+typedef Future<ServiceExtensionResponse>
+    ServiceExtensionHandler(String method, Map<String, String> parameters);
+
+/// Register a [ServiceExtensionHandler] that will be invoked in this isolate
+/// for [method]. *NOTE*: Service protocol extensions must be registered
+/// in each isolate.
+///
+/// *NOTE*: [method] must begin with 'ext.' and you should use the following
+/// structure to avoid conflicts with other packages: 'ext.package.command'.
+/// That is, immediately following the 'ext.' prefix, should be the registering
+/// package name followed by another period ('.') and then the command name.
+/// For example: 'ext.dart.io.getOpenFiles'.
+///
+/// Because service extensions are isolate specific, clients using extensions
+/// must always include an 'isolateId' parameter with each RPC.
+void registerExtension(String method, ServiceExtensionHandler handler) {
+  if (method is! String) {
+    throw new ArgumentError.value(method,
+                                  'method',
+                                  'Must be a String');
+  }
+  if (!method.startsWith('ext.')) {
+    throw new ArgumentError.value(method,
+                                  'method',
+                                  'Must begin with ext.');
+  }
+  if (_lookupExtension(method) != null) {
+    throw new ArgumentError('Extension already registered: $method');
+  }
+  if (handler is! ServiceExtensionHandler) {
+    throw new ArgumentError.value(handler,
+                                  'handler',
+                                  'Must be a ServiceExtensionHandler');
+  }
+  _registerExtension(method, handler);
+}
+
+/// Post an event of [eventKind] with payload of [eventData] to the `Extension`
+/// event stream.
+void postEvent(String eventKind, Map eventData) {
+  if (eventKind is! String) {
+    throw new ArgumentError.value(eventKind,
+                                  'eventKind',
+                                  'Must be a String');
+  }
+  if (eventData is! Map) {
+    throw new ArgumentError.value(eventData,
+                                  'eventData',
+                                  'Must be a Map');
+  }
+  String eventDataAsString = JSON.encode(eventData);
+  _postEvent(eventKind, eventDataAsString);
+}
+
+external _postEvent(String eventKind, String eventData);
+
+// Both of these functions are written inside C++ to avoid updating the data
+// structures in Dart, getting an OOB, and observing stale state. Do not move
+// these into Dart code unless you can ensure that the operations will can be
+// done atomically. Native code lives in vm/isolate.cc-
+// LookupServiceExtensionHandler and RegisterServiceExtensionHandler.
+external ServiceExtensionHandler _lookupExtension(String method);
+external _registerExtension(String method, ServiceExtensionHandler handler);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/profiler.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/profiler.dart
new file mode 100644
index 0000000..566d015
--- /dev/null
+++ b/pkg/dev_compiler/tool/input_sdk/lib/developer/profiler.dart
@@ -0,0 +1,197 @@
+// 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.
+
+part of dart.developer;
+
+/// A UserTag can be used to group samples in the Observatory profiler.
+abstract class UserTag {
+  /// The maximum number of UserTag instances that can be created by a program.
+  static const MAX_USER_TAGS = 64;
+
+  factory UserTag(String label) => new _FakeUserTag(label);
+
+  /// Label of [this].
+  String get label;
+
+  /// Make [this] the current tag for the isolate. Returns the current tag
+  /// before setting.
+  UserTag makeCurrent();
+
+  /// The default [UserTag] with label 'Default'.
+  static UserTag get defaultTag => _FakeUserTag._defaultTag;
+}
+
+// This is a fake implementation of UserTag so that code can compile and run
+// in dart2js.
+class _FakeUserTag implements UserTag {
+  static Map _instances = {};
+
+  _FakeUserTag.real(this.label);
+
+  factory _FakeUserTag(String label) {
+    // Canonicalize by name.
+    var existingTag = _instances[label];
+    if (existingTag != null) {
+      return existingTag;
+    }
+    // Throw an exception if we've reached the maximum number of user tags.
+    if (_instances.length == UserTag.MAX_USER_TAGS) {
+      throw new UnsupportedError(
+          'UserTag instance limit (${UserTag.MAX_USER_TAGS}) reached.');
+    }
+    // Create a new instance and add it to the instance map.
+    var instance = new _FakeUserTag.real(label);
+    _instances[label] = instance;
+    return instance;
+  }
+
+  final String label;
+
+  UserTag makeCurrent() {
+    var old = _currentTag;
+    _currentTag = this;
+    return old;
+  }
+
+  static final UserTag _defaultTag = new _FakeUserTag('Default');
+}
+
+var _currentTag = _FakeUserTag._defaultTag;
+
+/// Returns the current [UserTag] for the isolate.
+UserTag getCurrentTag() {
+  return _currentTag;
+}
+
+/// Abstract [Metric] class. Metric names must be unique, are hierarchical,
+/// and use periods as separators. For example, 'a.b.c'. Uniqueness is only
+/// enforced when a Metric is registered. The name of a metric cannot contain
+/// the slash ('/') character.
+abstract class Metric {
+  /// [name] of this metric.
+  final String name;
+  /// [description] of this metric.
+  final String description;
+
+  Metric(this.name, this.description) {
+    if ((name == 'vm') || name.contains('/')) {
+      throw new ArgumentError('Invalid Metric name.');
+    }
+
+  }
+
+  Map _toJSON();
+}
+
+/// A measured value with a min and max. Initial value is min. Value will
+/// be clamped to the interval [min, max].
+class Gauge extends Metric {
+  final double min;
+  final double max;
+
+  double _value;
+  double get value => _value;
+  set value(double v) {
+    if (v < min) {
+      v = min;
+    } else if (v > max) {
+      v = max;
+    }
+    _value = v;
+  }
+
+  Gauge(String name, String description, this.min, this.max)
+      : super(name, description) {
+    if (min is! double) {
+      throw new ArgumentError('min must be a double');
+    }
+    if (max is! double) {
+      throw new ArgumentError('max must be a double');
+    }
+    if (!(min < max)) {
+      throw new ArgumentError('min must be less than max');
+    }
+    _value = min;
+  }
+
+  Map _toJSON() {
+    var map = {
+      'type': 'Gauge',
+      'id': 'metrics/$name',
+      'name': name,
+      'description': description,
+      'value': value,
+      'min': min,
+      'max': max,
+    };
+    return map;
+  }
+}
+
+
+/// A changing value. Initial value is 0.0.
+class Counter extends Metric {
+  Counter(String name, String description)
+      : super(name, description);
+
+  double _value = 0.0;
+  double get value => _value;
+  set value(double v) {
+    _value = v;
+  }
+
+  Map _toJSON() {
+    var map = {
+      'type': 'Counter',
+      'id': 'metrics/$name',
+      'name': name,
+      'description': description,
+      'value': value,
+    };
+    return map;
+  }
+}
+
+class Metrics {
+  static final Map<String, Metric> _metrics = new Map<String, Metric>();
+
+  /// Register [Metric]s to make them visible to Observatory.
+  static void register(Metric metric) {
+    if (metric is! Metric) {
+      throw new ArgumentError('metric must be a Metric');
+    }
+    if (_metrics[metric.name] != null) {
+      throw new ArgumentError('Registered metrics have unique names');
+    }
+    _metrics[metric.name] = metric;
+  }
+
+  /// Deregister [Metric]s to make them not visible to Observatory.
+  static void deregister(Metric metric) {
+    if (metric is! Metric) {
+      throw new ArgumentError('metric must be a Metric');
+    }
+    _metrics.remove(metric.name);
+  }
+
+  static String _printMetric(String id) {
+    var metric = _metrics[id];
+    if (metric == null) {
+      return null;
+    }
+    return JSON.encode(metric._toJSON());
+  }
+
+  static String _printMetrics() {
+    var metrics = [];
+    for (var metric in _metrics.values) {
+      metrics.add(metric._toJSON());
+    }
+    var map = {
+      'type': 'MetricList',
+      'metrics': metrics,
+    };
+    return JSON.encode(map);
+  }
+}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/service.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/service.dart
new file mode 100644
index 0000000..9ccf0dc
--- /dev/null
+++ b/pkg/dev_compiler/tool/input_sdk/lib/developer/service.dart
@@ -0,0 +1,89 @@
+// 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.
+
+part of dart.developer;
+
+/// Service protocol is the protocol that a client like the observatory
+/// could use to access the services provided by the Dart VM for
+/// debugging and inspecting Dart programs. This class encapsulates the
+/// version number and Uri for accessing this service.
+class ServiceProtocolInfo {
+  /// The major version of the protocol. If the running Dart environment does
+  /// not support the service protocol, this is 0.
+  final int majorVersion = _getServiceMajorVersion();
+  /// The minor version of the protocol. If the running Dart environment does
+  /// not support the service protocol, this is 0.
+  final int minorVersion = _getServiceMinorVersion();
+  /// The Uri to access the service. If the web server is not running, this
+  /// will be null.
+  final Uri serverUri;
+
+  ServiceProtocolInfo(this.serverUri);
+
+  String toString() {
+    if (serverUri != null) {
+      return 'Dart VM Service Protocol v$majorVersion.$minorVersion '
+             'listening on $serverUri';
+    } else {
+      return 'Dart VM Service Protocol v$majorVersion.$minorVersion';
+    }
+  }
+}
+
+/// Access information about the service protocol and control the web server
+/// that provides access to the services provided by the Dart VM for
+/// debugging and inspecting Dart programs.
+class Service {
+  /// Get information about the service protocol (version number and
+  /// Uri to access the service).
+  static Future<ServiceProtocolInfo> getInfo() async {
+    // Port to receive response from service isolate.
+    final RawReceivePort receivePort = new RawReceivePort();
+    final Completer<Uri> uriCompleter = new Completer<Uri>();
+    receivePort.handler = (Uri uri) => uriCompleter.complete(uri);
+    // Request the information from the service isolate.
+    _getServerInfo(receivePort.sendPort);
+    // Await the response from the service isolate.
+    Uri uri = await uriCompleter.future;
+    // Close the port.
+    receivePort.close();
+    return new ServiceProtocolInfo(uri);
+  }
+
+  /// Control the web server that the service protocol is accessed through.
+  /// The [enable] argument must be a boolean and is used as a toggle to
+  /// enable(true) or disable(false) the web server servicing requests.
+  static Future<ServiceProtocolInfo> controlWebServer(
+      {bool enable: false}) async {
+    if (enable is! bool) {
+      throw new ArgumentError.value(enable,
+                                    'enable',
+                                    'Must be a bool');
+    }
+    // Port to receive response from service isolate.
+    final RawReceivePort receivePort = new RawReceivePort();
+    final Completer<Uri> uriCompleter = new Completer<Uri>();
+    receivePort.handler = (Uri uri) => uriCompleter.complete(uri);
+    // Request the information from the service isolate.
+    _webServerControl(receivePort.sendPort, enable);
+    // Await the response from the service isolate.
+    Uri uri = await uriCompleter.future;
+    // Close the port.
+    receivePort.close();
+    return new ServiceProtocolInfo(uri);
+  }
+}
+
+/// [sp] will receive a Uri or null.
+external void _getServerInfo(SendPort sp);
+
+/// [sp] will receive a Uri or null.
+external void _webServerControl(SendPort sp, bool enable);
+
+/// Returns the major version of the service protocol.
+external int _getServiceMajorVersion();
+
+/// Returns the minor version of the service protocol.
+external int _getServiceMinorVersion();
+
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/timeline.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/timeline.dart
new file mode 100644
index 0000000..b6118af
--- /dev/null
+++ b/pkg/dev_compiler/tool/input_sdk/lib/developer/timeline.dart
@@ -0,0 +1,328 @@
+// Copyright (c) 2015, 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 dart.developer;
+
+const bool _isProduct = const bool.fromEnvironment("dart.vm.product");
+
+typedef dynamic TimelineSyncFunction();
+typedef Future TimelineAsyncFunction();
+
+/// Add to the timeline.
+class Timeline {
+  /// Start a synchronous operation labeled [name]. Optionally takes
+  /// a [Map] of [arguments]. This operation must be finished before
+  /// returning to the event queue.
+  static void startSync(String name, {Map arguments}) {
+    if (_isProduct) {
+      return;
+    }
+    if (name is! String) {
+      throw new ArgumentError.value(name,
+                                    'name',
+                                    'Must be a String');
+    }
+    if (!_isDartStreamEnabled()) {
+      // Push a null onto the stack and return.
+      _stack.add(null);
+      return;
+    }
+    var block = new _SyncBlock._(name, _getTraceClock(), _getThreadCpuClock());
+    if (arguments is Map) {
+      block._appendArguments(arguments);
+    }
+    _stack.add(block);
+  }
+
+  /// Finish the last synchronous operation that was started.
+  static void finishSync() {
+    if (_isProduct) {
+      return;
+    }
+    if (_stack.length == 0) {
+      throw new StateError(
+          'Uneven calls to startSync and finishSync');
+    }
+    // Pop top item off of stack.
+    var block = _stack.removeLast();
+    if (block == null) {
+      // Dart stream was disabled when startSync was called.
+      return;
+    }
+    // Finish it.
+    block.finish();
+  }
+
+  /// Emit an instant event.
+  static void instantSync(String name, {Map arguments}) {
+    if (_isProduct) {
+      return;
+    }
+    if (name is! String) {
+      throw new ArgumentError.value(name,
+                                    'name',
+                                    'Must be a String');
+    }
+    if (!_isDartStreamEnabled()) {
+      // Stream is disabled.
+      return;
+    }
+    Map instantArguments;
+    if (arguments is Map) {
+      instantArguments = new Map.from(arguments);
+    }
+    _reportInstantEvent(_getTraceClock(),
+                        'Dart',
+                        name,
+                        _argumentsAsJson(instantArguments));
+  }
+
+
+  /// A utility method to time a synchronous [function]. Internally calls
+  /// [function] bracketed by calls to [startSync] and [finishSync].
+  static dynamic timeSync(String name,
+                          TimelineSyncFunction function,
+                          {Map arguments}) {
+    startSync(name, arguments: arguments);
+    try {
+      return function();
+    } finally {
+      finishSync();
+    }
+  }
+
+  /// The current time stamp from the clock used by the timeline. Units are
+  /// microseconds.
+  static int get now => _getTraceClock();
+  static final List<_SyncBlock> _stack = new List<_SyncBlock>();
+  static final int _isolateId = _getIsolateNum();
+  static final String _isolateIdString = _isolateId.toString();
+}
+
+/// An asynchronous task on the timeline. An asynchronous task can have many
+/// (nested) synchronous operations. Synchronous operations can live longer than
+/// the current isolate event. To pass a [TimelineTask] to another isolate,
+/// you must first call [pass] to get the task id and then construct a new
+/// [TimelineTask] in the other isolate.
+class TimelineTask {
+  /// Create a task. [taskId] will be set by the system.
+  TimelineTask()
+      : _taskId = _getNextAsyncId() {
+  }
+
+  /// Create a task with an explicit [taskId]. This is useful if you are
+  /// passing a task from one isolate to another.
+  TimelineTask.withTaskId(int taskId)
+      : _taskId = taskId {
+    if (taskId is! int) {
+      throw new ArgumentError.value(taskId,
+                                    'taskId',
+                                    'Must be an int');
+    }
+  }
+
+  /// Start a synchronous operation within this task named [name].
+  /// Optionally takes a [Map] of [arguments].
+  void start(String name, {Map arguments}) {
+    if (_isProduct) {
+      return;
+    }
+    if (name is! String) {
+      throw new ArgumentError.value(name,
+                                    'name',
+                                    'Must be a String');
+    }
+    var block = new _AsyncBlock._(name, _taskId);
+    if (arguments is Map) {
+      block._appendArguments(arguments);
+    }
+    _stack.add(block);
+    block._start();
+  }
+
+  /// Emit an instant event for this task.
+  void instant(String name, {Map arguments}) {
+    if (_isProduct) {
+      return;
+    }
+    if (name is! String) {
+      throw new ArgumentError.value(name,
+                                    'name',
+                                    'Must be a String');
+    }
+    Map instantArguments;
+    if (arguments is Map) {
+      instantArguments = new Map.from(arguments);
+    }
+    _reportTaskEvent(_getTraceClock(),
+                     _taskId,
+                     'n',
+                     'Dart',
+                     name,
+                     _argumentsAsJson(instantArguments));
+  }
+
+  /// Finish the last synchronous operation that was started.
+  void finish() {
+    if (_isProduct) {
+      return;
+    }
+    if (_stack.length == 0) {
+      throw new StateError(
+          'Uneven calls to start and finish');
+    }
+    // Pop top item off of stack.
+    var block = _stack.removeLast();
+    block._finish();
+  }
+
+  /// Retrieve the [TimelineTask]'s task id. Will throw an exception if the
+  /// stack is not empty.
+  int pass() {
+    if (_stack.length > 0) {
+      throw new StateError(
+          'You cannot pass a TimelineTask without finishing all started '
+          'operations');
+    }
+    int r = _taskId;
+    return r;
+  }
+
+  final int _taskId;
+  final List<_AsyncBlock> _stack = [];
+}
+
+/// An asynchronous block of time on the timeline. This block can be kept
+/// open across isolate messages.
+class _AsyncBlock {
+  /// The category this block belongs to.
+  final String category = 'Dart';
+  /// The name of this block.
+  final String name;
+  /// The asynchronous task id.
+  final int _taskId;
+  /// An (optional) set of arguments which will be serialized to JSON and
+  /// associated with this block.
+  Map _arguments;
+
+  _AsyncBlock._(this.name, this._taskId);
+
+  // Emit the start event.
+  void _start() {
+    _reportTaskEvent(_getTraceClock(),
+                     _taskId,
+                     'b',
+                     category,
+                     name,
+                     _argumentsAsJson(_arguments));
+  }
+
+  // Emit the finish event.
+  void _finish() {
+    _reportTaskEvent(_getTraceClock(),
+                     _taskId,
+                     'e',
+                     category,
+                     name,
+                     _argumentsAsJson(null));
+  }
+
+  void _appendArguments(Map arguments) {
+    if (_arguments == null) {
+      _arguments = {};
+    }
+    _arguments.addAll(arguments);
+  }
+}
+
+/// A synchronous block of time on the timeline. This block should not be
+/// kept open across isolate messages.
+class _SyncBlock {
+  /// The category this block belongs to.
+  final String category = 'Dart';
+  /// The name of this block.
+  final String name;
+  /// An (optional) set of arguments which will be serialized to JSON and
+  /// associated with this block.
+  Map _arguments;
+  // The start time stamp.
+  final int _start;
+  // The start time stamp of the thread cpu clock.
+  final int _startCpu;
+
+  _SyncBlock._(this.name,
+               this._start,
+               this._startCpu);
+
+  /// Finish this block of time. At this point, this block can no longer be
+  /// used.
+  void finish() {
+    // Report event to runtime.
+    _reportCompleteEvent(_start,
+                         _startCpu,
+                         category,
+                         name,
+                         _argumentsAsJson(_arguments));
+  }
+
+  void _appendArguments(Map arguments) {
+    if (arguments == null) {
+      return;
+    }
+    if (_arguments == null) {
+      _arguments = {};
+    }
+    _arguments.addAll(arguments);
+  }
+}
+
+String _fastPathArguments;
+String _argumentsAsJson(Map arguments) {
+  if ((arguments == null) || (arguments.length == 0)) {
+    // Fast path no arguments. Avoid calling JSON.encode.
+    if (_fastPathArguments == null) {
+      _fastPathArguments = '{"isolateNumber":"${Timeline._isolateId}"}';
+    }
+    return _fastPathArguments;
+  }
+  // Add isolateNumber to arguments map.
+  arguments['isolateNumber'] = Timeline._isolateIdString;
+  return JSON.encode(arguments);
+}
+
+/// Returns true if the Dart Timeline stream is enabled.
+external bool _isDartStreamEnabled();
+
+/// Returns the next async task id.
+external int _getNextAsyncId();
+
+/// Returns the current value from the trace clock.
+external int _getTraceClock();
+
+/// Returns the current value from the thread CPU usage clock.
+external int _getThreadCpuClock();
+
+/// Returns the isolate's main port number.
+external int _getIsolateNum();
+
+/// Reports an event for a task.
+external void _reportTaskEvent(int start,
+                               int taskId,
+                               String phase,
+                               String category,
+                               String name,
+                               String argumentsAsJson);
+
+/// Reports a complete synchronous event.
+external void _reportCompleteEvent(int start,
+                                   int startCpu,
+                                   String category,
+                                   String name,
+                                   String argumentsAsJson);
+
+/// Reports an instant event.
+external void _reportInstantEvent(int start,
+                                  String category,
+                                  String name,
+                                  String argumentsAsJson);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/symbol.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/symbol.dart
index 6722d98..b1aa855 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/symbol.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/internal/symbol.dart
@@ -15,6 +15,9 @@
 class Symbol implements core.Symbol {
   final String _name;
 
+  // Used internally by DDC to map ES6 symbols to Dart.
+  final dynamic _nativeSymbol;
+
   /**
    * Source of RegExp matching Dart reserved words.
    *
@@ -95,22 +98,28 @@
    * The empty symbol is handled before this regexp is used, and is not
    * accepted.
    */
-  static final RegExp symbolPattern = new RegExp(
-      '^(?:$operatorRE\$|$identifierRE(?:=?\$|[.](?!\$)))+?\$');
+  static final RegExp symbolPattern =
+      new RegExp('^(?:$operatorRE\$|$identifierRE(?:=?\$|[.](?!\$)))+?\$');
 
   external const Symbol(String name);
 
+  external const Symbol.es6(String name, nativeSymbol);
+
   /**
    * Platform-private method used by the mirror system to create
    * otherwise invalid names.
    */
-  const Symbol.unvalidated(this._name);
+  const Symbol.unvalidated(this._name) : this._nativeSymbol = null;
 
   // This is called by dart2js.
   Symbol.validated(String name)
-      : this._name = validatePublicSymbol(name);
+      : this._name = validatePublicSymbol(name),
+        this._nativeSymbol = null;
 
-  bool operator ==(Object other) => other is Symbol && _name == other._name;
+  bool operator ==(Object other) =>
+      other is Symbol &&
+      _name == other._name &&
+      _nativeSymbol == other._nativeSymbol;
 
   external int get hashCode;
 
@@ -119,6 +128,8 @@
   /// Platform-private accessor which cannot be called from user libraries.
   static String getName(Symbol symbol) => symbol._name;
 
+  static dynamic getNativeSymbol(Symbol symbol) => symbol._nativeSymbol;
+
   static String validatePublicSymbol(String name) {
     if (name.isEmpty || publicSymbolPattern.hasMatch(name)) return name;
     if (name.startsWith('_')) {
@@ -127,8 +138,7 @@
       // message.
       throw new ArgumentError('"$name" is a private identifier');
     }
-    throw new ArgumentError(
-        '"$name" is not a valid (qualified) symbol name');
+    throw new ArgumentError('"$name" is not a valid (qualified) symbol name');
   }
 
   /**
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
new file mode 100644
index 0000000..93f19fb
--- /dev/null
+++ b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2015, 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.
+
+// Patch file for dart:developer library.
+
+import 'dart:_js_helper' show patch, ForceInline;
+import 'dart:_foreign_helper' show JS;
+
+@patch
+// @ForceInline()
+bool debugger({bool when: true, String message}) {
+  if (when) {
+    JS('', 'debugger');
+  }
+  return when;
+}
+
+@patch
+Object inspect(Object object) {
+  return object;
+}
+
+@patch
+void log(String message,
+         {DateTime time,
+          int sequenceNumber,
+          int level: 0,
+          String name: '',
+          Zone zone,
+          Object error,
+          StackTrace stackTrace}) {
+  // TODO.
+}
+
+final _extensions = new Map<String, ServiceExtensionHandler>();
+
+@patch
+ServiceExtensionHandler _lookupExtension(String method) {
+  return _extensions[method];
+}
+
+@patch
+_registerExtension(String method, ServiceExtensionHandler handler) {
+  _extensions[method] = handler;
+}
+
+@patch
+_postEvent(String eventKind, String eventData) {
+  // TODO.
+}
+
+
+@patch
+bool _isDartStreamEnabled() {
+  return false;
+}
+
+@patch
+int _getTraceClock() {
+  // TODO.
+  return _clockValue++;
+}
+int _clockValue = 0;
+
+@patch
+int _getThreadCpuClock() {
+  return -1;
+}
+
+
+@patch
+void _reportCompleteEvent(int start,
+                          int startCpu,
+                          String category,
+                          String name,
+                          String argumentsAsJson) {
+  // TODO.
+}
+
+@patch
+void _reportInstantEvent(int start,
+                         String category,
+                         String name,
+                         String argumentsAsJson) {
+  // TODO.
+}
+
+@patch
+int _getNextAsyncId() {
+  return 0;
+}
+
+@patch
+int _getIsolateNum() {
+  return 0;
+}
+
+@patch
+void _reportTaskEvent(int start,
+                      int taskId,
+                      String phase,
+                      String category,
+                      String name,
+                      String argumentsAsJson) {
+ // TODO.
+}
+
+@patch
+int _getServiceMajorVersion() {
+  return 0;
+}
+
+@patch
+int _getServiceMinorVersion() {
+  return 0;
+}
+
+@patch
+void _getServerInfo(SendPort sp) {
+  sp.send(null);
+}
+
+@patch
+void _webServerControl(SendPort sp, bool enable) {
+  sp.send(null);
+}
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
index e4fd296..22f67d3 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
@@ -11,7 +11,11 @@
 class Symbol implements core.Symbol {
   @patch
   const Symbol(String name)
-      : this._name = name;
+      : this._name = name, this._nativeSymbol = null;
+
+  @patch
+  const Symbol.es6(String name, dynamic nativeSymbol)
+      : this._name = name, this._nativeSymbol = nativeSymbol;
 
   @patch
   int get hashCode {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
index 1899f96..629db38 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
@@ -64,12 +64,12 @@
 /// The Symbol for storing type arguments on a specialized generic type.
 final _mixins = JS('', 'Symbol("mixins")');
 
-getMixins(clazz) => JS('', '$clazz[$_mixins]');
+getMixins(clazz) => JS('', 'Object.hasOwnProperty.call(#, #) ? #[#] : null', clazz, _mixins, clazz, _mixins);
 
 @JSExportName('implements')
 final _implements = JS('', 'Symbol("implements")');
 
-getImplements(clazz) => JS('', '#[#]', clazz, _implements);
+getImplements(clazz) => JS('', 'Object.hasOwnProperty.call(#, #) ? #[#] : null', clazz, _implements, clazz, _implements);
 
 /// The Symbol for storing type arguments on a specialized generic type.
 final _typeArguments = JS('', 'Symbol("typeArguments")');
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart b/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
index 6c985d7..8560096 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
@@ -71,71 +71,108 @@
   return JS('', '#.definiteFunctionType(#, [])', _dart, type);
 }
 
+dynamic _getMixins(type) {
+  return JS('', '#.getMixins(#, [])', _dart, type);
+}
+
 typedef T _Lazy<T>();
 
+dynamic _getESSymbol(Symbol symbol) =>
+    _internal.Symbol.getNativeSymbol(symbol as _internal.Symbol);
+
+dynamic _getMember(Symbol symbol) {
+  var privateSymbol = _getESSymbol(symbol);
+  if (privateSymbol != null) {
+    return privateSymbol;
+  }
+  return getName(symbol);
+}
+
 String _getNameForESSymbol(member) {
   // Convert private JS symbol "Symbol(_foo)" to string "_foo".
+  assert(JS('bool', 'typeof # == "symbol"', member));
   var str = member.toString();
   assert(str.startsWith('Symbol(') && str.endsWith(')'));
   return str.substring(7, str.length - 1);
 }
 
-Map _toDartMap(data) {
+Symbol _getSymbolForESSymbol(member) {
+  var name = _getNameForESSymbol(member);
+  return new _internal.Symbol.es6(name, member);
+}
+
+// The [member] must be either a string (public) or an ES6 symbol (private).
+Symbol _getSymbolForMember(member) {
+  if (member is String) {
+    return new Symbol(member);
+  } else {
+    var name = _getNameForESSymbol(member);
+    return new _internal.Symbol.es6(name, member);
+  }
+}
+
+Map<Symbol, dynamic> _toDartMap(data) {
   if (data == null) return {};
-  var map = JS('Map', '#.map(#)', _dart, data);
+  var map = new Map<Symbol, dynamic>();
   // Note: we recorded a map from fields/methods to their type and metadata.
   // The key is a string name for public members but an ES6 symbol for private
   // ones.  That's works nicely for dynamic operations, but dart:mirrors expects
-  // strings, so we convert back here.
+  // Dart symbols, so we convert here.
+  var publicMembers = JS('', 'Object.getOwnPropertyNames(#)', data);
+  for (var member in publicMembers) {
+    var symbol = new Symbol(member);
+    map[symbol] = JS('', '#[#]', data, member);
+  }
+
   var privateMembers = JS('', 'Object.getOwnPropertySymbols(#)', data);
   for (var member in privateMembers) {
-    var name = _getNameForESSymbol(member);
-    map[name] = JS('', '#[#]', data, member);
+    var symbol = _getSymbolForESSymbol(member);
+    map[symbol] = JS('', '#[#]', data, member);
   }
   return map;
 }
 
-Map _getConstructors(obj) {
+Map<Symbol, dynamic> _getConstructors(obj) {
   List sig = JS('', '#.getConstructorSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
 
-Map _getFields(obj) {
+Map<Symbol, dynamic> _getFields(obj) {
   List sig = JS('', '#.getFieldSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
 
-Map _getMethods(obj) {
+Map<Symbol, dynamic> _getMethods(obj) {
   List sig = JS('', '#.getMethodSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
 
-Map _getGetters(obj) {
+Map<Symbol, dynamic> _getGetters(obj) {
   List sig = JS('', '#.getGetterSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
 
-Map _getSetters(obj) {
+Map<Symbol, dynamic> _getSetters(obj) {
   List sig = JS('', '#.getSetterSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
 
-Map _getStaticFields(obj) {
+Map<Symbol, dynamic> _getStaticFields(obj) {
   List sig = JS('', '#.getStaticFieldSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
 
-Map _getStatics(obj) {
+Map<Symbol, dynamic> _getStatics(obj) {
   List sig = JS('', '#.getStaticSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
 
-Map _getStaticGetters(obj) {
+Map<Symbol, dynamic> _getStaticGetters(obj) {
   List sig = JS('', '#.getStaticGetterSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
 
-Map _getStaticSetters(obj) {
+Map<Symbol, dynamic> _getStaticSetters(obj) {
   List sig = JS('', '#.getStaticSetterSig(#)', _dart, obj);
   return _toDartMap(sig);
 }
@@ -211,21 +248,7 @@
   // Returns a String for public members or an ES6 symbol for private members.
   _getAccessor(dynamic reflectee, Symbol symbol, [List<dynamic> args,
       Map<Symbol, dynamic> namedArgs]) {
-    var name = getName(symbol);
-    if (!name.startsWith('_')) return name;
-
-    // TODO(vsm): Ideally, we'd record ES6 symbols properly during codegen if
-    // mirrors is enabled.  Here, we're trying to recover it from the receiver
-    // instead.
-    //
-    // Get private fields and members.  Members are on proto.
-    var privateMembers = JS('', 'Object.getOwnPropertySymbols(#)', reflectee)
-      ..addAll(JS('', 'Object.getOwnPropertySymbols(#.__proto__)', reflectee));
-    for (var member in privateMembers) {
-      var privateName = _getNameForESSymbol(member);
-      if (name == privateName) return member;
-    }
-    return new NoSuchMethodError(reflectee, symbol, args, namedArgs);
+    return _getMember(symbol);
   }
 
   InstanceMirror getField(Symbol symbol) {
@@ -275,7 +298,7 @@
   final dynamic _raw;
 
   // TODO(vsm): Do this properly
-  final ClassMirror mixin = null;
+  ClassMirror _mixin = null;
   List<TypeMirror> _typeArguments;
 
   List<InstanceMirror> _metadata;
@@ -305,67 +328,67 @@
       _declarations = new Map<Symbol, DeclarationMirror>();
       var unwrapped = _unwrap(_cls);
       var constructors = _getConstructors(unwrapped);
-      constructors.forEach((String name, ft) {
-        var symbol = new Symbol(name);
-        _declarations[symbol] = new JsMethodMirror._constructor(this, name, ft);
+      constructors.forEach((symbol, ft) {
+        var name = getName(symbol);
+        _declarations[symbol] = new JsMethodMirror._constructor(this, symbol, ft);
       });
       if (constructors.isEmpty) {
         // Add a default
         var name = 'new';
         var ft = _defaultConstructorType(_unwrap(_cls));
         var symbol = new Symbol(name);
-        _declarations[symbol] = new JsMethodMirror._constructor(this, name, ft);
+        _declarations[symbol] = new JsMethodMirror._constructor(this, symbol, ft);
       }
       var fields = _getFields(unwrapped);
-      fields.forEach((String name, t) {
-        var symbol = new Symbol(name);
+      fields.forEach((symbol, t) {
         var metadata = [];
         if (t is List) {
           metadata = t.skip(1).toList();
           t = t[0];
         }
-        _declarations[symbol] = new JsVariableMirror._(name, _wrap(t), metadata);
+        _declarations[symbol] = new JsVariableMirror._(symbol, _wrap(t), metadata);
       });
       var methods = _getMethods(unwrapped);
-      methods.forEach((String name, ft) {
-        var symbol = new Symbol(name);
-        _declarations[symbol] = new JsMethodMirror._instanceMethod(this, name, ft);
+      methods.forEach((symbol, ft) {
+        var name = getName(symbol);
+        _declarations[symbol] = new JsMethodMirror._instanceMethod(this, symbol, ft);
       });
       var getters = _getGetters(unwrapped);
-      getters.forEach((String name, ft) {
-        var symbol = new Symbol(name);
-        _declarations[symbol] = new JsMethodMirror._instanceMethod(this, name, ft);
+      getters.forEach((symbol, ft) {
+        var name = getName(symbol);
+        _declarations[symbol] = new JsMethodMirror._instanceMethod(this, symbol, ft);
       });
       var setters = _getSetters(unwrapped);
-      setters.forEach((String name, ft) {
-        name += '=';
-        var symbol = new Symbol(name);
-        _declarations[symbol] = new JsMethodMirror._instanceMethod(this, name, ft);
+      setters.forEach((symbol, ft) {
+        var name = getName(symbol) + '=';
+        // Create a separate symbol for the setter.
+        symbol = new _internal.Symbol.es6(name, _getESSymbol(symbol));
+        _declarations[symbol] = new JsMethodMirror._instanceMethod(this, symbol, ft);
       });
       var staticFields = _getStaticFields(unwrapped);
-      staticFields.forEach((String name, t) {
-        var symbol = new Symbol(name);
+      staticFields.forEach((symbol, t) {
+        var name = getName(symbol);
         var metadata = [];
         if (t is List) {
           metadata = t.skip(1).toList();
           t = t[0];
         }
-        _declarations[symbol] = new JsVariableMirror._(name, _wrap(t), metadata);
+        _declarations[symbol] = new JsVariableMirror._(symbol, _wrap(t), metadata);
       });
       var statics = _getStatics(unwrapped);
-      statics.forEach((String name, ft) {
-        var symbol = new Symbol(name);
-        _declarations[symbol] = new JsMethodMirror._staticMethod(this, name, ft);
+      statics.forEach((symbol, ft) {
+        var name = getName(symbol);
+        _declarations[symbol] = new JsMethodMirror._staticMethod(this, symbol, ft);
       });
       var staticGetters = _getStaticGetters(unwrapped);
-      staticGetters.forEach((String name, ft) {
-        var symbol = new Symbol(name);
-        _declarations[symbol] = new JsMethodMirror._staticMethod(this, name, ft);
+      staticGetters.forEach((symbol, ft) {
+        var name = getName(symbol);
+        _declarations[symbol] = new JsMethodMirror._staticMethod(this, symbol, ft);
       });
       var staticSetters = _getStaticSetters(unwrapped);
-      staticSetters.forEach((String name, ft) {
-        var symbol = new Symbol(name);
-        _declarations[symbol] = new JsMethodMirror._staticMethod(this, name, ft);
+      staticSetters.forEach((symbol, ft) {
+        var name = getName(symbol);
+        _declarations[symbol] = new JsMethodMirror._staticMethod(this, symbol, ft);
       });
       _declarations = new Map<Symbol, DeclarationMirror>.unmodifiable(_declarations);
     }
@@ -455,23 +478,44 @@
     }
   }
 
+  ClassMirror get mixin {
+    if (_mixin != null) {
+      return _mixin;
+    }
+    var mixins = _getMixins(_unwrap(_cls));
+    if (mixins == null || mixins.isEmpty) {
+      // If there is no mixin, return this mirror per API.
+      _mixin = this;
+      return _mixin;
+    }
+    if (mixins.length > 1) {
+      throw new UnsupportedError("ClassMirror.mixin not yet supported for "
+        "classes ($_cls) with multiple mixins");
+    }
+    _mixin = reflectType(_wrap(mixins[0]));
+    return _mixin;
+  }
+
   String toString() => "ClassMirror on '$_cls'";
 }
 
 class JsVariableMirror extends JsMirror implements VariableMirror {
+  final Symbol _symbol;
   final String _name;
   final TypeMirror type;
   final List<InstanceMirror> metadata;
 
   // TODO(vsm): Refactor this out.
-  Symbol get simpleName => new Symbol(_name);
+  Symbol get simpleName => _symbol;
 
   // TODO(vsm): Fix this
   final bool isStatic = false;
   final bool isFinal = false;
 
-  JsVariableMirror._(this._name, Type t, List annotations)
-      : type = reflectType(t),
+  JsVariableMirror._(Symbol symbol, Type t, List annotations)
+      : _symbol = symbol,
+        _name = getName(symbol),
+        type = reflectType(t),
         metadata = new List<InstanceMirror>.unmodifiable(
             annotations.map((a) => reflect(a)));
 
@@ -479,14 +523,14 @@
 }
 
 class JsParameterMirror extends JsVariableMirror implements ParameterMirror {
-  JsParameterMirror._(String name, Type t, List annotations)
-      : super._(name, t, annotations);
+  JsParameterMirror._(Symbol member, Type t, List annotations)
+      : super._(member, t, annotations);
 
   String toString() => "ParameterMirror on '$_name'";
 }
 
 class JsMethodMirror extends JsMirror implements MethodMirror {
-  // TODO(vsm): This could be a JS symbol for private methods
+  final Symbol _symbol;
   final String _name;
   List<ParameterMirror> _params;
   List<InstanceMirror> _metadata;
@@ -499,25 +543,25 @@
   bool get isPrivate => _name.startsWith('_');
 
   // TODO(vsm): Refactor this out.
-  Symbol get simpleName => new Symbol(_name);
+  Symbol get simpleName => _symbol;
 
-  JsMethodMirror._constructor(JsClassMirror cls, String name, ftype)
-    : _name = name, isConstructor = true, isStatic = false {
+  JsMethodMirror._constructor(JsClassMirror cls, Symbol symbol, ftype)
+    : _symbol = symbol, _name = getName(symbol), isConstructor = true, isStatic = false {
       _createParameterMirrorList(ftype);
   }
 
-  JsMethodMirror._instanceMethod(JsClassMirror cls, String name, ftype)
-    : _name = name, isConstructor = false, isStatic = false {
+  JsMethodMirror._instanceMethod(JsClassMirror cls, Symbol symbol, ftype)
+    : _symbol = symbol, _name = getName(symbol), isConstructor = false, isStatic = false {
       _createParameterMirrorList(ftype);
   }
 
-  JsMethodMirror._staticMethod(JsClassMirror cls, String name, ftype)
-    : _name = name, isConstructor = false, isStatic = true {
+  JsMethodMirror._staticMethod(JsClassMirror cls, Symbol symbol, ftype)
+    : _symbol = symbol, _name = getName(symbol), isConstructor = false, isStatic = true {
       _createParameterMirrorList(ftype);
   }
 
   // TODO(vsm): Support named constructors.
-  Symbol get constructorName => isConstructor ? new Symbol(_name) : null;
+  Symbol get constructorName => isConstructor ? _symbol : null;
   List<ParameterMirror> get parameters => _params;
   List<InstanceMirror> get metadata => _metadata;
 
@@ -556,7 +600,7 @@
       var type = args[i];
       var metadata = ftype.metadata[i];
       // TODO(vsm): Recover the param name.
-      var param = new JsParameterMirror._('', _wrap(type), metadata);
+      var param = new JsParameterMirror._(new Symbol(''), _wrap(type), metadata);
       params[i] = param;
     }
 
@@ -564,7 +608,7 @@
       var type = opts[i];
       var metadata = ftype.metadata[args.length + i];
       // TODO(vsm): Recover the param name.
-      var param = new JsParameterMirror._('', _wrap(type), metadata);
+      var param = new JsParameterMirror._(new Symbol(''), _wrap(type), metadata);
       params[i + args.length] = param;
     }
 
diff --git a/pkg/kernel/lib/target/flutter.dart b/pkg/kernel/lib/target/flutter.dart
index ea9e704..5673a22 100644
--- a/pkg/kernel/lib/target/flutter.dart
+++ b/pkg/kernel/lib/target/flutter.dart
@@ -17,7 +17,7 @@
   FlutterTarget(this.flags);
 
   bool get strongMode => flags.strongMode;
-  
+
   bool get strongModeSdk => false;
 
   String get name => 'flutter';
@@ -47,7 +47,6 @@
         // Required for flutter.
         'dart:ui',
         'dart:jni',
-        'dart:mojo.internal',
         'dart:vmservice_sky',
       ];
 
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 27cc492..e40b2c0 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -92,6 +92,19 @@
     variable.flags &= ~VariableDeclaration.FlagInScope;
   }
 
+  void declareTypeParameters(List<TypeParameter> parameters) {
+    for (int i = 0; i < parameters.length; ++i) {
+      var parameter = parameters[i];
+      if (!typeParameters.add(parameter)) {
+        throw 'Type parameter $parameter redeclared in $context';
+      }
+    }
+  }
+
+  void undeclareTypeParameters(List<TypeParameter> parameters) {
+    typeParameters.removeAll(parameters);
+  }
+
   void checkVariableInScope(VariableDeclaration variable, TreeNode where) {
     if (variable.flags & VariableDeclaration.FlagInScope == 0) {
       throw 'Variable $variable used out of scope in $context '
@@ -101,7 +114,11 @@
 
   visitProgram(Program program) {
     for (var library in program.libraries) {
-      classes.addAll(library.classes);
+      for (var class_ in library.classes) {
+        if (!classes.add(class_)) {
+          throw 'Class $class_ declared more than once';
+        }
+      }
       library.members.forEach(declareMember);
       for (var class_ in library.classes) {
         class_.members.forEach(declareMember);
@@ -157,7 +174,7 @@
 
   visitClass(Class node) {
     currentClass = node;
-    typeParameters.addAll(node.typeParameters);
+    declareTypeParameters(node.typeParameters);
     var oldParent = enterParent(node);
     classTypeParametersAreInScope = false;
     visitList(node.annotations, this);
@@ -167,14 +184,14 @@
     visitList(node.constructors, this);
     visitList(node.procedures, this);
     exitParent(oldParent);
-    typeParameters.removeAll(node.typeParameters);
+    undeclareTypeParameters(node.typeParameters);
     currentClass = null;
   }
 
   visitFunctionNode(FunctionNode node) {
-    typeParameters.addAll(node.typeParameters);
+    declareTypeParameters(node.typeParameters);
     visitWithLocalScope(node);
-    typeParameters.removeAll(node.typeParameters);
+    undeclareTypeParameters(node.typeParameters);
   }
 
   visitFunctionType(FunctionType node) {
@@ -184,14 +201,14 @@
             '$context';
       }
     }
-    typeParameters.addAll(node.typeParameters);
+    declareTypeParameters(node.typeParameters);
     for (var typeParameter in node.typeParameters) {
       typeParameter.bound?.accept(this);
     }
     visitList(node.positionalParameters, this);
     visitList(node.namedParameters, this);
     node.returnType.accept(this);
-    typeParameters.removeAll(node.typeParameters);
+    undeclareTypeParameters(node.typeParameters);
   }
 
   visitBlock(Block node) {
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 67a7e96..e9f03b9 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -6,14 +6,17 @@
 import 'package:kernel/verifier.dart';
 import 'package:test/test.dart';
 
-/// Checks that the sanity checks correctly find errors in invalid programs.
+/// Checks that the verifier correctly find errors in invalid programs.
 ///
 /// The frontend should never generate invalid programs, so we have to test
 /// these by manually constructing invalid ASTs.
 ///
-/// We only test negative cases here, as we get plenty of positive cases by
-/// compiling the Dart test suite with sanity checks enabled.
+/// We mostly test negative cases here, as we get plenty of positive cases by
+/// compiling the Dart test suite with the verifier enabled.
 main() {
+  positiveTest('Test harness has no errors', () {
+    return new NullLiteral();
+  });
   negativeTest('VariableGet out of scope', () {
     return new VariableGet(makeVariable());
   });
@@ -43,6 +46,24 @@
         supertype: objectClass.asRawSupertype,
         fields: [field, field]);
   });
+  negativeTest('Class redeclared', () {
+    return otherClass; // Test harness also adds otherClass to program.
+  });
+  negativeTest('Class type parameter redeclared', () {
+    var parameter = makeTypeParameter();
+    return new Class(
+        name: 'Test',
+        supertype: objectClass.asRawSupertype,
+        typeParameters: [parameter, parameter]);
+  });
+  negativeTest('Member type parameter redeclared', () {
+    var parameter = makeTypeParameter();
+    return new Procedure(
+        new Name('test'),
+        ProcedureKind.Method,
+        new FunctionNode(new ReturnStatement(new NullLiteral()),
+            typeParameters: [parameter, parameter]));
+  });
   negativeTest('Type parameter out of scope', () {
     var parameter = makeTypeParameter();
     return new ListLiteral([], typeArgument: new TypeParameterType(parameter));
@@ -129,33 +150,43 @@
     typeParameters: [makeTypeParameter('OtherT')],
     supertype: objectClass.asRawSupertype);
 
+Program makeProgram(TreeNode makeBody()) {
+  var node = makeBody();
+  if (node is Expression) {
+    node = new ReturnStatement(node);
+  }
+  if (node is Statement) {
+    node = new FunctionNode(node);
+  }
+  if (node is FunctionNode) {
+    node = new Procedure(new Name('test'), ProcedureKind.Method, node);
+  }
+  if (node is Member) {
+    node = new Class(
+        name: 'Test',
+        typeParameters: [classTypeParameter],
+        supertype: objectClass.asRawSupertype)..addMember(node);
+  }
+  if (node is Class) {
+    node =
+        new Library(Uri.parse('test.dart'), classes: <Class>[node, otherClass]);
+  }
+  if (node is Library) {
+    node = new Program(<Library>[node, stubLibrary]);
+  }
+  assert(node is Program);
+  return node;
+}
+
 negativeTest(String name, TreeNode makeBody()) {
   test(name, () {
-    var node = makeBody();
-    if (node is Expression) {
-      node = new ReturnStatement(node);
-    }
-    if (node is Statement) {
-      node = new FunctionNode(node);
-    }
-    if (node is FunctionNode) {
-      node = new Procedure(new Name('test'), ProcedureKind.Method, node);
-    }
-    if (node is Member) {
-      node = new Class(
-          name: 'Test',
-          typeParameters: [classTypeParameter],
-          supertype: objectClass.asRawSupertype)..addMember(node);
-    }
-    if (node is Class) {
-      node = new Library(Uri.parse('test.dart'),
-          classes: <Class>[node, otherClass]);
-    }
-    if (node is Library) {
-      node = new Program(<Library>[node, stubLibrary]);
-    }
-    assert(node is Program);
-    checkHasError(node);
+    checkHasError(makeProgram(makeBody));
+  });
+}
+
+positiveTest(String name, TreeNode makeBody()) {
+  test(name, () {
+    verifyProgram(makeProgram(makeBody));
   });
 }
 
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 0e75ba274..903cc40 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -7,7 +7,7 @@
 declare_args() {
   # Whether to fall back to built-in root certificates when they cannot be
   # verified at the operating system level.
-  dart_use_fallback_root_certificates = true
+  dart_use_fallback_root_certificates = false
 
   # The BUILD.gn file that we pull from chromium as part of zlib has a
   # dependence on //base, which we don't pull in. In a standalone build of the
@@ -20,6 +20,11 @@
   dart_use_tcmalloc = false
 }
 
+# TODO(zra): Remove this when Fuchsia has a root cert cache on the filesystem.
+if (defined(is_fuchsia) && is_fuchsia) {
+  dart_use_fallback_root_certificates = true
+}
+
 # Generate a resources.cc file for the service isolate without Observatory.
 action("gen_resources_cc") {
   visibility = [ ":*" ]  # Only targets in this file can see this.
diff --git a/runtime/bin/secure_socket_boringssl.cc b/runtime/bin/secure_socket_boringssl.cc
index 6e3b7fc..90d22fb 100644
--- a/runtime/bin/secure_socket_boringssl.cc
+++ b/runtime/bin/secure_socket_boringssl.cc
@@ -1505,6 +1505,10 @@
   SSL_set_mode(ssl_, SSL_MODE_AUTO_RETRY);  // TODO(whesse): Is this right?
   SSL_set_ex_data(ssl_, filter_ssl_index, this);
 
+#if defined(TARGET_OS_FUCHSIA)
+  // Temporary workaround until we isolate the memory leak issue.
+  SSL_set_verify(ssl_, SSL_VERIFY_NONE, NULL);
+#else
   if (is_server_) {
     int certificate_mode =
         request_client_certificate ? SSL_VERIFY_PEER : SSL_VERIFY_NONE;
@@ -1529,6 +1533,7 @@
     CheckStatus(status, "TlsException",
                 "Set hostname for certificate checking");
   }
+#endif  // defined(TARGET_OS_FUCHSIA)
   // Make the connection:
   if (is_server_) {
     status = SSL_accept(ssl_);
@@ -1564,6 +1569,7 @@
   return 1;
 }
 
+
 void SSLFilter::Handshake() {
   // Try and push handshake along.
   int status;
@@ -1605,6 +1611,7 @@
   }
 }
 
+
 void SSLFilter::GetSelectedProtocol(Dart_NativeArguments args) {
   const uint8_t* protocol;
   unsigned length;
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index d1c171b..146badc 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -8,6 +8,8 @@
 import 'dart:collection';
 import 'dart:typed_data';
 
+import 'package:logging/logging.dart';
+
 class _JenkinsSmiHash {
   static int combine(int hash, int value) {
     hash = 0x1fffffff & (hash + value);
@@ -227,6 +229,7 @@
   ObjectVertex._(this._id, this._graph);
 
   bool get isRoot => ROOT == _id;
+  bool get isStack => vmCid == _graph._kStackCid;
 
   bool operator ==(other) => _id == other._id && _graph == other._graph;
   int get hashCode => _id;
@@ -300,6 +303,7 @@
   MergedObjectVertex._(this._id, this._graph);
 
   bool get isRoot => ROOT == _id;
+  bool get isStack => vmCid == _graph._kStackCid;
 
   bool operator ==(other) => _id == other._id && _graph == other._graph;
   int get hashCode => _id;
@@ -497,8 +501,10 @@
   List<ByteData> _chunks;
 
   int _kObjectAlignment;
-  int _N;
-  int _E;
+  int _kStackCid;
+  int _N;  // Objects in the snapshot.
+  int _Nconnected;  // Objects reachable from root.
+  int _E;  // References in the snapshot.
   int _size;
 
   // Indexed by node id, with id 0 representing invalid/uninitialized.
@@ -537,6 +543,8 @@
     var stream = new ReadStream(_chunks);
     stream.readUnsigned();
     _kObjectAlignment = stream.clampedUint32;
+    stream.readUnsigned();
+    _kStackCid = stream.clampedUint32;
 
     var id = ROOT;
     while (stream.pendingBytes > 0) {
@@ -577,7 +585,8 @@
     var succs = new Uint32List(E);
 
     var stream = new ReadStream(_chunks);
-    stream.skipUnsigned(); // addr alignment
+    stream.skipUnsigned(); // kObjectAlignment
+    stream.skipUnsigned(); // kStackCid
 
     var id = 1, edge = 0;
     while (stream.pendingBytes > 0) {
@@ -660,15 +669,40 @@
       }
     }
 
-    assert(dfsNumber == N);
-    for (var i = ROOT; i <= N; i++) {
-      assert(semi[i] != SENTINEL);
-    }
-    assert(parent[ROOT] == SENTINEL);
-    for (var i = ROOT + 1; i <= N; i++) {
-      assert(parent[i] != SENTINEL);
+    if (dfsNumber != N) {
+      // This may happen in filtered snapshots.
+      Logger.root.warning('Heap snapshot contains unreachable nodes.');
     }
 
+    assert(() {
+      for (var i = 1; i <= dfsNumber; i++) {
+        var v = vertex[i];
+        assert(semi[v] != SENTINEL);
+      }
+      assert(parent[1] == SENTINEL);
+      for (var i = 2; i <= dfsNumber; i++) {
+        var v = vertex[i];
+        assert(parent[v] != SENTINEL);
+      }
+      return true;
+    });
+
+    if (dfsNumber != N) {
+      // Remove successors of unconnected nodes
+      for (var i = ROOT + 1; i <= N; i++) {
+        if (parent[i] == SENTINEL) {
+          var startSuccIndex = firstSuccs[i];
+          var limitSuccIndex = firstSuccs[i + 1];
+          for (var succIndex = startSuccIndex;
+               succIndex < limitSuccIndex;
+               succIndex++) {
+            succs[succIndex] = SENTINEL;
+          }
+        }
+      }
+    }
+
+    _Nconnected = dfsNumber;
     _vertex = vertex;
     _semi = semi;
     _parent = parent;
@@ -676,6 +710,7 @@
 
   void _buildPredecessors() {
     var N = _N;
+    var Nconnected = _Nconnected;
     var E = _E;
     var firstSuccs = _firstSuccs;
     var succs = _succs;
@@ -691,7 +726,9 @@
     // Count predecessors of each node.
     for (var succIndex = 0; succIndex < E; succIndex++) {
       var succId = succs[succIndex];
-      numPreds[succId]++;
+      if (succId != SENTINEL) {
+        numPreds[succId]++;
+      }
     }
 
     // Assign indices into predecessors array.
@@ -704,8 +741,10 @@
       firstPreds[i] = thisPredIndex;
       nextPreds[i] = thisPredIndex;
     }
-    assert(predIndex == E);
-    firstPreds[N + 1] = E; // Extra entry for cheap boundary detection.
+    if (N == Nconnected) {
+      assert(predIndex == E);
+    }
+    firstPreds[N + 1] = predIndex; // Extra entry for cheap boundary detection.
 
     // Fill predecessors array.
     for (var i = 1; i <= N; i++) {
@@ -715,8 +754,10 @@
           succIndex < limitSuccIndex;
           succIndex++) {
         var succId = succs[succIndex];
-        var predIndex = nextPreds[succId]++;
-        preds[predIndex] = i;
+        if (succId != SENTINEL) {
+          var predIndex = nextPreds[succId]++;
+          preds[predIndex] = i;
+        }
       }
     }
 
@@ -802,6 +843,7 @@
   // in a Flowgraph."
   void _buildDominators() {
     var N = _N;
+    var Nconnected = _Nconnected;
 
     var vertex = _vertex;
     var semi = _semi;
@@ -825,7 +867,7 @@
     var stackNode = new Uint32List(N + 1);
     var stackState = new Uint8List(N + 1);
 
-    for (var i = N; i > 1; i--) {
+    for (var i = Nconnected; i > 1; i--) {
       var w = vertex[i];
       assert(w != ROOT);
 
@@ -864,7 +906,7 @@
       assert(buckets[i] == null);
     }
     // Lengauer & Tarjan Step 4.
-    for (var i = 2; i <= N; i++) {
+    for (var i = 2; i <= Nconnected; i++) {
       var w = vertex[i];
       if (dom[w] != vertex[semi[w]]) {
         dom[w] = dom[dom[w]];
@@ -876,6 +918,7 @@
 
   void _calculateRetainedSizes() {
     var N = _N;
+    var Nconnected = _Nconnected;
 
     var size = 0;
     var shallowSizes = _shallowSizes;
@@ -883,8 +926,9 @@
     var doms = _doms;
 
     // Sum shallow sizes.
-    for (var i = ROOT; i < N; i++) {
-      size += shallowSizes[i];
+    for (var i = 1; i <= Nconnected; i++) {
+      var v = vertex[i];
+      size += shallowSizes[v];
     }
 
     // Start with retained size as shallow size.
@@ -892,12 +936,14 @@
 
     // In post order (bottom up), add retained size to dominator's retained
     // size, skipping root.
-    for (var i = N; i > 1; i--) {
+    for (var i = Nconnected; i > 1; i--) {
       var v = vertex[i];
       assert(v != ROOT);
-      retainedSizes[doms[i]] += retainedSizes[i];
+      retainedSizes[doms[v]] += retainedSizes[v];
     }
 
+    assert(retainedSizes[ROOT] == size);  // Root retains everything.
+
     _retainedSizes = retainedSizes;
     _size = size;
   }
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index 7389daa..830e1a0 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -17,6 +17,7 @@
 import 'package:observatory/src/elements/helpers/nav_menu.dart';
 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
 import 'package:observatory/src/elements/helpers/tag.dart';
+import 'package:observatory/src/elements/helpers/uris.dart';
 import 'package:observatory/src/elements/nav/isolate_menu.dart';
 import 'package:observatory/src/elements/nav/notify.dart';
 import 'package:observatory/src/elements/nav/refresh.dart';
@@ -51,6 +52,7 @@
   M.HeapSnapshot _snapshot;
   Stream<M.HeapSnapshotLoadingProgressEvent> _progressStream;
   M.HeapSnapshotLoadingProgress _progress;
+  M.HeapSnapshotRoots _roots = M.HeapSnapshotRoots.user;
   HeapSnapshotTreeMode _mode = HeapSnapshotTreeMode.dominatorTree;
 
   M.IsolateRef get isolate => _isolate;
@@ -138,7 +140,9 @@
 
   Future _refresh() async {
     _progress = null;
-    _progressStream = _snapshots.get(isolate);
+    _progressStream = _snapshots.get(isolate,
+                                     roots: _roots,
+                                     gc: true);
     _r.dirty();
     _progressStream.listen((e) {
       _progress = e.progress;
@@ -233,6 +237,16 @@
                 ..children = [
                   new DivElement()
                     ..classes = ['memberName']
+                    ..text = 'Roots ',
+                  new DivElement()
+                    ..classes = ['memberName']
+                    ..children = _createRootsSelect()
+                ],
+              new DivElement()
+                ..classes = ['memberItem']
+                ..children = [
+                  new DivElement()
+                    ..classes = ['memberName']
                     ..text = 'Analysis ',
                   new DivElement()
                     ..classes = ['memberName']
@@ -396,11 +410,20 @@
       ..classes = ['name']
       ..text = 'Loading...';
     element.children[4] = wrapper;
-    node.object.then((object) {
+    if (node.isStack) {
       wrapper
         ..text = ''
-        ..children = [anyRef(_isolate, object, _instances, queue: _r.queue)];
-    });
+        ..children = [
+          new AnchorElement(href: Uris.debugger(isolate))
+            ..text = 'stack frames'
+        ];
+    } else {
+      node.object.then((object) {
+        wrapper
+          ..text = ''
+          ..children = [anyRef(_isolate, object, _instances, queue: _r.queue)];
+      });
+    }
   }
 
   void _updateMergedDominator(
@@ -418,14 +441,23 @@
       ..classes = ['name']
       ..text = 'Loading...';
     element.children[4] = wrapper;
-    node.klass.then((klass) {
+    if (node.isStack) {
       wrapper
         ..text = ''
         ..children = [
-          new SpanElement()..text = '${node.instanceCount} instances of ',
-          anyRef(_isolate, klass, _instances, queue: _r.queue)
+          new AnchorElement(href: Uris.debugger(isolate))
+            ..text = 'stack frames'
         ];
-    });
+    } else {
+      node.klass.then((klass) {
+        wrapper
+          ..text = ''
+          ..children = [
+            new SpanElement()..text = '${node.instanceCount} instances of ',
+            anyRef(_isolate, klass, _instances, queue: _r.queue)
+          ];
+      });
+    }
   }
 
   void _updateGroup(HtmlElement element, item, int depth) {
@@ -487,6 +519,34 @@
     }
   }
 
+  static String rootsToString(M.HeapSnapshotRoots roots) {
+    switch (roots) {
+      case M.HeapSnapshotRoots.user:
+        return 'User';
+      case M.HeapSnapshotRoots.vm:
+        return 'VM';
+    }
+    throw new Exception('Unknown HeapSnapshotRoots');
+  }
+
+  List<Element> _createRootsSelect() {
+    var s;
+    return [
+      s = new SelectElement()
+        ..classes = ['roots-select']
+        ..value = rootsToString(_roots)
+        ..children = M.HeapSnapshotRoots.values.map((roots) {
+          return new OptionElement(
+              value: rootsToString(roots),
+              selected: _roots == roots)..text = rootsToString(roots);
+        }).toList(growable: false)
+        ..onChange.listen((_) {
+          _roots = M.HeapSnapshotRoots.values[s.selectedIndex];
+          _refresh();
+        })
+    ];
+  }
+
   static String modeToString(HeapSnapshotTreeMode mode) {
     switch (mode) {
       case HeapSnapshotTreeMode.dominatorTree:
@@ -496,7 +556,7 @@
       case HeapSnapshotTreeMode.groupByClass:
         return 'Group by class';
     }
-    throw new Exception('Unknown ProfileTreeMode');
+    throw new Exception('Unknown HeapSnapshotTreeMode');
   }
 
   List<Element> _createModeSelect() {
diff --git a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
index 2d7abcd..5f0bd3e 100644
--- a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart
@@ -124,6 +124,8 @@
   final S.Isolate isolate;
   S.HeapObject _preloaded;
 
+  bool get isStack => v.isStack;
+
   Future<S.HeapObject> get object {
     if (_preloaded != null) {
       return new Future.value(_preloaded);
@@ -159,6 +161,8 @@
   final MergedObjectVertex v;
   final S.Isolate isolate;
 
+  bool get isStack => v.isStack;
+
   Future<S.HeapObject> get klass {
     return new Future.value(isolate.getClassByCid(v.vmCid));
   }
diff --git a/runtime/observatory/lib/src/models/objects/heap_snapshot.dart b/runtime/observatory/lib/src/models/objects/heap_snapshot.dart
index ff4cefe..aae5493 100644
--- a/runtime/observatory/lib/src/models/objects/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/models/objects/heap_snapshot.dart
@@ -4,6 +4,8 @@
 
 part of models;
 
+enum HeapSnapshotRoots { user, vm }
+
 abstract class HeapSnapshot {
   DateTime get timestamp;
   int get objects;
@@ -17,6 +19,7 @@
 abstract class HeapSnapshotDominatorNode {
   int get shallowSize;
   int get retainedSize;
+  bool get isStack;
   Future<ObjectRef> get object;
   Iterable<HeapSnapshotDominatorNode> get children;
 }
@@ -25,6 +28,7 @@
   int get instanceCount;
   int get shallowSize;
   int get retainedSize;
+  bool get isStack;
   Future<ObjectRef> get klass;
   Iterable<HeapSnapshotMergedDominatorNode> get children;
 }
diff --git a/runtime/observatory/lib/src/models/repositories/heap_snapshot.dart b/runtime/observatory/lib/src/models/repositories/heap_snapshot.dart
index da71fe9..9e87e64 100644
--- a/runtime/observatory/lib/src/models/repositories/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/models/repositories/heap_snapshot.dart
@@ -30,6 +30,8 @@
 }
 
 abstract class HeapSnapshotRepository {
-  Stream<HeapSnapshotLoadingProgressEvent> get(IsolateRef isolate,
-      {bool gc: false});
+  Stream<HeapSnapshotLoadingProgressEvent> get(
+      IsolateRef isolate,
+      {HeapSnapshotRoots roots: HeapSnapshotRoots.vm,
+      bool gc: false});
 }
diff --git a/runtime/observatory/lib/src/repositories/heap_snapshot.dart b/runtime/observatory/lib/src/repositories/heap_snapshot.dart
index e56b352..a4f90b3 100644
--- a/runtime/observatory/lib/src/repositories/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/repositories/heap_snapshot.dart
@@ -16,6 +16,7 @@
   Stream<HeapSnapshotLoadingProgressEvent> get onProgress => _onProgress.stream;
 
   final S.Isolate isolate;
+  final M.HeapSnapshotRoots roots;
   final bool gc;
 
   M.HeapSnapshotLoadingStatus _status = M.HeapSnapshotLoadingStatus.fetching;
@@ -32,7 +33,7 @@
   Duration get loadingTime => _loadingTime.elapsed;
   HeapSnapshot get snapshot => _snapshot;
 
-  HeapSnapshotLoadingProgress(this.isolate, this.gc) {
+  HeapSnapshotLoadingProgress(this.isolate, this.roots, this.gc) {
     _run();
   }
 
@@ -44,7 +45,7 @@
 
       await isolate.getClassRefs();
 
-      final stream = isolate.fetchHeapSnapshot(gc);
+      final stream = isolate.fetchHeapSnapshot(roots, gc);
 
       stream.listen((status) {
         if (status is List) {
@@ -99,11 +100,13 @@
 }
 
 class HeapSnapshotRepository implements M.HeapSnapshotRepository {
-  Stream<HeapSnapshotLoadingProgressEvent> get(M.IsolateRef i,
-      {bool gc: false}) {
+  Stream<HeapSnapshotLoadingProgressEvent> get(
+      M.IsolateRef i,
+      {M.HeapSnapshotRoots roots: M.HeapSnapshotRoots.vm,
+      bool gc: false}) {
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
     assert(gc != null);
-    return new HeapSnapshotLoadingProgress(isolate, gc).onProgress;
+    return new HeapSnapshotLoadingProgress(isolate, roots, gc).onProgress;
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/top_retaining_instances.dart b/runtime/observatory/lib/src/repositories/top_retaining_instances.dart
index 0094762..400ac14 100644
--- a/runtime/observatory/lib/src/repositories/top_retaining_instances.dart
+++ b/runtime/observatory/lib/src/repositories/top_retaining_instances.dart
@@ -11,7 +11,8 @@
     S.Class cls = c as S.Class;
     assert(isolate != null);
     assert(cls != null);
-    final raw = await isolate.fetchHeapSnapshot(true).last;
+    final raw =
+        await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.vm, true).last;
     final snapshot = new HeapSnapshot();
     await snapshot.loadProgress(isolate, raw).last;
     return (await Future.wait(
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index c638dd9..c3ea07da 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -1531,12 +1531,21 @@
     }
   }
 
-  Stream fetchHeapSnapshot(collectGarbage) {
+  static String _rootsToString(M.HeapSnapshotRoots roots) {
+    switch (roots) {
+      case M.HeapSnapshotRoots.user: return "User";
+      case M.HeapSnapshotRoots.vm: return "VM";
+    }
+    return null;
+  }
+
+  Stream fetchHeapSnapshot(M.HeapSnapshotRoots roots, bool collectGarbage) {
     if (_snapshotFetch == null || _snapshotFetch.isClosed) {
       _snapshotFetch = new StreamController.broadcast();
       // isolate.vm.streamListen('_Graph');
-      isolate.invokeRpcNoUpgrade(
-          '_requestHeapSnapshot', {'collectGarbage': collectGarbage});
+      isolate.invokeRpcNoUpgrade('_requestHeapSnapshot',
+                                 {'roots': _rootsToString(roots),
+                                  'collectGarbage': collectGarbage});
     }
     return _snapshotFetch.stream;
   }
diff --git a/runtime/observatory/tests/observatory_ui/observatory_ui.status b/runtime/observatory/tests/observatory_ui/observatory_ui.status
index a5665d5..0aa7e3f 100644
--- a/runtime/observatory/tests/observatory_ui/observatory_ui.status
+++ b/runtime/observatory/tests/observatory_ui/observatory_ui.status
@@ -9,12 +9,15 @@
 isolate/*: Skip
 allocation_profile: Skip
 vm_connect/element_test: Skip # See issue 27714
+heap_snapshot/element_test: RuntimeError # Issue 27925
 
 [ $runtime == ff || $runtime == safari ]
 allocation_profile: Skip
 cpu_profile_table: Skip
 persistent_handles_page: Skip
 vm_connect/element_test: Skip # See issue 27714
+heap_snapshot/element_test: RuntimeError # Issue 27925
 
 [ $runtime == ff || $runtime == chrome ]
 vm_connect/element_test: Skip # Times out
+heap_snapshot/element_test: RuntimeError # Issue 27925
diff --git a/runtime/observatory/tests/service/dominator_tree_test.dart b/runtime/observatory/tests/service/dominator_tree_user_test.dart
similarity index 94%
copy from runtime/observatory/tests/service/dominator_tree_test.dart
copy to runtime/observatory/tests/service/dominator_tree_user_test.dart
index 037fbeb..c312dd0 100644
--- a/runtime/observatory/tests/service/dominator_tree_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_user_test.dart
@@ -4,6 +4,7 @@
 // VMOptions=--error_on_bad_type --error_on_bad_override
 
 import 'package:observatory/heap_snapshot.dart';
+import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
@@ -58,7 +59,8 @@
 var tests = [
 (Isolate isolate) async {
   final rootLib = await isolate.rootLibrary.load();
-  final raw = await isolate.fetchHeapSnapshot(false).last;
+  final raw =
+      await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.user, false).last;
   final snapshot = new HeapSnapshot();
   await snapshot.loadProgress(isolate, raw).last;
 
diff --git a/runtime/observatory/tests/service/dominator_tree_test.dart b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
similarity index 94%
rename from runtime/observatory/tests/service/dominator_tree_test.dart
rename to runtime/observatory/tests/service/dominator_tree_vm_test.dart
index 037fbeb..ceee90a 100644
--- a/runtime/observatory/tests/service/dominator_tree_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
@@ -4,6 +4,7 @@
 // VMOptions=--error_on_bad_type --error_on_bad_override
 
 import 'package:observatory/heap_snapshot.dart';
+import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
@@ -58,7 +59,8 @@
 var tests = [
 (Isolate isolate) async {
   final rootLib = await isolate.rootLibrary.load();
-  final raw = await isolate.fetchHeapSnapshot(false).last;
+  final raw =
+      await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.vm, false).last;
   final snapshot = new HeapSnapshot();
   await snapshot.loadProgress(isolate, raw).last;
 
diff --git a/runtime/observatory/tests/service/object_graph_stack_reference_test.dart b/runtime/observatory/tests/service/object_graph_stack_reference_test.dart
new file mode 100644
index 0000000..9fc88ce
--- /dev/null
+++ b/runtime/observatory/tests/service/object_graph_stack_reference_test.dart
@@ -0,0 +1,60 @@
+// 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=--error_on_bad_type --error_on_bad_override
+
+import 'dart:developer';
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+import 'package:observatory/heap_snapshot.dart';
+import 'package:observatory/models.dart' as M;
+import 'package:observatory/object_graph.dart';
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+
+int arrayLength = 1024 * 1024;
+int minArraySize = arrayLength * 4;
+
+void script() {
+  var stackSlot = new List(arrayLength);
+  debugger();
+  print(stackSlot);  // Prevent optimizing away the stack slot.
+}
+
+checkForStackReferent(Isolate isolate) async {
+  Library corelib =
+      isolate.libraries.singleWhere((lib) => lib.uri == 'dart:core');
+  await corelib.load();
+  Class _List =
+      corelib.classes.singleWhere((cls) => cls.vmName.startsWith('_List'));
+  int kArrayCid = _List.vmCid;
+
+  RawHeapSnapshot raw =
+      await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.user, false).last;
+  HeapSnapshot snapshot = new HeapSnapshot();
+  await snapshot.loadProgress(isolate, raw).last;
+  ObjectGraph graph = snapshot.graph;
+
+  var root = graph.root;
+  var stack = graph.root.dominatorTreeChildren()
+      .singleWhere((child) => child.isStack);
+  expect(stack.retainedSize, greaterThanOrEqualTo(minArraySize));
+
+  bool foundBigArray = false;
+  for (var stackReferent in stack.dominatorTreeChildren()) {
+    if (stackReferent.vmCid == kArrayCid &&
+        stackReferent.shallowSize >= minArraySize) {
+      foundBigArray = true;
+    }
+  }
+}
+
+var tests = [
+  hasStoppedAtBreakpoint,
+  checkForStackReferent,
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: script);
diff --git a/runtime/observatory/tests/service/graph_test.dart b/runtime/observatory/tests/service/object_graph_user_test.dart
similarity index 95%
copy from runtime/observatory/tests/service/graph_test.dart
copy to runtime/observatory/tests/service/object_graph_user_test.dart
index 85556ba..c51976a 100644
--- a/runtime/observatory/tests/service/graph_test.dart
+++ b/runtime/observatory/tests/service/object_graph_user_test.dart
@@ -4,6 +4,7 @@
 // VMOptions=--error_on_bad_type --error_on_bad_override
 
 import 'package:observatory/heap_snapshot.dart';
+import 'package:observatory/models.dart' as M;
 import 'package:observatory/object_graph.dart';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
@@ -43,7 +44,8 @@
   Class fooClass = lib.classes.first;
   fooId = fooClass.vmCid;
 
-  RawHeapSnapshot raw = await isolate.fetchHeapSnapshot(false).last;
+  RawHeapSnapshot raw =
+      await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.user, false).last;
   HeapSnapshot snapshot = new HeapSnapshot();
   await snapshot.loadProgress(isolate, raw).last;
   ObjectGraph graph = snapshot.graph;
diff --git a/runtime/observatory/tests/service/graph_test.dart b/runtime/observatory/tests/service/object_graph_vm_test.dart
similarity index 95%
rename from runtime/observatory/tests/service/graph_test.dart
rename to runtime/observatory/tests/service/object_graph_vm_test.dart
index 85556ba..eae1679 100644
--- a/runtime/observatory/tests/service/graph_test.dart
+++ b/runtime/observatory/tests/service/object_graph_vm_test.dart
@@ -4,6 +4,7 @@
 // VMOptions=--error_on_bad_type --error_on_bad_override
 
 import 'package:observatory/heap_snapshot.dart';
+import 'package:observatory/models.dart' as M;
 import 'package:observatory/object_graph.dart';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
@@ -43,7 +44,8 @@
   Class fooClass = lib.classes.first;
   fooId = fooClass.vmCid;
 
-  RawHeapSnapshot raw = await isolate.fetchHeapSnapshot(false).last;
+  RawHeapSnapshot raw =
+      await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.vm, false).last;
   HeapSnapshot snapshot = new HeapSnapshot();
   await snapshot.loadProgress(isolate, raw).last;
   ObjectGraph graph = snapshot.graph;
diff --git a/runtime/tests/vm/dart/hello_fuchsia_test.dart b/runtime/tests/vm/dart/hello_fuchsia_test.dart
index e2ac092..35f2cef3 100644
--- a/runtime/tests/vm/dart/hello_fuchsia_test.dart
+++ b/runtime/tests/vm/dart/hello_fuchsia_test.dart
@@ -397,19 +397,17 @@
   await testSimpleReadWriteClose();
   print("testSimpleReadWriteClose done");
 
-  // TODO(US-81): Enable.
-  // print("testSimpleReadWriteShutdown");
-  // await testSimpleReadWriteShutdown(dropReads: false);
-  // print("testSimpleReadWriteShutdown done");
+  print("testSimpleReadWriteShutdown");
+  await testSimpleReadWriteShutdown(dropReads: false);
+  print("testSimpleReadWriteShutdown done");
 
   print("testGoogleHttp");
   await testGoogleHttp(null, 'pass');
   print("testGoogleHttp done");
 
-  // TODO(US-96)
-  // print("testGoogleHttps");
-  // await testGoogleHttps(null, 'pass');
-  // print("testGoogleHttps done");
+  print("testGoogleHttps");
+  await testGoogleHttps(null, 'pass');
+  print("testGoogleHttps done");
 
   print("Goodbyte, Fuchsia!");
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 5e08876..e4cbfaf 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -1792,6 +1792,13 @@
 }
 
 
+void Isolate::IterateStackPointers(ObjectPointerVisitor* visitor,
+                                   bool validate_frames) {
+  HeapIterationScope heap_iteration_scope;
+  VisitStackPointers(visitor, validate_frames);
+}
+
+
 void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor,
                                   bool validate_frames) {
   ASSERT(visitor != NULL);
@@ -1863,6 +1870,12 @@
     deopt_context()->VisitObjectPointers(visitor);
   }
 
+  VisitStackPointers(visitor, validate_frames);
+}
+
+
+void Isolate::VisitStackPointers(ObjectPointerVisitor* visitor,
+                                 bool validate_frames) {
   // Visit objects in all threads (e.g., Dart stack, handles in zones).
   thread_registry()->VisitObjectPointers(visitor, validate_frames);
 }
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 625be62..9fa4361 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -161,6 +161,8 @@
   // Visit all object pointers.
   void IterateObjectPointers(ObjectPointerVisitor* visitor,
                              bool validate_frames);
+  void IterateStackPointers(ObjectPointerVisitor* visitor,
+                            bool validate_frames);
 
   // Visits weak object pointers.
   void VisitWeakPersistentHandles(HandleVisitor* visitor);
@@ -667,6 +669,7 @@
   // Visit all object pointers. Caller must ensure concurrent sweeper is not
   // running, and the visitor must not allocate.
   void VisitObjectPointers(ObjectPointerVisitor* visitor, bool validate_frames);
+  void VisitStackPointers(ObjectPointerVisitor* visitor, bool validate_frames);
 
   void set_user_tag(uword tag) { user_tag_ = tag; }
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 428dfa3..ac586d9 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -11008,8 +11008,8 @@
       Exceptions::PropagateError(Error::Cast(obj));
     }
   } else {
-    // Another load request is in flight.
-    ASSERT(deferred_lib.LoadRequested());
+    // Another load request is in flight or previously failed.
+    ASSERT(deferred_lib.LoadRequested() || deferred_lib.LoadFailed());
   }
   return false;  // Load request not yet completed.
 }
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index c80c80c..2352bd88 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -8,6 +8,7 @@
 #include "vm/growable_array.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
 #include "vm/raw_object.h"
 #include "vm/reusable_handles.h"
 #include "vm/visitor.h"
@@ -487,8 +488,13 @@
 
 class WritePointerVisitor : public ObjectPointerVisitor {
  public:
-  WritePointerVisitor(Isolate* isolate, WriteStream* stream)
-      : ObjectPointerVisitor(isolate), stream_(stream), count_(0) {}
+  WritePointerVisitor(Isolate* isolate,
+                      WriteStream* stream,
+                      bool only_instances)
+      : ObjectPointerVisitor(isolate),
+        stream_(stream),
+        only_instances_(only_instances),
+        count_(0) {}
   virtual void VisitPointers(RawObject** first, RawObject** last) {
     for (RawObject** current = first; current <= last; ++current) {
       RawObject* object = *current;
@@ -498,6 +504,9 @@
         // we'll need to encode which fields were omitted here.
         continue;
       }
+      if (only_instances_ && (object->GetClassId() < kInstanceCid)) {
+        continue;
+      }
       WritePtr(object, stream_);
       ++count_;
     }
@@ -507,6 +516,7 @@
 
  private:
   WriteStream* stream_;
+  bool only_instances_;
   intptr_t count_;
 };
 
@@ -524,8 +534,13 @@
 
 class WriteGraphVisitor : public ObjectGraph::Visitor {
  public:
-  WriteGraphVisitor(Isolate* isolate, WriteStream* stream)
-      : stream_(stream), ptr_writer_(isolate, stream), count_(0) {}
+  WriteGraphVisitor(Isolate* isolate,
+                    WriteStream* stream,
+                    ObjectGraph::SnapshotRoots roots)
+      : stream_(stream),
+        ptr_writer_(isolate, stream, roots == ObjectGraph::kUser),
+        roots_(roots),
+        count_(0) {}
 
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
     RawObject* raw_obj = it->Get();
@@ -533,11 +548,13 @@
     REUSABLE_OBJECT_HANDLESCOPE(thread);
     Object& obj = thread->ObjectHandle();
     obj = raw_obj;
-    // Each object is a header + a zero-terminated list of its neighbors.
-    WriteHeader(raw_obj, raw_obj->Size(), obj.GetClassId(), stream_);
-    raw_obj->VisitPointers(&ptr_writer_);
-    stream_->WriteUnsigned(0);
-    ++count_;
+    if ((roots_ == ObjectGraph::kVM) || obj.IsField() || obj.IsInstance()) {
+      // Each object is a header + a zero-terminated list of its neighbors.
+      WriteHeader(raw_obj, raw_obj->Size(), obj.GetClassId(), stream_);
+      raw_obj->VisitPointers(&ptr_writer_);
+      stream_->WriteUnsigned(0);
+      ++count_;
+    }
     return kProceed;
   }
 
@@ -546,29 +563,98 @@
  private:
   WriteStream* stream_;
   WritePointerVisitor ptr_writer_;
+  ObjectGraph::SnapshotRoots roots_;
   intptr_t count_;
 };
 
 
-intptr_t ObjectGraph::Serialize(WriteStream* stream, bool collect_garbage) {
+static void IterateUserFields(ObjectPointerVisitor* visitor) {
+  Thread* thread = Thread::Current();
+  // Scope to prevent handles create here from appearing as stack references.
+  HANDLESCOPE(thread);
+  Zone* zone = thread->zone();
+  const GrowableObjectArray& libraries = GrowableObjectArray::Handle(
+      zone, thread->isolate()->object_store()->libraries());
+  Library& library = Library::Handle(zone);
+  Object& entry = Object::Handle(zone);
+  Class& cls = Class::Handle(zone);
+  Array& fields = Array::Handle(zone);
+  Field& field = Field::Handle(zone);
+  for (intptr_t i = 0; i < libraries.Length(); i++) {
+    library ^= libraries.At(i);
+    DictionaryIterator entries(library);
+    while (entries.HasNext()) {
+      entry = entries.GetNext();
+      if (entry.IsClass()) {
+        cls ^= entry.raw();
+        fields = cls.fields();
+        for (intptr_t j = 0; j < fields.Length(); j++) {
+          field ^= fields.At(j);
+          RawObject* ptr = field.raw();
+          visitor->VisitPointer(&ptr);
+        }
+      } else if (entry.IsField()) {
+        field ^= entry.raw();
+        RawObject* ptr = field.raw();
+        visitor->VisitPointer(&ptr);
+      }
+    }
+  }
+}
+
+
+intptr_t ObjectGraph::Serialize(WriteStream* stream,
+                                SnapshotRoots roots,
+                                bool collect_garbage) {
   if (collect_garbage) {
     isolate()->heap()->CollectAllGarbage();
   }
   // Current encoding assumes objects do not move, so promote everything to old.
   isolate()->heap()->new_space()->Evacuate();
 
-  WriteGraphVisitor visitor(isolate(), stream);
+  RawObject* kRootAddress = reinterpret_cast<RawObject*>(kHeapObjectTag);
+  const intptr_t kRootCid = kIllegalCid;
+  RawObject* kStackAddress =
+      reinterpret_cast<RawObject*>(kObjectAlignment + kHeapObjectTag);
+
   stream->WriteUnsigned(kObjectAlignment);
-  stream->WriteUnsigned(0);
-  stream->WriteUnsigned(0);
-  stream->WriteUnsigned(0);
-  {
-    WritePointerVisitor ptr_writer(isolate(), stream);
+  stream->WriteUnsigned(kStackCid);
+
+  if (roots == kVM) {
+    // Write root "object".
+    WriteHeader(kRootAddress, 0, kRootCid, stream);
+    WritePointerVisitor ptr_writer(isolate(), stream, false);
     isolate()->IterateObjectPointers(&ptr_writer, false);
+    stream->WriteUnsigned(0);
+  } else {
+    {
+      // Write root "object".
+      WriteHeader(kRootAddress, 0, kRootCid, stream);
+      WritePointerVisitor ptr_writer(isolate(), stream, false);
+      IterateUserFields(&ptr_writer);
+      WritePtr(kStackAddress, stream);
+      stream->WriteUnsigned(0);
+    }
+
+    {
+      // Write stack "object".
+      WriteHeader(kStackAddress, 0, kStackCid, stream);
+      WritePointerVisitor ptr_writer(isolate(), stream, true);
+      isolate()->IterateStackPointers(&ptr_writer, false);
+      stream->WriteUnsigned(0);
+    }
   }
-  stream->WriteUnsigned(0);
+
+  WriteGraphVisitor visitor(isolate(), stream, roots);
   IterateObjects(&visitor);
-  return visitor.count() + 1;  // + root
+
+  intptr_t object_count = visitor.count();
+  if (roots == kVM) {
+    object_count += 1;  // root
+  } else {
+    object_count += 2;  // root and stack
+  }
+  return object_count;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index cae668a..8060fba 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -6,11 +6,14 @@
 #define RUNTIME_VM_OBJECT_GRAPH_H_
 
 #include "vm/allocation.h"
-#include "vm/object.h"
 
 namespace dart {
 
+class Array;
 class Isolate;
+class Object;
+class RawObject;
+class WriteStream;
 
 // Utility to traverse the object graph in an ordered fashion.
 // Example uses:
@@ -93,12 +96,16 @@
   // be live due to references from the stack or embedder handles.
   intptr_t InboundReferences(Object* obj, const Array& references);
 
+  enum SnapshotRoots { kVM, kUser };
+
   // Write the isolate's object graph to 'stream'. Smis and nulls are omitted.
   // Returns the number of nodes in the stream, including the root.
   // If collect_garabage is false, the graph will include weakly-reachable
   // objects.
   // TODO(koda): Document format; support streaming/chunking.
-  intptr_t Serialize(WriteStream* stream, bool collect_garbage);
+  intptr_t Serialize(WriteStream* stream,
+                     SnapshotRoots roots,
+                     bool collect_garbage);
 
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGraph);
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 6c13dde..1e3fc48 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -10,7 +10,6 @@
 #include <errno.h>
 #include <magenta/syscalls.h>
 #include <magenta/types.h>
-#include <sys/time.h>
 
 #include "platform/assert.h"
 #include "vm/zone.h"
@@ -78,12 +77,7 @@
 
 
 int64_t OS::GetCurrentTimeMicros() {
-  struct timeval tv;
-  if (gettimeofday(&tv, NULL) < 0) {
-    UNREACHABLE();
-    return 0;
-  }
-  return (static_cast<int64_t>(tv.tv_sec) * 1000000) + tv.tv_usec;
+  return mx_time_get(MX_CLOCK_UTC) / kNanosecondsPerMicrosecond;
 }
 
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 9097b1d..253c304 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -150,6 +150,10 @@
   // Illegal class id.
   kIllegalCid = 0,
 
+  // A sentinel used by the vm service's heap snapshots to represent references
+  // from the stack.
+  kStackCid = 1,
+
   // The following entries describes classes for pseudo-objects in the heap
   // that should never be reachable from live objects. Free list elements
   // maintain the free list for old space, and forwarding corpses are used to
@@ -179,7 +183,7 @@
       kByteBufferCid,
 
   // The following entries do not describe a predefined class, but instead
-  // are class indexes for pre-allocated instance (Null, dynamic and Void).
+  // are class indexes for pre-allocated instances (Null, dynamic and Void).
   kNullCid,
   kDynamicCid,
   kVoidCid,
@@ -618,6 +622,7 @@
   friend class StackFrame;              // GetCodeObject assertion.
   friend class CodeLookupTableBuilder;  // profiler
   friend class NativeEntry;             // GetClassId
+  friend class WritePointerVisitor;     // GetClassId
   friend class Simulator;
   friend class SimulatorHelpers;
   friend class ObjectLocator;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 5e34b4a..259b2c0 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -3244,17 +3244,33 @@
 }
 
 
+static const char* snapshot_roots_names[] = {
+    "User", "VM", NULL,
+};
+
+
+static ObjectGraph::SnapshotRoots snapshot_roots_values[] = {
+    ObjectGraph::kUser, ObjectGraph::kVM,
+};
+
+
 static const MethodParameter* request_heap_snapshot_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
+    new EnumParameter("roots", false /* not required */, snapshot_roots_names),
     new BoolParameter("collectGarbage", false /* not required */), NULL,
 };
 
 
 static bool RequestHeapSnapshot(Thread* thread, JSONStream* js) {
+  ObjectGraph::SnapshotRoots roots = ObjectGraph::kVM;
+  const char* roots_arg = js->LookupParam("roots");
+  if (roots_arg != NULL) {
+    roots = EnumMapper(roots_arg, snapshot_roots_names, snapshot_roots_values);
+  }
   const bool collect_garbage =
       BoolParameter::Parse(js->LookupParam("collectGarbage"), true);
   if (Service::graph_stream.enabled()) {
-    Service::SendGraphEvent(thread, collect_garbage);
+    Service::SendGraphEvent(thread, roots, collect_garbage);
   }
   // TODO(koda): Provide some id that ties this request to async response(s).
   JSONObject jsobj(js);
@@ -3263,11 +3279,13 @@
 }
 
 
-void Service::SendGraphEvent(Thread* thread, bool collect_garbage) {
+void Service::SendGraphEvent(Thread* thread,
+                             ObjectGraph::SnapshotRoots roots,
+                             bool collect_garbage) {
   uint8_t* buffer = NULL;
   WriteStream stream(&buffer, &allocator, 1 * MB);
   ObjectGraph graph(thread);
-  intptr_t node_count = graph.Serialize(&stream, collect_garbage);
+  intptr_t node_count = graph.Serialize(&stream, roots, collect_garbage);
 
   // Chrome crashes receiving a single tens-of-megabytes blob, so send the
   // snapshot in megabyte-sized chunks instead.
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index a47fdbe..8ee0c00 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -8,6 +8,7 @@
 #include "include/dart_tools_api.h"
 
 #include "vm/allocation.h"
+#include "vm/object_graph.h"
 #include "vm/object_id_ring.h"
 #include "vm/os_thread.h"
 
@@ -107,7 +108,9 @@
       Dart_GetVMServiceAssetsArchive get_service_assets);
 
   static void SendEchoEvent(Isolate* isolate, const char* text);
-  static void SendGraphEvent(Thread* thread, bool collect_garbage);
+  static void SendGraphEvent(Thread* thread,
+                             ObjectGraph::SnapshotRoots roots,
+                             bool collect_garbage);
   static void SendInspectEvent(Isolate* isolate, const Object& inspectee);
 
   static void SendEmbedderEvent(Isolate* isolate,
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index b621047..a07e414 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -95,7 +95,7 @@
   // helper functions to the raw object interface.
   NoSafepointScope no_safepoint;
   Code code;
-  code = LookupDartCode();
+  code = GetCodeObject();
   if (!code.IsNull()) {
     // Visit the code object.
     RawObject* raw_code = code.raw();
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 7de6fe8..ba7e90e 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -2681,9 +2681,6 @@
 LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # Please triage this failure
 
-[ $compiler == dart2js && $runtime == drt && ($fast_startup != true || $checked != true) ]
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Please triage this failure
-
 [ $compiler == dart2js && $runtime == drt && $fast_startup && $checked ]
 LayoutTests/fast/css-grid-layout/auto-content-resolution-rows_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError # Please triage this failure
@@ -10525,6 +10522,11 @@
 LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
 
+[ $compiler == dart2js && $runtime == ie11 && $builder_tag == win8]
+LibTest/typed_data/ByteData/offsetInBytes_A01_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/serialize-attribute_t01: RuntimeError # Please triage this failure
+
 [ $compiler == dart2js && $cps_ir ]
 Language/Types/Interface_Types/subtype_t09: Crash # Pending static: JSArray
 LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Timeout
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index b7d42e2..6b4334a 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -607,3 +607,7 @@
 Language/Variables/final_t07: MissingCompileTimeError
 LibTest/core/StringBuffer/StringBuffer_A01_t02: RuntimeError
 LibTest/core/StringBuffer/write_A01_t02: RuntimeError
+
+# dartk: precompilation failures (debug)
+[ $compiler == dartkp && $runtime == dart_precompiled && $mode == debug ]
+Language/Libraries_and_Scripts/Scripts/top_level_main_t05: Crash  # !main_obj.IsNull()
diff --git a/tests/compiler/dart2js/assert_message_throw_test.dart b/tests/compiler/dart2js/assert_message_throw_test.dart
new file mode 100644
index 0000000..75a5bb4
--- /dev/null
+++ b/tests/compiler/dart2js/assert_message_throw_test.dart
@@ -0,0 +1,76 @@
+// 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 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/types/masks.dart';
+import 'package:expect/expect.dart';
+import 'memory_compiler.dart';
+import 'type_mask_test_helper.dart';
+
+const String SOURCE = '''
+main(args) {
+  test0();
+  test1(args == null);
+  test2(args == null);
+  test3(args);
+}
+
+// Check that `throw` in the message does is handled conditionally.
+test0() {
+  assert(true, throw "unreachable");
+  var list = [];
+  return list;
+}
+
+// Check that side-effects of the assert message is not included after the
+// assert.
+test1(b) {
+  var a;
+  assert(b, a = 42);
+  return a;
+}
+
+// Check that side-effects of the assert message is included after the assert
+// through the thrown exception.
+test2(b) {
+  var a;
+  try {
+    assert(b, a = 42);
+  } catch (e) {}
+  return a;
+}
+
+// Check that type tests are preserved after the assert.
+test3(a) {
+  assert(a is int);
+  return a;
+}
+''';
+
+main() {
+  asyncTest(() async {
+    CompilationResult result = await runCompiler(
+        entryPoint: Uri.parse('memory:main.dart'),
+        memorySourceFiles: {'main.dart': SOURCE},
+        options: [Flags.enableCheckedMode, Flags.enableAssertMessage]);
+    Compiler compiler = result.compiler;
+
+    void check(String methodName, TypeMask expectedReturnType) {
+      Element element = compiler.mainApp.find(methodName);
+      TypeMask typeMask = simplify(
+          compiler.globalInference.results.resultOf(element).returnType,
+          compiler);
+      Expect.equals(expectedReturnType, typeMask,
+          "Unexpected return type on method '$methodName'.");
+    }
+
+    check('test0', compiler.closedWorld.commonMasks.growableListType);
+    check('test1', compiler.closedWorld.commonMasks.nullType);
+    check('test2', compiler.closedWorld.commonMasks.uint31Type.nullable());
+    check('test3', compiler.closedWorld.commonMasks.intType);
+  });
+}
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index eaa26df..ff3dffa 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -72,15 +72,17 @@
     lego.Element element = compiler.mainApp.find(entry);
     if (element == null) return null;
     compiler.phase = Compiler.PHASE_RESOLVING;
-    compiler.backend.enqueueHelpers(compiler.enqueuer.resolution);
+    compiler.enqueuer.resolution
+        .applyImpact(compiler.backend.computeHelpersImpact());
     compiler.processQueue(compiler.enqueuer.resolution, element);
     compiler.openWorld.closeWorld(compiler.reporter);
     compiler.backend.onResolutionComplete();
-    ResolutionWorkItem resolutionWork = new ResolutionWorkItem(element);
-    resolutionWork.run(compiler, compiler.enqueuer.resolution);
-    CodegenWorkItem work = new CodegenWorkItem(compiler, element);
+    ResolutionWorkItem resolutionWork =
+        new ResolutionWorkItem(compiler.resolution, element);
+    resolutionWork.run();
+    CodegenWorkItem work = new CodegenWorkItem(compiler.backend, element);
     compiler.phase = Compiler.PHASE_COMPILING;
-    work.run(compiler, compiler.enqueuer.codegen);
+    work.run();
     js.JavaScriptBackend backend = compiler.backend;
     String generated = backend.getGeneratedCode(element);
     if (check != null) {
diff --git a/tests/compiler/dart2js/embedded_category_api_boundary_test.dart b/tests/compiler/dart2js/embedded_category_api_boundary_test.dart
index 042bc37..c6e391d 100644
--- a/tests/compiler/dart2js/embedded_category_api_boundary_test.dart
+++ b/tests/compiler/dart2js/embedded_category_api_boundary_test.dart
@@ -23,7 +23,8 @@
     }
   });
   asyncTest(() async {
-    analyze(uriList, {}, checkResults: checkResults, mode: AnalysisMode.MAIN);
+    await analyze(uriList, {},
+        checkResults: checkResults, mode: AnalysisMode.MAIN);
   });
 }
 
@@ -42,6 +43,10 @@
     LibraryInfo info = libraries[element.library.canonicalUri.path];
     bool isAllowedInEmbedded =
         info.isInternal || info.categories.contains(Category.embedded);
+    if (!isAllowedInEmbedded) {
+      print(
+          'Disallowed element: $element from ${element.library.canonicalUri}');
+    }
     return isAllowedInEmbedded;
   });
 }
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index 1ca76fc..8478d42 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -11,7 +11,9 @@
 import 'package:expect/expect.dart';
 
 import 'package:compiler/compiler_new.dart' as api;
+import 'package:compiler/src/common/backend_api.dart';
 import 'package:compiler/src/common/codegen.dart';
+import 'package:compiler/src/common/resolution.dart';
 import 'package:compiler/src/compile_time_constants.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/dart2js.dart' as entry;
@@ -20,8 +22,8 @@
 import 'package:compiler/src/diagnostics/messages.dart';
 import 'package:compiler/src/diagnostics/spannable.dart';
 import 'package:compiler/src/apiimpl.dart' as apiimpl;
-import 'package:compiler/src/enqueue.dart';
 import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/js_backend/js_backend.dart';
 import 'package:compiler/src/library_loader.dart';
 import 'package:compiler/src/null_compiler_output.dart';
 import 'package:compiler/src/options.dart' show CompilerOptions;
@@ -52,9 +54,17 @@
   }
 
   @override
+  Backend createBackend() {
+    return new TestBackend(this);
+  }
+
+  @override
   ScannerTask createScannerTask() => new TestScanner(this);
 
   @override
+  Resolution createResolution() => new TestResolution(this);
+
+  @override
   ResolverTask createResolverTask() {
     return new TestResolver(this, backend.constantCompilerTask);
   }
@@ -74,16 +84,6 @@
     return super.onLibrariesLoaded(loadedLibraries);
   }
 
-  WorldImpact analyzeElement(Element element) {
-    test('Compiler.analyzeElement');
-    return super.analyzeElement(element);
-  }
-
-  WorldImpact codegen(CodegenWorkItem work, Enqueuer world) {
-    test('Compiler.codegen');
-    return super.codegen(work, world);
-  }
-
   test(String marker) {
     if (marker == testMarker) {
       switch (testType) {
@@ -121,6 +121,23 @@
   }
 }
 
+class TestBackend extends JavaScriptBackend {
+  final TestCompiler compiler;
+  TestBackend(TestCompiler compiler)
+      : this.compiler = compiler,
+        super(compiler,
+            generateSourceMap: compiler.options.generateSourceMap,
+            useStartupEmitter: compiler.options.useStartupEmitter,
+            useNewSourceInfo: compiler.options.useNewSourceInfo,
+            useKernel: compiler.options.useKernel);
+
+  @override
+  WorldImpact codegen(CodegenWorkItem work) {
+    compiler.test('Compiler.codegen');
+    return super.codegen(work);
+  }
+}
+
 class TestDiagnosticReporter extends DiagnosticReporterWrapper {
   TestCompiler compiler;
   DiagnosticReporter reporter;
@@ -161,6 +178,20 @@
   }
 }
 
+class TestResolution extends CompilerResolution {
+  TestCompiler compiler;
+
+  TestResolution(TestCompiler compiler)
+      : this.compiler = compiler,
+        super(compiler);
+
+  @override
+  WorldImpact computeWorldImpact(Element element) {
+    compiler.test('Compiler.analyzeElement');
+    return super.computeWorldImpact(element);
+  }
+}
+
 int checkedResults = 0;
 
 Future testExitCode(
diff --git a/tests/compiler/dart2js/kernel/closed_world_test.dart b/tests/compiler/dart2js/kernel/closed_world_test.dart
index aa21341..cf642fa 100644
--- a/tests/compiler/dart2js/kernel/closed_world_test.dart
+++ b/tests/compiler/dart2js/kernel/closed_world_test.dart
@@ -89,7 +89,6 @@
         compiler.enqueuer,
         compiler.options,
         compiler.resolution,
-        compiler.enqueuerFilter,
         const TreeShakingEnqueuerStrategy(),
         compiler.globalDependencies,
         backend,
@@ -101,21 +100,21 @@
     // enqueuing twice.
     backend.typeVariableHandler = new TypeVariableHandler(compiler);
 
-    backend.enqueueHelpers(enqueuer);
+    if (compiler.deferredLoadTask.isProgramSplit) {
+      enqueuer.applyImpact(backend.computeDeferredLoadingImpact());
+    }
+    enqueuer.applyImpact(backend.computeHelpersImpact());
+    enqueuer.applyImpact(enqueuer.nativeEnqueuer
+        .processNativeClasses(compiler.libraryLoader.libraries));
     enqueuer.applyImpact(
-        compiler.impactStrategy,
-        enqueuer.nativeEnqueuer
-            .processNativeClasses(compiler.libraryLoader.libraries));
-    enqueuer.applyImpact(compiler.impactStrategy,
-        backend.computeMainImpact(enqueuer, compiler.mainFunction));
+        backend.computeMainImpact(compiler.mainFunction, forResolution: true));
     enqueuer.forEach((work) {
       AstElement element = work.element;
       ResolutionImpact resolutionImpact = build(compiler, element.resolvedAst);
       WorldImpact worldImpact = compiler.backend.impactTransformer
           .transformResolutionImpact(enqueuer, resolutionImpact);
       enqueuer.registerProcessedElement(element);
-      enqueuer.applyImpact(compiler.impactStrategy, worldImpact,
-          impactSource: element);
+      enqueuer.applyImpact(worldImpact, impactSource: element);
     });
     ClosedWorld closedWorld =
         enqueuer.universe.openWorld.closeWorld(compiler.reporter);
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index f7b34dd..95ee5c3 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -200,7 +200,7 @@
         Expect.equals(patchText, patch.node.toString());
       }
 
-      compiler.analyzeElement(origin);
+      compiler.resolution.computeWorldImpact(origin);
       compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
 
       DiagnosticCollector collector = compiler.diagnosticCollector;
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index f88787b..7be75ef1 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -16,6 +16,8 @@
 import 'package:compiler/src/resolution/resolution_result.dart';
 import 'package:compiler/src/resolution/scope.dart';
 import 'package:compiler/src/resolution/tree_elements.dart';
+import 'package:compiler/src/universe/use.dart';
+import 'package:compiler/src/universe/world_impact.dart';
 
 import 'compiler_helper.dart';
 import 'link_helper.dart';
@@ -241,7 +243,8 @@
     compiler.resolveStatement("Foo foo;");
     ClassElement fooElement = compiler.mainApp.find("Foo");
     FunctionElement funElement = fooElement.lookupLocalMember("foo");
-    compiler.enqueuer.resolution.addToWorkList(funElement);
+    compiler.enqueuer.resolution.applyImpact(new WorldImpactBuilderImpl()
+      ..registerStaticUse(new StaticUse.foreignUse(funElement)));
     compiler.processQueue(compiler.enqueuer.resolution, null);
     DiagnosticCollector collector = compiler.diagnosticCollector;
     Expect.equals(0, collector.warnings.length);
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index 875f276..bde511b 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -8,6 +8,8 @@
 import 'package:compiler/src/js_backend/js_backend.dart';
 import 'package:compiler/src/types/types.dart';
 import 'package:compiler/src/world.dart';
+import 'package:compiler/src/universe/use.dart';
+import 'package:compiler/src/universe/world_impact.dart';
 import 'compiler_helper.dart';
 import 'type_mask_test_helper.dart';
 
@@ -737,21 +739,24 @@
     JavaScriptBackend backend = compiler.backend;
     BackendHelpers helpers = backend.helpers;
     ClosedWorld world = compiler.openWorld.closeWorld(compiler.reporter);
+    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
     helpers.interceptorsLibrary.forEachLocalMember((element) {
       if (element.isClass) {
         element.ensureResolved(compiler.resolution);
-        compiler.enqueuer.resolution.registerInstantiatedType(element.rawType);
+        impactBuilder
+            .registerTypeUse(new TypeUse.instantiation(element.rawType));
       }
     });
     ClassElement patternImplClass = compiler.mainApp.find('PatternImpl');
     patternImplClass.ensureResolved(compiler.resolution);
 
-    compiler.enqueuer.resolution
-        .registerInstantiatedType(compiler.coreTypes.mapType());
-    compiler.enqueuer.resolution
-        .registerInstantiatedType(compiler.coreTypes.functionType);
-    compiler.enqueuer.resolution
-        .registerInstantiatedType(patternImplClass.rawType);
+    impactBuilder.registerTypeUse(
+        new TypeUse.instantiation(compiler.coreTypes.mapType()));
+    impactBuilder.registerTypeUse(
+        new TypeUse.instantiation(compiler.coreTypes.functionType));
+    impactBuilder
+        .registerTypeUse(new TypeUse.instantiation(patternImplClass.rawType));
+    compiler.enqueuer.resolution.applyImpact(impactBuilder);
     compiler.openWorld.closeWorld(compiler.reporter);
 
     // Grab hold of a supertype for String so we can produce potential
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 4f7663f..48cfb52 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -84,7 +84,7 @@
 list_test/none: RuntimeError # Issue 27871
 list_test/01: RuntimeError # Issue 27871
 
-[ $compiler == dart2js && $runtime == drt && $csp && $minimized ]
+[ $compiler == dart2js && $runtime == drt && $csp && $minified ]
 core_runtime_types_test: Pass, Fail # Issue 27913
 
 [ $compiler == dart2js ]
diff --git a/tests/language/language.status b/tests/language/language.status
index 68a294c..c0489a5 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -199,6 +199,7 @@
 tearoff_basic_test: Fail
 regress_22443_test: Fail
 deferred_not_loaded_check_test: Fail
+vm/regress_27201_test: Fail
 
 [ $mode == product || $compiler == dart2appjit || $compiler == dart2app || $compiler == precompiler ]
 # Deferred loading happens eagerly. Issue #27587
@@ -209,10 +210,12 @@
 deferred_load_constants_test/05: Fail
 tearoff_basic_test: Fail
 deferred_not_loaded_check_test: Fail
+vm/regress_27201_test: Fail
 
 [ $compiler == precompiler ]
 # Deferred loading happens eagerly. Issue #27587
 deferred_global_test: Fail
+vm/regress_27201_test: Fail
 
 [ $compiler == precompiler || $compiler == dart2app || $compiler == dart2appjit ]
 ct_const2_test: Skip # Incompatible flag: --compile_all
@@ -300,6 +303,7 @@
 override_field_method2_negative_test: Pass, Crash # Issue 27835
 override_field_method4_negative_test: Pass, Crash # Issue 27835
 override_field_method5_negative_test: Pass, Crash # Issue 27835
+vm/regress_27201_test: Pass, Crash # Requires deferred libraries
 
 [$runtime != vm || $compiler != none]
 assert_initializer_test: SKIP  # not implemented yet, experiment is VM only.
@@ -315,3 +319,6 @@
 
 [$runtime == vm && $compiler == none]
 duplicate_part_test/01: MissingCompileTimeError # Issue 27516
+
+[$compiler == dart2analyzer]
+vm/regress_27201_test: SkipByDesign # Loads bad library, so will always crash.
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 6262b1b..b5cc7b3 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -189,11 +189,7 @@
 getter_closure_execution_order_test: RuntimeError
 getter_setter_in_lib_test: RuntimeError
 inferrer_closure_test: RuntimeError
-initializing_formal_access_test: CompileTimeError
-initializing_formal_capture_test: CompileTimeError
-initializing_formal_final_test: CompileTimeError
-initializing_formal_promotion_test: CompileTimeError
-initializing_formal_type_test: CompileTimeError
+initializing_formal_final_test: RuntimeError
 instance_creation_in_function_annotation_test: RuntimeError
 is_not_class2_test: RuntimeError
 issue13474_test: RuntimeError
@@ -292,7 +288,6 @@
 not_enough_positional_arguments_test/05: MissingRuntimeError
 null_test/none: RuntimeError
 number_identifier_test/05: RuntimeError
-parameter_initializer5_test: CompileTimeError
 positional_parameters_type_test/01: MissingRuntimeError
 positional_parameters_type_test/02: MissingRuntimeError
 prefix10_negative_test: Fail
@@ -526,11 +521,7 @@
 getter_setter_in_lib_test: RuntimeError
 if_null_assignment_static_test/35: Crash
 inferrer_closure_test: RuntimeError
-initializing_formal_access_test: CompileTimeError
-initializing_formal_capture_test: CompileTimeError
-initializing_formal_final_test: CompileTimeError
-initializing_formal_promotion_test: CompileTimeError
-initializing_formal_type_test: CompileTimeError
+initializing_formal_final_test: RuntimeError
 instance_creation_in_function_annotation_test: Crash
 invocation_mirror_invoke_on2_test: Crash
 is_not_class2_test: RuntimeError
@@ -632,7 +623,6 @@
 not_enough_positional_arguments_test/05: MissingRuntimeError
 null_test/none: RuntimeError
 number_identifier_test/05: RuntimeError
-parameter_initializer5_test: CompileTimeError
 positional_parameters_type_test/01: MissingRuntimeError
 positional_parameters_type_test/02: MissingRuntimeError
 prefix10_negative_test: Fail
@@ -677,3 +667,10 @@
 vm/reflect_core_vm_test: CompileTimeError
 vm/type_cast_vm_test: RuntimeError
 vm/type_vm_test: RuntimeError
+
+# dartk: precompilation failures (debug)
+[ $compiler == dartkp && $runtime == dart_precompiled && $mode == debug ]
+constructor_named_arguments_test/01: Crash
+enum_syntax_test/05: Crash
+generic_sends_test: Crash
+not_enough_positional_arguments_test/05: Crash
diff --git a/tests/language/vm/regress_27201_lib.dart b/tests/language/vm/regress_27201_lib.dart
new file mode 100644
index 0000000..4973ee7
--- /dev/null
+++ b/tests/language/vm/regress_27201_lib.dart
@@ -0,0 +1,20 @@
+// 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 import_lib;
+
+final foo = 1;
+var someVar = 3;
+var _privateVar;
+
+int get someGetter => 2;
+
+void set someSetter(int val) {}
+
+int someFunc() => 0;
+
+class SomeClass {
+}
+
+typedef int Func(Object a);
diff --git a/tests/language/vm/regress_27201_test.dart b/tests/language/vm/regress_27201_test.dart
new file mode 100644
index 0000000..251a1ad
--- /dev/null
+++ b/tests/language/vm/regress_27201_test.dart
@@ -0,0 +1,56 @@
+/*
+ * 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:async";
+import "package:expect/expect.dart";
+import "regress_27201_lib.dart" deferred as p;
+import "regress_27201_bad_lib_path.dart" deferred as q;
+
+test_loaded() {
+  try {
+    p.someFunc();
+  } catch (e) {
+    Expect.fail("Should not be here");
+  }
+  try {
+    p.someGetter;
+  } catch (e) {
+    Expect.fail("Should not be here");
+  }
+  try {
+    p.someSetter = 1;
+  } catch (e) {
+    Expect.fail("Should not be here");
+  }
+  try {
+    p.Func;
+  } catch (e) {
+    Expect.fail("Should not be here");
+  }
+  try {
+    Expect.isTrue(p.loadLibrary() is Future);
+  } catch (e) {
+    Expect.fail("Should not be here");
+  }
+}
+
+
+main() {
+  p.loadLibrary().then((v) {
+    test_loaded();
+  },
+  onError: (e) {
+    Expect.fail("Should have loaded library!");
+  });
+
+  // Ensure bad library import is handled correctly.
+  q.loadLibrary().then((v) {
+    Expect.fail("Should have failed");
+  },
+  onError: (e) {
+    Expect.throws(() => q.x);
+  });
+}
+
diff --git a/tools/VERSION b/tools/VERSION
index 4af9fe7..99f11c9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,5 +28,5 @@
 MAJOR 1
 MINOR 21
 PATCH 0
-PRERELEASE 10
+PRERELEASE 11
 PRERELEASE_PATCH 0
diff --git a/tools/bots/dart_sdk.py b/tools/bots/dart_sdk.py
index 66905de..588061a 100644
--- a/tools/bots/dart_sdk.py
+++ b/tools/bots/dart_sdk.py
@@ -56,8 +56,8 @@
   url = 'https://api.dartlang.org/stable'
   with bot.BuildStep('Build API docs by dartdoc'):
     bot_utils.run([dart_exe, dartdoc_dart,
-                  '--sdk-docs','--output', dirname, '--dart-sdk', dart_sdk, 
-                  '--footer' , footer_file, '--rel-canonical-prefix=' + url])
+                  '--sdk-docs','--output', dirname, '--footer' , footer_file,
+                  '--rel-canonical-prefix=' + url])
 
 def CreateUploadVersionFile():
   file_path = os.path.join(bot_utils.DART_DIR,
diff --git a/tools/gn.py b/tools/gn.py
index 91caa19..fd9a1b7 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -77,6 +77,11 @@
   # dart_bootstrap if the prebuilt SDK doesn't work.
   gn_args['dart_host_pub_exe'] = ""
 
+  # We only want the fallback root certs in the standalone VM on
+  # Linux and Windows.
+  if gn_args['target_os'] in ['linux', 'win']:
+    gn_args['dart_use_fallback_root_certificates'] = True
+
   gn_args['dart_zlib_path'] = "//runtime/bin/zlib"
 
   # Use tcmalloc only when targeting Linux and when not using ASAN.
