Version 1.22.0-dev.4.0

Merge commit '76e600aea6018e26e8996e492c531d70c3860ca6' into dev
diff --git a/DEPS b/DEPS
index 896e0d3..882fa0f 100644
--- a/DEPS
+++ b/DEPS
@@ -92,7 +92,7 @@
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "@1.2.4",
   "protobuf_tag": "@0.5.3",
-  "pub_rev": "@9309be93140638fb19903648d07de59681a08989",
+  "pub_rev": "@d7649be15213c43669a40c33af516d8eb210e876",
   "pub_semver_tag": "@1.3.0",
   "quiver_tag": "@0.22.0",
   "resource_rev":"@a49101ba2deb29c728acba6fb86000a8f730f4b1",
diff --git a/docs/language/informal/README.md b/docs/language/informal/README.md
new file mode 100644
index 0000000..5774998
--- /dev/null
+++ b/docs/language/informal/README.md
@@ -0,0 +1,17 @@
+This directory contains "informal specifications".
+
+In order to move faster and get better feedback, we implement and iterate on
+language changes before the full official specification has been written. Still,
+the implementers need *something* to go on.
+
+For that, the language team writes "informal specifications". These are
+intended to be precise enough for a good faith implementer to correctly
+understand the syntax and semantics of the language, but without all of the
+laborious detail of the complete specification.
+
+Once the feature has been implemented, tested, and we are confident in it, the
+language team will write the real text in the language specification and the
+document here becomes deprecated and no longer canonical.
+
+Until then, while the feature is in progress, a live pull request for the
+informal spec is the source of truth for the feature.
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 5ea958e..22a9670 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -18,7 +18,7 @@
 const String defineVariableOption = 'D';
 const String enableInitializingFormalAccessFlag = 'initializing-formal-access';
 const String enableStrictCallChecksFlag = 'enable-strict-call-checks';
-const String enableSuperInMixinFlag = 'supermixin';
+const String enableSuperMixinFlag = 'supermixin';
 const String ignoreUnrecognizedFlagsFlag = 'ignore-unrecognized-flags';
 const String noImplicitCastsFlag = 'no-implicit-casts';
 const String noImplicitDynamicFlag = 'no-implicit-dynamic';
@@ -29,11 +29,33 @@
 const String strongModeFlag = 'strong';
 
 /**
+ * Update [options] with the value of each analysis option command line flag.
+ */
+void applyAnalysisOptionFlags(AnalysisOptionsImpl options, ArgResults args) {
+  if (args.wasParsed(enableStrictCallChecksFlag)) {
+    options.enableStrictCallChecks = args[enableStrictCallChecksFlag];
+  }
+  if (args.wasParsed(enableSuperMixinFlag)) {
+    options.enableSuperMixins = args[enableSuperMixinFlag];
+  }
+  if (args.wasParsed(noImplicitCastsFlag)) {
+    options.implicitCasts = !args[noImplicitCastsFlag];
+  }
+  if (args.wasParsed(noImplicitDynamicFlag)) {
+    options.implicitDynamic = !args[noImplicitDynamicFlag];
+  }
+  if (args.wasParsed(strongModeFlag)) {
+    options.strongMode = args[strongModeFlag];
+  }
+}
+
+/**
  * Use the given [resourceProvider], [contentCache] and command-line [args] to
  * create a context builder.
  */
 ContextBuilderOptions createContextBuilderOptions(ArgResults args) {
   ContextBuilderOptions builderOptions = new ContextBuilderOptions();
+  builderOptions.argResults = args;
   //
   // File locations.
   //
@@ -46,11 +68,7 @@
   // Analysis options.
   //
   AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
-  defaultOptions.enableStrictCallChecks = args[enableStrictCallChecksFlag];
-  defaultOptions.enableSuperMixins = args[enableSuperInMixinFlag];
-  defaultOptions.implicitCasts = !args[noImplicitCastsFlag];
-  defaultOptions.implicitDynamic = !args[noImplicitDynamicFlag];
-  defaultOptions.strongMode = args[strongModeFlag];
+  applyAnalysisOptionFlags(defaultOptions, args);
   builderOptions.defaultOptions = defaultOptions;
   //
   // Declared variables.
@@ -163,7 +181,7 @@
       defaultsTo: false,
       negatable: false,
       hide: hide || ddc);
-  parser.addFlag(enableSuperInMixinFlag,
+  parser.addFlag(enableSuperMixinFlag,
       help: 'Relax restrictions on mixins (DEP 34).',
       defaultsTo: false,
       negatable: false,
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 95b9465..aad53cf 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -12,6 +12,8 @@
 import 'package:analyzer/plugin/resolver_provider.dart';
 import 'package:analyzer/source/analysis_options_provider.dart';
 import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/command_line/arguments.dart'
+    show applyAnalysisOptionFlags;
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/bazel.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -21,6 +23,7 @@
 import 'package:analyzer/src/summary/pub_summary.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/options.dart';
+import 'package:args/args.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/packages_file.dart';
 import 'package:package_config/src/packages_impl.dart';
@@ -349,6 +352,9 @@
       } catch (_) {
         // Ignore exceptions thrown while trying to load the options file.
       }
+      if (builderOptions.argResults != null) {
+        applyAnalysisOptionFlags(options, builderOptions.argResults);
+      }
     }
     return options;
   }
@@ -481,6 +487,12 @@
  */
 class ContextBuilderOptions {
   /**
+   * The results of parsing the command line arguments as defined by
+   * [defineAnalysisArguments] or `null` if none.
+   */
+  ArgResults argResults;
+
+  /**
    * The file path of the file containing the summary of the SDK that should be
    * used to "analyze" the SDK. This option should only be specified by
    * command-line tools such as 'dartanalyzer' or 'ddc'.
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 6995b2a..050d3bc 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -538,7 +538,7 @@
       if (feature == AnalyzerOptions.enableAssertInitializer) {
         options.enableAssertInitializer = boolValue;
       } else if (feature == AnalyzerOptions.enableStrictCallChecks) {
-        options.enableStrictCallChecks = true;
+        options.enableStrictCallChecks = boolValue;
       } else if (feature == AnalyzerOptions.enableSuperMixins) {
         options.enableSuperMixins = boolValue;
       }
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index c2eb6ce..4569f8e 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -6,12 +6,14 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/generated/bazel.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:args/args.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/src/packages_impl.dart';
 import 'package:path/path.dart' as path;
@@ -110,6 +112,33 @@
     fail('Incomplete test');
   }
 
+  void test_cmdline_options_override_options_file() {
+    ArgParser argParser = new ArgParser();
+    defineAnalysisArguments(argParser);
+    ArgResults argResults = argParser.parse(['--$enableStrictCallChecksFlag']);
+    var builder = new ContextBuilder(resourceProvider, sdkManager, contentCache,
+        options: createContextBuilderOptions(argResults));
+
+    AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
+    expected.enableSuperMixins = true;
+    expected.enableStrictCallChecks = true;
+
+    String path = resourceProvider.convertPath('/some/directory/path');
+    String filePath =
+    pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    resourceProvider.newFile(
+        filePath,
+        '''
+analyzer:
+  language:
+    enableSuperMixins : true
+    enableStrictCallChecks : false
+''');
+
+    AnalysisOptions options = builder.getAnalysisOptions(path);
+    _expectEqualOptions(options, expected);
+  }
+
   void test_convertPackagesToMap_noPackages() {
     expect(builder.convertPackagesToMap(Packages.noPackages), isEmpty);
   }
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index fc92457..2861f6b 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -47,7 +47,7 @@
 
   CompilerImpl(this.provider, api.CompilerOutput outputProvider, this.handler,
       CompilerOptions options,
-      {MakeBackendFuncion makeBackend, MakeReporterFunction makeReporter})
+      {MakeBackendFunction makeBackend, MakeReporterFunction makeReporter})
       // NOTE: allocating measurer is done upfront to ensure the wallclock is
       // started before other computations.
       : measurer = new Measurer(enableTaskMeasurements: options.verbose),
diff --git a/pkg/compiler/lib/src/common/backend_api.dart b/pkg/compiler/lib/src/common/backend_api.dart
index e0c396c..639b9a3 100644
--- a/pkg/compiler/lib/src/common/backend_api.dart
+++ b/pkg/compiler/lib/src/common/backend_api.dart
@@ -17,7 +17,13 @@
 import '../constants/values.dart' show ConstantValue;
 import '../dart_types.dart' show DartType, InterfaceType;
 import '../elements/elements.dart'
-    show ClassElement, Element, FunctionElement, MethodElement, LibraryElement;
+    show
+        ClassElement,
+        Element,
+        FunctionElement,
+        MemberElement,
+        MethodElement,
+        LibraryElement;
 import '../elements/entities.dart';
 import '../enqueue.dart' show Enqueuer, EnqueueTask, ResolutionEnqueuer;
 import '../io/code_output.dart' show CodeBuffer;
@@ -151,15 +157,6 @@
   void registerTypeVariableBoundsSubtypeCheck(
       DartType typeArgument, DartType bound) {}
 
-  /// 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. Any backend specific
   /// [WorldImpact] of this is returned.
@@ -175,10 +172,6 @@
   /// specific [WorldImpact] of this is returned.
   WorldImpact registerGetOfStaticFunction() => const WorldImpact();
 
-  /// 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;
 
@@ -189,7 +182,7 @@
   void registerConstSymbol(String name) {}
 
   ClassElement defaultSuperclass(ClassElement element) {
-    return compiler.coreClasses.objectClass;
+    return compiler.commonElements.objectClass;
   }
 
   bool isInterceptorClass(ClassElement element) => false;
@@ -218,7 +211,8 @@
 
   /// Called to register that [element] is statically known to be used. Any
   /// backend specific [WorldImpact] of this is returned.
-  WorldImpact registerUsedElement(Element element, {bool forResolution}) =>
+  WorldImpact registerUsedElement(MemberElement element,
+          {bool forResolution}) =>
       const WorldImpact();
 
   /// This method is called immediately after the [LibraryElement] [library] has
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 2adfe26..9d3c852 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -9,13 +9,12 @@
 import '../compiler.dart' show Compiler;
 import '../constants/expressions.dart' show ConstantExpression;
 import '../constants/values.dart' show ConstantValue;
-import '../core_types.dart' show CoreClasses, CoreTypes, CommonElements;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart' show DartType, Types;
 import '../elements/elements.dart'
     show
         AstElement,
         ClassElement,
-        ConstructorElement,
         Element,
         ExecutableElement,
         FunctionElement,
@@ -127,8 +126,6 @@
 abstract class Resolution implements Frontend {
   ParsingContext get parsingContext;
   DiagnosticReporter get reporter;
-  CoreClasses get coreClasses;
-  CoreTypes get coreTypes;
   CommonElements get commonElements;
   Types get types;
   Target get target;
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index a1d62a2..d99734e 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -13,7 +13,7 @@
 import 'constants/evaluation.dart';
 import 'constants/expressions.dart';
 import 'constants/values.dart';
-import 'core_types.dart' show CoreTypes;
+import 'core_types.dart' show CommonElements;
 import 'dart_types.dart';
 import 'elements/elements.dart';
 import 'elements/modelx.dart' show ConstantVariableMixin;
@@ -159,7 +159,7 @@
 
   DiagnosticReporter get reporter => compiler.reporter;
 
-  CoreTypes get coreTypes => compiler.coreTypes;
+  CommonElements get commonElements => compiler.commonElements;
 
   @override
   @deprecated
@@ -272,7 +272,7 @@
             expression = null;
           }
         } else {
-          DartType constantType = value.getType(coreTypes);
+          DartType constantType = value.getType(commonElements);
           if (!constantSystem.isSubtype(
               compiler.types, constantType, elementType)) {
             if (isConst) {
@@ -407,7 +407,7 @@
 
   ConstantSystem get constantSystem => handler.constantSystem;
   Resolution get resolution => compiler.resolution;
-  CoreTypes get coreTypes => compiler.coreTypes;
+  CommonElements get commonElements => compiler.commonElements;
   DiagnosticReporter get reporter => compiler.reporter;
 
   AstConstant evaluate(Node node) {
@@ -594,7 +594,7 @@
   }
 
   AstConstant visitLiteralSymbol(LiteralSymbol node) {
-    InterfaceType type = coreTypes.symbolType;
+    InterfaceType type = commonElements.symbolType;
     String text = node.slowNameString;
     List<AstConstant> arguments = <AstConstant>[
       new AstConstant(context, node, new StringConstantExpression(text),
@@ -810,10 +810,10 @@
     if (condition == null || condition.isError) {
       return condition;
     } else if (!condition.value.isBool) {
-      DartType conditionType = condition.value.getType(coreTypes);
+      DartType conditionType = condition.value.getType(commonElements);
       if (isEvaluatingConstant) {
         reporter.reportErrorMessage(node.condition, MessageKind.NOT_ASSIGNABLE,
-            {'fromType': conditionType, 'toType': coreTypes.boolType});
+            {'fromType': conditionType, 'toType': commonElements.boolType});
         return new ErroneousAstConstant(context, node);
       }
       return null;
@@ -1008,38 +1008,38 @@
     }
 
     if (!firstArgument.isString) {
-      DartType type = defaultValue.getType(coreTypes);
+      DartType type = defaultValue.getType(commonElements);
       return reportNotCompileTimeConstant(
           normalizedArguments[0].node,
           MessageKind.NOT_ASSIGNABLE,
-          {'fromType': type, 'toType': coreTypes.stringType});
+          {'fromType': type, 'toType': commonElements.stringType});
     }
 
     if (constructor.isIntFromEnvironmentConstructor &&
         !(defaultValue.isNull || defaultValue.isInt)) {
-      DartType type = defaultValue.getType(coreTypes);
+      DartType type = defaultValue.getType(commonElements);
       return reportNotCompileTimeConstant(
           normalizedArguments[1].node,
           MessageKind.NOT_ASSIGNABLE,
-          {'fromType': type, 'toType': coreTypes.intType});
+          {'fromType': type, 'toType': commonElements.intType});
     }
 
     if (constructor.isBoolFromEnvironmentConstructor &&
         !(defaultValue.isNull || defaultValue.isBool)) {
-      DartType type = defaultValue.getType(coreTypes);
+      DartType type = defaultValue.getType(commonElements);
       return reportNotCompileTimeConstant(
           normalizedArguments[1].node,
           MessageKind.NOT_ASSIGNABLE,
-          {'fromType': type, 'toType': coreTypes.boolType});
+          {'fromType': type, 'toType': commonElements.boolType});
     }
 
     if (constructor.isStringFromEnvironmentConstructor &&
         !(defaultValue.isNull || defaultValue.isString)) {
-      DartType type = defaultValue.getType(coreTypes);
+      DartType type = defaultValue.getType(commonElements);
       return reportNotCompileTimeConstant(
           normalizedArguments[1].node,
           MessageKind.NOT_ASSIGNABLE,
-          {'fromType': type, 'toType': coreTypes.stringType});
+          {'fromType': type, 'toType': commonElements.stringType});
     }
 
     String name = firstArgument.primitiveValue.slowToString();
@@ -1209,7 +1209,7 @@
   void potentiallyCheckType(TypedElement element, AstConstant constant) {
     if (compiler.options.enableTypeAssertions) {
       DartType elementType = element.type.substByContext(constructedType);
-      DartType constantType = constant.value.getType(coreTypes);
+      DartType constantType = constant.value.getType(commonElements);
       if (!constantSystem.isSubtype(
           compiler.types, constantType, elementType)) {
         reporter.withCurrentElement(constant.element, () {
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 07d9c89..9670004 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -10,7 +10,6 @@
 import 'cache_strategy.dart' show CacheStrategy;
 import 'closure.dart' as closureMapping show ClosureTask;
 import 'common/backend_api.dart' show Backend;
-import 'common/codegen.dart' show CodegenWorkItem;
 import 'common/names.dart' show Selectors;
 import 'common/names.dart' show Identifiers, Uris;
 import 'common/resolution.dart'
@@ -25,7 +24,7 @@
 import 'common.dart';
 import 'compile_time_constants.dart';
 import 'constants/values.dart';
-import 'core_types.dart' show CoreClasses, CommonElements, CoreTypes;
+import 'core_types.dart' show CommonElements;
 import 'dart_types.dart' show DartType, DynamicType, InterfaceType, Types;
 import 'deferred_load.dart' show DeferredLoadTask;
 import 'diagnostics/code_location.dart';
@@ -78,9 +77,9 @@
         WorldImpactBuilder,
         WorldImpactBuilderImpl;
 import 'util/util.dart' show Link, Setlet;
-import 'world.dart' show ClosedWorld, ClosedWorldRefiner, WorldImpl;
+import 'world.dart' show ClosedWorld, ClosedWorldRefiner, ClosedWorldImpl;
 
-typedef Backend MakeBackendFuncion(Compiler compiler);
+typedef Backend MakeBackendFunction(Compiler compiler);
 
 typedef CompilerDiagnosticReporter MakeReporterFunction(
     Compiler compiler, CompilerOptions options);
@@ -90,7 +89,7 @@
 
   final IdGenerator idGenerator = new IdGenerator();
   Types types;
-  _CompilerCoreTypes _coreTypes;
+  _CompilerCommonElements _commonElements;
   CompilerDiagnosticReporter _reporter;
   CompilerResolution _resolution;
   ParsingContext _parsingContext;
@@ -133,9 +132,7 @@
   FunctionElement mainFunction;
 
   DiagnosticReporter get reporter => _reporter;
-  CommonElements get commonElements => _coreTypes;
-  CoreClasses get coreClasses => _coreTypes;
-  CoreTypes get coreTypes => _coreTypes;
+  CommonElements get commonElements => _commonElements;
   Resolution get resolution => _resolution;
   ParsingContext get parsingContext => _parsingContext;
 
@@ -197,7 +194,7 @@
       {CompilerOptions options,
       api.CompilerOutput outputProvider,
       this.environment: const _EmptyEnvironment(),
-      MakeBackendFuncion makeBackend,
+      MakeBackendFunction makeBackend,
       MakeReporterFunction makeReporter})
       : this.options = options,
         this.cacheStrategy = new CacheStrategy(options.hasIncrementalSupport),
@@ -210,9 +207,7 @@
       _reporter = new CompilerDiagnosticReporter(this, options);
     }
     _resolution = createResolution();
-    // TODO(johnniwinther): Initialize core types in [initializeCoreClasses] and
-    // make its field final.
-    _coreTypes = new _CompilerCoreTypes(_resolution, reporter);
+    _commonElements = new _CompilerCommonElements(_resolution, reporter);
     types = new Types(_resolution);
 
     if (options.verbose) {
@@ -346,7 +341,7 @@
   /// Note that [library] has not been scanned yet, nor has its imports/exports
   /// been resolved.
   void onLibraryCreated(LibraryElement library) {
-    _coreTypes.onLibraryCreated(library);
+    _commonElements.onLibraryCreated(library);
     backend.onLibraryCreated(library);
   }
 
@@ -737,7 +732,7 @@
   ClosedWorldRefiner closeResolution() {
     phase = PHASE_DONE_RESOLVING;
 
-    WorldImpl world = resolverWorld.openWorld.closeWorld(reporter);
+    ClosedWorldImpl world = resolverWorld.closeWorld(reporter);
     // Compute whole-program-knowledge that the backend needs. (This might
     // require the information computed in [world.closeWorld].)
     backend.onResolutionComplete(world, world);
@@ -764,6 +759,9 @@
         cls.ensureResolved(resolution);
         cls.forEachLocalMember(registerStaticUse);
         impactBuilder.registerTypeUse(new TypeUse.instantiation(cls.rawType));
+      } else if (element.isTypedef) {
+        TypedefElement typdef = element;
+        typdef.ensureResolved(resolution);
       } else {
         registerStaticUse(element);
       }
@@ -1127,7 +1125,7 @@
   int hints = 0;
 }
 
-class _CompilerCoreTypes implements CoreTypes, CoreClasses, CommonElements {
+class _CompilerCommonElements implements CommonElements {
   final Resolution resolution;
   final DiagnosticReporter reporter;
 
@@ -1144,7 +1142,7 @@
   // specific backend.
   LibraryElement jsHelperLibrary;
 
-  _CompilerCoreTypes(this.resolution, this.reporter);
+  _CompilerCommonElements(this.resolution, this.reporter);
 
   // From dart:core
 
@@ -1914,12 +1912,6 @@
   ParsingContext get parsingContext => _compiler.parsingContext;
 
   @override
-  CoreClasses get coreClasses => _compiler.coreClasses;
-
-  @override
-  CoreTypes get coreTypes => _compiler.coreTypes;
-
-  @override
   CommonElements get commonElements => _compiler.commonElements;
 
   @override
@@ -1948,14 +1940,14 @@
       _compiler.mirrorUsageAnalyzerTask;
 
   @override
-  LibraryElement get coreLibrary => _compiler._coreTypes.coreLibrary;
+  LibraryElement get coreLibrary => _compiler._commonElements.coreLibrary;
 
   @override
   bool get wasProxyConstantComputedTestingOnly => _proxyConstant != null;
 
   @override
   void registerClass(ClassElement cls) {
-    enqueuer.universe.openWorld.registerClass(cls);
+    enqueuer.universe.registerClass(cls);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/constant_system_dart.dart b/pkg/compiler/lib/src/constant_system_dart.dart
index e1d468d..8df511f 100644
--- a/pkg/compiler/lib/src/constant_system_dart.dart
+++ b/pkg/compiler/lib/src/constant_system_dart.dart
@@ -446,8 +446,8 @@
   @override
   ConstantValue createType(Compiler compiler, DartType type) {
     // TODO(johnniwinther): Change the `Type` type to
-    // `compiler.coreTypes.typeType` and check the backend specific value in
-    // [checkConstMapKeysDontOverrideEquals] in 'members.dart'.
+    // `compiler.commonElements.typeType` and check the backend specific value
+    // in [checkConstMapKeysDontOverrideEquals] in 'members.dart'.
     return new TypeConstantValue(
         type,
         compiler.backend.backendClasses.typeImplementation
diff --git a/pkg/compiler/lib/src/constants/evaluation.dart b/pkg/compiler/lib/src/constants/evaluation.dart
index 88aad8a..5b2428b 100644
--- a/pkg/compiler/lib/src/constants/evaluation.dart
+++ b/pkg/compiler/lib/src/constants/evaluation.dart
@@ -10,7 +10,8 @@
 
 /// Environment used for evaluating constant expressions.
 abstract class Environment {
-  // TODO(johnniwinther): Replace this with [CoreTypes] and maybe [Backend].
+  // TODO(johnniwinther): Replace this with [CommonElements] and maybe
+  // [Backend].
   Compiler get compiler;
 
   /// Read environments string passed in using the '-Dname=value' option.
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 6fc55de..f68dbe1 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -80,7 +80,7 @@
 
   /// Returns the type of this constant expression, if it is independent of the
   /// environment values.
-  DartType getKnownType(CoreTypes coreTypes) => null;
+  DartType getKnownType(CommonElements commonElements) => null;
 
   /// Returns a text string resembling the Dart code creating this constant.
   String toDartText() {
@@ -236,7 +236,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.boolType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.boolType;
 }
 
 /// Integer literal constant.
@@ -271,7 +272,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.intType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.intType;
 }
 
 /// Double literal constant.
@@ -306,7 +308,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.doubleType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.doubleType;
 }
 
 /// String literal constant.
@@ -341,7 +344,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.stringType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.stringType;
 }
 
 /// Null literal constant.
@@ -374,7 +378,8 @@
   bool _equals(NullConstantExpression other) => true;
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.nullType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.nullType;
 }
 
 /// Literal list constant.
@@ -434,7 +439,7 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => type;
+  DartType getKnownType(CommonElements commonElements) => type;
 
   @override
   bool get isImplicit => false;
@@ -513,7 +518,7 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => type;
+  DartType getKnownType(CommonElements commonElements) => type;
 
   @override
   bool get isImplicit => false;
@@ -690,7 +695,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.stringType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.stringType;
 
   @override
   bool get isPotential {
@@ -730,7 +736,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.symbolType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.symbolType;
 }
 
 /// Type literal.
@@ -768,7 +775,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.typeType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.typeType;
 }
 
 /// Reference to a constant local, top-level, or static variable.
@@ -835,7 +843,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.functionType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.functionType;
 }
 
 /// A constant binary expression like `a * b`.
@@ -885,9 +894,9 @@
         left.apply(arguments), operator, right.apply(arguments));
   }
 
-  DartType getKnownType(CoreTypes coreTypes) {
-    DartType knownLeftType = left.getKnownType(coreTypes);
-    DartType knownRightType = right.getKnownType(coreTypes);
+  DartType getKnownType(CommonElements commonElements) {
+    DartType knownLeftType = left.getKnownType(commonElements);
+    DartType knownRightType = right.getKnownType(commonElements);
     switch (operator.kind) {
       case BinaryOperatorKind.EQ:
       case BinaryOperatorKind.NOT_EQ:
@@ -897,38 +906,38 @@
       case BinaryOperatorKind.LT:
       case BinaryOperatorKind.GTEQ:
       case BinaryOperatorKind.LTEQ:
-        return coreTypes.boolType;
+        return commonElements.boolType;
       case BinaryOperatorKind.ADD:
-        if (knownLeftType == coreTypes.stringType) {
-          assert(knownRightType == coreTypes.stringType);
-          return coreTypes.stringType;
-        } else if (knownLeftType == coreTypes.intType &&
-            knownRightType == coreTypes.intType) {
-          return coreTypes.intType;
+        if (knownLeftType == commonElements.stringType) {
+          assert(knownRightType == commonElements.stringType);
+          return commonElements.stringType;
+        } else if (knownLeftType == commonElements.intType &&
+            knownRightType == commonElements.intType) {
+          return commonElements.intType;
         }
-        assert(knownLeftType == coreTypes.doubleType ||
-            knownRightType == coreTypes.doubleType);
-        return coreTypes.doubleType;
+        assert(knownLeftType == commonElements.doubleType ||
+            knownRightType == commonElements.doubleType);
+        return commonElements.doubleType;
       case BinaryOperatorKind.SUB:
       case BinaryOperatorKind.MUL:
       case BinaryOperatorKind.MOD:
-        if (knownLeftType == coreTypes.intType &&
-            knownRightType == coreTypes.intType) {
-          return coreTypes.intType;
+        if (knownLeftType == commonElements.intType &&
+            knownRightType == commonElements.intType) {
+          return commonElements.intType;
         }
-        assert(knownLeftType == coreTypes.doubleType ||
-            knownRightType == coreTypes.doubleType);
-        return coreTypes.doubleType;
+        assert(knownLeftType == commonElements.doubleType ||
+            knownRightType == commonElements.doubleType);
+        return commonElements.doubleType;
       case BinaryOperatorKind.DIV:
-        return coreTypes.doubleType;
+        return commonElements.doubleType;
       case BinaryOperatorKind.IDIV:
-        return coreTypes.intType;
+        return commonElements.intType;
       case BinaryOperatorKind.AND:
       case BinaryOperatorKind.OR:
       case BinaryOperatorKind.XOR:
       case BinaryOperatorKind.SHR:
       case BinaryOperatorKind.SHL:
-        return coreTypes.intType;
+        return commonElements.intType;
       case BinaryOperatorKind.IF_NULL:
       case BinaryOperatorKind.INDEX:
         throw new UnsupportedError(
@@ -1027,7 +1036,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.boolType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.boolType;
 
   @override
   bool get isPotential {
@@ -1082,8 +1092,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) {
-    return expression.getKnownType(coreTypes);
+  DartType getKnownType(CommonElements commonElements) {
+    return expression.getKnownType(commonElements);
   }
 
   @override
@@ -1145,7 +1155,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.intType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.intType;
 
   @override
   bool get isPotential {
@@ -1216,9 +1227,9 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) {
-    DartType trueType = trueExp.getKnownType(coreTypes);
-    DartType falseType = falseExp.getKnownType(coreTypes);
+  DartType getKnownType(CommonElements commonElements) {
+    DartType trueType = trueExp.getKnownType(commonElements);
+    DartType falseType = falseExp.getKnownType(commonElements);
     if (trueType == falseType) {
       return trueType;
     }
@@ -1397,7 +1408,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.boolType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.boolType;
 }
 
 /// A `const int.fromEnvironment` constant.
@@ -1462,7 +1474,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.intType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.intType;
 }
 
 /// A `const String.fromEnvironment` constant.
@@ -1523,7 +1536,8 @@
   }
 
   @override
-  DartType getKnownType(CoreTypes coreTypes) => coreTypes.stringType;
+  DartType getKnownType(CommonElements commonElements) =>
+      commonElements.stringType;
 }
 
 /// A constant expression referenced with a deferred prefix.
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index cba4e69..5be89fc 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -82,7 +82,7 @@
   bool get isNegativeInfinity => false;
 
   // TODO(johnniwinther): Replace with a 'type' getter.
-  DartType getType(CoreTypes types);
+  DartType getType(CommonElements types);
 
   List<ConstantValue> getDependencies();
 
@@ -131,7 +131,7 @@
     return new DartString.literal(element.name);
   }
 
-  DartType getType(CoreTypes types) => element.type;
+  DartType getType(CommonElements types) => element.type;
 
   int get hashCode => (17 * element.hashCode) & 0x7fffffff;
 
@@ -189,7 +189,7 @@
 
   get primitiveValue => null;
 
-  DartType getType(CoreTypes types) => types.nullType;
+  DartType getType(CommonElements types) => types.nullType;
 
   // The magic constant has no meaning. It is just a random value.
   int get hashCode => 785965825;
@@ -261,7 +261,7 @@
 
   bool get isOne => primitiveValue == 1;
 
-  DartType getType(CoreTypes types) => types.intType;
+  DartType getType(CommonElements types) => types.intType;
 
   // We have to override the equality operator so that ints and doubles are
   // treated as separate constants.
@@ -322,7 +322,7 @@
 
   bool get isNegativeInfinity => primitiveValue == -double.INFINITY;
 
-  DartType getType(CoreTypes types) => types.doubleType;
+  DartType getType(CommonElements types) => types.doubleType;
 
   bool operator ==(var other) {
     if (other is! DoubleConstantValue) return false;
@@ -359,7 +359,7 @@
 
   bool get isBool => true;
 
-  DartType getType(CoreTypes types) => types.boolType;
+  DartType getType(CommonElements types) => types.boolType;
 
   BoolConstantValue negate();
 
@@ -427,7 +427,7 @@
 
   bool get isString => true;
 
-  DartType getType(CoreTypes types) => types.stringType;
+  DartType getType(CommonElements types) => types.stringType;
 
   bool operator ==(var other) {
     if (identical(this, other)) return true;
@@ -458,7 +458,7 @@
 
   bool get isObject => true;
 
-  DartType getType(CoreTypes types) => type;
+  DartType getType(CommonElements types) => type;
 
   void _unparseTypeArguments(StringBuffer sb) {
     if (!type.treatAsRaw) {
@@ -656,7 +656,7 @@
     return visitor.visitInterceptor(this, arg);
   }
 
-  DartType getType(CoreTypes types) => const DynamicType();
+  DartType getType(CommonElements types) => const DynamicType();
 
   ConstantValueKind get kind => ConstantValueKind.INTERCEPTOR;
 
@@ -689,7 +689,7 @@
     return visitor.visitSynthetic(this, arg);
   }
 
-  DartType getType(CoreTypes types) => const DynamicType();
+  DartType getType(CommonElements types) => const DynamicType();
 
   ConstantValueKind get kind => ConstantValueKind.SYNTHETIC;
 
@@ -793,7 +793,7 @@
 
   accept(ConstantValueVisitor visitor, arg) => visitor.visitDeferred(this, arg);
 
-  DartType getType(CoreTypes types) => referenced.getType(types);
+  DartType getType(CommonElements types) => referenced.getType(types);
 
   ConstantValueKind get kind => ConstantValueKind.DEFERRED;
 
@@ -819,7 +819,7 @@
   List<ConstantValue> getDependencies() => const <ConstantValue>[];
 
   @override
-  DartType getType(CoreTypes types) => const DynamicType();
+  DartType getType(CommonElements types) => const DynamicType();
 
   ConstantValueKind get kind => ConstantValueKind.NON_CONSTANT;
 
diff --git a/pkg/compiler/lib/src/core_types.dart b/pkg/compiler/lib/src/core_types.dart
index aff5fd9..6f70cbb 100644
--- a/pkg/compiler/lib/src/core_types.dart
+++ b/pkg/compiler/lib/src/core_types.dart
@@ -14,8 +14,8 @@
         LibraryElement,
         Element;
 
-/// The core classes in Dart.
-abstract class CoreClasses {
+/// The common elements and types in Dart.
+abstract class CommonElements {
   /// The `Object` class defined in 'dart:core'.
   ClassElement get objectClass;
 
@@ -61,15 +61,12 @@
   /// The `Iterable` class defined in 'dart:core';
   ClassElement get iterableClass;
 
-  /// The `Future` class defined in 'async';
+  /// The `Future` class defined in 'async';.
   ClassElement get futureClass;
 
   /// The `Stream` class defined in 'async';
   ClassElement get streamClass;
-}
 
-/// TODO(sigmund): delete CoreClasses and merge it here.
-abstract class CommonElements extends CoreClasses {
   /// The dart:core library.
   LibraryElement get coreLibrary;
 
@@ -136,10 +133,7 @@
 
   /// The 'filled' constructor of `List`.
   ConstructorElement get filledListConstructor;
-}
 
-/// The core types in Dart.
-abstract class CoreTypes {
   /// The `Object` type defined in 'dart:core'.
   InterfaceType get objectType;
 
@@ -194,9 +188,6 @@
   /// If no type argument is provided, the canonical raw type is returned.
   InterfaceType iterableType([DartType elementType]);
 
-  /// The `Future` class declaration.
-  ClassElement get futureClass;
-
   /// Returns an instance of the `Future` type defined in 'dart:async' with
   /// [elementType] as its type argument.
   ///
diff --git a/pkg/compiler/lib/src/dart_types.dart b/pkg/compiler/lib/src/dart_types.dart
index 688b43e..b151ed9 100644
--- a/pkg/compiler/lib/src/dart_types.dart
+++ b/pkg/compiler/lib/src/dart_types.dart
@@ -17,7 +17,6 @@
 enum TypeKind {
   FUNCTION,
   INTERFACE,
-  STATEMENT,
   TYPEDEF,
   TYPE_VARIABLE,
   MALFORMED_TYPE,
@@ -262,23 +261,6 @@
   get containsMethodTypeVariableType => true;
 }
 
-/// Internal type representing the result of analyzing a statement.
-class StatementType extends DartType {
-  Element get element => null;
-
-  TypeKind get kind => TypeKind.STATEMENT;
-
-  String get name => 'statement';
-
-  const StatementType();
-
-  DartType subst(List<DartType> arguments, List<DartType> parameters) => this;
-
-  accept(DartTypeVisitor visitor, var argument) {
-    return visitor.visitStatementType(this, argument);
-  }
-}
-
 class VoidType extends DartType {
   const VoidType();
 
@@ -952,8 +934,6 @@
 
   R visitMalformedType(MalformedType type, A argument) => null;
 
-  R visitStatementType(StatementType type, A argument) => null;
-
   R visitInterfaceType(InterfaceType type, A argument) => null;
 
   R visitTypedefType(TypedefType type, A argument) => null;
@@ -981,10 +961,6 @@
   R visitMalformedType(MalformedType type, A argument) =>
       visitType(type, argument);
 
-  @override
-  R visitStatementType(StatementType type, A argument) =>
-      visitType(type, argument);
-
   R visitGenericType(GenericType type, A argument) => visitType(type, argument);
 
   @override
@@ -1008,7 +984,7 @@
 
   AbstractTypeRelation(this.resolution);
 
-  CoreTypes get coreTypes => resolution.coreTypes;
+  CommonElements get commonElements => resolution.commonElements;
 
   bool visitType(DartType t, DartType s) {
     throw 'internal error: unknown type kind ${t.kind}';
@@ -1057,7 +1033,7 @@
       }
     }
 
-    if (s == coreTypes.functionType && t.element.callType != null) {
+    if (s == commonElements.functionType && t.element.callType != null) {
       return true;
     } else if (s is FunctionType) {
       FunctionType callType = t.callType;
@@ -1068,7 +1044,7 @@
   }
 
   bool visitFunctionType(FunctionType t, DartType s) {
-    if (s == coreTypes.functionType) {
+    if (s == commonElements.functionType) {
       return true;
     }
     if (s is! FunctionType) return false;
@@ -1198,7 +1174,7 @@
   MoreSpecificVisitor(Resolution resolution) : super(resolution);
 
   bool isMoreSpecific(DartType t, DartType s) {
-    if (identical(t, s) || s.treatAsDynamic || t == coreTypes.nullType) {
+    if (identical(t, s) || s.treatAsDynamic || t == commonElements.nullType) {
       return true;
     }
     if (t.isVoid || s.isVoid) {
@@ -1207,7 +1183,7 @@
     if (t.treatAsDynamic) {
       return false;
     }
-    if (s == coreTypes.objectType) {
+    if (s == commonElements.objectType) {
       return true;
     }
     t.computeUnaliased(resolution);
@@ -1286,7 +1262,7 @@
 /// Basic interface for the Dart type system.
 abstract class DartTypes {
   /// The types defined in 'dart:core'.
-  CoreTypes get coreTypes;
+  CommonElements get commonElements;
 
   /// Returns `true` if [t] is a subtype of [s].
   bool isSubtype(DartType t, DartType s);
@@ -1302,7 +1278,7 @@
   final SubtypeVisitor subtypeVisitor;
   final PotentialSubtypeVisitor potentialSubtypeVisitor;
 
-  CoreTypes get coreTypes => resolution.coreTypes;
+  CommonElements get commonElements => resolution.commonElements;
 
   DiagnosticReporter get reporter => resolution.reporter;
 
@@ -1334,11 +1310,11 @@
   /// return.
   DartType flatten(DartType type) {
     if (type is InterfaceType) {
-      if (type.element == coreTypes.futureClass) {
+      if (type.element == commonElements.futureClass) {
         // T = Future<S>
         return flatten(type.typeArguments.first);
       }
-      InterfaceType futureType = type.asInstanceOf(coreTypes.futureClass);
+      InterfaceType futureType = type.asInstanceOf(commonElements.futureClass);
       if (futureType != null) {
         // T << Future<S>
         return futureType.typeArguments.single;
@@ -1551,17 +1527,6 @@
       // [b] is a malformed or statement type => a > b.
       return 1;
     }
-    if (a.kind == TypeKind.STATEMENT) {
-      if (b.kind == TypeKind.STATEMENT) {
-        return 0;
-      } else {
-        // [b] is a malformed type => a > b.
-        return 1;
-      }
-    } else if (b.kind == TypeKind.STATEMENT) {
-      // [a] is a malformed type => a < b.
-      return -1;
-    }
     assert(a.isMalformed);
     assert(b.isMalformed);
     // TODO(johnniwinther): Can we do this better?
@@ -1641,7 +1606,7 @@
   /// [a] and [b].
   DartType computeLeastUpperBoundFunctionTypes(FunctionType a, FunctionType b) {
     if (a.parameterTypes.length != b.parameterTypes.length) {
-      return coreTypes.functionType;
+      return commonElements.functionType;
     }
     DartType returnType = computeLeastUpperBound(a.returnType, b.returnType);
     List<DartType> parameterTypes =
@@ -1718,10 +1683,10 @@
     }
 
     if (a.isFunctionType) {
-      a = coreTypes.functionType;
+      a = commonElements.functionType;
     }
     if (b.isFunctionType) {
-      b = coreTypes.functionType;
+      b = commonElements.functionType;
     }
 
     if (a.isInterfaceType && b.isInterfaceType) {
@@ -1763,7 +1728,7 @@
       TypeVariableType variable = type;
       type = variable.element.bound;
       if (type == originalType) {
-        type = resolution.coreTypes.objectType;
+        type = resolution.commonElements.objectType;
       }
     }
     if (type.isMalformed) {
@@ -1807,7 +1772,7 @@
       return null;
     }
     if (type.isFunctionType) {
-      type = resolution.coreTypes.functionType;
+      type = resolution.commonElements.functionType;
     }
     assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType,
         message: "unexpected type kind ${type.kind}."));
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 49e1668..838a783 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -797,7 +797,7 @@
               metadata.ensureResolved(compiler.resolution);
               ConstantValue value =
                   compiler.constants.getConstantValue(metadata.constant);
-              Element element = value.getType(compiler.coreTypes).element;
+              Element element = value.getType(compiler.commonElements).element;
               if (element == deferredLibraryClass) {
                 reporter.reportErrorMessage(
                     import, MessageKind.DEFERRED_OLD_SYNTAX);
@@ -1033,7 +1033,7 @@
         metadata.ensureResolved(compiler.resolution);
         ConstantValue value =
             compiler.constants.getConstantValue(metadata.constant);
-        Element element = value.getType(compiler.coreTypes).element;
+        Element element = value.getType(compiler.commonElements).element;
         if (element == compiler.commonElements.deferredLibraryClass) {
           ConstructedConstantValue constant = value;
           StringConstantValue s = constant.fields.values.single;
diff --git a/pkg/compiler/lib/src/elements/common.dart b/pkg/compiler/lib/src/elements/common.dart
index 83eb3ea..3be91d3 100644
--- a/pkg/compiler/lib/src/elements/common.dart
+++ b/pkg/compiler/lib/src/elements/common.dart
@@ -7,7 +7,7 @@
 library elements.common;
 
 import '../common/names.dart' show Identifiers, Names, Uris;
-import '../core_types.dart' show CoreClasses;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart' show DartType, InterfaceType, FunctionType;
 import '../util/util.dart' show Link;
 import 'elements.dart';
@@ -439,8 +439,9 @@
   }
 
   @override
-  bool implementsFunction(CoreClasses coreClasses) {
-    return asInstanceOf(coreClasses.functionClass) != null || callType != null;
+  bool implementsFunction(CommonElements commonElements) {
+    return asInstanceOf(commonElements.functionClass) != null ||
+        callType != null;
   }
 
   @override
diff --git a/pkg/compiler/lib/src/elements/elements.dart b/pkg/compiler/lib/src/elements/elements.dart
index 95acc7b..ded810b 100644
--- a/pkg/compiler/lib/src/elements/elements.dart
+++ b/pkg/compiler/lib/src/elements/elements.dart
@@ -9,7 +9,7 @@
 import '../compiler.dart' show Compiler;
 import '../constants/constructors.dart';
 import '../constants/expressions.dart';
-import '../core_types.dart' show CoreClasses, CommonElements;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../ordered_typeset.dart' show OrderedTypeSet;
 import '../resolution/scope.dart' show Scope;
@@ -807,7 +807,7 @@
         closedWorld.backendClasses.isNative(cls) &&
         closedWorld.isSubtypeOf(
             cls, closedWorld.commonElements.typedDataClass) &&
-        closedWorld.isSubtypeOf(cls, closedWorld.coreClasses.listClass) &&
+        closedWorld.isSubtypeOf(cls, closedWorld.commonElements.listClass) &&
         constructor.name == '';
   }
 
@@ -1544,7 +1544,7 @@
 
   /// Returns `true` if this class implements [Function] either by directly
   /// implementing the interface or by providing a [call] method.
-  bool implementsFunction(CoreClasses coreClasses);
+  bool implementsFunction(CommonElements commonElements);
 
   /// Returns `true` if this class extends [cls] directly or indirectly.
   ///
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 30c5aef..3af5382 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -8,8 +8,7 @@
 
 import 'cache_strategy.dart';
 import 'common/backend_api.dart' show Backend;
-import 'common/names.dart' show Identifiers;
-import 'common/resolution.dart' show Resolution, ResolutionWorkItem;
+import 'common/resolution.dart' show Resolution;
 import 'common/tasks.dart' show CompilerTask;
 import 'common/work.dart' show WorkItem;
 import 'common.dart';
@@ -19,7 +18,6 @@
 import 'elements/elements.dart'
     show
         AnalyzableElement,
-        AstElement,
         ClassElement,
         ConstructorElement,
         Element,
@@ -70,6 +68,7 @@
 }
 
 abstract class Enqueuer {
+  // TODO(johnniwinther): Rename to `worldBuilder`.
   WorldBuilder get universe;
   native.NativeEnqueuer get nativeEnqueuer;
   void forgetEntity(Entity entity, Compiler compiler);
@@ -137,13 +136,14 @@
   final EnqueuerStrategy strategy;
   final Set<ClassEntity> _recentClasses = new Setlet<ClassEntity>();
   final ResolutionWorldBuilderImpl _universe;
+  final WorkItemBuilder _workItemBuilder;
 
   bool queueIsClosed = false;
 
   WorldImpactVisitor _impactVisitor;
 
   /// All declaration elements that have been processed by the resolver.
-  final Set<Entity> _processedElements = new Set<Entity>();
+  final Set<Entity> _processedEntities = new Set<Entity>();
 
   final Queue<WorkItem> _queue = new Queue<WorkItem>();
 
@@ -164,14 +164,13 @@
         this._resolution = resolution,
         this.nativeEnqueuer = backend.nativeResolutionEnqueuer(),
         _universe = new ResolutionWorldBuilderImpl(
-            backend, resolution, cacheStrategy, const TypeMaskStrategy()) {
+            backend, resolution, cacheStrategy, const OpenWorldStrategy()),
+        _workItemBuilder = new ResolutionWorkItemBuilder(resolution) {
     _impactVisitor = new EnqueuerImplImpactVisitor(this);
   }
 
   ResolutionWorldBuilder get universe => _universe;
 
-  OpenWorld get _openWorld => universe.openWorld;
-
   bool get queueIsEmpty => _queue.isEmpty;
 
   DiagnosticReporter get _reporter => _resolution.reporter;
@@ -300,7 +299,7 @@
         break;
       case TypeUseKind.TYPE_LITERAL:
         if (type.isTypedef) {
-          universe.openWorld.registerTypedef(type.element);
+          universe.registerTypedef(type.element);
         }
         break;
     }
@@ -330,9 +329,9 @@
       while (_queue.isNotEmpty) {
         // TODO(johnniwinther): Find an optimal process order.
         WorkItem work = _queue.removeLast();
-        if (!_processedElements.contains(work.element)) {
+        if (!_processedEntities.contains(work.element)) {
           strategy.processWorkItem(f, work);
-          _processedElements.add(work.element);
+          _processedEntities.add(work.element);
         }
       }
       List recents = _recentClasses.toList(growable: false);
@@ -344,13 +343,13 @@
   }
 
   void logSummary(log(message)) {
-    log('Resolved ${_processedElements.length} elements.');
+    log('Resolved ${_processedEntities.length} elements.');
     nativeEnqueuer.logSummary(log);
   }
 
   String toString() => 'Enqueuer($name)';
 
-  Iterable<Entity> get processedEntities => _processedElements;
+  Iterable<Entity> get processedEntities => _processedEntities;
 
   ImpactUseCase get impactUse => IMPACT_USE;
 
@@ -358,37 +357,32 @@
 
   /// Returns `true` if [element] has been processed by the resolution enqueuer.
   // TODO(johnniwinther): Move this to the [OpenWorld]/[ResolutionWorldBuilder].
-  bool hasBeenProcessed(Element element) {
+  bool hasBeenProcessed(MemberElement element) {
     assert(invariant(element, element == element.analyzableElement.declaration,
         message: "Unexpected element $element"));
-    return _processedElements.contains(element);
+    return _processedEntities.contains(element);
   }
 
-  /// Registers [element] as processed by the resolution enqueuer. Used only for
+  /// Registers [entity] as processed by the resolution enqueuer. Used only for
   /// testing.
-  void registerProcessedElementInternal(AstElement element) {
-    _processedElements.add(element);
+  void registerProcessedElementInternal(Entity entity) {
+    _processedEntities.add(entity);
   }
 
-  /// Adds [element] to the work list if it has not already been processed.
-  ///
-  /// Invariant: [element] must be a declaration element.
-  void _addToWorkList(Element element) {
-    assert(invariant(element, element.isDeclaration));
-    if (element.isMalformed) return;
+  /// Create a [WorkItem] for [entity] and add it to the work list if it has not
+  /// already been processed.
+  void _addToWorkList(MemberEntity entity) {
+    if (hasBeenProcessed(entity)) return;
+    WorkItem workItem = _workItemBuilder.createWorkItem(entity);
+    if (workItem == null) return;
 
-    assert(invariant(element, element is AnalyzableElement,
-        message: 'Element $element is not analyzable.'));
-    if (hasBeenProcessed(element)) return;
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(
-          element, "Resolution work list is closed. Trying to add $element.");
+          entity, "Resolution work list is closed. Trying to add $entity.");
     }
 
-    applyImpact(backend.registerUsedElement(element, forResolution: true));
-    _openWorld.registerUsedElement(element);
-
-    ResolutionWorkItem workItem = _resolution.createWorkItem(element);
+    applyImpact(backend.registerUsedElement(entity, forResolution: true));
+    _universe.registerUsedElement(entity);
     _queue.add(workItem);
   }
 
@@ -430,7 +424,7 @@
 
   void forgetEntity(Entity entity, Compiler compiler) {
     _universe.forgetEntity(entity, compiler);
-    _processedElements.remove(entity);
+    _processedEntities.remove(entity);
   }
 }
 
@@ -531,3 +525,26 @@
 
   _DeferredAction(this.element, this.action);
 }
+
+/// Interface for creating work items for enqueued member entities.
+abstract class WorkItemBuilder {
+  WorkItem createWorkItem(MemberEntity entity);
+}
+
+/// Builder that creates work item necessary for the resolution of a
+/// [MemberElement].
+class ResolutionWorkItemBuilder extends WorkItemBuilder {
+  final Resolution _resolution;
+
+  ResolutionWorkItemBuilder(this._resolution);
+
+  @override
+  WorkItem createWorkItem(MemberElement element) {
+    assert(invariant(element, element.isDeclaration));
+    if (element.isMalformed) return null;
+
+    assert(invariant(element, element is AnalyzableElement,
+        message: 'Element $element is not analyzable.'));
+    return _resolution.createWorkItem(element);
+  }
+}
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
index ef9fbfa..f9773c4 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
@@ -891,7 +891,7 @@
     // TODO(kasperl): We should be able to tell that the type of a literal
     // symbol is always a non-null exact symbol implementation -- not just
     // any non-null subtype of the symbol interface.
-    return types.nonNullSubtype(closedWorld.coreClasses.symbolClass);
+    return types.nonNullSubtype(closedWorld.commonElements.symbolClass);
   }
 
   @override
@@ -1042,7 +1042,7 @@
           }
         } else {
           // Narrow the elements to a non-null type.
-          DartType objectType = closedWorld.coreTypes.objectType;
+          DartType objectType = closedWorld.commonElements.objectType;
           if (Elements.isLocal(receiverElement)) {
             narrow(receiverElement, objectType, node);
           }
diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
index b60f5d6..1001ce2a 100644
--- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
@@ -9,7 +9,7 @@
 import '../common/names.dart' show Identifiers, Selectors;
 import '../compiler.dart' show Compiler;
 import '../constants/values.dart' show ConstantValue, IntConstantValue;
-import '../core_types.dart' show CoreClasses, CoreTypes;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart' show DartType;
 import '../elements/elements.dart';
 import '../js_backend/backend_helpers.dart';
@@ -47,9 +47,7 @@
   InferrerEngine(
       this.compiler, this.closedWorld, this.closedWorldRefiner, this.types);
 
-  CoreClasses get coreClasses => compiler.coreClasses;
-
-  CoreTypes get coreTypes => compiler.coreTypes;
+  CommonElements get commonElements => closedWorld.commonElements;
 
   /**
    * Records the default type of parameter [parameter].
@@ -234,19 +232,20 @@
     for (var type in typesReturned) {
       T mappedType;
       if (type == native.SpecialType.JsObject) {
-        mappedType = types.nonNullExact(coreClasses.objectClass);
-      } else if (type == coreTypes.stringType) {
+        mappedType = types.nonNullExact(commonElements.objectClass);
+      } else if (type == commonElements.stringType) {
         mappedType = types.stringType;
-      } else if (type == coreTypes.intType) {
+      } else if (type == commonElements.intType) {
         mappedType = types.intType;
-      } else if (type == coreTypes.numType || type == coreTypes.doubleType) {
+      } else if (type == commonElements.numType ||
+          type == commonElements.doubleType) {
         // Note: the backend double class is specifically for non-integer
         // doubles, and a native behavior returning 'double' does not guarantee
         // a non-integer return type, so we return the number type for those.
         mappedType = types.numType;
-      } else if (type == coreTypes.boolType) {
+      } else if (type == commonElements.boolType) {
         mappedType = types.boolType;
-      } else if (type == coreTypes.nullType) {
+      } else if (type == commonElements.nullType) {
         mappedType = types.nullType;
       } else if (type.isVoid) {
         mappedType = types.nullType;
@@ -1416,7 +1415,7 @@
     ClassElement cls = outermostElement.enclosingClass.declaration;
     MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_);
     if (!Selectors.noSuchMethod_.signatureApplies(element)) {
-      element = compiler.coreClasses.objectClass
+      element = compiler.commonElements.objectClass
           .lookupMember(Identifiers.noSuchMethod_);
     }
     return handleStaticSend(node, selector, mask, element, arguments);
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index 332e256..3b7884e 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -273,7 +273,7 @@
       {bool isNullable: true}) {
     if (annotation.treatAsDynamic) return type;
     if (annotation.isVoid) return nullType;
-    if (annotation.element == closedWorld.coreClasses.objectClass &&
+    if (annotation.element == closedWorld.commonElements.objectClass &&
         isNullable) {
       return type;
     }
@@ -285,7 +285,7 @@
       return type;
     } else {
       assert(annotation.isInterfaceType);
-      otherType = annotation.element == closedWorld.coreClasses.objectClass
+      otherType = annotation.element == closedWorld.commonElements.objectClass
           ? dynamicType.type.nonNullable()
           : new TypeMask.nonNullSubtype(annotation.element, closedWorld);
     }
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index fe066c7..2ef3e2a 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -25,7 +25,7 @@
 import '../constants/constant_system.dart';
 import '../constants/expressions.dart';
 import '../constants/values.dart';
-import '../core_types.dart' show CommonElements, CoreClasses, CoreTypes;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../deferred_load.dart' show DeferredLoadTask;
 import '../dump_info.dart' show DumpInfoTask;
@@ -324,9 +324,8 @@
   /**
    * The generated code as a js AST for compiled methods.
    */
-  Map<Element, jsAst.Expression> get generatedCode {
-    return codegenEnqueuer.generatedCode;
-  }
+  final Map<Element, jsAst.Expression> generatedCode =
+      <Element, jsAst.Expression>{};
 
   FunctionInlineCache inlineCache = new FunctionInlineCache();
 
@@ -541,6 +540,7 @@
   PatchResolverTask patchResolverTask;
 
   bool enabledNoSuchMethod = false;
+  bool _noSuchMethodEnabledForCodegen = false;
 
   SourceInformationStrategy sourceInformationStrategy;
 
@@ -607,10 +607,6 @@
 
   CommonElements get commonElements => compiler.commonElements;
 
-  CoreClasses get coreClasses => compiler.coreClasses;
-
-  CoreTypes get coreTypes => compiler.coreTypes;
-
   Resolution get resolution => compiler.resolution;
 
   /// Returns constant environment for the JavaScript interpretation of the
@@ -682,7 +678,7 @@
         compiler.commonElements.isSymbolConstructor(element) ||
         helpers.isSymbolValidatedConstructor(element) ||
         element == helpers.syncCompleterConstructor ||
-        element == coreClasses.symbolClass ||
+        element == commonElements.symbolClass ||
         element == helpers.objectNoSuchMethod) {
       // TODO(johnniwinther): These are valid but we could be more precise.
       return true;
@@ -697,10 +693,10 @@
         element.library == helpers.isolateHelperLibrary) {
       // TODO(johnniwinther): We should be more precise about these.
       return true;
-    } else if (element == coreClasses.listClass ||
+    } else if (element == commonElements.listClass ||
         element == helpers.mapLiteralClass ||
-        element == coreClasses.functionClass ||
-        element == coreClasses.stringClass) {
+        element == commonElements.functionClass ||
+        element == commonElements.stringClass) {
       // TODO(johnniwinther): Avoid these.
       return true;
     } else if (element == helpers.genericNoSuchMethod ||
@@ -978,7 +974,7 @@
       ClassElement interceptorClass) {
     if (interceptorClass == null) return;
     interceptorClass.ensureResolved(resolution);
-    coreClasses.objectClass.forEachMember((_, Element member) {
+    commonElements.objectClass.forEachMember((_, Element member) {
       if (member.isGenerativeConstructor) return;
       Element interceptorMember = interceptorClass.lookupMember(member.name);
       // Interceptors must override all Object methods due to calling convention
@@ -1002,7 +998,7 @@
         }
         if (member.isSynthesized) return;
         // All methods on [Object] are shadowed by [Interceptor].
-        if (classElement == coreClasses.objectClass) return;
+        if (classElement == commonElements.objectClass) return;
         Set<Element> set = interceptedElements.putIfAbsent(
             member.name, () => new Set<Element>());
         set.add(member);
@@ -1025,7 +1021,7 @@
         cls.ensureResolved(resolution);
         cls.forEachMember((ClassElement classElement, Element member) {
           // All methods on [Object] are shadowed by [Interceptor].
-          if (classElement == coreClasses.objectClass) return;
+          if (classElement == commonElements.objectClass) return;
           Set<Element> set = interceptedElements.putIfAbsent(
               member.name, () => new Set<Element>());
           set.add(member);
@@ -1075,7 +1071,7 @@
 
   void computeImpactForCompileTimeConstantInternal(ConstantValue constant,
       WorldImpactBuilder impactBuilder, bool isForResolution) {
-    DartType type = constant.getType(compiler.coreTypes);
+    DartType type = constant.getType(compiler.commonElements);
     computeImpactForInstantiatedConstantType(type, impactBuilder);
 
     if (constant.isFunction) {
@@ -1104,7 +1100,7 @@
   void computeImpactForInstantiatedConstantType(
       DartType type, WorldImpactBuilder impactBuilder) {
     DartType instantiatedType =
-        type.isFunctionType ? coreTypes.functionType : type;
+        type.isFunctionType ? commonElements.functionType : type;
     if (type is InterfaceType) {
       impactBuilder
           .registerTypeUse(new TypeUse.instantiation(instantiatedType));
@@ -1144,19 +1140,19 @@
 
     // Register any helper that will be needed by the backend.
     if (forResolution) {
-      if (cls == coreClasses.intClass ||
-          cls == coreClasses.doubleClass ||
-          cls == coreClasses.numClass) {
+      if (cls == commonElements.intClass ||
+          cls == commonElements.doubleClass ||
+          cls == commonElements.numClass) {
         impactTransformer.registerBackendImpact(
             impactBuilder, impacts.numClasses);
-      } else if (cls == coreClasses.listClass ||
-          cls == coreClasses.stringClass) {
+      } else if (cls == commonElements.listClass ||
+          cls == commonElements.stringClass) {
         impactTransformer.registerBackendImpact(
             impactBuilder, impacts.listOrStringClasses);
-      } else if (cls == coreClasses.functionClass) {
+      } else if (cls == commonElements.functionClass) {
         impactTransformer.registerBackendImpact(
             impactBuilder, impacts.functionClass);
-      } else if (cls == coreClasses.mapClass) {
+      } else if (cls == commonElements.mapClass) {
         impactTransformer.registerBackendImpact(
             impactBuilder, impacts.mapClass);
         // For map literals, the dependency between the implementation class
@@ -1177,10 +1173,10 @@
       impactTransformer.registerBackendImpact(
           impactBuilder, impacts.closureClass);
     }
-    if (cls == coreClasses.stringClass || cls == helpers.jsStringClass) {
+    if (cls == commonElements.stringClass || cls == helpers.jsStringClass) {
       addInterceptors(helpers.jsStringClass, impactBuilder,
           forResolution: forResolution);
-    } else if (cls == coreClasses.listClass ||
+    } else if (cls == commonElements.listClass ||
         cls == helpers.jsArrayClass ||
         cls == helpers.jsFixedArrayClass ||
         cls == helpers.jsExtendableArrayClass ||
@@ -1199,7 +1195,7 @@
         impactTransformer.registerBackendImpact(
             impactBuilder, impacts.listClasses);
       }
-    } else if (cls == coreClasses.intClass || cls == helpers.jsIntClass) {
+    } else if (cls == commonElements.intClass || cls == helpers.jsIntClass) {
       addInterceptors(helpers.jsIntClass, impactBuilder,
           forResolution: forResolution);
       addInterceptors(helpers.jsPositiveIntClass, impactBuilder,
@@ -1210,18 +1206,19 @@
           forResolution: forResolution);
       addInterceptors(helpers.jsNumberClass, impactBuilder,
           forResolution: forResolution);
-    } else if (cls == coreClasses.doubleClass || cls == helpers.jsDoubleClass) {
+    } else if (cls == commonElements.doubleClass ||
+        cls == helpers.jsDoubleClass) {
       addInterceptors(helpers.jsDoubleClass, impactBuilder,
           forResolution: forResolution);
       addInterceptors(helpers.jsNumberClass, impactBuilder,
           forResolution: forResolution);
-    } else if (cls == coreClasses.boolClass || cls == helpers.jsBoolClass) {
+    } else if (cls == commonElements.boolClass || cls == helpers.jsBoolClass) {
       addInterceptors(helpers.jsBoolClass, impactBuilder,
           forResolution: forResolution);
-    } else if (cls == coreClasses.nullClass || cls == helpers.jsNullClass) {
+    } else if (cls == commonElements.nullClass || cls == helpers.jsNullClass) {
       addInterceptors(helpers.jsNullClass, impactBuilder,
           forResolution: forResolution);
-    } else if (cls == coreClasses.numClass || cls == helpers.jsNumberClass) {
+    } else if (cls == commonElements.numClass || cls == helpers.jsNumberClass) {
       addInterceptors(helpers.jsIntClass, impactBuilder,
           forResolution: forResolution);
       addInterceptors(helpers.jsPositiveIntClass, impactBuilder,
@@ -1306,6 +1303,11 @@
     noSuchMethodRegistry.onTypeInferenceComplete();
   }
 
+  /// 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}) {
     if (forResolution || methodNeedsRti(callMethod)) {
@@ -1388,7 +1390,7 @@
     return null;
   }
 
-  WorldImpact enableNoSuchMethod() {
+  WorldImpact computeNoSuchMethodImpact() {
     return impactTransformer.createImpactFor(impacts.noSuchMethodSupport);
   }
 
@@ -1527,7 +1529,7 @@
     // Native classes inherit from Interceptor.
     return isNative(element)
         ? helpers.jsInterceptorClass
-        : coreClasses.objectClass;
+        : commonElements.objectClass;
   }
 
   /**
@@ -1641,23 +1643,23 @@
       if (nativeCheckOnly) return null;
       return 'voidTypeCheck';
     } else if (element == helpers.jsStringClass ||
-        element == coreClasses.stringClass) {
+        element == commonElements.stringClass) {
       if (nativeCheckOnly) return null;
       return typeCast ? 'stringTypeCast' : 'stringTypeCheck';
     } else if (element == helpers.jsDoubleClass ||
-        element == coreClasses.doubleClass) {
+        element == commonElements.doubleClass) {
       if (nativeCheckOnly) return null;
       return typeCast ? 'doubleTypeCast' : 'doubleTypeCheck';
     } else if (element == helpers.jsNumberClass ||
-        element == coreClasses.numClass) {
+        element == commonElements.numClass) {
       if (nativeCheckOnly) return null;
       return typeCast ? 'numTypeCast' : 'numTypeCheck';
     } else if (element == helpers.jsBoolClass ||
-        element == coreClasses.boolClass) {
+        element == commonElements.boolClass) {
       if (nativeCheckOnly) return null;
       return typeCast ? 'boolTypeCast' : 'boolTypeCheck';
     } else if (element == helpers.jsIntClass ||
-        element == coreClasses.intClass ||
+        element == commonElements.intClass ||
         element == helpers.jsUInt32Class ||
         element == helpers.jsUInt31Class ||
         element == helpers.jsPositiveIntClass) {
@@ -1681,7 +1683,7 @@
       } else {
         return typeCast ? 'stringSuperTypeCast' : 'stringSuperTypeCheck';
       }
-    } else if ((element == coreClasses.listClass ||
+    } else if ((element == commonElements.listClass ||
             element == helpers.jsArrayClass) &&
         type.treatAsRaw) {
       if (nativeCheckOnly) return null;
@@ -1734,11 +1736,11 @@
    */
   bool hasDirectCheckFor(DartType type) {
     Element element = type.element;
-    return element == coreClasses.stringClass ||
-        element == coreClasses.boolClass ||
-        element == coreClasses.numClass ||
-        element == coreClasses.intClass ||
-        element == coreClasses.doubleClass ||
+    return element == commonElements.stringClass ||
+        element == commonElements.boolClass ||
+        element == commonElements.numClass ||
+        element == commonElements.intClass ||
+        element == commonElements.doubleClass ||
         element == helpers.jsArrayClass ||
         element == helpers.jsMutableArrayClass ||
         element == helpers.jsExtendableArrayClass ||
@@ -1756,7 +1758,7 @@
     return _closedWorld.hasOnlySubclasses(classElement);
   }
 
-  WorldImpact registerUsedElement(Element element, {bool forResolution}) {
+  WorldImpact registerUsedElement(MemberElement element, {bool forResolution}) {
     WorldImpactBuilderImpl worldImpact = new WorldImpactBuilderImpl();
     if (element == helpers.disableTreeShakingMarker) {
       isTreeShakingDisabled = true;
@@ -1787,16 +1789,15 @@
     customElementsAnalysis.registerStaticUse(element,
         forResolution: forResolution);
 
-    if (forResolution) {
-      if (element.isFunction && element.isInstanceMember) {
-        MemberElement function = element;
-        ClassElement cls = function.enclosingClass;
-        if (function.name == Identifiers.call && !cls.typeVariables.isEmpty) {
-          worldImpact.addImpact(registerCallMethodWithFreeTypeVariables(
-              function,
-              forResolution: true));
-        }
+    if (element.isFunction && element.isInstanceMember) {
+      MemberElement function = element;
+      ClassElement cls = function.enclosingClass;
+      if (function.name == Identifiers.call && !cls.typeVariables.isEmpty) {
+        worldImpact.addImpact(registerCallMethodWithFreeTypeVariables(function,
+            forResolution: forResolution));
       }
+    }
+    if (forResolution) {
       // Enable isolate support if we start using something from the isolate
       // library, or timers for the async library.  We exclude constant fields,
       // which are ending here because their initializing expression is
@@ -1831,6 +1832,10 @@
       } else if (compiler.commonElements.isFunctionApplyMethod(element)) {
         hasFunctionApplySupport = true;
       }
+    } else {
+      // TODO(sigmund): add other missing dependencies (internals, selectors
+      // enqueued after allocations).
+      compiler.dumpInfoTask.registerDependency(element);
     }
     return worldImpact;
   }
@@ -1914,20 +1919,20 @@
     helpers.onLibrariesLoaded(loadedLibraries);
 
     implementationClasses = <ClassElement, ClassElement>{};
-    implementationClasses[coreClasses.intClass] = helpers.jsIntClass;
-    implementationClasses[coreClasses.boolClass] = helpers.jsBoolClass;
-    implementationClasses[coreClasses.numClass] = helpers.jsNumberClass;
-    implementationClasses[coreClasses.doubleClass] = helpers.jsDoubleClass;
-    implementationClasses[coreClasses.stringClass] = helpers.jsStringClass;
-    implementationClasses[coreClasses.listClass] = helpers.jsArrayClass;
-    implementationClasses[coreClasses.nullClass] = helpers.jsNullClass;
+    implementationClasses[commonElements.intClass] = helpers.jsIntClass;
+    implementationClasses[commonElements.boolClass] = helpers.jsBoolClass;
+    implementationClasses[commonElements.numClass] = helpers.jsNumberClass;
+    implementationClasses[commonElements.doubleClass] = helpers.jsDoubleClass;
+    implementationClasses[commonElements.stringClass] = helpers.jsStringClass;
+    implementationClasses[commonElements.listClass] = helpers.jsArrayClass;
+    implementationClasses[commonElements.nullClass] = helpers.jsNullClass;
 
     // These methods are overwritten with generated versions.
     inlineCache.markAsNonInlinable(helpers.getInterceptorMethod,
         insideLoop: true);
 
     specialOperatorEqClasses
-      ..add(coreClasses.objectClass)
+      ..add(commonElements.objectClass)
       ..add(helpers.jsInterceptorClass)
       ..add(helpers.jsNullClass);
 
@@ -2016,7 +2021,7 @@
       ConstantValue value =
           compiler.constants.getConstantValue(metadata.constant);
       if (value == null) continue;
-      DartType type = value.getType(compiler.coreTypes);
+      DartType type = value.getType(compiler.commonElements);
       if (metaTargetsUsed.contains(type.element)) return true;
     }
     return false;
@@ -2131,7 +2136,7 @@
     for (LibraryElement lib in compiler.libraryLoader.libraries) {
       if (lib.isInternalLibrary) continue;
       lib.forEachLocalMember((Element member) {
-        if (!member.isClass &&
+        if (!(member.isClass || member.isTypedef) &&
             resolution.hasBeenProcessed(member) &&
             referencedFromMirrorSystem(member)) {
           reflectableMembers.add(member);
@@ -2237,22 +2242,31 @@
     enqueuer.applyImpact(
         typeVariableHandler.flush(forResolution: enqueuer.isResolutionQueue));
 
-    if (!enqueuer.queueIsEmpty) return false;
-
-    for (ClassElement cls in recentClasses) {
-      Element element = cls.lookupLocalMember(Identifiers.noSuchMethod_);
-      if (element != null && element.isInstanceMember && element.isFunction) {
-        registerNoSuchMethod(element);
+    if (enqueuer.isResolutionQueue) {
+      for (ClassElement cls in recentClasses) {
+        Element element = cls.lookupLocalMember(Identifiers.noSuchMethod_);
+        if (element != null && element.isInstanceMember && element.isFunction) {
+          registerNoSuchMethod(element);
+        }
       }
     }
     noSuchMethodRegistry.onQueueEmpty();
-    if (!enabledNoSuchMethod &&
-        (noSuchMethodRegistry.hasThrowingNoSuchMethod ||
-            noSuchMethodRegistry.hasComplexNoSuchMethod)) {
-      enqueuer.applyImpact(enableNoSuchMethod());
-      enabledNoSuchMethod = true;
+    if (enqueuer.isResolutionQueue) {
+      if (!enabledNoSuchMethod &&
+          (noSuchMethodRegistry.hasThrowingNoSuchMethod ||
+              noSuchMethodRegistry.hasComplexNoSuchMethod)) {
+        enqueuer.applyImpact(computeNoSuchMethodImpact());
+        enabledNoSuchMethod = true;
+      }
+    } else {
+      if (enabledNoSuchMethod && !_noSuchMethodEnabledForCodegen) {
+        enqueuer.applyImpact(computeNoSuchMethodImpact());
+        _noSuchMethodEnabledForCodegen = true;
+      }
     }
 
+    if (!enqueuer.queueIsEmpty) return false;
+
     if (compiler.options.useKernel && compiler.mainApp != null) {
       kernelTask.buildKernelIr();
     }
@@ -2483,6 +2497,12 @@
     constants.forgetElement(element);
     constantCompilerTask.dartConstantCompiler.forgetElement(element);
     aliasedSuperMembers.remove(element);
+    generatedCode.remove(element);
+    if (element is MemberElement) {
+      for (Element closure in element.nestedClosures) {
+        generatedCode.remove(closure);
+      }
+    }
   }
 
   @override
@@ -2743,7 +2763,7 @@
         case Feature.FIELD_WITHOUT_INITIALIZER:
         case Feature.LOCAL_WITHOUT_INITIALIZER:
           transformed.registerTypeUse(
-              new TypeUse.instantiation(backend.coreTypes.nullType));
+              new TypeUse.instantiation(backend.commonElements.nullType));
           registerBackendImpact(transformed, impacts.nullLiteral);
           break;
         case Feature.LAZY_FIELD:
@@ -2833,7 +2853,7 @@
 
     if (hasTypeLiteral) {
       transformed.registerTypeUse(
-          new TypeUse.instantiation(backend.compiler.coreTypes.typeType));
+          new TypeUse.instantiation(backend.compiler.commonElements.typeType));
       registerBackendImpact(transformed, impacts.typeLiteral);
     }
 
@@ -3228,7 +3248,8 @@
   ClassElement get syncStarIterableImplementation => helpers.syncStarIterable;
   ClassElement get asyncFutureImplementation => helpers.futureImplementation;
   ClassElement get asyncStarStreamImplementation => helpers.controllerStream;
-  ClassElement get functionImplementation => helpers.coreClasses.functionClass;
+  ClassElement get functionImplementation =>
+      helpers.commonElements.functionClass;
   ClassElement get indexableImplementation => helpers.jsIndexableClass;
   ClassElement get mutableIndexableImplementation =>
       helpers.jsMutableIndexableClass;
@@ -3239,7 +3260,7 @@
   bool isDefaultEqualityImplementation(Element element) {
     assert(element.name == '==');
     ClassElement classElement = element.enclosingClass;
-    return classElement == helpers.coreClasses.objectClass ||
+    return classElement == helpers.commonElements.objectClass ||
         classElement == helpers.jsInterceptorClass ||
         classElement == helpers.jsNullClass;
   }
diff --git a/pkg/compiler/lib/src/js_backend/backend_helpers.dart b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
index ee8d696..6967ca8 100644
--- a/pkg/compiler/lib/src/js_backend/backend_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
@@ -8,7 +8,7 @@
 import '../common/names.dart' show Identifiers, Uris;
 import '../common/resolution.dart' show Resolution;
 import '../compiler.dart' show Compiler;
-import '../core_types.dart' show CoreClasses;
+import '../core_types.dart' show CommonElements;
 import '../elements/elements.dart'
     show
         AbstractFieldElement,
@@ -16,7 +16,6 @@
         ConstructorElement,
         Element,
         EnumClassElement,
-        FieldElement,
         FunctionElement,
         LibraryElement,
         MemberElement,
@@ -62,7 +61,7 @@
 
   Resolution get resolution => backend.resolution;
 
-  CoreClasses get coreClasses => compiler.coreClasses;
+  CommonElements get commonElements => compiler.commonElements;
 
   DiagnosticReporter get reporter => compiler.reporter;
 
@@ -393,7 +392,7 @@
     jsStringOperatorAdd = compiler.lookupElementIn(jsStringClass, '+');
     jsStringToString = compiler.lookupElementIn(jsStringClass, 'toString');
 
-    objectEquals = compiler.lookupElementIn(coreClasses.objectClass, '==');
+    objectEquals = compiler.lookupElementIn(commonElements.objectClass, '==');
   }
 
   ConstructorElement _mapLiteralConstructor;
@@ -811,8 +810,8 @@
 
   MethodElement get objectNoSuchMethod {
     if (_objectNoSuchMethod == null) {
-      _objectNoSuchMethod =
-          coreClasses.objectClass.lookupLocalMember(Identifiers.noSuchMethod_);
+      _objectNoSuchMethod = commonElements.objectClass
+          .lookupLocalMember(Identifiers.noSuchMethod_);
     }
     return _objectNoSuchMethod;
   }
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index cbd3752..2a3244c 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -579,7 +579,7 @@
         // The backend will use a literal list to initialize the entries
         // of the map.
         globalClasses: [
-          helpers.coreClasses.listClass,
+          helpers.commonElements.listClass,
           helpers.mapLiteralClass
         ]);
   }
@@ -673,7 +673,7 @@
 
   BackendImpact get runtimeTypeSupport {
     return _runtimeTypeSupport ??= new BackendImpact(
-        globalClasses: [helpers.coreClasses.listClass],
+        globalClasses: [helpers.commonElements.listClass],
         globalUses: [helpers.setRuntimeTypeInfo, helpers.getRuntimeTypeInfo],
         otherImpacts: [getRuntimeTypeArgument, computeSignature]);
   }
@@ -684,7 +684,7 @@
     return _deferredLoading ??=
         new BackendImpact(globalUses: [helpers.checkDeferredIsLoaded],
             // Also register the types of the arguments passed to this method.
-            globalClasses: [helpers.coreClasses.stringClass]);
+            globalClasses: [helpers.commonElements.stringClass]);
   }
 
   BackendImpact _noSuchMethodSupport;
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
index 08174df..ee445b3 100644
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
@@ -8,7 +8,7 @@
 import '../constant_system_dart.dart';
 import '../constants/constant_system.dart';
 import '../constants/values.dart';
-import '../core_types.dart' show CoreTypes;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../elements/elements.dart' show ClassElement, FieldElement;
 import '../tree/dartstring.dart' show DartString, LiteralDartString;
@@ -334,7 +334,8 @@
     // integer type check is Math.floor, which will return true only
     // for real integers, and our double type check is 'typeof number'
     // which will return true for both integers and doubles.
-    if (s == types.coreTypes.intType && t == types.coreTypes.doubleType) {
+    if (s == types.commonElements.intType &&
+        t == types.commonElements.doubleType) {
       return true;
     }
     return types.isSubtype(s, t);
@@ -343,7 +344,7 @@
   MapConstantValue createMap(Compiler compiler, InterfaceType sourceType,
       List<ConstantValue> keys, List<ConstantValue> values) {
     JavaScriptBackend backend = compiler.backend;
-    CoreTypes coreTypes = compiler.coreTypes;
+    CommonElements commonElements = compiler.commonElements;
 
     bool onlyStringKeys = true;
     ConstantValue protoValue = null;
@@ -364,9 +365,9 @@
     bool hasProtoKey = (protoValue != null);
     DartType keysType;
     if (sourceType.treatAsRaw) {
-      keysType = coreTypes.listType();
+      keysType = commonElements.listType();
     } else {
-      keysType = coreTypes.listType(sourceType.typeArguments.first);
+      keysType = commonElements.listType(sourceType.typeArguments.first);
     }
     ListConstantValue keysList = new ListConstantValue(keysType, keys);
     String className = onlyStringKeys
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index da79b0e..55fda27 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -9,49 +9,33 @@
 import '../cache_strategy.dart' show CacheStrategy;
 import '../common/backend_api.dart' show Backend;
 import '../common/codegen.dart' show CodegenWorkItem;
-import '../common/names.dart' show Identifiers;
 import '../common/tasks.dart' show CompilerTask;
 import '../common/work.dart' show WorkItem;
 import '../common.dart';
 import '../compiler.dart' show Compiler;
 import '../dart_types.dart' show DartType, InterfaceType;
-import '../dump_info.dart';
-import '../elements/elements.dart'
-    show
-        ClassElement,
-        Element,
-        Entity,
-        FunctionElement,
-        MemberElement,
-        MethodElement,
-        TypedElement;
+import '../elements/elements.dart' show Entity, MemberElement, TypedElement;
 import '../elements/entities.dart';
 import '../enqueue.dart';
-import '../js/js.dart' as js;
 import '../native/native.dart' as native;
 import '../options.dart';
 import '../types/types.dart' show TypeMaskStrategy;
-import '../universe/selector.dart' show Selector;
 import '../universe/world_builder.dart';
 import '../universe/use.dart'
     show DynamicUse, StaticUse, StaticUseKind, TypeUse, TypeUseKind;
 import '../universe/world_impact.dart'
     show ImpactUseCase, WorldImpact, WorldImpactVisitor;
+import '../util/enumset.dart';
 import '../util/util.dart' show Setlet;
-import '../world.dart';
 
 /// [Enqueuer] which is specific to code generation.
 class CodegenEnqueuer extends EnqueuerImpl {
   final String name;
   final EnqueuerStrategy strategy;
-  final Map<String, Set<Element>> _instanceMembersByName =
-      new Map<String, Set<Element>>();
-  final Map<String, Set<Element>> _instanceFunctionsByName =
-      new Map<String, Set<Element>>();
-  final Set<ClassElement> _processedClasses = new Set<ClassElement>();
-  Set<ClassElement> _recentClasses = new Setlet<ClassElement>();
-  final CodegenWorldBuilderImpl _universe =
-      new CodegenWorldBuilderImpl(const TypeMaskStrategy());
+
+  Set<ClassEntity> _recentClasses = new Setlet<ClassEntity>();
+  final CodegenWorldBuilderImpl _universe;
+  final WorkItemBuilder _workItemBuilder;
 
   bool queueIsClosed = false;
   final CompilerTask task;
@@ -62,73 +46,60 @@
   WorldImpactVisitor _impactVisitor;
 
   final Queue<WorkItem> _queue = new Queue<WorkItem>();
-  final Map<Element, js.Expression> generatedCode = <Element, js.Expression>{};
 
-  final Set<Element> newlyEnqueuedElements;
+  /// All declaration elements that have been processed by codegen.
+  final Set<Entity> _processedEntities = new Set<Entity>();
+
+  final Set<Entity> newlyEnqueuedElements;
 
   final Set<DynamicUse> newlySeenSelectors;
 
-  bool _enabledNoSuchMethod = false;
-
   static const ImpactUseCase IMPACT_USE =
       const ImpactUseCase('CodegenEnqueuer');
 
   CodegenEnqueuer(this.task, CacheStrategy cacheStrategy, Backend backend,
-      this._options, this.strategy)
-      : newlyEnqueuedElements = cacheStrategy.newSet(),
+      CompilerOptions options, this.strategy)
+      : _universe =
+            new CodegenWorldBuilderImpl(backend, const TypeMaskStrategy()),
+        _workItemBuilder = new CodegenWorkItemBuilder(backend, options),
+        newlyEnqueuedElements = cacheStrategy.newSet(),
         newlySeenSelectors = cacheStrategy.newSet(),
         nativeEnqueuer = backend.nativeCodegenEnqueuer(),
         this._backend = backend,
+        this._options = options,
         this.name = 'codegen enqueuer' {
     _impactVisitor = new EnqueuerImplImpactVisitor(this);
   }
 
   CodegenWorldBuilder get universe => _universe;
 
-  // TODO(johnniwinther): Remove these hacks:
-  ClosedWorld get _world =>
-      _backend.compiler.resolverWorld.closedWorldForTesting;
-  DumpInfoTask get _dumpInfoTask => _backend.compiler.dumpInfoTask;
-
   bool get queueIsEmpty => _queue.isEmpty;
 
   /// Returns [:true:] if this enqueuer is the resolution enqueuer.
   bool get isResolutionQueue => false;
 
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [element] must be a declaration element.
-   */
-  void _addToWorkList(Element element) {
-    assert(invariant(element, element.isDeclaration));
-    // Don't generate code for foreign elements.
-    if (_backend.isForeign(element)) return;
+  /// Create a [WorkItem] for [entity] and add it to the work list if it has not
+  /// already been processed.
+  void _addToWorkList(MemberEntity entity) {
+    if (_processedEntities.contains(entity)) return;
 
-    // Codegen inlines field initializers. It only needs to generate
-    // code for checked setters.
-    if (element.isField && element.isInstanceMember) {
-      if (!_options.enableTypeAssertions ||
-          element.enclosingElement.isClosure) {
-        return;
-      }
-    }
+    WorkItem workItem = _workItemBuilder.createWorkItem(entity);
+    if (workItem == null) return;
 
-    if (_options.hasIncrementalSupport && !isProcessed(element)) {
-      newlyEnqueuedElements.add(element);
+    if (_options.hasIncrementalSupport) {
+      newlyEnqueuedElements.add(entity);
     }
 
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(
-          element, "Codegen work list is closed. Trying to add $element");
+          entity, "Codegen work list is closed. Trying to add $entity");
     }
-    _queue.add(new CodegenWorkItem(_backend, element));
-    // TODO(sigmund): add other missing dependencies (internals, selectors
-    // enqueued after allocations).
-    _dumpInfoTask.registerDependency(element);
+
+    applyImpact(_backend.registerUsedElement(entity, forResolution: false));
+    _queue.add(workItem);
   }
 
-  void applyImpact(WorldImpact worldImpact, {Element impactSource}) {
+  void applyImpact(WorldImpact worldImpact, {var impactSource}) {
     if (worldImpact.isEmpty) return;
     impactStrategy.visitImpact(
         impactSource, worldImpact, _impactVisitor, impactUse);
@@ -137,22 +108,12 @@
   void _registerInstantiatedType(InterfaceType type,
       {bool mirrorUsage: false, bool nativeUsage: false}) {
     task.measure(() {
-      ClassElement cls = type.element;
-      bool isNative = _backend.isNative(cls);
-      _universe.registerTypeInstantiation(type,
-          isNative: isNative,
-          byMirrors: mirrorUsage, onImplemented: (ClassElement cls) {
-        applyImpact(
-            _backend.registerImplementedClass(cls, forResolution: false));
-      });
+      _universe.registerTypeInstantiation(type, _applyClassUse,
+          byMirrors: mirrorUsage);
       if (nativeUsage) {
         nativeEnqueuer.onInstantiatedType(type);
       }
       _backend.registerInstantiatedType(type);
-      // TODO(johnniwinther): Share this reasoning with [Universe].
-      if (!cls.isAbstract || isNative || mirrorUsage) {
-        _processInstantiatedClass(cls);
-      }
     });
   }
 
@@ -160,225 +121,65 @@
     return strategy.checkEnqueuerConsistency(this);
   }
 
-  void checkClass(ClassElement cls) {
-    cls.implementation.forEachMember(processInstantiatedClassMember);
-  }
-
-  void processInstantiatedClassMember(ClassElement cls, Element member) {
-    assert(invariant(member, member.isDeclaration));
-    if (isProcessed(member)) return;
-    if (!member.isInstanceMember) return;
-    String memberName = member.name;
-
-    if (member.isField) {
-      // The obvious thing to test here would be "member.isNative",
-      // however, that only works after metadata has been parsed/analyzed,
-      // and that may not have happened yet.
-      // So instead we use the enclosing class, which we know have had
-      // its metadata parsed and analyzed.
-      // Note: this assumes that there are no non-native fields on native
-      // classes, which may not be the case when a native class is subclassed.
-      if (_backend.isNative(cls)) {
-        if (_universe.hasInvokedGetter(member, _world) ||
-            _universe.hasInvocation(member, _world)) {
-          _addToWorkList(member);
-          return;
-        } else if (universe.hasInvokedSetter(member, _world)) {
-          _addToWorkList(member);
-          return;
-        }
-        // Native fields need to go into instanceMembersByName as they
-        // are virtual instantiation points and escape points.
-      } else {
-        // All field initializers must be resolved as they could
-        // have an observable side-effect (and cannot be tree-shaken
-        // away).
-        _addToWorkList(member);
-        return;
-      }
-    } else if (member.isFunction) {
-      FunctionElement function = member;
-      if (function.name == Identifiers.noSuchMethod_) {
-        _registerNoSuchMethod(function);
-      }
-      if (function.name == Identifiers.call && !cls.typeVariables.isEmpty) {
-        _registerCallMethodWithFreeTypeVariables(function);
-      }
-      // If there is a property access with the same name as a method we
-      // need to emit the method.
-      if (_universe.hasInvokedGetter(function, _world)) {
-        _registerClosurizedMember(function);
-        _addToWorkList(function);
-        return;
-      }
-      _registerInstanceMethod(function);
-      if (_universe.hasInvocation(function, _world)) {
-        _addToWorkList(function);
-        return;
-      }
-    } else if (member.isGetter) {
-      FunctionElement getter = member;
-      if (_universe.hasInvokedGetter(getter, _world)) {
-        _addToWorkList(getter);
-        return;
-      }
-      // We don't know what selectors the returned closure accepts. If
-      // the set contains any selector we have to assume that it matches.
-      if (_universe.hasInvocation(getter, _world)) {
-        _addToWorkList(getter);
-        return;
-      }
-    } else if (member.isSetter) {
-      FunctionElement setter = member;
-      if (_universe.hasInvokedSetter(setter, _world)) {
-        _addToWorkList(setter);
-        return;
-      }
-    }
-
-    // The element is not yet used. Add it to the list of instance
-    // members to still be processed.
-    _instanceMembersByName
-        .putIfAbsent(memberName, () => new Set<Element>())
-        .add(member);
-  }
-
-  // Store the member in [instanceFunctionsByName] to catch
-  // getters on the function.
-  void _registerInstanceMethod(MethodElement element) {
-    _instanceFunctionsByName
-        .putIfAbsent(element.name, () => new Set<Element>())
-        .add(element);
-  }
-
-  void _processInstantiatedClass(ClassElement cls) {
-    task.measure(() {
-      if (_processedClasses.contains(cls)) return;
-
-      void processClass(ClassElement superclass) {
-        if (_processedClasses.contains(superclass)) return;
-        // TODO(johnniwinther): Re-insert this invariant when unittests don't
-        // fail. There is already a similar invariant on the members.
-        /*assert(invariant(superclass,
-              superclass.isClosure ||
-              _compiler.enqueuer.resolution.isClassProcessed(superclass),
-              message: "Class $superclass has not been "
-                       "processed in resolution."));
-        */
-
-        _processedClasses.add(superclass);
-        _recentClasses.add(superclass);
-        superclass.implementation.forEachMember(processInstantiatedClassMember);
-        // We only tell the backend once that [superclass] was instantiated, so
-        // any additional dependencies must be treated as global
-        // dependencies.
-        applyImpact(_backend.registerInstantiatedClass(superclass,
-            forResolution: false));
-      }
-
-      ClassElement superclass = cls;
-      while (superclass != null) {
-        processClass(superclass);
-        superclass = superclass.superclass;
+  void checkClass(ClassEntity cls) {
+    _universe.processClassMembers(cls, (MemberEntity member, useSet) {
+      if (useSet.isNotEmpty) {
+        _backend.compiler.reporter.internalError(member,
+            'Unenqueued use of $member: ${useSet.iterable(MemberUse.values)}');
       }
     });
   }
 
+  /// Callback for applying the use of a [cls].
+  void _applyClassUse(ClassEntity cls, EnumSet<ClassUse> useSet) {
+    if (useSet.contains(ClassUse.INSTANTIATED)) {
+      _recentClasses.add(cls);
+      _universe.processClassMembers(cls, _applyMemberUse);
+      // We only tell the backend once that [cls] was instantiated, so
+      // any additional dependencies must be treated as global
+      // dependencies.
+      applyImpact(
+          _backend.registerInstantiatedClass(cls, forResolution: false));
+    }
+    if (useSet.contains(ClassUse.IMPLEMENTED)) {
+      applyImpact(_backend.registerImplementedClass(cls, forResolution: false));
+    }
+  }
+
+  /// Callback for applying the use of a [member].
+  void _applyMemberUse(Entity member, EnumSet<MemberUse> useSet) {
+    if (useSet.contains(MemberUse.NORMAL)) {
+      _addToWorkList(member);
+    }
+    if (useSet.contains(MemberUse.CLOSURIZE_INSTANCE)) {
+      _registerClosurizedMember(member);
+    }
+    if (useSet.contains(MemberUse.CLOSURIZE_STATIC)) {
+      applyImpact(_backend.registerGetOfStaticFunction());
+    }
+  }
+
   void processDynamicUse(DynamicUse dynamicUse) {
     task.measure(() {
-      if (_universe.registerDynamicUse(dynamicUse)) {
-        _handleUnseenSelector(dynamicUse);
+      if (_universe.registerDynamicUse(dynamicUse, _applyMemberUse)) {
+        if (_options.hasIncrementalSupport) {
+          newlySeenSelectors.add(dynamicUse);
+        }
       }
     });
   }
 
-  void _processSet(
-      Map<String, Set<Element>> map, String memberName, bool f(Element e)) {
-    Set<Element> members = map[memberName];
-    if (members == null) return;
-    // [f] might add elements to [: map[memberName] :] during the loop below
-    // so we create a new list for [: map[memberName] :] and prepend the
-    // [remaining] members after the loop.
-    map[memberName] = new Set<Element>();
-    Set<Element> remaining = new Set<Element>();
-    for (Element member in members) {
-      if (!f(member)) remaining.add(member);
-    }
-    map[memberName].addAll(remaining);
-  }
-
-  void _processInstanceMembers(String n, bool f(Element e)) {
-    _processSet(_instanceMembersByName, n, f);
-  }
-
-  void _processInstanceFunctions(String n, bool f(Element e)) {
-    _processSet(_instanceFunctionsByName, n, f);
-  }
-
-  void _handleUnseenSelector(DynamicUse dynamicUse) {
-    if (_options.hasIncrementalSupport) {
-      newlySeenSelectors.add(dynamicUse);
-    }
-    Selector selector = dynamicUse.selector;
-    String methodName = selector.name;
-    _processInstanceMembers(methodName, (Element member) {
-      if (dynamicUse.appliesUnnamed(member, _world)) {
-        if (member.isFunction && selector.isGetter) {
-          _registerClosurizedMember(member);
-        }
-        _addToWorkList(member);
-        return true;
-      }
-      return false;
-    });
-    if (selector.isGetter) {
-      _processInstanceFunctions(methodName, (Element member) {
-        if (dynamicUse.appliesUnnamed(member, _world)) {
-          _registerClosurizedMember(member);
-          return true;
-        }
-        return false;
-      });
-    }
-  }
-
   void processStaticUse(StaticUse staticUse) {
-    Element element = staticUse.element;
-    assert(invariant(element, element.isDeclaration,
-        message: "Element ${element} is not the declaration."));
-    _universe.registerStaticUse(staticUse);
-    applyImpact(_backend.registerUsedElement(element, forResolution: false));
-    bool addElement = true;
+    _universe.registerStaticUse(staticUse, _applyMemberUse);
     switch (staticUse.kind) {
-      case StaticUseKind.STATIC_TEAR_OFF:
-        applyImpact(_backend.registerGetOfStaticFunction());
-        break;
-      case StaticUseKind.FIELD_GET:
-      case StaticUseKind.FIELD_SET:
-      case StaticUseKind.CLOSURE:
-        // TODO(johnniwinther): Avoid this. Currently [FIELD_GET] and
-        // [FIELD_SET] contains [BoxFieldElement]s which we cannot enqueue.
-        // Also [CLOSURE] contains [LocalFunctionElement] which we cannot
-        // enqueue.
-        addElement = false;
-        break;
-      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:
         processTypeUse(new TypeUse.instantiation(staticUse.type));
         break;
-      case StaticUseKind.DIRECT_INVOKE:
-        _registerInstanceMethod(staticUse.element);
+      default:
         break;
     }
-    if (addElement) {
-      _addToWorkList(element);
-    }
   }
 
   void processTypeUse(TypeUse typeUse) {
@@ -416,11 +217,6 @@
     assert(!type.isTypeVariable || !type.element.enclosingElement.isTypedef);
   }
 
-  void _registerCallMethodWithFreeTypeVariables(Element element) {
-    applyImpact(_backend.registerCallMethodWithFreeTypeVariables(element,
-        forResolution: false));
-  }
-
   void _registerClosurizedMember(TypedElement element) {
     assert(element.isInstanceMember);
     if (element.type.containsTypeVariables) {
@@ -435,10 +231,11 @@
       while (_queue.isNotEmpty) {
         // TODO(johnniwinther): Find an optimal process order.
         WorkItem work = _queue.removeLast();
-        if (!isProcessed(work.element)) {
+        if (!_processedEntities.contains(work.element)) {
           strategy.processWorkItem(f, work);
           // TODO(johnniwinther): Register the processed element here. This
           // is currently a side-effect of calling `work.run`.
+          _processedEntities.add(work.element);
         }
       }
       List recents = _recentClasses.toList(growable: false);
@@ -453,12 +250,12 @@
   /// the [recentClasses] have been processed and may be cleared. If [false] is
   /// returned, [_onQueueEmpty] will be called once the queue is empty again (or
   /// still empty) and [recentClasses] will be a superset of the current value.
-  bool _onQueueEmpty(Iterable<ClassElement> recentClasses) {
+  bool _onQueueEmpty(Iterable<ClassEntity> recentClasses) {
     return _backend.onQueueEmpty(this, recentClasses);
   }
 
   void logSummary(log(message)) {
-    log('Compiled ${generatedCode.length} methods.');
+    log('Compiled ${_processedEntities.length} methods.');
     nativeEnqueuer.logSummary(log);
   }
 
@@ -466,40 +263,41 @@
 
   ImpactUseCase get impactUse => IMPACT_USE;
 
-  bool isProcessed(Element member) =>
-      member.isAbstract || generatedCode.containsKey(member);
-
-  void _registerNoSuchMethod(Element element) {
-    if (!_enabledNoSuchMethod && _backend.enabledNoSuchMethod) {
-      applyImpact(_backend.enableNoSuchMethod());
-      _enabledNoSuchMethod = true;
-    }
-  }
-
-  void forgetEntity(Element element, Compiler compiler) {
-    _universe.forgetElement(element, compiler);
-    _processedClasses.remove(element);
-    _instanceMembersByName[element.name]?.remove(element);
-    _instanceFunctionsByName[element.name]?.remove(element);
-    generatedCode.remove(element);
-    if (element is MemberElement) {
-      for (Element closure in element.nestedClosures) {
-        generatedCode.remove(closure);
-        removeFromSet(_instanceMembersByName, closure);
-        removeFromSet(_instanceFunctionsByName, closure);
-      }
-    }
+  void forgetEntity(Entity entity, Compiler compiler) {
+    _universe.forgetElement(entity, compiler);
+    _processedEntities.remove(entity);
   }
 
   @override
-  Iterable<Entity> get processedEntities => generatedCode.keys;
+  Iterable<Entity> get processedEntities => _processedEntities;
 
   @override
-  Iterable<ClassEntity> get processedClasses => _processedClasses;
+  Iterable<ClassEntity> get processedClasses => _universe.processedClasses;
 }
 
-void removeFromSet(Map<String, Set<Element>> map, Element element) {
-  Set<Element> set = map[element.name];
-  if (set == null) return;
-  set.remove(element);
+/// Builder that creates the work item necessary for the code generation of a
+/// [MemberElement].
+class CodegenWorkItemBuilder extends WorkItemBuilder {
+  Backend _backend;
+  CompilerOptions _options;
+
+  CodegenWorkItemBuilder(this._backend, this._options);
+
+  @override
+  WorkItem createWorkItem(MemberElement element) {
+    assert(invariant(element, element.isDeclaration));
+    // Don't generate code for foreign elements.
+    if (_backend.isForeign(element)) return null;
+    if (element.isAbstract) return null;
+
+    // Codegen inlines field initializers. It only needs to generate
+    // code for checked setters.
+    if (element.isField && element.isInstanceMember) {
+      if (!_options.enableTypeAssertions ||
+          element.enclosingElement.isClosure) {
+        return null;
+      }
+    }
+    return new CodegenWorkItem(_backend, element);
+  }
 }
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index c03056a..717cbc6 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -13,7 +13,7 @@
 import '../common/names.dart' show Identifiers, Selectors;
 import '../compiler.dart' show Compiler;
 import '../constants/values.dart';
-import '../core_types.dart' show CoreClasses;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../diagnostics/invariant.dart' show DEBUG_MODE;
 import '../elements/elements.dart';
@@ -475,7 +475,7 @@
 
   DiagnosticReporter get reporter => backend.reporter;
 
-  CoreClasses get coreClasses => closedWorld.coreClasses;
+  CommonElements get commonElements => closedWorld.commonElements;
 
   String get deferredTypesName => 'deferredTypes';
   String get isolateName => 'Isolate';
@@ -550,11 +550,11 @@
       case JsGetName.IS_INDEXABLE_FIELD_NAME:
         return operatorIs(helpers.jsIndexingBehaviorInterface);
       case JsGetName.NULL_CLASS_TYPE_NAME:
-        return runtimeTypeName(coreClasses.nullClass);
+        return runtimeTypeName(commonElements.nullClass);
       case JsGetName.OBJECT_CLASS_TYPE_NAME:
-        return runtimeTypeName(coreClasses.objectClass);
+        return runtimeTypeName(commonElements.objectClass);
       case JsGetName.FUNCTION_CLASS_TYPE_NAME:
-        return runtimeTypeName(coreClasses.functionClass);
+        return runtimeTypeName(commonElements.functionClass);
       default:
         reporter.reportErrorMessage(node, MessageKind.GENERIC,
             {'text': 'Error: Namer has no name for "$name".'});
@@ -1253,7 +1253,7 @@
 
   String suffixForGetInterceptor(Iterable<ClassEntity> classes) {
     String abbreviate(ClassElement cls) {
-      if (cls == coreClasses.objectClass) return "o";
+      if (cls == commonElements.objectClass) return "o";
       if (cls == helpers.jsStringClass) return "s";
       if (cls == helpers.jsArrayClass) return "a";
       if (cls == helpers.jsDoubleClass) return "d";
diff --git a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
index a318872..00b9ac7 100644
--- a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
+++ b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
@@ -187,7 +187,7 @@
 
   bool isDefaultNoSuchMethodImplementation(FunctionElement element) {
     ClassElement classElement = element.enclosingClass;
-    return classElement == _compiler.coreClasses.objectClass ||
+    return classElement == _compiler.commonElements.objectClass ||
         classElement == _backend.helpers.jsInterceptorClass ||
         classElement == _backend.helpers.jsNullClass;
   }
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index e404cdd..dcf964b 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -263,7 +263,7 @@
     // TODO(karlklose): make this dependency visible from code.
     if (backend.helpers.jsArrayClass != null) {
       registerRtiDependency(
-          backend.helpers.jsArrayClass, compiler.coreClasses.listClass);
+          backend.helpers.jsArrayClass, compiler.commonElements.listClass);
     }
     // Compute the set of all classes and methods that need runtime type
     // information.
@@ -911,11 +911,6 @@
       return unaliasedType.accept(this, null);
     }
   }
-
-  visitStatementType(StatementType type, _) {
-    reporter.internalError(
-        NO_LOCATION_SPANNABLE, 'Unexpected type: $type (${type.kind}).');
-  }
 }
 
 class TypeCheckMapping implements TypeChecks {
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 1affdaf..c1b7824 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -15,7 +15,7 @@
 import '../../common/names.dart' show Names;
 import '../../compiler.dart' show Compiler;
 import '../../constants/values.dart';
-import '../../core_types.dart' show CoreClasses;
+import '../../core_types.dart' show CommonElements;
 import '../../dart_types.dart' show DartType;
 import '../../deferred_load.dart' show OutputUnit;
 import '../../elements/elements.dart'
@@ -127,7 +127,7 @@
   ConstantEmitter constantEmitter;
   NativeEmitter get nativeEmitter => task.nativeEmitter;
   TypeTestRegistry get typeTestRegistry => task.typeTestRegistry;
-  CoreClasses get coreClasses => compiler.coreClasses;
+  CommonElements get commonElements => compiler.commonElements;
 
   // The full code that is written to each hunk part-file.
   Map<OutputUnit, CodeOutput> outputBuffers = new Map<OutputUnit, CodeOutput>();
@@ -367,7 +367,7 @@
     switch (builtin) {
       case JsBuiltin.dartObjectConstructor:
         return jsAst.js
-            .expressionTemplateYielding(typeAccess(coreClasses.objectClass));
+            .expressionTemplateYielding(typeAccess(commonElements.objectClass));
 
       case JsBuiltin.isCheckPropertyToJsConstructorName:
         int isPrefixLength = namer.operatorIsPrefix.length;
@@ -440,13 +440,13 @@
   /// In minified mode we want to keep the name for the most common core types.
   bool _isNativeTypeNeedingReflectionName(Element element) {
     if (!element.isClass) return false;
-    return (element == coreClasses.intClass ||
-        element == coreClasses.doubleClass ||
-        element == coreClasses.numClass ||
-        element == coreClasses.stringClass ||
-        element == coreClasses.boolClass ||
-        element == coreClasses.nullClass ||
-        element == coreClasses.listClass);
+    return (element == commonElements.intClass ||
+        element == commonElements.doubleClass ||
+        element == commonElements.numClass ||
+        element == commonElements.stringClass ||
+        element == commonElements.boolClass ||
+        element == commonElements.nullClass ||
+        element == commonElements.listClass);
   }
 
   /// Returns the "reflection name" of an [Element] or [Selector].
@@ -1237,8 +1237,8 @@
       // We can be pretty sure that the objectClass is initialized, since
       // typedefs are only emitted with reflection, which requires lots of
       // classes.
-      assert(coreClasses.objectClass != null);
-      builder.superName = namer.className(coreClasses.objectClass);
+      assert(commonElements.objectClass != null);
+      builder.superName = namer.className(commonElements.objectClass);
       jsAst.Node declaration = builder.toObjectInitializer();
       jsAst.Name mangledName = namer.globalPropertyName(typedef);
       String reflectionName = getReflectionName(typedef, mangledName);
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
index 9bdf146..ad1ef5b 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
@@ -162,7 +162,7 @@
     }
     // Startup code that loops over the method names and puts handlers on the
     // Object class to catch noSuchMethod invocations.
-    ClassElement objectClass = compiler.coreClasses.objectClass;
+    ClassElement objectClass = compiler.commonElements.objectClass;
     jsAst.Expression createInvocationMirror = backend.emitter
         .staticFunctionAccess(backend.helpers.createInvocationMirror);
     if (useDiffEncoding) {
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
index 68c2451..24a66e9 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
@@ -129,13 +129,13 @@
     'enabledJsInterop': backend.jsInteropAnalysis.enabledJsInterop,
     'jsInteropBoostrap': backend.jsInteropAnalysis.buildJsInteropBootstrap(),
     'isInterceptorClass': namer.operatorIs(backend.helpers.jsInterceptorClass),
-    'isObject': namer.operatorIs(compiler.coreClasses.objectClass),
+    'isObject': namer.operatorIs(compiler.commonElements.objectClass),
     'specProperty': js.string(namer.nativeSpecProperty),
     'trivialNsmHandlers': emitter.buildTrivialNsmHandlers(),
     'hasRetainedMetadata': backend.hasRetainedMetadata,
     'types': typesAccess,
-    'objectClassName':
-        js.quoteName(namer.runtimeTypeName(compiler.coreClasses.objectClass)),
+    'objectClassName': js
+        .quoteName(namer.runtimeTypeName(compiler.commonElements.objectClass)),
     'needsStructuredMemberInfo': emitter.needsStructuredMemberInfo,
     'usesMangledNames': compiler.commonElements.mirrorsLibrary != null ||
         backend.hasFunctionApplySupport,
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 9a7d2cc..a6255d3 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -162,7 +162,8 @@
       }''',
           [
             interceptorFor(helpers.jsJavaScriptFunctionClass),
-            backend.emitter.constructorAccess(compiler.coreClasses.objectClass),
+            backend.emitter
+                .constructorAccess(compiler.commonElements.objectClass),
             backend.emitter
                 .staticFunctionAccess(helpers.getNativeInterceptorMethod)
           ]));
@@ -171,7 +172,8 @@
       if (compiler.codegenWorld.directlyInstantiatedClasses
           .contains(jsUnknown)) {
         statements.add(js.statement('if (!(receiver instanceof #)) return #;', [
-          backend.emitter.constructorAccess(compiler.coreClasses.objectClass),
+          backend.emitter
+              .constructorAccess(compiler.commonElements.objectClass),
           interceptorFor(jsUnknown)
         ]));
       }
diff --git a/pkg/compiler/lib/src/js_emitter/js_emitter.dart b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
index 5d715a3..fb87380 100644
--- a/pkg/compiler/lib/src/js_emitter/js_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
@@ -15,7 +15,7 @@
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler.dart' show Compiler;
 import '../constants/values.dart';
-import '../core_types.dart' show CoreClasses;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart'
     show
         DartType,
diff --git a/pkg/compiler/lib/src/js_emitter/lazy_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/lazy_emitter/emitter.dart
index 3714a08..a38de70 100644
--- a/pkg/compiler/lib/src/js_emitter/lazy_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/lazy_emitter/emitter.dart
@@ -144,7 +144,7 @@
     switch (builtin) {
       case JsBuiltin.dartObjectConstructor:
         return js.js.expressionTemplateYielding(
-            typeAccess(_compiler.coreClasses.objectClass));
+            typeAccess(_compiler.commonElements.objectClass));
 
       case JsBuiltin.isCheckPropertyToJsConstructorName:
         int isPrefixLength = namer.operatorIsPrefix.length;
diff --git a/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
index 53f12e3..8cb0eb1 100644
--- a/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
@@ -22,7 +22,7 @@
 
 import '../../compiler.dart' show Compiler;
 import '../../constants/values.dart' show ConstantValue, FunctionConstantValue;
-import '../../core_types.dart' show CoreClasses;
+import '../../core_types.dart' show CommonElements;
 import '../../elements/elements.dart' show ClassElement, FunctionElement;
 import '../../js/js.dart' as js;
 import '../../js_backend/js_backend.dart'
@@ -342,17 +342,17 @@
   js.Property emitMangledGlobalNames() {
     List<js.Property> names = <js.Property>[];
 
-    CoreClasses coreClasses = compiler.coreClasses;
+    CommonElements commonElements = compiler.commonElements;
     // We want to keep the original names for the most common core classes when
     // calling toString on them.
     List<ClassElement> nativeClassesNeedingUnmangledName = [
-      coreClasses.intClass,
-      coreClasses.doubleClass,
-      coreClasses.numClass,
-      coreClasses.stringClass,
-      coreClasses.boolClass,
-      coreClasses.nullClass,
-      coreClasses.listClass
+      commonElements.intClass,
+      commonElements.doubleClass,
+      commonElements.numClass,
+      commonElements.stringClass,
+      commonElements.boolClass,
+      commonElements.nullClass,
+      commonElements.listClass
     ];
     nativeClassesNeedingUnmangledName.forEach((element) {
       names.add(new js.Property(
diff --git a/pkg/compiler/lib/src/js_emitter/native_emitter.dart b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
index 2e5f457..1f39802 100644
--- a/pkg/compiler/lib/src/js_emitter/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
@@ -83,7 +83,7 @@
     Class jsInterceptorClass = null;
 
     void walk(Class cls) {
-      if (cls.element == compiler.coreClasses.objectClass) {
+      if (cls.element == compiler.commonElements.objectClass) {
         objectClass = cls;
         return;
       }
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
index 5389c2c..8c66d00 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
@@ -45,7 +45,7 @@
 
   BackendHelpers get helpers => backend.helpers;
 
-  CoreClasses get coreClasses => compiler.coreClasses;
+  CommonElements get commonElements => compiler.commonElements;
 
   Collector(this.compiler, this.namer, this.closedWorld, this.rtiNeededClasses,
       this.emitter);
@@ -73,7 +73,7 @@
     Set<ClassElement> unneededClasses = new Set<ClassElement>();
     // The [Bool] class is not marked as abstract, but has a factory
     // constructor that always throws. We never need to emit it.
-    unneededClasses.add(coreClasses.boolClass);
+    unneededClasses.add(commonElements.boolClass);
 
     // Go over specialized interceptors and then constants to know which
     // interceptors are needed.
@@ -89,7 +89,7 @@
     // Add unneeded interceptors to the [unneededClasses] set.
     for (ClassElement interceptor in backend.interceptedClasses) {
       if (!needed.contains(interceptor) &&
-          interceptor != coreClasses.objectClass) {
+          interceptor != commonElements.objectClass) {
         unneededClasses.add(interceptor);
       }
     }
@@ -220,22 +220,22 @@
 
     // TODO(18175, floitsch): remove once issue 18175 is fixed.
     if (neededClasses.contains(helpers.jsIntClass)) {
-      neededClasses.add(coreClasses.intClass);
+      neededClasses.add(commonElements.intClass);
     }
     if (neededClasses.contains(helpers.jsDoubleClass)) {
-      neededClasses.add(coreClasses.doubleClass);
+      neededClasses.add(commonElements.doubleClass);
     }
     if (neededClasses.contains(helpers.jsNumberClass)) {
-      neededClasses.add(coreClasses.numClass);
+      neededClasses.add(commonElements.numClass);
     }
     if (neededClasses.contains(helpers.jsStringClass)) {
-      neededClasses.add(coreClasses.stringClass);
+      neededClasses.add(commonElements.stringClass);
     }
     if (neededClasses.contains(helpers.jsBoolClass)) {
-      neededClasses.add(coreClasses.boolClass);
+      neededClasses.add(commonElements.boolClass);
     }
     if (neededClasses.contains(helpers.jsArrayClass)) {
-      neededClasses.add(coreClasses.listClass);
+      neededClasses.add(commonElements.listClass);
     }
 
     // 4. Finally, sort the classes.
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index fd18152..be27411 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -10,7 +10,7 @@
 import '../../compiler.dart' show Compiler;
 import '../../constants/values.dart'
     show ConstantValue, InterceptorConstantValue;
-import '../../core_types.dart' show CoreClasses;
+import '../../core_types.dart' show CommonElements;
 import '../../dart_types.dart' show DartType, FunctionType, TypedefType;
 import '../../deferred_load.dart' show DeferredLoadTask, OutputUnit;
 import '../../elements/elements.dart'
@@ -327,11 +327,11 @@
   }
 
   void _addJsInteropStubs(LibrariesMap librariesMap) {
-    if (_classes.containsKey(_compiler.coreClasses.objectClass)) {
+    if (_classes.containsKey(_compiler.commonElements.objectClass)) {
       var toStringInvocation = namer.invocationName(Selectors.toString_);
       // TODO(jacobr): register toString as used so that it is always accessible
       // from JavaScript.
-      _classes[_compiler.coreClasses.objectClass].callStubs.add(
+      _classes[_compiler.commonElements.objectClass].callStubs.add(
           _buildStubMethod(new StringBackedName("toString"),
               js.js('function() { return this.#(this) }', toStringInvocation)));
     }
@@ -396,13 +396,13 @@
                   functionType = returnType;
                 } else if (returnType.treatAsDynamic ||
                     _compiler.types.isSubtype(
-                        returnType, backend.coreTypes.functionType)) {
+                        returnType, backend.commonElements.functionType)) {
                   if (returnType.isTypedef) {
                     TypedefType typedef = returnType;
                     // TODO(jacobr): can we just use typdef.unaliased instead?
                     functionType = typedef.element.functionSignature.type;
                   } else {
-                    // Other misc function type such as coreTypes.Function.
+                    // Other misc function type such as commonElements.Function.
                     // Allow any number of arguments.
                     isFunctionLike = true;
                   }
diff --git a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
index 7cffc44..c6365ae 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -35,7 +35,7 @@
 
   JavaScriptBackend get backend => compiler.backend;
   TypeTestRegistry get typeTestRegistry => emitterTask.typeTestRegistry;
-  CoreClasses get coreClasses => compiler.coreClasses;
+  CommonElements get commonElements => compiler.commonElements;
 
   Set<ClassElement> get checkedClasses => typeTestRegistry.checkedClasses;
 
@@ -193,7 +193,7 @@
     bool supertypesNeedSubstitutions = false;
 
     if (superclass != null &&
-        superclass != coreClasses.objectClass &&
+        superclass != commonElements.objectClass &&
         !haveSameTypeVariables(cls, superclass)) {
       // We cannot inherit the generated substitutions, because the type
       // variable layout for this class is different.  Instead we generate
@@ -238,7 +238,7 @@
 
     // A class that defines a `call` method implicitly implements
     // [Function] and needs checks for all typedefs that are used in is-checks.
-    if (checkedClasses.contains(coreClasses.functionClass) ||
+    if (checkedClasses.contains(commonElements.functionClass) ||
         checkedFunctionTypes.isNotEmpty) {
       Element call = cls.lookupLocalMember(Identifiers.call);
       if (call == null) {
@@ -249,9 +249,9 @@
         FunctionElement callFunction = call;
         // A superclass might already implement the Function interface. In such
         // a case, we can avoid emiting the is test here.
-        if (!cls.superclass.implementsFunction(coreClasses)) {
-          _generateInterfacesIsTests(coreClasses.functionClass, generateIsTest,
-              generateSubstitution, generated);
+        if (!cls.superclass.implementsFunction(commonElements)) {
+          _generateInterfacesIsTests(commonElements.functionClass,
+              generateIsTest, generateSubstitution, generated);
         }
         FunctionType callType = callFunction.computeType(compiler.resolution);
         generateFunctionTypeSignature(callFunction, callType);
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
index bac4f1e..617fea3 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
@@ -146,7 +146,7 @@
     switch (builtin) {
       case JsBuiltin.dartObjectConstructor:
         return js.js.expressionTemplateYielding(
-            typeAccess(_compiler.coreClasses.objectClass));
+            typeAccess(_compiler.commonElements.objectClass));
 
       case JsBuiltin.isCheckPropertyToJsConstructorName:
         int isPrefixLength = namer.operatorIsPrefix.length;
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 57e10a2..9f67aa9 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -1140,17 +1140,17 @@
   js.Property emitMangledGlobalNames() {
     List<js.Property> names = <js.Property>[];
 
-    CoreClasses coreClasses = compiler.coreClasses;
+    CommonElements commonElements = compiler.commonElements;
     // We want to keep the original names for the most common core classes when
     // calling toString on them.
     List<ClassElement> nativeClassesNeedingUnmangledName = [
-      coreClasses.intClass,
-      coreClasses.doubleClass,
-      coreClasses.numClass,
-      coreClasses.stringClass,
-      coreClasses.boolClass,
-      coreClasses.nullClass,
-      coreClasses.listClass
+      commonElements.intClass,
+      commonElements.doubleClass,
+      commonElements.numClass,
+      commonElements.stringClass,
+      commonElements.boolClass,
+      commonElements.nullClass,
+      commonElements.listClass
     ];
     // TODO(floitsch): this should probably be on a per-fragment basis.
     nativeClassesNeedingUnmangledName.forEach((element) {
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 046fa6f..8a1bb2a 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -33,7 +33,7 @@
 import '../../common.dart';
 import '../../compiler.dart' show Compiler;
 import '../../constants/values.dart' show ConstantValue, FunctionConstantValue;
-import '../../core_types.dart' show CoreClasses;
+import '../../core_types.dart' show CommonElements;
 import '../../elements/elements.dart' show ClassElement, FunctionElement;
 import '../../hash/sha1.dart' show Hasher;
 import '../../io/code_output.dart';
diff --git a/pkg/compiler/lib/src/kernel/kernel.dart b/pkg/compiler/lib/src/kernel/kernel.dart
index 155f2a0..964854a 100644
--- a/pkg/compiler/lib/src/kernel/kernel.dart
+++ b/pkg/compiler/lib/src/kernel/kernel.dart
@@ -348,9 +348,6 @@
       case TypeKind.INTERFACE:
         return interfaceTypeToIr(type);
 
-      case TypeKind.STATEMENT:
-        throw "Internal error: statement type: $type.";
-
       case TypeKind.TYPEDEF:
         type.computeUnaliased(compiler.resolution);
         return typeToIr(type.unaliased);
diff --git a/pkg/compiler/lib/src/mirrors_used.dart b/pkg/compiler/lib/src/mirrors_used.dart
index 79dac05..3c20fc9 100644
--- a/pkg/compiler/lib/src/mirrors_used.dart
+++ b/pkg/compiler/lib/src/mirrors_used.dart
@@ -251,7 +251,7 @@
       metadata.ensureResolved(compiler.resolution);
       ConstantValue value =
           compiler.constants.getConstantValue(metadata.constant);
-      Element element = value.getType(compiler.coreTypes).element;
+      Element element = value.getType(compiler.commonElements).element;
       if (element == compiler.commonElements.mirrorsUsedClass) {
         result.add(buildUsage(value));
       }
@@ -415,7 +415,7 @@
 
   /// Find the first non-implementation interface of constant.
   DartType apiTypeOf(ConstantValue constant) {
-    DartType type = constant.getType(compiler.coreTypes);
+    DartType type = constant.getType(compiler.commonElements);
     LibraryElement library = type.element.library;
     if (type.isInterfaceType && library.isInternalLibrary) {
       InterfaceType interface = type;
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index e34145a..63ae4e3 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -8,7 +8,7 @@
 import '../compiler.dart' show Compiler;
 import '../constants/expressions.dart';
 import '../constants/values.dart';
-import '../core_types.dart' show CoreTypes;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../elements/elements.dart';
 import '../js/js.dart' as js;
@@ -498,8 +498,12 @@
   }
 
   /// Compute the [NativeBehavior] for a [Send] node calling the 'JS' function.
-  static NativeBehavior ofJsCallSend(Send jsCall, DiagnosticReporter reporter,
-      ParsingContext parsing, CoreTypes coreTypes, ForeignResolver resolver) {
+  static NativeBehavior ofJsCallSend(
+      Send jsCall,
+      DiagnosticReporter reporter,
+      ParsingContext parsing,
+      CommonElements commonElements,
+      ForeignResolver resolver) {
     var argNodes = jsCall.arguments;
     if (argNodes.isEmpty || argNodes.tail.isEmpty) {
       reporter.reportErrorMessage(jsCall, MessageKind.WRONG_ARGUMENT_FOR_JS);
@@ -524,7 +528,7 @@
     String codeString = codeArgument.dartString.slowToString();
 
     return ofJsCall(specString, codeString, _typeLookup(specArgument, resolver),
-        specArgument, reporter, coreTypes);
+        specArgument, reporter, commonElements);
   }
 
   /// Compute the [NativeBehavior] for a call to the 'JS' function with the
@@ -535,7 +539,7 @@
       TypeLookup lookupType,
       Spannable spannable,
       DiagnosticReporter reporter,
-      CoreTypes coreTypes) {
+      CommonElements commonElements) {
     // The first argument of a JS-call is a string encoding various attributes
     // of the code.
     //
@@ -576,8 +580,8 @@
         lookupType: lookupType,
         typesReturned: behavior.typesReturned,
         typesInstantiated: behavior.typesInstantiated,
-        objectType: coreTypes.objectType,
-        nullType: coreTypes.nullType);
+        objectType: commonElements.objectType,
+        nullType: commonElements.nullType);
 
     if (!sideEffectsAreEncodedInSpecString) {
       new SideEffectsVisitor(behavior.sideEffects)
@@ -597,7 +601,7 @@
       String specString,
       TypeLookup lookupType,
       DiagnosticReporter reporter,
-      CoreTypes coreTypes,
+      CommonElements commonElements,
       {List<String> validTags}) {
     void setSideEffects(SideEffects newEffects) {
       behavior.sideEffects.setTo(newEffects);
@@ -609,14 +613,14 @@
         setSideEffects: setSideEffects,
         typesReturned: behavior.typesReturned,
         typesInstantiated: behavior.typesInstantiated,
-        objectType: coreTypes.objectType,
-        nullType: coreTypes.nullType);
+        objectType: commonElements.objectType,
+        nullType: commonElements.nullType);
   }
 
   static NativeBehavior ofJsBuiltinCallSend(
       Send jsBuiltinCall,
       DiagnosticReporter reporter,
-      CoreTypes coreTypes,
+      CommonElements commonElements,
       ForeignResolver resolver) {
     NativeBehavior behavior = new NativeBehavior();
     behavior.sideEffects.setTo(new SideEffects());
@@ -650,7 +654,7 @@
     String specString = specLiteral.dartString.slowToString();
 
     return ofJsBuiltinCall(specString, _typeLookup(jsBuiltinCall, resolver),
-        jsBuiltinCall, reporter, coreTypes);
+        jsBuiltinCall, reporter, commonElements);
   }
 
   static NativeBehavior ofJsBuiltinCall(
@@ -658,18 +662,18 @@
       TypeLookup lookupType,
       Spannable spannable,
       DiagnosticReporter reporter,
-      CoreTypes coreTypes) {
+      CommonElements commonElements) {
     NativeBehavior behavior = new NativeBehavior();
     behavior.sideEffects.setTo(new SideEffects());
     _fillNativeBehaviorOfBuiltinOrEmbeddedGlobal(
-        behavior, spannable, specString, lookupType, reporter, coreTypes);
+        behavior, spannable, specString, lookupType, reporter, commonElements);
     return behavior;
   }
 
   static NativeBehavior ofJsEmbeddedGlobalCallSend(
       Send jsEmbeddedGlobalCall,
       DiagnosticReporter reporter,
-      CoreTypes coreTypes,
+      CommonElements commonElements,
       ForeignResolver resolver) {
     NativeBehavior behavior = new NativeBehavior();
     // TODO(sra): Allow the use site to override these defaults.
@@ -717,7 +721,7 @@
         _typeLookup(jsEmbeddedGlobalCall, resolver),
         jsEmbeddedGlobalCall,
         reporter,
-        coreTypes);
+        commonElements);
   }
 
   static NativeBehavior ofJsEmbeddedGlobalCall(
@@ -725,7 +729,7 @@
       TypeLookup lookupType,
       Spannable spannable,
       DiagnosticReporter reporter,
-      CoreTypes coreTypes) {
+      CommonElements commonElements) {
     NativeBehavior behavior = new NativeBehavior();
     // TODO(sra): Allow the use site to override these defaults.
     // Embedded globals are usually pre-computed data structures or JavaScript
@@ -733,7 +737,7 @@
     behavior.sideEffects.setTo(new SideEffects.empty());
     behavior.throwBehavior = NativeThrowBehavior.NEVER;
     _fillNativeBehaviorOfBuiltinOrEmbeddedGlobal(
-        behavior, spannable, specString, lookupType, reporter, coreTypes,
+        behavior, spannable, specString, lookupType, reporter, commonElements,
         validTags: ['returns', 'creates']);
     return behavior;
   }
@@ -784,7 +788,7 @@
             : const DynamicType());
     if (!type.returnType.isVoid) {
       // Declared types are nullable.
-      behavior.typesReturned.add(compiler.coreTypes.nullType);
+      behavior.typesReturned.add(compiler.commonElements.nullType);
     }
     behavior._capture(type, compiler.resolution,
         isInterop: isJsInterop, compiler: compiler);
@@ -839,7 +843,7 @@
             ? type
             : const DynamicType());
     // Declared types are nullable.
-    behavior.typesReturned.add(resolution.coreTypes.nullType);
+    behavior.typesReturned.add(resolution.commonElements.nullType);
     behavior._capture(type, resolution,
         isInterop: isJsInterop, compiler: compiler);
     behavior._overrideWithAnnotations(
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index bd37b4c..e5405ba 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -9,7 +9,7 @@
 import '../common/resolution.dart' show Resolution;
 import '../compiler.dart' show Compiler;
 import '../constants/values.dart';
-import '../core_types.dart' show CoreTypes;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../elements/elements.dart';
 import '../elements/modelx.dart' show FunctionElementX;
@@ -97,7 +97,7 @@
   Resolution get resolution => compiler.resolution;
 
   DiagnosticReporter get reporter => compiler.reporter;
-  CoreTypes get coreTypes => compiler.coreTypes;
+  CommonElements get commonElements => compiler.commonElements;
 
   void onInstantiatedType(InterfaceType type) {
     if (_unusedClasses.remove(type.element)) {
@@ -439,23 +439,23 @@
     for (var type in behavior.typesInstantiated) {
       if (type is SpecialType) {
         if (type == SpecialType.JsObject) {
-          registerInstantiation(compiler.coreTypes.objectType);
+          registerInstantiation(compiler.commonElements.objectType);
         }
         continue;
       }
       if (type is InterfaceType) {
-        if (type == coreTypes.intType) {
+        if (type == commonElements.intType) {
           registerInstantiation(type);
-        } else if (type == coreTypes.doubleType) {
+        } else if (type == commonElements.doubleType) {
           registerInstantiation(type);
-        } else if (type == coreTypes.numType) {
-          registerInstantiation(coreTypes.doubleType);
-          registerInstantiation(coreTypes.intType);
-        } else if (type == coreTypes.stringType) {
+        } else if (type == commonElements.numType) {
+          registerInstantiation(commonElements.doubleType);
+          registerInstantiation(commonElements.intType);
+        } else if (type == commonElements.stringType) {
           registerInstantiation(type);
-        } else if (type == coreTypes.nullType) {
+        } else if (type == commonElements.nullType) {
           registerInstantiation(type);
-        } else if (type == coreTypes.boolType) {
+        } else if (type == commonElements.boolType) {
           registerInstantiation(type);
         } else if (compiler.types.isSubtype(
             type, backend.backendClasses.listImplementation.rawType)) {
@@ -564,8 +564,8 @@
    *
    */
   NativeBehavior resolveJsCall(Send node, ForeignResolver resolver) {
-    return NativeBehavior.ofJsCallSend(
-        node, reporter, compiler.parsingContext, compiler.coreTypes, resolver);
+    return NativeBehavior.ofJsCallSend(node, reporter, compiler.parsingContext,
+        compiler.commonElements, resolver);
   }
 
   /**
@@ -580,7 +580,7 @@
   NativeBehavior resolveJsEmbeddedGlobalCall(
       Send node, ForeignResolver resolver) {
     return NativeBehavior.ofJsEmbeddedGlobalCallSend(
-        node, reporter, compiler.coreTypes, resolver);
+        node, reporter, compiler.commonElements, resolver);
   }
 
   /**
@@ -594,7 +594,7 @@
    */
   NativeBehavior resolveJsBuiltinCall(Send node, ForeignResolver resolver) {
     return NativeBehavior.ofJsBuiltinCallSend(
-        node, reporter, compiler.coreTypes, resolver);
+        node, reporter, compiler.commonElements, resolver);
   }
 }
 
diff --git a/pkg/compiler/lib/src/patch_parser.dart b/pkg/compiler/lib/src/patch_parser.dart
index 3050c0d..82c20b0 100644
--- a/pkg/compiler/lib/src/patch_parser.dart
+++ b/pkg/compiler/lib/src/patch_parser.dart
@@ -428,7 +428,7 @@
 
   void validate(Compiler compiler, Element element,
       MetadataAnnotation annotation, ConstantValue constant) {
-    DartType annotationType = constant.getType(compiler.coreTypes);
+    DartType annotationType = constant.getType(compiler.commonElements);
     if (annotationType.element !=
         compiler.commonElements.nativeAnnotationClass) {
       DiagnosticReporter reporter = compiler.reporter;
@@ -461,7 +461,7 @@
   void validate(Compiler compiler, Element element,
       MetadataAnnotation annotation, ConstantValue constant) {
     JavaScriptBackend backend = compiler.backend;
-    if (constant.getType(compiler.coreTypes).element !=
+    if (constant.getType(compiler.commonElements).element !=
         backend.helpers.jsAnnotationClass) {
       compiler.reporter
           .internalError(annotation, 'Invalid @JS(...) annotation.');
@@ -497,7 +497,7 @@
   @override
   void validate(Compiler compiler, Element element,
       MetadataAnnotation annotation, ConstantValue constant) {
-    DartType annotationType = constant.getType(compiler.coreTypes);
+    DartType annotationType = constant.getType(compiler.commonElements);
     if (annotationType.element !=
         compiler.commonElements.patchAnnotationClass) {
       DiagnosticReporter reporter = compiler.reporter;
diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
index b9fae97..7f2a57a 100644
--- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
@@ -6,7 +6,7 @@
 
 import '../common.dart';
 import '../common/resolution.dart' show Resolution;
-import '../core_types.dart' show CoreClasses, CoreTypes;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../elements/elements.dart';
 import '../elements/modelx.dart'
@@ -39,9 +39,9 @@
         scope = Scope.buildEnclosingScope(element),
         super(resolution, registry);
 
-  CoreTypes get coreTypes => resolution.coreTypes;
+  CommonElements get commonElements => resolution.commonElements;
 
-  DartType get objectType => coreTypes.objectType;
+  DartType get objectType => commonElements.objectType;
 
   void resolveTypeVariableBounds(NodeList node) {
     if (node == null) return;
@@ -243,7 +243,7 @@
     }
 
     EnumCreator creator =
-        new EnumCreator(reporter, resolution.coreTypes, element);
+        new EnumCreator(reporter, resolution.commonElements, element);
     creator.createMembers();
     return enumType;
   }
@@ -535,10 +535,10 @@
     final DartType supertype = cls.supertype;
     if (supertype != null) {
       cls.allSupertypesAndSelf = new OrderedTypeSetBuilder(cls,
-              reporter: reporter, objectType: coreTypes.objectType)
+              reporter: reporter, objectType: commonElements.objectType)
           .createOrderedTypeSet(supertype, cls.interfaces);
     } else {
-      assert(cls == resolution.coreClasses.objectClass);
+      assert(cls == resolution.commonElements.objectClass);
       cls.allSupertypesAndSelf =
           new OrderedTypeSet.singleton(cls.computeType(resolution));
     }
@@ -549,12 +549,12 @@
     return !identical(lib, resolution.commonElements.coreLibrary) &&
         !resolution.target.isTargetSpecificLibrary(lib) &&
         (type.isDynamic ||
-            type == coreTypes.boolType ||
-            type == coreTypes.numType ||
-            type == coreTypes.intType ||
-            type == coreTypes.doubleType ||
-            type == coreTypes.stringType ||
-            type == coreTypes.nullType);
+            type == commonElements.boolType ||
+            type == commonElements.numType ||
+            type == commonElements.intType ||
+            type == commonElements.doubleType ||
+            type == commonElements.stringType ||
+            type == commonElements.nullType);
   }
 }
 
@@ -567,7 +567,7 @@
         this.classElement = cls,
         super(resolution);
 
-  CoreClasses get coreClasses => resolution.coreClasses;
+  CommonElements get commonElements => resolution.commonElements;
 
   void loadSupertype(ClassElement element, Node from) {
     if (!element.isResolved) {
@@ -586,8 +586,8 @@
 
   void visitClassNode(ClassNode node) {
     if (node.superclass == null) {
-      if (classElement != coreClasses.objectClass) {
-        loadSupertype(coreClasses.objectClass, node);
+      if (classElement != commonElements.objectClass) {
+        loadSupertype(commonElements.objectClass, node);
       }
     } else {
       node.superclass.accept(this);
@@ -596,7 +596,7 @@
   }
 
   void visitEnum(Enum node) {
-    loadSupertype(coreClasses.objectClass, node);
+    loadSupertype(commonElements.objectClass, node);
   }
 
   void visitMixinApplication(MixinApplication node) {
diff --git a/pkg/compiler/lib/src/resolution/class_members.dart b/pkg/compiler/lib/src/resolution/class_members.dart
index 3039130..07bf004 100644
--- a/pkg/compiler/lib/src/resolution/class_members.dart
+++ b/pkg/compiler/lib/src/resolution/class_members.dart
@@ -310,7 +310,7 @@
   void checkImplementsFunctionWithCall() {
     assert(!cls.isAbstract);
 
-    ClassElement functionClass = resolution.coreClasses.functionClass;
+    ClassElement functionClass = resolution.commonElements.functionClass;
     functionClass.ensureResolved(resolution);
     if (cls.asInstanceOf(functionClass) == null) return;
     if (cls.lookupMember(Identifiers.call) != null) return;
diff --git a/pkg/compiler/lib/src/resolution/enum_creator.dart b/pkg/compiler/lib/src/resolution/enum_creator.dart
index 2d07373..6b94c22 100644
--- a/pkg/compiler/lib/src/resolution/enum_creator.dart
+++ b/pkg/compiler/lib/src/resolution/enum_creator.dart
@@ -5,7 +5,7 @@
 library dart2js.resolution.enum_creator;
 
 import '../common.dart';
-import '../core_types.dart' show CoreTypes;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../elements/elements.dart';
 import '../elements/modelx.dart';
@@ -199,18 +199,18 @@
 // removed.
 class EnumCreator {
   final DiagnosticReporter reporter;
-  final CoreTypes coreTypes;
+  final CommonElements commonElements;
   final EnumClassElementX enumClass;
 
-  EnumCreator(this.reporter, this.coreTypes, this.enumClass);
+  EnumCreator(this.reporter, this.commonElements, this.enumClass);
 
   void createMembers() {
     Enum node = enumClass.node;
     InterfaceType enumType = enumClass.thisType;
     AstBuilder builder = new AstBuilder(enumClass.position.charOffset);
 
-    InterfaceType intType = coreTypes.intType;
-    InterfaceType stringType = coreTypes.stringType;
+    InterfaceType intType = commonElements.intType;
+    InterfaceType stringType = commonElements.stringType;
 
     EnumFieldElementX addInstanceMember(String name, InterfaceType type) {
       Identifier identifier = builder.identifier(name);
@@ -281,7 +281,7 @@
 
     VariableList valuesVariableList =
         new VariableList(builder.modifiers(isStatic: true, isConst: true));
-    valuesVariableList.type = coreTypes.listType(enumType);
+    valuesVariableList.type = commonElements.listType(enumType);
 
     Identifier valuesIdentifier = builder.identifier('values');
     // TODO(johnniwinther): Add type argument.
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index 0c0998a..85b4902 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -171,8 +171,7 @@
             : ConstantState.NON_CONSTANT,
         super(resolution, registry);
 
-  CoreClasses get coreClasses => resolution.coreClasses;
-  CoreTypes get coreTypes => resolution.coreTypes;
+  CommonElements get commonElements => resolution.commonElements;
   ConstantEnvironment get constants => resolution.constants;
   ResolverTask get resolver => resolution.resolver;
   CompilerOptions get options => resolution.options;
@@ -337,7 +336,7 @@
       if (Elements.isUnresolved(element) && name == 'dynamic') {
         // TODO(johnniwinther): Remove this hack when we can return more complex
         // objects than [Element] from this method.
-        element = coreClasses.typeClass;
+        element = commonElements.typeClass;
         // Set the type to be `dynamic` to mark that this is a type literal.
         registry.setType(node, const DynamicType());
       }
@@ -1197,14 +1196,14 @@
         bool isValidConstant;
         ConstantExpression expressionConstant = expressionResult.constant;
         DartType knownExpressionType =
-            expressionConstant.getKnownType(coreTypes);
+            expressionConstant.getKnownType(commonElements);
         switch (operator.kind) {
           case UnaryOperatorKind.COMPLEMENT:
-            isValidConstant = knownExpressionType == coreTypes.intType;
+            isValidConstant = knownExpressionType == commonElements.intType;
             break;
           case UnaryOperatorKind.NEGATE:
-            isValidConstant = knownExpressionType == coreTypes.intType ||
-                knownExpressionType == coreTypes.doubleType;
+            isValidConstant = knownExpressionType == commonElements.intType ||
+                knownExpressionType == commonElements.doubleType;
             break;
           case UnaryOperatorKind.NOT:
             reporter.internalError(
@@ -1237,7 +1236,8 @@
 
     if (result.isConstant) {
       ConstantExpression expressionConstant = result.constant;
-      if (expressionConstant.getKnownType(coreTypes) == coreTypes.boolType) {
+      if (expressionConstant.getKnownType(commonElements) ==
+          commonElements.boolType) {
         // TODO(johnniwinther): Handle potentially invalid constant expressions.
         ConstantExpression constant =
             new UnaryConstantExpression(operator, expressionConstant);
@@ -1262,8 +1262,10 @@
     if (leftResult.isConstant && rightResult.isConstant) {
       ConstantExpression leftConstant = leftResult.constant;
       ConstantExpression rightConstant = rightResult.constant;
-      if (leftConstant.getKnownType(coreTypes) == coreTypes.boolType &&
-          rightConstant.getKnownType(coreTypes) == coreTypes.boolType) {
+      if (leftConstant.getKnownType(commonElements) ==
+              commonElements.boolType &&
+          rightConstant.getKnownType(commonElements) ==
+              commonElements.boolType) {
         // TODO(johnniwinther): Handle potentially invalid constant expressions.
         ConstantExpression constant = new BinaryConstantExpression(
             leftConstant, BinaryOperator.LOGICAL_AND, rightConstant);
@@ -1286,8 +1288,10 @@
     if (leftResult.isConstant && rightResult.isConstant) {
       ConstantExpression leftConstant = leftResult.constant;
       ConstantExpression rightConstant = rightResult.constant;
-      if (leftConstant.getKnownType(coreTypes) == coreTypes.boolType &&
-          rightConstant.getKnownType(coreTypes) == coreTypes.boolType) {
+      if (leftConstant.getKnownType(commonElements) ==
+              commonElements.boolType &&
+          rightConstant.getKnownType(commonElements) ==
+              commonElements.boolType) {
         // TODO(johnniwinther): Handle potentially invalid constant expressions.
         ConstantExpression constant = new BinaryConstantExpression(
             leftConstant, BinaryOperator.LOGICAL_OR, rightConstant);
@@ -1368,29 +1372,29 @@
         bool isValidConstant;
         ConstantExpression leftConstant = leftResult.constant;
         ConstantExpression rightConstant = rightResult.constant;
-        DartType knownLeftType = leftConstant.getKnownType(coreTypes);
-        DartType knownRightType = rightConstant.getKnownType(coreTypes);
+        DartType knownLeftType = leftConstant.getKnownType(commonElements);
+        DartType knownRightType = rightConstant.getKnownType(commonElements);
         switch (operator.kind) {
           case BinaryOperatorKind.EQ:
           case BinaryOperatorKind.NOT_EQ:
-            isValidConstant = (knownLeftType == coreTypes.intType ||
-                    knownLeftType == coreTypes.doubleType ||
-                    knownLeftType == coreTypes.stringType ||
-                    knownLeftType == coreTypes.boolType ||
-                    knownLeftType == coreTypes.nullType) &&
-                (knownRightType == coreTypes.intType ||
-                    knownRightType == coreTypes.doubleType ||
-                    knownRightType == coreTypes.stringType ||
-                    knownRightType == coreTypes.boolType ||
-                    knownRightType == coreTypes.nullType);
+            isValidConstant = (knownLeftType == commonElements.intType ||
+                    knownLeftType == commonElements.doubleType ||
+                    knownLeftType == commonElements.stringType ||
+                    knownLeftType == commonElements.boolType ||
+                    knownLeftType == commonElements.nullType) &&
+                (knownRightType == commonElements.intType ||
+                    knownRightType == commonElements.doubleType ||
+                    knownRightType == commonElements.stringType ||
+                    knownRightType == commonElements.boolType ||
+                    knownRightType == commonElements.nullType);
             break;
           case BinaryOperatorKind.ADD:
-            isValidConstant = (knownLeftType == coreTypes.intType ||
-                    knownLeftType == coreTypes.doubleType ||
-                    knownLeftType == coreTypes.stringType) &&
-                (knownRightType == coreTypes.intType ||
-                    knownRightType == coreTypes.doubleType ||
-                    knownRightType == coreTypes.stringType);
+            isValidConstant = (knownLeftType == commonElements.intType ||
+                    knownLeftType == commonElements.doubleType ||
+                    knownLeftType == commonElements.stringType) &&
+                (knownRightType == commonElements.intType ||
+                    knownRightType == commonElements.doubleType ||
+                    knownRightType == commonElements.stringType);
             break;
           case BinaryOperatorKind.SUB:
           case BinaryOperatorKind.MUL:
@@ -1401,18 +1405,18 @@
           case BinaryOperatorKind.GT:
           case BinaryOperatorKind.LTEQ:
           case BinaryOperatorKind.LT:
-            isValidConstant = (knownLeftType == coreTypes.intType ||
-                    knownLeftType == coreTypes.doubleType) &&
-                (knownRightType == coreTypes.intType ||
-                    knownRightType == coreTypes.doubleType);
+            isValidConstant = (knownLeftType == commonElements.intType ||
+                    knownLeftType == commonElements.doubleType) &&
+                (knownRightType == commonElements.intType ||
+                    knownRightType == commonElements.doubleType);
             break;
           case BinaryOperatorKind.SHL:
           case BinaryOperatorKind.SHR:
           case BinaryOperatorKind.AND:
           case BinaryOperatorKind.OR:
           case BinaryOperatorKind.XOR:
-            isValidConstant = knownLeftType == coreTypes.intType &&
-                knownRightType == coreTypes.intType;
+            isValidConstant = knownLeftType == commonElements.intType &&
+                knownRightType == commonElements.intType;
             break;
           case BinaryOperatorKind.INDEX:
             isValidConstant = false;
@@ -2065,10 +2069,10 @@
     ConstantExpression constant = new TypeConstantExpression(
         // TODO(johnniwinther): Use [type] when evaluation of constants is done
         // directly on the constant expressions.
-        node.isCall ? coreTypes.typeType : type);
+        node.isCall ? commonElements.typeType : type);
     AccessSemantics semantics = new ConstantAccess.dynamicTypeLiteral(constant);
     return handleConstantTypeLiteralAccess(node, const PublicName('dynamic'),
-        coreClasses.typeClass, type, semantics);
+        commonElements.typeClass, type, semantics);
   }
 
   /// Handle update to a type literal of the type 'dynamic'. Like `dynamic++` or
@@ -2079,7 +2083,7 @@
         new TypeConstantExpression(const DynamicType());
     AccessSemantics semantics = new ConstantAccess.dynamicTypeLiteral(constant);
     return handleConstantTypeLiteralUpdate(node, const PublicName('dynamic'),
-        coreClasses.typeClass, type, semantics);
+        commonElements.typeClass, type, semantics);
   }
 
   /// Handle access to a type literal of a class. Like `C` or
@@ -3590,9 +3594,9 @@
         reporter.reportErrorMessage(node, MessageKind.INVALID_YIELD);
       }
       if (currentAsyncMarker.isAsync) {
-        coreClasses.streamClass.ensureResolved(resolution);
+        commonElements.streamClass.ensureResolved(resolution);
       } else {
-        coreClasses.iterableClass.ensureResolved(resolution);
+        commonElements.iterableClass.ensureResolved(resolution);
       }
     }
     visit(node.expression);
@@ -3727,7 +3731,7 @@
       if (!currentAsyncMarker.isAsync) {
         reporter.reportErrorMessage(node, MessageKind.INVALID_AWAIT);
       }
-      coreClasses.futureClass.ensureResolved(resolution);
+      commonElements.futureClass.ensureResolved(resolution);
     }
     visit(node.expression);
     return const NoneResult();
@@ -3909,7 +3913,7 @@
             .compileNode(argumentNode, registry.mapping);
         ConstantValue name = resolution.constants.getConstantValue(constant);
         if (!name.isString) {
-          DartType type = name.getType(coreTypes);
+          DartType type = name.getType(commonElements);
           reporter.reportErrorMessage(
               argumentNode, MessageKind.STRING_EXPECTED, {'type': type});
         } else {
@@ -3983,7 +3987,7 @@
           !resolution.mirrorUsageAnalyzerTask
               .hasMirrorUsage(enclosingElement)) {
         reporter.reportHintMessage(node.newToken, MessageKind.NON_CONST_BLOAT,
-            {'name': coreClasses.symbolClass.name});
+            {'name': commonElements.symbolClass.name});
       }
       registry.registerNewStructure(
           node,
@@ -4002,9 +4006,9 @@
       ObjectConstantValue objectConstant = key;
       DartType keyType = objectConstant.type;
       ClassElement cls = keyType.element;
-      if (cls == coreClasses.stringClass) continue;
+      if (cls == commonElements.stringClass) continue;
       Element equals = cls.lookupMember('==');
-      if (equals.enclosingClass != coreClasses.objectClass) {
+      if (equals.enclosingClass != commonElements.objectClass) {
         reporter.reportErrorMessage(spannable,
             MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS, {'type': keyType});
       }
@@ -4113,9 +4117,9 @@
             arguments.nodes.head, MessageKind.TYPE_VARIABLE_IN_CONSTANT);
         isValidAsConstant = false;
       }
-      listType = coreTypes.listType(typeArgument);
+      listType = commonElements.listType(typeArgument);
     } else {
-      listType = coreTypes.listType();
+      listType = commonElements.listType();
     }
     registry.registerLiteralList(node, listType,
         isConstant: node.isConst, isEmpty: node.elements.isEmpty);
@@ -4411,9 +4415,9 @@
     }
     DartType mapType;
     if (valueTypeArgument != null) {
-      mapType = coreTypes.mapType(keyTypeArgument, valueTypeArgument);
+      mapType = commonElements.mapType(keyTypeArgument, valueTypeArgument);
     } else {
-      mapType = coreTypes.mapType();
+      mapType = commonElements.mapType();
     }
     if (node.isConst && mapType.containsTypeVariables) {
       reporter.reportErrorMessage(
@@ -4465,12 +4469,12 @@
   }
 
   DartType typeOfConstant(ConstantValue constant) {
-    if (constant.isInt) return coreTypes.intType;
-    if (constant.isBool) return coreTypes.boolType;
-    if (constant.isDouble) return coreTypes.doubleType;
-    if (constant.isString) return coreTypes.stringType;
-    if (constant.isNull) return coreTypes.nullType;
-    if (constant.isFunction) return coreTypes.functionType;
+    if (constant.isInt) return commonElements.intType;
+    if (constant.isBool) return commonElements.boolType;
+    if (constant.isDouble) return commonElements.doubleType;
+    if (constant.isString) return commonElements.stringType;
+    if (constant.isNull) return commonElements.nullType;
+    if (constant.isFunction) return commonElements.functionType;
     assert(constant.isObject);
     ObjectConstantValue objectConstant = constant;
     return objectConstant.type;
@@ -4479,7 +4483,7 @@
   bool overridesEquals(DartType type) {
     ClassElement cls = type.element;
     Element equals = cls.lookupMember('==');
-    return equals.enclosingClass != coreClasses.objectClass;
+    return equals.enclosingClass != commonElements.objectClass;
   }
 
   void checkCaseExpressions(SwitchStatement node) {
@@ -4504,7 +4508,8 @@
             message: 'No constant computed for $node'));
 
         ConstantValue value = resolution.constants.getConstantValue(constant);
-        DartType caseType = value.getType(coreTypes); //typeOfConstant(value);
+        DartType caseType =
+            value.getType(commonElements); //typeOfConstant(value);
 
         if (firstCaseType == null) {
           firstCase = caseMatch;
@@ -4512,12 +4517,12 @@
 
           // We only report the bad type on the first class element. All others
           // get a "type differs" error.
-          if (caseType == coreTypes.doubleType) {
+          if (caseType == commonElements.doubleType) {
             reporter.reportErrorMessage(
                 node,
                 MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS,
                 {'type': "double"});
-          } else if (caseType == coreTypes.functionType) {
+          } else if (caseType == commonElements.functionType) {
             reporter.reportErrorMessage(
                 node, MessageKind.SWITCH_CASE_FORBIDDEN, {'type': "Function"});
           } else if (value.isObject && overridesEquals(caseType)) {
@@ -4740,7 +4745,7 @@
       Node stackTraceVariable = stackTraceDefinition.definitions.nodes.head;
       VariableElementX stackTraceElement =
           registry.getDefinition(stackTraceVariable);
-      InterfaceType stackTraceType = coreTypes.stackTraceType;
+      InterfaceType stackTraceType = commonElements.stackTraceType;
       stackTraceElement.variables.type = stackTraceType;
     }
     return const NoneResult();
diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
index 923952c..e4d8f21 100644
--- a/pkg/compiler/lib/src/resolution/resolution.dart
+++ b/pkg/compiler/lib/src/resolution/resolution.dart
@@ -19,7 +19,7 @@
         ConstructedConstantExpression,
         ErroneousConstantExpression;
 import '../constants/values.dart' show ConstantValue;
-import '../core_types.dart' show CoreClasses, CoreTypes, CommonElements;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../elements/elements.dart';
 import '../elements/modelx.dart'
@@ -72,13 +72,11 @@
 
   DiagnosticReporter get reporter => resolution.reporter;
   Target get target => resolution.target;
-  CoreTypes get coreTypes => resolution.coreTypes;
-  CoreClasses get coreClasses => resolution.coreClasses;
   CommonElements get commonElements => resolution.commonElements;
   ParsingContext get parsingContext => resolution.parsingContext;
   CompilerOptions get options => resolution.options;
   ResolutionEnqueuer get enqueuer => resolution.enqueuer;
-  OpenWorld get world => enqueuer.universe.openWorld;
+  OpenWorld get world => enqueuer.universe;
 
   ResolutionImpact resolve(Element element) {
     return measure(() {
@@ -146,7 +144,7 @@
   static void processAsyncMarker(Resolution resolution,
       BaseFunctionElementX element, ResolutionRegistry registry) {
     DiagnosticReporter reporter = resolution.reporter;
-    CoreClasses coreClasses = resolution.coreClasses;
+    CommonElements commonElements = resolution.commonElements;
     FunctionExpression functionExpression = element.node;
     AsyncModifier asyncModifier = functionExpression.asyncModifier;
     if (asyncModifier != null) {
@@ -189,15 +187,15 @@
         switch (element.asyncMarker) {
           case AsyncMarker.ASYNC:
             registry.registerFeature(Feature.ASYNC);
-            coreClasses.futureClass.ensureResolved(resolution);
+            commonElements.futureClass.ensureResolved(resolution);
             break;
           case AsyncMarker.ASYNC_STAR:
             registry.registerFeature(Feature.ASYNC_STAR);
-            coreClasses.streamClass.ensureResolved(resolution);
+            commonElements.streamClass.ensureResolved(resolution);
             break;
           case AsyncMarker.SYNC_STAR:
             registry.registerFeature(Feature.SYNC_STAR);
-            coreClasses.iterableClass.ensureResolved(resolution);
+            commonElements.iterableClass.ensureResolved(resolution);
             break;
         }
       }
@@ -539,7 +537,8 @@
             from, MessageKind.CYCLIC_CLASS_HIERARCHY, {'className': cls.name});
         cls.supertypeLoadState = STATE_DONE;
         cls.hasIncompleteHierarchy = true;
-        cls.allSupertypesAndSelf = coreClasses.objectClass.allSupertypesAndSelf
+        cls.allSupertypesAndSelf = commonElements
+            .objectClass.allSupertypesAndSelf
             .extendClass(cls.computeType(resolution));
         cls.supertype = cls.allSupertypes.head;
         assert(invariant(from, cls.supertype != null,
diff --git a/pkg/compiler/lib/src/resolution/signatures.dart b/pkg/compiler/lib/src/resolution/signatures.dart
index faa927c..0dd1363 100644
--- a/pkg/compiler/lib/src/resolution/signatures.dart
+++ b/pkg/compiler/lib/src/resolution/signatures.dart
@@ -389,13 +389,13 @@
           returnType = visitor.resolveReturnType(returnNode);
           break;
         case AsyncMarker.SYNC_STAR:
-          returnType = resolution.coreTypes.iterableType();
+          returnType = resolution.commonElements.iterableType();
           break;
         case AsyncMarker.ASYNC:
-          returnType = resolution.coreTypes.futureType();
+          returnType = resolution.commonElements.futureType();
           break;
         case AsyncMarker.ASYNC_STAR:
-          returnType = resolution.coreTypes.streamType();
+          returnType = resolution.commonElements.streamType();
           break;
       }
     }
diff --git a/pkg/compiler/lib/src/serialization/equivalence.dart b/pkg/compiler/lib/src/serialization/equivalence.dart
index c9f03f2..81aefc9 100644
--- a/pkg/compiler/lib/src/serialization/equivalence.dart
+++ b/pkg/compiler/lib/src/serialization/equivalence.dart
@@ -629,11 +629,6 @@
   bool visitMalformedType(MalformedType type, MalformedType other) => true;
 
   @override
-  bool visitStatementType(StatementType type, StatementType other) {
-    throw new UnsupportedError("Unsupported type: $type");
-  }
-
-  @override
   bool visitTypeVariableType(TypeVariableType type, TypeVariableType other) {
     return strategy.testElements(
             type, other, 'element', type.element, other.element) &&
diff --git a/pkg/compiler/lib/src/serialization/type_serialization.dart b/pkg/compiler/lib/src/serialization/type_serialization.dart
index 96f659e..29c28f0 100644
--- a/pkg/compiler/lib/src/serialization/type_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/type_serialization.dart
@@ -87,8 +87,6 @@
       case TypeKind.TYPEDEF:
         return new TypedefType(decoder.getElement(Key.ELEMENT),
             decoder.getTypes(Key.TYPE_ARGUMENTS, isOptional: true));
-      case TypeKind.STATEMENT:
-        throw new UnsupportedError("Unexpected type kind '${typeKind}.");
       case TypeKind.MALFORMED_TYPE:
         // TODO(johnniwinther): Do we need the 'userProvidedBadType' or maybe
         // just a toString of it?
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 25f7fe8..296aa81 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -15,7 +15,7 @@
 import '../constants/constant_system.dart';
 import '../constants/expressions.dart';
 import '../constants/values.dart';
-import '../core_types.dart' show CoreClasses;
+import '../core_types.dart' show CommonElements;
 import '../dart_types.dart';
 import '../diagnostics/messages.dart' show Message, MessageTemplate;
 import '../dump_info.dart' show InfoReporter;
@@ -229,7 +229,7 @@
 
   DiagnosticReporter get reporter => compiler.reporter;
 
-  CoreClasses get coreClasses => compiler.coreClasses;
+  CommonElements get commonElements => closedWorld.commonElements;
 
   Element get targetElement => target;
 
@@ -453,7 +453,7 @@
 
       // Don't inline operator== methods if the parameter can be null.
       if (element.name == '==') {
-        if (element.enclosingClass != coreClasses.objectClass &&
+        if (element.enclosingClass != commonElements.objectClass &&
             providedArguments[1].canBeNull()) {
           return false;
         }
@@ -1558,7 +1558,7 @@
     HInstruction value = pop();
     if (typeBuilder.checkOrTrustTypes) {
       return typeBuilder.potentiallyCheckOrTrustType(
-          value, compiler.coreTypes.boolType,
+          value, compiler.commonElements.boolType,
           kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
     }
     HInstruction result = new HBoolify(value, commonMasks.boolType);
@@ -3048,7 +3048,8 @@
     ClassElement cls = currentNonClosureClass;
     MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_);
     if (!Selectors.noSuchMethod_.signatureApplies(element)) {
-      element = coreClasses.objectClass.lookupMember(Identifiers.noSuchMethod_);
+      element =
+          commonElements.objectClass.lookupMember(Identifiers.noSuchMethod_);
     }
     if (backend.hasInvokeOnSupport && !element.enclosingClass.isObject) {
       // Register the call as dynamic if [noSuchMethod] on the super
@@ -3504,7 +3505,7 @@
     // not know about the type argument. Therefore we special case
     // this constructor to have the setRuntimeTypeInfo called where
     // the 'new' is done.
-    if (backend.classNeedsRti(coreClasses.listClass) &&
+    if (backend.classNeedsRti(commonElements.listClass) &&
         (isFixedListConstructorCall ||
             isGrowableListConstructorCall ||
             isJSArrayTypedConstructor)) {
@@ -5155,7 +5156,7 @@
     // case.
     return type.isDynamic ||
         type.isObject ||
-        (type is InterfaceType && type.element == coreClasses.futureClass);
+        (type is InterfaceType && type.element == commonElements.futureClass);
   }
 
   visitReturn(ast.Return node) {
@@ -5207,8 +5208,8 @@
     visit(node.expression);
     HInstruction awaited = pop();
     // TODO(herhut): Improve this type.
-    push(new HAwait(
-        awaited, new TypeMask.subclass(coreClasses.objectClass, closedWorld)));
+    push(new HAwait(awaited,
+        new TypeMask.subclass(commonElements.objectClass, closedWorld)));
   }
 
   visitTypeAnnotation(ast.TypeAnnotation node) {
@@ -5372,8 +5373,8 @@
       TypeMask mask = elementInferenceResults.typeOfIteratorMoveNext(node);
       pushInvokeDynamic(node, selector, mask, [streamIterator]);
       HInstruction future = pop();
-      push(new HAwait(
-          future, new TypeMask.subclass(coreClasses.objectClass, closedWorld)));
+      push(new HAwait(future,
+          new TypeMask.subclass(commonElements.objectClass, closedWorld)));
       return popBoolified();
     }
 
@@ -5408,8 +5409,8 @@
           node, buildInitializer, buildCondition, buildUpdate, buildBody);
     }, () {
       pushInvokeDynamic(node, Selectors.cancel, null, [streamIterator]);
-      push(new HAwait(
-          pop(), new TypeMask.subclass(coreClasses.objectClass, closedWorld)));
+      push(new HAwait(pop(),
+          new TypeMask.subclass(commonElements.objectClass, closedWorld)));
       pop();
     });
   }
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 7c92668..1fc734f 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -215,7 +215,7 @@
     HInstruction value = pop();
     if (typeBuilder.checkOrTrustTypes) {
       return typeBuilder.potentiallyCheckOrTrustType(
-          value, compiler.coreTypes.boolType,
+          value, compiler.commonElements.boolType,
           kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
     }
     HInstruction result = new HBoolify(value, commonMasks.boolType);
@@ -223,6 +223,26 @@
     return result;
   }
 
+  void _addClassTypeVariablesIfNeeded(ir.Member constructor) {
+    var enclosing = constructor.enclosingClass;
+    if (backend.classNeedsRti(astAdapter.getElement(enclosing))) {
+      ClassElement clsElement =
+          astAdapter.getElement(constructor).enclosingElement;
+      enclosing.typeParameters.forEach((ir.TypeParameter typeParameter) {
+        var typeParamElement = astAdapter.getElement(typeParameter);
+        HParameterValue param =
+            addParameter(typeParamElement, commonMasks.nonNullType);
+        // This is a little bit wacky (and n^2) until we make the localsHandler
+        // take Kernel DartTypes instead of just the AST DartTypes.
+        var typeVariableType = clsElement
+            .typeVariables
+            .firstWhere((TypeVariableType i) => i.name == typeParameter.name);
+        localsHandler.directLocals[
+            localsHandler.getTypeVariableAsLocal(typeVariableType)] = param;
+      });
+    }
+  }
+
   /// Builds generative constructors.
   ///
   /// Generative constructors are built in two stages.
@@ -233,6 +253,7 @@
   /// constructor bodies for all constructors in the hierarchy.
   void buildConstructor(ir.Constructor constructor) {
     openFunction();
+    _addClassTypeVariablesIfNeeded(constructor);
 
     // Collect field values for the current class.
     // TODO(het): Does kernel always put field initializers in the constructor
@@ -399,6 +420,11 @@
   /// Procedures.
   void buildFunctionNode(ir.FunctionNode functionNode) {
     openFunction();
+    if (functionNode.parent is ir.Procedure &&
+        (functionNode.parent as ir.Procedure).kind ==
+            ir.ProcedureKind.Factory) {
+      _addClassTypeVariablesIfNeeded(functionNode.parent);
+    }
     functionNode.body.accept(this);
     closeFunction();
   }
@@ -1942,49 +1968,82 @@
   }
 
   HInstruction buildIsNode(
-      ir.Node node, ir.DartType dart_type, HInstruction expression) {
-    // TODO(sra): Convert the type testing logic here to use ir.DartType.
-    DartType type = astAdapter.getDartType(dart_type);
-
-    type = localsHandler.substInContext(type).unaliased;
-
-    if (type is MethodTypeVariableType) {
-      return graph.addConstantBool(true, closedWorld);
+      ir.Node node, ir.DartType type, HInstruction expression) {
+    // Note: The call to "unalias" this type like in the original SSA builder is
+    // unnecessary in kernel because Kernel has no notion of typedef.
+    // TODO(efortuna): Add test for this.
+    DartType typeValue =
+        localsHandler.substInContext(astAdapter.getDartType(type));
+    if (type is ir.InvalidType) {
+      generateTypeError(node, (typeValue.element as ErroneousElement).message);
+      return new HIs.compound(
+          typeValue, expression, pop(), commonMasks.boolType);
     }
 
-    if (type is MalformedType) {
-      ErroneousElement element = type.element;
-      generateTypeError(node, element.message);
-      return new HIs.compound(type, expression, pop(), commonMasks.boolType);
-    }
-
-    if (type.isFunctionType) {
-      List arguments = <HInstruction>[buildFunctionType(type), expression];
-      _pushDynamicInvocation(node, commonMasks.boolType, arguments,
+    if (type is ir.FunctionType) {
+      List arguments = [buildFunctionType(typeValue), expression];
+      _pushDynamicInvocation(node, null, arguments,
           selector: new Selector.call(
-              new PrivateName('_isTest', astAdapter.jsHelperLibrary),
+              new PrivateName('_isTest', backend.helpers.jsHelperLibrary),
               CallStructure.ONE_ARG));
-      return new HIs.compound(type, expression, pop(), commonMasks.boolType);
+      return new HIs.compound(
+          typeValue, expression, pop(), commonMasks.boolType);
     }
 
-    if (type.isTypeVariable) {
+    if (type is ir.TypeParameterType) {
       HInstruction runtimeType =
-          typeBuilder.addTypeVariableReference(type, sourceElement);
+          typeBuilder.addTypeVariableReference(typeValue, sourceElement);
       _pushStaticInvocation(astAdapter.checkSubtypeOfRuntimeType,
           <HInstruction>[expression, runtimeType], commonMasks.boolType);
-      return new HIs.variable(type, expression, pop(), commonMasks.boolType);
+      return new HIs.variable(
+          typeValue, expression, pop(), commonMasks.boolType);
     }
 
-    // TODO(sra): Type with type parameters.
-
-    if (backend.hasDirectCheckFor(type)) {
-      return new HIs.direct(type, expression, commonMasks.boolType);
+    if (_isInterfaceWithNoDynamicTypes(type)) {
+      HInstruction representations = typeBuilder
+          .buildTypeArgumentRepresentations(typeValue, sourceElement);
+      add(representations);
+      ClassElement element = typeValue.element;
+      js.Name operator = backend.namer.operatorIs(element);
+      HInstruction isFieldName =
+          graph.addConstantStringFromName(operator, closedWorld);
+      HInstruction asFieldName = closedWorld.hasAnyStrictSubtype(element)
+          ? graph.addConstantStringFromName(
+              backend.namer.substitutionName(element), closedWorld)
+          : graph.addConstantNull(closedWorld);
+      List<HInstruction> inputs = <HInstruction>[
+        expression,
+        isFieldName,
+        representations,
+        asFieldName
+      ];
+      _pushStaticInvocation(
+          astAdapter.checkSubtype, inputs, commonMasks.boolType);
+      return new HIs.compound(
+          typeValue, expression, pop(), commonMasks.boolType);
     }
 
+    if (backend.hasDirectCheckFor(typeValue)) {
+      return new HIs.direct(typeValue, expression, commonMasks.boolType);
+    }
     // The interceptor is not always needed.  It is removed by optimization
     // when the receiver type or tested type permit.
-    HInterceptor interceptor = _interceptorFor(expression);
-    return new HIs.raw(type, expression, interceptor, commonMasks.boolType);
+    return new HIs.raw(typeValue, expression, _interceptorFor(expression),
+        commonMasks.boolType);
+  }
+
+  bool _isInterfaceWithNoDynamicTypes(ir.DartType type) {
+    bool isMethodTypeVariableType(ir.DartType typeArgType) {
+      return (typeArgType is ir.TypeParameterType &&
+          typeArgType.parameter.parent is ir.FunctionNode);
+    }
+
+    return type is ir.InterfaceType &&
+        (type as ir.InterfaceType).typeArguments.any(
+            (ir.DartType typeArgType) =>
+                typeArgType is! ir.DynamicType &&
+                typeArgType is! ir.InvalidType &&
+                !isMethodTypeVariableType(type));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index bf90d8e..67bcd30 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -2866,7 +2866,7 @@
       // TODO(5022): We currently generate $isFunction checks for
       // function types.
       registry.registerTypeUse(
-          new TypeUse.isCheck(compiler.coreTypes.functionType));
+          new TypeUse.isCheck(compiler.commonElements.functionType));
     }
     registry.registerTypeUse(new TypeUse.isCheck(type));
 
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index 35566b8..d659977 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -308,10 +308,6 @@
     visitDynamicType(const DynamicType(), builder);
   }
 
-  void visitStatementType(StatementType type, GraphBuilder builder) {
-    throw 'not implemented visitStatementType($type)';
-  }
-
   void visitInterfaceType(InterfaceType type, GraphBuilder builder) {
     List<HInstruction> inputs = <HInstruction>[];
     for (DartType typeArgument in type.typeArguments) {
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index 00e92f8..0859c3c 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -63,6 +63,9 @@
     for (LocalFunctionElement localFunction in kernel.localFunctions.keys) {
       _nodeToElement[kernel.localFunctions[localFunction]] = localFunction;
     }
+    for (TypeVariableElement typeVariable in kernel.typeParameters.keys) {
+      _nodeToElement[kernel.typeParameters[typeVariable]] = typeVariable;
+    }
     _typeConverter = new DartTypeConverter(this);
   }
 
@@ -436,7 +439,8 @@
       TypeMaskFactory.inferredReturnTypeForElement(
           _backend.helpers.createRuntimeType, _globalInferenceResults);
 
-  ir.Class get objectClass => kernel.classes[_compiler.coreClasses.objectClass];
+  ir.Class get objectClass =>
+      kernel.classes[_compiler.commonElements.objectClass];
 
   ir.Procedure get currentIsolate =>
       kernel.functions[_backend.helpers.currentIsolate];
@@ -492,14 +496,14 @@
     ast.Node node = getNodeOrNull(list);
     if (node != null) return elements.getType(node);
     assertNodeIsSynthetic(list);
-    return _compiler.coreTypes.listType(getDartType(list.typeArgument));
+    return _compiler.commonElements.listType(getDartType(list.typeArgument));
   }
 
   DartType getDartTypeOfMapLiteral(ir.MapLiteral literal) {
     ast.Node node = getNodeOrNull(literal);
     if (node != null) return elements.getType(node);
     assertNodeIsSynthetic(literal);
-    return _compiler.coreTypes
+    return _compiler.commonElements
         .mapType(getDartType(literal.keyType), getDartType(literal.valueType));
   }
 
@@ -632,7 +636,7 @@
         _typeLookup(resolveAsRaw: true),
         CURRENT_ELEMENT_SPANNABLE,
         reporter,
-        _compiler.coreTypes);
+        _compiler.commonElements);
   }
 
   /// Computes the [native.NativeBehavior] for a call to the [JS_BUILTIN] function.
@@ -660,7 +664,7 @@
         _typeLookup(resolveAsRaw: true),
         CURRENT_ELEMENT_SPANNABLE,
         reporter,
-        _compiler.coreTypes);
+        _compiler.commonElements);
   }
 
   /// Computes the [native.NativeBehavior] for a call to the [JS_EMBEDDED_GLOBAL]
@@ -695,7 +699,7 @@
         _typeLookup(resolveAsRaw: true),
         CURRENT_ELEMENT_SPANNABLE,
         reporter,
-        _compiler.coreTypes);
+        _compiler.commonElements);
   }
 
   /// Returns `true` is [node] has a `@Native(...)` annotation.
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 155c10e..4476850 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -222,7 +222,7 @@
     DartType elementType = checkType(literal.typeArgument);
 
     impactBuilder.registerListLiteral(new ListLiteralUse(
-        compiler.coreTypes.listType(elementType),
+        compiler.commonElements.listType(elementType),
         isConstant: literal.isConst,
         isEmpty: literal.expressions.isEmpty));
   }
@@ -233,7 +233,7 @@
     DartType keyType = checkType(literal.keyType);
     DartType valueType = checkType(literal.valueType);
     impactBuilder.registerMapLiteral(new MapLiteralUse(
-        compiler.coreTypes.mapType(keyType, valueType),
+        compiler.commonElements.mapType(keyType, valueType),
         isConstant: literal.isConst,
         isEmpty: literal.entries.isEmpty));
   }
diff --git a/pkg/compiler/lib/src/ssa/types.dart b/pkg/compiler/lib/src/ssa/types.dart
index fdab037..21be147 100644
--- a/pkg/compiler/lib/src/ssa/types.dart
+++ b/pkg/compiler/lib/src/ssa/types.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../compiler.dart' show Compiler;
-import '../core_types.dart' show CoreClasses;
+import '../core_types.dart' show CommonElements;
 import '../elements/elements.dart';
 import '../native/native.dart' as native;
 import '../tree/tree.dart' as ast;
@@ -36,17 +36,18 @@
     var typesReturned = nativeBehavior.typesReturned;
     if (typesReturned.isEmpty) return commonMasks.dynamicType;
 
-    CoreClasses coreClasses = closedWorld.coreClasses;
+    CommonElements commonElements = closedWorld.commonElements;
 
     // [type] is either an instance of [DartType] or special objects
     // like [native.SpecialType.JsObject].
     TypeMask fromNativeType(dynamic type) {
       if (type == native.SpecialType.JsObject) {
-        return new TypeMask.nonNullExact(coreClasses.objectClass, closedWorld);
+        return new TypeMask.nonNullExact(
+            commonElements.objectClass, closedWorld);
       }
 
       if (type.isVoid) return commonMasks.nullType;
-      if (type.element == coreClasses.nullClass) return commonMasks.nullType;
+      if (type.element == commonElements.nullClass) return commonMasks.nullType;
       if (type.treatAsDynamic) return commonMasks.dynamicType;
       return new TypeMask.nonNullSubtype(type.element, closedWorld);
     }
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index 3149368..94a88bb 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -112,7 +112,7 @@
       }
     }
     return compiler.types.isAssignable(
-        computeType(compiler.resolution), compiler.coreTypes.functionType);
+        computeType(compiler.resolution), compiler.commonElements.functionType);
   }
 }
 
@@ -229,7 +229,8 @@
 
   String get name => type.name;
 
-  DartType computeType(Resolution resolution) => resolution.coreTypes.typeType;
+  DartType computeType(Resolution resolution) =>
+      resolution.commonElements.typeType;
 
   String toString() => 'TypeLiteralAccess($type)';
 }
@@ -297,16 +298,16 @@
   /// The immediately enclosing field, method or constructor being analyzed.
   ExecutableElement executableContext;
 
-  CoreTypes get coreTypes => compiler.coreTypes;
+  CommonElements get commonElements => compiler.commonElements;
 
   DiagnosticReporter get reporter => compiler.reporter;
 
   Resolution get resolution => compiler.resolution;
 
-  InterfaceType get intType => coreTypes.intType;
-  InterfaceType get doubleType => coreTypes.doubleType;
-  InterfaceType get boolType => coreTypes.boolType;
-  InterfaceType get stringType => coreTypes.stringType;
+  InterfaceType get intType => commonElements.intType;
+  InterfaceType get doubleType => commonElements.doubleType;
+  InterfaceType get boolType => commonElements.boolType;
+  InterfaceType get stringType => commonElements.stringType;
 
   DartType thisType;
   DartType superType;
@@ -429,7 +430,8 @@
 
   /// If [inInitializer] is true, assignment should be interpreted as write to
   /// a field and not to a setter.
-  DartType analyze(Node node, {bool inInitializer: false}) {
+  DartType analyze(Node node,
+      {bool inInitializer: false, bool mustHaveType: true}) {
     if (node == null) {
       final String error = 'Unexpected node: null';
       if (lastSeenNode != null) {
@@ -444,12 +446,18 @@
     analyzingInitializer = inInitializer;
     DartType result = node.accept(this);
     analyzingInitializer = previouslyInitializer;
-    if (result == null) {
+    if (result == null && mustHaveType) {
       reporter.internalError(node, 'Type is null.');
     }
     return result;
   }
 
+  void analyzeUntyped(Node node, {bool inInitializer: false}) {
+    if (node != null) {
+      analyze(node, inInitializer: inInitializer, mustHaveType: false);
+    }
+  }
+
   void checkTypePromotion(Node node, TypePromotion typePromotion,
       {bool checkAccesses: false}) {
     VariableElement variable = typePromotion.variable;
@@ -529,7 +537,8 @@
   }
 
   /// Analyze [node] in the context of the known types shown in [context].
-  DartType analyzeInPromotedContext(Node context, Node node) {
+  DartType analyzeInPromotedContext(Node context, Node node,
+      {bool mustHaveType: true}) {
     Link<TypePromotion> knownForNode = const Link<TypePromotion>();
     for (TypePromotion typePromotion in getShownTypePromotionsFor(context)) {
       typePromotion = typePromotion.copy();
@@ -538,7 +547,7 @@
       registerKnownTypePromotion(typePromotion);
     }
 
-    final DartType type = analyze(node);
+    final DartType type = analyze(node, mustHaveType: mustHaveType);
 
     while (!knownForNode.isEmpty) {
       unregisterKnownTypePromotion(knownForNode.head);
@@ -582,14 +591,13 @@
     return type;
   }
 
-  DartType visitAssert(Assert node) {
+  visitAssert(Assert node) {
     analyze(node.condition);
     if (node.hasMessage) analyze(node.message);
-    return const StatementType();
   }
 
-  DartType visitBlock(Block node) {
-    return analyze(node.statements);
+  visitBlock(Block node) {
+    analyzeUntyped(node.statements);
   }
 
   DartType visitCascade(Cascade node) {
@@ -603,35 +611,32 @@
     return type;
   }
 
-  DartType visitDoWhile(DoWhile node) {
-    analyze(node.body);
+  visitDoWhile(DoWhile node) {
+    analyzeUntyped(node.body);
     checkCondition(node.condition);
-    return const StatementType();
   }
 
-  DartType visitExpressionStatement(ExpressionStatement node) {
+  visitExpressionStatement(ExpressionStatement node) {
     Expression expression = node.expression;
     analyze(expression);
-    return const StatementType();
   }
 
   /** Dart Programming Language Specification: 11.5.1 For Loop */
-  DartType visitFor(For node) {
+  visitFor(For node) {
     if (node.initializer != null) {
-      analyze(node.initializer);
+      analyzeUntyped(node.initializer);
     }
     if (node.condition != null) {
       checkCondition(node.condition);
     }
     if (node.update != null) {
-      analyze(node.update);
+      analyzeUntyped(node.update);
     }
-    return analyze(node.body);
+    analyzeUntyped(node.body);
   }
 
-  DartType visitFunctionDeclaration(FunctionDeclaration node) {
+  visitFunctionDeclaration(FunctionDeclaration node) {
     analyze(node.function);
-    return const StatementType();
   }
 
   DartType visitFunctionExpression(FunctionExpression node) {
@@ -653,7 +658,7 @@
         }
       });
       if (node.initializers != null) {
-        analyze(node.initializers, inInitializer: true);
+        analyzeUntyped(node.initializers, inInitializer: true);
       }
     } else {
       FunctionType functionType = element.computeType(resolution);
@@ -667,7 +672,7 @@
 
     executableContext = element;
     currentAsyncMarker = element.asyncMarker;
-    analyze(node.body);
+    analyzeUntyped(node.body);
 
     executableContext = previousExecutableContext;
     expectedReturnType = previousReturnType;
@@ -691,16 +696,15 @@
     }
   }
 
-  DartType visitIf(If node) {
+  visitIf(If node) {
     Expression condition = node.condition.expression;
     Statement thenPart = node.thenPart;
 
     checkCondition(node.condition);
-    analyzeInPromotedContext(condition, thenPart);
+    analyzeInPromotedContext(condition, thenPart, mustHaveType: false);
     if (node.elsePart != null) {
-      analyze(node.elsePart);
+      analyzeUntyped(node.elsePart);
     }
-    return const StatementType();
   }
 
   void checkPrivateAccess(Node node, Element element, String name) {
@@ -748,7 +752,7 @@
           // This is an access the implicit 'call' method of a function type.
           return new FunctionCallAccess(receiverElement, unaliasedBound);
         }
-        if (types.isSubtype(interface, coreTypes.functionType)) {
+        if (types.isSubtype(interface, commonElements.functionType)) {
           // This is an access of the special 'call' method implicitly defined
           // on 'Function'. This method can be called with any arguments, which
           // we ensure by giving it the type 'dynamic'.
@@ -1598,7 +1602,7 @@
   }
 
   DartType visitLiteralSymbol(LiteralSymbol node) {
-    return coreTypes.symbolType;
+    return commonElements.symbolType;
   }
 
   DartType computeConstructorType(
@@ -1651,27 +1655,25 @@
     return listType;
   }
 
-  DartType visitNodeList(NodeList node) {
+  visitNodeList(NodeList node) {
     for (Link<Node> link = node.nodes; !link.isEmpty; link = link.tail) {
-      analyze(link.head, inInitializer: analyzingInitializer);
+      analyzeUntyped(link.head, inInitializer: analyzingInitializer);
     }
-    return const StatementType();
   }
 
-  DartType visitRedirectingFactoryBody(RedirectingFactoryBody node) {
+  visitRedirectingFactoryBody(RedirectingFactoryBody node) {
     // TODO(lrn): Typecheck the body. It must refer to the constructor
     // of a subtype.
-    return const StatementType();
   }
 
-  DartType visitRethrow(Rethrow node) {
-    return const StatementType();
+  visitRethrow(Rethrow node) {
+    // Nothing to do here.
   }
 
   /** Dart Programming Language Specification: 11.10 Return */
-  DartType visitReturn(Return node) {
+  visitReturn(Return node) {
     if (identical(node.beginToken.stringValue, 'native')) {
-      return const StatementType();
+      return;
     }
 
     final Node expression = node.expression;
@@ -1685,7 +1687,8 @@
         // The resolver already emitted an error for this expression.
       } else {
         if (currentAsyncMarker == AsyncMarker.ASYNC) {
-          expressionType = coreTypes.futureType(types.flatten(expressionType));
+          expressionType =
+              commonElements.futureType(types.flatten(expressionType));
         }
         if (expectedReturnType.isVoid &&
             !types.isAssignable(expressionType, const VoidType())) {
@@ -1705,7 +1708,6 @@
       reportTypeWarning(
           node, MessageKind.RETURN_NOTHING, {'returnType': expectedReturnType});
     }
-    return const StatementType();
   }
 
   DartType visitThrow(Throw node) {
@@ -1727,22 +1729,21 @@
     DartType resultType = analyze(node.expression);
     if (!node.hasStar) {
       if (currentAsyncMarker.isAsync) {
-        resultType = coreTypes.streamType(resultType);
+        resultType = commonElements.streamType(resultType);
       } else {
-        resultType = coreTypes.iterableType(resultType);
+        resultType = commonElements.iterableType(resultType);
       }
     } else {
       if (currentAsyncMarker.isAsync) {
         // The static type of expression must be assignable to Stream.
-        checkAssignable(node, resultType, coreTypes.streamType());
+        checkAssignable(node, resultType, commonElements.streamType());
       } else {
         // The static type of expression must be assignable to Iterable.
-        checkAssignable(node, resultType, coreTypes.iterableType());
+        checkAssignable(node, resultType, commonElements.iterableType());
       }
     }
     // The static type of the result must be assignable to the declared type.
     checkAssignable(node, resultType, expectedReturnType);
-    return const StatementType();
   }
 
   DartType visitTypeAnnotation(TypeAnnotation node) {
@@ -1766,7 +1767,7 @@
     checkAssignable(spannable, expressionType, declaredType);
   }
 
-  DartType visitVariableDefinitions(VariableDefinitions node) {
+  visitVariableDefinitions(VariableDefinitions node) {
     DartType type = analyzeVariableTypeAnnotation(node);
     for (Link<Node> link = node.definitions.nodes;
         !link.isEmpty;
@@ -1791,13 +1792,11 @@
         // }
       }
     }
-    return const StatementType();
   }
 
-  DartType visitWhile(While node) {
+  visitWhile(While node) {
     checkCondition(node.condition);
-    analyze(node.body);
-    return const StatementType();
+    analyzeUntyped(node.body);
   }
 
   DartType visitParenthesizedExpression(ParenthesizedExpression node) {
@@ -1832,15 +1831,15 @@
   }
 
   visitEmptyStatement(EmptyStatement node) {
-    return const StatementType();
+    // Nothing to do here.
   }
 
   visitBreakStatement(BreakStatement node) {
-    return const StatementType();
+    // Nothing to do here.
   }
 
   visitContinueStatement(ContinueStatement node) {
-    return const StatementType();
+    // Nothing to do here.
   }
 
   DartType computeForInElementType(ForIn node) {
@@ -1857,7 +1856,7 @@
     DartType elementType = computeForInElementType(node);
     DartType expressionType = analyze(node.expression);
     if (resolution.target.supportsAsyncAwait) {
-      DartType streamOfDynamic = coreTypes.streamType();
+      DartType streamOfDynamic = commonElements.streamType();
       if (!types.isAssignable(expressionType, streamOfDynamic)) {
         reportMessage(node.expression, MessageKind.NOT_ASSIGNABLE,
             {'fromType': expressionType, 'toType': streamOfDynamic},
@@ -1885,8 +1884,7 @@
         }
       }
     }
-    analyze(node.body);
-    return const StatementType();
+    analyzeUntyped(node.body);
   }
 
   visitSyncForIn(SyncForIn node) {
@@ -1908,12 +1906,11 @@
           },
           isHint: true);
     }
-    analyze(node.body);
-    return const StatementType();
+    analyzeUntyped(node.body);
   }
 
   visitLabeledStatement(LabeledStatement node) {
-    return analyze(node.statement);
+    analyzeUntyped(node.statement);
   }
 
   visitLiteralMap(LiteralMap node) {
@@ -1963,7 +1960,7 @@
         checkAssignable(caseMatch, expressionType, caseType);
       }
 
-      analyze(switchCase);
+      analyzeUntyped(switchCase);
     }
 
     if (!hasDefaultCase && expressionType.isEnumType) {
@@ -2006,28 +2003,25 @@
         }
       });
     }
-
-    return const StatementType();
   }
 
   visitSwitchCase(SwitchCase node) {
-    return analyze(node.statements);
+    analyzeUntyped(node.statements);
   }
 
   visitTryStatement(TryStatement node) {
     // TODO(johnniwinther): Use reachability information of try-block,
     // catch-blocks and finally-block to compute the whether the try statement
     // is returning.
-    analyze(node.tryBlock);
+    analyzeUntyped(node.tryBlock);
     for (CatchBlock catchBlock in node.catchBlocks) {
-      analyze(catchBlock);
+      analyzeUntyped(catchBlock);
     }
-    analyzeWithDefault(node.finallyBlock, null);
-    return const StatementType();
+    analyzeUntyped(node.finallyBlock);
   }
 
   visitCatchBlock(CatchBlock node) {
-    return analyze(node.block);
+    analyzeUntyped(node.block);
   }
 
   visitTypedef(Typedef node) {
diff --git a/pkg/compiler/lib/src/types/flat_type_mask.dart b/pkg/compiler/lib/src/types/flat_type_mask.dart
index b93b1e6..80a4734 100644
--- a/pkg/compiler/lib/src/types/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/types/flat_type_mask.dart
@@ -113,22 +113,22 @@
     // not track correctly the list of truly instantiated classes.
     BackendClasses backendClasses = closedWorld.backendClasses;
     if (containsOnlyString(closedWorld)) {
-      return cls == closedWorld.coreClasses.stringClass ||
+      return cls == closedWorld.commonElements.stringClass ||
           cls == backendClasses.stringImplementation;
     }
     if (containsOnlyBool(closedWorld)) {
-      return cls == closedWorld.coreClasses.boolClass ||
+      return cls == closedWorld.commonElements.boolClass ||
           cls == backendClasses.boolImplementation;
     }
     if (containsOnlyInt(closedWorld)) {
-      return cls == closedWorld.coreClasses.intClass ||
+      return cls == closedWorld.commonElements.intClass ||
           cls == backendClasses.intImplementation ||
           cls == backendClasses.positiveIntImplementation ||
           cls == backendClasses.uint32Implementation ||
           cls == backendClasses.uint31Implementation;
     }
     if (containsOnlyDouble(closedWorld)) {
-      return cls == closedWorld.coreClasses.doubleClass ||
+      return cls == closedWorld.commonElements.doubleClass ||
           cls == backendClasses.doubleImplementation;
     }
     return false;
@@ -158,7 +158,8 @@
     // TODO(herhut): Add check whether flatOther.base is superclass of
     //               all subclasses of this.base.
     if (flatOther.isSubclass) {
-      if (isSubtype) return (otherBase == closedWorld.coreClasses.objectClass);
+      if (isSubtype)
+        return (otherBase == closedWorld.commonElements.objectClass);
       return closedWorld.isSubclassOf(base, otherBase);
     }
     assert(flatOther.isSubtype);
@@ -172,7 +173,7 @@
 
   bool containsOnlyInt(ClosedWorld closedWorld) {
     BackendClasses backendClasses = closedWorld.backendClasses;
-    return base == closedWorld.coreClasses.intClass ||
+    return base == closedWorld.commonElements.intClass ||
         base == backendClasses.intImplementation ||
         base == backendClasses.positiveIntImplementation ||
         base == backendClasses.uint31Implementation ||
@@ -181,7 +182,7 @@
 
   bool containsOnlyDouble(ClosedWorld closedWorld) {
     BackendClasses backendClasses = closedWorld.backendClasses;
-    return base == closedWorld.coreClasses.doubleClass ||
+    return base == closedWorld.commonElements.doubleClass ||
         base == backendClasses.doubleImplementation;
   }
 
@@ -189,19 +190,19 @@
     BackendClasses backendClasses = closedWorld.backendClasses;
     return containsOnlyInt(closedWorld) ||
         containsOnlyDouble(closedWorld) ||
-        base == closedWorld.coreClasses.numClass ||
+        base == closedWorld.commonElements.numClass ||
         base == backendClasses.numImplementation;
   }
 
   bool containsOnlyBool(ClosedWorld closedWorld) {
     BackendClasses backendClasses = closedWorld.backendClasses;
-    return base == closedWorld.coreClasses.boolClass ||
+    return base == closedWorld.commonElements.boolClass ||
         base == backendClasses.boolImplementation;
   }
 
   bool containsOnlyString(ClosedWorld closedWorld) {
     BackendClasses backendClasses = closedWorld.backendClasses;
-    return base == closedWorld.coreClasses.stringClass ||
+    return base == closedWorld.commonElements.stringClass ||
         base == backendClasses.stringImplementation;
   }
 
@@ -237,7 +238,7 @@
    */
   bool containsAll(ClosedWorld closedWorld) {
     if (isEmptyOrNull || isExact) return false;
-    return identical(base, closedWorld.coreClasses.objectClass);
+    return identical(base, closedWorld.commonElements.objectClass);
   }
 
   TypeMask union(TypeMask other, ClosedWorld closedWorld) {
@@ -292,7 +293,7 @@
     assert(TypeMask.assertIsNormalized(other, closedWorld));
     int combined;
     if ((isExact && other.isExact) ||
-        base == closedWorld.coreClasses.objectClass) {
+        base == closedWorld.commonElements.objectClass) {
       // Since the other mask is a subclass of this mask, we need the
       // resulting union to be a subclass too. If either one of the
       // masks are nullable the result should be nullable too.
diff --git a/pkg/compiler/lib/src/types/masks.dart b/pkg/compiler/lib/src/types/masks.dart
index f44446a..a713dc8 100644
--- a/pkg/compiler/lib/src/types/masks.dart
+++ b/pkg/compiler/lib/src/types/masks.dart
@@ -69,11 +69,11 @@
   TypeMask _unmodifiableArrayType;
   TypeMask _interceptorType;
 
-  TypeMask get dynamicType => _dynamicType ??=
-      new TypeMask.subclass(closedWorld.coreClasses.objectClass, closedWorld);
+  TypeMask get dynamicType => _dynamicType ??= new TypeMask.subclass(
+      closedWorld.commonElements.objectClass, closedWorld);
 
   TypeMask get nonNullType => _nonNullType ??= new TypeMask.nonNullSubclass(
-      closedWorld.coreClasses.objectClass, closedWorld);
+      closedWorld.commonElements.objectClass, closedWorld);
 
   TypeMask get intType => _intType ??= new TypeMask.nonNullSubclass(
       backendClasses.intImplementation, closedWorld);
diff --git a/pkg/compiler/lib/src/types/type_mask.dart b/pkg/compiler/lib/src/types/type_mask.dart
index c91fac6..e985433 100644
--- a/pkg/compiler/lib/src/types/type_mask.dart
+++ b/pkg/compiler/lib/src/types/type_mask.dart
@@ -25,7 +25,7 @@
   bool needsNoSuchMethodHandling(Selector selector, ClosedWorld world) {
     if (isAll) {
       TypeMask mask =
-          new TypeMask.subclass(world.coreClasses.objectClass, world);
+          new TypeMask.subclass(world.commonElements.objectClass, world);
       return mask.needsNoSuchMethodHandling(selector, world);
     }
     for (TypeMask mask in _masks) {
diff --git a/pkg/compiler/lib/src/types/union_type_mask.dart b/pkg/compiler/lib/src/types/union_type_mask.dart
index eada935..3c7dfcc 100644
--- a/pkg/compiler/lib/src/types/union_type_mask.dart
+++ b/pkg/compiler/lib/src/types/union_type_mask.dart
@@ -219,13 +219,13 @@
     // Ensure the cheap test fails.
     assert(!disjointMasks.any((mask) => mask.containsMask(other, closedWorld)));
     // If we cover object, we should never get here.
-    assert(!contains(closedWorld.coreClasses.objectClass, closedWorld));
+    assert(!contains(closedWorld.commonElements.objectClass, closedWorld));
     // Likewise, nullness should be covered.
     assert(isNullable || !other.isNullable);
     // The fast test is precise for exact types.
     if (other.isExact) return false;
     // We cannot contain object.
-    if (other.contains(closedWorld.coreClasses.objectClass, closedWorld)) {
+    if (other.contains(closedWorld.commonElements.objectClass, closedWorld)) {
       return false;
     }
     FlatTypeMask flat = TypeMask.nonForwardingMask(other);
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index 0fb0018..b99e1fe 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.dart
@@ -13,13 +13,8 @@
 import 'selector.dart' show Selector;
 import 'world_builder.dart' show ReceiverConstraint;
 
-// TODO(kasperl): This actually holds getters and setters just fine
-// too and stricly they aren't functions. Maybe this needs a better
-// name -- something like ElementSet seems a bit too generic.
-class FunctionSet {
-  final ClosedWorld closedWorld;
+class FunctionSetBuilder {
   final Map<String, FunctionSetNode> nodes = new Map<String, FunctionSetNode>();
-  FunctionSet(this.closedWorld);
 
   FunctionSetNode newNode(String name) => new FunctionSetNode(name);
 
@@ -41,6 +36,20 @@
     }
   }
 
+  FunctionSet close(ClosedWorld closedWorld) {
+    return new FunctionSet(closedWorld, nodes);
+  }
+}
+
+// TODO(kasperl): This actually holds getters and setters just fine
+// too and stricly they aren't functions. Maybe this needs a better
+// name -- something like ElementSet seems a bit too generic.
+class FunctionSet {
+  final ClosedWorld closedWorld;
+  final Map<String, FunctionSetNode> nodes;
+
+  FunctionSet(this.closedWorld, this.nodes);
+
   bool contains(Element element) {
     assert(element.isInstanceMember);
     assert(!element.isAbstract);
@@ -74,7 +83,7 @@
         : new SelectorMask(
             selector,
             new TypeMask.subclass(
-                closedWorld.coreClasses.objectClass, closedWorld));
+                closedWorld.commonElements.objectClass, closedWorld));
   }
 
   /// Returns the set of functions that can be the target of a call to
@@ -279,8 +288,8 @@
 
   @override
   TypeMask computeMask(ClosedWorld closedWorld) {
-    assert(
-        closedWorld.hasAnyStrictSubclass(closedWorld.coreClasses.objectClass));
+    assert(closedWorld
+        .hasAnyStrictSubclass(closedWorld.commonElements.objectClass));
     if (_mask != null) return _mask;
     return _mask = new TypeMask.unionOf(
         functions.expand((element) {
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index cd676bd..05cae63 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -12,13 +12,15 @@
 import '../common/names.dart' show Identifiers;
 import '../common/resolution.dart' show Resolution;
 import '../compiler.dart' show Compiler;
+import '../core_types.dart';
 import '../dart_types.dart';
 import '../elements/elements.dart';
 import '../elements/entities.dart';
-import '../universe/class_set.dart' show Instantiation;
+import '../universe/class_set.dart';
+import '../universe/function_set.dart' show FunctionSetBuilder;
 import '../util/enumset.dart';
 import '../util/util.dart';
-import '../world.dart' show World, ClosedWorld, OpenWorld, WorldImpl;
+import '../world.dart' show World, ClosedWorld, ClosedWorldImpl, OpenWorld;
 import 'selector.dart' show Selector;
 import 'use.dart' show DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
 
@@ -109,6 +111,39 @@
   UniverseSelectorConstraints createSelectorConstraints(Selector selector);
 }
 
+class OpenWorldStrategy implements SelectorConstraintsStrategy {
+  const OpenWorldStrategy();
+
+  OpenWorldConstraints createSelectorConstraints(Selector selector) {
+    return new OpenWorldConstraints();
+  }
+}
+
+class OpenWorldConstraints extends UniverseSelectorConstraints {
+  bool isAll = false;
+
+  @override
+  bool applies(Element element, Selector selector, World world) => isAll;
+
+  @override
+  bool needsNoSuchMethodHandling(Selector selector, World world) => isAll;
+
+  @override
+  bool addReceiverConstraint(ReceiverConstraint constraint) {
+    if (isAll) return false;
+    isAll = true;
+    return true;
+  }
+
+  String toString() {
+    if (isAll) {
+      return '<all>';
+    } else {
+      return '<none>';
+    }
+  }
+}
+
 /// The [WorldBuilder] is an auxiliary class used in the process of computing
 /// the [ClosedWorld].
 // TODO(johnniwinther): Move common implementation to a [WorldBuilderBase] when
@@ -133,7 +168,7 @@
   Iterable<DartType> get instantiatedTypes;
 }
 
-abstract class ResolutionWorldBuilder implements WorldBuilder {
+abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld {
   /// Set of (live) local functions (closures) whose signatures reference type
   /// variables.
   ///
@@ -169,10 +204,6 @@
   /// Returns `true` if [member] is invoked as a setter.
   bool hasInvokedSetter(Element member);
 
-  /// The [OpenWorld] being created by this world builder.
-  // TODO(johnniwinther): Merge this with [ResolutionWorldBuilder].
-  OpenWorld get openWorld;
-
   /// The closed world computed by this world builder.
   ///
   /// This is only available after the world builder has been closed.
@@ -430,30 +461,49 @@
   /// and classes.
   bool useInstantiationMap = false;
 
-  WorldImpl _openWorld;
-
   final Backend _backend;
   final Resolution _resolution;
+  bool _closed = false;
+  ClosedWorld _closedWorldCache;
+  FunctionSetBuilder _allFunctions;
+
+  final Set<TypedefElement> _allTypedefs = new Set<TypedefElement>();
+
+  final Map<ClassElement, Set<MixinApplicationElement>> _mixinUses =
+      new Map<ClassElement, Set<MixinApplicationElement>>();
+
+  // We keep track of subtype and subclass relationships in four
+  // distinct sets to make class hierarchy analysis faster.
+  final Map<ClassElement, ClassHierarchyNode> _classHierarchyNodes =
+      <ClassElement, ClassHierarchyNode>{};
+  final Map<ClassElement, ClassSet> _classSets = <ClassElement, ClassSet>{};
+
+  final Set<Element> alreadyPopulated;
+
+  final CacheStrategy cacheStrategy;
+
+  bool get isClosed => _closed;
 
   ResolutionWorldBuilderImpl(Backend backend, Resolution resolution,
       CacheStrategy cacheStrategy, this.selectorConstraintsStrategy)
       : this._backend = backend,
-        this._resolution = resolution {
-    _openWorld = new WorldImpl(this, backend, resolution.coreClasses,
-        resolution.coreTypes, cacheStrategy);
+        this._resolution = resolution,
+        this.cacheStrategy = cacheStrategy,
+        alreadyPopulated = cacheStrategy.newSet() {
+    _allFunctions = new FunctionSetBuilder();
   }
 
   Iterable<ClassElement> get processedClasses => _processedClasses.keys
       .where((cls) => _processedClasses[cls].isInstantiated);
 
-  OpenWorld get openWorld => _openWorld;
+  CommonElements get commonElements => _resolution.commonElements;
 
   ClosedWorld get closedWorldForTesting {
-    if (!_openWorld.isClosed) {
+    if (!_closed) {
       throw new SpannableAssertionFailure(
           NO_LOCATION_SPANNABLE, "The world builder has not yet been closed.");
     }
-    return _openWorld;
+    return _closedWorldCache;
   }
 
   /// All directly instantiated classes, that is, classes with a generative
@@ -538,15 +588,11 @@
     // TODO(johnniwinther): Use [_instantiationInfo] to compute this information
     // instead.
     if (_implementedClasses.add(cls)) {
-      void onImplemented(ClassElement cls) {
-        _ClassUsage usage = _getClassUsage(cls);
-        classUsed(usage.cls, usage.implement());
-      }
-
-      onImplemented(cls);
+      classUsed(cls, _getClassUsage(cls).implement());
       cls.allSupertypes.forEach((InterfaceType supertype) {
         if (_implementedClasses.add(supertype.element)) {
-          onImplemented(supertype.element);
+          classUsed(
+              supertype.element, _getClassUsage(supertype.element).implement());
         }
       });
     }
@@ -563,7 +609,7 @@
     for (Selector selector in selectors.keys) {
       if (selector.appliesUnnamed(member)) {
         SelectorConstraints masks = selectors[selector];
-        if (masks.applies(member, selector, _openWorld)) {
+        if (masks.applies(member, selector, this)) {
           return true;
         }
       }
@@ -632,45 +678,33 @@
       DynamicUse dynamicUse, MemberUsedCallback memberUsed) {
     Selector selector = dynamicUse.selector;
     String methodName = selector.name;
+
+    void _process(Map<String, Set<_MemberUsage>> memberMap,
+        EnumSet<MemberUse> action(_MemberUsage usage)) {
+      _processSet(memberMap, methodName, (_MemberUsage usage) {
+        if (dynamicUse.appliesUnnamed(usage.entity, this)) {
+          memberUsed(usage.entity, action(usage));
+          return true;
+        }
+        return false;
+      });
+    }
+
     switch (dynamicUse.kind) {
       case DynamicUseKind.INVOKE:
         if (_registerNewSelector(dynamicUse, _invokedNames)) {
-          _processInstanceMembers(methodName, (_MemberUsage usage) {
-            if (dynamicUse.appliesUnnamed(usage.entity, _openWorld)) {
-              memberUsed(usage.entity, usage.invoke());
-              return true;
-            }
-            return false;
-          });
+          _process(_instanceMembersByName, (m) => m.invoke());
         }
         break;
       case DynamicUseKind.GET:
         if (_registerNewSelector(dynamicUse, _invokedGetters)) {
-          _processInstanceMembers(methodName, (_MemberUsage usage) {
-            if (dynamicUse.appliesUnnamed(usage.entity, _openWorld)) {
-              memberUsed(usage.entity, usage.read());
-              return true;
-            }
-            return false;
-          });
-          _processInstanceFunctions(methodName, (_MemberUsage usage) {
-            if (dynamicUse.appliesUnnamed(usage.entity, _openWorld)) {
-              memberUsed(usage.entity, usage.read());
-              return true;
-            }
-            return false;
-          });
+          _process(_instanceMembersByName, (m) => m.read());
+          _process(_instanceFunctionsByName, (m) => m.read());
         }
         break;
       case DynamicUseKind.SET:
         if (_registerNewSelector(dynamicUse, _invokedSetters)) {
-          _processInstanceMembers(methodName, (_MemberUsage usage) {
-            if (dynamicUse.appliesUnnamed(usage.entity, _openWorld)) {
-              memberUsed(usage.entity, usage.write());
-              return true;
-            }
-            return false;
-          });
+          _process(_instanceMembersByName, (m) => m.write());
         }
         break;
     }
@@ -827,7 +861,7 @@
     });
   }
 
-  /// Call [updateUsage] on all [MemberUsage]s in the set in [map] for
+  /// Call [updateUsage] on all [_MemberUsage]s in the set in [map] for
   /// [memberName]. If [updateUsage] returns `true` the usage is removed from
   /// the set.
   void _processSet(Map<String, Set<_MemberUsage>> map, String memberName,
@@ -845,22 +879,12 @@
     map[memberName].addAll(remaining);
   }
 
-  void _processInstanceMembers(String name, bool updateUsage(_MemberUsage e)) {
-    _processSet(_instanceMembersByName, name, updateUsage);
-  }
-
-  void _processInstanceFunctions(
-      String name, bool updateUsage(_MemberUsage e)) {
-    _processSet(_instanceFunctionsByName, name, updateUsage);
-  }
-
   void _processInstantiatedClassMember(
       ClassElement cls, MemberElement member, MemberUsedCallback memberUsed) {
     assert(invariant(member, member.isDeclaration));
     if (!member.isInstanceMember) return;
     String memberName = member.name;
     member.computeType(_resolution);
-    EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
     // The obvious thing to test here would be "member.isNative",
     // however, that only works after metadata has been parsed/analyzed,
     // and that may not have happened yet.
@@ -868,12 +892,13 @@
     // its metadata parsed and analyzed.
     // Note: this assumes that there are no non-native fields on native
     // classes, which may not be the case when a native class is subclassed.
-    bool isNative = _backend.isNative(cls);
-    _MemberUsage usage = _instanceMemberUsage.putIfAbsent(member, () {
+    _instanceMemberUsage.putIfAbsent(member, () {
+      bool isNative = _backend.isNative(cls);
       _MemberUsage usage = new _MemberUsage(member, isNative: isNative);
+      EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
       useSet.addAll(usage.appliedUse);
       if (member.isField && isNative) {
-        _openWorld.registerUsedElement(member);
+        registerUsedElement(member);
       }
       if (member.isFunction &&
           member.name == Identifiers.call &&
@@ -910,6 +935,168 @@
       return usage;
     });
   }
+
+  /// Returns an iterable over all mixin applications that mixin [cls].
+  Iterable<MixinApplicationElement> allMixinUsesOf(ClassElement cls) {
+    Iterable<MixinApplicationElement> uses = _mixinUses[cls];
+    return uses != null ? uses : const <MixinApplicationElement>[];
+  }
+
+  /// Called to add [cls] to the set of known classes.
+  ///
+  /// This ensures that class hierarchy queries can be performed on [cls] and
+  /// classes that extend or implement it.
+  void registerClass(ClassElement cls) => _registerClass(cls);
+
+  void _registerClass(ClassElement cls, {bool isDirectlyInstantiated: false}) {
+    _ensureClassSet(cls);
+    if (isDirectlyInstantiated) {
+      _updateClassHierarchyNodeForClass(cls, directlyInstantiated: true);
+    }
+  }
+
+  void registerTypedef(TypedefElement typdef) {
+    _allTypedefs.add(typdef);
+  }
+
+  ClassHierarchyNode _ensureClassHierarchyNode(ClassElement cls) {
+    cls = cls.declaration;
+    return _classHierarchyNodes.putIfAbsent(cls, () {
+      ClassHierarchyNode parentNode;
+      if (cls.superclass != null) {
+        parentNode = _ensureClassHierarchyNode(cls.superclass);
+      }
+      return new ClassHierarchyNode(parentNode, cls);
+    });
+  }
+
+  ClassSet _ensureClassSet(ClassElement cls) {
+    cls = cls.declaration;
+    return _classSets.putIfAbsent(cls, () {
+      ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
+      ClassSet classSet = new ClassSet(node);
+
+      for (InterfaceType type in cls.allSupertypes) {
+        // TODO(johnniwinther): Optimization: Avoid adding [cls] to
+        // superclasses.
+        ClassSet subtypeSet = _ensureClassSet(type.element);
+        subtypeSet.addSubtype(node);
+      }
+      if (cls.isMixinApplication) {
+        // TODO(johnniwinther): Store this in the [ClassSet].
+        MixinApplicationElement mixinApplication = cls;
+        if (mixinApplication.mixin != null) {
+          // If [mixinApplication] is malformed [mixin] is `null`.
+          registerMixinUse(mixinApplication, mixinApplication.mixin);
+        }
+      }
+
+      return classSet;
+    });
+  }
+
+  void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
+    // Ensure that classes implicitly implementing `Function` are in its
+    // subtype set.
+    ClassElement cls = node.cls;
+    if (cls != commonElements.functionClass &&
+        cls.implementsFunction(commonElements)) {
+      ClassSet subtypeSet = _ensureClassSet(commonElements.functionClass);
+      subtypeSet.addSubtype(node);
+    }
+    if (!node.isInstantiated && node.parentNode != null) {
+      _updateSuperClassHierarchyNodeForClass(node.parentNode);
+    }
+  }
+
+  void _updateClassHierarchyNodeForClass(ClassElement cls,
+      {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
+    ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
+    _updateSuperClassHierarchyNodeForClass(node);
+    if (directlyInstantiated) {
+      node.isDirectlyInstantiated = true;
+    }
+    if (abstractlyInstantiated) {
+      node.isAbstractlyInstantiated = true;
+    }
+  }
+
+  ClosedWorld closeWorld(DiagnosticReporter reporter) {
+    Map<ClassElement, Set<ClassElement>> typesImplementedBySubclasses =
+        new Map<ClassElement, Set<ClassElement>>();
+
+    /// Updates the `isDirectlyInstantiated` and `isIndirectlyInstantiated`
+    /// properties of the [ClassHierarchyNode] for [cls].
+
+    void addSubtypes(ClassElement cls, InstantiationInfo info) {
+      if (!info.hasInstantiation) {
+        return;
+      }
+      if (cacheStrategy.hasIncrementalSupport && !alreadyPopulated.add(cls)) {
+        return;
+      }
+      assert(cls.isDeclaration);
+      if (!cls.isResolved) {
+        reporter.internalError(cls, 'Class "${cls.name}" is not resolved.');
+      }
+
+      _updateClassHierarchyNodeForClass(cls,
+          directlyInstantiated: info.isDirectlyInstantiated,
+          abstractlyInstantiated: info.isAbstractlyInstantiated);
+
+      // Walk through the superclasses, and record the types
+      // implemented by that type on the superclasses.
+      ClassElement superclass = cls.superclass;
+      while (superclass != null) {
+        Set<Element> typesImplementedBySubclassesOfCls =
+            typesImplementedBySubclasses.putIfAbsent(
+                superclass, () => new Set<ClassElement>());
+        for (DartType current in cls.allSupertypes) {
+          typesImplementedBySubclassesOfCls.add(current.element);
+        }
+        superclass = superclass.superclass;
+      }
+    }
+
+    // Use the [:seenClasses:] set to include non-instantiated
+    // classes: if the superclass of these classes require RTI, then
+    // they also need RTI, so that a constructor passes the type
+    // variables to the super constructor.
+    forEachInstantiatedClass(addSubtypes);
+
+    _closed = true;
+    return _closedWorldCache = new ClosedWorldImpl(
+        backend: _backend,
+        commonElements: commonElements,
+        resolverWorld: this,
+        functionSetBuilder: _allFunctions,
+        allTypedefs: _allTypedefs,
+        mixinUses: _mixinUses,
+        typesImplementedBySubclasses: typesImplementedBySubclasses,
+        classHierarchyNodes: _classHierarchyNodes,
+        classSets: _classSets);
+  }
+
+  void registerMixinUse(
+      MixinApplicationElement mixinApplication, ClassElement mixin) {
+    // TODO(johnniwinther): Add map restricted to live classes.
+    // We don't support patch classes as mixin.
+    assert(mixin.isDeclaration);
+    Set<MixinApplicationElement> users =
+        _mixinUses.putIfAbsent(mixin, () => new Set<MixinApplicationElement>());
+    users.add(mixinApplication);
+  }
+
+  void registerUsedElement(MemberElement element) {
+    if (element.isInstanceMember && !element.isAbstract) {
+      _allFunctions.add(element);
+    }
+  }
+
+  ClosedWorld get closedWorldCache {
+    assert(isClosed);
+    return _closedWorldCache;
+  }
 }
 
 /// World builder specific to codegen.
@@ -946,6 +1133,8 @@
 }
 
 class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
+  final Backend _backend;
+
   /// The set of all directly instantiated classes, that is, classes with a
   /// generative constructor that has been called directly and not only through
   /// a super-call.
@@ -986,11 +1175,39 @@
   final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
       <String, Map<Selector, SelectorConstraints>>{};
 
+  final Map<ClassElement, _ClassUsage> _processedClasses =
+      <ClassElement, _ClassUsage>{};
+
+  /// Map of registered usage of static members of live classes.
+  final Map<Entity, _StaticMemberUsage> _staticMemberUsage =
+      <Entity, _StaticMemberUsage>{};
+
+  /// Map of registered usage of instance members of live classes.
+  final Map<MemberEntity, _MemberUsage> _instanceMemberUsage =
+      <MemberEntity, _MemberUsage>{};
+
+  /// Map containing instance members of live classes that are not yet live
+  /// themselves.
+  final Map<String, Set<_MemberUsage>> _instanceMembersByName =
+      <String, Set<_MemberUsage>>{};
+
+  /// Map containing instance methods of live classes that are not yet
+  /// closurized.
+  final Map<String, Set<_MemberUsage>> _instanceFunctionsByName =
+      <String, Set<_MemberUsage>>{};
+
   final Set<DartType> isChecks = new Set<DartType>();
 
   final SelectorConstraintsStrategy selectorConstraintsStrategy;
 
-  CodegenWorldBuilderImpl(this.selectorConstraintsStrategy);
+  CodegenWorldBuilderImpl(this._backend, this.selectorConstraintsStrategy);
+
+  // TODO(johnniwinther): Remove this hack:
+  ClosedWorld get _world =>
+      _backend.compiler.resolverWorld.closedWorldForTesting;
+
+  Iterable<ClassElement> get processedClasses => _processedClasses.keys
+      .where((cls) => _processedClasses[cls].isInstantiated);
 
   /// All directly instantiated classes, that is, classes with a generative
   /// constructor that has been called directly and not only through a
@@ -1013,12 +1230,12 @@
   // TODO(johnniwinther): Fully enforce the separation between exact, through
   // subclass and through subtype instantiated types/classes.
   // TODO(johnniwinther): Support unknown type arguments for generic types.
-  void registerTypeInstantiation(InterfaceType type,
-      {bool byMirrors: false,
-      bool isNative: false,
-      void onImplemented(ClassElement cls)}) {
-    _instantiatedTypes.add(type);
+  void registerTypeInstantiation(
+      InterfaceType type, ClassUsedCallback classUsed,
+      {bool byMirrors: false}) {
     ClassElement cls = type.element;
+    bool isNative = _backend.isNative(cls);
+    _instantiatedTypes.add(type);
     if (!cls.isAbstract
         // We can't use the closed-world assumption with native abstract
         // classes; a native abstract class may have non-abstract subclasses
@@ -1032,15 +1249,17 @@
         ||
         byMirrors) {
       _directlyInstantiatedClasses.add(cls);
+      _processInstantiatedClass(cls, classUsed);
     }
 
     // TODO(johnniwinther): Replace this by separate more specific mappings that
     // include the type arguments.
     if (_implementedClasses.add(cls)) {
-      onImplemented(cls);
+      classUsed(cls, _getClassUsage(cls).implement());
       cls.allSupertypes.forEach((InterfaceType supertype) {
         if (_implementedClasses.add(supertype.element)) {
-          onImplemented(supertype.element);
+          classUsed(
+              supertype.element, _getClassUsage(supertype.element).implement());
         }
       });
     }
@@ -1073,15 +1292,44 @@
     return _hasMatchingSelector(_invokedSetters[member.name], member, world);
   }
 
-  bool registerDynamicUse(DynamicUse dynamicUse) {
+  bool registerDynamicUse(
+      DynamicUse dynamicUse, MemberUsedCallback memberUsed) {
+    Selector selector = dynamicUse.selector;
+    String methodName = selector.name;
+
+    void _process(Map<String, Set<_MemberUsage>> memberMap,
+        EnumSet<MemberUse> action(_MemberUsage usage)) {
+      _processSet(memberMap, methodName, (_MemberUsage usage) {
+        if (dynamicUse.appliesUnnamed(usage.entity, _world)) {
+          memberUsed(usage.entity, action(usage));
+          return true;
+        }
+        return false;
+      });
+    }
+
     switch (dynamicUse.kind) {
       case DynamicUseKind.INVOKE:
-        return _registerNewSelector(dynamicUse, _invokedNames);
+        if (_registerNewSelector(dynamicUse, _invokedNames)) {
+          _process(_instanceMembersByName, (m) => m.invoke());
+          return true;
+        }
+        break;
       case DynamicUseKind.GET:
-        return _registerNewSelector(dynamicUse, _invokedGetters);
+        if (_registerNewSelector(dynamicUse, _invokedGetters)) {
+          _process(_instanceMembersByName, (m) => m.read());
+          _process(_instanceFunctionsByName, (m) => m.read());
+          return true;
+        }
+        break;
       case DynamicUseKind.SET:
-        return _registerNewSelector(dynamicUse, _invokedSetters);
+        if (_registerNewSelector(dynamicUse, _invokedSetters)) {
+          _process(_instanceMembersByName, (m) => m.write());
+          return true;
+        }
+        break;
     }
+    return false;
   }
 
   bool _registerNewSelector(DynamicUse dynamicUse,
@@ -1140,7 +1388,7 @@
     return type;
   }
 
-  void registerStaticUse(StaticUse staticUse) {
+  void _registerStaticUse(StaticUse staticUse) {
     Element element = staticUse.element;
     if (Elements.isStaticOrTopLevel(element) && element.isField) {
       allReferencedStaticFields.add(element);
@@ -1166,13 +1414,156 @@
     }
   }
 
+  void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
+    Element element = staticUse.element;
+    assert(invariant(element, element.isDeclaration,
+        message: "Element ${element} is not the declaration."));
+    _registerStaticUse(staticUse);
+    _StaticMemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
+      if ((element.isStatic || element.isTopLevel) && element.isFunction) {
+        return new _StaticFunctionUsage(element);
+      } else {
+        return new _GeneralStaticMemberUsage(element);
+      }
+    });
+    EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
+    switch (staticUse.kind) {
+      case StaticUseKind.STATIC_TEAR_OFF:
+        useSet.addAll(usage.tearOff());
+        break;
+      case StaticUseKind.FIELD_GET:
+      case StaticUseKind.FIELD_SET:
+      case StaticUseKind.CLOSURE:
+        // TODO(johnniwinther): Avoid this. Currently [FIELD_GET] and
+        // [FIELD_SET] contains [BoxFieldElement]s which we cannot enqueue.
+        // Also [CLOSURE] contains [LocalFunctionElement] which we cannot
+        // enqueue.
+        break;
+      case StaticUseKind.SUPER_FIELD_SET:
+      case StaticUseKind.SUPER_TEAR_OFF:
+      case StaticUseKind.GENERAL:
+      case StaticUseKind.DIRECT_USE:
+        useSet.addAll(usage.normalUse());
+        break;
+      case StaticUseKind.CONSTRUCTOR_INVOKE:
+      case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
+      case StaticUseKind.REDIRECTION:
+        useSet.addAll(usage.normalUse());
+        break;
+      case StaticUseKind.DIRECT_INVOKE:
+        _MemberUsage instanceUsage =
+            _getMemberUsage(staticUse.element, memberUsed);
+        memberUsed(instanceUsage.entity, instanceUsage.invoke());
+        _instanceMembersByName[instanceUsage.entity.name]
+            ?.remove(instanceUsage);
+        useSet.addAll(usage.normalUse());
+        break;
+    }
+    memberUsed(usage.entity, useSet);
+  }
+
   void forgetElement(Element element, Compiler compiler) {
+    _processedClasses.remove(element);
     _directlyInstantiatedClasses.remove(element);
     if (element is ClassElement) {
       assert(invariant(element, element.thisType.isRaw,
           message: 'Generic classes not supported (${element.thisType}).'));
       _instantiatedTypes..remove(element.rawType)..remove(element.thisType);
     }
+    removeFromSet(_instanceMembersByName, element);
+    removeFromSet(_instanceFunctionsByName, element);
+    if (element is MemberElement) {
+      for (Element closure in element.nestedClosures) {
+        removeFromSet(_instanceMembersByName, closure);
+        removeFromSet(_instanceFunctionsByName, closure);
+      }
+    }
+  }
+
+  void processClassMembers(ClassElement cls, MemberUsedCallback memberUsed) {
+    cls.implementation.forEachMember((_, MemberElement member) {
+      assert(invariant(member, member.isDeclaration));
+      if (!member.isInstanceMember) return;
+      _getMemberUsage(member, memberUsed);
+    });
+  }
+
+  _MemberUsage _getMemberUsage(
+      MemberElement member, MemberUsedCallback memberUsed) {
+    assert(invariant(member, member.isDeclaration));
+    return _instanceMemberUsage.putIfAbsent(member, () {
+      String memberName = member.name;
+      ClassElement cls = member.enclosingClass;
+      bool isNative = _backend.isNative(cls);
+      _MemberUsage usage = new _MemberUsage(member, isNative: isNative);
+      EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
+      useSet.addAll(usage.appliedUse);
+      if (hasInvokedGetter(member, _world)) {
+        useSet.addAll(usage.read());
+      }
+      if (hasInvokedSetter(member, _world)) {
+        useSet.addAll(usage.write());
+      }
+      if (hasInvocation(member, _world)) {
+        useSet.addAll(usage.invoke());
+      }
+
+      if (usage.pendingUse.contains(MemberUse.CLOSURIZE_INSTANCE)) {
+        // Store the member in [instanceFunctionsByName] to catch
+        // getters on the function.
+        _instanceFunctionsByName
+            .putIfAbsent(usage.entity.name, () => new Set<_MemberUsage>())
+            .add(usage);
+      }
+      if (usage.pendingUse.contains(MemberUse.NORMAL)) {
+        // The element is not yet used. Add it to the list of instance
+        // members to still be processed.
+        _instanceMembersByName
+            .putIfAbsent(memberName, () => new Set<_MemberUsage>())
+            .add(usage);
+      }
+      memberUsed(member, useSet);
+      return usage;
+    });
+  }
+
+  void _processSet(Map<String, Set<_MemberUsage>> map, String memberName,
+      bool f(_MemberUsage e)) {
+    Set<_MemberUsage> members = map[memberName];
+    if (members == null) return;
+    // [f] might add elements to [: map[memberName] :] during the loop below
+    // so we create a new list for [: map[memberName] :] and prepend the
+    // [remaining] members after the loop.
+    map[memberName] = new Set<_MemberUsage>();
+    Set<_MemberUsage> remaining = new Set<_MemberUsage>();
+    for (_MemberUsage member in members) {
+      if (!f(member)) remaining.add(member);
+    }
+    map[memberName].addAll(remaining);
+  }
+
+  /// Return the canonical [_ClassUsage] for [cls].
+  _ClassUsage _getClassUsage(ClassElement cls) {
+    return _processedClasses.putIfAbsent(cls, () => new _ClassUsage(cls));
+  }
+
+  void _processInstantiatedClass(
+      ClassElement cls, ClassUsedCallback classUsed) {
+    // Registers [superclass] as instantiated. Returns `true` if it wasn't
+    // already instantiated and we therefore have to process its superclass as
+    // well.
+    bool processClass(ClassElement superclass) {
+      _ClassUsage usage = _getClassUsage(superclass);
+      if (!usage.isInstantiated) {
+        classUsed(usage.cls, usage.instantiate());
+        return true;
+      }
+      return false;
+    }
+
+    while (cls != null && processClass(cls)) {
+      cls = cls.superclass;
+    }
   }
 }
 
@@ -1548,3 +1939,10 @@
   @override
   EnumSet<MemberUse> get _originalUse => MemberUses.ALL_STATIC;
 }
+
+void removeFromSet(Map<String, Set<_MemberUsage>> map, Element element) {
+  Set<_MemberUsage> set = map[element.name];
+  if (set == null) return;
+  set.removeAll(
+      set.where((_MemberUsage usage) => usage.entity == element).toList());
+}
diff --git a/pkg/compiler/lib/src/use_unused_api.dart b/pkg/compiler/lib/src/use_unused_api.dart
index da1cbdf..cff74c4 100644
--- a/pkg/compiler/lib/src/use_unused_api.dart
+++ b/pkg/compiler/lib/src/use_unused_api.dart
@@ -247,15 +247,15 @@
 usedByTests() {
   // TODO(ahe): We should try to avoid including API used only for tests. In
   // most cases, such API can be moved to a test library.
-  WorldImpl world = null;
+  ClosedWorldImpl closedWorld = null;
   type_graph_inferrer.TypeGraphInferrer typeGraphInferrer = null;
   source_file_provider.SourceFileProvider sourceFileProvider = null;
   sourceFileProvider.getSourceFile(null);
-  world.hasAnyUserDefinedGetter(null, null);
-  world.subclassesOf(null);
-  world.getClassHierarchyNode(null);
-  world.getClassSet(null);
-  world.haveAnyCommonSubtypes(null, null);
+  closedWorld.hasAnyUserDefinedGetter(null, null);
+  closedWorld.subclassesOf(null);
+  closedWorld.getClassHierarchyNode(null);
+  closedWorld.getClassSet(null);
+  closedWorld.haveAnyCommonSubtypes(null, null);
   typeGraphInferrer.getCallersOf(null);
   dart_types.Types.sorted(null);
   new dart_types.Types(null).copy(null);
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 76b2bc3..490390d 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -4,18 +4,18 @@
 
 library dart2js.world;
 
-import 'cache_strategy.dart';
-import 'closure.dart' show SynthesizedCallMethodElementX;
+import 'closure.dart' show ClosureClassElement, SynthesizedCallMethodElementX;
 import 'common/backend_api.dart' show BackendClasses;
 import 'common.dart';
 import 'constants/constant_system.dart';
-import 'core_types.dart' show CoreTypes, CoreClasses, CommonElements;
+import 'core_types.dart' show CommonElements;
 import 'dart_types.dart';
 import 'elements/elements.dart'
     show
         ClassElement,
         Element,
         FunctionElement,
+        MemberElement,
         MixinApplicationElement,
         TypedefElement,
         FieldElement;
@@ -23,11 +23,10 @@
 import 'ordered_typeset.dart';
 import 'types/masks.dart' show CommonMasks, FlatTypeMask, TypeMask;
 import 'universe/class_set.dart';
-import 'universe/function_set.dart' show FunctionSet;
+import 'universe/function_set.dart' show FunctionSet, FunctionSetBuilder;
 import 'universe/selector.dart' show Selector;
 import 'universe/side_effects.dart' show SideEffects;
-import 'universe/world_builder.dart'
-    show InstantiationInfo, ResolutionWorldBuilder;
+import 'universe/world_builder.dart' show ResolutionWorldBuilder;
 import 'util/util.dart' show Link;
 
 /// Common superinterface for [OpenWorld] and [ClosedWorld].
@@ -45,11 +44,6 @@
   /// Access to core classes used by the backend.
   BackendClasses get backendClasses;
 
-  /// Access to core classes used in the Dart language.
-  CoreClasses get coreClasses;
-
-  CoreTypes get coreTypes;
-
   CommonElements get commonElements;
 
   CommonMasks get commonMasks;
@@ -341,7 +335,7 @@
   /// classes that extend or implement it.
   void registerClass(ClassElement cls);
 
-  void registerUsedElement(Element element);
+  void registerUsedElement(MemberElement element);
   void registerTypedef(TypedefElement typedef);
 
   ClosedWorld closeWorld(DiagnosticReporter reporter);
@@ -350,13 +344,76 @@
   Iterable<MixinApplicationElement> allMixinUsesOf(ClassElement cls);
 }
 
-class WorldImpl implements ClosedWorld, ClosedWorldRefiner, OpenWorld {
-  bool _closed = false;
+/// Enum values defining subset of classes included in queries.
+enum ClassQuery {
+  /// Only the class itself is included.
+  EXACT,
 
-  TypeMask getCachedMask(ClassElement base, int flags, TypeMask createMask()) {
-    Map<ClassElement, TypeMask> cachedMasks =
-        _canonicalizedTypeMasks[flags] ??= <ClassElement, TypeMask>{};
-    return cachedMasks.putIfAbsent(base, createMask);
+  /// The class and all subclasses (transitively) are included.
+  SUBCLASS,
+
+  /// The class and all classes that implement or subclass it (transitively)
+  /// are included.
+  SUBTYPE,
+}
+
+class ClosedWorldImpl implements ClosedWorld, ClosedWorldRefiner {
+  final JavaScriptBackend _backend;
+  BackendClasses get backendClasses => _backend.backendClasses;
+  FunctionSet _allFunctions;
+
+  final Iterable<TypedefElement> _allTypedefs;
+
+  final Map<ClassElement, Set<MixinApplicationElement>> _mixinUses;
+  Map<ClassElement, List<MixinApplicationElement>> _liveMixinUses;
+
+  final Map<ClassElement, Set<ClassElement>> _typesImplementedBySubclasses;
+
+  // We keep track of subtype and subclass relationships in four
+  // distinct sets to make class hierarchy analysis faster.
+  final Map<ClassElement, ClassHierarchyNode> _classHierarchyNodes;
+  final Map<ClassElement, ClassSet> _classSets;
+
+  final Map<ClassElement, Map<ClassElement, bool>> _subtypeCoveredByCache =
+      <ClassElement, Map<ClassElement, bool>>{};
+
+  final Set<Element> functionsCalledInLoop = new Set<Element>();
+  final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>();
+
+  final Set<Element> sideEffectsFreeElements = new Set<Element>();
+
+  final Set<Element> elementsThatCannotThrow = new Set<Element>();
+
+  final Set<Element> functionsThatMightBePassedToApply =
+      new Set<FunctionElement>();
+
+  CommonMasks _commonMasks;
+
+  final CommonElements commonElements;
+
+  final ResolutionWorldBuilder _resolverWorld;
+
+  bool get isClosed => true;
+
+  ClosedWorldImpl(
+      {JavaScriptBackend backend,
+      this.commonElements,
+      ResolutionWorldBuilder resolverWorld,
+      FunctionSetBuilder functionSetBuilder,
+      Iterable<TypedefElement> allTypedefs,
+      Map<ClassElement, Set<MixinApplicationElement>> mixinUses,
+      Map<ClassElement, Set<ClassElement>> typesImplementedBySubclasses,
+      Map<ClassElement, ClassHierarchyNode> classHierarchyNodes,
+      Map<ClassElement, ClassSet> classSets})
+      : this._backend = backend,
+        this._resolverWorld = resolverWorld,
+        this._allTypedefs = allTypedefs,
+        this._mixinUses = mixinUses,
+        this._typesImplementedBySubclasses = typesImplementedBySubclasses,
+        this._classHierarchyNodes = classHierarchyNodes,
+        this._classSets = classSets {
+    _commonMasks = new CommonMasks(this);
+    _allFunctions = functionSetBuilder.close(this);
   }
 
   /// Cache of [FlatTypeMask]s grouped by the 8 possible values of the
@@ -364,6 +421,21 @@
   final List<Map<ClassElement, TypeMask>> _canonicalizedTypeMasks =
       new List<Map<ClassElement, TypeMask>>.filled(8, null);
 
+  FunctionSet get allFunctions => _allFunctions;
+
+  CommonMasks get commonMasks {
+    assert(isClosed);
+    return _commonMasks;
+  }
+
+  ConstantSystem get constantSystem => _backend.constantSystem;
+
+  TypeMask getCachedMask(ClassElement base, int flags, TypeMask createMask()) {
+    Map<ClassElement, TypeMask> cachedMasks =
+        _canonicalizedTypeMasks[flags] ??= <ClassElement, TypeMask>{};
+    return cachedMasks.putIfAbsent(base, createMask);
+  }
+
   bool checkInvariants(ClassElement cls, {bool mustBeInstantiated: true}) {
     return invariant(cls, cls.isDeclaration,
                 message: '$cls must be the declaration.') &&
@@ -384,10 +456,10 @@
     assert(checkInvariants(x));
     assert(checkInvariants(y, mustBeInstantiated: false));
 
-    if (y == coreClasses.objectClass) return true;
-    if (x == coreClasses.objectClass) return false;
+    if (y == commonElements.objectClass) return true;
+    if (x == commonElements.objectClass) return false;
     if (x.asInstanceOf(y) != null) return true;
-    if (y != coreClasses.functionClass) return false;
+    if (y != commonElements.functionClass) return false;
     return x.callType != null;
   }
 
@@ -397,8 +469,8 @@
     assert(checkInvariants(x));
     assert(checkInvariants(y));
 
-    if (y == coreClasses.objectClass) return true;
-    if (x == coreClasses.objectClass) return false;
+    if (y == commonElements.objectClass) return true;
+    if (x == commonElements.objectClass) return false;
     while (x != null && x.hierarchyDepth >= y.hierarchyDepth) {
       if (x == y) return true;
       x = x.superclass;
@@ -447,7 +519,7 @@
   /// Returns `true` if [cls] is implemented by an instantiated class.
   bool isImplemented(ClassElement cls) {
     assert(isClosed);
-    return resolverWorld.isImplemented(cls);
+    return _resolverWorld.isImplemented(cls);
   }
 
   /// Returns an iterable over the directly instantiated classes that extend
@@ -595,7 +667,7 @@
   bool hasOnlySubclasses(ClassElement cls) {
     assert(isClosed);
     // TODO(johnniwinther): move this to ClassSet?
-    if (cls == coreClasses.objectClass) return true;
+    if (cls == commonElements.objectClass) return true;
     ClassSet classSet = _classSets[cls.declaration];
     if (classSet == null) {
       // Vacuously true.
@@ -652,7 +724,7 @@
     List<ClassElement> commonSupertypes = <ClassElement>[];
     OUTER:
     for (Link<DartType> link = typeSet[depth];
-        link.head.element != coreClasses.objectClass;
+        link.head.element != commonElements.objectClass;
         link = link.tail) {
       ClassElement cls = link.head.element;
       for (Link<OrderedTypeSet> link = otherTypeSets;
@@ -664,16 +736,10 @@
       }
       commonSupertypes.add(cls);
     }
-    commonSupertypes.add(coreClasses.objectClass);
+    commonSupertypes.add(commonElements.objectClass);
     return commonSupertypes;
   }
 
-  /// Returns an iterable over all mixin applications that mixin [cls].
-  Iterable<MixinApplicationElement> allMixinUsesOf(ClassElement cls) {
-    Iterable<MixinApplicationElement> uses = _mixinUses[cls];
-    return uses != null ? uses : const <MixinApplicationElement>[];
-  }
-
   /// Returns an iterable over the live mixin applications that mixin [cls].
   Iterable<MixinApplicationElement> mixinUsesOf(ClassElement cls) {
     assert(isClosed);
@@ -758,7 +824,9 @@
   bool hasAnySubclassThatImplements(
       ClassElement superclass, ClassElement type) {
     assert(isClosed);
-    Set<ClassElement> subclasses = typesImplementedBySubclassesOf(superclass);
+
+    Set<ClassElement> subclasses =
+        _typesImplementedBySubclasses[superclass.declaration];
     if (subclasses == null) return false;
     return subclasses.contains(type);
   }
@@ -846,96 +914,6 @@
     }
   }
 
-  final JavaScriptBackend _backend;
-  BackendClasses get backendClasses => _backend.backendClasses;
-  FunctionSet _allFunctions;
-  final Set<Element> functionsCalledInLoop = new Set<Element>();
-  final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>();
-
-  final Set<TypedefElement> _allTypedefs = new Set<TypedefElement>();
-
-  final Map<ClassElement, Set<MixinApplicationElement>> _mixinUses =
-      new Map<ClassElement, Set<MixinApplicationElement>>();
-  Map<ClassElement, List<MixinApplicationElement>> _liveMixinUses;
-
-  final Map<ClassElement, Set<ClassElement>> _typesImplementedBySubclasses =
-      new Map<ClassElement, Set<ClassElement>>();
-
-  // We keep track of subtype and subclass relationships in four
-  // distinct sets to make class hierarchy analysis faster.
-  final Map<ClassElement, ClassHierarchyNode> _classHierarchyNodes =
-      <ClassElement, ClassHierarchyNode>{};
-  final Map<ClassElement, ClassSet> _classSets = <ClassElement, ClassSet>{};
-
-  final Map<ClassElement, Map<ClassElement, bool>> _subtypeCoveredByCache =
-      <ClassElement, Map<ClassElement, bool>>{};
-
-  final Set<Element> sideEffectsFreeElements = new Set<Element>();
-
-  final Set<Element> elementsThatCannotThrow = new Set<Element>();
-
-  final Set<Element> functionsThatMightBePassedToApply =
-      new Set<FunctionElement>();
-
-  final Set<Element> alreadyPopulated;
-
-  CommonMasks _commonMasks;
-
-  final CommonElements commonElements;
-
-  final CoreTypes coreTypes;
-
-  final CacheStrategy cacheStrategy;
-
-  final ResolutionWorldBuilder resolverWorld;
-
-  bool get isClosed => _closed;
-
-  Set<ClassElement> typesImplementedBySubclassesOf(ClassElement cls) {
-    return _typesImplementedBySubclasses[cls.declaration];
-  }
-
-  WorldImpl(this.resolverWorld, this._backend, this.commonElements,
-      this.coreTypes, CacheStrategy cacheStrategy)
-      : this.cacheStrategy = cacheStrategy,
-        alreadyPopulated = cacheStrategy.newSet() {
-    _allFunctions = new FunctionSet(this);
-  }
-
-  FunctionSet get allFunctions => _allFunctions;
-
-  CommonMasks get commonMasks {
-    assert(isClosed);
-    return _commonMasks;
-  }
-
-  CoreClasses get coreClasses => commonElements;
-
-  ConstantSystem get constantSystem => _backend.constantSystem;
-
-  /// Called to add [cls] to the set of known classes.
-  ///
-  /// This ensures that class hierarchy queries can be performed on [cls] and
-  /// classes that extend or implement it.
-  void registerClass(ClassElement cls) => _registerClass(cls);
-
-  void registerClosureClass(ClassElement cls) {
-    _registerClass(cls, isDirectlyInstantiated: true);
-  }
-
-  void _registerClass(ClassElement cls, {bool isDirectlyInstantiated: false}) {
-    _ensureClassSet(cls);
-    if (isDirectlyInstantiated) {
-      _updateClassHierarchyNodeForClass(cls, directlyInstantiated: true);
-    }
-  }
-
-  void registerTypedef(TypedefElement typdef) {
-    _allTypedefs.add(typdef);
-  }
-
-  Iterable<TypedefElement> get allTypedefs => _allTypedefs;
-
   /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
   /// of known classes.
   ///
@@ -945,17 +923,6 @@
     return _classHierarchyNodes[cls.declaration];
   }
 
-  ClassHierarchyNode _ensureClassHierarchyNode(ClassElement cls) {
-    cls = cls.declaration;
-    return _classHierarchyNodes.putIfAbsent(cls, () {
-      ClassHierarchyNode parentNode;
-      if (cls.superclass != null) {
-        parentNode = _ensureClassHierarchyNode(cls.superclass);
-      }
-      return new ClassHierarchyNode(parentNode, cls);
-    });
-  }
-
   /// Returns [ClassSet] for [cls] used to model the extends and implements
   /// relations of known classes.
   ///
@@ -965,38 +932,26 @@
     return _classSets[cls.declaration];
   }
 
-  ClassSet _ensureClassSet(ClassElement cls) {
-    cls = cls.declaration;
-    return _classSets.putIfAbsent(cls, () {
-      ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
-      ClassSet classSet = new ClassSet(node);
-
-      for (InterfaceType type in cls.allSupertypes) {
-        // TODO(johnniwinther): Optimization: Avoid adding [cls] to
-        // superclasses.
-        ClassSet subtypeSet = _ensureClassSet(type.element);
-        subtypeSet.addSubtype(node);
-      }
-      if (cls.isMixinApplication) {
-        // TODO(johnniwinther): Store this in the [ClassSet].
-        MixinApplicationElement mixinApplication = cls;
-        if (mixinApplication.mixin != null) {
-          // If [mixinApplication] is malformed [mixin] is `null`.
-          registerMixinUse(mixinApplication, mixinApplication.mixin);
-        }
-      }
-
-      return classSet;
-    });
+  void registerClosureClass(ClosureClassElement cls) {
+    ClassHierarchyNode parentNode = getClassHierarchyNode(cls.superclass);
+    ClassHierarchyNode node =
+        _classHierarchyNodes[cls] = new ClassHierarchyNode(parentNode, cls);
+    for (InterfaceType type in cls.allSupertypes) {
+      ClassSet subtypeSet = getClassSet(type.element);
+      subtypeSet.addSubtype(node);
+    }
+    _classSets[cls] = new ClassSet(node);
+    _updateSuperClassHierarchyNodeForClass(node);
+    node.isDirectlyInstantiated = true;
   }
 
   void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
     // Ensure that classes implicitly implementing `Function` are in its
     // subtype set.
     ClassElement cls = node.cls;
-    if (cls != coreClasses.functionClass &&
-        cls.implementsFunction(coreClasses)) {
-      ClassSet subtypeSet = _ensureClassSet(coreClasses.functionClass);
+    if (cls != commonElements.functionClass &&
+        cls.implementsFunction(commonElements)) {
+      ClassSet subtypeSet = getClassSet(commonElements.functionClass);
       subtypeSet.addSubtype(node);
     }
     if (!node.isInstantiated && node.parentNode != null) {
@@ -1004,62 +959,7 @@
     }
   }
 
-  void _updateClassHierarchyNodeForClass(ClassElement cls,
-      {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
-    ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
-    _updateSuperClassHierarchyNodeForClass(node);
-    if (directlyInstantiated) {
-      node.isDirectlyInstantiated = true;
-    }
-    if (abstractlyInstantiated) {
-      node.isAbstractlyInstantiated = true;
-    }
-  }
-
-  ClosedWorld closeWorld(DiagnosticReporter reporter) {
-    /// Updates the `isDirectlyInstantiated` and `isIndirectlyInstantiated`
-    /// properties of the [ClassHierarchyNode] for [cls].
-
-    void addSubtypes(ClassElement cls, InstantiationInfo info) {
-      if (!info.hasInstantiation) {
-        return;
-      }
-      if (cacheStrategy.hasIncrementalSupport && !alreadyPopulated.add(cls)) {
-        return;
-      }
-      assert(cls.isDeclaration);
-      if (!cls.isResolved) {
-        reporter.internalError(cls, 'Class "${cls.name}" is not resolved.');
-      }
-
-      _updateClassHierarchyNodeForClass(cls,
-          directlyInstantiated: info.isDirectlyInstantiated,
-          abstractlyInstantiated: info.isAbstractlyInstantiated);
-
-      // Walk through the superclasses, and record the types
-      // implemented by that type on the superclasses.
-      ClassElement superclass = cls.superclass;
-      while (superclass != null) {
-        Set<Element> typesImplementedBySubclassesOfCls =
-            _typesImplementedBySubclasses.putIfAbsent(
-                superclass, () => new Set<ClassElement>());
-        for (DartType current in cls.allSupertypes) {
-          typesImplementedBySubclassesOfCls.add(current.element);
-        }
-        superclass = superclass.superclass;
-      }
-    }
-
-    // Use the [:seenClasses:] set to include non-instantiated
-    // classes: if the superclass of these classes require RTI, then
-    // they also need RTI, so that a constructor passes the type
-    // variables to the super constructor.
-    resolverWorld.forEachInstantiatedClass(addSubtypes);
-
-    _closed = true;
-    _commonMasks = new CommonMasks(this);
-    return this;
-  }
+  Iterable<TypedefElement> get allTypedefs => _allTypedefs;
 
   @override
   String dump([ClassElement cls]) {
@@ -1069,31 +969,15 @@
     } else {
       sb.write("Instantiated classes in the closed world:\n");
     }
-    getClassHierarchyNode(coreClasses.objectClass)
+    getClassHierarchyNode(commonElements.objectClass)
         .printOn(sb, ' ', instantiatedOnly: cls == null, withRespectTo: cls);
     return sb.toString();
   }
 
-  void registerMixinUse(
-      MixinApplicationElement mixinApplication, ClassElement mixin) {
-    // TODO(johnniwinther): Add map restricted to live classes.
-    // We don't support patch classes as mixin.
-    assert(mixin.isDeclaration);
-    Set<MixinApplicationElement> users =
-        _mixinUses.putIfAbsent(mixin, () => new Set<MixinApplicationElement>());
-    users.add(mixinApplication);
-  }
-
   bool hasAnyUserDefinedGetter(Selector selector, TypeMask mask) {
     return allFunctions.filter(selector, mask).any((each) => each.isGetter);
   }
 
-  void registerUsedElement(Element element) {
-    if (element.isInstanceMember && !element.isAbstract) {
-      allFunctions.add(element);
-    }
-  }
-
   FieldElement locateSingleField(Selector selector, TypeMask mask) {
     Element result = locateSingleElement(selector, mask);
     return (result != null && result.isField) ? result : null;
@@ -1137,8 +1021,8 @@
       return true;
     }
     if (element.isInstanceMember) {
-      return !resolverWorld.hasInvokedSetter(element) &&
-          !resolverWorld.fieldSetters.contains(element);
+      return !_resolverWorld.hasInvokedSetter(element) &&
+          !_resolverWorld.fieldSetters.contains(element);
     }
     return false;
   }
@@ -1226,16 +1110,3 @@
     return getMightBePassedToApply(element);
   }
 }
-
-/// Enum values defining subset of classes included in queries.
-enum ClassQuery {
-  /// Only the class itself is included.
-  EXACT,
-
-  /// The class and all subclasses (transitively) are included.
-  SUBCLASS,
-
-  /// The class and all classes that implement or subclass it (transitively)
-  /// are included.
-  SUBTYPE,
-}
diff --git a/pkg/dev_compiler/lib/js/amd/dart_sdk.js b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
index 2a94c9f..bc1747a 100644
--- a/pkg/dev_compiler/lib/js/amd/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
@@ -59506,10 +59506,10 @@
       return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
     }
     static _create_1(parts) {
-      return new window.Blob(parts);
+      return new self.Blob(parts);
     }
     static _create_2(parts, bag) {
-      return new window.Blob(parts, bag);
+      return new self.Blob(parts, bag);
     }
     static _create_bag() {
       return {};
diff --git a/pkg/dev_compiler/lib/js/common/dart_sdk.js b/pkg/dev_compiler/lib/js/common/dart_sdk.js
index f2826b9..9e510b1 100644
--- a/pkg/dev_compiler/lib/js/common/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/common/dart_sdk.js
@@ -59506,10 +59506,10 @@
       return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
     }
     static _create_1(parts) {
-      return new window.Blob(parts);
+      return new self.Blob(parts);
     }
     static _create_2(parts, bag) {
-      return new window.Blob(parts, bag);
+      return new self.Blob(parts, bag);
     }
     static _create_bag() {
       return {};
diff --git a/pkg/dev_compiler/lib/js/es6/dart_sdk.js b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
index 993d4b0..89e4810 100644
--- a/pkg/dev_compiler/lib/js/es6/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
@@ -59504,10 +59504,10 @@
     return html.Blob._check(html.Blob._create_2(blobParts, bag));
   }
   static _create_1(parts) {
-    return new window.Blob(parts);
+    return new self.Blob(parts);
   }
   static _create_2(parts, bag) {
-    return new window.Blob(parts, bag);
+    return new self.Blob(parts, bag);
   }
   static _create_bag() {
     return {};
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
index d960ce5..e0639d0 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
@@ -59507,10 +59507,10 @@
       return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
     }
     static _create_1(parts) {
-      return new window.Blob(parts);
+      return new self.Blob(parts);
     }
     static _create_2(parts, bag) {
-      return new window.Blob(parts, bag);
+      return new self.Blob(parts, bag);
     }
     static _create_bag() {
       return {};
diff --git a/pkg/dev_compiler/test/browser/language_tests.js b/pkg/dev_compiler/test/browser/language_tests.js
index 56f7196..593b3a0 100644
--- a/pkg/dev_compiler/test/browser/language_tests.js
+++ b/pkg/dev_compiler/test/browser/language_tests.js
@@ -425,7 +425,6 @@
       'async_spawnuri_test': async_unittest,
       'async_test': async_unittest,
       'audiocontext_test': is.chrome('<=54') ? fail : pass, // was sdk#27578, needs triage
-      'blob_constructor_test': 'fail', // was sdk#27578, needs triage
       'canvas_test': ['unittest'],
       'canvasrenderingcontext2d_test': ['unittest'],
       'cross_domain_iframe_test': async_unittest,
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/dart2js/html_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/dart2js/html_dart2js.dart
index d24f6da..9798bbe 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/dart2js/html_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/dart2js/html_dart2js.dart
@@ -1214,8 +1214,8 @@
     return _create_2(blobParts, bag);
   }
 
-  static _create_1(parts) => JS('Blob', 'new window.Blob(#)', parts);
-  static _create_2(parts, bag) => JS('Blob', 'new window.Blob(#, #)', parts, bag);
+  static _create_1(parts) => JS('Blob', 'new self.Blob(#)', parts);
+  static _create_2(parts, bag) => JS('Blob', 'new self.Blob(#, #)', parts, bag);
 
   static _create_bag() => JS('var', '{}');
   static _bag_set(bag, key, value) { JS('void', '#[#] = #', bag, key, value); }
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 8556ba2..6008aec 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -129,11 +129,13 @@
     } else if (dart_target_arch == "ia32") {
       defines += [ "TARGET_ARCH_IA32" ]
     } else if (dart_target_arch == "dbc" || dart_target_arch == "simdbc" ||
-               dart_target_arch == "simdbc64") {
+               dart_target_arch == "simdbc64" ||
+               dart_target_arch == "armsimdbc" ||
+               dart_target_arch == "armsimdbc64") {
       defines += [ "TARGET_ARCH_DBC" ]
       defines += [ "USING_SIMULATOR" ]
     } else {
-      print("Invalid |dart_target_arch|")
+      print("Invalid $dart_target_arch")
       assert(false)
     }
   }
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index afe0966..985fbf8 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -17,8 +17,8 @@
 #include <unistd.h>        // NOLINT
 
 #include "bin/builtin.h"
+#include "bin/fdutils.h"
 #include "bin/log.h"
-
 #include "platform/signal_blocker.h"
 #include "platform/utils.h"
 
@@ -227,7 +227,8 @@
 bool File::Exists(const char* name) {
   struct stat st;
   if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
-    return S_ISREG(st.st_mode);
+    // Everything but a directory and a link is a file to Dart.
+    return !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode);
   } else {
     return false;
   }
@@ -239,7 +240,22 @@
   if (fd < 0) {
     return false;
   }
-  return (close(fd) == 0);
+  // File.create returns a File, so we shouldn't be giving the illusion that the
+  // call has created a file or that a file already exists if there is already
+  // an entity at the same path that is a directory or a link.
+  bool is_file = true;
+  struct stat st;
+  if (NO_RETRY_EXPECTED(fstat(fd, &st)) == 0) {
+    if (S_ISDIR(st.st_mode)) {
+      errno = EISDIR;
+      is_file = false;
+    } else if (S_ISLNK(st.st_mode)) {
+      errno = ENOENT;
+      is_file = false;
+    }
+  }
+  FDUtils::SaveErrorAndClose(fd);
+  return is_file;
 }
 
 
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index ff08043..ceea0c3 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -208,9 +208,10 @@
 
 
 bool File::Exists(const char* name) {
-  struct stat st;
-  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
-    return S_ISREG(st.st_mode);
+  struct stat64 st;
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
+    // Everything but a directory and a link is a file to Dart.
+    return !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode);
   } else {
     return false;
   }
@@ -218,11 +219,27 @@
 
 
 bool File::Create(const char* name) {
-  int fd = NO_RETRY_EXPECTED(open(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
+  int fd =
+      NO_RETRY_EXPECTED(open64(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
   if (fd < 0) {
     return false;
   }
-  return (close(fd) == 0);
+  // File.create returns a File, so we shouldn't be giving the illusion that the
+  // call has created a file or that a file already exists if there is already
+  // an entity at the same path that is a directory or a link.
+  bool is_file = true;
+  struct stat64 st;
+  if (NO_RETRY_EXPECTED(fstat64(fd, &st)) == 0) {
+    if (S_ISDIR(st.st_mode)) {
+      errno = EISDIR;
+      is_file = false;
+    } else if (S_ISLNK(st.st_mode)) {
+      errno = ENOENT;
+      is_file = false;
+    }
+  }
+  FDUtils::SaveErrorAndClose(fd);
+  return is_file;
 }
 
 
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 9a6dc41..6664c67 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -17,6 +17,7 @@
 #include <unistd.h>        // NOLINT
 
 #include "bin/builtin.h"
+#include "bin/fdutils.h"
 #include "bin/log.h"
 #include "platform/signal_blocker.h"
 #include "platform/utils.h"
@@ -227,7 +228,8 @@
 bool File::Exists(const char* name) {
   struct stat64 st;
   if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
-    return S_ISREG(st.st_mode);
+    // Everything but a directory and a link is a file to Dart.
+    return !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode);
   } else {
     return false;
   }
@@ -240,7 +242,22 @@
   if (fd < 0) {
     return false;
   }
-  return (TEMP_FAILURE_RETRY(close(fd)) == 0);
+  // File.create returns a File, so we shouldn't be giving the illusion that the
+  // call has created a file or that a file already exists if there is already
+  // an entity at the same path that is a directory or a link.
+  bool is_file = true;
+  struct stat64 st;
+  if (TEMP_FAILURE_RETRY(fstat64(fd, &st)) == 0) {
+    if (S_ISDIR(st.st_mode)) {
+      errno = EISDIR;
+      is_file = false;
+    } else if (S_ISLNK(st.st_mode)) {
+      errno = ENOENT;
+      is_file = false;
+    }
+  }
+  FDUtils::SaveErrorAndClose(fd);
+  return is_file;
 }
 
 
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 2b32bc1..d1259f7 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -230,7 +230,8 @@
 bool File::Exists(const char* name) {
   struct stat st;
   if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
-    return S_ISREG(st.st_mode);
+    // Everything but a directory and a link is a file to Dart.
+    return !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode);
   } else {
     return false;
   }
@@ -242,7 +243,22 @@
   if (fd < 0) {
     return false;
   }
-  return (close(fd) == 0);
+  // File.create returns a File, so we shouldn't be giving the illusion that the
+  // call has created a file or that a file already exists if there is already
+  // an entity at the same path that is a directory or a link.
+  bool is_file = true;
+  struct stat st;
+  if (NO_RETRY_EXPECTED(fstat(fd, &st)) == 0) {
+    if (S_ISDIR(st.st_mode)) {
+      errno = EISDIR;
+      is_file = false;
+    } else if (S_ISLNK(st.st_mode)) {
+      errno = ENOENT;
+      is_file = false;
+    }
+  }
+  FDUtils::SaveErrorAndClose(fd);
+  return is_file;
 }
 
 
diff --git a/runtime/bin/process.h b/runtime/bin/process.h
index 48cf21b..f877b8d 100644
--- a/runtime/bin/process.h
+++ b/runtime/bin/process.h
@@ -5,11 +5,16 @@
 #ifndef RUNTIME_BIN_PROCESS_H_
 #define RUNTIME_BIN_PROCESS_H_
 
+#include <errno.h>
+
 #include "bin/builtin.h"
 #include "bin/io_buffer.h"
 #include "bin/lockers.h"
 #include "bin/thread.h"
 #include "platform/globals.h"
+#if !defined(TARGET_OS_WINDOWS)
+#include "platform/signal_blocker.h"
+#endif
 #include "platform/utils.h"
 
 namespace dart {
@@ -203,24 +208,30 @@
    public:
     explicit BufferListNode(intptr_t size) {
       data_ = new uint8_t[size];
-      if (data_ == NULL) FATAL("Allocation failed");
+      // We check for a failed allocation below in Allocate()
       next_ = NULL;
     }
 
     ~BufferListNode() { delete[] data_; }
 
+    bool Valid() const { return data_ != NULL; }
+
+    uint8_t* data() const { return data_; }
+    BufferListNode* next() const { return next_; }
+    void set_next(BufferListNode* n) { next_ = n; }
+
+   private:
     uint8_t* data_;
     BufferListNode* next_;
 
-   private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(BufferListNode);
   };
 
  public:
   BufferListBase() : head_(NULL), tail_(NULL), data_size_(0), free_size_(0) {}
   ~BufferListBase() {
-    ASSERT(head_ == NULL);
-    ASSERT(tail_ == NULL);
+    Free();
+    DEBUG_ASSERT(IsEmpty());
   }
 
   // Returns the collected data as a Uint8List. If an error occours an
@@ -234,9 +245,9 @@
       return result;
     }
     for (BufferListNode* current = head_; current != NULL;
-         current = current->next_) {
+         current = current->next()) {
       intptr_t to_copy = dart::Utils::Minimum(data_size_, kBufferSize);
-      memmove(buffer + buffer_position, current->data_, to_copy);
+      memmove(buffer + buffer_position, current->data(), to_copy);
       buffer_position += to_copy;
       data_size_ -= to_copy;
     }
@@ -245,26 +256,36 @@
     return result;
   }
 
+#if defined(DEBUG)
+  bool IsEmpty() const { return (head_ == NULL) && (tail_ == NULL); }
+#endif
+
  protected:
-  void Allocate() {
+  bool Allocate() {
     ASSERT(free_size_ == 0);
     BufferListNode* node = new BufferListNode(kBufferSize);
+    if ((node == NULL) || !node->Valid()) {
+      // Failed to allocate a buffer for the node.
+      delete node;
+      return false;
+    }
     if (head_ == NULL) {
       head_ = node;
       tail_ = node;
     } else {
-      ASSERT(tail_->next_ == NULL);
-      tail_->next_ = node;
+      ASSERT(tail_->next() == NULL);
+      tail_->set_next(node);
       tail_ = node;
     }
     free_size_ = kBufferSize;
+    return true;
   }
 
   void Free() {
     BufferListNode* current = head_;
     while (current != NULL) {
       BufferListNode* tmp = current;
-      current = current->next_;
+      current = current->next();
       delete tmp;
     }
     head_ = NULL;
@@ -275,9 +296,19 @@
 
   // Returns the address of the first byte in the free space.
   uint8_t* FreeSpaceAddress() {
-    return tail_->data_ + (kBufferSize - free_size_);
+    return tail_->data() + (kBufferSize - free_size_);
   }
 
+  intptr_t data_size() const { return data_size_; }
+  void set_data_size(intptr_t size) { data_size_ = size; }
+
+  intptr_t free_size() const { return free_size_; }
+  void set_free_size(intptr_t size) { free_size_ = size; }
+
+  BufferListNode* head() const { return head_; }
+  BufferListNode* tail() const { return tail_; }
+
+ private:
   // Linked list for data collected.
   BufferListNode* head_;
   BufferListNode* tail_;
@@ -288,10 +319,49 @@
   // Number of free bytes in the last node in the list.
   intptr_t free_size_;
 
- private:
   DISALLOW_COPY_AND_ASSIGN(BufferListBase);
 };
 
+#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_FUCHSIA) ||                \
+    defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS)
+class BufferList : public BufferListBase {
+ public:
+  BufferList() {}
+
+  bool Read(int fd, intptr_t available) {
+    // Read all available bytes.
+    while (available > 0) {
+      if (free_size() == 0) {
+        if (!Allocate()) {
+          errno = ENOMEM;
+          return false;
+        }
+      }
+      ASSERT(free_size() > 0);
+      ASSERT(free_size() <= kBufferSize);
+      intptr_t block_size = dart::Utils::Minimum(free_size(), available);
+#if defined(TARGET_OS_FUCHSIA)
+      intptr_t bytes = NO_RETRY_EXPECTED(
+          read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
+#else
+      intptr_t bytes = TEMP_FAILURE_RETRY(
+          read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
+#endif  // defined(TARGET_OS_FUCHSIA)
+      if (bytes < 0) {
+        return false;
+      }
+      set_data_size(data_size() + bytes);
+      set_free_size(free_size() - bytes);
+      available -= bytes;
+    }
+    return true;
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BufferList);
+};
+#endif  // defined(TARGET_OS_ANDROID) ...
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index b49515f..550f680 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -768,36 +768,6 @@
 }
 
 
-class BufferList : public BufferListBase {
- public:
-  BufferList() {}
-
-  bool Read(int fd, intptr_t available) {
-    // Read all available bytes.
-    while (available > 0) {
-      if (free_size_ == 0) {
-        Allocate();
-      }
-      ASSERT(free_size_ > 0);
-      ASSERT(free_size_ <= kBufferSize);
-      intptr_t block_size = dart::Utils::Minimum(free_size_, available);
-      intptr_t bytes = TEMP_FAILURE_RETRY(
-          read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
-      if (bytes < 0) {
-        return false;
-      }
-      data_size_ += bytes;
-      free_size_ -= bytes;
-      available -= bytes;
-    }
-    return true;
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BufferList);
-};
-
-
 static bool CloseProcessBuffers(struct pollfd fds[3]) {
   int e = errno;
   VOID_TEMP_FAILURE_RETRY(close(fds[0].fd));
@@ -881,6 +851,8 @@
   // All handles closed and all data read.
   result->set_stdout_data(out_data.GetData());
   result->set_stderr_data(err_data.GetData());
+  DEBUG_ASSERT(out_data.IsEmpty());
+  DEBUG_ASSERT(err_data.IsEmpty());
 
   // Calculate the exit code.
   intptr_t exit_code = exit_code_data.ints[0];
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index 9eb4d74..88b115a 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -441,36 +441,6 @@
 }
 
 
-class BufferList : public BufferListBase {
- public:
-  BufferList() {}
-
-  bool Read(int fd, intptr_t available) {
-    // Read all available bytes.
-    while (available > 0) {
-      if (free_size_ == 0) {
-        Allocate();
-      }
-      ASSERT(free_size_ > 0);
-      ASSERT(free_size_ <= kBufferSize);
-      intptr_t block_size = dart::Utils::Minimum(free_size_, available);
-      intptr_t bytes = NO_RETRY_EXPECTED(
-          read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
-      if (bytes < 0) {
-        return false;
-      }
-      data_size_ += bytes;
-      free_size_ -= bytes;
-      available -= bytes;
-    }
-    return true;
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BufferList);
-};
-
-
 bool Process::Wait(intptr_t pid,
                    intptr_t in,
                    intptr_t out,
@@ -570,6 +540,8 @@
   // All handles closed and all data read.
   result->set_stdout_data(out_data.GetData());
   result->set_stderr_data(err_data.GetData());
+  DEBUG_ASSERT(out_data.IsEmpty());
+  DEBUG_ASSERT(err_data.IsEmpty());
 
   // Calculate the exit code.
   intptr_t exit_code = exit_code_data.ints[0];
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index 22dc683..c8a2f7b 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -768,36 +768,6 @@
 }
 
 
-class BufferList : public BufferListBase {
- public:
-  BufferList() {}
-
-  bool Read(int fd, intptr_t available) {
-    // Read all available bytes.
-    while (available > 0) {
-      if (free_size_ == 0) {
-        Allocate();
-      }
-      ASSERT(free_size_ > 0);
-      ASSERT(free_size_ <= kBufferSize);
-      intptr_t block_size = dart::Utils::Minimum(free_size_, available);
-      intptr_t bytes = TEMP_FAILURE_RETRY(
-          read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
-      if (bytes < 0) {
-        return false;
-      }
-      data_size_ += bytes;
-      free_size_ -= bytes;
-      available -= bytes;
-    }
-    return true;
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BufferList);
-};
-
-
 static bool CloseProcessBuffers(struct pollfd fds[3]) {
   int e = errno;
   VOID_TEMP_FAILURE_RETRY(close(fds[0].fd));
@@ -881,6 +851,8 @@
   // All handles closed and all data read.
   result->set_stdout_data(out_data.GetData());
   result->set_stderr_data(err_data.GetData());
+  DEBUG_ASSERT(out_data.IsEmpty());
+  DEBUG_ASSERT(err_data.IsEmpty());
 
   // Calculate the exit code.
   intptr_t exit_code = exit_code_data.ints[0];
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 584968e..30035c5 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -784,36 +784,6 @@
 }
 
 
-class BufferList : public BufferListBase {
- public:
-  BufferList() {}
-
-  bool Read(int fd, intptr_t available) {
-    // Read all available bytes.
-    while (available > 0) {
-      if (free_size_ == 0) {
-        Allocate();
-      }
-      ASSERT(free_size_ > 0);
-      ASSERT(free_size_ <= kBufferSize);
-      size_t block_size = dart::Utils::Minimum(free_size_, available);
-      ssize_t bytes = TEMP_FAILURE_RETRY(
-          read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
-      if (bytes < 0) {
-        return false;
-      }
-      data_size_ += bytes;
-      free_size_ -= bytes;
-      available -= bytes;
-    }
-    return true;
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BufferList);
-};
-
-
 static bool CloseProcessBuffers(struct pollfd fds[3]) {
   int e = errno;
   VOID_TEMP_FAILURE_RETRY(close(fds[0].fd));
@@ -903,6 +873,8 @@
   // All handles closed and all data read.
   result->set_stdout_data(out_data.GetData());
   result->set_stderr_data(err_data.GetData());
+  DEBUG_ASSERT(out_data.IsEmpty());
+  DEBUG_ASSERT(err_data.IsEmpty());
 
   // Calculate the exit code.
   intptr_t exit_code = exit_code_data.ints[0];
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index a2d93a4..c0cb06b 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -714,32 +714,35 @@
   // overlapped read.
   void DataIsRead(intptr_t size) {
     ASSERT(read_pending_ == true);
-    data_size_ += size;
-    free_size_ -= size;
-    ASSERT(free_size_ >= 0);
+    set_data_size(data_size() + size);
+    set_free_size(free_size() - size);
+    ASSERT(free_size() >= 0);
     read_pending_ = false;
   }
 
   // The access to the read buffer for overlapped read.
-  void GetReadBuffer(uint8_t** buffer, intptr_t* size) {
+  bool GetReadBuffer(uint8_t** buffer, intptr_t* size) {
     ASSERT(!read_pending_);
-    if (free_size_ == 0) {
-      Allocate();
+    if (free_size() == 0) {
+      if (!Allocate()) {
+        return false;
+      }
     }
-    ASSERT(free_size_ > 0);
-    ASSERT(free_size_ <= kBufferSize);
+    ASSERT(free_size() > 0);
+    ASSERT(free_size() <= kBufferSize);
     *buffer = FreeSpaceAddress();
-    *size = free_size_;
+    *size = free_size();
     read_pending_ = true;
+    return true;
   }
 
-  intptr_t GetDataSize() { return data_size_; }
+  intptr_t GetDataSize() { return data_size(); }
 
   uint8_t* GetFirstDataBuffer() {
-    ASSERT(head_ != NULL);
-    ASSERT(head_ == tail_);
-    ASSERT(data_size_ <= kBufferSize);
-    return head_->data_;
+    ASSERT(head() != NULL);
+    ASSERT(head() == tail());
+    ASSERT(data_size() <= kBufferSize);
+    return head()->data();
   }
 
   void FreeDataBuffer() { Free(); }
@@ -776,7 +779,9 @@
       ClearOverlapped();
       uint8_t* buffer;
       intptr_t buffer_size;
-      buffer_.GetReadBuffer(&buffer, &buffer_size);
+      if (!buffer_.GetReadBuffer(&buffer, &buffer_size)) {
+        return false;
+      }
       BOOL ok = ReadFile(handle_, buffer, buffer_size, NULL, &overlapped_);
       if (!ok) {
         return (GetLastError() == ERROR_IO_PENDING);
@@ -793,6 +798,10 @@
 
   void FreeDataBuffer() { return buffer_.FreeDataBuffer(); }
 
+#if defined(DEBUG)
+  bool IsEmpty() const { return buffer_.IsEmpty(); }
+#endif
+
   void Close() {
     CloseHandle(handle_);
     CloseHandle(event_);
@@ -882,6 +891,8 @@
   // All handles closed and all data read.
   result->set_stdout_data(oh[0].GetData());
   result->set_stderr_data(oh[1].GetData());
+  DEBUG_ASSERT(oh[0].IsEmpty());
+  DEBUG_ASSERT(oh[1].IsEmpty());
 
   // Calculate the exit code.
   ASSERT(oh[2].GetDataSize() == 8);
diff --git a/runtime/lib/function.cc b/runtime/lib/function.cc
index 2abdde71..5b2343f 100644
--- a/runtime/lib/function.cc
+++ b/runtime/lib/function.cc
@@ -69,17 +69,7 @@
   const Closure& receiver =
       Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
   const Function& func = Function::Handle(receiver.function());
-  // Hash together name, class name and signature.
-  const Class& cls = Class::Handle(func.Owner());
-  intptr_t result = String::Handle(func.name()).Hash();
-  result += String::Handle(func.Signature()).Hash();
-  result += String::Handle(cls.Name()).Hash();
-  // Finalize hash value like for strings so that it fits into a smi.
-  result += result << 3;
-  result ^= result >> 11;
-  result += result << 15;
-  result &= ((static_cast<intptr_t>(1) << String::kHashBits) - 1);
-  return Smi::New(result);
+  return func.GetClosureHashCode();
 }
 
 
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
deleted file mode 100644
index 0875fbc..0000000
--- a/runtime/lib/typed_data.dart
+++ /dev/null
@@ -1,4258 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Unlike the other SDK libraries, this file is not a patch that is applied to
-// dart:typed_data.  Instead, it completely replaces the implementation from the
-// SDK.
-library dart.typed_data;
-
-import "dart:_internal";
-import "dart:collection" show ListBase;
-import 'dart:math' show Random;
-
-/**
- * A typed view of a sequence of bytes.
- */
-abstract class TypedData {
-  /**
-   * Returns the number of bytes in the representation of each element in this
-   * list.
-   */
-  int get elementSizeInBytes;
-
-  /**
-   * Returns the offset in bytes into the underlying byte buffer of this view.
-   */
-  int get offsetInBytes;
-
-  /**
-   * Returns the length of this view, in bytes.
-   */
-  int get lengthInBytes;
-
-  /**
-   * Returns the byte buffer associated with this object.
-   */
-  ByteBuffer get buffer;
-}
-
-
-/**
- * Describes endianness to be used when accessing or updating a
- * sequence of bytes.
- */
-class Endianness {
-  const Endianness._(this._littleEndian);
-
-  static const Endianness BIG_ENDIAN = const Endianness._(false);
-  static const Endianness LITTLE_ENDIAN = const Endianness._(true);
-  static final Endianness HOST_ENDIAN =
-    (new ByteData.view(new Uint16List.fromList([1]).buffer)).getInt8(0) == 1 ?
-    LITTLE_ENDIAN : BIG_ENDIAN;
-
-  final bool _littleEndian;
-}
-
-
-/**
- * A fixed-length, random-access sequence of bytes that also provides random
- * and unaligned access to the fixed-width integers and floating point
- * numbers represented by those bytes.
- *
- * `ByteData` may be used to pack and unpack data from external sources
- * (such as networks or files systems), and to process large quantities
- * of numerical data more efficiently than would be possible
- * with ordinary [List] implementations.
- * `ByteData` can save space, by eliminating the need for object headers,
- * and time, by eliminating the need for data copies.
- * Finally, `ByteData` may be used to intentionally reinterpret the bytes
- * representing one arithmetic type as another.
- * For example this code fragment determine what 32-bit signed integer
- * is represented by the bytes of a 32-bit floating point number:
- *
- *     var buffer = new Uint8List(8).buffer;
- *     var bdata = new ByteData.view(buffer);
- *     bdata.setFloat32(0, 3.04);
- *     int huh = bdata.getInt32(0);
- */
-class ByteData implements TypedData {
-  /**
-   * Creates a [ByteData] of the specified length (in elements), all of
-   * whose bytes are initially zero.
-   */
-  factory ByteData(int length) {
-    var list = new Uint8List(length);
-    return new _ByteDataView(list, 0, length);
-  }
-
-  // Called directly from C code.
-  factory ByteData._view(TypedData typedData, int offsetInBytes, int length) {
-    return new _ByteDataView(typedData, offsetInBytes, length);
-  }
-
-  /**
-   * Creates an [ByteData] _view_ of the specified region in [buffer].
-   *
-   * Changes in the [ByteData] will be visible in the byte
-   * buffer and vice versa.
-   * If the [offsetInBytes] index of the region is not specified,
-   * it defaults to zero (the first byte in the byte buffer).
-   * If the length is not specified, it defaults to `null`,
-   * which indicates that the view extends to the end of the byte buffer.
-   *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
-   */
-  factory ByteData.view(ByteBuffer buffer,
-                        [int offsetInBytes = 0, int length]) {
-    return buffer.asByteData(offsetInBytes, length);
-  }
-
-  /**
-   * Returns the (possibly negative) integer represented by the byte at the
-   * specified [byteOffset] in this object, in two's complement binary
-   * representation.
-   *
-   * The return value will be between -128 and 127, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
-   */
-  int getInt8(int byteOffset);
-
-  /**
-   * Sets the byte at the specified [byteOffset] in this object to the
-   * two's complement binary representation of the specified [value], which
-   * must fit in a single byte.
-   *
-   * In other words, [value] must be between -128 and 127, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
-   */
-  void setInt8(int byteOffset, int value);
-
-  /**
-   * Returns the positive integer represented by the byte at the specified
-   * [byteOffset] in this object, in unsigned binary form.
-   *
-   * The return value will be between 0 and 255, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
-   */
-  int getUint8(int byteOffset);
-
-  /**
-   * Sets the byte at the specified [byteOffset] in this object to the
-   * unsigned binary representation of the specified [value], which must fit
-   * in a single byte.
-   *
-   * In other words, [value] must be between 0 and 255, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative,
-   * or greater than or equal to the length of this object.
-   */
-  void setUint8(int byteOffset, int value);
-
-  /**
-   * Returns the (possibly negative) integer represented by the two bytes at
-   * the specified [byteOffset] in this object, in two's complement binary
-   * form.
-   *
-   * The return value will be between 2<sup>15</sup> and 2<sup>15</sup> - 1,
-   * inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
-   */
-  int getInt16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Sets the two bytes starting at the specified [byteOffset] in this
-   * object to the two's complement binary representation of the specified
-   * [value], which must fit in two bytes.
-   *
-   * In other words, [value] must lie
-   * between 2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
-   */
-  void setInt16(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Returns the positive integer represented by the two bytes starting
-   * at the specified [byteOffset] in this object, in unsigned binary
-   * form.
-   *
-   * The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
-   */
-  int getUint16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Sets the two bytes starting at the specified [byteOffset] in this object
-   * to the unsigned binary representation of the specified [value],
-   * which must fit in two bytes.
-   *
-   * In other words, [value] must be between
-   * 0 and 2<sup>16</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
-   */
-  void setUint16(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Returns the (possibly negative) integer represented by the four bytes at
-   * the specified [byteOffset] in this object, in two's complement binary
-   * form.
-   *
-   * The return value will be between 2<sup>31</sup> and 2<sup>31</sup> - 1,
-   * inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
-  int getInt32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Sets the four bytes starting at the specified [byteOffset] in this
-   * object to the two's complement binary representation of the specified
-   * [value], which must fit in four bytes.
-   *
-   * In other words, [value] must lie
-   * between 2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
-  void setInt32(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Returns the positive integer represented by the four bytes starting
-   * at the specified [byteOffset] in this object, in unsigned binary
-   * form.
-   *
-   * The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
-  int getUint32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Sets the four bytes starting at the specified [byteOffset] in this object
-   * to the unsigned binary representation of the specified [value],
-   * which must fit in four bytes.
-   *
-   * In other words, [value] must be between
-   * 0 and 2<sup>32</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
-  void setUint32(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Returns the (possibly negative) integer represented by the eight bytes at
-   * the specified [byteOffset] in this object, in two's complement binary
-   * form.
-   *
-   * The return value will be between 2<sup>63</sup> and 2<sup>63</sup> - 1,
-   * inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
-  int getInt64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Sets the eight bytes starting at the specified [byteOffset] in this
-   * object to the two's complement binary representation of the specified
-   * [value], which must fit in eight bytes.
-   *
-   * In other words, [value] must lie
-   * between 2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
-  void setInt64(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Returns the positive integer represented by the eight bytes starting
-   * at the specified [byteOffset] in this object, in unsigned binary
-   * form.
-   *
-   * The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
-  int getUint64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Sets the eight bytes starting at the specified [byteOffset] in this object
-   * to the unsigned binary representation of the specified [value],
-   * which must fit in eight bytes.
-   *
-   * In other words, [value] must be between
-   * 0 and 2<sup>64</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
-  void setUint64(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Returns the floating point number represented by the four bytes at
-   * the specified [byteOffset] in this object, in IEEE 754
-   * single-precision binary floating-point format (binary32).
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
-  double getFloat32(int byteOffset,
-                    [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Sets the four bytes starting at the specified [byteOffset] in this
-   * object to the IEEE 754 single-precision binary floating-point
-   * (binary32) representation of the specified [value].
-   *
-   * **Note that this method can lose precision.** The input [value] is
-   * a 64-bit floating point value, which will be converted to 32-bit
-   * floating point value by IEEE 754 rounding rules before it is stored.
-   * If [value] cannot be represented exactly as a binary32, it will be
-   * converted to the nearest binary32 value.  If two binary32 values are
-   * equally close, the one whose least significant bit is zero will be used.
-   * Note that finite (but large) values can be converted to infinity, and
-   * small non-zero values can be converted to zero.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
-  void setFloat32(int byteOffset,
-                  double value,
-                  [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Returns the floating point number represented by the eight bytes at
-   * the specified [byteOffset] in this object, in IEEE 754
-   * double-precision binary floating-point format (binary64).
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
-  double getFloat64(int byteOffset,
-                    [Endianness endian = Endianness.BIG_ENDIAN]);
-
-  /**
-   * Sets the eight bytes starting at the specified [byteOffset] in this
-   * object to the IEEE 754 double-precision binary floating-point
-   * (binary64) representation of the specified [value].
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
-  void setFloat64(int byteOffset,
-                  double value,
-                  [Endianness endian = Endianness.BIG_ENDIAN]);
-}
-
-
-// Based class for _TypedList that provides common methods for implementing
-// the collection and list interfaces.
-// This class does not extend ListBase<T> since that would add type arguments
-// to instances of _TypeListBase. Instead the subclasses use type specific
-// mixins (like _IntListMixin, _DoubleListMixin) to implement ListBase<T>.
-abstract class _TypedListBase {
-
-  // Method(s) implementing the Collection interface.
-  bool contains(element) {
-    var len = this.length;
-    for (var i = 0; i < len; ++i) {
-      if (this[i] == element) return true;
-    }
-    return false;
-  }
-
-  void forEach(void f(element)) {
-    var len = this.length;
-    for (var i = 0; i < len; i++) {
-      f(this[i]);
-    }
-  }
-
-  String join([String separator = ""]) {
-    StringBuffer buffer = new StringBuffer();
-    buffer.writeAll(this, separator);
-    return buffer.toString();
-  }
-
-  dynamic reduce(dynamic combine(value, element)) {
-    var len = this.length;
-    if (len == 0) throw IterableElementError.noElement();
-    var i = 0;
-    var value = this[0];
-    for (var i = 1; i < len; ++i) {
-      value = combine(value, this[i]);
-    }
-    return value;
-  }
-
-  dynamic fold(dynamic initialValue,
-               dynamic combine(dynamic initialValue, element)) {
-    var len = this.length;
-    for (var i = 0; i < len; ++i) {
-      initialValue = combine(initialValue, this[i]);
-    }
-    return initialValue;
-  }
-
-  Iterable map(f(element)) => new MappedIterable(this, f);
-
-  Iterable expand(Iterable f(element)) => new ExpandIterable(this, f);
-
-  bool every(bool f(element)) {
-    var len = this.length;
-    for (var i = 0; i < len; ++i) {
-      if (!f(this[i])) return false;
-    }
-    return true;
-  }
-
-  bool any(bool f(element)) {
-    var len = this.length;
-    for (var i = 0; i < len; ++i) {
-      if (f(this[i])) return true;
-    }
-    return false;
-  }
-
-  dynamic firstWhere(bool test(element), {orElse()}) {
-    var len = this.length;
-    for (var i = 0; i < len; ++i) {
-      var element = this[i];
-      if (test(element)) return element;
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  dynamic lastWhere(bool test(element), {orElse()}) {
-    var result = null;
-    var len = this.length;
-    for (var i = len - 1; i >= 0; --i) {
-      var element = this[i];
-      if (test(element)) {
-        return element;
-      }
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  dynamic singleWhere(bool test(element)) {
-    var result = null;
-    bool foundMatching = false;
-    var len = this.length;
-    for (var i = 0; i < len; ++i) {
-      var element = this[i];
-      if (test(element)) {
-        if (foundMatching) {
-          throw IterableElementError.tooMany();
-        }
-        result = element;
-        foundMatching = true;
-      }
-    }
-    if (foundMatching) return result;
-    throw IterableElementError.noElement();
-  }
-
-  dynamic elementAt(int index) {
-    return this[index];
-  }
-
-  bool get isEmpty {
-    return this.length == 0;
-  }
-
-  bool get isNotEmpty => !isEmpty;
-
-  // Method(s) implementing the List interface.
-
-  set length(newLength) {
-    throw new UnsupportedError(
-        "Cannot resize a fixed-length list");
-  }
-
-  void add(value) {
-    throw new UnsupportedError(
-        "Cannot add to a fixed-length list");
-  }
-
-  void addAll(Iterable value) {
-    throw new UnsupportedError(
-        "Cannot add to a fixed-length list");
-  }
-
-  void insert(int index, value) {
-    throw new UnsupportedError(
-        "Cannot insert into a fixed-length list");
-  }
-
-  void insertAll(int index, Iterable values) {
-    throw new UnsupportedError(
-        "Cannot insert into a fixed-length list");
-  }
-
-  void sort([int compare(a, b)]) {
-    if (compare == null) compare = Comparable.compare;
-    Sort.sort(this, compare);
-  }
-
-  void shuffle([Random random]) {
-    if (random == null) random = new Random();
-    var i = this.length;
-    while (i > 1) {
-      int pos = random.nextInt(i);
-      i -= 1;
-      var tmp = this[i];
-      this[i] = this[pos];
-      this[pos] = tmp;
-    }
-  }
-
-  int indexOf(element, [int start = 0]) {
-    return Lists.indexOf(this, element, start, this.length);
-  }
-
-  int lastIndexOf(element, [int start = null]) {
-    if (start == null) start = this.length - 1;
-    return Lists.lastIndexOf(this, element, start);
-  }
-
-  void clear() {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  int removeLast() {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  bool remove(Object element) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  bool removeAt(int index) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  void removeWhere(bool test(element)) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  void retainWhere(bool test(element)) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  dynamic get first {
-    if (length > 0) return this[0];
-    throw IterableElementError.noElement();
-  }
-
-  dynamic get last {
-    if (length > 0) return this[length - 1];
-    throw IterableElementError.noElement();
-  }
-
-  dynamic get single {
-    if (length == 1) return this[0];
-    if (length == 0) throw IterableElementError.noElement();
-    throw IterableElementError.tooMany();
-  }
-
-  void removeRange(int start, int end) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  void replaceRange(int start, int end, Iterable iterable) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  List toList({bool growable: true}) {
-    return new List.from(this, growable: growable);
-  }
-
-  Set toSet() {
-    return new Set.from(this);
-  }
-
-  List sublist(int start, [int end]) {
-    end = RangeError.checkValidRange(start, end, this.length);
-    var length = end - start;
-    List result = _createList(length);
-    result.setRange(0, length, this, start);
-    return result;
-  }
-
-  void setRange(int start, int end, Iterable from, [int skipCount = 0]) {
-    // Check ranges.
-    if (0 > start || start > end || end > length) {
-      RangeError.checkValidRange(start, end, length);  // Always throws.
-      assert(false);
-    }
-    if (skipCount < 0) {
-      throw new ArgumentError(skipCount);
-    }
-
-    final count = end - start;
-    if ((from.length - skipCount) < count) {
-      throw IterableElementError.tooFew();
-    }
-
-    if (from is _TypedListBase) {
-      if (this.elementSizeInBytes == from.elementSizeInBytes) {
-        if ((count < 10) && (from.buffer != this.buffer)) {
-          Lists.copy(from, skipCount, this, start, count);
-          return;
-        } else if (this.buffer._data._setRange(
-              start * elementSizeInBytes + this.offsetInBytes,
-              count * elementSizeInBytes,
-              from.buffer._data,
-              skipCount * elementSizeInBytes + from.offsetInBytes,
-              ClassID.getID(this), ClassID.getID(from))) {
-          return;
-        }
-      } else if (from.buffer == this.buffer) {
-        // Different element sizes, but same buffer means that we need
-        // an intermediate structure.
-        // TODO(srdjan): Optimize to skip copying if the range does not overlap.
-        final temp_buffer = new List(count);
-        for (var i = 0; i < count; i++) {
-          temp_buffer[i] = from[skipCount + i];
-        }
-        for (var i = start; i < end; i++) {
-          this[i] = temp_buffer[i - start];
-        }
-        return;
-      }
-    }
-
-    if (count == 0) return;
-    List otherList;
-    int otherStart;
-    if (from is List) {
-      otherList = from;
-      otherStart = skipCount;
-    } else {
-      otherList = from.skip(skipCount).toList(growable: false);
-      otherStart = 0;
-    }
-    if (otherStart + count > otherList.length) {
-      throw IterableElementError.tooFew();
-    }
-    Lists.copy(otherList, otherStart, this, start, count);
-  }
-
-  void setAll(int index, Iterable iterable) {
-    final end = iterable.length + index;
-    setRange(index, end, iterable);
-  }
-
-  void fillRange(int start, int end, [fillValue]) {
-    RangeError.checkValidRange(start, end, this.length);
-    for (var i = start; i < end; ++i) {
-      this[i] = fillValue;
-    }
-  }
-
-
-  // Method(s) implementing Object interface.
-
-  String toString() => ListBase.listToString(this);
-
-
-  // Internal utility methods.
-
-  // Returns true if operation succeeds.
-  // 'fromCid' and 'toCid' may be cid-s of the views and therefore may not
-  // match the cids of 'this' and 'from'.
-  // Uses toCid and fromCid to decide if clamping is necessary.
-  // Element size of toCid and fromCid must match (test at caller).
-  bool _setRange(int startInBytes, int lengthInBytes,
-                 _TypedListBase from, int startFromInBytes,
-                 int toCid, int fromCid)
-      native "TypedData_setRange";
-}
-
-
-class _IntListMixin {
-  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
-
-  Iterable<int> take(int n) => new SubListIterable<int>(this, 0, n);
-
-  Iterable<int> takeWhile(bool test(int element)) =>
-    new TakeWhileIterable<int>(this, test);
-
-  Iterable<int> skip(int n) => new SubListIterable<int>(this, n, null);
-
-  Iterable<int> skipWhile(bool test(element)) =>
-    new SkipWhileIterable<int>(this, test);
-
-  Iterable<int> get reversed => new ReversedListIterable<int>(this);
-
-  Map<int, int> asMap() => new ListMapView<int>(this);
-
-  Iterable<int> getRange(int start, [int end]) {
-    RangeError.checkValidRange(start, end, this.length);
-    return new SubListIterable<int>(this, start, end);
-  }
-
-  Iterator<int> get iterator => new _TypedListIterator<int>(this);
-
-  List<int> toList({bool growable: true}) {
-    return new List<int>.from(this, growable: growable);
-  }
-
-  Set<int> toSet() {
-    return new Set<int>.from(this);
-  }
-}
-
-
-class _DoubleListMixin {
-  Iterable<double> where(bool f(int element)) =>
-    new WhereIterable<double>(this, f);
-
-  Iterable<double> take(int n) => new SubListIterable<double>(this, 0, n);
-
-  Iterable<double> takeWhile(bool test(int element)) =>
-    new TakeWhileIterable<double>(this, test);
-
-  Iterable<double> skip(int n) => new SubListIterable<double>(this, n, null);
-
-  Iterable<double> skipWhile(bool test(element)) =>
-    new SkipWhileIterable<double>(this, test);
-
-  Iterable<double> get reversed => new ReversedListIterable<double>(this);
-
-  Map<int, double> asMap() => new ListMapView<double>(this);
-
-  Iterable<double> getRange(int start, [int end]) {
-    RangeError.checkValidRange(start, end, this.length);
-    return new SubListIterable<double>(this, start, end);
-  }
-
-  Iterator<double> get iterator => new _TypedListIterator<double>(this);
-
-  List<double> toList({bool growable: true}) {
-    return new List<double>.from(this, growable: growable);
-  }
-
-  Set<double> toSet() {
-    return new Set<double>.from(this);
-  }
-}
-
-
-class _Float32x4ListMixin {
-  Iterable<Float32x4> where(bool f(int element)) =>
-    new WhereIterable<Float32x4>(this, f);
-
-  Iterable<Float32x4> take(int n) => new SubListIterable<Float32x4>(this, 0, n);
-
-  Iterable<Float32x4> takeWhile(bool test(int element)) =>
-    new TakeWhileIterable<Float32x4>(this, test);
-
-  Iterable<Float32x4> skip(int n) =>
-    new SubListIterable<Float32x4>(this, n, null);
-
-  Iterable<Float32x4> skipWhile(bool test(element)) =>
-    new SkipWhileIterable<Float32x4>(this, test);
-
-  Iterable<Float32x4> get reversed => new ReversedListIterable<Float32x4>(this);
-
-  Map<int, Float32x4> asMap() => new ListMapView<Float32x4>(this);
-
-  Iterable<Float32x4> getRange(int start, [int end]) {
-    RangeError.checkValidRange(start, end, this.length);
-    return new SubListIterable<Float32x4>(this, start, end);
-  }
-
-  Iterator<Float32x4> get iterator => new _TypedListIterator<Float32x4>(this);
-
-  List<Float32x4> toList({bool growable: true}) {
-    return new List<Float32x4>.from(this, growable: growable);
-  }
-
-  Set<Float32x4> toSet() {
-    return new Set<Float32x4>.from(this);
-  }
-}
-
-
-class _Int32x4ListMixin {
-  Iterable<Int32x4> where(bool f(int element)) =>
-    new WhereIterable<Int32x4>(this, f);
-
-  Iterable<Int32x4> take(int n) => new SubListIterable<Int32x4>(this, 0, n);
-
-  Iterable<Int32x4> takeWhile(bool test(int element)) =>
-    new TakeWhileIterable<Int32x4>(this, test);
-
-  Iterable<Int32x4> skip(int n) => new SubListIterable<Int32x4>(this, n, null);
-
-  Iterable<Int32x4> skipWhile(bool test(element)) =>
-    new SkipWhileIterable<Int32x4>(this, test);
-
-  Iterable<Int32x4> get reversed => new ReversedListIterable<Int32x4>(this);
-
-  Map<int, Int32x4> asMap() => new ListMapView<Int32x4>(this);
-
-  Iterable<Int32x4> getRange(int start, [int end]) {
-    RangeError.checkValidRange(start, end, this.length);
-    return new SubListIterable<Int32x4>(this, start, end);
-  }
-
-  Iterator<Int32x4> get iterator => new _TypedListIterator<Int32x4>(this);
-
-  List<Int32x4> toList({bool growable: true}) {
-    return new List<Int32x4>.from(this, growable: growable);
-  }
-
-  Set<Int32x4> toSet() {
-    return new Set<Int32x4>.from(this);
-  }
-}
-
-
-class _Float64x2ListMixin {
-  Iterable<Float64x2> where(bool f(int element)) =>
-    new WhereIterable<Float64x2>(this, f);
-
-  Iterable<Float64x2> take(int n) => new SubListIterable<Float64x2>(this, 0, n);
-
-  Iterable<Float64x2> takeWhile(bool test(int element)) =>
-    new TakeWhileIterable<Float64x2>(this, test);
-
-  Iterable<Float64x2> skip(int n) =>
-    new SubListIterable<Float64x2>(this, n, null);
-
-  Iterable<Float64x2> skipWhile(bool test(element)) =>
-    new SkipWhileIterable<Float64x2>(this, test);
-
-  Iterable<Float64x2> get reversed => new ReversedListIterable<Float64x2>(this);
-
-  Map<int, Float64x2> asMap() => new ListMapView<Float64x2>(this);
-
-  Iterable<Float64x2> getRange(int start, [int end]) {
-    RangeError.checkValidRange(start, end, this.length);
-    return new SubListIterable<Float64x2>(this, start, end);
-  }
-
-  Iterator<Float64x2> get iterator => new _TypedListIterator<Float64x2>(this);
-
-  List<Float64x2> toList({bool growable: true}) {
-    return new List<Float64x2>.from(this, growable: growable);
-  }
-
-  Set<Float64x2> toSet() {
-    return new Set<Float64x2>.from(this);
-  }
-}
-
-
-class ByteBuffer {
-  final _TypedList _data;
-
-  ByteBuffer(this._data);
-
-  factory ByteBuffer._New(data) => new ByteBuffer(data);
-
-  // Forward calls to _data.
-  int get lengthInBytes => _data.lengthInBytes;
-  int get hashCode => _data.hashCode;
-  bool operator==(Object other) =>
-      (other is ByteBuffer) && identical(_data, other._data);
-
-  ByteData asByteData([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = this.lengthInBytes - offsetInBytes;
-    }
-    return new _ByteDataView(this._data, offsetInBytes, length);
-  }
-
-  Int8List asInt8List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = this.lengthInBytes - offsetInBytes;
-    }
-    return new _Int8ArrayView(this, offsetInBytes, length);
-  }
-
-  Uint8List asUint8List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = this.lengthInBytes - offsetInBytes;
-    }
-    return new _Uint8ArrayView(this, offsetInBytes, length);
-  }
-
-  Uint8ClampedList asUint8ClampedList([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = this.lengthInBytes - offsetInBytes;
-    }
-    return new _Uint8ClampedArrayView(this, offsetInBytes, length);
-  }
-
-  Int16List asInt16List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Int16List.BYTES_PER_ELEMENT;
-    }
-    return new _Int16ArrayView(this, offsetInBytes, length);
-  }
-
-  Uint16List asUint16List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Uint16List.BYTES_PER_ELEMENT;
-    }
-    return new _Uint16ArrayView(this, offsetInBytes, length);
-  }
-
-  Int32List asInt32List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Int32List.BYTES_PER_ELEMENT;
-    }
-    return new _Int32ArrayView(this, offsetInBytes, length);
-  }
-
-  Uint32List asUint32List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Uint32List.BYTES_PER_ELEMENT;
-    }
-    return new _Uint32ArrayView(this, offsetInBytes, length);
-  }
-
-  Int64List asInt64List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Int64List.BYTES_PER_ELEMENT;
-    }
-    return new _Int64ArrayView(this, offsetInBytes, length);
-  }
-
-  Uint64List asUint64List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Uint64List.BYTES_PER_ELEMENT;
-    }
-    return new _Uint64ArrayView(this, offsetInBytes, length);
-  }
-
-  Float32List asFloat32List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Float32List.BYTES_PER_ELEMENT;
-    }
-    return new _Float32ArrayView(this, offsetInBytes, length);
-  }
-
-  Float64List asFloat64List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Float64List.BYTES_PER_ELEMENT;
-    }
-    return new _Float64ArrayView(this, offsetInBytes, length);
-  }
-
-  Float32x4List asFloat32x4List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Float32x4List.BYTES_PER_ELEMENT;
-    }
-    return new _Float32x4ArrayView(this, offsetInBytes, length);
-  }
-
-  Int32x4List asInt32x4List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Int32x4List.BYTES_PER_ELEMENT;
-    }
-    return new _Int32x4ArrayView(this, offsetInBytes, length);
-  }
-
-  Float64x2List asFloat64x2List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = (this.lengthInBytes - offsetInBytes) ~/
-               Float64x2List.BYTES_PER_ELEMENT;
-    }
-    return new _Float64x2ArrayView(this, offsetInBytes, length);
-  }
-}
-
-
-abstract class _TypedList extends _TypedListBase {
-  // Default method implementing parts of the TypedData interface.
-  int get offsetInBytes {
-    return 0;
-  }
-
-  int get lengthInBytes {
-    return length * elementSizeInBytes;
-  }
-
-  ByteBuffer get buffer => new ByteBuffer(this);
-
-  // Methods implementing the collection interface.
-
-  int get length native "TypedData_length";
-
-  // Internal utility methods.
-
-  int _getInt8(int offsetInBytes) native "TypedData_GetInt8";
-  void _setInt8(int offsetInBytes, int value) native "TypedData_SetInt8";
-
-  int _getUint8(int offsetInBytes) native "TypedData_GetUint8";
-  void _setUint8(int offsetInBytes, int value) native "TypedData_SetUint8";
-
-  int _getInt16(int offsetInBytes) native "TypedData_GetInt16";
-  void _setInt16(int offsetInBytes, int value) native "TypedData_SetInt16";
-
-  int _getUint16(int offsetInBytes) native "TypedData_GetUint16";
-  void _setUint16(int offsetInBytes, int value) native "TypedData_SetUint16";
-
-  int _getInt32(int offsetInBytes) native "TypedData_GetInt32";
-  void _setInt32(int offsetInBytes, int value) native "TypedData_SetInt32";
-
-  int _getUint32(int offsetInBytes) native "TypedData_GetUint32";
-  void _setUint32(int offsetInBytes, int value) native "TypedData_SetUint32";
-
-  int _getInt64(int offsetInBytes) native "TypedData_GetInt64";
-  void _setInt64(int offsetInBytes, int value) native "TypedData_SetInt64";
-
-  int _getUint64(int offsetInBytes) native "TypedData_GetUint64";
-  void _setUint64(int offsetInBytes, int value) native "TypedData_SetUint64";
-
-  double _getFloat32(int offsetInBytes) native "TypedData_GetFloat32";
-  void _setFloat32(int offsetInBytes, double value)
-      native "TypedData_SetFloat32";
-
-  double _getFloat64(int offsetInBytes) native "TypedData_GetFloat64";
-  void _setFloat64(int offsetInBytes, double value)
-      native "TypedData_SetFloat64";
-
-  Float32x4 _getFloat32x4(int offsetInBytes) native "TypedData_GetFloat32x4";
-  void _setFloat32x4(int offsetInBytes, Float32x4 value)
-      native "TypedData_SetFloat32x4";
-
-  Int32x4 _getInt32x4(int offsetInBytes) native "TypedData_GetInt32x4";
-  void _setInt32x4(int offsetInBytes, Int32x4 value)
-      native "TypedData_SetInt32x4";
-
-  Float64x2 _getFloat64x2(int offsetInBytes) native "TypedData_GetFloat64x2";
-  void _setFloat64x2(int offsetInBytes, Float64x2 value)
-      native "TypedData_SetFloat64x2";
-
-  /**
-   * Stores the [CodeUnits] as UTF-16 units into this TypedData at
-   * positions [start]..[end] (uint16 indices).
-   */
-  void _setCodeUnits(CodeUnits units,
-                     int byteStart, int length, int skipCount) {
-    assert(byteStart + length * Uint16List.BYTES_PER_ELEMENT <= lengthInBytes);
-    String string = CodeUnits.stringOf(units);
-    int sliceEnd = skipCount + length;
-    RangeError.checkValidRange(skipCount, sliceEnd,
-                               string.length,
-                               "skipCount", "skipCount + length");
-    for (int i = 0; i < length; i++) {
-      _setUint16(byteStart + i * Uint16List.BYTES_PER_ELEMENT,
-                 string.codeUnitAt(skipCount + i));
-    }
-  }
-}
-
-
-class Int8List extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Int8List(int length) native "TypedData_Int8Array_new";
-
-  factory Int8List.fromList(List<int> elements) {
-    return new Int8List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Int8List.view(ByteBuffer buffer,
-                        [int offsetInBytes = 0, int length]) {
-    return buffer.asInt8List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getInt8(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setInt8(index, _toInt8(value));
-  }
-
-  static const int BYTES_PER_ELEMENT = 1;
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int8List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int8List _createList(int length) {
-    return new Int8List(length);
-  }
-}
-
-
-class Uint8List extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Uint8List(int length) native "TypedData_Uint8Array_new";
-
-  factory Uint8List.fromList(List<int> elements) {
-    return new Uint8List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Uint8List.view(ByteBuffer buffer,
-                         [int offsetInBytes = 0, int length]) {
-    return buffer.asUint8List(offsetInBytes, length);
-  }
-
-  // Methods implementing List interface.
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getUint8(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setUint8(index, _toUint8(value));
-  }
-
-  static const int BYTES_PER_ELEMENT = 1;
-
-  // Methods implementing TypedData interface.
-  int get elementSizeInBytes {
-    return Uint8List.BYTES_PER_ELEMENT;
-  }
-
-  // Internal utility methods.
-
-  Uint8List _createList(int length) {
-    return new Uint8List(length);
-  }
-}
-
-
-class Uint8ClampedList extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Uint8ClampedList(int length) native "TypedData_Uint8ClampedArray_new";
-
-  factory Uint8ClampedList.fromList(List<int> elements) {
-    return new Uint8ClampedList(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Uint8ClampedList.view(ByteBuffer buffer,
-                                [int offsetInBytes = 0, int length]) {
-    return buffer.asUint8ClampedList(offsetInBytes, length);
-  }
-
-  // Methods implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getUint8(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setUint8(index, _toClampedUint8(value));
-  }
-
-  static const int BYTES_PER_ELEMENT = 1;
-
-  // Methods implementing TypedData interface.
-  int get elementSizeInBytes {
-    return Uint8List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint8ClampedList _createList(int length) {
-    return new Uint8ClampedList(length);
-  }
-}
-
-
-class Int16List extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Int16List(int length) native "TypedData_Int16Array_new";
-
-  factory Int16List.fromList(List<int> elements) {
-    return new Int16List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Int16List.view(ByteBuffer buffer,
-                         [int offsetInBytes = 0, int length]) {
-    return buffer.asInt16List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedInt16(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedInt16(index, _toInt16(value));
-  }
-
-  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
-    if (iterable is CodeUnits) {
-      end = RangeError.checkValidRange(start, end, this.length);
-      int length = end - start;
-      int byteStart = this.offsetInBytes + start * Int16List.BYTES_PER_ELEMENT;
-      _setCodeUnits(iterable, byteStart, length, skipCount);
-    } else {
-      super.setRange(start, end, iterable, skipCount);
-    }
-  }
-
-  // Method(s) implementing TypedData interface.
-  static const int BYTES_PER_ELEMENT = 2;
-
-  int get elementSizeInBytes {
-    return Int16List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int16List _createList(int length) {
-    return new Int16List(length);
-  }
-
-  int _getIndexedInt16(int index) {
-    return _getInt16(index * Int16List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedInt16(int index, int value) {
-    _setInt16(index * Int16List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Uint16List extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Uint16List(int length) native "TypedData_Uint16Array_new";
-
-  factory Uint16List.fromList(List<int> elements) {
-    return new Uint16List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Uint16List.view(ByteBuffer buffer,
-                          [int offsetInBytes = 0, int length]) {
-    return buffer.asUint16List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedUint16(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedUint16(index, _toUint16(value));
-  }
-
-  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
-    if (iterable is CodeUnits) {
-      end = RangeError.checkValidRange(start, end, this.length);
-      int length = end - start;
-      int byteStart = this.offsetInBytes + start * Uint16List.BYTES_PER_ELEMENT;
-      _setCodeUnits(iterable, byteStart, length, skipCount);
-    } else {
-      super.setRange(start, end, iterable, skipCount);
-    }
-  }
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 2;
-
-  int get elementSizeInBytes {
-    return Uint16List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint16List _createList(int length) {
-    return new Uint16List(length);
-  }
-
-  int _getIndexedUint16(int index) {
-    return _getUint16(index * Uint16List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedUint16(int index, int value) {
-    _setUint16(index * Uint16List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Int32List extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Int32List(int length) native "TypedData_Int32Array_new";
-
-  factory Int32List.fromList(List<int> elements) {
-    return new Int32List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Int32List.view(ByteBuffer buffer,
-                         [int offsetInBytes = 0, int length]) {
-    return buffer.asInt32List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedInt32(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedInt32(index, _toInt32(value));
-  }
-
-
-  // Method(s) implementing TypedData interface.
-  static const int BYTES_PER_ELEMENT = 4;
-
-  int get elementSizeInBytes {
-    return Int32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int32List _createList(int length) {
-    return new Int32List(length);
-  }
-
-  int _getIndexedInt32(int index) {
-    return _getInt32(index * Int32List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedInt32(int index, int value) {
-    _setInt32(index * Int32List.BYTES_PER_ELEMENT, value);
-  }
-
-}
-
-
-class Uint32List extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Uint32List(int length) native "TypedData_Uint32Array_new";
-
-  factory Uint32List.fromList(List<int> elements) {
-    return new Uint32List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Uint32List.view(ByteBuffer buffer,
-                          [int offsetInBytes = 0, int length]) {
-    return buffer.asUint32List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedUint32(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedUint32(index, _toUint32(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 4;
-
-  int get elementSizeInBytes {
-    return Uint32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint32List _createList(int length) {
-    return new Uint32List(length);
-  }
-
-  int _getIndexedUint32(int index) {
-    return _getUint32(index * Uint32List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedUint32(int index, int value) {
-    _setUint32(index * Uint32List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Int64List extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Int64List(int length) native "TypedData_Int64Array_new";
-
-  factory Int64List.fromList(List<int> elements) {
-    return new Int64List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Int64List.view(ByteBuffer buffer,
-                         [int offsetInBytes = 0, int length]) {
-    return buffer.asInt64List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedInt64(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedInt64(index, _toInt64(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 8;
-
-  int get elementSizeInBytes {
-    return Int64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int64List _createList(int length) {
-    return new Int64List(length);
-  }
-
-  int _getIndexedInt64(int index) {
-    return _getInt64(index * Int64List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedInt64(int index, int value) {
-    _setInt64(index * Int64List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Uint64List extends _TypedList with _IntListMixin implements List<int>, TypedData {
-  // Factory constructors.
-
-  factory Uint64List(int length) native "TypedData_Uint64Array_new";
-
-  factory Uint64List.fromList(List<int> elements) {
-    return new Uint64List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Uint64List.view(ByteBuffer buffer,
-                          [int offsetInBytes = 0, int length]) {
-    return buffer.asUint64List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedUint64(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedUint64(index, _toUint64(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 8;
-
-  int get elementSizeInBytes {
-    return Uint64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint64List _createList(int length) {
-    return new Uint64List(length);
-  }
-
-  int _getIndexedUint64(int index) {
-    return _getUint64(index * Uint64List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedUint64(int index, int value) {
-    _setUint64(index * Uint64List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Float32List extends _TypedList with _DoubleListMixin implements List<double>, TypedData {
-  // Factory constructors.
-
-  factory Float32List(int length) native "TypedData_Float32Array_new";
-
-  factory Float32List.fromList(List<double> elements) {
-    return new Float32List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Float32List.view(ByteBuffer buffer,
-                           [int offsetInBytes = 0, int length]) {
-    return buffer.asFloat32List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing the List interface.
-
-  double operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedFloat32(index);
-  }
-
-  void operator[]=(int index, double value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedFloat32(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 4;
-
-  int get elementSizeInBytes {
-    return Float32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float32List _createList(int length) {
-    return new Float32List(length);
-  }
-
-  double _getIndexedFloat32(int index) {
-    return _getFloat32(index * Float32List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedFloat32(int index, double value) {
-    _setFloat32(index * Float32List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Float64List extends _TypedList with _DoubleListMixin implements List<double>, TypedData {
-  // Factory constructors.
-
-  factory Float64List(int length) native "TypedData_Float64Array_new";
-
-  factory Float64List.fromList(List<double> elements) {
-    return new Float64List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Float64List.view(ByteBuffer buffer,
-                           [int offsetInBytes = 0, int length]) {
-    return buffer.asFloat64List(offsetInBytes, length);
-  }
-
-  // Method(s) implementing the List interface.
-
-  double operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedFloat64(index);
-  }
-
-  void operator[]=(int index, double value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedFloat64(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 8;
-
-  int get elementSizeInBytes {
-    return Float64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float64List _createList(int length) {
-    return new Float64List(length);
-  }
-
-  double _getIndexedFloat64(int index) {
-    return _getFloat64(index * Float64List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedFloat64(int index, double value) {
-    _setFloat64(index * Float64List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Float32x4List extends _TypedList with _Float32x4ListMixin implements List<Float32x4>, TypedData {
-  // Factory constructors.
-
-  factory Float32x4List(int length) native "TypedData_Float32x4Array_new";
-
-  factory Float32x4List.fromList(List<Float32x4> elements) {
-    return new Float32x4List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Float32x4List.view(ByteBuffer buffer,
-                             [int offsetInBytes = 0, int length]) {
-    return buffer.asFloat32x4List(offsetInBytes, length);
-  }
-
-  Float32x4 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedFloat32x4(index);
-  }
-
-  void operator[]=(int index, Float32x4 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedFloat32x4(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 16;
-
-  int get elementSizeInBytes {
-    return Float32x4List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float32x4List _createList(int length) {
-    return new Float32x4List(length);
-  }
-
-  Float32x4 _getIndexedFloat32x4(int index) {
-    return _getFloat32x4(index * Float32x4List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedFloat32x4(int index, Float32x4 value) {
-    _setFloat32x4(index * Float32x4List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Int32x4List extends _TypedList with _Int32x4ListMixin implements List<Int32x4>, TypedData {
-  // Factory constructors.
-
-  factory Int32x4List(int length) native "TypedData_Int32x4Array_new";
-
-  factory Int32x4List.fromList(List<Int32x4> elements) {
-    return new Int32x4List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Int32x4List.view(ByteBuffer buffer,
-                             [int offsetInBytes = 0, int length]) {
-    return buffer.asInt32x4List(offsetInBytes, length);
-  }
-
-  Int32x4 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedInt32x4(index);
-  }
-
-  void operator[]=(int index, Int32x4 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedInt32x4(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 16;
-
-  int get elementSizeInBytes {
-    return Int32x4List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int32x4List _createList(int length) {
-    return new Int32x4List(length);
-  }
-
-  Int32x4 _getIndexedInt32x4(int index) {
-    return _getInt32x4(index * Int32x4List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedInt32x4(int index, Int32x4 value) {
-    _setInt32x4(index * Int32x4List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Float64x2List extends _TypedList with _Float64x2ListMixin implements List<Float64x2>, TypedData {
-  // Factory constructors.
-
-  factory Float64x2List(int length) native "TypedData_Float64x2Array_new";
-
-  factory Float64x2List.fromList(List<Float64x2> elements) {
-    return new Float64x2List(elements.length)
-        ..setRange(0, elements.length, elements);
-  }
-
-  factory Float64x2List.view(ByteBuffer buffer,
-                             [int offsetInBytes = 0, int length]) {
-    return buffer.asFloat64x2List(offsetInBytes, length);
-  }
-
-  Float64x2 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedFloat64x2(index);
-  }
-
-  void operator[]=(int index, Float64x2 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedFloat64x2(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-  static const int BYTES_PER_ELEMENT = 16;
-
-  int get elementSizeInBytes {
-    return Float64x2List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float64x2List _createList(int length) {
-    return new Float64x2List(length);
-  }
-
-  Float64x2 _getIndexedFloat64x2(int index) {
-    return _getFloat64x2(index * Float64x2List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedFloat64x2(int index, Float64x2 value) {
-    _setFloat64x2(index * Float64x2List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalInt8Array extends _TypedList with _IntListMixin implements Int8List {
-  // Method(s) implementing the List interface.
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getInt8(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setInt8(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int8List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int8List _createList(int length) {
-    return new Int8List(length);
-  }
-}
-
-
-class _ExternalUint8Array extends _TypedList with _IntListMixin implements Uint8List {
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getUint8(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setUint8(index, _toUint8(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint8List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint8List _createList(int length) {
-    return new Uint8List(length);
-  }
-}
-
-
-class _ExternalUint8ClampedArray extends _TypedList with _IntListMixin implements Uint8ClampedList {
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getUint8(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setUint8(index, _toClampedUint8(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint8List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint8ClampedList _createList(int length) {
-    return new Uint8ClampedList(length);
-  }
-}
-
-
-class _ExternalInt16Array extends _TypedList with _IntListMixin implements Int16List {
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedInt16(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedInt16(index, _toInt16(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int16List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int16List _createList(int length) {
-    return new Int16List(length);
-  }
-
-  int _getIndexedInt16(int index) {
-    return _getInt16(index * Int16List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedInt16(int index, int value) {
-    _setInt16(index * Int16List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalUint16Array extends _TypedList with _IntListMixin implements Uint16List {
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedUint16(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedUint16(index, _toUint16(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint16List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint16List _createList(int length) {
-    return new Uint16List(length);
-  }
-
-  int _getIndexedUint16(int index) {
-    return _getUint16(index * Uint16List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedUint16(int index, int value) {
-    _setUint16(index * Uint16List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalInt32Array extends _TypedList with _IntListMixin implements Int32List {
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedInt32(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedInt32(index, _toInt32(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int32List _createList(int length) {
-    return new Int32List(length);
-  }
-
-  int _getIndexedInt32(int index) {
-    return _getInt32(index * Int32List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedInt32(int index, int value) {
-    _setInt32(index * Int32List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalUint32Array extends _TypedList with _IntListMixin implements Uint32List {
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedUint32(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedUint32(index, _toUint32(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint32List _createList(int length) {
-    return new Uint32List(length);
-  }
-
-  int _getIndexedUint32(int index) {
-    return _getUint32(index * Uint32List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedUint32(int index, int value) {
-    _setUint32(index * Uint32List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalInt64Array extends _TypedList with _IntListMixin implements Int64List {
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedInt64(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedInt64(index, _toInt64(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int64List _createList(int length) {
-    return new Int64List(length);
-  }
-
-  int _getIndexedInt64(int index) {
-    return _getInt64(index * Int64List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedInt64(int index, int value) {
-    _setInt64(index * Int64List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalUint64Array extends _TypedList with _IntListMixin implements Uint64List {
-  // Method(s) implementing the List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedUint64(index);
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedUint64(index, _toUint64(value));
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint64List _createList(int length) {
-    return new Uint64List(length);
-  }
-
-  int _getIndexedUint64(int index) {
-    return _getUint64(index * Uint64List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedUint64(int index, int value) {
-    _setUint64(index * Uint64List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalFloat32Array extends _TypedList with _DoubleListMixin implements Float32List {
-  // Method(s) implementing the List interface.
-
-  double operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedFloat32(index);
-  }
-
-  void operator[]=(int index, double value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedFloat32(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Float32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float32List _createList(int length) {
-    return new Float32List(length);
-  }
-
-  double _getIndexedFloat32(int index) {
-    return _getFloat32(index * Float32List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedFloat32(int index, double value) {
-    _setFloat32(index * Float32List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalFloat64Array extends _TypedList with _DoubleListMixin implements Float64List {
-  // Method(s) implementing the List interface.
-
-  double operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedFloat64(index);
-  }
-
-  void operator[]=(int index, double value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedFloat64(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Float64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float64List _createList(int length) {
-    return new Float64List(length);
-  }
-
-  double _getIndexedFloat64(int index) {
-    return _getFloat64(index * Float64List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedFloat64(int index, double value) {
-    _setFloat64(index * Float64List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalFloat32x4Array extends _TypedList with _Float32x4ListMixin implements Float32x4List {
-  // Method(s) implementing the List interface.
-
-  Float32x4 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedFloat32x4(index);
-  }
-
-  void operator[]=(int index, Float32x4 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedFloat32x4(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Float32x4List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float32x4List _createList(int length) {
-    return new Float32x4List(length);
-  }
-
-  Float32x4 _getIndexedFloat32x4(int index) {
-    return _getFloat32x4(index * Float32x4List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedFloat32x4(int index, Float32x4 value) {
-    _setFloat32x4(index * Float32x4List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalInt32x4Array extends _TypedList with _Int32x4ListMixin implements Int32x4List {
-  // Method(s) implementing the List interface.
-
-  Int32x4 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedInt32x4(index);
-  }
-
-  void operator[]=(int index, Int32x4 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedInt32x4(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int32x4List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int32x4List _createList(int length) {
-    return new Int32x4List(length);
-  }
-
-  Int32x4 _getIndexedInt32x4(int index) {
-    return _getInt32x4(index * Int32x4List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedInt32x4(int index, Int32x4 value) {
-    _setInt32x4(index * Int32x4List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class _ExternalFloat64x2Array extends _TypedList with _Float64x2ListMixin implements Float64x2List {
-  // Method(s) implementing the List interface.
-
-  Float64x2 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _getIndexedFloat64x2(index);
-  }
-
-  void operator[]=(int index, Float64x2 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _setIndexedFloat64x2(index, value);
-  }
-
-
-  // Method(s) implementing the TypedData interface.
-
-  int get elementSizeInBytes {
-    return Float64x2List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float64x2List _createList(int length) {
-    return new Float64x2List(length);
-  }
-
-  Float64x2 _getIndexedFloat64x2(int index) {
-    return _getFloat64x2(index * Float64x2List.BYTES_PER_ELEMENT);
-  }
-
-  void _setIndexedFloat64x2(int index, Float64x2 value) {
-    _setFloat64x2(index * Float64x2List.BYTES_PER_ELEMENT, value);
-  }
-}
-
-
-class Float32x4 {
-  factory Float32x4(double x, double y, double z, double w)
-      native "Float32x4_fromDoubles";
-  factory Float32x4.splat(double v) native "Float32x4_splat";
-  factory Float32x4.zero() native "Float32x4_zero";
-  factory Float32x4.fromInt32x4Bits(Int32x4 x)
-      native "Float32x4_fromInt32x4Bits";
-  factory Float32x4.fromFloat64x2(Float64x2 v)
-      native "Float32x4_fromFloat64x2";
-  Float32x4 operator +(Float32x4 other) {
-    return _add(other);
-  }
-  Float32x4 _add(Float32x4 other) native "Float32x4_add";
-  Float32x4 operator -() {
-    return _negate();
-  }
-  Float32x4 _negate() native "Float32x4_negate";
-  Float32x4 operator -(Float32x4 other) {
-    return _sub(other);
-  }
-  Float32x4 _sub(Float32x4 other) native "Float32x4_sub";
-  Float32x4 operator *(Float32x4 other) {
-    return _mul(other);
-  }
-  Float32x4 _mul(Float32x4 other) native "Float32x4_mul";
-  Float32x4 operator /(Float32x4 other) {
-    return _div(other);
-  }
-  Float32x4 _div(Float32x4 other) native "Float32x4_div";
-  Int32x4 lessThan(Float32x4 other) {
-    return _cmplt(other);
-  }
-  Int32x4 _cmplt(Float32x4 other) native "Float32x4_cmplt";
-  Int32x4 lessThanOrEqual(Float32x4 other) {
-    return _cmplte(other);
-  }
-  Int32x4 _cmplte(Float32x4 other) native "Float32x4_cmplte";
-  Int32x4 greaterThan(Float32x4 other) {
-    return _cmpgt(other);
-  }
-  Int32x4 _cmpgt(Float32x4 other) native "Float32x4_cmpgt";
-  Int32x4 greaterThanOrEqual(Float32x4 other) {
-    return _cmpgte(other);
-  }
-  Int32x4 _cmpgte(Float32x4 other) native "Float32x4_cmpgte";
-  Int32x4 equal(Float32x4 other) {
-    return _cmpequal(other);
-  }
-  Int32x4 _cmpequal(Float32x4 other)
-      native "Float32x4_cmpequal";
-  Int32x4 notEqual(Float32x4 other) {
-    return _cmpnequal(other);
-  }
-  Int32x4 _cmpnequal(Float32x4 other)
-      native "Float32x4_cmpnequal";
-  Float32x4 scale(double s) {
-    return _scale(s);
-  }
-  Float32x4 _scale(double s) native "Float32x4_scale";
-  Float32x4 abs() {
-    return _abs();
-  }
-  Float32x4 _abs() native "Float32x4_abs";
-  Float32x4 clamp(Float32x4 lowerLimit, Float32x4 upperLimit) {
-    return _clamp(lowerLimit, upperLimit);
-  }
-  Float32x4 _clamp(Float32x4 lowerLimit, Float32x4 upperLimit)
-      native "Float32x4_clamp";
-  double get x native "Float32x4_getX";
-  double get y native "Float32x4_getY";
-  double get z native "Float32x4_getZ";
-  double get w native "Float32x4_getW";
-  int get signMask native "Float32x4_getSignMask";
-
-  Float32x4 shuffle(int mask) native "Float32x4_shuffle";
-  Float32x4 shuffleMix(Float32x4 zw, int mask) native "Float32x4_shuffleMix";
-
-  Float32x4 withX(double x) native "Float32x4_setX";
-  Float32x4 withY(double y) native "Float32x4_setY";
-  Float32x4 withZ(double z) native "Float32x4_setZ";
-  Float32x4 withW(double w) native "Float32x4_setW";
-  Float32x4 min(Float32x4 other) {
-    return _min(other);
-  }
-  Float32x4 _min(Float32x4 other) native "Float32x4_min";
-  Float32x4 max(Float32x4 other) {
-    return _max(other);
-  }
-  Float32x4 _max(Float32x4 other) native "Float32x4_max";
-  Float32x4 sqrt() {
-    return _sqrt();
-  }
-  Float32x4 _sqrt() native "Float32x4_sqrt";
-  Float32x4 reciprocal() {
-    return _reciprocal();
-  }
-  Float32x4 _reciprocal() native "Float32x4_reciprocal";
-  Float32x4 reciprocalSqrt() {
-    return _reciprocalSqrt();
-  }
-  Float32x4 _reciprocalSqrt() native "Float32x4_reciprocalSqrt";
-
-  /// Mask passed to [shuffle] or [shuffleMix].
-  static const int XXXX = 0x0;
-  static const int XXXY = 0x40;
-  static const int XXXZ = 0x80;
-  static const int XXXW = 0xC0;
-  static const int XXYX = 0x10;
-  static const int XXYY = 0x50;
-  static const int XXYZ = 0x90;
-  static const int XXYW = 0xD0;
-  static const int XXZX = 0x20;
-  static const int XXZY = 0x60;
-  static const int XXZZ = 0xA0;
-  static const int XXZW = 0xE0;
-  static const int XXWX = 0x30;
-  static const int XXWY = 0x70;
-  static const int XXWZ = 0xB0;
-  static const int XXWW = 0xF0;
-  static const int XYXX = 0x4;
-  static const int XYXY = 0x44;
-  static const int XYXZ = 0x84;
-  static const int XYXW = 0xC4;
-  static const int XYYX = 0x14;
-  static const int XYYY = 0x54;
-  static const int XYYZ = 0x94;
-  static const int XYYW = 0xD4;
-  static const int XYZX = 0x24;
-  static const int XYZY = 0x64;
-  static const int XYZZ = 0xA4;
-  static const int XYZW = 0xE4;
-  static const int XYWX = 0x34;
-  static const int XYWY = 0x74;
-  static const int XYWZ = 0xB4;
-  static const int XYWW = 0xF4;
-  static const int XZXX = 0x8;
-  static const int XZXY = 0x48;
-  static const int XZXZ = 0x88;
-  static const int XZXW = 0xC8;
-  static const int XZYX = 0x18;
-  static const int XZYY = 0x58;
-  static const int XZYZ = 0x98;
-  static const int XZYW = 0xD8;
-  static const int XZZX = 0x28;
-  static const int XZZY = 0x68;
-  static const int XZZZ = 0xA8;
-  static const int XZZW = 0xE8;
-  static const int XZWX = 0x38;
-  static const int XZWY = 0x78;
-  static const int XZWZ = 0xB8;
-  static const int XZWW = 0xF8;
-  static const int XWXX = 0xC;
-  static const int XWXY = 0x4C;
-  static const int XWXZ = 0x8C;
-  static const int XWXW = 0xCC;
-  static const int XWYX = 0x1C;
-  static const int XWYY = 0x5C;
-  static const int XWYZ = 0x9C;
-  static const int XWYW = 0xDC;
-  static const int XWZX = 0x2C;
-  static const int XWZY = 0x6C;
-  static const int XWZZ = 0xAC;
-  static const int XWZW = 0xEC;
-  static const int XWWX = 0x3C;
-  static const int XWWY = 0x7C;
-  static const int XWWZ = 0xBC;
-  static const int XWWW = 0xFC;
-  static const int YXXX = 0x1;
-  static const int YXXY = 0x41;
-  static const int YXXZ = 0x81;
-  static const int YXXW = 0xC1;
-  static const int YXYX = 0x11;
-  static const int YXYY = 0x51;
-  static const int YXYZ = 0x91;
-  static const int YXYW = 0xD1;
-  static const int YXZX = 0x21;
-  static const int YXZY = 0x61;
-  static const int YXZZ = 0xA1;
-  static const int YXZW = 0xE1;
-  static const int YXWX = 0x31;
-  static const int YXWY = 0x71;
-  static const int YXWZ = 0xB1;
-  static const int YXWW = 0xF1;
-  static const int YYXX = 0x5;
-  static const int YYXY = 0x45;
-  static const int YYXZ = 0x85;
-  static const int YYXW = 0xC5;
-  static const int YYYX = 0x15;
-  static const int YYYY = 0x55;
-  static const int YYYZ = 0x95;
-  static const int YYYW = 0xD5;
-  static const int YYZX = 0x25;
-  static const int YYZY = 0x65;
-  static const int YYZZ = 0xA5;
-  static const int YYZW = 0xE5;
-  static const int YYWX = 0x35;
-  static const int YYWY = 0x75;
-  static const int YYWZ = 0xB5;
-  static const int YYWW = 0xF5;
-  static const int YZXX = 0x9;
-  static const int YZXY = 0x49;
-  static const int YZXZ = 0x89;
-  static const int YZXW = 0xC9;
-  static const int YZYX = 0x19;
-  static const int YZYY = 0x59;
-  static const int YZYZ = 0x99;
-  static const int YZYW = 0xD9;
-  static const int YZZX = 0x29;
-  static const int YZZY = 0x69;
-  static const int YZZZ = 0xA9;
-  static const int YZZW = 0xE9;
-  static const int YZWX = 0x39;
-  static const int YZWY = 0x79;
-  static const int YZWZ = 0xB9;
-  static const int YZWW = 0xF9;
-  static const int YWXX = 0xD;
-  static const int YWXY = 0x4D;
-  static const int YWXZ = 0x8D;
-  static const int YWXW = 0xCD;
-  static const int YWYX = 0x1D;
-  static const int YWYY = 0x5D;
-  static const int YWYZ = 0x9D;
-  static const int YWYW = 0xDD;
-  static const int YWZX = 0x2D;
-  static const int YWZY = 0x6D;
-  static const int YWZZ = 0xAD;
-  static const int YWZW = 0xED;
-  static const int YWWX = 0x3D;
-  static const int YWWY = 0x7D;
-  static const int YWWZ = 0xBD;
-  static const int YWWW = 0xFD;
-  static const int ZXXX = 0x2;
-  static const int ZXXY = 0x42;
-  static const int ZXXZ = 0x82;
-  static const int ZXXW = 0xC2;
-  static const int ZXYX = 0x12;
-  static const int ZXYY = 0x52;
-  static const int ZXYZ = 0x92;
-  static const int ZXYW = 0xD2;
-  static const int ZXZX = 0x22;
-  static const int ZXZY = 0x62;
-  static const int ZXZZ = 0xA2;
-  static const int ZXZW = 0xE2;
-  static const int ZXWX = 0x32;
-  static const int ZXWY = 0x72;
-  static const int ZXWZ = 0xB2;
-  static const int ZXWW = 0xF2;
-  static const int ZYXX = 0x6;
-  static const int ZYXY = 0x46;
-  static const int ZYXZ = 0x86;
-  static const int ZYXW = 0xC6;
-  static const int ZYYX = 0x16;
-  static const int ZYYY = 0x56;
-  static const int ZYYZ = 0x96;
-  static const int ZYYW = 0xD6;
-  static const int ZYZX = 0x26;
-  static const int ZYZY = 0x66;
-  static const int ZYZZ = 0xA6;
-  static const int ZYZW = 0xE6;
-  static const int ZYWX = 0x36;
-  static const int ZYWY = 0x76;
-  static const int ZYWZ = 0xB6;
-  static const int ZYWW = 0xF6;
-  static const int ZZXX = 0xA;
-  static const int ZZXY = 0x4A;
-  static const int ZZXZ = 0x8A;
-  static const int ZZXW = 0xCA;
-  static const int ZZYX = 0x1A;
-  static const int ZZYY = 0x5A;
-  static const int ZZYZ = 0x9A;
-  static const int ZZYW = 0xDA;
-  static const int ZZZX = 0x2A;
-  static const int ZZZY = 0x6A;
-  static const int ZZZZ = 0xAA;
-  static const int ZZZW = 0xEA;
-  static const int ZZWX = 0x3A;
-  static const int ZZWY = 0x7A;
-  static const int ZZWZ = 0xBA;
-  static const int ZZWW = 0xFA;
-  static const int ZWXX = 0xE;
-  static const int ZWXY = 0x4E;
-  static const int ZWXZ = 0x8E;
-  static const int ZWXW = 0xCE;
-  static const int ZWYX = 0x1E;
-  static const int ZWYY = 0x5E;
-  static const int ZWYZ = 0x9E;
-  static const int ZWYW = 0xDE;
-  static const int ZWZX = 0x2E;
-  static const int ZWZY = 0x6E;
-  static const int ZWZZ = 0xAE;
-  static const int ZWZW = 0xEE;
-  static const int ZWWX = 0x3E;
-  static const int ZWWY = 0x7E;
-  static const int ZWWZ = 0xBE;
-  static const int ZWWW = 0xFE;
-  static const int WXXX = 0x3;
-  static const int WXXY = 0x43;
-  static const int WXXZ = 0x83;
-  static const int WXXW = 0xC3;
-  static const int WXYX = 0x13;
-  static const int WXYY = 0x53;
-  static const int WXYZ = 0x93;
-  static const int WXYW = 0xD3;
-  static const int WXZX = 0x23;
-  static const int WXZY = 0x63;
-  static const int WXZZ = 0xA3;
-  static const int WXZW = 0xE3;
-  static const int WXWX = 0x33;
-  static const int WXWY = 0x73;
-  static const int WXWZ = 0xB3;
-  static const int WXWW = 0xF3;
-  static const int WYXX = 0x7;
-  static const int WYXY = 0x47;
-  static const int WYXZ = 0x87;
-  static const int WYXW = 0xC7;
-  static const int WYYX = 0x17;
-  static const int WYYY = 0x57;
-  static const int WYYZ = 0x97;
-  static const int WYYW = 0xD7;
-  static const int WYZX = 0x27;
-  static const int WYZY = 0x67;
-  static const int WYZZ = 0xA7;
-  static const int WYZW = 0xE7;
-  static const int WYWX = 0x37;
-  static const int WYWY = 0x77;
-  static const int WYWZ = 0xB7;
-  static const int WYWW = 0xF7;
-  static const int WZXX = 0xB;
-  static const int WZXY = 0x4B;
-  static const int WZXZ = 0x8B;
-  static const int WZXW = 0xCB;
-  static const int WZYX = 0x1B;
-  static const int WZYY = 0x5B;
-  static const int WZYZ = 0x9B;
-  static const int WZYW = 0xDB;
-  static const int WZZX = 0x2B;
-  static const int WZZY = 0x6B;
-  static const int WZZZ = 0xAB;
-  static const int WZZW = 0xEB;
-  static const int WZWX = 0x3B;
-  static const int WZWY = 0x7B;
-  static const int WZWZ = 0xBB;
-  static const int WZWW = 0xFB;
-  static const int WWXX = 0xF;
-  static const int WWXY = 0x4F;
-  static const int WWXZ = 0x8F;
-  static const int WWXW = 0xCF;
-  static const int WWYX = 0x1F;
-  static const int WWYY = 0x5F;
-  static const int WWYZ = 0x9F;
-  static const int WWYW = 0xDF;
-  static const int WWZX = 0x2F;
-  static const int WWZY = 0x6F;
-  static const int WWZZ = 0xAF;
-  static const int WWZW = 0xEF;
-  static const int WWWX = 0x3F;
-  static const int WWWY = 0x7F;
-  static const int WWWZ = 0xBF;
-  static const int WWWW = 0xFF;
-
-}
-
-
-class Int32x4 {
-  factory Int32x4(int x, int y, int z, int w)
-      native "Int32x4_fromInts";
-  factory Int32x4.bool(bool x, bool y, bool z, bool w)
-      native "Int32x4_fromBools";
-  factory Int32x4.fromFloat32x4Bits(Float32x4 x)
-      native "Int32x4_fromFloat32x4Bits";
-  Int32x4 operator |(Int32x4 other) {
-    return _or(other);
-  }
-  Int32x4 _or(Int32x4 other) native "Int32x4_or";
-  Int32x4 operator &(Int32x4 other) {
-    return _and(other);
-  }
-  Int32x4 _and(Int32x4 other) native "Int32x4_and";
-  Int32x4 operator ^(Int32x4 other) {
-    return _xor(other);
-  }
-  Int32x4 _xor(Int32x4 other) native "Int32x4_xor";
-  Int32x4 operator +(Int32x4 other) {
-    return _add(other);
-  }
-  Int32x4 _add(Int32x4 other) native "Int32x4_add";
-  Int32x4 operator -(Int32x4 other) {
-    return _sub(other);
-  }
-  Int32x4 _sub(Int32x4 other) native "Int32x4_sub";
-  int get x native "Int32x4_getX";
-  int get y native "Int32x4_getY";
-  int get z native "Int32x4_getZ";
-  int get w native "Int32x4_getW";
-  int get signMask native "Int32x4_getSignMask";
-  Int32x4 shuffle(int mask) native "Int32x4_shuffle";
-  Int32x4 shuffleMix(Int32x4 zw, int mask) native "Int32x4_shuffleMix";
-  Int32x4 withX(int x) native "Int32x4_setX";
-  Int32x4 withY(int y) native "Int32x4_setY";
-  Int32x4 withZ(int z) native "Int32x4_setZ";
-  Int32x4 withW(int w) native "Int32x4_setW";
-  bool get flagX native "Int32x4_getFlagX";
-  bool get flagY native "Int32x4_getFlagY";
-  bool get flagZ native "Int32x4_getFlagZ";
-  bool get flagW native "Int32x4_getFlagW";
-  Int32x4 withFlagX(bool x) native "Int32x4_setFlagX";
-  Int32x4 withFlagY(bool y) native "Int32x4_setFlagY";
-  Int32x4 withFlagZ(bool z) native "Int32x4_setFlagZ";
-  Int32x4 withFlagW(bool w) native "Int32x4_setFlagW";
-  Float32x4 select(Float32x4 trueValue, Float32x4 falseValue) {
-    return _select(trueValue, falseValue);
-  }
-  Float32x4 _select(Float32x4 trueValue, Float32x4 falseValue)
-      native "Int32x4_select";
-
-  /// Mask passed to [shuffle] or [shuffleMix].
-  static const int XXXX = 0x0;
-  static const int XXXY = 0x40;
-  static const int XXXZ = 0x80;
-  static const int XXXW = 0xC0;
-  static const int XXYX = 0x10;
-  static const int XXYY = 0x50;
-  static const int XXYZ = 0x90;
-  static const int XXYW = 0xD0;
-  static const int XXZX = 0x20;
-  static const int XXZY = 0x60;
-  static const int XXZZ = 0xA0;
-  static const int XXZW = 0xE0;
-  static const int XXWX = 0x30;
-  static const int XXWY = 0x70;
-  static const int XXWZ = 0xB0;
-  static const int XXWW = 0xF0;
-  static const int XYXX = 0x4;
-  static const int XYXY = 0x44;
-  static const int XYXZ = 0x84;
-  static const int XYXW = 0xC4;
-  static const int XYYX = 0x14;
-  static const int XYYY = 0x54;
-  static const int XYYZ = 0x94;
-  static const int XYYW = 0xD4;
-  static const int XYZX = 0x24;
-  static const int XYZY = 0x64;
-  static const int XYZZ = 0xA4;
-  static const int XYZW = 0xE4;
-  static const int XYWX = 0x34;
-  static const int XYWY = 0x74;
-  static const int XYWZ = 0xB4;
-  static const int XYWW = 0xF4;
-  static const int XZXX = 0x8;
-  static const int XZXY = 0x48;
-  static const int XZXZ = 0x88;
-  static const int XZXW = 0xC8;
-  static const int XZYX = 0x18;
-  static const int XZYY = 0x58;
-  static const int XZYZ = 0x98;
-  static const int XZYW = 0xD8;
-  static const int XZZX = 0x28;
-  static const int XZZY = 0x68;
-  static const int XZZZ = 0xA8;
-  static const int XZZW = 0xE8;
-  static const int XZWX = 0x38;
-  static const int XZWY = 0x78;
-  static const int XZWZ = 0xB8;
-  static const int XZWW = 0xF8;
-  static const int XWXX = 0xC;
-  static const int XWXY = 0x4C;
-  static const int XWXZ = 0x8C;
-  static const int XWXW = 0xCC;
-  static const int XWYX = 0x1C;
-  static const int XWYY = 0x5C;
-  static const int XWYZ = 0x9C;
-  static const int XWYW = 0xDC;
-  static const int XWZX = 0x2C;
-  static const int XWZY = 0x6C;
-  static const int XWZZ = 0xAC;
-  static const int XWZW = 0xEC;
-  static const int XWWX = 0x3C;
-  static const int XWWY = 0x7C;
-  static const int XWWZ = 0xBC;
-  static const int XWWW = 0xFC;
-  static const int YXXX = 0x1;
-  static const int YXXY = 0x41;
-  static const int YXXZ = 0x81;
-  static const int YXXW = 0xC1;
-  static const int YXYX = 0x11;
-  static const int YXYY = 0x51;
-  static const int YXYZ = 0x91;
-  static const int YXYW = 0xD1;
-  static const int YXZX = 0x21;
-  static const int YXZY = 0x61;
-  static const int YXZZ = 0xA1;
-  static const int YXZW = 0xE1;
-  static const int YXWX = 0x31;
-  static const int YXWY = 0x71;
-  static const int YXWZ = 0xB1;
-  static const int YXWW = 0xF1;
-  static const int YYXX = 0x5;
-  static const int YYXY = 0x45;
-  static const int YYXZ = 0x85;
-  static const int YYXW = 0xC5;
-  static const int YYYX = 0x15;
-  static const int YYYY = 0x55;
-  static const int YYYZ = 0x95;
-  static const int YYYW = 0xD5;
-  static const int YYZX = 0x25;
-  static const int YYZY = 0x65;
-  static const int YYZZ = 0xA5;
-  static const int YYZW = 0xE5;
-  static const int YYWX = 0x35;
-  static const int YYWY = 0x75;
-  static const int YYWZ = 0xB5;
-  static const int YYWW = 0xF5;
-  static const int YZXX = 0x9;
-  static const int YZXY = 0x49;
-  static const int YZXZ = 0x89;
-  static const int YZXW = 0xC9;
-  static const int YZYX = 0x19;
-  static const int YZYY = 0x59;
-  static const int YZYZ = 0x99;
-  static const int YZYW = 0xD9;
-  static const int YZZX = 0x29;
-  static const int YZZY = 0x69;
-  static const int YZZZ = 0xA9;
-  static const int YZZW = 0xE9;
-  static const int YZWX = 0x39;
-  static const int YZWY = 0x79;
-  static const int YZWZ = 0xB9;
-  static const int YZWW = 0xF9;
-  static const int YWXX = 0xD;
-  static const int YWXY = 0x4D;
-  static const int YWXZ = 0x8D;
-  static const int YWXW = 0xCD;
-  static const int YWYX = 0x1D;
-  static const int YWYY = 0x5D;
-  static const int YWYZ = 0x9D;
-  static const int YWYW = 0xDD;
-  static const int YWZX = 0x2D;
-  static const int YWZY = 0x6D;
-  static const int YWZZ = 0xAD;
-  static const int YWZW = 0xED;
-  static const int YWWX = 0x3D;
-  static const int YWWY = 0x7D;
-  static const int YWWZ = 0xBD;
-  static const int YWWW = 0xFD;
-  static const int ZXXX = 0x2;
-  static const int ZXXY = 0x42;
-  static const int ZXXZ = 0x82;
-  static const int ZXXW = 0xC2;
-  static const int ZXYX = 0x12;
-  static const int ZXYY = 0x52;
-  static const int ZXYZ = 0x92;
-  static const int ZXYW = 0xD2;
-  static const int ZXZX = 0x22;
-  static const int ZXZY = 0x62;
-  static const int ZXZZ = 0xA2;
-  static const int ZXZW = 0xE2;
-  static const int ZXWX = 0x32;
-  static const int ZXWY = 0x72;
-  static const int ZXWZ = 0xB2;
-  static const int ZXWW = 0xF2;
-  static const int ZYXX = 0x6;
-  static const int ZYXY = 0x46;
-  static const int ZYXZ = 0x86;
-  static const int ZYXW = 0xC6;
-  static const int ZYYX = 0x16;
-  static const int ZYYY = 0x56;
-  static const int ZYYZ = 0x96;
-  static const int ZYYW = 0xD6;
-  static const int ZYZX = 0x26;
-  static const int ZYZY = 0x66;
-  static const int ZYZZ = 0xA6;
-  static const int ZYZW = 0xE6;
-  static const int ZYWX = 0x36;
-  static const int ZYWY = 0x76;
-  static const int ZYWZ = 0xB6;
-  static const int ZYWW = 0xF6;
-  static const int ZZXX = 0xA;
-  static const int ZZXY = 0x4A;
-  static const int ZZXZ = 0x8A;
-  static const int ZZXW = 0xCA;
-  static const int ZZYX = 0x1A;
-  static const int ZZYY = 0x5A;
-  static const int ZZYZ = 0x9A;
-  static const int ZZYW = 0xDA;
-  static const int ZZZX = 0x2A;
-  static const int ZZZY = 0x6A;
-  static const int ZZZZ = 0xAA;
-  static const int ZZZW = 0xEA;
-  static const int ZZWX = 0x3A;
-  static const int ZZWY = 0x7A;
-  static const int ZZWZ = 0xBA;
-  static const int ZZWW = 0xFA;
-  static const int ZWXX = 0xE;
-  static const int ZWXY = 0x4E;
-  static const int ZWXZ = 0x8E;
-  static const int ZWXW = 0xCE;
-  static const int ZWYX = 0x1E;
-  static const int ZWYY = 0x5E;
-  static const int ZWYZ = 0x9E;
-  static const int ZWYW = 0xDE;
-  static const int ZWZX = 0x2E;
-  static const int ZWZY = 0x6E;
-  static const int ZWZZ = 0xAE;
-  static const int ZWZW = 0xEE;
-  static const int ZWWX = 0x3E;
-  static const int ZWWY = 0x7E;
-  static const int ZWWZ = 0xBE;
-  static const int ZWWW = 0xFE;
-  static const int WXXX = 0x3;
-  static const int WXXY = 0x43;
-  static const int WXXZ = 0x83;
-  static const int WXXW = 0xC3;
-  static const int WXYX = 0x13;
-  static const int WXYY = 0x53;
-  static const int WXYZ = 0x93;
-  static const int WXYW = 0xD3;
-  static const int WXZX = 0x23;
-  static const int WXZY = 0x63;
-  static const int WXZZ = 0xA3;
-  static const int WXZW = 0xE3;
-  static const int WXWX = 0x33;
-  static const int WXWY = 0x73;
-  static const int WXWZ = 0xB3;
-  static const int WXWW = 0xF3;
-  static const int WYXX = 0x7;
-  static const int WYXY = 0x47;
-  static const int WYXZ = 0x87;
-  static const int WYXW = 0xC7;
-  static const int WYYX = 0x17;
-  static const int WYYY = 0x57;
-  static const int WYYZ = 0x97;
-  static const int WYYW = 0xD7;
-  static const int WYZX = 0x27;
-  static const int WYZY = 0x67;
-  static const int WYZZ = 0xA7;
-  static const int WYZW = 0xE7;
-  static const int WYWX = 0x37;
-  static const int WYWY = 0x77;
-  static const int WYWZ = 0xB7;
-  static const int WYWW = 0xF7;
-  static const int WZXX = 0xB;
-  static const int WZXY = 0x4B;
-  static const int WZXZ = 0x8B;
-  static const int WZXW = 0xCB;
-  static const int WZYX = 0x1B;
-  static const int WZYY = 0x5B;
-  static const int WZYZ = 0x9B;
-  static const int WZYW = 0xDB;
-  static const int WZZX = 0x2B;
-  static const int WZZY = 0x6B;
-  static const int WZZZ = 0xAB;
-  static const int WZZW = 0xEB;
-  static const int WZWX = 0x3B;
-  static const int WZWY = 0x7B;
-  static const int WZWZ = 0xBB;
-  static const int WZWW = 0xFB;
-  static const int WWXX = 0xF;
-  static const int WWXY = 0x4F;
-  static const int WWXZ = 0x8F;
-  static const int WWXW = 0xCF;
-  static const int WWYX = 0x1F;
-  static const int WWYY = 0x5F;
-  static const int WWYZ = 0x9F;
-  static const int WWYW = 0xDF;
-  static const int WWZX = 0x2F;
-  static const int WWZY = 0x6F;
-  static const int WWZZ = 0xAF;
-  static const int WWZW = 0xEF;
-  static const int WWWX = 0x3F;
-  static const int WWWY = 0x7F;
-  static const int WWWZ = 0xBF;
-  static const int WWWW = 0xFF;
-
-}
-
-
-class Float64x2 {
-  factory Float64x2(double x, double y) native "Float64x2_fromDoubles";
-  factory Float64x2.splat(double v) native "Float64x2_splat";
-  factory Float64x2.zero() native "Float64x2_zero";
-  factory Float64x2.fromFloat32x4(Float32x4 v) native "Float64x2_fromFloat32x4";
-
-  Float64x2 operator +(Float64x2 other) {
-    return _add(other);
-  }
-  Float64x2 _add(Float64x2 other) native "Float64x2_add";
-  Float64x2 operator -() {
-    return _negate();
-  }
-  Float64x2 _negate() native "Float64x2_negate";
-  Float64x2 operator -(Float64x2 other) {
-    return _sub(other);
-  }
-  Float64x2 _sub(Float64x2 other) native "Float64x2_sub";
-  Float64x2 operator *(Float64x2 other) {
-    return _mul(other);
-  }
-  Float64x2 _mul(Float64x2 other) native "Float64x2_mul";
-  Float64x2 operator /(Float64x2 other) {
-    return _div(other);
-  }
-  Float64x2 _div(Float64x2 other) native "Float64x2_div";
-
-
-  /// Returns a copy of [this] each lane being scaled by [s].
-  Float64x2 scale(double s) native "Float64x2_scale";
-  /// Returns the absolute value of this [Float64x2].
-  Float64x2 abs() native "Float64x2_abs";
-
-  /// Clamps [this] to be in the range [lowerLimit]-[upperLimit].
-  Float64x2 clamp(Float64x2 lowerLimit,
-                  Float64x2 upperLimit) native "Float64x2_clamp";
-
-  /// Extracted x value.
-  double get x native "Float64x2_getX";
-  /// Extracted y value.
-  double get y native "Float64x2_getY";
-
-  /// Extract the sign bits from each lane return them in the first 2 bits.
-  int get signMask native "Float64x2_getSignMask";
-
-  /// Returns a new [Float64x2] copied from [this] with a new x value.
-  Float64x2 withX(double x) native "Float64x2_setX";
-  /// Returns a new [Float64x2] copied from [this] with a new y value.
-  Float64x2 withY(double y) native "Float64x2_setY";
-
-  /// Returns the lane-wise minimum value in [this] or [other].
-  Float64x2 min(Float64x2 other) native "Float64x2_min";
-
-  /// Returns the lane-wise maximum value in [this] or [other].
-  Float64x2 max(Float64x2 other) native "Float64x2_max";
-
-  /// Returns the lane-wise square root of [this].
-  Float64x2 sqrt() native "Float64x2_sqrt";
-}
-
-
-
-class _TypedListIterator<E> implements Iterator<E> {
-  final List<E> _array;
-  final int _length;
-  int _position;
-  E _current;
-
-  _TypedListIterator(List array)
-      : _array = array, _length = array.length, _position = -1 {
-    assert(array is _TypedList || array is _TypedListView);
-  }
-
-  bool moveNext() {
-    int nextPosition = _position + 1;
-    if (nextPosition < _length) {
-      _current = _array[nextPosition];
-      _position = nextPosition;
-      return true;
-    }
-    _position = _length;
-    _current = null;
-    return false;
-  }
-
-  E get current => _current;
-}
-
-
-class _TypedListView extends _TypedListBase implements TypedData {
-  _TypedListView(ByteBuffer _buffer, int _offset, int _length)
-    : _typedData = _buffer._data,
-      offsetInBytes = _offset,
-      length = _length {
-  }
-
-  // Method(s) implementing the TypedData interface.
-
-  int get lengthInBytes {
-    return length * elementSizeInBytes;
-  }
-
-  ByteBuffer get buffer {
-    return _typedData.buffer;
-  }
-
-  final _TypedList _typedData;
-  final int offsetInBytes;
-  final int length;
-}
-
-
-class _Int8ArrayView extends _TypedListView with _IntListMixin implements Int8List {
-  // Constructor.
-  _Int8ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Int8List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                _offsetInBytes,
-                length * Int8List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getInt8(offsetInBytes +
-                               (index * Int8List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setInt8(offsetInBytes + (index * Int8List.BYTES_PER_ELEMENT),
-                        _toInt8(value));
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int8List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int8List _createList(int length) {
-    return new Int8List(length);
-  }
-}
-
-
-class _Uint8ArrayView extends _TypedListView with _IntListMixin implements Uint8List {
-  // Constructor.
-  _Uint8ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Uint8List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                _offsetInBytes,
-                length * Uint8List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getUint8(offsetInBytes +
-                                (index * Uint8List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setUint8(offsetInBytes + (index * Uint8List.BYTES_PER_ELEMENT),
-                         _toUint8(value));
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint8List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint8List _createList(int length) {
-    return new Uint8List(length);
-  }
-}
-
-
-class _Uint8ClampedArrayView extends _TypedListView with _IntListMixin implements Uint8ClampedList {
-  // Constructor.
-  _Uint8ClampedArrayView(ByteBuffer buffer,
-                         [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Uint8List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Uint8List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getUint8(offsetInBytes +
-                                (index * Uint8List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setUint8(offsetInBytes + (index * Uint8List.BYTES_PER_ELEMENT),
-                         _toClampedUint8(value));
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint8List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint8ClampedList _createList(int length) {
-    return new Uint8ClampedList(length);
-  }
-}
-
-
-class _Int16ArrayView extends _TypedListView with _IntListMixin implements Int16List {
-  // Constructor.
-  _Int16ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Int16List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Int16List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Int16List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getInt16(offsetInBytes +
-                                (index * Int16List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setInt16(offsetInBytes + (index * Int16List.BYTES_PER_ELEMENT),
-                         _toInt16(value));
-  }
-
-  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
-    if (iterable is CodeUnits) {
-      end = RangeError.checkValidRange(start, end, this.length);
-      int length = end - start;
-      int byteStart = this.offsetInBytes + start * Int16List.BYTES_PER_ELEMENT;
-      _typedData._setCodeUnits(iterable, byteStart, length, skipCount);
-    } else {
-      super.setRange(start, end, iterable, skipCount);
-    }
-  }
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int16List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int16List _createList(int length) {
-    return new Int16List(length);
-  }
-}
-
-
-class _Uint16ArrayView extends _TypedListView with _IntListMixin implements Uint16List {
-  // Constructor.
-  _Uint16ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Uint16List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Uint16List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Uint16List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getUint16(offsetInBytes +
-                                 (index * Uint16List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setUint16(offsetInBytes + (index * Uint16List.BYTES_PER_ELEMENT),
-                          _toUint16(value));
-  }
-
-  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
-    if (iterable is CodeUnits) {
-      end = RangeError.checkValidRange(start, end, this.length);
-      int length = end - start;
-      int byteStart = this.offsetInBytes + start * Uint16List.BYTES_PER_ELEMENT;
-      _typedData._setCodeUnits(iterable, byteStart, length, skipCount);
-    } else {
-      super.setRange(start, end, iterable, skipCount);
-    }
-  }
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint16List.BYTES_PER_ELEMENT;
-  }
-
-  // Internal utility methods.
-
-  Uint16List _createList(int length) {
-    return new Uint16List(length);
-  }
-}
-
-
-class _Int32ArrayView extends _TypedListView with _IntListMixin implements Int32List {
-  // Constructor.
-  _Int32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Int32List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Int32List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Int32List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getInt32(offsetInBytes +
-                                (index * Int32List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setInt32(offsetInBytes + (index * Int32List.BYTES_PER_ELEMENT),
-                         _toInt32(value));
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int32List _createList(int length) {
-    return new Int32List(length);
-  }
-}
-
-
-class _Uint32ArrayView extends _TypedListView with _IntListMixin implements Uint32List {
-  // Constructor.
-  _Uint32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Uint32List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Uint32List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Uint32List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getUint32(offsetInBytes +
-                                 (index * Uint32List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setUint32(offsetInBytes + (index * Uint32List.BYTES_PER_ELEMENT),
-                          _toUint32(value));
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint32List _createList(int length) {
-    return new Uint32List(length);
-  }
-}
-
-
-class _Int64ArrayView extends _TypedListView with _IntListMixin implements Int64List {
-  // Constructor.
-  _Int64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Int64List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Int64List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Int64List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getInt64(offsetInBytes +
-                                (index * Int64List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setInt64(offsetInBytes + (index * Int64List.BYTES_PER_ELEMENT),
-                         _toInt64(value));
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int64List _createList(int length) {
-    return new Int64List(length);
-  }
-}
-
-
-class _Uint64ArrayView extends _TypedListView with _IntListMixin implements Uint64List {
-  // Constructor.
-  _Uint64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Uint64List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Uint64List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Uint64List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  int operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getUint64(offsetInBytes +
-                                 (index * Uint64List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, int value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setUint64(offsetInBytes + (index * Uint64List.BYTES_PER_ELEMENT),
-                          _toUint64(value));
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Uint64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Uint64List _createList(int length) {
-    return new Uint64List(length);
-  }
-}
-
-
-class _Float32ArrayView extends _TypedListView with _DoubleListMixin implements Float32List {
-  // Constructor.
-  _Float32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Float32List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Float32List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Float32List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  double operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getFloat32(offsetInBytes +
-                                  (index * Float32List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, double value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setFloat32(offsetInBytes +
-                           (index * Float32List.BYTES_PER_ELEMENT), value);
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Float32List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float32List _createList(int length) {
-    return new Float32List(length);
-  }
-}
-
-
-class _Float64ArrayView extends _TypedListView with _DoubleListMixin implements Float64List {
-  // Constructor.
-  _Float64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Float64List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Float64List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Float64List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  double operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getFloat64(offsetInBytes +
-                                  (index * Float64List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, double value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setFloat64(offsetInBytes +
-                          (index * Float64List.BYTES_PER_ELEMENT), value);
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Float64List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float64List _createList(int length) {
-    return new Float64List(length);
-  }
-}
-
-
-class _Float32x4ArrayView extends _TypedListView with _Float32x4ListMixin implements Float32x4List {
-  // Constructor.
-  _Float32x4ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Float32x4List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Float32x4List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Float32x4List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  Float32x4 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getFloat32x4(offsetInBytes +
-                                  (index * Float32x4List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, Float32x4 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setFloat32x4(offsetInBytes +
-                             (index * Float32x4List.BYTES_PER_ELEMENT), value);
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Float32x4List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float32x4List _createList(int length) {
-    return new Float32x4List(length);
-  }
-}
-
-
-class _Int32x4ArrayView extends _TypedListView with _Int32x4ListMixin implements Int32x4List {
-  // Constructor.
-  _Int32x4ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Int32x4List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Int32x4List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Int32x4List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  Int32x4 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getInt32x4(offsetInBytes +
-                                   (index * Int32x4List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, Int32x4 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setInt32x4(offsetInBytes +
-                            (index * Int32x4List.BYTES_PER_ELEMENT), value);
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Int32x4List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Int32x4List _createList(int length) {
-    return new Int32x4List(length);
-  }
-}
-
-
-class _Float64x2ArrayView extends _TypedListView with _Float64x2ListMixin implements Float64x2List {
-  // Constructor.
-  _Float64x2ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-    : super(buffer, _offsetInBytes,
-            _defaultIfNull(_length,
-                           ((buffer.lengthInBytes - _offsetInBytes) ~/
-                            Float64x2List.BYTES_PER_ELEMENT))) {
-    _rangeCheck(buffer.lengthInBytes,
-                offsetInBytes,
-                length * Float64x2List.BYTES_PER_ELEMENT);
-    _offsetAlignmentCheck(_offsetInBytes, Float64x2List.BYTES_PER_ELEMENT);
-  }
-
-
-  // Method(s) implementing List interface.
-
-  Float64x2 operator[](int index) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _typedData._getFloat64x2(offsetInBytes +
-                                    (index * Float64x2List.BYTES_PER_ELEMENT));
-  }
-
-  void operator[]=(int index, Float64x2 value) {
-    if (index < 0 || index >= length) {
-      throw new RangeError.index(index, this, "index");
-    }
-    _typedData._setFloat64x2(offsetInBytes +
-                             (index * Float64x2List.BYTES_PER_ELEMENT), value);
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  int get elementSizeInBytes {
-    return Float64x2List.BYTES_PER_ELEMENT;
-  }
-
-
-  // Internal utility methods.
-
-  Float64x2List _createList(int length) {
-    return new Float64x2List(length);
-  }
-}
-
-
-class _ByteDataView implements ByteData {
-  _ByteDataView(TypedData typedData, int _offsetInBytes, int _lengthInBytes)
-    : _typedData = typedData,
-      _offset = _offsetInBytes,
-      length = _lengthInBytes {
-    _rangeCheck(_typedData.lengthInBytes, _offset, length);
-  }
-
-
-  // Method(s) implementing TypedData interface.
-
-  ByteBuffer get buffer {
-    return _typedData.buffer;
-  }
-
-  int get lengthInBytes {
-    return length;
-  }
-
-  int get offsetInBytes {
-    return _offset;
-  }
-
-  int get elementSizeInBytes {
-    return 1;
-  }
-
-  // Method(s) implementing ByteData interface.
-
-  int getInt8(int byteOffset) {
-    if (byteOffset < 0 || byteOffset >= length) {
-      throw new RangeError.index(byteOffset, this, "byteOffset");
-    }
-    return _typedData._getInt8(_offset + byteOffset);
-  }
-  void setInt8(int byteOffset, int value) {
-    if (byteOffset < 0 || byteOffset >= length) {
-      throw new RangeError.index(byteOffset, this, "byteOffset");
-    }
-    _typedData._setInt8(_offset + byteOffset, value);
-  }
-
-  int getUint8(int byteOffset) {
-    if (byteOffset < 0 || byteOffset >= length) {
-      throw new RangeError.index(byteOffset, this, "byteOffset");
-    }
-    return _typedData._getUint8(_offset + byteOffset);
-  }
-  void setUint8(int byteOffset, int value) {
-    if (byteOffset < 0 || byteOffset >= length) {
-      throw new RangeError.index(byteOffset, this, "byteOffset");
-    }
-    _typedData._setUint8(_offset + byteOffset, value);
-  }
-
-  int getInt16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 1 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
-    }
-    var result = _typedData._getInt16(_offset + byteOffset);
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      return result;
-    }
-    return _byteSwap16(result).toSigned(16);
-  }
-  void setInt16(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 1 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
-    }
-    _typedData._setInt16(_offset + byteOffset,
-        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap16(value));
-  }
-
-  int getUint16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 1 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
-    }
-    var result = _typedData._getUint16(_offset + byteOffset);
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      return result;
-    }
-    return _byteSwap16(result);
-  }
-  void setUint16(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 1 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
-    }
-    _typedData._setUint16(_offset + byteOffset,
-        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap16(value));
-  }
-
-  int getInt32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 3 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
-    }
-    var result = _typedData._getInt32(_offset + byteOffset);
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      return result;
-    }
-    return _byteSwap32(result).toSigned(32);
-  }
-  void setInt32(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 3 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
-    }
-    _typedData._setInt32(_offset + byteOffset,
-        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap32(value));
-  }
-
-  int getUint32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 3 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
-    }
-    var result = _typedData._getUint32(_offset + byteOffset);
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      return result;
-    }
-    return _byteSwap32(result);
-  }
-  void setUint32(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 3 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
-    }
-    _typedData._setUint32(_offset + byteOffset,
-        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap32(value));
-  }
-
-  int getInt64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 7 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
-    }
-    var result = _typedData._getInt64(_offset + byteOffset);
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      return result;
-    }
-    return _byteSwap64(result).toSigned(64);
-  }
-  void setInt64(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 7 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
-    }
-    _typedData._setInt64(_offset + byteOffset,
-        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value));
-  }
-
-  int getUint64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 7 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
-    }
-    var result = _typedData._getUint64(_offset + byteOffset);
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      return result;
-    }
-    return _byteSwap64(result);
-  }
-  void setUint64(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 7 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
-    }
-    _typedData._setUint64(_offset + byteOffset,
-        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value));
-  }
-
-  double getFloat32(int byteOffset,
-                    [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 3 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
-    }
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      return _typedData._getFloat32(_offset + byteOffset);
-    }
-    _convU32[0] = _byteSwap32(_typedData._getUint32(_offset + byteOffset));
-    return _convF32[0];
-  }
-  void setFloat32(int byteOffset,
-                  double value,
-                  [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 3 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
-    }
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      _typedData._setFloat32(_offset + byteOffset, value);
-      return;
-    }
-    _convF32[0] = value;
-    _typedData._setUint32(_offset + byteOffset, _byteSwap32(_convU32[0]));
-  }
-
-  double getFloat64(int byteOffset,
-                    [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 7 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
-    }
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      return _typedData._getFloat64(_offset + byteOffset);
-    }
-    _convU64[0] = _byteSwap64(_typedData._getUint64(_offset + byteOffset));
-    return _convF64[0];
-  }
-  void setFloat64(int byteOffset,
-                  double value,
-                  [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 7 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
-    }
-    if (identical(endian, Endianness.HOST_ENDIAN)) {
-      _typedData._setFloat64(_offset + byteOffset, value);
-      return;
-    }
-    _convF64[0] = value;
-    _typedData._setUint64(_offset + byteOffset, _byteSwap64(_convU64[0]));
-  }
-
-  Float32x4 getFloat32x4(int byteOffset,
-                         [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 3 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
-    }
-    // TODO(johnmccutchan) : Need to resolve this for endianity.
-    return _typedData._getFloat32x4(_offset + byteOffset);
-  }
-  void setFloat32x4(int byteOffset,
-                    Float32x4 value,
-                    [Endianness endian = Endianness.BIG_ENDIAN]) {
-    if (byteOffset < 0 || byteOffset + 3 >= length) {
-      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
-    }
-    // TODO(johnmccutchan) : Need to resolve this for endianity.
-    _typedData._setFloat32x4(_offset + byteOffset, value);
-
-  }
-
-  final TypedData _typedData;
-  final int _offset;
-  final int length;
-}
-
-int _byteSwap16(int value) {
-  return ((value & 0xFF00) >> 8) |
-         ((value & 0x00FF) << 8);
-}
-
-int _byteSwap32(int value) {
-  value = ((value & 0xFF00FF00) >> 8)  | ((value & 0x00FF00FF) << 8);
-  value = ((value & 0xFFFF0000) >> 16) | ((value & 0x0000FFFF) << 16);
-  return value;
-}
-
-int _byteSwap64(int value) {
-  return (_byteSwap32(value) << 32) | _byteSwap32(value >> 32);
-}
-
-final _convU32 = new Uint32List(2);
-final _convU64 = new Uint64List.view(_convU32.buffer);
-final _convF32 = new Float32List.view(_convU32.buffer);
-final _convF64 = new Float64List.view(_convU32.buffer);
-
-// Top level utility methods.
-int _toInt(int value, int mask) {
-  value &= mask;
-  if (value > (mask >> 1)) value -= mask + 1;
-  return value;
-}
-
-
-int _toInt8(int value) {
-  return _toInt(value, 0xFF);
-}
-
-
-int _toUint8(int value) {
-  return value & 0xFF;
-}
-
-
-int _toClampedUint8(int value) {
-  if (value < 0) return 0;
-  if (value > 0xFF) return 0xFF;
-  return value;
-}
-
-
-int _toInt16(int value) {
-  return _toInt(value, 0xFFFF);
-}
-
-
-int _toUint16(int value) {
-  return value & 0xFFFF;
-}
-
-
-int _toInt32(int value) {
-  return _toInt(value, 0xFFFFFFFF);
-}
-
-
-int _toUint32(int value) {
-  return value & 0xFFFFFFFF;
-}
-
-
-int _toInt64(int value) {
-  // Avoid bigint mask when possible.
-  return (ClassID.getID(value) == ClassID.cidBigint) ?
-      _toInt(value, 0xFFFFFFFFFFFFFFFF) : value;
-}
-
-
-int _toUint64(int value) {
-  // Avoid bigint mask when possible.
-  return (ClassID.getID(value) == ClassID.cidBigint) ?
-      _toInt(value, 0xFFFFFFFFFFFFFFFF) : value;
-}
-
-
-void _rangeCheck(int listLength, int start, int length) {
-  if (length < 0) {
-    throw new RangeError.value(length);
-  }
-  if (start < 0) {
-    throw new RangeError.value(start);
-  }
-  if (start + length > listLength) {
-    throw new RangeError.value(start + length);
-  }
-}
-
-
-void _offsetAlignmentCheck(int offset, int alignment) {
-  if ((offset % alignment) != 0) {
-    throw new RangeError('Offset ($offset) must be a multiple of '
-                         'BYTES_PER_ELEMENT ($alignment)');
-  }
-}
-
-
-int _defaultIfNull(object, value) {
-  if (object == null) {
-    return value;
-  }
-  return object;
-}
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
new file mode 100644
index 0000000..6ad50f3
--- /dev/null
+++ b/runtime/lib/typed_data_patch.dart
@@ -0,0 +1,3098 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:_internal";
+import "dart:collection" show ListBase;
+import 'dart:math' show Random;
+
+@patch
+class ByteData implements TypedData {
+  @patch
+  factory ByteData(int length) {
+    var list = new Uint8List(length);
+    return new _ByteDataView(list, 0, length);
+  }
+
+  // Called directly from C code.
+  factory ByteData._view(TypedData typedData, int offsetInBytes, int length) {
+    return new _ByteDataView(typedData, offsetInBytes, length);
+  }
+}
+
+// Based class for _TypedList that provides common methods for implementing
+// the collection and list interfaces.
+// This class does not extend ListBase<T> since that would add type arguments
+// to instances of _TypeListBase. Instead the subclasses use type specific
+// mixins (like _IntListMixin, _DoubleListMixin) to implement ListBase<T>.
+abstract class _TypedListBase {
+  // Method(s) implementing the Collection interface.
+  bool contains(element) {
+    var len = this.length;
+    for (var i = 0; i < len; ++i) {
+      if (this[i] == element) return true;
+    }
+    return false;
+  }
+
+  void forEach(void f(element)) {
+    var len = this.length;
+    for (var i = 0; i < len; i++) {
+      f(this[i]);
+    }
+  }
+
+  String join([String separator = ""]) {
+    StringBuffer buffer = new StringBuffer();
+    buffer.writeAll(this, separator);
+    return buffer.toString();
+  }
+
+  dynamic reduce(dynamic combine(value, element)) {
+    var len = this.length;
+    if (len == 0) throw IterableElementError.noElement();
+    var i = 0;
+    var value = this[0];
+    for (var i = 1; i < len; ++i) {
+      value = combine(value, this[i]);
+    }
+    return value;
+  }
+
+  dynamic fold(
+      dynamic initialValue, dynamic combine(dynamic initialValue, element)) {
+    var len = this.length;
+    for (var i = 0; i < len; ++i) {
+      initialValue = combine(initialValue, this[i]);
+    }
+    return initialValue;
+  }
+
+  Iterable map(f(element)) => new MappedIterable(this, f);
+
+  Iterable expand(Iterable f(element)) => new ExpandIterable(this, f);
+
+  bool every(bool f(element)) {
+    var len = this.length;
+    for (var i = 0; i < len; ++i) {
+      if (!f(this[i])) return false;
+    }
+    return true;
+  }
+
+  bool any(bool f(element)) {
+    var len = this.length;
+    for (var i = 0; i < len; ++i) {
+      if (f(this[i])) return true;
+    }
+    return false;
+  }
+
+  dynamic firstWhere(bool test(element), {orElse()}) {
+    var len = this.length;
+    for (var i = 0; i < len; ++i) {
+      var element = this[i];
+      if (test(element)) return element;
+    }
+    if (orElse != null) return orElse();
+    throw IterableElementError.noElement();
+  }
+
+  dynamic lastWhere(bool test(element), {orElse()}) {
+    var result = null;
+    var len = this.length;
+    for (var i = len - 1; i >= 0; --i) {
+      var element = this[i];
+      if (test(element)) {
+        return element;
+      }
+    }
+    if (orElse != null) return orElse();
+    throw IterableElementError.noElement();
+  }
+
+  dynamic singleWhere(bool test(element)) {
+    var result = null;
+    bool foundMatching = false;
+    var len = this.length;
+    for (var i = 0; i < len; ++i) {
+      var element = this[i];
+      if (test(element)) {
+        if (foundMatching) {
+          throw IterableElementError.tooMany();
+        }
+        result = element;
+        foundMatching = true;
+      }
+    }
+    if (foundMatching) return result;
+    throw IterableElementError.noElement();
+  }
+
+  dynamic elementAt(int index) {
+    return this[index];
+  }
+
+  bool get isEmpty {
+    return this.length == 0;
+  }
+
+  bool get isNotEmpty => !isEmpty;
+
+  // Method(s) implementing the List interface.
+
+  set length(newLength) {
+    throw new UnsupportedError("Cannot resize a fixed-length list");
+  }
+
+  void add(value) {
+    throw new UnsupportedError("Cannot add to a fixed-length list");
+  }
+
+  void addAll(Iterable value) {
+    throw new UnsupportedError("Cannot add to a fixed-length list");
+  }
+
+  void insert(int index, value) {
+    throw new UnsupportedError("Cannot insert into a fixed-length list");
+  }
+
+  void insertAll(int index, Iterable values) {
+    throw new UnsupportedError("Cannot insert into a fixed-length list");
+  }
+
+  void sort([int compare(a, b)]) {
+    if (compare == null) compare = Comparable.compare;
+    Sort.sort(this, compare);
+  }
+
+  void shuffle([Random random]) {
+    if (random == null) random = new Random();
+    var i = this.length;
+    while (i > 1) {
+      int pos = random.nextInt(i);
+      i -= 1;
+      var tmp = this[i];
+      this[i] = this[pos];
+      this[pos] = tmp;
+    }
+  }
+
+  int indexOf(element, [int start = 0]) {
+    return Lists.indexOf(this, element, start, this.length);
+  }
+
+  int lastIndexOf(element, [int start = null]) {
+    if (start == null) start = this.length - 1;
+    return Lists.lastIndexOf(this, element, start);
+  }
+
+  void clear() {
+    throw new UnsupportedError("Cannot remove from a fixed-length list");
+  }
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot remove from a fixed-length list");
+  }
+
+  bool remove(Object element) {
+    throw new UnsupportedError("Cannot remove from a fixed-length list");
+  }
+
+  bool removeAt(int index) {
+    throw new UnsupportedError("Cannot remove from a fixed-length list");
+  }
+
+  void removeWhere(bool test(element)) {
+    throw new UnsupportedError("Cannot remove from a fixed-length list");
+  }
+
+  void retainWhere(bool test(element)) {
+    throw new UnsupportedError("Cannot remove from a fixed-length list");
+  }
+
+  dynamic get first {
+    if (length > 0) return this[0];
+    throw IterableElementError.noElement();
+  }
+
+  dynamic get last {
+    if (length > 0) return this[length - 1];
+    throw IterableElementError.noElement();
+  }
+
+  dynamic get single {
+    if (length == 1) return this[0];
+    if (length == 0) throw IterableElementError.noElement();
+    throw IterableElementError.tooMany();
+  }
+
+  void removeRange(int start, int end) {
+    throw new UnsupportedError("Cannot remove from a fixed-length list");
+  }
+
+  void replaceRange(int start, int end, Iterable iterable) {
+    throw new UnsupportedError("Cannot remove from a fixed-length list");
+  }
+
+  List toList({bool growable: true}) {
+    return new List.from(this, growable: growable);
+  }
+
+  Set toSet() {
+    return new Set.from(this);
+  }
+
+  List sublist(int start, [int end]) {
+    end = RangeError.checkValidRange(start, end, this.length);
+    var length = end - start;
+    List result = _createList(length);
+    result.setRange(0, length, this, start);
+    return result;
+  }
+
+  void setRange(int start, int end, Iterable from, [int skipCount = 0]) {
+    // Check ranges.
+    if (0 > start || start > end || end > length) {
+      RangeError.checkValidRange(start, end, length); // Always throws.
+      assert(false);
+    }
+    if (skipCount < 0) {
+      throw new ArgumentError(skipCount);
+    }
+
+    final count = end - start;
+    if ((from.length - skipCount) < count) {
+      throw IterableElementError.tooFew();
+    }
+
+    if (from is _TypedListBase) {
+      if (this.elementSizeInBytes == from.elementSizeInBytes) {
+        if ((count < 10) && (from.buffer != this.buffer)) {
+          Lists.copy(from, skipCount, this, start, count);
+          return;
+        } else if (this.buffer._data._setRange(
+            start * elementSizeInBytes + this.offsetInBytes,
+            count * elementSizeInBytes,
+            from.buffer._data,
+            skipCount * elementSizeInBytes + from.offsetInBytes,
+            ClassID.getID(this),
+            ClassID.getID(from))) {
+          return;
+        }
+      } else if (from.buffer == this.buffer) {
+        // Different element sizes, but same buffer means that we need
+        // an intermediate structure.
+        // TODO(srdjan): Optimize to skip copying if the range does not overlap.
+        final temp_buffer = new List(count);
+        for (var i = 0; i < count; i++) {
+          temp_buffer[i] = from[skipCount + i];
+        }
+        for (var i = start; i < end; i++) {
+          this[i] = temp_buffer[i - start];
+        }
+        return;
+      }
+    }
+
+    if (count == 0) return;
+    List otherList;
+    int otherStart;
+    if (from is List) {
+      otherList = from;
+      otherStart = skipCount;
+    } else {
+      otherList = from.skip(skipCount).toList(growable: false);
+      otherStart = 0;
+    }
+    if (otherStart + count > otherList.length) {
+      throw IterableElementError.tooFew();
+    }
+    Lists.copy(otherList, otherStart, this, start, count);
+  }
+
+  void setAll(int index, Iterable iterable) {
+    final end = iterable.length + index;
+    setRange(index, end, iterable);
+  }
+
+  void fillRange(int start, int end, [fillValue]) {
+    RangeError.checkValidRange(start, end, this.length);
+    for (var i = start; i < end; ++i) {
+      this[i] = fillValue;
+    }
+  }
+
+  // Method(s) implementing Object interface.
+  String toString() => ListBase.listToString(this);
+
+  // Internal utility methods.
+
+  // Returns true if operation succeeds.
+  // 'fromCid' and 'toCid' may be cid-s of the views and therefore may not
+  // match the cids of 'this' and 'from'.
+  // Uses toCid and fromCid to decide if clamping is necessary.
+  // Element size of toCid and fromCid must match (test at caller).
+  bool _setRange(int startInBytes, int lengthInBytes, _TypedListBase from,
+      int startFromInBytes, int toCid, int fromCid) native "TypedData_setRange";
+}
+
+class _IntListMixin {
+  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+
+  Iterable<int> take(int n) => new SubListIterable<int>(this, 0, n);
+
+  Iterable<int> takeWhile(bool test(int element)) =>
+      new TakeWhileIterable<int>(this, test);
+
+  Iterable<int> skip(int n) => new SubListIterable<int>(this, n, null);
+
+  Iterable<int> skipWhile(bool test(element)) =>
+      new SkipWhileIterable<int>(this, test);
+
+  Iterable<int> get reversed => new ReversedListIterable<int>(this);
+
+  Map<int, int> asMap() => new ListMapView<int>(this);
+
+  Iterable<int> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<int>(this, start, end);
+  }
+
+  Iterator<int> get iterator => new _TypedListIterator<int>(this);
+
+  List<int> toList({bool growable: true}) {
+    return new List<int>.from(this, growable: growable);
+  }
+
+  Set<int> toSet() {
+    return new Set<int>.from(this);
+  }
+}
+
+class _DoubleListMixin {
+  Iterable<double> where(bool f(int element)) =>
+      new WhereIterable<double>(this, f);
+
+  Iterable<double> take(int n) => new SubListIterable<double>(this, 0, n);
+
+  Iterable<double> takeWhile(bool test(int element)) =>
+      new TakeWhileIterable<double>(this, test);
+
+  Iterable<double> skip(int n) => new SubListIterable<double>(this, n, null);
+
+  Iterable<double> skipWhile(bool test(element)) =>
+      new SkipWhileIterable<double>(this, test);
+
+  Iterable<double> get reversed => new ReversedListIterable<double>(this);
+
+  Map<int, double> asMap() => new ListMapView<double>(this);
+
+  Iterable<double> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<double>(this, start, end);
+  }
+
+  Iterator<double> get iterator => new _TypedListIterator<double>(this);
+
+  List<double> toList({bool growable: true}) {
+    return new List<double>.from(this, growable: growable);
+  }
+
+  Set<double> toSet() {
+    return new Set<double>.from(this);
+  }
+}
+
+class _Float32x4ListMixin {
+  Iterable<Float32x4> where(bool f(int element)) =>
+      new WhereIterable<Float32x4>(this, f);
+
+  Iterable<Float32x4> take(int n) => new SubListIterable<Float32x4>(this, 0, n);
+
+  Iterable<Float32x4> takeWhile(bool test(int element)) =>
+      new TakeWhileIterable<Float32x4>(this, test);
+
+  Iterable<Float32x4> skip(int n) =>
+      new SubListIterable<Float32x4>(this, n, null);
+
+  Iterable<Float32x4> skipWhile(bool test(element)) =>
+      new SkipWhileIterable<Float32x4>(this, test);
+
+  Iterable<Float32x4> get reversed => new ReversedListIterable<Float32x4>(this);
+
+  Map<int, Float32x4> asMap() => new ListMapView<Float32x4>(this);
+
+  Iterable<Float32x4> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<Float32x4>(this, start, end);
+  }
+
+  Iterator<Float32x4> get iterator => new _TypedListIterator<Float32x4>(this);
+
+  List<Float32x4> toList({bool growable: true}) {
+    return new List<Float32x4>.from(this, growable: growable);
+  }
+
+  Set<Float32x4> toSet() {
+    return new Set<Float32x4>.from(this);
+  }
+}
+
+class _Int32x4ListMixin {
+  Iterable<Int32x4> where(bool f(int element)) =>
+      new WhereIterable<Int32x4>(this, f);
+
+  Iterable<Int32x4> take(int n) => new SubListIterable<Int32x4>(this, 0, n);
+
+  Iterable<Int32x4> takeWhile(bool test(int element)) =>
+      new TakeWhileIterable<Int32x4>(this, test);
+
+  Iterable<Int32x4> skip(int n) => new SubListIterable<Int32x4>(this, n, null);
+
+  Iterable<Int32x4> skipWhile(bool test(element)) =>
+      new SkipWhileIterable<Int32x4>(this, test);
+
+  Iterable<Int32x4> get reversed => new ReversedListIterable<Int32x4>(this);
+
+  Map<int, Int32x4> asMap() => new ListMapView<Int32x4>(this);
+
+  Iterable<Int32x4> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<Int32x4>(this, start, end);
+  }
+
+  Iterator<Int32x4> get iterator => new _TypedListIterator<Int32x4>(this);
+
+  List<Int32x4> toList({bool growable: true}) {
+    return new List<Int32x4>.from(this, growable: growable);
+  }
+
+  Set<Int32x4> toSet() {
+    return new Set<Int32x4>.from(this);
+  }
+}
+
+class _Float64x2ListMixin {
+  Iterable<Float64x2> where(bool f(int element)) =>
+      new WhereIterable<Float64x2>(this, f);
+
+  Iterable<Float64x2> take(int n) => new SubListIterable<Float64x2>(this, 0, n);
+
+  Iterable<Float64x2> takeWhile(bool test(int element)) =>
+      new TakeWhileIterable<Float64x2>(this, test);
+
+  Iterable<Float64x2> skip(int n) =>
+      new SubListIterable<Float64x2>(this, n, null);
+
+  Iterable<Float64x2> skipWhile(bool test(element)) =>
+      new SkipWhileIterable<Float64x2>(this, test);
+
+  Iterable<Float64x2> get reversed => new ReversedListIterable<Float64x2>(this);
+
+  Map<int, Float64x2> asMap() => new ListMapView<Float64x2>(this);
+
+  Iterable<Float64x2> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<Float64x2>(this, start, end);
+  }
+
+  Iterator<Float64x2> get iterator => new _TypedListIterator<Float64x2>(this);
+
+  List<Float64x2> toList({bool growable: true}) {
+    return new List<Float64x2>.from(this, growable: growable);
+  }
+
+  Set<Float64x2> toSet() {
+    return new Set<Float64x2>.from(this);
+  }
+}
+
+class _ByteBuffer implements ByteBuffer {
+  final _TypedList _data;
+
+  _ByteBuffer(this._data);
+
+  factory _ByteBuffer._New(data) => new _ByteBuffer(data);
+
+  // Forward calls to _data.
+  int get lengthInBytes => _data.lengthInBytes;
+  int get hashCode => _data.hashCode;
+  bool operator ==(Object other) =>
+      (other is _ByteBuffer) && identical(_data, other._data);
+
+  ByteData asByteData([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = this.lengthInBytes - offsetInBytes;
+    }
+    return new _ByteDataView(this._data, offsetInBytes, length);
+  }
+
+  Int8List asInt8List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = this.lengthInBytes - offsetInBytes;
+    }
+    return new _Int8ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint8List asUint8List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = this.lengthInBytes - offsetInBytes;
+    }
+    return new _Uint8ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint8ClampedList asUint8ClampedList([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = this.lengthInBytes - offsetInBytes;
+    }
+    return new _Uint8ClampedArrayView(this, offsetInBytes, length);
+  }
+
+  Int16List asInt16List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Int16List.BYTES_PER_ELEMENT;
+    }
+    return new _Int16ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint16List asUint16List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Uint16List.BYTES_PER_ELEMENT;
+    }
+    return new _Uint16ArrayView(this, offsetInBytes, length);
+  }
+
+  Int32List asInt32List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Int32List.BYTES_PER_ELEMENT;
+    }
+    return new _Int32ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint32List asUint32List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Uint32List.BYTES_PER_ELEMENT;
+    }
+    return new _Uint32ArrayView(this, offsetInBytes, length);
+  }
+
+  Int64List asInt64List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Int64List.BYTES_PER_ELEMENT;
+    }
+    return new _Int64ArrayView(this, offsetInBytes, length);
+  }
+
+  Uint64List asUint64List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Uint64List.BYTES_PER_ELEMENT;
+    }
+    return new _Uint64ArrayView(this, offsetInBytes, length);
+  }
+
+  Float32List asFloat32List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Float32List.BYTES_PER_ELEMENT;
+    }
+    return new _Float32ArrayView(this, offsetInBytes, length);
+  }
+
+  Float64List asFloat64List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Float64List.BYTES_PER_ELEMENT;
+    }
+    return new _Float64ArrayView(this, offsetInBytes, length);
+  }
+
+  Float32x4List asFloat32x4List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+          Float32x4List.BYTES_PER_ELEMENT;
+    }
+    return new _Float32x4ArrayView(this, offsetInBytes, length);
+  }
+
+  Int32x4List asInt32x4List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length =
+          (this.lengthInBytes - offsetInBytes) ~/ Int32x4List.BYTES_PER_ELEMENT;
+    }
+    return new _Int32x4ArrayView(this, offsetInBytes, length);
+  }
+
+  Float64x2List asFloat64x2List([int offsetInBytes = 0, int length]) {
+    if (length == null) {
+      length = (this.lengthInBytes - offsetInBytes) ~/
+          Float64x2List.BYTES_PER_ELEMENT;
+    }
+    return new _Float64x2ArrayView(this, offsetInBytes, length);
+  }
+}
+
+abstract class _TypedList extends _TypedListBase {
+  // Default method implementing parts of the TypedData interface.
+  int get offsetInBytes {
+    return 0;
+  }
+
+  int get lengthInBytes {
+    return length * elementSizeInBytes;
+  }
+
+  _ByteBuffer get buffer => new _ByteBuffer(this);
+
+  // Methods implementing the collection interface.
+
+  int get length native "TypedData_length";
+
+  // Internal utility methods.
+
+  int _getInt8(int offsetInBytes) native "TypedData_GetInt8";
+  void _setInt8(int offsetInBytes, int value) native "TypedData_SetInt8";
+
+  int _getUint8(int offsetInBytes) native "TypedData_GetUint8";
+  void _setUint8(int offsetInBytes, int value) native "TypedData_SetUint8";
+
+  int _getInt16(int offsetInBytes) native "TypedData_GetInt16";
+  void _setInt16(int offsetInBytes, int value) native "TypedData_SetInt16";
+
+  int _getUint16(int offsetInBytes) native "TypedData_GetUint16";
+  void _setUint16(int offsetInBytes, int value) native "TypedData_SetUint16";
+
+  int _getInt32(int offsetInBytes) native "TypedData_GetInt32";
+  void _setInt32(int offsetInBytes, int value) native "TypedData_SetInt32";
+
+  int _getUint32(int offsetInBytes) native "TypedData_GetUint32";
+  void _setUint32(int offsetInBytes, int value) native "TypedData_SetUint32";
+
+  int _getInt64(int offsetInBytes) native "TypedData_GetInt64";
+  void _setInt64(int offsetInBytes, int value) native "TypedData_SetInt64";
+
+  int _getUint64(int offsetInBytes) native "TypedData_GetUint64";
+  void _setUint64(int offsetInBytes, int value) native "TypedData_SetUint64";
+
+  double _getFloat32(int offsetInBytes) native "TypedData_GetFloat32";
+  void _setFloat32(int offsetInBytes, double value)
+      native "TypedData_SetFloat32";
+
+  double _getFloat64(int offsetInBytes) native "TypedData_GetFloat64";
+  void _setFloat64(int offsetInBytes, double value)
+      native "TypedData_SetFloat64";
+
+  Float32x4 _getFloat32x4(int offsetInBytes) native "TypedData_GetFloat32x4";
+  void _setFloat32x4(int offsetInBytes, Float32x4 value)
+      native "TypedData_SetFloat32x4";
+
+  Int32x4 _getInt32x4(int offsetInBytes) native "TypedData_GetInt32x4";
+  void _setInt32x4(int offsetInBytes, Int32x4 value)
+      native "TypedData_SetInt32x4";
+
+  Float64x2 _getFloat64x2(int offsetInBytes) native "TypedData_GetFloat64x2";
+  void _setFloat64x2(int offsetInBytes, Float64x2 value)
+      native "TypedData_SetFloat64x2";
+
+  /**
+   * Stores the [CodeUnits] as UTF-16 units into this TypedData at
+   * positions [start]..[end] (uint16 indices).
+   */
+  void _setCodeUnits(
+      CodeUnits units, int byteStart, int length, int skipCount) {
+    assert(byteStart + length * Uint16List.BYTES_PER_ELEMENT <= lengthInBytes);
+    String string = CodeUnits.stringOf(units);
+    int sliceEnd = skipCount + length;
+    RangeError.checkValidRange(
+        skipCount, sliceEnd, string.length, "skipCount", "skipCount + length");
+    for (int i = 0; i < length; i++) {
+      _setUint16(byteStart + i * Uint16List.BYTES_PER_ELEMENT,
+          string.codeUnitAt(skipCount + i));
+    }
+  }
+}
+
+@patch
+class Int8List {
+  @patch
+  factory Int8List(int length) native "TypedData_Int8Array_new";
+
+  @patch
+  factory Int8List.fromList(List<int> elements) {
+    return new Int8List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Int8List extends _TypedList with _IntListMixin implements Int8List {
+  Type get runtimeType => Int8List;
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getInt8(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setInt8(index, _toInt8(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Int8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int8List _createList(int length) {
+    return new Int8List(length);
+  }
+}
+
+@patch
+class Uint8List {
+  @patch
+  factory Uint8List(int length) native "TypedData_Uint8Array_new";
+
+  @patch
+  factory Uint8List.fromList(List<int> elements) {
+    return new Uint8List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Uint8List extends _TypedList with _IntListMixin implements Uint8List {
+  Type get runtimeType => Uint8List;
+
+  // Methods implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getUint8(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setUint8(index, _toUint8(value));
+  }
+
+  // Methods implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Uint8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint8List _createList(int length) {
+    return new Uint8List(length);
+  }
+}
+
+@patch
+class Uint8ClampedList {
+  @patch
+  factory Uint8ClampedList(int length) native "TypedData_Uint8ClampedArray_new";
+
+  @patch
+  factory Uint8ClampedList.fromList(List<int> elements) {
+    return new Uint8ClampedList(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Uint8ClampedList extends _TypedList
+    with _IntListMixin
+    implements Uint8ClampedList {
+  Type get runtimeType => Uint8ClampedList;
+
+  // Methods implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getUint8(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setUint8(index, _toClampedUint8(value));
+  }
+
+  // Methods implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Uint8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint8ClampedList _createList(int length) {
+    return new Uint8ClampedList(length);
+  }
+}
+
+@patch
+class Int16List {
+  @patch
+  factory Int16List(int length) native "TypedData_Int16Array_new";
+
+  @patch
+  factory Int16List.fromList(List<int> elements) {
+    return new Int16List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Int16List extends _TypedList with _IntListMixin implements Int16List {
+  Type get runtimeType => Int16List;
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedInt16(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedInt16(index, _toInt16(value));
+  }
+
+  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
+    if (iterable is CodeUnits) {
+      end = RangeError.checkValidRange(start, end, this.length);
+      int length = end - start;
+      int byteStart = this.offsetInBytes + start * Int16List.BYTES_PER_ELEMENT;
+      _setCodeUnits(iterable, byteStart, length, skipCount);
+    } else {
+      super.setRange(start, end, iterable, skipCount);
+    }
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Int16List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int16List _createList(int length) {
+    return new Int16List(length);
+  }
+
+  int _getIndexedInt16(int index) {
+    return _getInt16(index * Int16List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedInt16(int index, int value) {
+    _setInt16(index * Int16List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Uint16List {
+  @patch
+  factory Uint16List(int length) native "TypedData_Uint16Array_new";
+
+  @patch
+  factory Uint16List.fromList(List<int> elements) {
+    return new Uint16List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Uint16List extends _TypedList with _IntListMixin implements Uint16List {
+  Type get runtimeType => Uint16List;
+
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedUint16(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedUint16(index, _toUint16(value));
+  }
+
+  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
+    if (iterable is CodeUnits) {
+      end = RangeError.checkValidRange(start, end, this.length);
+      int length = end - start;
+      int byteStart = this.offsetInBytes + start * Uint16List.BYTES_PER_ELEMENT;
+      _setCodeUnits(iterable, byteStart, length, skipCount);
+    } else {
+      super.setRange(start, end, iterable, skipCount);
+    }
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Uint16List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint16List _createList(int length) {
+    return new Uint16List(length);
+  }
+
+  int _getIndexedUint16(int index) {
+    return _getUint16(index * Uint16List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedUint16(int index, int value) {
+    _setUint16(index * Uint16List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Int32List {
+  @patch
+  factory Int32List(int length) native "TypedData_Int32Array_new";
+
+  @patch
+  factory Int32List.fromList(List<int> elements) {
+    return new Int32List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Int32List extends _TypedList with _IntListMixin implements Int32List {
+  Type get runtimeType => Int32List;
+
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedInt32(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedInt32(index, _toInt32(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Int32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int32List _createList(int length) {
+    return new Int32List(length);
+  }
+
+  int _getIndexedInt32(int index) {
+    return _getInt32(index * Int32List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedInt32(int index, int value) {
+    _setInt32(index * Int32List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Uint32List {
+  @patch
+  factory Uint32List(int length) native "TypedData_Uint32Array_new";
+
+  @patch
+  factory Uint32List.fromList(List<int> elements) {
+    return new Uint32List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Uint32List extends _TypedList with _IntListMixin implements Uint32List {
+  Type get runtimeType => Uint32List;
+
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedUint32(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedUint32(index, _toUint32(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Uint32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint32List _createList(int length) {
+    return new Uint32List(length);
+  }
+
+  int _getIndexedUint32(int index) {
+    return _getUint32(index * Uint32List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedUint32(int index, int value) {
+    _setUint32(index * Uint32List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Int64List {
+  @patch
+  factory Int64List(int length) native "TypedData_Int64Array_new";
+
+  @patch
+  factory Int64List.fromList(List<int> elements) {
+    return new Int64List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Int64List extends _TypedList with _IntListMixin implements Int64List {
+  Type get runtimeType => Int64List;
+
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedInt64(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedInt64(index, _toInt64(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Int64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int64List _createList(int length) {
+    return new Int64List(length);
+  }
+
+  int _getIndexedInt64(int index) {
+    return _getInt64(index * Int64List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedInt64(int index, int value) {
+    _setInt64(index * Int64List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Uint64List {
+  @patch
+  factory Uint64List(int length) native "TypedData_Uint64Array_new";
+
+  @patch
+  factory Uint64List.fromList(List<int> elements) {
+    return new Uint64List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Uint64List extends _TypedList with _IntListMixin implements Uint64List {
+  Type get runtimeType => Uint64List;
+
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedUint64(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedUint64(index, _toUint64(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Uint64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint64List _createList(int length) {
+    return new Uint64List(length);
+  }
+
+  int _getIndexedUint64(int index) {
+    return _getUint64(index * Uint64List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedUint64(int index, int value) {
+    _setUint64(index * Uint64List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Float32List {
+  @patch
+  factory Float32List(int length) native "TypedData_Float32Array_new";
+
+  @patch
+  factory Float32List.fromList(List<double> elements) {
+    return new Float32List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Float32List extends _TypedList
+    with _DoubleListMixin
+    implements Float32List {
+  Type get runtimeType => Float32List;
+
+  // Method(s) implementing the List interface.
+  double operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedFloat32(index);
+  }
+
+  void operator []=(int index, double value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedFloat32(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Float32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float32List _createList(int length) {
+    return new Float32List(length);
+  }
+
+  double _getIndexedFloat32(int index) {
+    return _getFloat32(index * Float32List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedFloat32(int index, double value) {
+    _setFloat32(index * Float32List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Float64List {
+  @patch
+  factory Float64List(int length) native "TypedData_Float64Array_new";
+
+  @patch
+  factory Float64List.fromList(List<double> elements) {
+    return new Float64List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Float64List extends _TypedList
+    with _DoubleListMixin
+    implements Float64List {
+  Type get runtimeType => Float64List;
+
+  // Method(s) implementing the List interface.
+  double operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedFloat64(index);
+  }
+
+  void operator []=(int index, double value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedFloat64(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Float64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float64List _createList(int length) {
+    return new Float64List(length);
+  }
+
+  double _getIndexedFloat64(int index) {
+    return _getFloat64(index * Float64List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedFloat64(int index, double value) {
+    _setFloat64(index * Float64List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Float32x4List {
+  @patch
+  factory Float32x4List(int length) native "TypedData_Float32x4Array_new";
+
+  @patch
+  factory Float32x4List.fromList(List<Float32x4> elements) {
+    return new Float32x4List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Float32x4List extends _TypedList
+    with _Float32x4ListMixin
+    implements Float32x4List {
+  Type get runtimeType => Float32x4List;
+
+  Float32x4 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedFloat32x4(index);
+  }
+
+  void operator []=(int index, Float32x4 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedFloat32x4(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Float32x4List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float32x4List _createList(int length) {
+    return new Float32x4List(length);
+  }
+
+  Float32x4 _getIndexedFloat32x4(int index) {
+    return _getFloat32x4(index * Float32x4List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedFloat32x4(int index, Float32x4 value) {
+    _setFloat32x4(index * Float32x4List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Int32x4List {
+  @patch
+  factory Int32x4List(int length) native "TypedData_Int32x4Array_new";
+
+  @patch
+  factory Int32x4List.fromList(List<Int32x4> elements) {
+    return new Int32x4List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Int32x4List extends _TypedList
+    with _Int32x4ListMixin
+    implements Int32x4List {
+  Type get runtimeType => Int32x4List;
+
+  Int32x4 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedInt32x4(index);
+  }
+
+  void operator []=(int index, Int32x4 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedInt32x4(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Int32x4List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int32x4List _createList(int length) {
+    return new Int32x4List(length);
+  }
+
+  Int32x4 _getIndexedInt32x4(int index) {
+    return _getInt32x4(index * Int32x4List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedInt32x4(int index, Int32x4 value) {
+    _setInt32x4(index * Int32x4List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Float64x2List {
+  @patch
+  factory Float64x2List(int length) native "TypedData_Float64x2Array_new";
+
+  @patch
+  factory Float64x2List.fromList(List<Float64x2> elements) {
+    return new Float64x2List(elements.length)
+      ..setRange(0, elements.length, elements);
+  }
+}
+
+class _Float64x2List extends _TypedList
+    with _Float64x2ListMixin
+    implements Float64x2List {
+  Type get runtimeType => Float64x2List;
+
+  Float64x2 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedFloat64x2(index);
+  }
+
+  void operator []=(int index, Float64x2 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedFloat64x2(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Float64x2List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float64x2List _createList(int length) {
+    return new Float64x2List(length);
+  }
+
+  Float64x2 _getIndexedFloat64x2(int index) {
+    return _getFloat64x2(index * Float64x2List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedFloat64x2(int index, Float64x2 value) {
+    _setFloat64x2(index * Float64x2List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalInt8Array extends _TypedList
+    with _IntListMixin
+    implements Int8List {
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getInt8(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setInt8(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Int8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int8List _createList(int length) {
+    return new Int8List(length);
+  }
+}
+
+class _ExternalUint8Array extends _TypedList
+    with _IntListMixin
+    implements Uint8List {
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getUint8(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setUint8(index, _toUint8(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Uint8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint8List _createList(int length) {
+    return new Uint8List(length);
+  }
+}
+
+class _ExternalUint8ClampedArray extends _TypedList
+    with _IntListMixin
+    implements Uint8ClampedList {
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getUint8(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setUint8(index, _toClampedUint8(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Uint8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint8ClampedList _createList(int length) {
+    return new Uint8ClampedList(length);
+  }
+}
+
+class _ExternalInt16Array extends _TypedList
+    with _IntListMixin
+    implements Int16List {
+  // Method(s) implementing the List interface.
+
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedInt16(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedInt16(index, _toInt16(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Int16List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int16List _createList(int length) {
+    return new Int16List(length);
+  }
+
+  int _getIndexedInt16(int index) {
+    return _getInt16(index * Int16List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedInt16(int index, int value) {
+    _setInt16(index * Int16List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalUint16Array extends _TypedList
+    with _IntListMixin
+    implements Uint16List {
+  // Method(s) implementing the List interface.
+
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedUint16(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedUint16(index, _toUint16(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Uint16List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint16List _createList(int length) {
+    return new Uint16List(length);
+  }
+
+  int _getIndexedUint16(int index) {
+    return _getUint16(index * Uint16List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedUint16(int index, int value) {
+    _setUint16(index * Uint16List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalInt32Array extends _TypedList
+    with _IntListMixin
+    implements Int32List {
+  // Method(s) implementing the List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedInt32(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedInt32(index, _toInt32(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Int32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int32List _createList(int length) {
+    return new Int32List(length);
+  }
+
+  int _getIndexedInt32(int index) {
+    return _getInt32(index * Int32List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedInt32(int index, int value) {
+    _setInt32(index * Int32List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalUint32Array extends _TypedList
+    with _IntListMixin
+    implements Uint32List {
+  // Method(s) implementing the List interface.
+
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedUint32(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedUint32(index, _toUint32(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Uint32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint32List _createList(int length) {
+    return new Uint32List(length);
+  }
+
+  int _getIndexedUint32(int index) {
+    return _getUint32(index * Uint32List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedUint32(int index, int value) {
+    _setUint32(index * Uint32List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalInt64Array extends _TypedList
+    with _IntListMixin
+    implements Int64List {
+  // Method(s) implementing the List interface.
+
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedInt64(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedInt64(index, _toInt64(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Int64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int64List _createList(int length) {
+    return new Int64List(length);
+  }
+
+  int _getIndexedInt64(int index) {
+    return _getInt64(index * Int64List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedInt64(int index, int value) {
+    _setInt64(index * Int64List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalUint64Array extends _TypedList
+    with _IntListMixin
+    implements Uint64List {
+  // Method(s) implementing the List interface.
+
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedUint64(index);
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedUint64(index, _toUint64(value));
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Uint64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint64List _createList(int length) {
+    return new Uint64List(length);
+  }
+
+  int _getIndexedUint64(int index) {
+    return _getUint64(index * Uint64List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedUint64(int index, int value) {
+    _setUint64(index * Uint64List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalFloat32Array extends _TypedList
+    with _DoubleListMixin
+    implements Float32List {
+  // Method(s) implementing the List interface.
+
+  double operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedFloat32(index);
+  }
+
+  void operator []=(int index, double value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedFloat32(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Float32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float32List _createList(int length) {
+    return new Float32List(length);
+  }
+
+  double _getIndexedFloat32(int index) {
+    return _getFloat32(index * Float32List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedFloat32(int index, double value) {
+    _setFloat32(index * Float32List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalFloat64Array extends _TypedList
+    with _DoubleListMixin
+    implements Float64List {
+  // Method(s) implementing the List interface.
+
+  double operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedFloat64(index);
+  }
+
+  void operator []=(int index, double value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedFloat64(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Float64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float64List _createList(int length) {
+    return new Float64List(length);
+  }
+
+  double _getIndexedFloat64(int index) {
+    return _getFloat64(index * Float64List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedFloat64(int index, double value) {
+    _setFloat64(index * Float64List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalFloat32x4Array extends _TypedList
+    with _Float32x4ListMixin
+    implements Float32x4List {
+  // Method(s) implementing the List interface.
+
+  Float32x4 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedFloat32x4(index);
+  }
+
+  void operator []=(int index, Float32x4 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedFloat32x4(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Float32x4List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float32x4List _createList(int length) {
+    return new Float32x4List(length);
+  }
+
+  Float32x4 _getIndexedFloat32x4(int index) {
+    return _getFloat32x4(index * Float32x4List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedFloat32x4(int index, Float32x4 value) {
+    _setFloat32x4(index * Float32x4List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalInt32x4Array extends _TypedList
+    with _Int32x4ListMixin
+    implements Int32x4List {
+  // Method(s) implementing the List interface.
+
+  Int32x4 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedInt32x4(index);
+  }
+
+  void operator []=(int index, Int32x4 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedInt32x4(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Int32x4List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int32x4List _createList(int length) {
+    return new Int32x4List(length);
+  }
+
+  Int32x4 _getIndexedInt32x4(int index) {
+    return _getInt32x4(index * Int32x4List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedInt32x4(int index, Int32x4 value) {
+    _setInt32x4(index * Int32x4List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+class _ExternalFloat64x2Array extends _TypedList
+    with _Float64x2ListMixin
+    implements Float64x2List {
+  // Method(s) implementing the List interface.
+  Float64x2 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _getIndexedFloat64x2(index);
+  }
+
+  void operator []=(int index, Float64x2 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _setIndexedFloat64x2(index, value);
+  }
+
+  // Method(s) implementing the TypedData interface.
+  int get elementSizeInBytes {
+    return Float64x2List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float64x2List _createList(int length) {
+    return new Float64x2List(length);
+  }
+
+  Float64x2 _getIndexedFloat64x2(int index) {
+    return _getFloat64x2(index * Float64x2List.BYTES_PER_ELEMENT);
+  }
+
+  void _setIndexedFloat64x2(int index, Float64x2 value) {
+    _setFloat64x2(index * Float64x2List.BYTES_PER_ELEMENT, value);
+  }
+}
+
+@patch
+class Float32x4 {
+  @patch
+  factory Float32x4(double x, double y, double z, double w)
+      native "Float32x4_fromDoubles";
+
+  @patch
+  factory Float32x4.splat(double v) native "Float32x4_splat";
+
+  @patch
+  factory Float32x4.zero() native "Float32x4_zero";
+
+  @patch
+  factory Float32x4.fromInt32x4Bits(Int32x4 x)
+      native "Float32x4_fromInt32x4Bits";
+
+  @patch
+  factory Float32x4.fromFloat64x2(Float64x2 v) native "Float32x4_fromFloat64x2";
+}
+
+class _Float32x4 implements Float32x4 {
+  Float32x4 operator +(Float32x4 other) native "Float32x4_add";
+  Float32x4 operator -() native "Float32x4_negate";
+  Float32x4 operator -(Float32x4 other) native "Float32x4_sub";
+  Float32x4 operator *(Float32x4 other) native "Float32x4_mul";
+  Float32x4 operator /(Float32x4 other) native "Float32x4_div";
+  Int32x4 lessThan(Float32x4 other) native "Float32x4_cmplt";
+  Int32x4 lessThanOrEqual(Float32x4 other) native "Float32x4_cmplte";
+  Int32x4 greaterThan(Float32x4 other) native "Float32x4_cmpgt";
+  Int32x4 greaterThanOrEqual(Float32x4 other) native "Float32x4_cmpgte";
+  Int32x4 equal(Float32x4 other) native "Float32x4_cmpequal";
+  Int32x4 notEqual(Float32x4 other) native "Float32x4_cmpnequal";
+  Float32x4 scale(double s) native "Float32x4_scale";
+  Float32x4 abs() native "Float32x4_abs";
+  Float32x4 clamp(Float32x4 lowerLimit, Float32x4 upperLimit)
+      native "Float32x4_clamp";
+  double get x native "Float32x4_getX";
+  double get y native "Float32x4_getY";
+  double get z native "Float32x4_getZ";
+  double get w native "Float32x4_getW";
+  int get signMask native "Float32x4_getSignMask";
+
+  Float32x4 shuffle(int mask) native "Float32x4_shuffle";
+  Float32x4 shuffleMix(Float32x4 zw, int mask) native "Float32x4_shuffleMix";
+
+  Float32x4 withX(double x) native "Float32x4_setX";
+  Float32x4 withY(double y) native "Float32x4_setY";
+  Float32x4 withZ(double z) native "Float32x4_setZ";
+  Float32x4 withW(double w) native "Float32x4_setW";
+  Float32x4 min(Float32x4 other) native "Float32x4_min";
+  Float32x4 max(Float32x4 other) native "Float32x4_max";
+  Float32x4 sqrt() native "Float32x4_sqrt";
+  Float32x4 reciprocal() native "Float32x4_reciprocal";
+  Float32x4 reciprocalSqrt() native "Float32x4_reciprocalSqrt";
+}
+
+@patch
+class Int32x4 {
+  @patch
+  factory Int32x4(int x, int y, int z, int w) native "Int32x4_fromInts";
+
+  @patch
+  factory Int32x4.bool(bool x, bool y, bool z, bool w)
+      native "Int32x4_fromBools";
+
+  @patch
+  factory Int32x4.fromFloat32x4Bits(Float32x4 x)
+      native "Int32x4_fromFloat32x4Bits";
+}
+
+class _Int32x4 implements Int32x4 {
+  Int32x4 operator |(Int32x4 other) native "Int32x4_or";
+  Int32x4 operator &(Int32x4 other) native "Int32x4_and";
+  Int32x4 operator ^(Int32x4 other) native "Int32x4_xor";
+  Int32x4 operator +(Int32x4 other) native "Int32x4_add";
+  Int32x4 operator -(Int32x4 other) native "Int32x4_sub";
+  int get x native "Int32x4_getX";
+  int get y native "Int32x4_getY";
+  int get z native "Int32x4_getZ";
+  int get w native "Int32x4_getW";
+  int get signMask native "Int32x4_getSignMask";
+  Int32x4 shuffle(int mask) native "Int32x4_shuffle";
+  Int32x4 shuffleMix(Int32x4 zw, int mask) native "Int32x4_shuffleMix";
+  Int32x4 withX(int x) native "Int32x4_setX";
+  Int32x4 withY(int y) native "Int32x4_setY";
+  Int32x4 withZ(int z) native "Int32x4_setZ";
+  Int32x4 withW(int w) native "Int32x4_setW";
+  bool get flagX native "Int32x4_getFlagX";
+  bool get flagY native "Int32x4_getFlagY";
+  bool get flagZ native "Int32x4_getFlagZ";
+  bool get flagW native "Int32x4_getFlagW";
+  Int32x4 withFlagX(bool x) native "Int32x4_setFlagX";
+  Int32x4 withFlagY(bool y) native "Int32x4_setFlagY";
+  Int32x4 withFlagZ(bool z) native "Int32x4_setFlagZ";
+  Int32x4 withFlagW(bool w) native "Int32x4_setFlagW";
+  Float32x4 select(Float32x4 trueValue, Float32x4 falseValue)
+      native "Int32x4_select";
+}
+
+@patch
+class Float64x2 {
+  @patch
+  factory Float64x2(double x, double y) native "Float64x2_fromDoubles";
+
+  @patch
+  factory Float64x2.splat(double v) native "Float64x2_splat";
+
+  @patch
+  factory Float64x2.zero() native "Float64x2_zero";
+
+  @patch
+  factory Float64x2.fromFloat32x4(Float32x4 v) native "Float64x2_fromFloat32x4";
+}
+
+class _Float64x2 implements Float64x2 {
+  Float64x2 operator +(Float64x2 other) native "Float64x2_add";
+  Float64x2 operator -() native "Float64x2_negate";
+  Float64x2 operator -(Float64x2 other) native "Float64x2_sub";
+  Float64x2 operator *(Float64x2 other) native "Float64x2_mul";
+  Float64x2 operator /(Float64x2 other) native "Float64x2_div";
+  Float64x2 scale(double s) native "Float64x2_scale";
+  Float64x2 abs() native "Float64x2_abs";
+  Float64x2 clamp(Float64x2 lowerLimit, Float64x2 upperLimit)
+      native "Float64x2_clamp";
+  double get x native "Float64x2_getX";
+  double get y native "Float64x2_getY";
+  int get signMask native "Float64x2_getSignMask";
+  Float64x2 withX(double x) native "Float64x2_setX";
+  Float64x2 withY(double y) native "Float64x2_setY";
+  Float64x2 min(Float64x2 other) native "Float64x2_min";
+  Float64x2 max(Float64x2 other) native "Float64x2_max";
+  Float64x2 sqrt() native "Float64x2_sqrt";
+}
+
+class _TypedListIterator<E> implements Iterator<E> {
+  final List<E> _array;
+  final int _length;
+  int _position;
+  E _current;
+
+  _TypedListIterator(List array)
+      : _array = array,
+        _length = array.length,
+        _position = -1 {
+    assert(array is _TypedList || array is _TypedListView);
+  }
+
+  bool moveNext() {
+    int nextPosition = _position + 1;
+    if (nextPosition < _length) {
+      _current = _array[nextPosition];
+      _position = nextPosition;
+      return true;
+    }
+    _position = _length;
+    _current = null;
+    return false;
+  }
+
+  E get current => _current;
+}
+
+class _TypedListView extends _TypedListBase implements TypedData {
+  _TypedListView(_ByteBuffer _buffer, int _offset, int _length)
+      : _typedData = _buffer._data,
+        offsetInBytes = _offset,
+        length = _length {}
+
+  // Method(s) implementing the TypedData interface.
+
+  int get lengthInBytes {
+    return length * elementSizeInBytes;
+  }
+
+  _ByteBuffer get buffer {
+    return _typedData.buffer;
+  }
+
+  final _TypedList _typedData;
+  final int offsetInBytes;
+  final int length;
+}
+
+class _Int8ArrayView extends _TypedListView
+    with _IntListMixin
+    implements Int8List {
+  // Constructor.
+  _Int8ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Int8List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, _offsetInBytes,
+        length * Int8List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getInt8(offsetInBytes + (index * Int8List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setInt8(
+        offsetInBytes + (index * Int8List.BYTES_PER_ELEMENT), _toInt8(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Int8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int8List _createList(int length) {
+    return new Int8List(length);
+  }
+}
+
+class _Uint8ArrayView extends _TypedListView
+    with _IntListMixin
+    implements Uint8List {
+  // Constructor.
+  _Uint8ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Uint8List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, _offsetInBytes,
+        length * Uint8List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getUint8(offsetInBytes + (index * Uint8List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setUint8(
+        offsetInBytes + (index * Uint8List.BYTES_PER_ELEMENT), _toUint8(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Uint8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint8List _createList(int length) {
+    return new Uint8List(length);
+  }
+}
+
+class _Uint8ClampedArrayView extends _TypedListView
+    with _IntListMixin
+    implements Uint8ClampedList {
+  // Constructor.
+  _Uint8ClampedArrayView(_ByteBuffer buffer,
+      [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Uint8List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Uint8List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getUint8(offsetInBytes + (index * Uint8List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setUint8(offsetInBytes + (index * Uint8List.BYTES_PER_ELEMENT),
+        _toClampedUint8(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Uint8List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint8ClampedList _createList(int length) {
+    return new Uint8ClampedList(length);
+  }
+}
+
+class _Int16ArrayView extends _TypedListView
+    with _IntListMixin
+    implements Int16List {
+  // Constructor.
+  _Int16ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Int16List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Int16List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Int16List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getInt16(offsetInBytes + (index * Int16List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setInt16(
+        offsetInBytes + (index * Int16List.BYTES_PER_ELEMENT), _toInt16(value));
+  }
+
+  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
+    if (iterable is CodeUnits) {
+      end = RangeError.checkValidRange(start, end, this.length);
+      int length = end - start;
+      int byteStart = this.offsetInBytes + start * Int16List.BYTES_PER_ELEMENT;
+      _typedData._setCodeUnits(iterable, byteStart, length, skipCount);
+    } else {
+      super.setRange(start, end, iterable, skipCount);
+    }
+  }
+
+  // Method(s) implementing TypedData interface.
+
+  int get elementSizeInBytes {
+    return Int16List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int16List _createList(int length) {
+    return new Int16List(length);
+  }
+}
+
+class _Uint16ArrayView extends _TypedListView
+    with _IntListMixin
+    implements Uint16List {
+  // Constructor.
+  _Uint16ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Uint16List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Uint16List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Uint16List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getUint16(offsetInBytes + (index * Uint16List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setUint16(
+        offsetInBytes + (index * Uint16List.BYTES_PER_ELEMENT),
+        _toUint16(value));
+  }
+
+  void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) {
+    if (iterable is CodeUnits) {
+      end = RangeError.checkValidRange(start, end, this.length);
+      int length = end - start;
+      int byteStart = this.offsetInBytes + start * Uint16List.BYTES_PER_ELEMENT;
+      _typedData._setCodeUnits(iterable, byteStart, length, skipCount);
+    } else {
+      super.setRange(start, end, iterable, skipCount);
+    }
+  }
+
+  // Method(s) implementing TypedData interface.
+
+  int get elementSizeInBytes {
+    return Uint16List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+
+  Uint16List _createList(int length) {
+    return new Uint16List(length);
+  }
+}
+
+class _Int32ArrayView extends _TypedListView
+    with _IntListMixin
+    implements Int32List {
+  // Constructor.
+  _Int32ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Int32List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Int32List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Int32List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getInt32(offsetInBytes + (index * Int32List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setInt32(
+        offsetInBytes + (index * Int32List.BYTES_PER_ELEMENT), _toInt32(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Int32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int32List _createList(int length) {
+    return new Int32List(length);
+  }
+}
+
+class _Uint32ArrayView extends _TypedListView
+    with _IntListMixin
+    implements Uint32List {
+  // Constructor.
+  _Uint32ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Uint32List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Uint32List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Uint32List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getUint32(offsetInBytes + (index * Uint32List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setUint32(
+        offsetInBytes + (index * Uint32List.BYTES_PER_ELEMENT),
+        _toUint32(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Uint32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint32List _createList(int length) {
+    return new Uint32List(length);
+  }
+}
+
+class _Int64ArrayView extends _TypedListView
+    with _IntListMixin
+    implements Int64List {
+  // Constructor.
+  _Int64ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Int64List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Int64List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Int64List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getInt64(offsetInBytes + (index * Int64List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setInt64(
+        offsetInBytes + (index * Int64List.BYTES_PER_ELEMENT), _toInt64(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Int64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int64List _createList(int length) {
+    return new Int64List(length);
+  }
+}
+
+class _Uint64ArrayView extends _TypedListView
+    with _IntListMixin
+    implements Uint64List {
+  // Constructor.
+  _Uint64ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Uint64List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Uint64List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Uint64List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  int operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getUint64(offsetInBytes + (index * Uint64List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, int value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setUint64(
+        offsetInBytes + (index * Uint64List.BYTES_PER_ELEMENT),
+        _toUint64(value));
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Uint64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Uint64List _createList(int length) {
+    return new Uint64List(length);
+  }
+}
+
+class _Float32ArrayView extends _TypedListView
+    with _DoubleListMixin
+    implements Float32List {
+  // Constructor.
+  _Float32ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Float32List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Float32List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Float32List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  double operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getFloat32(offsetInBytes + (index * Float32List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, double value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setFloat32(
+        offsetInBytes + (index * Float32List.BYTES_PER_ELEMENT), value);
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Float32List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float32List _createList(int length) {
+    return new Float32List(length);
+  }
+}
+
+class _Float64ArrayView extends _TypedListView
+    with _DoubleListMixin
+    implements Float64List {
+  // Constructor.
+  _Float64ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Float64List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Float64List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Float64List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  double operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getFloat64(offsetInBytes + (index * Float64List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, double value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setFloat64(
+        offsetInBytes + (index * Float64List.BYTES_PER_ELEMENT), value);
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Float64List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float64List _createList(int length) {
+    return new Float64List(length);
+  }
+}
+
+class _Float32x4ArrayView extends _TypedListView
+    with _Float32x4ListMixin
+    implements Float32x4List {
+  // Constructor.
+  _Float32x4ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Float32x4List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Float32x4List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Float32x4List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  Float32x4 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData._getFloat32x4(
+        offsetInBytes + (index * Float32x4List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, Float32x4 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setFloat32x4(
+        offsetInBytes + (index * Float32x4List.BYTES_PER_ELEMENT), value);
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Float32x4List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float32x4List _createList(int length) {
+    return new Float32x4List(length);
+  }
+}
+
+class _Int32x4ArrayView extends _TypedListView
+    with _Int32x4ListMixin
+    implements Int32x4List {
+  // Constructor.
+  _Int32x4ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Int32x4List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Int32x4List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Int32x4List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  Int32x4 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData
+        ._getInt32x4(offsetInBytes + (index * Int32x4List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, Int32x4 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setInt32x4(
+        offsetInBytes + (index * Int32x4List.BYTES_PER_ELEMENT), value);
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Int32x4List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Int32x4List _createList(int length) {
+    return new Int32x4List(length);
+  }
+}
+
+class _Float64x2ArrayView extends _TypedListView
+    with _Float64x2ListMixin
+    implements Float64x2List {
+  // Constructor.
+  _Float64x2ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
+      : super(
+            buffer,
+            _offsetInBytes,
+            _defaultIfNull(
+                _length,
+                ((buffer.lengthInBytes - _offsetInBytes) ~/
+                    Float64x2List.BYTES_PER_ELEMENT))) {
+    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
+        length * Float64x2List.BYTES_PER_ELEMENT);
+    _offsetAlignmentCheck(_offsetInBytes, Float64x2List.BYTES_PER_ELEMENT);
+  }
+
+  // Method(s) implementing List interface.
+  Float64x2 operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    return _typedData._getFloat64x2(
+        offsetInBytes + (index * Float64x2List.BYTES_PER_ELEMENT));
+  }
+
+  void operator []=(int index, Float64x2 value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError.index(index, this, "index");
+    }
+    _typedData._setFloat64x2(
+        offsetInBytes + (index * Float64x2List.BYTES_PER_ELEMENT), value);
+  }
+
+  // Method(s) implementing TypedData interface.
+  int get elementSizeInBytes {
+    return Float64x2List.BYTES_PER_ELEMENT;
+  }
+
+  // Internal utility methods.
+  Float64x2List _createList(int length) {
+    return new Float64x2List(length);
+  }
+}
+
+class _ByteDataView implements ByteData {
+  _ByteDataView(TypedData typedData, int _offsetInBytes, int _lengthInBytes)
+      : _typedData = typedData,
+        _offset = _offsetInBytes,
+        length = _lengthInBytes {
+    _rangeCheck(_typedData.lengthInBytes, _offset, length);
+  }
+
+  // Method(s) implementing TypedData interface.
+  _ByteBuffer get buffer {
+    return _typedData.buffer;
+  }
+
+  int get lengthInBytes {
+    return length;
+  }
+
+  int get offsetInBytes {
+    return _offset;
+  }
+
+  int get elementSizeInBytes {
+    return 1;
+  }
+
+  // Method(s) implementing ByteData interface.
+
+  int getInt8(int byteOffset) {
+    if (byteOffset < 0 || byteOffset >= length) {
+      throw new RangeError.index(byteOffset, this, "byteOffset");
+    }
+    return _typedData._getInt8(_offset + byteOffset);
+  }
+
+  void setInt8(int byteOffset, int value) {
+    if (byteOffset < 0 || byteOffset >= length) {
+      throw new RangeError.index(byteOffset, this, "byteOffset");
+    }
+    _typedData._setInt8(_offset + byteOffset, value);
+  }
+
+  int getUint8(int byteOffset) {
+    if (byteOffset < 0 || byteOffset >= length) {
+      throw new RangeError.index(byteOffset, this, "byteOffset");
+    }
+    return _typedData._getUint8(_offset + byteOffset);
+  }
+
+  void setUint8(int byteOffset, int value) {
+    if (byteOffset < 0 || byteOffset >= length) {
+      throw new RangeError.index(byteOffset, this, "byteOffset");
+    }
+    _typedData._setUint8(_offset + byteOffset, value);
+  }
+
+  int getInt16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 1 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
+    }
+    var result = _typedData._getInt16(_offset + byteOffset);
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      return result;
+    }
+    return _byteSwap16(result).toSigned(16);
+  }
+
+  void setInt16(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 1 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
+    }
+    _typedData._setInt16(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap16(value));
+  }
+
+  int getUint16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 1 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
+    }
+    var result = _typedData._getUint16(_offset + byteOffset);
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      return result;
+    }
+    return _byteSwap16(result);
+  }
+
+  void setUint16(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 1 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
+    }
+    _typedData._setUint16(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap16(value));
+  }
+
+  int getInt32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 3 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
+    }
+    var result = _typedData._getInt32(_offset + byteOffset);
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      return result;
+    }
+    return _byteSwap32(result).toSigned(32);
+  }
+
+  void setInt32(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 3 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
+    }
+    _typedData._setInt32(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap32(value));
+  }
+
+  int getUint32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 3 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
+    }
+    var result = _typedData._getUint32(_offset + byteOffset);
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      return result;
+    }
+    return _byteSwap32(result);
+  }
+
+  void setUint32(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 3 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
+    }
+    _typedData._setUint32(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap32(value));
+  }
+
+  int getInt64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 7 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
+    }
+    var result = _typedData._getInt64(_offset + byteOffset);
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      return result;
+    }
+    return _byteSwap64(result).toSigned(64);
+  }
+
+  void setInt64(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 7 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
+    }
+    _typedData._setInt64(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value));
+  }
+
+  int getUint64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 7 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
+    }
+    var result = _typedData._getUint64(_offset + byteOffset);
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      return result;
+    }
+    return _byteSwap64(result);
+  }
+
+  void setUint64(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 7 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
+    }
+    _typedData._setUint64(_offset + byteOffset,
+        identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value));
+  }
+
+  double getFloat32(int byteOffset,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 3 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
+    }
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      return _typedData._getFloat32(_offset + byteOffset);
+    }
+    _convU32[0] = _byteSwap32(_typedData._getUint32(_offset + byteOffset));
+    return _convF32[0];
+  }
+
+  void setFloat32(int byteOffset, double value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 3 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
+    }
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      _typedData._setFloat32(_offset + byteOffset, value);
+      return;
+    }
+    _convF32[0] = value;
+    _typedData._setUint32(_offset + byteOffset, _byteSwap32(_convU32[0]));
+  }
+
+  double getFloat64(int byteOffset,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 7 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
+    }
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      return _typedData._getFloat64(_offset + byteOffset);
+    }
+    _convU64[0] = _byteSwap64(_typedData._getUint64(_offset + byteOffset));
+    return _convF64[0];
+  }
+
+  void setFloat64(int byteOffset, double value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 7 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
+    }
+    if (identical(endian, Endianness.HOST_ENDIAN)) {
+      _typedData._setFloat64(_offset + byteOffset, value);
+      return;
+    }
+    _convF64[0] = value;
+    _typedData._setUint64(_offset + byteOffset, _byteSwap64(_convU64[0]));
+  }
+
+  Float32x4 getFloat32x4(int byteOffset,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 3 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
+    }
+    // TODO(johnmccutchan) : Need to resolve this for endianity.
+    return _typedData._getFloat32x4(_offset + byteOffset);
+  }
+
+  void setFloat32x4(int byteOffset, Float32x4 value,
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
+    if (byteOffset < 0 || byteOffset + 3 >= length) {
+      throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
+    }
+    // TODO(johnmccutchan) : Need to resolve this for endianity.
+    _typedData._setFloat32x4(_offset + byteOffset, value);
+  }
+
+  final TypedData _typedData;
+  final int _offset;
+  final int length;
+}
+
+int _byteSwap16(int value) {
+  return ((value & 0xFF00) >> 8) | ((value & 0x00FF) << 8);
+}
+
+int _byteSwap32(int value) {
+  value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
+  value = ((value & 0xFFFF0000) >> 16) | ((value & 0x0000FFFF) << 16);
+  return value;
+}
+
+int _byteSwap64(int value) {
+  return (_byteSwap32(value) << 32) | _byteSwap32(value >> 32);
+}
+
+final _convU32 = new Uint32List(2);
+final _convU64 = new Uint64List.view(_convU32.buffer);
+final _convF32 = new Float32List.view(_convU32.buffer);
+final _convF64 = new Float64List.view(_convU32.buffer);
+
+// Top level utility methods.
+int _toInt(int value, int mask) {
+  value &= mask;
+  if (value > (mask >> 1)) value -= mask + 1;
+  return value;
+}
+
+int _toInt8(int value) {
+  return _toInt(value, 0xFF);
+}
+
+int _toUint8(int value) {
+  return value & 0xFF;
+}
+
+int _toClampedUint8(int value) {
+  if (value < 0) return 0;
+  if (value > 0xFF) return 0xFF;
+  return value;
+}
+
+int _toInt16(int value) {
+  return _toInt(value, 0xFFFF);
+}
+
+int _toUint16(int value) {
+  return value & 0xFFFF;
+}
+
+int _toInt32(int value) {
+  return _toInt(value, 0xFFFFFFFF);
+}
+
+int _toUint32(int value) {
+  return value & 0xFFFFFFFF;
+}
+
+int _toInt64(int value) {
+  // Avoid bigint mask when possible.
+  return (ClassID.getID(value) == ClassID.cidBigint)
+      ? _toInt(value, 0xFFFFFFFFFFFFFFFF)
+      : value;
+}
+
+int _toUint64(int value) {
+  // Avoid bigint mask when possible.
+  return (ClassID.getID(value) == ClassID.cidBigint)
+      ? _toInt(value, 0xFFFFFFFFFFFFFFFF)
+      : value;
+}
+
+void _rangeCheck(int listLength, int start, int length) {
+  if (length < 0) {
+    throw new RangeError.value(length);
+  }
+  if (start < 0) {
+    throw new RangeError.value(start);
+  }
+  if (start + length > listLength) {
+    throw new RangeError.value(start + length);
+  }
+}
+
+void _offsetAlignmentCheck(int offset, int alignment) {
+  if ((offset % alignment) != 0) {
+    throw new RangeError('Offset ($offset) must be a multiple of '
+        'BYTES_PER_ELEMENT ($alignment)');
+  }
+}
+
+int _defaultIfNull(object, value) {
+  if (object == null) {
+    return value;
+  }
+  return object;
+}
diff --git a/runtime/lib/typed_data_sources.gypi b/runtime/lib/typed_data_sources.gypi
index 28d6a53..d68daed 100644
--- a/runtime/lib/typed_data_sources.gypi
+++ b/runtime/lib/typed_data_sources.gypi
@@ -7,8 +7,7 @@
 {
   'sources': [
     'typed_data.cc',
-    'typed_data.dart',
+    'typed_data_patch.dart',
     'simd128.cc',
   ],
 }
-
diff --git a/runtime/observatory/lib/src/elements/css/shared.css b/runtime/observatory/lib/src/elements/css/shared.css
index 717ad46..4e6e480 100644
--- a/runtime/observatory/lib/src/elements/css/shared.css
+++ b/runtime/observatory/lib/src/elements/css/shared.css
@@ -283,6 +283,12 @@
   flex-basis: 90%;
 }
 
+.indent {
+  margin-left: 1.5em;
+  font: 400 14px 'Montserrat', sans-serif;
+  line-height: 150%;
+}
+
 .well {
   min-height: 20px;
   padding: 19px;
diff --git a/runtime/observatory/lib/src/elements/isolate_view.dart b/runtime/observatory/lib/src/elements/isolate_view.dart
index 73fde1a..ef157c0 100644
--- a/runtime/observatory/lib/src/elements/isolate_view.dart
+++ b/runtime/observatory/lib/src/elements/isolate_view.dart
@@ -27,6 +27,7 @@
 import 'package:observatory/src/elements/script_inset.dart';
 import 'package:observatory/src/elements/source_inset.dart';
 import 'package:observatory/src/elements/view_footer.dart';
+import 'package:observatory/utils.dart';
 
 class IsolateViewElement extends HtmlElement implements Renderable {
   static const tag =
@@ -133,6 +134,7 @@
   void render() {
     final uptime = new DateTime.now().difference(_isolate.startTime);
     final libraries = _isolate.libraries.toList();
+    final List<Thread> threads = _isolate.threads;
     children = [
       navBar([
         new NavTopMenuElement(queue: _r.queue),
@@ -294,6 +296,20 @@
                               ])
                             .toList()
                     ]
+                ],
+              new DivElement()
+                ..classes = ['memberItem']
+                ..children = [
+                  new DivElement()
+                    ..classes = ['memberName']
+                    ..text = 'threads (${threads.length})',
+                  new DivElement()
+                    ..classes = ['memberValue']
+                    ..children = [
+                      new CurlyBlockElement(queue: _r.queue)
+                        ..content = threads
+                          .map(_populateThreadInfo)
+                    ]
                 ]
             ],
           new HRElement(),
@@ -314,6 +330,67 @@
     ];
   }
 
+  DivElement _populateThreadInfo(Thread t) {
+    int index = 0;
+    return new DivElement()
+      ..classes = ['indent']
+      ..children = [
+        new SpanElement()
+          ..text = '${t.id} ',
+        new CurlyBlockElement(queue: _r.queue)
+          ..content = [
+            new DivElement()
+              ..classes = ['indent']
+              ..text = 'kind ${t.kindString}',
+            new DivElement()
+              ..children = t.zones
+                .map((z) => new DivElement()
+                ..classes = ['indent']
+                ..children = [
+                  new DivElement()
+                    ..children = [
+                      new SpanElement()
+                        ..children = [
+                          new SpanElement()
+                            ..text = 'zone ${index++} ',
+                          new CurlyBlockElement(queue: _r.queue)
+                            ..content = [
+                              new DivElement()
+                                ..classes = ['memberList']
+                                ..children = [
+                                  new DivElement()
+                                    ..classes = ['memberItem']
+                                    ..children = [
+                                      new SpanElement()
+                                        ..classes = ['memberName']
+                                        ..text = 'used ',
+                                      new SpanElement()
+                                        ..classes = ['memberValue']
+                                        ..title = '${z.used}B'
+                                        ..text =
+                                        Utils.formatSize(z.used)
+                                    ],
+                                  new DivElement()
+                                    ..classes = ['memberItem']
+                                    ..children = [
+                                        new SpanElement()
+                                          ..classes = ['memberName']
+                                          ..text = 'capacity',
+                                        new SpanElement()
+                                          ..classes = ['memberValue']
+                                          ..title = '${z.capacity}B'
+                                          ..text =
+                                          Utils.formatSize(z.capacity)
+                                    ]
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+          )]
+      ];
+  }
+
   Future _loadExtraData() async {
     _function = null;
     _rootScript = null;
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 3611ef8..b9e0f6e 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -2551,33 +2551,33 @@
       return M.InstanceKind.float64x2;
     case 'Int32x4':
       return M.InstanceKind.int32x4;
-    case 'Uint8ClampedList':
+    case '_Uint8ClampedList':
       return M.InstanceKind.uint8ClampedList;
-    case 'Uint8List':
+    case '_Uint8List':
       return M.InstanceKind.uint8List;
-    case 'Uint16List':
+    case '_Uint16List':
       return M.InstanceKind.uint16List;
-    case 'Uint32List':
+    case '_Uint32List':
       return M.InstanceKind.uint32List;
-    case 'Uint64List':
+    case '_Uint64List':
       return M.InstanceKind.uint64List;
-    case 'Int8List':
+    case '_Int8List':
       return M.InstanceKind.int8List;
-    case 'Int16List':
+    case '_Int16List':
       return M.InstanceKind.int16List;
-    case 'Int32List':
+    case '_Int32List':
       return M.InstanceKind.int32List;
-    case 'Int64List':
+    case '_Int64List':
       return M.InstanceKind.int64List;
-    case 'Float32List':
+    case '_Float32List':
       return M.InstanceKind.float32List;
-    case 'Float64List':
+    case '_Float64List':
       return M.InstanceKind.float64List;
-    case 'Int32x4List':
+    case '_Int32x4List':
       return M.InstanceKind.int32x4List;
-    case 'Float32x4List':
+    case '_Float32x4List':
       return M.InstanceKind.float32x4List;
-    case 'Float64x2List':
+    case '_Float64x2List':
       return M.InstanceKind.float64x2List;
     case 'StackTrace':
       return M.InstanceKind.stackTrace;
@@ -2791,46 +2791,46 @@
     if (map['bytes'] != null) {
       Uint8List bytes = BASE64.decode(map['bytes']);
       switch (map['kind']) {
-        case "Uint8ClampedList":
+        case "_Uint8ClampedList":
           typedElements = bytes.buffer.asUint8ClampedList();
           break;
-        case "Uint8List":
+        case "_Uint8List":
           typedElements = bytes.buffer.asUint8List();
           break;
-        case "Uint16List":
+        case "_Uint16List":
           typedElements = bytes.buffer.asUint16List();
           break;
-        case "Uint32List":
+        case "_Uint32List":
           typedElements = bytes.buffer.asUint32List();
           break;
-        case "Uint64List":
+        case "_Uint64List":
           typedElements = bytes.buffer.asUint64List();
           break;
-        case "Int8List":
+        case "_Int8List":
           typedElements = bytes.buffer.asInt8List();
           break;
-        case "Int16List":
+        case "_Int16List":
           typedElements = bytes.buffer.asInt16List();
           break;
-        case "Int32List":
+        case "_Int32List":
           typedElements = bytes.buffer.asInt32List();
           break;
-        case "Int64List":
+        case "_Int64List":
           typedElements = bytes.buffer.asInt64List();
           break;
-        case "Float32List":
+        case "_Float32List":
           typedElements = bytes.buffer.asFloat32List();
           break;
-        case "Float64List":
+        case "_Float64List":
           typedElements = bytes.buffer.asFloat64List();
           break;
-        case "Int32x4List":
+        case "_Int32x4List":
           typedElements = bytes.buffer.asInt32x4List();
           break;
-        case "Float32x4List":
+        case "_Float32x4List":
           typedElements = bytes.buffer.asFloat32x4List();
           break;
-        case "Float64x2List":
+        case "_Float64x2List":
           typedElements = bytes.buffer.asFloat64x2List();
           break;
       }
@@ -3070,33 +3070,41 @@
 class Thread extends ServiceObject implements M.Thread {
   M.ThreadKind get kind => _kind;
   M.ThreadKind _kind;
+  String get kindString => _kindString;
+  String _kindString;
   List<Zone> get zones => _zones;
   final List<Zone> _zones = new List<Zone>();
 
   Thread._empty(ServiceObjectOwner owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
-    String kindString = map['kind'];
+    String rawKind = map['kind'];
     List<Map> zoneList = map['zones'];
 
-    switch(kindString) {
+    switch(rawKind) {
       case "kUnknownTask":
         _kind = M.ThreadKind.unknownTask;
+        _kindString = 'unknown';
         break;
       case "kMutatorTask":
         _kind = M.ThreadKind.mutatorTask;
+        _kindString = 'mutator';
         break;
       case "kCompilerTask":
         _kind = M.ThreadKind.compilerTask;
+        _kindString = 'compiler';
         break;
       case "kSweeperTask":
         _kind = M.ThreadKind.sweeperTask;
+        _kindString = 'sweeper';
         break;
       case "kMarkerTask":
         _kind = M.ThreadKind.markerTask;
+        _kindString = 'marker';
         break;
       case "kFinalizerTask":
         _kind = M.ThreadKind.finalizerTask;
+        _kindString = 'finalizer';
         break;
       default:
         assert(false);
diff --git a/runtime/observatory/tests/service/get_object_rpc_test.dart b/runtime/observatory/tests/service/get_object_rpc_test.dart
index 2f45f3a..893ec84 100644
--- a/runtime/observatory/tests/service/get_object_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_rpc_test.dart
@@ -436,12 +436,12 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Instance'));
-    expect(result['kind'], equals('Uint8List'));
+    expect(result['kind'], equals('_Uint8List'));
     expect(result['_vmType'], equals('TypedData'));
     expect(result['id'], startsWith('objects/'));
     expect(result['valueAsString'], isNull);
     expect(result['class']['type'], equals('@Class'));
-    expect(result['class']['name'], equals('Uint8List'));
+    expect(result['class']['name'], equals('_Uint8List'));
     expect(result['size'], isPositive);
     expect(result['fields'], isEmpty);
     expect(result['length'], equals(3));
@@ -462,12 +462,12 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Instance'));
-    expect(result['kind'], equals('Uint8List'));
+    expect(result['kind'], equals('_Uint8List'));
     expect(result['_vmType'], equals('TypedData'));
     expect(result['id'], startsWith('objects/'));
     expect(result['valueAsString'], isNull);
     expect(result['class']['type'], equals('@Class'));
-    expect(result['class']['name'], equals('Uint8List'));
+    expect(result['class']['name'], equals('_Uint8List'));
     expect(result['size'], isPositive);
     expect(result['fields'], isEmpty);
     expect(result['length'], equals(3));
@@ -489,12 +489,12 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Instance'));
-    expect(result['kind'], equals('Uint8List'));
+    expect(result['kind'], equals('_Uint8List'));
     expect(result['_vmType'], equals('TypedData'));
     expect(result['id'], startsWith('objects/'));
     expect(result['valueAsString'], isNull);
     expect(result['class']['type'], equals('@Class'));
-    expect(result['class']['name'], equals('Uint8List'));
+    expect(result['class']['name'], equals('_Uint8List'));
     expect(result['size'], isPositive);
     expect(result['fields'], isEmpty);
     expect(result['length'], equals(3));
@@ -516,12 +516,12 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Instance'));
-    expect(result['kind'], equals('Uint8List'));
+    expect(result['kind'], equals('_Uint8List'));
     expect(result['_vmType'], equals('TypedData'));
     expect(result['id'], startsWith('objects/'));
     expect(result['valueAsString'], isNull);
     expect(result['class']['type'], equals('@Class'));
-    expect(result['class']['name'], equals('Uint8List'));
+    expect(result['class']['name'], equals('_Uint8List'));
     expect(result['size'], isPositive);
     expect(result['fields'], isEmpty);
     expect(result['length'], equals(3));
@@ -539,12 +539,12 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Instance'));
-    expect(result['kind'], equals('Uint64List'));
+    expect(result['kind'], equals('_Uint64List'));
     expect(result['_vmType'], equals('TypedData'));
     expect(result['id'], startsWith('objects/'));
     expect(result['valueAsString'], isNull);
     expect(result['class']['type'], equals('@Class'));
-    expect(result['class']['name'], equals('Uint64List'));
+    expect(result['class']['name'], equals('_Uint64List'));
     expect(result['size'], isPositive);
     expect(result['fields'], isEmpty);
     expect(result['length'], equals(3));
@@ -565,12 +565,12 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Instance'));
-    expect(result['kind'], equals('Uint64List'));
+    expect(result['kind'], equals('_Uint64List'));
     expect(result['_vmType'], equals('TypedData'));
     expect(result['id'], startsWith('objects/'));
     expect(result['valueAsString'], isNull);
     expect(result['class']['type'], equals('@Class'));
-    expect(result['class']['name'], equals('Uint64List'));
+    expect(result['class']['name'], equals('_Uint64List'));
     expect(result['size'], isPositive);
     expect(result['fields'], isEmpty);
     expect(result['length'], equals(3));
@@ -592,12 +592,12 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Instance'));
-    expect(result['kind'], equals('Uint64List'));
+    expect(result['kind'], equals('_Uint64List'));
     expect(result['_vmType'], equals('TypedData'));
     expect(result['id'], startsWith('objects/'));
     expect(result['valueAsString'], isNull);
     expect(result['class']['type'], equals('@Class'));
-    expect(result['class']['name'], equals('Uint64List'));
+    expect(result['class']['name'], equals('_Uint64List'));
     expect(result['size'], isPositive);
     expect(result['fields'], isEmpty);
     expect(result['length'], equals(3));
@@ -619,12 +619,12 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Instance'));
-    expect(result['kind'], equals('Uint64List'));
+    expect(result['kind'], equals('_Uint64List'));
     expect(result['_vmType'], equals('TypedData'));
     expect(result['id'], startsWith('objects/'));
     expect(result['valueAsString'], isNull);
     expect(result['class']['type'], equals('@Class'));
-    expect(result['class']['name'], equals('Uint64List'));
+    expect(result['class']['name'], equals('_Uint64List'));
     expect(result['size'], isPositive);
     expect(result['fields'], isEmpty);
     expect(result['length'], equals(3));
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index 009d9a7..d39e46f 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -8,9 +8,12 @@
 pause_on_start_and_exit_test: Pass, RuntimeError # Issue 26470
 pause_on_start_then_step_test: Pass, RuntimeError # Issue 26470
 get_allocation_samples_test: Pass, RuntimeError # Inconsistent stack trace
+get_isolate_rpc_test: Pass, RuntimeError # Issue 28185
 set_library_debuggable_test: Pass, RuntimeError # Issue 28091
-# Reload is slow on the bots
-reload_sources_test: Pass, Slow
+reload_sources_test: Pass, Slow # Reload is slow on the bots
+rewind_test: Pass, RuntimeError # Issue 28047
+tcp_socket_service_test: Pass, RuntimeError # Issue 28184
+get_retained_size_rpc_test: Pass, RuntimeError # Issue 28193
 
 [ ($compiler == none || $compiler == precompiler) && ($runtime == vm || $runtime == dart_precompiled) ]
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
@@ -50,7 +53,6 @@
 address_mapper_test: CompileTimeError # Issue 27806
 capture_stdio_test: CompileTimeError # Issue 27806
 complex_reload_test: RuntimeError # Issue 27806
-debugger_location_second_test: RuntimeError # Issue 27806
 dev_fs_spawn_test: RuntimeError # Issue 27806
 developer_extension_test: RuntimeError # Issue 27806
 evaluate_activation_test/instance: RuntimeError # Issue 27806
@@ -60,6 +62,8 @@
 set_name_rpc_test: RuntimeError # Issue 27806
 vm_restart_test: CompileTimeError # Issue 27806
 
+debugger_location_second_test: RuntimeError, Crash # Issue 28180
+
 [ $compiler == dart2analyzer ]
 evaluate_activation_in_method_class_test: CompileTimeError # Issue 24478
 
@@ -78,7 +82,6 @@
 dev_fs_weird_char_test: Skip # Windows disallows question mark in paths
 dev_fs_http_put_weird_char_test: Skip # Windows disallows carriage returns in paths
 complex_reload_test: Skip # Issue 27861
-rewind_test: Pass, RuntimeError # Issue 28047
 
 # Service protocol is not supported in product mode.
 [ $mode == product ]
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 2c04933..bc89894 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -344,10 +344,12 @@
     ],
     [
       "typed_data",
+      processed_gypis.typed_data_sdk_sources,
+      "../../sdk/lib/typed_data",
+      "typed_data",
+      true,
       processed_gypis.typed_data_runtime_sources,
       "../lib",
-      "typed_data",
-      false,
     ],
     [
       "_vmservice",
@@ -428,7 +430,6 @@
     # Files below are not patches, they will not be in [concatenation_files]
     # but the `patch_sdk.dart` script will copy them into the patched sdk.
     inputs += [
-      "../lib/typed_data.dart",
       "../bin/builtin.dart",
       "../bin/vmservice/vmservice_io.dart",
       "../bin/vmservice/loader.dart",
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 0dc6e7c..8ef219d 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -44,7 +44,6 @@
 
 
 const char** Bootstrap::profiler_patch_paths_ = NULL;
-const char** Bootstrap::typed_data_patch_paths_ = NULL;
 
 
 #define MAKE_PROPERTIES(CamelName, name)                                       \
diff --git a/runtime/vm/bootstrap.h b/runtime/vm/bootstrap.h
index 15f454b..0c271b3 100644
--- a/runtime/vm/bootstrap.h
+++ b/runtime/vm/bootstrap.h
@@ -55,11 +55,11 @@
   static const char* isolate_patch_paths_[];
   static const char* math_patch_paths_[];
   static const char* mirrors_patch_paths_[];
+  static const char* typed_data_patch_paths_[];
   static const char* _vmservice_patch_paths_[];
 
   // NULL patch paths for libraries that do not have patch files.
   static const char** profiler_patch_paths_;
-  static const char** typed_data_patch_paths_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 89f3be7..51e3f3d 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -772,6 +772,85 @@
       data->ptr()->parent_function_ = static_cast<RawFunction*>(d->ReadRef());
       data->ptr()->signature_type_ = static_cast<RawType*>(d->ReadRef());
       data->ptr()->closure_ = static_cast<RawInstance*>(d->ReadRef());
+      data->ptr()->hash_ = Object::null();
+    }
+  }
+};
+
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+class SignatureDataSerializationCluster : public SerializationCluster {
+ public:
+  SignatureDataSerializationCluster() {}
+  virtual ~SignatureDataSerializationCluster() {}
+
+  void Trace(Serializer* s, RawObject* object) {
+    RawSignatureData* data = SignatureData::RawCast(object);
+    objects_.Add(data);
+
+    RawObject** from = data->from();
+    RawObject** to = data->to();
+    for (RawObject** p = from; p <= to; p++) {
+      s->Push(*p);
+    }
+  }
+
+  void WriteAlloc(Serializer* s) {
+    s->WriteCid(kSignatureDataCid);
+    intptr_t count = objects_.length();
+    s->Write<int32_t>(count);
+    for (intptr_t i = 0; i < count; i++) {
+      RawSignatureData* data = objects_[i];
+      s->AssignRef(data);
+    }
+  }
+
+  void WriteFill(Serializer* s) {
+    intptr_t count = objects_.length();
+    for (intptr_t i = 0; i < count; i++) {
+      RawSignatureData* data = objects_[i];
+      RawObject** from = data->from();
+      RawObject** to = data->to();
+      for (RawObject** p = from; p <= to; p++) {
+        s->WriteRef(*p);
+      }
+    }
+  }
+
+ private:
+  GrowableArray<RawSignatureData*> objects_;
+};
+#endif  // !DART_PRECOMPILED_RUNTIME
+
+
+class SignatureDataDeserializationCluster : public DeserializationCluster {
+ public:
+  SignatureDataDeserializationCluster() {}
+  virtual ~SignatureDataDeserializationCluster() {}
+
+  void ReadAlloc(Deserializer* d) {
+    start_index_ = d->next_index();
+    PageSpace* old_space = d->heap()->old_space();
+    intptr_t count = d->Read<int32_t>();
+    for (intptr_t i = 0; i < count; i++) {
+      d->AssignRef(
+          AllocateUninitialized(old_space, SignatureData::InstanceSize()));
+    }
+    stop_index_ = d->next_index();
+  }
+
+  void ReadFill(Deserializer* d) {
+    bool is_vm_object = d->isolate() == Dart::vm_isolate();
+
+    for (intptr_t id = start_index_; id < stop_index_; id++) {
+      RawSignatureData* data = reinterpret_cast<RawSignatureData*>(d->Ref(id));
+      Deserializer::InitializeHeader(
+          data, kSignatureDataCid, SignatureData::InstanceSize(), is_vm_object);
+      RawObject** from = data->from();
+      RawObject** to = data->to();
+      for (RawObject** p = from; p <= to; p++) {
+        *p = d->ReadRef();
+      }
     }
   }
 };
@@ -4446,6 +4525,8 @@
       return new (Z) FunctionSerializationCluster();
     case kClosureDataCid:
       return new (Z) ClosureDataSerializationCluster();
+    case kSignatureDataCid:
+      return new (Z) SignatureDataSerializationCluster();
     case kRedirectionDataCid:
       return new (Z) RedirectionDataSerializationCluster();
     case kFieldCid:
@@ -4810,6 +4891,8 @@
       return new (Z) FunctionDeserializationCluster();
     case kClosureDataCid:
       return new (Z) ClosureDataDeserializationCluster();
+    case kSignatureDataCid:
+      return new (Z) SignatureDataDeserializationCluster();
     case kRedirectionDataCid:
       return new (Z) RedirectionDataDeserializationCluster();
     case kFieldCid:
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index a68cfbf..8ff2deb 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -3539,8 +3539,8 @@
     RETURN_TYPE_ERROR(Z, typed_data, 'TypedData');
   }
   Object& result = Object::Handle(Z);
-  result = GetByteBufferConstructor(T, Symbols::ByteBuffer(),
-                                    Symbols::ByteBufferDot_New(), 1);
+  result = GetByteBufferConstructor(T, Symbols::_ByteBuffer(),
+                                    Symbols::_ByteBufferDot_New(), 1);
   ASSERT(!result.IsNull());
   ASSERT(result.IsFunction());
   const Function& factory = Function::Cast(result);
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index e3963d9..265c308 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -76,12 +76,11 @@
 }
 
 
-#define RECOGNIZE_FACTORY(test_factory_symbol, cid, fp)                        \
-  {Symbols::k##test_factory_symbol##Id, cid, fp,                               \
-   #test_factory_symbol ", " #cid},  // NOLINT
+#define RECOGNIZE_FACTORY(symbol, class_name, constructor_name, cid, fp)       \
+  {Symbols::k##symbol##Id, cid, fp, #symbol ", " #cid},  // NOLINT
 
 static struct {
-  intptr_t symbold_id;
+  intptr_t symbol_id;
   intptr_t cid;
   intptr_t finger_print;
   const char* name;
@@ -98,10 +97,10 @@
          (lib.raw() == Library::TypedDataLibrary()));
   const String& factory_name = String::Handle(factory.name());
   for (intptr_t i = 0;
-       factory_recognizer_list[i].symbold_id != Symbols::kIllegal; i++) {
+       factory_recognizer_list[i].symbol_id != Symbols::kIllegal; i++) {
     if (String::EqualsIgnoringPrivateKey(
             factory_name,
-            Symbols::Symbol(factory_recognizer_list[i].symbold_id))) {
+            Symbols::Symbol(factory_recognizer_list[i].symbol_id))) {
       return factory_recognizer_list[i].cid;
     }
   }
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 6cf0684..f07e7cd 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -2233,15 +2233,13 @@
       }
       case kTypedDataFloat32x4ArrayCid: {
         type_args = flow_graph->constant_null();
-        ASSERT((array_cid != kTypedDataFloat32x4ArrayCid) ||
-               value_type.IsFloat32x4Type());
+        ASSERT(value_type.IsFloat32x4Type());
         ASSERT(value_type.IsInstantiated());
         break;
       }
       case kTypedDataFloat64x2ArrayCid: {
         type_args = flow_graph->constant_null();
-        ASSERT((array_cid != kTypedDataFloat64x2ArrayCid) ||
-               value_type.IsFloat64x2Type());
+        ASSERT(value_type.IsFloat64x2Type());
         ASSERT(value_type.IsInstantiated());
         break;
       }
diff --git a/runtime/vm/gypi_contents.gni b/runtime/vm/gypi_contents.gni
index 403efdf..4ba651e 100644
--- a/runtime/vm/gypi_contents.gni
+++ b/runtime/vm/gypi_contents.gni
@@ -42,6 +42,7 @@
   "../../sdk/lib/math/math_sources.gypi",
   "../../sdk/lib/mirrors/mirrors_sources.gypi",
   "../../sdk/lib/profiler/profiler_sources.gypi",
+  "../../sdk/lib/typed_data/typed_data_sources.gypi",
   "../../sdk/lib/vmservice/vmservice_sources.gypi",
   "../bin/io_sources.gypi",
 ]
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index 043dd70..14410a1 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -57,63 +57,65 @@
     0x46d00995)                                                                \
   V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, Float32x4,     \
     0x685a86d2)                                                                \
-  V(Float32x4, shuffle, Float32x4Shuffle, Float32x4, 0x7829101f)               \
-  V(Float32x4, shuffleMix, Float32x4ShuffleMix, Float32x4, 0x4182c06b)         \
-  V(Float32x4, get:signMask, Float32x4GetSignMask, Dynamic, 0x1d07ca93)        \
-  V(Float32x4, _cmpequal, Float32x4Equal, Int32x4, 0x16ad0fea)                 \
-  V(Float32x4, _cmpgt, Float32x4GreaterThan, Int32x4, 0x0641f613)              \
-  V(Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, Int32x4, 0x464b8ffc)      \
-  V(Float32x4, _cmplt, Float32x4LessThan, Int32x4, 0x3eecd0de)                 \
-  V(Float32x4, _cmplte, Float32x4LessThanOrEqual, Int32x4, 0x06384754)         \
-  V(Float32x4, _cmpnequal, Float32x4NotEqual, Int32x4, 0x2f25ef10)             \
-  V(Float32x4, _min, Float32x4Min, Float32x4, 0x1ee6c750)                      \
-  V(Float32x4, _max, Float32x4Max, Float32x4, 0x4db6bbb4)                      \
-  V(Float32x4, _scale, Float32x4Scale, Float32x4, 0x52052a66)                  \
-  V(Float32x4, _sqrt, Float32x4Sqrt, Float32x4, 0x479f6b4a)                    \
-  V(Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, Float32x4,            \
-    0x6d35bfcf)                                                                \
-  V(Float32x4, _reciprocal, Float32x4Reciprocal, Float32x4, 0x21a56839)        \
-  V(Float32x4, _negate, Float32x4Negate, Float32x4, 0x6cfd5db7)                \
-  V(Float32x4, _abs, Float32x4Absolute, Float32x4, 0x249b8078)                 \
-  V(Float32x4, _clamp, Float32x4Clamp, Float32x4, 0x28b06c7a)                  \
-  V(Float32x4, withX, Float32x4WithX, Float32x4, 0x4e336aff)                   \
-  V(Float32x4, withY, Float32x4WithY, Float32x4, 0x0a72b910)                   \
-  V(Float32x4, withZ, Float32x4WithZ, Float32x4, 0x31e93658)                   \
-  V(Float32x4, withW, Float32x4WithW, Float32x4, 0x60ddc105)                   \
+  V(_Float32x4, shuffle, Float32x4Shuffle, Float32x4, 0x7829101f)              \
+  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, Float32x4, 0x4182c06b)        \
+  V(_Float32x4, get:signMask, Float32x4GetSignMask, Dynamic, 0x1d07ca93)       \
+  V(_Float32x4, equal, Float32x4Equal, Int32x4, 0x11adb239)                    \
+  V(_Float32x4, greaterThan, Float32x4GreaterThan, Int32x4, 0x48adaf58)        \
+  V(_Float32x4, greaterThanOrEqual, Float32x4GreaterThanOrEqual, Int32x4,      \
+    0x32db94ca)                                                                \
+  V(_Float32x4, lessThan, Float32x4LessThan, Int32x4, 0x425b000c)              \
+  V(_Float32x4, lessThanOrEqual, Float32x4LessThanOrEqual, Int32x4,            \
+    0x0278c2f8)                                                                \
+  V(_Float32x4, notEqual, Float32x4NotEqual, Int32x4, 0x2987cd26)              \
+  V(_Float32x4, min, Float32x4Min, Float32x4, 0x5ed74b6f)                      \
+  V(_Float32x4, max, Float32x4Max, Float32x4, 0x68696442)                      \
+  V(_Float32x4, scale, Float32x4Scale, Float32x4, 0x704e4122)                  \
+  V(_Float32x4, sqrt, Float32x4Sqrt, Float32x4, 0x2c967a6f)                    \
+  V(_Float32x4, reciprocalSqrt, Float32x4ReciprocalSqrt, Float32x4,            \
+    0x6264bfe8)                                                                \
+  V(_Float32x4, reciprocal, Float32x4Reciprocal, Float32x4, 0x3cd7e819)        \
+  V(_Float32x4, unary-, Float32x4Negate, Float32x4, 0x34431a14)                \
+  V(_Float32x4, abs, Float32x4Absolute, Float32x4, 0x471cdd87)                 \
+  V(_Float32x4, clamp, Float32x4Clamp, Float32x4, 0x2cb30492)                  \
+  V(_Float32x4, withX, Float32x4WithX, Float32x4, 0x4e336aff)                  \
+  V(_Float32x4, withY, Float32x4WithY, Float32x4, 0x0a72b910)                  \
+  V(_Float32x4, withZ, Float32x4WithZ, Float32x4, 0x31e93658)                  \
+  V(_Float32x4, withW, Float32x4WithW, Float32x4, 0x60ddc105)                  \
   V(Float64x2, Float64x2., Float64x2Constructor, Float64x2, 0x193be61d)        \
   V(Float64x2, Float64x2.zero, Float64x2Zero, Float64x2, 0x7b2ed5df)           \
   V(Float64x2, Float64x2.splat, Float64x2Splat, Float64x2, 0x2abbfcb2)         \
   V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, Float64x2,     \
     0x2f43d3a6)                                                                \
-  V(Float64x2, get:x, Float64x2GetX, Double, 0x58bfb39a)                       \
-  V(Float64x2, get:y, Float64x2GetY, Double, 0x3cf4fcfa)                       \
-  V(Float64x2, _negate, Float64x2Negate, Float64x2, 0x523937da)                \
-  V(Float64x2, abs, Float64x2Abs, Float64x2, 0x031f9e47)                       \
-  V(Float64x2, sqrt, Float64x2Sqrt, Float64x2, 0x77f711dd)                     \
-  V(Float64x2, get:signMask, Float64x2GetSignMask, Dynamic, 0x27ddf18d)        \
-  V(Float64x2, scale, Float64x2Scale, Float64x2, 0x26830a61)                   \
-  V(Float64x2, withX, Float64x2WithX, Float64x2, 0x1d2bcaf5)                   \
-  V(Float64x2, withY, Float64x2WithY, Float64x2, 0x383ed6ac)                   \
-  V(Float64x2, min, Float64x2Min, Float64x2, 0x28d7ddf6)                       \
-  V(Float64x2, max, Float64x2Max, Float64x2, 0x0bd74e5b)                       \
+  V(_Float64x2, get:x, Float64x2GetX, Double, 0x58bfb39a)                      \
+  V(_Float64x2, get:y, Float64x2GetY, Double, 0x3cf4fcfa)                      \
+  V(_Float64x2, unary-, Float64x2Negate, Float64x2, 0x3df2eecb)                \
+  V(_Float64x2, abs, Float64x2Abs, Float64x2, 0x031f9e47)                      \
+  V(_Float64x2, sqrt, Float64x2Sqrt, Float64x2, 0x77f711dd)                    \
+  V(_Float64x2, get:signMask, Float64x2GetSignMask, Dynamic, 0x27ddf18d)       \
+  V(_Float64x2, scale, Float64x2Scale, Float64x2, 0x26830a61)                  \
+  V(_Float64x2, withX, Float64x2WithX, Float64x2, 0x1d2bcaf5)                  \
+  V(_Float64x2, withY, Float64x2WithY, Float64x2, 0x383ed6ac)                  \
+  V(_Float64x2, min, Float64x2Min, Float64x2, 0x28d7ddf6)                      \
+  V(_Float64x2, max, Float64x2Max, Float64x2, 0x0bd74e5b)                      \
   V(Int32x4, Int32x4., Int32x4Constructor, Int32x4, 0x26b199a7)                \
   V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, Int32x4, 0x1b55a5e1)        \
   V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits, Int32x4,     \
     0x7e82564c)                                                                \
-  V(Int32x4, get:flagX, Int32x4GetFlagX, Bool, 0x563883c4)                     \
-  V(Int32x4, get:flagY, Int32x4GetFlagY, Bool, 0x446f5e7a)                     \
-  V(Int32x4, get:flagZ, Int32x4GetFlagZ, Bool, 0x20d61679)                     \
-  V(Int32x4, get:flagW, Int32x4GetFlagW, Bool, 0x504478ac)                     \
-  V(Int32x4, get:signMask, Int32x4GetSignMask, Dynamic, 0x2c1ec9e5)            \
-  V(Int32x4, shuffle, Int32x4Shuffle, Int32x4, 0x20bc0b16)                     \
-  V(Int32x4, shuffleMix, Int32x4ShuffleMix, Int32x4, 0x5c7056e1)               \
-  V(Int32x4, select, Int32x4Select, Float32x4, 0x5c254e86)                     \
-  V(Int32x4, withFlagX, Int32x4WithFlagX, Int32x4, 0x0ef58fcf)                 \
-  V(Int32x4, withFlagY, Int32x4WithFlagY, Int32x4, 0x6485a9c4)                 \
-  V(Int32x4, withFlagZ, Int32x4WithFlagZ, Int32x4, 0x267acdfa)                 \
-  V(Int32x4, withFlagW, Int32x4WithFlagW, Int32x4, 0x345ac675)                 \
-  V(Int64List, [], Int64ArrayGetIndexed, Dynamic, 0x680ec59b)                  \
-  V(Int64List, []=, Int64ArraySetIndexed, Dynamic, 0x0872fc15)                 \
+  V(_Int32x4, get:flagX, Int32x4GetFlagX, Bool, 0x563883c4)                    \
+  V(_Int32x4, get:flagY, Int32x4GetFlagY, Bool, 0x446f5e7a)                    \
+  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, Bool, 0x20d61679)                    \
+  V(_Int32x4, get:flagW, Int32x4GetFlagW, Bool, 0x504478ac)                    \
+  V(_Int32x4, get:signMask, Int32x4GetSignMask, Dynamic, 0x2c1ec9e5)           \
+  V(_Int32x4, shuffle, Int32x4Shuffle, Int32x4, 0x20bc0b16)                    \
+  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, Int32x4, 0x5c7056e1)              \
+  V(_Int32x4, select, Int32x4Select, Float32x4, 0x6b49654f)                    \
+  V(_Int32x4, withFlagX, Int32x4WithFlagX, Int32x4, 0x0ef58fcf)                \
+  V(_Int32x4, withFlagY, Int32x4WithFlagY, Int32x4, 0x6485a9c4)                \
+  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, Int32x4, 0x267acdfa)                \
+  V(_Int32x4, withFlagW, Int32x4WithFlagW, Int32x4, 0x345ac675)                \
+  V(_Int64List, [], Int64ArrayGetIndexed, Dynamic, 0x680ec59b)                 \
+  V(_Int64List, []=, Int64ArraySetIndexed, Dynamic, 0x0872fc15)                \
   V(_Bigint, get:_neg, Bigint_getNeg, Bool, 0x355fa565)                        \
   V(_Bigint, get:_used, Bigint_getUsed, Smi, 0x33b9dcd2)                       \
   V(_Bigint, get:_digits, Bigint_getDigits, TypedDataUint32Array, 0x68de883a)  \
@@ -266,45 +268,45 @@
     TypedDataFloat64x2Array, 0x18cbf4d9)                                       \
 
 #define GRAPH_TYPED_DATA_INTRINSICS_LIST(V)                                    \
-  V(Int8List, [], Int8ArrayGetIndexed, Smi, 0x5f9a4430)                        \
-  V(Int8List, []=, Int8ArraySetIndexed, Dynamic, 0x5f880110)                   \
-  V(Uint8List, [], Uint8ArrayGetIndexed, Smi, 0x1eb150d8)                      \
-  V(Uint8List, []=, Uint8ArraySetIndexed, Dynamic, 0x4cf76981)                 \
+  V(_Int8List, [], Int8ArrayGetIndexed, Smi, 0x5f9a4430)                       \
+  V(_Int8List, []=, Int8ArraySetIndexed, Dynamic, 0x5f880110)                  \
+  V(_Uint8List, [], Uint8ArrayGetIndexed, Smi, 0x1eb150d8)                     \
+  V(_Uint8List, []=, Uint8ArraySetIndexed, Dynamic, 0x4cf76981)                \
   V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, Smi, 0x1eb150d8)    \
   V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, Dynamic,           \
     0x4cf76981)                                                                \
-  V(Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, Smi, 0x1eb150d8)        \
-  V(Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, Dynamic, 0x2224afe1)   \
+  V(_Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, Smi, 0x1eb150d8)       \
+  V(_Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, Dynamic, 0x2224afe1)  \
   V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
     Smi, 0x1eb150d8)                                                           \
   V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
     Dynamic, 0x2224afe1)                                                       \
-  V(Int16List, [], Int16ArrayGetIndexed, Smi, 0x74ea134c)                      \
-  V(Int16List, []=, Int16ArraySetIndexed, Dynamic, 0x48e25661)                 \
-  V(Uint16List, [], Uint16ArrayGetIndexed, Smi, 0x756d9a97)                    \
-  V(Uint16List, []=, Uint16ArraySetIndexed, Dynamic, 0x698f9d4f)               \
-  V(Int32List, [], Int32ArrayGetIndexed, Dynamic, 0x61e49de1)                  \
-  V(Int32List, []=, Int32ArraySetIndexed, Dynamic, 0x55736c63)                 \
-  V(Uint32List, [], Uint32ArrayGetIndexed, Dynamic, 0x2eaa22d2)                \
-  V(Uint32List, []=, Uint32ArraySetIndexed, Dynamic, 0x3c88eeb9)               \
-  V(Float64List, [], Float64ArrayGetIndexed, Double, 0x20950e8a)               \
-  V(Float64List, []=, Float64ArraySetIndexed, Dynamic, 0x556a0727)             \
-  V(Float32List, [], Float32ArrayGetIndexed, Double, 0x7101fa23)               \
-  V(Float32List, []=, Float32ArraySetIndexed, Dynamic, 0x5e32c1eb)             \
-  V(Float32x4List, [], Float32x4ArrayGetIndexed, Float32x4, 0x28b0a7ef)        \
-  V(Float32x4List, []=, Float32x4ArraySetIndexed, Dynamic, 0x4babf032)         \
-  V(Int32x4List, [], Int32x4ArrayGetIndexed, Int32x4, 0x619c79a0)              \
-  V(Int32x4List, []=, Int32x4ArraySetIndexed, Dynamic, 0x021bd16b)             \
-  V(Float64x2List, [], Float64x2ArrayGetIndexed, Float64x2, 0x7a6dd5e5)        \
-  V(Float64x2List, []=, Float64x2ArraySetIndexed, Dynamic, 0x3c59fecb)         \
+  V(_Int16List, [], Int16ArrayGetIndexed, Smi, 0x74ea134c)                     \
+  V(_Int16List, []=, Int16ArraySetIndexed, Dynamic, 0x48e25661)                \
+  V(_Uint16List, [], Uint16ArrayGetIndexed, Smi, 0x756d9a97)                   \
+  V(_Uint16List, []=, Uint16ArraySetIndexed, Dynamic, 0x698f9d4f)              \
+  V(_Int32List, [], Int32ArrayGetIndexed, Dynamic, 0x61e49de1)                 \
+  V(_Int32List, []=, Int32ArraySetIndexed, Dynamic, 0x55736c63)                \
+  V(_Uint32List, [], Uint32ArrayGetIndexed, Dynamic, 0x2eaa22d2)               \
+  V(_Uint32List, []=, Uint32ArraySetIndexed, Dynamic, 0x3c88eeb9)              \
+  V(_Float64List, [], Float64ArrayGetIndexed, Double, 0x20950e8a)              \
+  V(_Float64List, []=, Float64ArraySetIndexed, Dynamic, 0x556a0727)            \
+  V(_Float32List, [], Float32ArrayGetIndexed, Double, 0x7101fa23)              \
+  V(_Float32List, []=, Float32ArraySetIndexed, Dynamic, 0x5e32c1eb)            \
+  V(_Float32x4List, [], Float32x4ArrayGetIndexed, Float32x4, 0x28b0a7ef)       \
+  V(_Float32x4List, []=, Float32x4ArraySetIndexed, Dynamic, 0x4babf032)        \
+  V(_Int32x4List, [], Int32x4ArrayGetIndexed, Int32x4, 0x619c79a0)             \
+  V(_Int32x4List, []=, Int32x4ArraySetIndexed, Dynamic, 0x021bd16b)            \
+  V(_Float64x2List, [], Float64x2ArrayGetIndexed, Float64x2, 0x7a6dd5e5)       \
+  V(_Float64x2List, []=, Float64x2ArraySetIndexed, Dynamic, 0x3c59fecb)        \
   V(_TypedList, get:length, TypedDataLength, Smi, 0x2090dc1a)                  \
-  V(Float32x4, get:x, Float32x4ShuffleX, Double, 0x63d0c13f)                   \
-  V(Float32x4, get:y, Float32x4ShuffleY, Double, 0x20343b1b)                   \
-  V(Float32x4, get:z, Float32x4ShuffleZ, Double, 0x13181dba)                   \
-  V(Float32x4, get:w, Float32x4ShuffleW, Double, 0x69895020)                   \
-  V(Float32x4, _mul, Float32x4Mul, Float32x4, 0x6183ae12)                      \
-  V(Float32x4, _sub, Float32x4Sub, Float32x4, 0x22a8d3ea)                      \
-  V(Float32x4, _add, Float32x4Add, Float32x4, 0x613c30f4)                      \
+  V(_Float32x4, get:x, Float32x4ShuffleX, Double, 0x63d0c13f)                  \
+  V(_Float32x4, get:y, Float32x4ShuffleY, Double, 0x20343b1b)                  \
+  V(_Float32x4, get:z, Float32x4ShuffleZ, Double, 0x13181dba)                  \
+  V(_Float32x4, get:w, Float32x4ShuffleW, Double, 0x69895020)                  \
+  V(_Float32x4, *, Float32x4Mul, Float32x4, 0x0e2a0ef4)                        \
+  V(_Float32x4, -, Float32x4Sub, Float32x4, 0x6edeeaa3)                        \
+  V(_Float32x4, +, Float32x4Add, Float32x4, 0x303a9943)                        \
 
 #define GRAPH_CORE_INTRINSICS_LIST(V)                                          \
   V(_List, get:length, ObjectArrayLength, Smi, 0x25943ad2)                     \
@@ -538,23 +540,30 @@
 
 // clang-format off
 // List of recognized list factories:
-// (factory-name-symbol, result-cid, fingerprint).
+// (factory-name-symbol, class-name-string, constructor-name-string,
+//  result-cid, fingerprint).
 #define RECOGNIZED_LIST_FACTORY_LIST(V)                                        \
-  V(_ListFactory, kArrayCid, 0x375519ad)                                       \
-  V(_GrowableListWithData, kGrowableObjectArrayCid, 0x401f3150)                \
-  V(_GrowableListFactory, kGrowableObjectArrayCid, 0x0b8d9feb)                 \
-  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 0x2e7749e3)                     \
-  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 0x6ab75439)                   \
-  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 0x183129d7)     \
-  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 0x14b563ea)                   \
-  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 0x07456be4)                 \
-  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 0x5bd49250)                   \
-  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 0x3c59b3a4)                 \
-  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 0x57d85ac7)                   \
-  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 0x2c093004)                 \
-  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 0x501be4f1)               \
-  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 0x738e124b)               \
-  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 0x7a7dd718)
+  V(_ListFactory, _List, ., kArrayCid, 0x375519ad)                             \
+  V(_GrowableListWithData, _GrowableList, .withData, kGrowableObjectArrayCid,  \
+    0x401f3150)                                                                \
+  V(_GrowableListFactory, _GrowableList, ., kGrowableObjectArrayCid,           \
+    0x0b8d9feb)                                                                \
+  V(_Int8ArrayFactory, Int8List, ., kTypedDataInt8ArrayCid, 0x2e7749e3)        \
+  V(_Uint8ArrayFactory, Uint8List, ., kTypedDataUint8ArrayCid, 0x6ab75439)     \
+  V(_Uint8ClampedArrayFactory, Uint8ClampedList, .,                            \
+    kTypedDataUint8ClampedArrayCid, 0x183129d7)                                \
+  V(_Int16ArrayFactory, Int16List, ., kTypedDataInt16ArrayCid, 0x14b563ea)     \
+  V(_Uint16ArrayFactory, Uint16List, ., kTypedDataUint16ArrayCid, 0x07456be4)  \
+  V(_Int32ArrayFactory, Int32List, ., kTypedDataInt32ArrayCid, 0x5bd49250)     \
+  V(_Uint32ArrayFactory, Uint32List, ., kTypedDataUint32ArrayCid, 0x3c59b3a4)  \
+  V(_Int64ArrayFactory, Int64List, ., kTypedDataInt64ArrayCid, 0x57d85ac7)     \
+  V(_Uint64ArrayFactory, Uint64List, ., kTypedDataUint64ArrayCid, 0x2c093004)  \
+  V(_Float64ArrayFactory, Float64List, ., kTypedDataFloat64ArrayCid,           \
+    0x501be4f1)                                                                \
+  V(_Float32ArrayFactory, Float32List, ., kTypedDataFloat32ArrayCid,           \
+    0x738e124b)                                                                \
+  V(_Float32x4ArrayFactory, Float32x4List, ., kTypedDataFloat32x4ArrayCid,     \
+    0x7a7dd718)
 
 // clang-format on
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 14a9b63..fd81fee 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -142,6 +142,7 @@
 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+RawClass* Object::signature_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::redirection_data_class_ =
     reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
@@ -631,6 +632,9 @@
   cls = Class::New<ClosureData>();
   closure_data_class_ = cls.raw();
 
+  cls = Class::New<SignatureData>();
+  signature_data_class_ = cls.raw();
+
   cls = Class::New<RedirectionData>();
   redirection_data_class_ = cls.raw();
 
@@ -999,6 +1003,7 @@
   SET_CLASS_NAME(patch_class, PatchClass);
   SET_CLASS_NAME(function, Function);
   SET_CLASS_NAME(closure_data, ClosureData);
+  SET_CLASS_NAME(signature_data, SignatureData);
   SET_CLASS_NAME(redirection_data, RedirectionData);
   SET_CLASS_NAME(field, Field);
   SET_CLASS_NAME(literal_token, LiteralToken);
@@ -1505,7 +1510,7 @@
     ASSERT(lib.raw() == Library::TypedDataLibrary());
 #define REGISTER_TYPED_DATA_CLASS(clazz)                                       \
   cls = Class::NewTypedDataClass(kTypedData##clazz##ArrayCid);                 \
-  RegisterClass(cls, Symbols::clazz##List(), lib);
+  RegisterPrivateClass(cls, Symbols::clazz##List(), lib);
 
     DART_CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS);
 #undef REGISTER_TYPED_DATA_CLASS
@@ -1526,39 +1531,48 @@
     cls = Class::New<Instance>(kByteBufferCid);
     cls.set_instance_size(0);
     cls.set_next_field_offset(-kWordSize);
-    RegisterClass(cls, Symbols::ByteBuffer(), lib);
+    RegisterPrivateClass(cls, Symbols::_ByteBuffer(), lib);
     pending_classes.Add(cls);
 
     CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS);
 #undef REGISTER_EXT_TYPED_DATA_CLASS
-    // Register Float32x4 and Int32x4 in the object store.
+    // Register Float32x4, Int32x4, and Float64x2 in the object store.
     cls = Class::New<Float32x4>();
+    RegisterPrivateClass(cls, Symbols::_Float32x4(), lib);
+    pending_classes.Add(cls);
+    object_store->set_float32x4_class(cls);
+
+    cls = Class::New<Instance>(kIllegalCid);
     RegisterClass(cls, Symbols::Float32x4(), lib);
     cls.set_num_type_arguments(0);
     cls.set_num_own_type_arguments(0);
     cls.set_is_prefinalized();
-    pending_classes.Add(cls);
-    object_store->set_float32x4_class(cls);
     type = Type::NewNonParameterizedType(cls);
     object_store->set_float32x4_type(type);
 
     cls = Class::New<Int32x4>();
+    RegisterPrivateClass(cls, Symbols::_Int32x4(), lib);
+    pending_classes.Add(cls);
+    object_store->set_int32x4_class(cls);
+
+    cls = Class::New<Instance>(kIllegalCid);
     RegisterClass(cls, Symbols::Int32x4(), lib);
     cls.set_num_type_arguments(0);
     cls.set_num_own_type_arguments(0);
     cls.set_is_prefinalized();
-    pending_classes.Add(cls);
-    object_store->set_int32x4_class(cls);
     type = Type::NewNonParameterizedType(cls);
     object_store->set_int32x4_type(type);
 
     cls = Class::New<Float64x2>();
+    RegisterPrivateClass(cls, Symbols::_Float64x2(), lib);
+    pending_classes.Add(cls);
+    object_store->set_float64x2_class(cls);
+
+    cls = Class::New<Instance>(kIllegalCid);
     RegisterClass(cls, Symbols::Float64x2(), lib);
     cls.set_num_type_arguments(0);
     cls.set_num_own_type_arguments(0);
     cls.set_is_prefinalized();
-    pending_classes.Add(cls);
-    object_store->set_float64x2_class(cls);
     type = Type::NewNonParameterizedType(cls);
     object_store->set_float64x2_type(type);
 
@@ -3367,6 +3381,8 @@
       return Symbols::Function().raw();
     case kClosureDataCid:
       return Symbols::ClosureData().raw();
+    case kSignatureDataCid:
+      return Symbols::SignatureData().raw();
     case kRedirectionDataCid:
       return Symbols::RedirectionData().raw();
     case kFieldCid:
@@ -5437,15 +5453,13 @@
 
 
 RawFunction* Function::parent_function() const {
-  if (IsClosureFunction()) {
+  if (IsClosureFunction() || IsSignatureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
     ASSERT(!obj.IsNull());
-    return ClosureData::Cast(obj).parent_function();
-  } else if (IsSignatureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
-    // Parent function may be null or data_ may already be set to function type.
-    if (!obj.IsNull() && obj.IsFunction()) {
-      return Function::Cast(obj).raw();
+    if (IsClosureFunction()) {
+      return ClosureData::Cast(obj).parent_function();
+    } else {
+      return SignatureData::Cast(obj).parent_function();
     }
   }
   return Function::null();
@@ -5453,16 +5467,14 @@
 
 
 void Function::set_parent_function(const Function& value) const {
+  const Object& obj = Object::Handle(raw_ptr()->data_);
+  ASSERT(!obj.IsNull());
   if (IsClosureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
-    ASSERT(!obj.IsNull());
     ClosureData::Cast(obj).set_parent_function(value);
-    return;
-  } else if (IsSignatureFunction()) {
-    set_data(value);  // Temporarily set during parsing only.
-    return;
+  } else {
+    ASSERT(IsSignatureFunction());
+    SignatureData::Cast(obj).set_parent_function(value);
   }
-  UNREACHABLE();
 }
 
 
@@ -5502,12 +5514,11 @@
 RawType* Function::SignatureType() const {
   Type& type = Type::Handle();
   const Object& obj = Object::Handle(raw_ptr()->data_);
+  ASSERT(!obj.IsNull());
   if (IsSignatureFunction()) {
-    ASSERT(obj.IsNull() || Type::Cast(obj).IsFunctionType());
-    type = obj.IsNull() ? Type::null() : Type::Cast(obj).raw();
+    type = SignatureData::Cast(obj).signature_type();
   } else {
     ASSERT(IsClosureFunction());
-    ASSERT(!obj.IsNull());
     type = ClosureData::Cast(obj).signature_type();
   }
   if (type.IsNull()) {
@@ -5548,12 +5559,12 @@
 
 
 void Function::SetSignatureType(const Type& value) const {
+  const Object& obj = Object::Handle(raw_ptr()->data_);
+  ASSERT(!obj.IsNull());
   if (IsSignatureFunction()) {
-    set_data(value);
+    SignatureData::Cast(obj).set_signature_type(value);
   } else {
     ASSERT(IsClosureFunction());
-    const Object& obj = Object::Handle(raw_ptr()->data_);
-    ASSERT(!obj.IsNull());
     ClosureData::Cast(obj).set_signature_type(value);
   }
 }
@@ -5676,7 +5687,7 @@
 
 // This field is heavily overloaded:
 //   eval function:           Script expression source
-//   signature function:      Function type
+//   signature function:      SignatureData
 //   method extractor:        Function extracted closure function
 //   noSuchMethod dispatcher: Array arguments descriptor
 //   invoke-field dispatcher: Array arguments descriptor
@@ -6547,6 +6558,9 @@
   if (kind == RawFunction::kClosureFunction) {
     const ClosureData& data = ClosureData::Handle(ClosureData::New());
     result.set_data(data);
+  } else if (kind == RawFunction::kSignatureFunction) {
+    const SignatureData& data = SignatureData::Handle(SignatureData::New());
+    result.set_data(data);
   }
   return result.raw();
 }
@@ -6840,6 +6854,28 @@
 }
 
 
+RawSmi* Function::GetClosureHashCode() const {
+  ASSERT(IsClosureFunction());
+  const Object& obj = Object::Handle(raw_ptr()->data_);
+  ASSERT(!obj.IsNull());
+  if (ClosureData::Cast(obj).hash() != Object::null()) {
+    return Smi::RawCast(ClosureData::Cast(obj).hash());
+  }
+  // Hash not yet computed. Compute and cache it.
+  const Class& cls = Class::Handle(Owner());
+  intptr_t result = String::Handle(name()).Hash();
+  result += String::Handle(Signature()).Hash();
+  result += String::Handle(cls.Name()).Hash();
+  // Finalize hash value like for strings so that it fits into a smi.
+  result += result << 3;
+  result ^= result >> 11;
+  result += result << 15;
+  result &= ((static_cast<intptr_t>(1) << String::kHashBits) - 1);
+  ClosureData::Cast(obj).set_hash(result);
+  return Smi::New(result);
+}
+
+
 RawString* Function::BuildSignature(bool instantiate,
                                     NameVisibility name_visibility,
                                     const TypeArguments& instantiator) const {
@@ -7216,6 +7252,11 @@
 }
 
 
+void ClosureData::set_hash(intptr_t value) const {
+  StorePointer(&raw_ptr()->hash_, static_cast<RawObject*>(Smi::New(value)));
+}
+
+
 void ClosureData::set_parent_function(const Function& value) const {
   StorePointer(&raw_ptr()->parent_function_, value.raw());
 }
@@ -7235,7 +7276,65 @@
 
 
 const char* ClosureData::ToCString() const {
-  return "ClosureData class";
+  if (IsNull()) {
+    return "ClosureData: null";
+  }
+  const Function& parent = Function::Handle(parent_function());
+  const Type& type = Type::Handle(signature_type());
+  return OS::SCreate(Thread::Current()->zone(),
+                     "ClosureData: context_scope: 0x%" Px
+                     " parent_function: %s signature_type: %s"
+                     " implicit_static_closure: 0x%" Px,
+                     reinterpret_cast<uword>(context_scope()),
+                     parent.IsNull() ? "null" : parent.ToCString(),
+                     type.IsNull() ? "null" : type.ToCString(),
+                     reinterpret_cast<uword>(implicit_static_closure()));
+}
+
+
+void SignatureData::set_parent_function(const Function& value) const {
+  StorePointer(&raw_ptr()->parent_function_, value.raw());
+}
+
+
+void SignatureData::set_signature_type(const Type& value) const {
+  StorePointer(&raw_ptr()->signature_type_, value.raw());
+  // If the signature type is resolved, the parent function is not needed
+  // anymore (type parameters may be declared by generic parent functions).
+  // Keeping the parent function can unnecessarily pull more objects into a
+  // snapshot. Also, the parent function is meaningless once the signature type
+  // is canonicalized.
+
+// TODO(rmacnak): Keeping the parent function for unresolved signature types
+// is causing a tree shaking issue in AOT. Please, investigate.
+#if 0
+  if (value.IsResolved()) {
+    set_parent_function(Function::Handle());
+  }
+#else
+  set_parent_function(Function::Handle());
+#endif
+}
+
+
+RawSignatureData* SignatureData::New() {
+  ASSERT(Object::signature_data_class() != Class::null());
+  RawObject* raw = Object::Allocate(SignatureData::kClassId,
+                                    SignatureData::InstanceSize(), Heap::kOld);
+  return reinterpret_cast<RawSignatureData*>(raw);
+}
+
+
+const char* SignatureData::ToCString() const {
+  if (IsNull()) {
+    return "SignatureData: null";
+  }
+  const Function& parent = Function::Handle(parent_function());
+  const Type& type = Type::Handle(signature_type());
+  return OS::SCreate(Thread::Current()->zone(),
+                     "SignatureData parent_function: %s signature_type: %s",
+                     parent.IsNull() ? "null" : parent.ToCString(),
+                     type.IsNull() ? "null" : type.ToCString());
 }
 
 
@@ -7264,7 +7363,17 @@
 
 
 const char* RedirectionData::ToCString() const {
-  return "RedirectionData class";
+  if (IsNull()) {
+    return "RedirectionData: null";
+  }
+  const Type& redir_type = Type::Handle(type());
+  const String& ident = String::Handle(identifier());
+  const Function& target_fun = Function::Handle(target());
+  return OS::SCreate(Thread::Current()->zone(),
+                     "RedirectionData: type: %s identifier: %s target: %s",
+                     redir_type.IsNull() ? "null" : redir_type.ToCString(),
+                     ident.IsNull() ? "null" : ident.ToCString(),
+                     target_fun.IsNull() ? "null" : target_fun.ToCString());
 }
 
 
@@ -7594,7 +7703,7 @@
 
 const char* Field::ToCString() const {
   if (IsNull()) {
-    return "Field::null";
+    return "Field: null";
   }
   const char* kF0 = is_static() ? " static" : "";
   const char* kF1 = is_final() ? " final" : "";
@@ -11508,19 +11617,16 @@
 #undef CHECK_FINGERPRINTS2
 
 
-  Class& cls = Class::Handle();
-
-#define CHECK_FACTORY_FINGERPRINTS(factory_symbol, cid, fp)                    \
-  cls = Isolate::Current()->class_table()->At(cid);                            \
-  func = cls.LookupFunctionAllowPrivate(Symbols::factory_symbol());            \
+#define CHECK_FACTORY_FINGERPRINTS(symbol, class_name, factory_name, cid, fp)  \
+  func = GetFunction(all_libs, #class_name, #factory_name);                    \
   if (func.IsNull()) {                                                         \
     has_errors = true;                                                         \
-    OS::Print("Function not found %s.%s\n", cls.ToCString(),                   \
-              Symbols::factory_symbol().ToCString());                          \
+    OS::Print("Function not found %s.%s\n", #class_name, #factory_name);       \
   } else {                                                                     \
-    CHECK_FINGERPRINT2(func, factory_symbol, cid, fp);                         \
+    CHECK_FINGERPRINT2(func, symbol, cid, fp);                                 \
   }
 
+  all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
   RECOGNIZED_LIST_FACTORY_LIST(CHECK_FACTORY_FINGERPRINTS);
 
 #undef CHECK_FACTORY_FINGERPRINTS
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index f3a4d29..2c62d62 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -488,6 +488,7 @@
   static RawClass* patch_class_class() { return patch_class_class_; }
   static RawClass* function_class() { return function_class_; }
   static RawClass* closure_data_class() { return closure_data_class_; }
+  static RawClass* signature_data_class() { return signature_data_class_; }
   static RawClass* redirection_data_class() { return redirection_data_class_; }
   static RawClass* field_class() { return field_class_; }
   static RawClass* literal_token_class() { return literal_token_class_; }
@@ -745,6 +746,7 @@
   static RawClass* patch_class_class_;     // Class of the PatchClass vm object.
   static RawClass* function_class_;        // Class of the Function vm object.
   static RawClass* closure_data_class_;    // Class of ClosureData vm obj.
+  static RawClass* signature_data_class_;  // Class of SignatureData vm obj.
   static RawClass* redirection_data_class_;  // Class of RedirectionData vm obj.
   static RawClass* field_class_;             // Class of the Field vm object.
   static RawClass* literal_token_class_;     // Class of LiteralToken vm object.
@@ -2345,6 +2347,8 @@
 
   RawInstance* ImplicitInstanceClosure(const Instance& receiver) const;
 
+  RawSmi* GetClosureHashCode() const;
+
   // Redirection information for a redirecting factory.
   bool IsRedirectingFactory() const;
   RawType* RedirectionType() const;
@@ -3013,6 +3017,9 @@
   RawInstance* implicit_static_closure() const { return raw_ptr()->closure_; }
   void set_implicit_static_closure(const Instance& closure) const;
 
+  RawObject* hash() const { return raw_ptr()->hash_; }
+  void set_hash(intptr_t value) const;
+
   static RawClosureData* New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object);
@@ -3022,6 +3029,30 @@
 };
 
 
+class SignatureData : public Object {
+ public:
+  static intptr_t InstanceSize() {
+    return RoundedAllocationSize(sizeof(RawSignatureData));
+  }
+
+ private:
+  // Enclosing function of this signature function.
+  RawFunction* parent_function() const { return raw_ptr()->parent_function_; }
+  void set_parent_function(const Function& value) const;
+
+  // Signature type of this signature function.
+  RawType* signature_type() const { return raw_ptr()->signature_type_; }
+  void set_signature_type(const Type& value) const;
+
+  static RawSignatureData* New();
+
+  FINAL_HEAP_OBJECT_IMPLEMENTATION(SignatureData, Object);
+  friend class Class;
+  friend class Function;
+  friend class HeapProfiler;
+};
+
+
 class RedirectionData : public Object {
  public:
   static intptr_t InstanceSize() {
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 93dfce9..99e1157 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -1482,6 +1482,11 @@
 }
 
 
+void SignatureData::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
+}
+
+
 void Closure::PrintJSONImpl(JSONStream* stream, bool ref) const {
   Instance::PrintJSONImpl(stream, ref);
 }
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 9b87e85..802c472 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -2089,7 +2089,6 @@
 
       ASSERT(innermost_function().raw() == signature_function.raw());
       innermost_function_ = signature_function.parent_function();
-      signature_function.set_data(Object::Handle(Z));
 
       Type& signature_type =
           Type::ZoneHandle(Z, signature_function.SignatureType());
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
index e45c04c..d190d5a 100644
--- a/runtime/vm/precompiler.cc
+++ b/runtime/vm/precompiler.cc
@@ -678,7 +678,7 @@
     {"dart:isolate", "_SendPortImpl", "send"},
     {"dart:typed_data", "ByteData", "ByteData."},
     {"dart:typed_data", "ByteData", "ByteData._view"},
-    {"dart:typed_data", "ByteBuffer", "ByteBuffer._New"},
+    {"dart:typed_data", "_ByteBuffer", "_ByteBuffer._New"},
     {"dart:_vmservice", "::", "_registerIsolate"},
     {"dart:_vmservice", "::", "boot"},
 #if !defined(PRODUCT)
@@ -2959,7 +2959,13 @@
   ASSERT(pending_functions_.Length() == 0);
   sent_selectors_.Clear();
   enqueued_functions_.Clear();
+
+  classes_to_retain_.Clear();
   consts_to_retain_.Clear();
+  fields_to_retain_.Clear();
+  functions_to_retain_.Clear();
+  typeargs_to_retain_.Clear();
+  types_to_retain_.Clear();
 
   Library& lib = Library::Handle(Z);
   Class& cls = Class::Handle(Z);
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index a150c30..dce810e 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -994,7 +994,7 @@
       Library::Handle(isolate->object_store()->typed_data_library());
 
   const Class& float32_list_class =
-      Class::Handle(GetClass(typed_data_library, "Float32List"));
+      Class::Handle(GetClass(typed_data_library, "_Float32List"));
   EXPECT(!float32_list_class.IsNull());
 
   Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 79a6193..f4a1bc1 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -393,6 +393,14 @@
 }
 
 
+intptr_t RawSignatureData::VisitSignatureDataPointers(
+    RawSignatureData* raw_obj,
+    ObjectPointerVisitor* visitor) {
+  visitor->VisitPointers(raw_obj->from(), raw_obj->to());
+  return SignatureData::InstanceSize();
+}
+
+
 intptr_t RawRedirectionData::VisitRedirectionDataPointers(
     RawRedirectionData* raw_obj,
     ObjectPointerVisitor* visitor) {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 7c97320..f43b12e 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -22,6 +22,7 @@
   V(PatchClass)                                                                \
   V(Function)                                                                  \
   V(ClosureData)                                                               \
+  V(SignatureData)                                                             \
   V(RedirectionData)                                                           \
   V(Field)                                                                     \
   V(LiteralToken)                                                              \
@@ -861,7 +862,28 @@
   RawFunction* parent_function_;  // Enclosing function of this local function.
   RawType* signature_type_;
   RawInstance* closure_;  // Closure object for static implicit closures.
-  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->closure_); }
+  RawObject** to_snapshot() {
+    return reinterpret_cast<RawObject**>(&ptr()->closure_);
+  }
+  RawObject* hash_;
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->hash_); }
+
+  friend class Function;
+};
+
+
+class RawSignatureData : public RawObject {
+ private:
+  RAW_HEAP_OBJECT_IMPLEMENTATION(SignatureData);
+
+  RawObject** from() {
+    return reinterpret_cast<RawObject**>(&ptr()->parent_function_);
+  }
+  RawFunction* parent_function_;  // Enclosing function of this sig. function.
+  RawType* signature_type_;
+  RawObject** to() {
+    return reinterpret_cast<RawObject**>(&ptr()->signature_type_);
+  }
 
   friend class Function;
 };
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 11ab304..77f0576 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -590,7 +590,8 @@
   reader->AddBackRef(object_id, &data, kIsDeserialized);
 
   // Set all the object fields.
-  READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(),
+  // Cached hash is null-initialized by ClosureData::New()
+  READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to_snapshot(),
                      kAsInlinedObject);
 
   return data.raw();
@@ -632,6 +633,47 @@
 }
 
 
+RawSignatureData* SignatureData::ReadFrom(SnapshotReader* reader,
+                                          intptr_t object_id,
+                                          intptr_t tags,
+                                          Snapshot::Kind kind,
+                                          bool as_reference) {
+  ASSERT(reader != NULL);
+  ASSERT(kind == Snapshot::kScript);
+
+  // Allocate signature data object.
+  SignatureData& data =
+      SignatureData::ZoneHandle(reader->zone(), SignatureData::New());
+  reader->AddBackRef(object_id, &data, kIsDeserialized);
+
+  // Set all the object fields.
+  READ_OBJECT_FIELDS(data, data.raw()->from(), data.raw()->to(),
+                     kAsInlinedObject);
+
+  return data.raw();
+}
+
+
+void RawSignatureData::WriteTo(SnapshotWriter* writer,
+                               intptr_t object_id,
+                               Snapshot::Kind kind,
+                               bool as_reference) {
+  ASSERT(writer != NULL);
+  ASSERT(kind == Snapshot::kScript);
+
+  // Write out the serialization header value for this object.
+  writer->WriteInlinedObjectHeader(object_id);
+
+  // Write out the class and tags information.
+  writer->WriteVMIsolateObject(kSignatureDataCid);
+  writer->WriteTags(writer->GetObjectTags(this));
+
+  // Write out all the object pointer fields.
+  SnapshotWriterVisitor visitor(writer, kAsInlinedObject);
+  visitor.VisitPointers(from(), to());
+}
+
+
 RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader,
                                               intptr_t object_id,
                                               intptr_t tags,
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index b3c087d..76f48a6 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -77,6 +77,7 @@
 class RawReceivePort;
 class RawRedirectionData;
 class RawScript;
+class RawSignatureData;
 class RawSendPort;
 class RawSmi;
 class RawStackMap;
@@ -542,6 +543,7 @@
   friend class PatchClass;
   friend class RedirectionData;
   friend class Script;
+  friend class SignatureData;
   friend class SubtypeTestCache;
   friend class TokenStream;
   friend class Type;
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index f03f209..30f7f90 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -156,6 +156,7 @@
   V(FunctionResult, "function result")                                         \
   V(FactoryResult, "factory result")                                           \
   V(ClosureData, "ClosureData")                                                \
+  V(SignatureData, "SignatureData")                                            \
   V(RedirectionData, "RedirectionData")                                        \
   V(Field, "Field")                                                            \
   V(LiteralToken, "LiteralToken")                                              \
@@ -217,20 +218,23 @@
   V(Float32x4, "Float32x4")                                                    \
   V(Float64x2, "Float64x2")                                                    \
   V(Int32x4, "Int32x4")                                                        \
-  V(Int8List, "Int8List")                                                      \
-  V(Uint8List, "Uint8List")                                                    \
-  V(Uint8ClampedList, "Uint8ClampedList")                                      \
-  V(Int16List, "Int16List")                                                    \
-  V(Uint16List, "Uint16List")                                                  \
-  V(Int32List, "Int32List")                                                    \
-  V(Uint32List, "Uint32List")                                                  \
-  V(Int64List, "Int64List")                                                    \
-  V(Uint64List, "Uint64List")                                                  \
-  V(Float32x4List, "Float32x4List")                                            \
-  V(Int32x4List, "Int32x4List")                                                \
-  V(Float64x2List, "Float64x2List")                                            \
-  V(Float32List, "Float32List")                                                \
-  V(Float64List, "Float64List")                                                \
+  V(_Float32x4, "_Float32x4")                                                  \
+  V(_Float64x2, "_Float64x2")                                                  \
+  V(_Int32x4, "_Int32x4")                                                      \
+  V(Int8List, "_Int8List")                                                     \
+  V(Uint8List, "_Uint8List")                                                   \
+  V(Uint8ClampedList, "_Uint8ClampedList")                                     \
+  V(Int16List, "_Int16List")                                                   \
+  V(Uint16List, "_Uint16List")                                                 \
+  V(Int32List, "_Int32List")                                                   \
+  V(Uint32List, "_Uint32List")                                                 \
+  V(Int64List, "_Int64List")                                                   \
+  V(Uint64List, "_Uint64List")                                                 \
+  V(Float32x4List, "_Float32x4List")                                           \
+  V(Int32x4List, "_Int32x4List")                                               \
+  V(Float64x2List, "_Float64x2List")                                           \
+  V(Float32List, "_Float32List")                                               \
+  V(Float64List, "_Float64List")                                               \
   V(_Int8ArrayFactory, "Int8List.")                                            \
   V(_Uint8ArrayFactory, "Uint8List.")                                          \
   V(_Uint8ClampedArrayFactory, "Uint8ClampedList.")                            \
@@ -277,8 +281,8 @@
   V(ByteDataDot, "ByteData.")                                                  \
   V(ByteDataDot_view, "ByteData._view")                                        \
   V(_ByteDataView, "_ByteDataView")                                            \
-  V(ByteBuffer, "ByteBuffer")                                                  \
-  V(ByteBufferDot_New, "ByteBuffer._New")                                      \
+  V(_ByteBuffer, "_ByteBuffer")                                                \
+  V(_ByteBufferDot_New, "_ByteBuffer._New")                                    \
   V(_WeakProperty, "_WeakProperty")                                            \
   V(_MirrorReference, "_MirrorReference")                                      \
   V(FreeListElement, "FreeListElement")                                        \
diff --git a/runtime/vm/virtual_memory.cc b/runtime/vm/virtual_memory.cc
index 1e62f8b..93e3b84 100644
--- a/runtime/vm/virtual_memory.cc
+++ b/runtime/vm/virtual_memory.cc
@@ -20,7 +20,7 @@
   ASSERT(new_size <= size());
   if (try_unmap &&
       (reserved_size_ == size()) && /* Don't create holes in reservation. */
-      FreeSubSegment(reinterpret_cast<void*>(start() + new_size),
+      FreeSubSegment(handle(), reinterpret_cast<void*>(start() + new_size),
                      size() - new_size)) {
     reserved_size_ = new_size;
   }
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h
index a26b8ce7..baa714d 100644
--- a/runtime/vm/virtual_memory.h
+++ b/runtime/vm/virtual_memory.h
@@ -73,7 +73,7 @@
 
   // Free a sub segment. On operating systems that support it this
   // can give back the virtual memory to the system. Returns true on success.
-  static bool FreeSubSegment(void* address, intptr_t size);
+  static bool FreeSubSegment(int32_t handle, void* address, intptr_t size);
 
   // This constructor is only used internally when reserving new virtual spaces.
   // It does not reserve any virtual address space on its own.
diff --git a/runtime/vm/virtual_memory_android.cc b/runtime/vm/virtual_memory_android.cc
index 7406d22..bae5a82 100644
--- a/runtime/vm/virtual_memory_android.cc
+++ b/runtime/vm/virtual_memory_android.cc
@@ -60,7 +60,9 @@
 }
 
 
-bool VirtualMemory::FreeSubSegment(void* address, intptr_t size) {
+bool VirtualMemory::FreeSubSegment(int32_t handle,
+                                   void* address,
+                                   intptr_t size) {
   unmap(address, size);
   return true;
 }
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index bfbac54..0e627ec 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -7,13 +7,27 @@
 
 #include "vm/virtual_memory.h"
 
+#include <magenta/status.h>
 #include <magenta/syscalls.h>
-#include <unistd.h>  // NOLINT
+#include <sys/mman.h>
+#include <unistd.h>
 
 #include "platform/assert.h"
+#include "vm/isolate.h"
 #include "vm/memory_region.h"
 #include "vm/os.h"
 
+// #define VIRTUAL_MEMORY_LOGGING 1
+#if defined(VIRTUAL_MEMORY_LOGGING)
+#define LOG_ERR(msg, ...)                                                      \
+  OS::PrintErr("VMVM: %s:%d: " msg, __FILE__, __LINE__, ##__VA_ARGS__)
+#define LOG_INFO(msg, ...)                                                     \
+  OS::Print("VMVM: %s:%d: " msg, __FILE__, __LINE__, ##__VA_ARGS__)
+#else
+#define LOG_ERR(msg, ...)
+#define LOG_INFO(msg, ...)
+#endif  // defined(VIRTUAL_MEMORY_LOGGING)
+
 namespace dart {
 
 uword VirtualMemory::page_size_ = 0;
@@ -25,65 +39,86 @@
 
 
 VirtualMemory* VirtualMemory::ReserveInternal(intptr_t size) {
-  mx_handle_t vmo = MX_HANDLE_INVALID;
-  mx_status_t status = mx_vmo_create(size, 0u, &vmo);
+  mx_handle_t vmar = MX_HANDLE_INVALID;
+  uword addr = 0;
+  const uint32_t flags = MX_VM_FLAG_COMPACT | MX_VM_FLAG_CAN_MAP_SPECIFIC |
+                         MX_VM_FLAG_CAN_MAP_READ | MX_VM_FLAG_CAN_MAP_WRITE |
+                         MX_VM_FLAG_CAN_MAP_EXECUTE;
+  mx_status_t status =
+      mx_vmar_allocate(mx_vmar_root_self(), 0, size, flags, &vmar, &addr);
   if (status != NO_ERROR) {
-    return NULL;
-  }
-
-  // TODO(zra): map with PERM_NONE, when that works, and relax with
-  // Commit and Protect when they are implemented.
-  // Issue MG-161.
-  const int prot =
-      MX_VM_FLAG_PERM_READ | MX_VM_FLAG_PERM_WRITE | MX_VM_FLAG_PERM_EXECUTE;
-  uintptr_t addr;
-  status = mx_vmar_map(mx_vmar_root_self(), 0, vmo, 0, size, prot, &addr);
-  if (status != NO_ERROR) {
-    mx_handle_close(vmo);
-    FATAL("VirtualMemory::ReserveInternal FAILED");
+    LOG_ERR("mx_vmar_allocate(size = %ld) failed: %s\n", size,
+            mx_status_get_string(status));
     return NULL;
   }
 
   MemoryRegion region(reinterpret_cast<void*>(addr), size);
-  return new VirtualMemory(region, vmo);
+  return new VirtualMemory(region, vmar);
 }
 
 
 VirtualMemory::~VirtualMemory() {
   if (!embedder_allocated()) {
-    // TODO(zra): Use reserved_size_.
-    // Issue MG-162.
-    uintptr_t addr = reinterpret_cast<uintptr_t>(address());
-    mx_status_t status =
-        mx_vmar_unmap(mx_vmar_root_self(), addr, 0 /*reserved_size_*/);
+    mx_handle_t vmar = static_cast<mx_handle_t>(handle());
+    mx_status_t status = mx_vmar_destroy(vmar);
     if (status != NO_ERROR) {
-      FATAL("VirtualMemory::~VirtualMemory: unamp FAILED");
+      LOG_ERR("mx_vmar_destroy failed: %s\n", mx_status_get_string(status));
     }
-
-    status = mx_handle_close(handle());
+    status = mx_handle_close(vmar);
     if (status != NO_ERROR) {
-      FATAL("VirtualMemory::~VirtualMemory: handle_close FAILED");
+      LOG_ERR("mx_handle_close failed: %s\n", mx_status_get_string(status));
     }
   }
 }
 
 
-bool VirtualMemory::FreeSubSegment(void* address, intptr_t size) {
-  // TODO(zra): It should be possible to free a subsegment after
-  // Issue MG-162 is addressed.
-  return false;
+bool VirtualMemory::FreeSubSegment(int32_t handle,
+                                   void* address,
+                                   intptr_t size) {
+  mx_handle_t vmar = static_cast<mx_handle_t>(handle);
+  mx_status_t status =
+      mx_vmar_unmap(vmar, reinterpret_cast<uintptr_t>(address), size);
+  if (status != NO_ERROR) {
+    LOG_ERR("mx_vmar_unmap failed: %s\n", mx_status_get_string(status));
+    return false;
+  }
+  return true;
 }
 
 
 bool VirtualMemory::Commit(uword addr, intptr_t size, bool executable) {
-  // TODO(zra): Implement when the protections for a mapping can be changed.
-  // Issue MG-133.
+  ASSERT(Contains(addr));
+  ASSERT(Contains(addr + size) || (addr + size == end()));
+  mx_handle_t vmo = MX_HANDLE_INVALID;
+  mx_status_t status = mx_vmo_create(size, 0u, &vmo);
+  if (status != NO_ERROR) {
+    LOG_ERR("mx_vmo_create(%ld) failed: %s\n", size,
+            mx_status_get_string(status));
+    return false;
+  }
+
+  mx_handle_t vmar = static_cast<mx_handle_t>(handle());
+  const size_t offset = addr - start();
+  const uint32_t flags = MX_VM_FLAG_SPECIFIC | MX_VM_FLAG_PERM_READ |
+                         MX_VM_FLAG_PERM_WRITE | MX_VM_FLAG_PERM_EXECUTE;
+  uintptr_t mapped_addr;
+  status = mx_vmar_map(vmar, offset, vmo, 0, size, flags, &mapped_addr);
+  if (status != NO_ERROR) {
+    mx_handle_close(vmo);
+    LOG_ERR("mx_vmar_map(%ld, %ld, %u) failed: %s\n", offset, size, flags,
+            mx_status_get_string(status));
+    return false;
+  }
+  if (addr != mapped_addr) {
+    LOG_ERR("mx_vmar_map: addr != mapped_addr: %lx != %lx\n", addr,
+            mapped_addr);
+    return false;
+  }
   return true;
 }
 
 
 bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
-  // TODO(zra): Implement when Fuchsia has an mprotect-like call.
   return true;
 }
 
diff --git a/runtime/vm/virtual_memory_linux.cc b/runtime/vm/virtual_memory_linux.cc
index be3655f..3c4abec 100644
--- a/runtime/vm/virtual_memory_linux.cc
+++ b/runtime/vm/virtual_memory_linux.cc
@@ -59,7 +59,9 @@
 }
 
 
-bool VirtualMemory::FreeSubSegment(void* address, intptr_t size) {
+bool VirtualMemory::FreeSubSegment(int32_t handle,
+                                   void* address,
+                                   intptr_t size) {
   unmap(address, size);
   return true;
 }
diff --git a/runtime/vm/virtual_memory_macos.cc b/runtime/vm/virtual_memory_macos.cc
index 6f42b55..c3b004d 100644
--- a/runtime/vm/virtual_memory_macos.cc
+++ b/runtime/vm/virtual_memory_macos.cc
@@ -60,7 +60,9 @@
 }
 
 
-bool VirtualMemory::FreeSubSegment(void* address, intptr_t size) {
+bool VirtualMemory::FreeSubSegment(int32_t handle,
+                                   void* address,
+                                   intptr_t size) {
   unmap(address, size);
   return true;
 }
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index de9156d..7e876a4 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -44,7 +44,9 @@
 }
 
 
-bool VirtualMemory::FreeSubSegment(void* address, intptr_t size) {
+bool VirtualMemory::FreeSubSegment(int32_t handle,
+                                   void* address,
+                                   intptr_t size) {
   // On Windows only the entire segment returned by VirtualAlloc
   // can be freed. Therefore we will have to waste these unused
   // virtual memory sub-segments.
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index 3da3291..a8c0e74 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -30,6 +30,7 @@
     'snapshot_test_in_dat_file': 'snapshot_test_in.dat',
     'snapshot_test_dart_file': 'snapshot_test.dart',
     'typed_data_cc_file': '<(gen_source_dir)/typed_data_gen.cc',
+    'typed_data_patch_cc_file': '<(gen_source_dir)/typed_data_patch_gen.cc',
     'vmservice_cc_file': '<(gen_source_dir)/vmservice_gen.cc',
     'vmservice_patch_cc_file': '<(gen_source_dir)/vmservice_patch_gen.cc',
   },
@@ -233,6 +234,7 @@
         'generate_mirrors_patch_cc_file#host',
         'generate_profiler_cc_file#host',
         'generate_typed_data_cc_file#host',
+        'generate_typed_data_patch_cc_file#host',
         'generate_vmservice_cc_file#host',
         'generate_vmservice_patch_cc_file#host',
       ],
@@ -271,6 +273,7 @@
         '<(mirrors_patch_cc_file)',
         '<(profiler_cc_file)',
         '<(typed_data_cc_file)',
+        '<(typed_data_patch_cc_file)',
         '<(vmservice_cc_file)',
         '<(vmservice_patch_cc_file)',
       ],
@@ -967,16 +970,12 @@
       ]
     },
     {
-      # Unlike the other libraries in the SDK, dart:typed_data is not
-      # implemented as a patch applied to the base SDK implementation.
-      # Instead the VM has a complete replacement library and the
-      # implementation in the SDK is ignored.
       'target_name': 'generate_typed_data_cc_file',
       'type': 'none',
       'toolsets':['host'],
       'includes': [
         # Load the runtime implementation sources.
-        '../lib/typed_data_sources.gypi',
+        '../../sdk/lib/typed_data/typed_data_sources.gypi',
       ],
       'sources/': [
         # Exclude all .[cc|h] files.
@@ -1011,6 +1010,46 @@
       ]
     },
     {
+      'target_name': 'generate_typed_data_patch_cc_file',
+      'type': 'none',
+      'toolsets':['host'],
+      'includes': [
+        # Load the patch sources.
+        '../lib/typed_data_sources.gypi',
+      ],
+      'sources/': [
+        # Exclude all .[cc|h] files.
+        # This is only here for reference. Excludes happen after
+        # variable expansion, so the script has to do its own
+        # exclude processing of the sources being passed.
+        ['exclude', '\\.cc|h$'],
+      ],
+      'actions': [
+        {
+          'action_name': 'generate_typed_data_patch_cc',
+          'inputs': [
+            '../tools/gen_library_src_paths.py',
+            '<(libgen_in_cc_file)',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(typed_data_patch_cc_file)',
+          ],
+          'action': [
+            'python',
+            'tools/gen_library_src_paths.py',
+            '--output', '<(typed_data_patch_cc_file)',
+            '--input_cc', '<(libgen_in_cc_file)',
+            '--include', 'vm/bootstrap.h',
+            '--var_name', 'dart::Bootstrap::typed_data_patch_paths_',
+            '--library_name', 'dart:typed_data',
+            '<@(_sources)',
+          ],
+          'message': 'Generating ''<(typed_data_patch_cc_file)'' file.'
+        },
+      ]
+    },
+    {
       'target_name': 'generate_profiler_cc_file',
       'type': 'none',
       'toolsets':['host'],
@@ -1255,6 +1294,7 @@
         'generate_math_library_patch',
         'generate_mirrors_library_patch',
         'generate_profiler_library_patch',
+        'generate_typed_data_library_patch',
         'generate_vmservice_library_patch',
       ],
       'actions': [
@@ -1265,11 +1305,6 @@
                   '"dart$", "sdk/lib"])',
             '../../tools/patch_sdk.py',
             '../../tools/patch_sdk.dart',
-            # Unlike the other libraries in the SDK, dart:typed_data is not
-            # implemented as a patch applied to the base SDK implementation.
-            # Instead the VM has a complete replacement library and the
-            # implementation in the SDK is ignored.
-            '../lib/typed_data.dart',
             # Unlike the other libraries in the SDK, dart:_builtin and
             # dart:nativewrappers are only available for the Dart VM.
             '../bin/builtin.dart',
@@ -1287,6 +1322,7 @@
             '<(gen_source_dir)/patches/math_patch.dart',
             '<(gen_source_dir)/patches/mirrors_patch.dart',
             '<(gen_source_dir)/patches/profiler_patch.dart',
+            '<(gen_source_dir)/patches/typed_data_patch.dart',
             '<(gen_source_dir)/patches/vmservice_patch.dart',
           ],
           'outputs': [
@@ -1660,6 +1696,38 @@
     },
     {
       'variables': {
+        'library_name': 'typed_data',
+        'library_uri': 'dart:typed_data',
+      },
+      'target_name': 'generate_<(library_name)_library_patch',
+      'type': 'none',
+      'toolsets': ['host'],
+      'includes': [
+        '../lib/typed_data_sources.gypi',
+      ],
+      'actions': [
+        {
+          'action_name': 'concatenate_<(library_name)_patches',
+          'inputs': [
+            '../tools/concatenate_patches.py',
+            '<@(_sources)',
+          ],
+          'outputs': [
+            '<(gen_source_dir)/patches/<(library_name)_patch.dart'
+          ],
+          'action': [
+            'python',
+            'tools/concatenate_patches.py',
+            '--output',
+            '<(gen_source_dir)/patches/<(library_name)_patch.dart',
+            '<@(_sources)',
+          ],
+          'message': 'Generating <(library_uri) patch.',
+        },
+      ],
+    },
+    {
+      'variables': {
         'library_name': 'vmservice',
         'library_uri': 'dart:_vmservice',
       },
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index a80f0e2..07d1cbb 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -154,6 +154,15 @@
                     JS_GET_NAME(JsGetName.FUNCTION_CLASS_TYPE_NAME));
 }
 
+/// Returns true if the given [type] is _the_ `Null` type.
+@ForceInline()
+bool isNullType(Object type) {
+  return JS_BUILTIN('returns:bool;effects:none;depends:none',
+      JsBuiltin.isGivenTypeRti,
+      type,
+      JS_GET_NAME(JsGetName.NULL_CLASS_TYPE_NAME));
+}
+
 /// Returns whether the given type is _the_ Dart Object type.
 // TODO(floitsch): move this to foreign_helper.dart or similar.
 @ForceInline()
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 0ce3e69..f9cd698 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -448,12 +448,13 @@
   if (isIdentical(s, t)) return true;
   // If either type is dynamic, [s] is a subtype of [t].
   if (s == null || t == null) return true;
+  if (isNullType(s)) return true;
   if (isDartFunctionType(t)) {
     return isFunctionSubtype(s, t);
   }
-  // Check function types against the Function class.
+  // Check function types against the Function class and the Object class.
   if (isDartFunctionType(s)) {
-    return isDartFunctionTypeRti(t);
+    return isDartFunctionTypeRti(t) || isDartObjectTypeRti(t);
   }
 
   // Get the object describing the class and check for the subtyping flag
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index d16d0d0..ad4adaf 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -1209,8 +1209,8 @@
     return _create_2(blobParts, bag);
   }
 
-  static _create_1(parts) => JS('Blob', 'new window.Blob(#)', parts);
-  static _create_2(parts, bag) => JS('Blob', 'new window.Blob(#, #)', parts, bag);
+  static _create_1(parts) => JS('Blob', 'new self.Blob(#)', parts);
+  static _create_2(parts, bag) => JS('Blob', 'new self.Blob(#, #)', parts, bag);
 
   static _create_bag() => JS('var', '{}');
   static _bag_set(bag, key, value) { JS('void', '#[#] = #', bag, key, value); }
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 6ee00c2..8a461b2 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -5026,8 +5026,7 @@
 LibTest/html/Element/getBoundingClientRect_A01_t02: Pass, RuntimeError # Issue 53
 LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Fails 10 out of 10.
-LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
+LibTest/html/Element/isContentEditable_A01_t01: Pass, RuntimeError # Issue 28187
 LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Fails 10 out of 10.
 LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 22d2c68..4b3bfaf 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -69,6 +69,7 @@
 value_range_test: Pass, Slow
 jsinterop/world_test: Pass, Slow
 sourcemaps/stacktrace_test: Pass, Slow
+kernel/impact_test: Skip # Times out. Issue 28157
 
 [ $mode == debug ]
 check_elements_invariants_test: Skip # Slow and only needs to be run in one
diff --git a/tests/compiler/dart2js/expect_annotations_test.dart b/tests/compiler/dart2js/expect_annotations_test.dart
index e8b5e18..9af76b7 100644
--- a/tests/compiler/dart2js/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/expect_annotations_test.dart
@@ -106,8 +106,8 @@
 
     TypeMask jsStringType = closedWorld.commonMasks.stringType;
     TypeMask jsIntType = closedWorld.commonMasks.intType;
-    TypeMask coreStringType =
-        new TypeMask.subtype(compiler.coreClasses.stringClass, closedWorld);
+    TypeMask coreStringType = new TypeMask.subtype(
+        closedWorld.commonElements.stringClass, closedWorld);
 
     test('method');
     test('methodAssumeDynamic', expectAssumeDynamic: true);
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index 0337799..1ddbd39 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -89,7 +89,8 @@
 
     ClosedWorld world = env.closedWorld;
     JavaScriptBackend backend = env.compiler.backend;
-    ClassElement Object_ = registerClass(env.compiler.coreClasses.objectClass);
+    ClassElement Object_ =
+        registerClass(env.compiler.commonElements.objectClass);
     ClassElement Interceptor =
         registerClass(backend.helpers.jsInterceptorClass);
     ClassElement JavaScriptObject =
diff --git a/tests/compiler/dart2js/kernel/closed_world_test.dart b/tests/compiler/dart2js/kernel/closed_world_test.dart
index 60a4505..c51d57c 100644
--- a/tests/compiler/dart2js/kernel/closed_world_test.dart
+++ b/tests/compiler/dart2js/kernel/closed_world_test.dart
@@ -80,7 +80,7 @@
     worldBuilder.useInstantiationMap = true;
     compiler.resolution.retainCachesForTesting = true;
     await compiler.run(entryPoint);
-    compiler.resolverWorld.openWorld.closeWorld(compiler.reporter);
+    compiler.resolverWorld.closeWorld(compiler.reporter);
 
     JavaScriptBackend backend = compiler.backend;
     // Create a new resolution enqueuer and feed it with the [WorldImpact]s
@@ -114,8 +114,7 @@
           .transformResolutionImpact(enqueuer, resolutionImpact);
       enqueuer.applyImpact(worldImpact, impactSource: element);
     });
-    ClosedWorld closedWorld =
-        enqueuer.universe.openWorld.closeWorld(compiler.reporter);
+    ClosedWorld closedWorld = enqueuer.universe.closeWorld(compiler.reporter);
 
     checkResolutionEnqueuers(compiler.enqueuer.resolution, enqueuer,
         typeEquivalence: (DartType a, DartType b) {
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 9282b16..3975516 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -50,9 +50,9 @@
         diagnosticHandler: new LegacyCompilerDiagnostics(expectOnlyVerboseInfo),
         options: ['--enable-experimental-mirrors']);
     CompilerImpl compiler = result.compiler;
+    JavaScriptBackend backend = compiler.backend;
     print('');
-    List generatedCode =
-        Elements.sortedByPosition(compiler.enqueuer.codegen.processedEntities);
+    List generatedCode = Elements.sortedByPosition(backend.generatedCode.keys);
     for (var element in generatedCode) {
       print(element);
     }
@@ -84,15 +84,14 @@
 
     // We always include the names of some native classes.
     List<Element> nativeClasses = [
-      compiler.coreClasses.intClass,
-      compiler.coreClasses.doubleClass,
-      compiler.coreClasses.numClass,
-      compiler.coreClasses.stringClass,
-      compiler.coreClasses.boolClass,
-      compiler.coreClasses.nullClass,
-      compiler.coreClasses.listClass
+      compiler.commonElements.intClass,
+      compiler.commonElements.doubleClass,
+      compiler.commonElements.numClass,
+      compiler.commonElements.stringClass,
+      compiler.commonElements.boolClass,
+      compiler.commonElements.nullClass,
+      compiler.commonElements.listClass
     ];
-    JavaScriptBackend backend = compiler.backend;
     Iterable<String> nativeNames = nativeClasses.map(backend.namer.className);
     expectedNames = expectedNames.map(backend.namer.asName).toList();
     expectedNames.addAll(nativeNames);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index fb5f824..f82aa5a 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -148,7 +148,7 @@
       // dynamic invocation the ArgumentTypesRegistry eventually iterates over
       // the interfaces of the Object class which would be 'null' if the class
       // wasn't resolved.
-      coreClasses.objectClass.ensureResolved(resolution);
+      commonElements.objectClass.ensureResolved(resolution);
     }).then((_) => uri);
   }
 
diff --git a/tests/compiler/dart2js/null_is_bottom_test.dart b/tests/compiler/dart2js/null_is_bottom_test.dart
new file mode 100644
index 0000000..4d2ca6b
--- /dev/null
+++ b/tests/compiler/dart2js/null_is_bottom_test.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// Test that dart2js produces the expected static type warnings for proxy
+// language tests. This ensures that the analyzer and dart2js agrees on these
+// tests.
+
+import 'warnings_checker.dart';
+
+/// Map from test files to a map of their expected status. If the status map is
+/// `null` no warnings must be missing or unexpected, otherwise the status map
+/// can contain a list of line numbers for keys 'missing' and 'unexpected' for
+/// the warnings of each category.
+const Map<String, dynamic> TESTS = const {
+  'language/null_is_bottom_type_test.dart': null,
+};
+
+void main(List<String> args) {
+  checkWarnings(TESTS, args);
+}
diff --git a/tests/compiler/dart2js/related_types.dart b/tests/compiler/dart2js/related_types.dart
index 61203ec..2db7785 100644
--- a/tests/compiler/dart2js/related_types.dart
+++ b/tests/compiler/dart2js/related_types.dart
@@ -79,9 +79,7 @@
 
   ClosedWorld get world => compiler.resolverWorld.closedWorldForTesting;
 
-  CoreClasses get coreClasses => compiler.coreClasses;
-
-  CoreTypes get coreTypes => compiler.coreTypes;
+  CommonElements get commonElements => compiler.commonElements;
 
   DiagnosticReporter get reporter => compiler.reporter;
 
@@ -165,7 +163,7 @@
 
   /// Returns the supertype of [receiver] that implements `Iterable`, if any.
   InterfaceType findIterableType(DartType receiver) {
-    return findClassType(receiver, coreClasses.iterableClass);
+    return findClassType(receiver, commonElements.iterableClass);
   }
 
   /// Returns the element type of the supertype of [receiver] that implements
@@ -177,7 +175,7 @@
 
   /// Returns the supertype of [receiver] that implements `Map`, if any.
   InterfaceType findMapType(DartType receiver) {
-    return findClassType(receiver, coreClasses.mapClass);
+    return findClassType(receiver, commonElements.mapClass);
   }
 
   /// Returns the key type of the supertype of [receiver] that implements
@@ -196,7 +194,7 @@
 
   /// Returns the supertype of [receiver] that implements `List`, if any.
   InterfaceType findListType(DartType receiver) {
-    return findClassType(receiver, coreClasses.listClass);
+    return findClassType(receiver, commonElements.listClass);
   }
 
   /// Returns the element type of the supertype of [receiver] that implements
@@ -260,7 +258,7 @@
     DartType leftType = apply(left);
     DartType rightType = apply(right);
     checkRelated(node, leftType, rightType);
-    return coreTypes.boolType;
+    return commonElements.boolType;
   }
 
   @override
@@ -268,7 +266,7 @@
     DartType leftType = apply(left);
     DartType rightType = apply(right);
     checkRelated(node, leftType, rightType);
-    return coreTypes.boolType;
+    return commonElements.boolType;
   }
 
   @override
@@ -284,17 +282,17 @@
 
   @override
   DartType visitLiteralInt(LiteralInt node) {
-    return coreTypes.intType;
+    return commonElements.intType;
   }
 
   @override
   DartType visitLiteralString(LiteralString node) {
-    return coreTypes.stringType;
+    return commonElements.stringType;
   }
 
   @override
   DartType visitLiteralBool(LiteralBool node) {
-    return coreTypes.boolType;
+    return commonElements.boolType;
   }
 
   @override
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 7be75ef1..f49f8e5 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -164,8 +164,10 @@
       ResolverVisitor visitor = compiler.resolverVisitor();
       compiler.parseScript('class Foo<T, U> {}');
       ClassElement foo = compiler.mainApp.find('Foo');
-      matchResolvedTypes(visitor, 'Foo<int, String> x;', 'Foo',
-          [compiler.coreClasses.intClass, compiler.coreClasses.stringClass]);
+      matchResolvedTypes(visitor, 'Foo<int, String> x;', 'Foo', [
+        compiler.commonElements.intClass,
+        compiler.commonElements.stringClass
+      ]);
       matchResolvedTypes(visitor, 'Foo<Foo, Foo> x;', 'Foo', [foo, foo]);
     }),
     MockCompiler.create((MockCompiler compiler) {
diff --git a/tests/compiler/dart2js/serialization/model_test_helper.dart b/tests/compiler/dart2js/serialization/model_test_helper.dart
index 735205d..4ac1e1e 100644
--- a/tests/compiler/dart2js/serialization/model_test_helper.dart
+++ b/tests/compiler/dart2js/serialization/model_test_helper.dart
@@ -162,8 +162,10 @@
   checkClassHierarchyNodes(
       closedWorld1,
       closedWorld2,
-      closedWorld1.getClassHierarchyNode(closedWorld1.coreClasses.objectClass),
-      closedWorld2.getClassHierarchyNode(closedWorld2.coreClasses.objectClass),
+      closedWorld1
+          .getClassHierarchyNode(closedWorld1.commonElements.objectClass),
+      closedWorld2
+          .getClassHierarchyNode(closedWorld2.commonElements.objectClass),
       verbose: verbose);
 }
 
@@ -334,10 +336,10 @@
       if (child.isInstantiated) {
         print('Missing subclass ${child.cls} of ${node1.cls} '
             'in ${node2.directSubclasses}');
-        print(closedWorld1
-            .dump(verbose ? closedWorld1.coreClasses.objectClass : node1.cls));
-        print(closedWorld2
-            .dump(verbose ? closedWorld2.coreClasses.objectClass : node2.cls));
+        print(closedWorld1.dump(
+            verbose ? closedWorld1.commonElements.objectClass : node1.cls));
+        print(closedWorld2.dump(
+            verbose ? closedWorld2.commonElements.objectClass : node2.cls));
       }
       Expect.isFalse(
           child.isInstantiated,
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index 08b5620..fb54674 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -761,7 +761,7 @@
         checkReturn('returnEmpty1', const TypeMask.nonNullEmpty());
         checkReturn('returnEmpty2', const TypeMask.nonNullEmpty());
         TypeMask intType = new TypeMask.nonNullSubtype(
-            compiler.coreClasses.intClass, closedWorld);
+            compiler.commonElements.intClass, closedWorld);
         checkReturn('testIsCheck1', intType);
         checkReturn('testIsCheck2', intType);
         checkReturn('testIsCheck3', intType.nullable());
@@ -796,7 +796,7 @@
         checkReturn(
             'returnAsString',
             new TypeMask.subtype(
-                compiler.coreClasses.stringClass, closedWorld));
+                compiler.commonElements.stringClass, closedWorld));
         checkReturn('returnIntAsNum', commonMasks.uint31Type);
         checkReturn('returnAsTypedef', commonMasks.functionType.nullable());
         checkReturn('returnTopLevelGetter', commonMasks.uint31Type);
diff --git a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
index b6fc660..e02a22b 100644
--- a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
@@ -187,7 +187,7 @@
         checkReturn(
             'returnInt6',
             new TypeMask.nonNullSubtype(
-                closedWorld.coreClasses.intClass, closedWorld));
+                closedWorld.commonElements.intClass, closedWorld));
 
         var subclassOfInterceptor = commonMasks.interceptorType;
 
diff --git a/tests/compiler/dart2js/subtype_test.dart b/tests/compiler/dart2js/subtype_test.dart
index ad8fba5..bae104f 100644
--- a/tests/compiler/dart2js/subtype_test.dart
+++ b/tests/compiler/dart2js/subtype_test.dart
@@ -60,6 +60,7 @@
         DartType String_ = env['String'];
         DartType dynamic_ = env['dynamic'];
         DartType void_ = env['void'];
+        DartType Null_ = env['Null'];
 
         expect(true, void_, void_);
         expect(true, void_, dynamic_);
@@ -67,78 +68,105 @@
         expect(true, dynamic_, void_, expectMoreSpecific: false);
         expect(false, void_, Object_);
         expect(false, Object_, void_);
+        expect(true, Null_, void_);
 
         expect(true, Object_, Object_);
         expect(true, num_, Object_);
         expect(true, int_, Object_);
         expect(true, String_, Object_);
         expect(true, dynamic_, Object_, expectMoreSpecific: false);
+        expect(true, Null_, Object_);
 
         expect(false, Object_, num_);
         expect(true, num_, num_);
         expect(true, int_, num_);
         expect(false, String_, num_);
         expect(true, dynamic_, num_, expectMoreSpecific: false);
+        expect(true, Null_, num_);
 
         expect(false, Object_, int_);
         expect(false, num_, int_);
         expect(true, int_, int_);
         expect(false, String_, int_);
         expect(true, dynamic_, int_, expectMoreSpecific: false);
+        expect(true, Null_, int_);
 
         expect(false, Object_, String_);
         expect(false, num_, String_);
         expect(false, int_, String_);
         expect(true, String_, String_);
         expect(true, dynamic_, String_, expectMoreSpecific: false);
+        expect(true, Null_, String_);
 
         expect(true, Object_, dynamic_);
         expect(true, num_, dynamic_);
         expect(true, int_, dynamic_);
         expect(true, String_, dynamic_);
         expect(true, dynamic_, dynamic_);
+        expect(true, Null_, dynamic_);
+
+        expect(false, Object_, Null_);
+        expect(false, num_, Null_);
+        expect(false, int_, Null_);
+        expect(false, String_, Null_);
+        expect(true, dynamic_, Null_, expectMoreSpecific: false);
+        expect(true, Null_, Null_);
 
         DartType A_Object = instantiate(A, [Object_]);
         DartType A_num = instantiate(A, [num_]);
         DartType A_int = instantiate(A, [int_]);
         DartType A_String = instantiate(A, [String_]);
         DartType A_dynamic = instantiate(A, [dynamic_]);
+        DartType A_Null = instantiate(A, [Null_]);
 
         expect(true, A_Object, Object_);
         expect(false, A_Object, num_);
         expect(false, A_Object, int_);
         expect(false, A_Object, String_);
         expect(true, A_Object, dynamic_);
+        expect(false, A_Object, Null_);
 
         expect(true, A_Object, A_Object);
         expect(true, A_num, A_Object);
         expect(true, A_int, A_Object);
         expect(true, A_String, A_Object);
         expect(true, A_dynamic, A_Object, expectMoreSpecific: false);
+        expect(true, A_Null, A_Object);
 
         expect(false, A_Object, A_num);
         expect(true, A_num, A_num);
         expect(true, A_int, A_num);
         expect(false, A_String, A_num);
         expect(true, A_dynamic, A_num, expectMoreSpecific: false);
+        expect(true, A_Null, A_num);
 
         expect(false, A_Object, A_int);
         expect(false, A_num, A_int);
         expect(true, A_int, A_int);
         expect(false, A_String, A_int);
         expect(true, A_dynamic, A_int, expectMoreSpecific: false);
+        expect(true, A_Null, A_int);
 
         expect(false, A_Object, A_String);
         expect(false, A_num, A_String);
         expect(false, A_int, A_String);
         expect(true, A_String, A_String);
         expect(true, A_dynamic, A_String, expectMoreSpecific: false);
+        expect(true, A_Null, A_String);
 
         expect(true, A_Object, A_dynamic);
         expect(true, A_num, A_dynamic);
         expect(true, A_int, A_dynamic);
         expect(true, A_String, A_dynamic);
         expect(true, A_dynamic, A_dynamic);
+        expect(true, A_Null, A_dynamic);
+
+        expect(false, A_Object, A_Null);
+        expect(false, A_num, A_Null);
+        expect(false, A_int, A_Null);
+        expect(false, A_String, A_Null);
+        expect(true, A_dynamic, A_Null, expectMoreSpecific: false);
+        expect(true, A_Null, A_Null);
 
         DartType B_Object_Object = instantiate(B, [Object_, Object_]);
         DartType B_num_num = instantiate(B, [num_, num_]);
diff --git a/tests/compiler/dart2js/trust_type_annotations_test.dart b/tests/compiler/dart2js/trust_type_annotations_test.dart
index 70fb5f1..abf00f0 100644
--- a/tests/compiler/dart2js/trust_type_annotations_test.dart
+++ b/tests/compiler/dart2js/trust_type_annotations_test.dart
@@ -69,7 +69,7 @@
         }
 
         var intMask =
-            new TypeMask.subtype(compiler.coreClasses.intClass, closedWorld);
+            new TypeMask.subtype(compiler.commonElements.intClass, closedWorld);
 
         checkReturn('foo', intMask);
         checkReturn('faa', intMask);
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 96dba28..0ca2865 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -75,10 +75,10 @@
     Expect.equals(type, analyzeType(compiler, code));
   }
 
-  checkType(compiler.coreTypes.intType, "3");
-  checkType(compiler.coreTypes.boolType, "false");
-  checkType(compiler.coreTypes.boolType, "true");
-  checkType(compiler.coreTypes.stringType, "'hestfisk'");
+  checkType(compiler.commonElements.intType, "3");
+  checkType(compiler.commonElements.boolType, "false");
+  checkType(compiler.commonElements.boolType, "true");
+  checkType(compiler.commonElements.stringType, "'hestfisk'");
 }
 
 Future testReturn(MockCompiler compiler) {
@@ -2699,7 +2699,7 @@
         new TypeCheckerVisitor(compiler, mapping, compiler.types);
     DiagnosticCollector collector = compiler.diagnosticCollector;
     collector.clear();
-    checker.analyze(node);
+    checker.analyze(node, mustHaveType: false);
     compareWarningKinds(text, expectedWarnings, collector.warnings);
 
     compiler.diagnosticHandler = null;
@@ -2736,7 +2736,7 @@
       new TypeCheckerVisitor(compiler, elements, compiler.types);
   DiagnosticCollector collector = compiler.diagnosticCollector;
   collector.clear();
-  checker.analyze(node);
+  checker.analyze(node, mustHaveType: false);
   if (flushDeferred) {
     compiler.enqueuer.resolution.emptyDeferredQueueForTesting();
   }
@@ -2777,7 +2777,7 @@
       new TypeCheckerVisitor(compiler, elements, compiler.types);
   DiagnosticCollector collector = compiler.diagnosticCollector;
   collector.clear();
-  checker.analyze(node);
+  checker.analyze(node, mustHaveType: false);
   generateOutput(compiler, text);
   compareWarningKinds(text, warnings, collector.warnings);
   compareWarningKinds(text, hints, collector.hints);
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index 479e717..9638ca2 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -753,9 +753,9 @@
     patternImplClass.ensureResolved(compiler.resolution);
 
     impactBuilder.registerTypeUse(
-        new TypeUse.instantiation(compiler.coreTypes.mapType()));
+        new TypeUse.instantiation(compiler.commonElements.mapType()));
     impactBuilder.registerTypeUse(
-        new TypeUse.instantiation(compiler.coreTypes.functionType));
+        new TypeUse.instantiation(compiler.commonElements.functionType));
     impactBuilder
         .registerTypeUse(new TypeUse.instantiation(patternImplClass.rawType));
     compiler.enqueuer.resolution.applyImpact(impactBuilder);
@@ -767,11 +767,11 @@
     patternClass = closedWorld.commonElements.coreLibrary.find('Pattern');
 
     nonPrimitive1 = new TypeMask.nonNullSubtype(
-        closedWorld.coreClasses.mapClass, closedWorld);
+        closedWorld.commonElements.mapClass, closedWorld);
     nonPrimitive2 = new TypeMask.nonNullSubtype(
-        closedWorld.coreClasses.functionClass, closedWorld);
+        closedWorld.commonElements.functionClass, closedWorld);
     potentialArray =
-        new TypeMask.subtype(closedWorld.coreClasses.listClass, closedWorld);
+        new TypeMask.subtype(closedWorld.commonElements.listClass, closedWorld);
     potentialString = new TypeMask.subtype(patternClass, closedWorld);
     jsInterceptor =
         new TypeMask.nonNullSubclass(helpers.jsInterceptorClass, closedWorld);
@@ -812,10 +812,10 @@
     jsDoubleOrNull = new TypeMask.exact(helpers.jsDoubleClass, closedWorld);
     nullType = const TypeMask.empty();
     objectType = new TypeMask.nonNullSubclass(
-        closedWorld.coreClasses.objectClass, closedWorld);
+        closedWorld.commonElements.objectClass, closedWorld);
     emptyType = const TypeMask.nonNullEmpty();
-    dynamicType =
-        new TypeMask.subclass(closedWorld.coreClasses.objectClass, closedWorld);
+    dynamicType = new TypeMask.subclass(
+        closedWorld.commonElements.objectClass, closedWorld);
 
     Expect.notEquals(
         emptyType, nonPrimitive1, "nonPrimitive1 expected to be non-empty.");
diff --git a/tests/compiler/dart2js/type_mask_test.dart b/tests/compiler/dart2js/type_mask_test.dart
index fd197f1..6d0d958 100644
--- a/tests/compiler/dart2js/type_mask_test.dart
+++ b/tests/compiler/dart2js/type_mask_test.dart
@@ -39,7 +39,7 @@
         var subtypeA = new TypeMask.nonNullSubtype(classA, closedWorld);
 
         var subclassObject = new TypeMask.nonNullSubclass(
-            compiler.coreClasses.objectClass, closedWorld);
+            compiler.commonElements.objectClass, closedWorld);
 
         var unionABC =
             UnionTypeMask.unionOf([exactA, exactB, exactC], closedWorld);
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 2dfdb3b..5944e86 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -40,6 +40,9 @@
 symbol_reserved_word_test/07: MissingCompileTimeError # bug 11669, 19972
 symbol_reserved_word_test/10: MissingCompileTimeError # bug 11669, 19972
 
+[ ($compiler == none || $compiler == app_jit) && $unchecked ]
+iterable_generate_test/01: RuntimeError # Issue 28025
+
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 package_resource_test: RuntimeError # Issue 26842
 symbol_reserved_word_test/02: RuntimeError # bug 20191 / dartium/drt cannot detect CompileTimeErrors
diff --git a/tests/corelib/iterable_generate_test.dart b/tests/corelib/iterable_generate_test.dart
index 170dba9..abcae06 100644
--- a/tests/corelib/iterable_generate_test.dart
+++ b/tests/corelib/iterable_generate_test.dart
@@ -59,7 +59,12 @@
 
   // Invalid types:
   Expect.throws(() => new Iterable<String>.generate(5));
-  Expect.throws(() => new Iterable<Null>.generate(5));
+  if (checkedMode) {                                                  /// 01: ok
+    Expect.throws(() => new Iterable<Null>.generate(5).elementAt(2)); /// 01: continued
+  } else {                                                            /// 01: continued
+    Iterable<dynamic> iter5 = new Iterable<Null>.generate(5);         /// 01: continued
+    Expect.equals(2, iter5.elementAt(2));                             /// 01: continued
+  }                                                                   /// 01: continued
   Expect.throws(() => new Iterable<bool>.generate(5));
 
   // Regression: https://github.com/dart-lang/sdk/issues/26358
diff --git a/tests/html/html.status b/tests/html/html.status
index 1907711..3b0d09c 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -7,6 +7,8 @@
 
 [ $compiler == none && ($runtime == dartium || $runtime == drt) ]
 
+canvas_pixel_array_type_alias_test/types2_runtimeTypeName: RuntimeError # Issue 28183
+
 mirrors_js_typed_interop_test: Fail # Missing expected failure (Issue 25044)
 js_typed_interop_side_cast_exp_test: Fail, OK # tests dart2js-specific behavior.
 js_typed_interop_type1_test: Fail, OK # tests dart2js-specific behavior.
@@ -45,7 +47,6 @@
 custom/element_upgrade_test: Fail # Issue 17298
 
 [ $compiler == dart2js && $browser ]
-worker_api_test: RuntimeError # Issue 28155
 custom/created_callback_test: Fail # Support for created constructor. Issue 14835
 fontface_loaded_test: Fail # Support for promises.
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 038396b..22a15a1 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -236,3 +236,4 @@
 deferred_in_isolate_test: Crash # Requires deferred libraries
 deferred_in_isolate2_test: Crash # Requires deferred libraries
 issue_21398_parent_isolate2_test: Crash # Requires deferred libraries
+spawn_uri_nested_vm_test: Pass, Crash # Issue 28192
diff --git a/tests/language/function_subtype0_test.dart b/tests/language/function_subtype0_test.dart
index 1a39d92..4cc4809 100644
--- a/tests/language/function_subtype0_test.dart
+++ b/tests/language/function_subtype0_test.dart
@@ -36,6 +36,7 @@
 int int__int2(int i) => 0;
 int int__Object(Object o) => 0;
 Object Object__int(int i) => null;
+void void__Object(Object o) => null;
 int int__double(double d) => 0;
 int int__int_int(int i1, int i2) => 0;
 void inline_void_(void f()) {}
@@ -82,6 +83,8 @@
   Expect.isFalse(int__int_int is t_int__int);
   // (()->void) -> void <: ((int)->void) -> void
   Expect.isFalse(inline_void_ is t_inline_void__int);
+  // (Object) -> void <: ((int)->void) -> void
+  Expect.isTrue(void__Object is t_inline_void__int);
   // ((int)->void) -> void <: (()->void) -> void
   Expect.isFalse(inline_void__int is t_inline_void_);
 }
diff --git a/tests/language/function_subtype1_test.dart b/tests/language/function_subtype1_test.dart
index a7bd199..1938ebe 100644
--- a/tests/language/function_subtype1_test.dart
+++ b/tests/language/function_subtype1_test.dart
@@ -17,6 +17,7 @@
 typedef Object Object_();
 typedef double double_();
 typedef void void__int(int i);
+typedef void void__Object(Object o);
 typedef int int__int(int i);
 typedef int int__int2(int i);
 typedef int int__Object(Object o);
@@ -69,6 +70,8 @@
   Expect.isFalse(new C<int__int_int>() is C<int__int>);
   // (()->void) -> void <: ((int)->void) -> void
   Expect.isFalse(new C<inline_void_>() is C<inline_void__int>);
+  // (Object) -> void <: ((int)->void) -> void
+  Expect.isTrue(new C<void__Object>() is C<inline_void__int>);
   // ((int)->void) -> void <: (()->void) -> void
   Expect.isFalse(new C<inline_void__int>() is C<inline_void_>);
 }
diff --git a/tests/language/language.status b/tests/language/language.status
index 0cf4670..3fefdf6 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -5,9 +5,22 @@
 # This directory contains tests that are intended to show the
 # current state of the language.
 
+[ $compiler == none || $compiler == app_jit ]
+null_is_bottom_test/22: RuntimeError # Issue 28025
+null_is_bottom_test/34: RuntimeError # Issue 28025
+
+
 [ $compiler == none || $compiler == precompiler || $compiler == app_jit ]
 tearoff_constructor_basic_test: Skip # Crashes in checked mode -- hausner investigating
 generic_methods_type_expression_test: RuntimeError # Issue 25869
+null_is_bottom_test/05: RuntimeError # Issue 28025
+null_is_bottom_test/07: RuntimeError # Issue 28025
+null_is_bottom_test/20: RuntimeError # Issue 28025
+null_is_bottom_test/25: RuntimeError # Issue 28025
+null_is_bottom_test/27: RuntimeError # Issue 28025
+null_is_bottom_test/32: RuntimeError # Issue 28025
+null_is_bottom_test/37: RuntimeError # Issue 28025
+null_is_bottom_test/39: RuntimeError # Issue 28025
 
 # This is OK for now, but we may want to change the semantics to match the test.
 async_star_pause_test: Fail, OK
@@ -60,6 +73,11 @@
 generic_local_functions_test: Pass # Issue 25869
 generic_functions_test: Pass # Issue 25869
 generic_methods_generic_function_parameter_test: Pass # Issue 25869
+null_is_bottom_test/03: RuntimeError # Issue 28025
+null_is_bottom_test/18: RuntimeError # Issue 28025
+null_is_bottom_test/23: RuntimeError # Issue 28025
+null_is_bottom_test/30: RuntimeError # Issue 28025
+null_is_bottom_test/35: RuntimeError # Issue 28025
 
 [ ($compiler == none || $compiler == precompiler || $compiler == app_jit) && ($runtime == vm || $runtime == dart_precompiled) ]
 
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index d13f27a..d164e71 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -45,6 +45,15 @@
 
 const_for_in_variable_test/01: MissingCompileTimeError # Issue 25161
 
+null_is_bottom_type_test/01: StaticWarning # Issue 28027
+null_is_bottom_type_test/03: StaticWarning # Issue 28027
+null_is_bottom_type_test/06: StaticWarning # Issue 28027
+null_is_bottom_type_test/08: StaticWarning # Issue 28027
+null_is_bottom_type_test/10: StaticWarning # Issue 28027
+null_is_bottom_type_test/11: StaticWarning # Issue 28027
+null_is_bottom_type_test/14: StaticWarning # Issue 28027
+null_is_bottom_type_test/15: StaticWarning # Issue 28027
+
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index a3730b6..5d65a3b 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -7,6 +7,8 @@
 large_class_declaration_test: Skip
 large_implicit_getter_test: Skip
 larger_implicit_getter_test: Skip
+null_is_bottom_test/22: RuntimeError # Issue 28025
+null_is_bottom_test/34: RuntimeError # Issue 28025
 
 ###############################################################################
 # Dartk Entries
@@ -83,6 +85,14 @@
 multiline_newline_test/06: MissingCompileTimeError
 no_main_test/01: DartkCrash
 not_enough_positional_arguments_test/01: DartkCompileTimeError
+null_is_bottom_test/05: RuntimeError # Issue 28025
+null_is_bottom_test/07: RuntimeError # Issue 28025
+null_is_bottom_test/20: RuntimeError # Issue 28025
+null_is_bottom_test/25: RuntimeError # Issue 28025
+null_is_bottom_test/27: RuntimeError # Issue 28025
+null_is_bottom_test/32: RuntimeError # Issue 28025
+null_is_bottom_test/37: RuntimeError # Issue 28025
+null_is_bottom_test/39: RuntimeError # Issue 28025
 regress_27617_test/1: MissingCompileTimeError
 super_call3_test/01: DartkCrash
 tearoff_basic_test: DartkCompileTimeError
diff --git a/tests/language/null_is_bottom_test.dart b/tests/language/null_is_bottom_test.dart
new file mode 100644
index 0000000..e2ab54a
--- /dev/null
+++ b/tests/language/null_is_bottom_test.dart
@@ -0,0 +1,142 @@
+// 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.
+
+// Test that Null is a subtype of any other type.
+
+import 'package:expect/expect.dart';
+
+class A {}
+typedef A ReturnA();
+typedef TakeA(A a);
+typedef Null ReturnNull();
+typedef TakeNull(Null n);
+
+@NoInline()
+testA(A a) {}
+
+@NoInline()
+testListA(List<A> list) {}
+
+@NoInline()
+testIsListA(var a) => a is List<A>;
+
+@NoInline()
+testAsListA(var a) => a as List<A>;
+
+@NoInline()
+testNull(Null n) {}
+
+@NoInline()
+testListNull(List<Null> list) {}
+
+@NoInline()
+testIsListNull(var a) => a is List<Null>;
+
+@NoInline()
+testAsListNull(var a) => a as List<Null>;
+
+@NoInline()
+testReturnA(ReturnA f) {}
+
+@NoInline()
+testIsReturnA(var f) => f is ReturnA;
+
+@NoInline()
+testAsReturnA(var f) => f as ReturnA;
+
+@NoInline()
+testReturnNull(ReturnNull f) {}
+
+@NoInline()
+testIsReturnNull(var f) => f is ReturnNull;
+
+@NoInline()
+testAsReturnNull(var f) => f as ReturnNull;
+
+@NoInline()
+testTakeA(TakeA f) {}
+
+@NoInline()
+testIsTakeA(var f) => f is TakeA;
+
+@NoInline()
+testAsTakeA(var f) => f as TakeA;
+
+@NoInline()
+testTakeNull(TakeNull f) {}
+
+@NoInline()
+testIsTakeNull(var f) => f is TakeNull;
+
+@NoInline()
+testAsTakeNull(var f) => f as TakeNull;
+
+Null returnNullFunc() => null;
+takeNullFunc(Null n) {}
+A returnAFunc() => null;
+takeAFunc(A a) {}
+
+main() {
+  var n = null;
+  var listNull = new List<Null>();
+  var a = new A();
+  var listA = new List<A>();
+
+  testA(n);                                                          /// 01: ok
+  testA(a);                                                          /// 02: ok
+  testListA(listNull);                                               /// 03: ok
+  testListA(listA);                                                  /// 04: ok
+  Expect.isTrue(testIsListA(listNull));                              /// 05: ok
+  Expect.isTrue(testIsListA(listA));                                 /// 06: ok
+  testAsListA(listNull);                                             /// 07: ok
+  testAsListA(listA);                                                /// 08: ok
+
+  testNull(n);                                                       /// 09: ok
+  testNull(a);                                       /// 10: dynamic type error
+  testListNull(listNull);                                            /// 11: ok
+  testListNull(listA);                               /// 12: dynamic type error
+  Expect.isTrue(testIsListNull(listNull));                           /// 13: ok
+  Expect.isFalse(testIsListNull(listA));                             /// 14: ok
+  testAsListNull(listNull);                                          /// 15: ok
+  Expect.throws(() => testAsListNull(listA), (e) => e is CastError); /// 16: ok
+
+  var returnNull = returnNullFunc;
+  var takeNull = takeNullFunc;
+  var returnA = returnAFunc;
+  var takeA = takeAFunc;
+
+  testReturnA(returnA);                                              /// 17: ok
+  testReturnA(returnNull);                                           /// 18: ok
+  Expect.isTrue(testIsReturnA(returnA));                             /// 19: ok
+  Expect.isTrue(testIsReturnA(returnNull));                          /// 20: ok
+  testAsReturnA(returnA);                                            /// 21: ok
+  testAsReturnA(returnNull);                                         /// 22: ok
+
+  // This is not valid in strong-mode: ()->A <: ()->Null
+  testReturnNull(returnA);                                           /// 23: ok
+  testReturnNull(returnNull);                                        /// 24: ok
+  // This is not valid in strong-mode: ()->A <: ()->Null
+  Expect.isTrue(testIsReturnNull(returnA));                          /// 25: ok
+  Expect.isTrue(testIsReturnNull(returnNull));                       /// 26: ok
+  // This is not valid in strong-mode: ()->A <: ()->Null
+  testAsReturnNull(returnA);                                         /// 27: ok
+  testAsReturnNull(returnNull);                                      /// 28: ok
+
+  testTakeA(takeA);                                                  /// 29: ok
+  // This is not valid in strong-mode: (Null)-> <: (A)->
+  testTakeA(takeNull);                                               /// 30: ok
+  Expect.isTrue(testIsTakeA(takeA));                                 /// 31: ok
+  // This is not valid in strong-mode: (Null)-> <: (A)->
+  Expect.isTrue(testIsTakeA(takeNull));                              /// 32: ok
+  testAsTakeA(takeA);                                                /// 33: ok
+  // This is not valid in strong-mode: (Null)-> <: (A)->
+  testAsTakeA(takeNull);                                             /// 34: ok
+
+  testTakeNull(takeA);                                               /// 35: ok
+  testTakeNull(takeNull);                                            /// 36: ok
+  Expect.isTrue(testIsTakeNull(takeA));                              /// 37: ok
+  Expect.isTrue(testIsTakeNull(takeNull));                           /// 38: ok
+  testAsTakeNull(takeA);                                             /// 39: ok
+  testAsTakeNull(takeNull);                                          /// 40: ok
+}
\ No newline at end of file
diff --git a/tests/language/null_is_bottom_type_test.dart b/tests/language/null_is_bottom_type_test.dart
new file mode 100644
index 0000000..b12137e
--- /dev/null
+++ b/tests/language/null_is_bottom_type_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.
+
+// Test that Null is a subtype of any other type.
+
+import 'package:expect/expect.dart';
+
+class A {}
+typedef A ReturnA();
+typedef TakeA(A a);
+typedef Null ReturnNull();
+typedef TakeNull(Null n);
+
+testA(A a) {}
+testListA(List<A> list) {}
+testNull(Null n) {}
+testListNull(List<Null> list) {}
+testReturnA(ReturnA f) {}
+testReturnNull(ReturnNull f) {}
+testTakeA(TakeA f) {}
+testTakeNull(TakeNull f) {}
+
+Null returnNull() => null;
+takeNull(Null n) {}
+A returnA() => null;
+takeA(A a) {}
+
+main() {
+  if (false) test(); // Perform static checks only.
+}
+
+test() {
+  Null n;
+  List<Null> listNull;
+  A a = new A();
+  List<A> listA;
+
+  testA(n);                                                          /// 01: ok
+  testA(a);                                                          /// 02: ok
+  testListA(listNull);                                               /// 03: ok
+  testListA(listA);                                                  /// 04: ok
+
+  testNull(n);                                                       /// 05: ok
+  testNull(a);                                                       /// 06: ok
+  testListNull(listNull);                                            /// 07: ok
+  testListNull(listA);                                               /// 08: ok
+
+  testReturnA(returnA);                                              /// 09: ok
+  testReturnA(returnNull);                                           /// 10: ok
+
+  testReturnNull(returnA);                                           /// 11: ok
+  testReturnNull(returnNull);                                        /// 12: ok
+
+  testTakeA(takeA);                                                  /// 13: ok
+  testTakeA(takeNull);                                               /// 14: ok
+
+  testTakeNull(takeA);                                               /// 15: ok
+  testTakeNull(takeNull);                                            /// 16: ok
+}
\ No newline at end of file
diff --git a/tests/language/vm/lazy_deopt_vm_test.dart b/tests/language/vm/lazy_deopt_vm_test.dart
index a10242a..17c7430 100644
--- a/tests/language/vm/lazy_deopt_vm_test.dart
+++ b/tests/language/vm/lazy_deopt_vm_test.dart
@@ -1,7 +1,7 @@
 // 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=--deoptimize_every=10 --optimization-counter-threshold=10  --no-background-compilation
+// VMOptions=--optimization-filter=foo --deoptimize_every=10 --optimization-counter-threshold=10  --no-background-compilation
 
 // Test that lazy deoptimization on stack checks does not damage unoptimized
 // frame.
diff --git a/tests/standalone/io/file_create_test.dart b/tests/standalone/io/file_create_test.dart
new file mode 100644
index 0000000..f35c43d
--- /dev/null
+++ b/tests/standalone/io/file_create_test.dart
@@ -0,0 +1,44 @@
+// 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.
+//
+// Dart test program for testing file creation.
+
+import 'dart:async';
+import 'dart:io';
+
+import "package:expect/expect.dart";
+import "package:path/path.dart";
+
+testCreate() async {
+  Directory tmp = await Directory.systemTemp.createTemp('file_test_create');
+  Expect.isTrue(await tmp.exists());
+  String filePath = "${tmp.path}/foo";
+  File file = new File(filePath);
+  File createdFile = await file.create();
+  Expect.equals(file, createdFile);
+  Expect.isTrue(await createdFile.exists());
+  await tmp.delete(recursive: true);
+}
+
+testBadCreate() async {
+  Directory tmp = await Directory.systemTemp.createTemp('file_test_create');
+  Expect.isTrue(await tmp.exists());
+  Directory tmp2 = await tmp.createTemp('file_test_create');
+  Expect.isTrue(await tmp2.exists());
+  String badFilePath = tmp2.path;
+  File badFile = new File(badFilePath);
+  try {
+    await badFile.create();
+    Expect.fail('Should be unreachable');
+  } catch(e) {
+    Expect.isTrue(e is FileSystemException);
+    Expect.isNotNull(e.osError);
+  }
+  await tmp.delete(recursive: true);
+}
+
+main() async {
+  await testCreate();
+  await testBadCreate();
+}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index daecba8..1630b8e 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -50,6 +50,9 @@
 io/secure_server_client_certificate_test: Skip
 io/socket_test: Pass, Timeout # Issue 27453
 
+# This test sometimes hangs on Mac.
+io/raw_server_socket_cancel_test: Skip # Issue 28182
+
 [ $runtime == vm && $system == linux ]
 # These tests have started timing out and issue 25649 has been filed to
 # investigate, skipping these tests temporarily to get the bots to be
@@ -144,7 +147,7 @@
 out_of_memory_test: Skip # passes on Mac, crashes on Linux
 oom_error_stacktrace_test: Skip # Fails on Linux
 
-[ $arch == simarm && $mode == debug && $checked ]
+[ ($arch == simarm || $arch == simdbc || $arch == simdbc64) && $mode == debug && $checked ]
 io/web_socket_test: Pass, Fail # Issue 26814
 
 [ $arch == mips ]
diff --git a/tools/FAKE_COMMITS b/tools/FAKE_COMMITS
index cc5aa2f..34df009 100644
--- a/tools/FAKE_COMMITS
+++ b/tools/FAKE_COMMITS
@@ -18,4 +18,5 @@
 CIT outage - all slaves rebooted
 Authentication failure flake - rerun all bots
 Trigger bots after master restart - switch dart2js bots to use downloaded sdk.
-Trigger bots after master restart.
\ No newline at end of file
+Trigger bots after master restart.
+Trigger mirroring of github repository
diff --git a/tools/VERSION b/tools/VERSION
index 08e0575..5e7c910 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 22
 PATCH 0
-PRERELEASE 3
+PRERELEASE 4
 PRERELEASE_PATCH 0
diff --git a/tools/build.py b/tools/build.py
index e30b1f8..5b66500 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -114,7 +114,7 @@
   for arch in options.arch:
     archs = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6',
              'simarmv5te', 'armv5te', 'simmips', 'mips', 'simarm64', 'arm64',
-             'simdbc', 'simdbc64', 'armsimdbc']
+             'simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64']
     if not arch in archs:
       print "Unknown arch %s" % arch
       return False
diff --git a/tools/deps/dartium.deps/DEPS b/tools/deps/dartium.deps/DEPS
index c1a89e7..9192aaf 100644
--- a/tools/deps/dartium.deps/DEPS
+++ b/tools/deps/dartium.deps/DEPS
@@ -51,7 +51,7 @@
   "path_rev": "@b657c0854d1cf41c014986fa9d2321f1173df805",
   "plugin_tag": "@0.1.0",
   "pool_rev": "@22e12aeb16ad0b626900dbe79e4a25391ddfb28c",
-  "pub_rev": "@9d707158fedc86fc2b02f62cdfe804902b098d9d",
+  "pub_rev": "@d7649be15213c43669a40c33af516d8eb210e876",
   "pub_semver_tag": "@1.2.0",
   "quiver_tag": "@0.21.4",
   "root_certificates_rev": "@aed07942ce98507d2be28cbd29e879525410c7fc",
diff --git a/tools/dom/templates/html/impl/impl_Blob.darttemplate b/tools/dom/templates/html/impl/impl_Blob.darttemplate
index 62ac4c70..8cf70b9 100644
--- a/tools/dom/templates/html/impl/impl_Blob.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Blob.darttemplate
@@ -20,8 +20,8 @@
     return _create_2(blobParts, bag);
   }
 
-  static _create_1(parts) => JS('Blob', 'new window.Blob(#)', parts);
-  static _create_2(parts, bag) => JS('Blob', 'new window.Blob(#, #)', parts, bag);
+  static _create_1(parts) => JS('Blob', 'new self.Blob(#)', parts);
+  static _create_2(parts, bag) => JS('Blob', 'new self.Blob(#, #)', parts, bag);
 
   static _create_bag() => JS('var', '{}');
   static _bag_set(bag, key, value) { JS('void', '#[#] = #', bag, key, value); }
diff --git a/tools/gn.py b/tools/gn.py
index fd9a1b7..93bbf1b 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -31,9 +31,10 @@
 
 def host_cpu_for_arch(arch):
   if arch in ['ia32', 'arm', 'armv6', 'armv5te', 'mips',
-              'simarm', 'simarmv6', 'simarmv5te', 'simmips', 'simdbc']:
+              'simarm', 'simarmv6', 'simarmv5te', 'simmips', 'simdbc',
+              'armsimdbc']:
     return 'x86'
-  if arch in ['x64', 'arm64', 'simarm64', 'simdbc64']:
+  if arch in ['x64', 'arm64', 'simarm64', 'simdbc64', 'armsimdbc64']:
     return 'x64'
 
 
@@ -48,6 +49,10 @@
     return 'arm' if target_os == 'android' else 'x86'
   if arch == 'simdbc64':
     return 'arm64' if target_os == 'android' else 'x64'
+  if arch == 'armsimdbc':
+    return 'arm'
+  if arch == 'armsimdbc64':
+    return 'arm64'
   return arch
 
 
@@ -169,7 +174,7 @@
   for arch in args.arch:
     archs = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6',
              'simarmv5te', 'armv5te', 'simmips', 'mips', 'simarm64', 'arm64',
-             'simdbc', 'simdbc64', 'armsimdbc']
+             'simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64']
     if not arch in archs:
       print "Unknown arch %s" % arch
       return False
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
index 5a76ff5..e9980ea 100644
--- a/tools/patch_sdk.dart
+++ b/tools/patch_sdk.dart
@@ -110,14 +110,7 @@
 
     var libraryOut = path.join(sdkLibIn, library.path);
     var libraryIn;
-    if (mode == 'vm' && library.path.contains('typed_data.dart')) {
-      // dart:typed_data is unlike the other libraries in the SDK. The VM does
-      // not apply a patch to the base SDK implementation of the library.
-      // Instead, the VM provides a replacement implementation and ignores the
-      // sources in the SDK.
-      libraryIn =
-          path.join(dartDir, 'runtime', 'lib', 'typed_data.dart');
-    } else if (mode == 'ddc' && library.path.contains(INTERNAL_PATH)) {
+    if (mode == 'ddc' && library.path.contains(INTERNAL_PATH)) {
       libraryIn =
           path.join(privateIn, library.path.replaceAll(INTERNAL_PATH, ''));
     } else {
diff --git a/tools/utils.py b/tools/utils.py
index 341321d..161ea4b 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -243,6 +243,7 @@
   'simdbc': 'ia32',
   'simdbc64': 'ia32',
   'armsimdbc': 'arm',
+  'armsimdbc64': 'arm',
 }
 
 ARCH_GUESS = GuessArchitecture()